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 0000000..5b33f7e Binary files /dev/null and b/slife-web/src/main/resources/static/css/plugins/select2/select2-spinner.gif differ 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 0000000..dd1ef8c Binary files /dev/null and b/slife-web/src/main/resources/static/css/plugins/select2/select2.png differ diff --git a/slife-web/src/main/resources/static/css/slife.css b/slife-web/src/main/resources/static/css/slife.css index 0faaeaa..dffa2c6 100644 --- a/slife-web/src/main/resources/static/css/slife.css +++ b/slife-web/src/main/resources/static/css/slife.css @@ -15,4 +15,8 @@ .required { color: red; +} + +.layui-layer-shade{ + opacity: -1!important; } \ No newline at end of file diff --git a/slife-web/src/main/resources/static/js/slife/datatable.js b/slife-web/src/main/resources/static/js/slife/datatable.js index b331053..35fb347 100644 --- a/slife-web/src/main/resources/static/js/slife/datatable.js +++ b/slife-web/src/main/resources/static/js/slife/datatable.js @@ -2,7 +2,7 @@ * 请求 成功 返回的 操作 * @param r */ -function rep_message(r) { +function dataTable_rep_message(r) { if (r.code == 200) { layer.msg(r.message); re_load(); @@ -11,6 +11,8 @@ function rep_message(r) { } } + + /** * 批量删除 */ @@ -36,7 +38,7 @@ function batch_remove() { data: {"ids": ids}, url: url + "delete", success: function (r) { - rep_message(r) + dataTable_rep_message(r) } }); }, function () { @@ -62,7 +64,7 @@ function remove(id) { 'ids': id }, success: function (r) { - rep_message(r) + dataTable_rep_message(r) } }); }) diff --git a/slife-web/src/main/resources/static/js/slife/slife.js b/slife-web/src/main/resources/static/js/slife/slife.js index 4a9a4ea..b30f997 100644 --- a/slife-web/src/main/resources/static/js/slife/slife.js +++ b/slife-web/src/main/resources/static/js/slife/slife.js @@ -16,3 +16,70 @@ function stop_request_load() { } +/** + * + *docName file组件的name + *viewId img的id + *localId div的id + * imgWidth img的宽度 + * imgHeight img的高度 + * divWidth div的宽度 + * divHeight div的高度 + */ +function setImagePreview(docName,viewId,localId,imgWidth,imgHeight,divWidth,divHeight,tip){ + // return; + $('#uploadFiletIcon').text(''); + var docObj=document.getElementById(docName); //"doc"); + var imgObjPreview=document.getElementById(viewId); //"preview"); + var fileObj=$('#'+docName).val(); + if(tip==1){ + $('#tip').val(1); + $('#uploadFileIconx').val(''); + $('#uploadFileIcon').text(''); + }else{ + $('#iconTip').val(1); + } + if(fileObj){ + if(docObj.files&&docObj.files[0]){ + //火狐下,直接设img属性 + imgObjPreview.style.display='inline-block'; + imgObjPreview.style.width=imgWidth; //'60px'; + imgObjPreview.style.height=imgHeight; //'60px'; + //imgObjPreview.src = docObj.files[0].getAsDataURL(); + //火狐7以上版本不能用上面的getAsDataURL()方式获取,需要一下方式 + imgObjPreview.src=window.URL.createObjectURL(docObj.files[0]); + }else{ + //IE下,使用滤镜 + docObj.select(); + var imgSrc=document.selection.createRange().text; + var localImagId=document.getElementById(localId); //"localImag"); + //必须设置初始大小 + localImagId.style.width=divWidth; //"300px"; + localImagId.style.height=divHeight; //"120px"; + //图片异常的捕捉,防止用户修改后缀来伪造图片 + try{ + localImagId.style.filter="progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=scale)"; + localImagId.filters.item("DXImageTransform.Microsoft.AlphaImageLoader").src=imgSrc; + }catch(e){ + alert("您上传的图片格式不正确,请重新选择!"); + return false; + } + imgObjPreview.style.display='none'; + document.selection.empty(); + } + } + return true; +} + +/** + * axaj 请求返回 + * @param r + */ +function rep_message(r) { + if (r.code == 200) { + layer.msg(r.message); + } else { + layer.msg(r.error); + } +} +