From 28fdaa98605e5b151cdb500a81c44c79a7d64efc Mon Sep 17 00:00:00 2001 From: jamen Date: Thu, 12 Oct 2017 09:19:35 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=B9=E7=89=88=E7=95=8C=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/slife/enums/HttpCodeEnum.java | 4 +- .../main/java/com/slife/util/FileUtils.java | 42 +++++++++++ .../java/com/slife/util/ReturnDTOUtil.java | 56 ++++++++------- .../controller/AttachmentController.java | 2 + ...ileController.java => FileController.java} | 42 +++++++---- .../slife/controller/SysUserController.java | 31 ++++++-- .../main/resources/templates/user/detail.ftl | 44 +++++++++--- .../main/resources/templates/user/list.ftl | 3 - .../css/plugins/select2/select2-spinner.gif | Bin 0 -> 1849 bytes .../static/css/plugins/select2/select2.png | Bin 0 -> 586 bytes .../src/main/resources/static/css/slife.css | 4 ++ .../resources/static/js/slife/datatable.js | 8 ++- .../main/resources/static/js/slife/slife.js | 67 ++++++++++++++++++ 13 files changed, 240 insertions(+), 63 deletions(-) rename slife-sys/src/main/java/com/slife/controller/{UploadFileController.java => FileController.java} (57%) create mode 100644 slife-web/src/main/resources/static/css/plugins/select2/select2-spinner.gif create mode 100644 slife-web/src/main/resources/static/css/plugins/select2/select2.png diff --git a/slife-common/src/main/java/com/slife/enums/HttpCodeEnum.java b/slife-common/src/main/java/com/slife/enums/HttpCodeEnum.java index 4492814..15a5694 100644 --- a/slife-common/src/main/java/com/slife/enums/HttpCodeEnum.java +++ b/slife-common/src/main/java/com/slife/enums/HttpCodeEnum.java @@ -34,7 +34,9 @@ public enum HttpCodeEnum { FAIL(501,"操作失败"), - USERNAME_OR_PASSWORD_ERR(2000,"用户名或密码错误"); + USERNAME_OR_PASSWORD_ERR(2000,"用户名或密码错误"), + DELETE_DEFAULT_PHOTO_ERR(2001,"默认头像不可删除"); + private final int code; private final String message; diff --git a/slife-common/src/main/java/com/slife/util/FileUtils.java b/slife-common/src/main/java/com/slife/util/FileUtils.java index aa24061..56148b2 100644 --- a/slife-common/src/main/java/com/slife/util/FileUtils.java +++ b/slife-common/src/main/java/com/slife/util/FileUtils.java @@ -1,6 +1,8 @@ package com.slife.util; import net.coobird.thumbnailator.Thumbnails; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.web.multipart.MultipartFile; import javax.servlet.ServletOutputStream; @@ -19,6 +21,7 @@ import java.nio.file.Paths; */ public class FileUtils { + private static Logger logger = LoggerFactory.getLogger(FileUtils.class); /** * 获取附件名称 13位时间戳+5位随机数 * @@ -60,6 +63,45 @@ public class FileUtils { } } + /** + * 保存文件到磁盘 + * @param file + * @param filePath + * @param fileName + * @throws Exception + */ + public static void saveFile(byte[] file, String filePath, String fileName) throws Exception { + File targetFile = new File(filePath); + if (!targetFile.exists()) { + targetFile.mkdirs(); + } + FileOutputStream out = new FileOutputStream(filePath + fileName); + out.write(file); + out.flush(); + out.close(); + } + + /** + * 删除文件 + * @param fileName + * @return + */ + public static boolean deleteFile(String fileName) { + File file = new File(fileName); + // 如果文件路径所对应的文件存在,并且是一个文件,则直接删除 + if (file.exists() && file.isFile()) { + if (file.delete()) { + logger.error("删除单个文件-> {}成功!",fileName); + return true; + } else { + logger.error("删除单个文件-> {}失败!",fileName); + return false; + } + } else { + logger.info("删除单个文件失败-> {}不存在!",fileName); + return false; + } + } /** * 生成缩略图 diff --git a/slife-common/src/main/java/com/slife/util/ReturnDTOUtil.java b/slife-common/src/main/java/com/slife/util/ReturnDTOUtil.java index 1139a77..63f1259 100644 --- a/slife-common/src/main/java/com/slife/util/ReturnDTOUtil.java +++ b/slife-common/src/main/java/com/slife/util/ReturnDTOUtil.java @@ -18,14 +18,6 @@ public class ReturnDTOUtil { return new ReturnDTO(HttpCodeEnum.OK.getCode(),null, HttpCodeEnum.OK.getMessage()); } - /** - * 操作失败 - * @return - */ - public static ReturnDTO fail() { - return new ReturnDTO(HttpCodeEnum.FAIL.getCode(), HttpCodeEnum.FAIL.getMessage()); - } - /** * 成功请求 * @@ -36,7 +28,30 @@ public class ReturnDTOUtil { return new ReturnDTO(HttpCodeEnum.OK.getCode(), null,data); } + /** + * 操作失败 + * @return + */ + public static ReturnDTO fail() { + return new ReturnDTO(HttpCodeEnum.FAIL.getCode(), HttpCodeEnum.FAIL.getMessage()); + } + /** + * 服务器错误 + * @return + */ + public static ReturnDTO error() { + return new ReturnDTO(HttpCodeEnum.INTERNAL_SERVER_ERROR.getCode(),HttpCodeEnum.INTERNAL_SERVER_ERROR.getMessage()); + } + + /** + * 服务器错误 + * @param data + * @return + */ + public static ReturnDTO error(Object data) { + return new ReturnDTO(HttpCodeEnum.INTERNAL_SERVER_ERROR.getCode(),HttpCodeEnum.INTERNAL_SERVER_ERROR.getMessage(), data); + } /** * 参数错误 * @return @@ -166,23 +181,6 @@ public class ReturnDTOUtil { } - /** - * 服务器错误 - * @return - */ - public static ReturnDTO error() { - return new ReturnDTO(HttpCodeEnum.INTERNAL_SERVER_ERROR.getCode(),HttpCodeEnum.INTERNAL_SERVER_ERROR.getMessage()); - } - - - /** - * 服务器错误 - * @param data - * @return - */ - public static ReturnDTO error(Object data) { - return new ReturnDTO(HttpCodeEnum.INTERNAL_SERVER_ERROR.getCode(),HttpCodeEnum.INTERNAL_SERVER_ERROR.getMessage(), data); - } /** * 未知错误 @@ -202,6 +200,14 @@ public class ReturnDTOUtil { } + /** + * 自定义返回 + * @param e + * @return + */ + public static ReturnDTO custom(HttpCodeEnum e) { + return new ReturnDTO(e.getCode(),e.getMessage()); + } /** * 自定义返回 * @param error diff --git a/slife-sys/src/main/java/com/slife/controller/AttachmentController.java b/slife-sys/src/main/java/com/slife/controller/AttachmentController.java index 9449a6c..a57eb5b 100644 --- a/slife-sys/src/main/java/com/slife/controller/AttachmentController.java +++ b/slife-sys/src/main/java/com/slife/controller/AttachmentController.java @@ -1,5 +1,6 @@ package com.slife.controller; +import io.swagger.annotations.ApiOperation; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -38,6 +39,7 @@ public class AttachmentController { * @param response * @return */ + @ApiOperation(value = "系统请求文件",notes = "系统请求文件 demo http://localhost:8081/sys/user/attach/head?filename=150641181924855150.png&s=s") @GetMapping("/{basefloder}/{type}") public String download(@PathVariable("basefloder") String baseFloder, @RequestParam("filename") String filename, diff --git a/slife-sys/src/main/java/com/slife/controller/UploadFileController.java b/slife-sys/src/main/java/com/slife/controller/FileController.java similarity index 57% rename from slife-sys/src/main/java/com/slife/controller/UploadFileController.java rename to slife-sys/src/main/java/com/slife/controller/FileController.java index c2be0c1..bef4d02 100644 --- a/slife-sys/src/main/java/com/slife/controller/UploadFileController.java +++ b/slife-sys/src/main/java/com/slife/controller/FileController.java @@ -4,6 +4,7 @@ import com.slife.base.entity.ReturnDTO; import com.slife.constant.Setting; import com.slife.util.FileUtils; import com.slife.util.ReturnDTOUtil; +import io.swagger.annotations.ApiOperation; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -20,24 +21,35 @@ import java.util.Map; @Controller -@RequestMapping(value = "/upload") -public class UploadFileController { - private static Logger logger = LoggerFactory.getLogger(UploadFileController.class); - +@RequestMapping(value = "/file") +public class FileController { + protected Logger logger = LoggerFactory.getLogger(getClass()); + @ApiOperation(value = "后台删除文件", notes = "后台删除文件") + @PostMapping(value = "/delete") + @ResponseBody + public ReturnDTO delete(@RequestParam("name") String name) throws IOException { + Boolean b = FileUtils.deleteFile(name); + if (b) { + return ReturnDTOUtil.success(); + } else { + return ReturnDTOUtil.error(); + } + } /** * 后台用户头像上传(图片) * - * @param file 上传的文件 - * @param path 文件上传指定根目录下的目录 + * @param file 上传的文件 + * @param path 文件上传指定根目录下的目录 * @param response * @param request * @throws IOException */ - @PostMapping(value = "/{type}") + @ApiOperation(value = "后台上传文件", notes = "后台上传文件") + @PostMapping(value = "/upload/{type}") @ResponseBody public ReturnDTO uploadTransImg(@PathVariable("type") String type, @RequestParam("files") MultipartFile file, @RequestParam(value = "path", defaultValue = "") String path, @@ -55,14 +67,14 @@ public class UploadFileController { fileName = fileName + "/" + path; } - String savePath = fileName + "/"+type+"/"+ uuid + "." + fileExt;//附件路径+类型(头像、附件等)+名称+扩展名 + String savePath = fileName + "/" + type + "/" + uuid + "." + fileExt;//附件路径+类型(头像、附件等)+名称+扩展名 File localFile = FileUtils.saveFileToDisk(file, savePath); //保存到磁盘 - String thumbnailName=""; + String thumbnailName = ""; if (FileUtils.getImageFormat(fileExt)) { //创建缩略图 - thumbnailName=fileName + "/"+type+"/s/"+ uuid + "." + fileExt;//附件路径+类型(头像、附件等)+s(文件夹)+名称+扩展名 - FileUtils.createThumbnail(localFile,thumbnailName); + thumbnailName = fileName + "/" + type + "/s/" + uuid + "." + fileExt;//附件路径+类型(头像、附件等)+s(文件夹)+名称+扩展名 + FileUtils.createThumbnail(localFile, thumbnailName); } @@ -71,11 +83,11 @@ public class UploadFileController { rt.put("uuid", uuid); rt.put("path", Setting.BASEFLODER); rt.put("ext", fileExt); - rt.put("url", "/"+savePath); - rt.put("s_url", "/"+thumbnailName); + rt.put("url", "/" + savePath); + rt.put("s_url", "/" + thumbnailName); - logger.info("上传的文件地址为 fileName={}",savePath); - return ReturnDTOUtil.success(rt); + logger.info("上传的文件地址为 fileName={}", savePath); + return ReturnDTOUtil.success(rt); } diff --git a/slife-sys/src/main/java/com/slife/controller/SysUserController.java b/slife-sys/src/main/java/com/slife/controller/SysUserController.java index 207d5e1..6e5c61b 100644 --- a/slife-sys/src/main/java/com/slife/controller/SysUserController.java +++ b/slife-sys/src/main/java/com/slife/controller/SysUserController.java @@ -6,14 +6,18 @@ import com.slife.base.controller.BaseController; import com.slife.base.entity.ReturnDTO; import com.slife.base.vo.DataTable; import com.slife.entity.SysUser; +import com.slife.enums.HttpCodeEnum; import com.slife.service.impl.SysRoleService; import com.slife.service.impl.SysUserService; +import com.slife.shiro.ShiroUser; import com.slife.shiro.SlifeSysUser; +import com.slife.util.FileUtils; import com.slife.util.ReturnDTOUtil; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; +import org.springframework.util.ObjectUtils; import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.mvc.support.RedirectAttributes; @@ -49,7 +53,7 @@ public class SysUserController extends BaseController { */ @PostMapping(value = "/exportUserList") @ResponseBody - public void exportCollectCustomerList(@RequestBody DataTable dt,HttpServletResponse response) throws Exception { + public void exportCollectCustomerList(@RequestBody DataTable dt, HttpServletResponse response) throws Exception { List users = sysUserService.pageSearch(dt).getRows(); //导出数据 @@ -57,7 +61,7 @@ public class SysUserController extends BaseController { String[] headerTitle = new String[]{"id", "登陆名", "姓名", "邮箱", "工号", "电话", "手机", "描述", "状态"}; List arrayList = new ArrayList<>(); arrayList.add(headerTitle); //列头 - if (null!=users && users.size()>0) { + if (null != users && users.size() > 0) { for (SysUser sysUser : users) { arrayList.add( new String[]{ @@ -69,7 +73,7 @@ public class SysUserController extends BaseController { sysUser.getPhone(), sysUser.getMobile(), sysUser.getRemark(), - sysUser.getLoginFlag().equals("Y")?"正常":"禁用" + sysUser.getLoginFlag().equals("Y") ? "正常" : "禁用" }); } } @@ -77,12 +81,27 @@ public class SysUserController extends BaseController { } + @ApiOperation(value = "删除头像", notes = "删除头像") + @PostMapping(value = "/delete/photo") + public ReturnDTO deletePhoto(@RequestParam("name") String name) { + String defaluePhoto = "/img/log9.png"; + if (defaluePhoto.equals(name)) { + logger.info("默认头像不可删除!"); + return ReturnDTOUtil.custom(HttpCodeEnum.DELETE_DEFAULT_PHOTO_ERR); + } + Long userId = SlifeSysUser.id(); + SysUser sysUser = sysUserService.selectById(userId); + if (ObjectUtils.isEmpty(sysUser)) { + return ReturnDTOUtil.notFound(); + } + sysUser.setPhoto(defaluePhoto); + sysUserService.updateById(sysUser); + FileUtils.deleteFile(name);//删除文件 + return ReturnDTOUtil.success(); + } - /** - * - */ @ApiOperation(value = "进入用户列表", notes = "进入用户列表") @GetMapping(value = "") public String list(Model model, HttpServletRequest request) { diff --git a/slife-sys/src/main/resources/templates/user/detail.ftl b/slife-sys/src/main/resources/templates/user/detail.ftl index 30a5c5a..e4676b0 100644 --- a/slife-sys/src/main/resources/templates/user/detail.ftl +++ b/slife-sys/src/main/resources/templates/user/detail.ftl @@ -39,25 +39,22 @@
- 上传头像 - + 上传头像 + + @@ -181,6 +178,33 @@ diff --git a/slife-web/src/main/resources/static/css/plugins/select2/select2-spinner.gif b/slife-web/src/main/resources/static/css/plugins/select2/select2-spinner.gif new file mode 100644 index 0000000000000000000000000000000000000000..5b33f7e54f4e55b6b8774d86d96895db9af044b4 GIT binary patch literal 1849 zcma*odr(tX9tZI2z31lM+(&YVk%mZ}5P~KlG2s=WSbGzm0!x7^P##Mnh7t-jP!X0Q zk_SQ}Po-L1tlDK;6l?(>v)e5ZBQx4|Y-Q?nr@Px3?9h(3ZWr3^tj=`TP57gKr87N$ zp2wWee1GRRCwo_xahnw)5cxNPJbCg2L6DV|6`#+yw6v6!mDS$f9-JvFD^n;GQ&UrZ zzh5jCkByB101O60U0q#p_1BM>Cv-vP?&s4@g_((4_1L=L$(a91)0=J91Gas#R{McE znYG^9*0A5YZ>#;~+Wkn(W5B0^yELIYLP!K}mB~<)AM@1&nqekynuaEGqPrzoH|KodRXJy)%+w_fu3nE5>@Bd_b zqC$EQ;{c`T&?EsNO|igL9gC7Ygxv?aQUEXMq?~>wg{EyW;VcJ37CUF#HjrT=KQO_* zS>M9yydXk18D(+QDJ1>r);Lav_uYKp$T?4vr{Q$lTo&pKv^?(>L-)G2*lwH!Ah7k? z7oH<8h-(KTKt5V6$8gF)C7Io&P5=SjTh)=zV=E2EUhQZP##L8S{d%UK>>+y82>+FV+#^BzW7u3F)Bb>=lYQ%%j`F>ASe zo*cw@V#u6T`A2He;70mR(V&iV&-7{qP~=SRf&jm9-T{*ZeZ}$rd0#6c&fLG^xJcf5 z+p<`wJYgW+_s*V{uI$nMB;%8`S_3>PfGOj3Rq}@Cx^+j?rk92fANSFDBYnOqQ>Vdj z)(|$AhP4t&Lb=Gvo2#3Gl%9<=Gv`Mz?Po@P4iLF!x}GUWJICDlFk-hS^Whyh7x~VH z@0vD1>HYD4&e+~yzS*-sFR{9`{QEEZO1zg7>R&7cHts-6j!xHVdA8eI+ZlVzd%`es zJT@$#GX(gvCJ1oJN%yLBK}{V=V;seo;!w|Yte!W1%5qLNFWqvZW>h&IiH+oPT=b@E zPhGzv5=(Un*X>v`>%8h_nj^NdYcE6NHS_ifkCV$*D)Tqrbu`s;<=t<4 zAHNqNV?6(g<1PY-w@#I-WYFViz?9TrkMr)u0g`O`u|>T;k|2sV*YF^punvT;$SuTy{j3Gv)yqD!R_CF>yR)MzmmYS5v+~R zXAdD%ng9?df;wd8GxR#%3O+gz};Vo;)sK%Bj-q>Oq%R7JU-KD?vYu>#2UjaDo z&8$>5xW~?KPD_#XFToU1hIb*VOMidUr6iYiO0N|i-7s`T8!cFT`rN!^1Pt78J93i6 z5HI1wIM$94m{3SLDvISDe6$ZG1;eq_D9RTaaC>=cO{@Bs>$IlPCPJJ$h$)-3vzNUQ6OsN#_zWxey!_9%hxwH2_dEJi=yY|1c7nDm2_Lm!Cof8-R_+9UkS zcBE(o47yE)oMR(Q=dp1a2wTX5KvvGyLqlWTa7V&!A*|w|)ax~1_~aJ0=_Lilg*0iQk7#ZD EAHN$8j{pDw literal 0 HcmV?d00001 diff --git a/slife-web/src/main/resources/static/css/plugins/select2/select2.png b/slife-web/src/main/resources/static/css/plugins/select2/select2.png new file mode 100644 index 0000000000000000000000000000000000000000..dd1ef8c32a5239e9ba9d5bc9a9e0333e22e1d893 GIT binary patch literal 586 zcmV-Q0=4~#P)`6pHRCwC#nZHZJKorN@f=KD0dzXq! zp_{n)H*`uDhmL~&0U1KDqmp#UA5bBqYq$OlF49ftAehBHE{ZtB?~@m3!a(_axZd0`fg+u_Vv6w*@U`+fk$d>m6d zdycpq#;gwDuAv9Vac;!s@RVIbpX^JbfzzDD%+^#nEh>jqIXj)xsYESUI{n+anR-zk z%*-l{n6JaVa30u-90}mApccm8HS;RHruJ{PR%!7KwFrvg)&=`Yp4-JLEmhDf!cw%H zbH%eU=uW2->+~zPr401*im*0c)7~(2n1$nZsQtFIO#W?R9avzN|E@h84v$k<9NP=+ z!$n$Qb!1uA07}TuU8N-$&+Gy8Lo+S9w44g#nkuJ7m6izM7z#3d0riV4Ewixy^_!1) z2G{@_U;}J`*I=&el50R+s12P#V`v0DLXqcrqW*ax*n6l7(F?&5`zrT0mU*-~gD#*$ z_SANHToiBw-9ldweY^T#Pwi7^g1vg~)+DCVV%Q1PL;(`*MQN!6E$W*VLpB*&X}