Bläddra i källkod

用户管理 - 添加签名照片

Wang Zi Wen 1 år sedan
förälder
incheckning
2f99ba337b

+ 34 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java

@@ -6,7 +6,9 @@ import java.util.stream.Collectors;
 import javax.servlet.http.HttpServletResponse;
 
 import com.ruoyi.common.config.RuoYiConfig;
+import com.ruoyi.common.utils.DateUtils;
 import com.ruoyi.common.utils.file.FileUploadUtils;
+import com.ruoyi.common.utils.uuid.IdUtils;
 import org.apache.commons.lang3.ArrayUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
@@ -50,6 +52,38 @@ public class SysUserController extends BaseController
     @Autowired
     private ISysPostService postService;
 
+//    /**
+//     * 签名图上传
+//     */
+//    @Log(title = "签名图上传", businessType = BusinessType.UPDATE)
+//    @PostMapping("/uploadFile")
+//    public AjaxResult uploadFile(@RequestParam("file") MultipartFile file) throws IOException
+//    {
+//        if (!file.isEmpty())
+//        {
+//            String avatar = FileUploadUtils.uploadAndChangeName(RuoYiConfig.getFilePath("/userSign"), file , DateUtils.dateTime() + "/" + IdUtils.fastUUID().substring(5) + "/" +"sign.png");
+//            return AjaxResult.success(avatar);
+//        }
+//        return AjaxResult.error("上传图片异常,请联系管理员");
+//    }
+
+    /**
+     * 签名图上传
+     */
+    @PostMapping("/uploadSignUrl")
+    public AjaxResult uploadSignUrl(@RequestParam("file") MultipartFile file, String pType, String pId) throws IOException
+    {
+        if (!file.isEmpty())
+        {
+            String url = FileUploadUtils.upload(RuoYiConfig.getFilePath("/"+ pType), file);
+            SysUser user = userService.selectUserById(Long.parseLong(pId));
+            user.setSignUrl(url);
+            userService.updateUser(user);
+            return AjaxResult.success();
+        }
+        return AjaxResult.error("上传失败,请联系管理员");
+    }
+
     /**
      * 证件照上传
      */

+ 11 - 0
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java

@@ -95,6 +95,17 @@ public class SysUser extends BaseEntity
     /** 照片 */
     private String photo;
 
+    /** 签名 */
+    private String signUrl;
+
+    public String getSignUrl() {
+        return signUrl;
+    }
+
+    public void setSignUrl(String signUrl) {
+        this.signUrl = signUrl;
+    }
+
     public boolean isDeptCheckStrictly() {
         return isDeptCheckStrictly;
     }

+ 48 - 0
ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUploadUtils.java

@@ -47,6 +47,54 @@ public class FileUploadUtils
         return defaultBaseDir;
     }
 
+    /**
+     * 根据文件路径上传
+     *
+     * @param baseDir 相对应用的基目录
+     * @param file 上传的文件
+     * @return 文件名称
+     * @throws IOException
+     */
+    public static final String uploadAndChangeName(String baseDir, MultipartFile file , String newName) throws IOException
+    {
+        try
+        {
+            return upload(baseDir, file,newName, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION);
+        }
+        catch (Exception e)
+        {
+            throw new IOException(e.getMessage(), e);
+        }
+    }
+
+    /**
+     * 文件上传
+     *
+     * @param baseDir 相对应用的基目录
+     * @param file 上传的文件
+     * @return 返回上传成功的文件名
+     * @throws FileSizeLimitExceededException 如果超出最大大小
+     * @throws FileNameLengthLimitExceededException 文件名太长
+     * @throws IOException 比如读写文件出错时
+     * @throws InvalidExtensionException 文件校验异常
+     */
+    public static final String upload(String baseDir, MultipartFile file,String newName, String[] allowedExtension)
+            throws FileSizeLimitExceededException, IOException, FileNameLengthLimitExceededException,
+            InvalidExtensionException
+    {
+        int fileNamelength = file.getOriginalFilename().length();
+        if (fileNamelength > FileUploadUtils.DEFAULT_FILE_NAME_LENGTH)
+        {
+            throw new FileNameLengthLimitExceededException(FileUploadUtils.DEFAULT_FILE_NAME_LENGTH);
+        }
+
+        assertAllowed(file, allowedExtension);
+        File desc = getAbsoluteFile(baseDir, newName);
+        file.transferTo(desc);
+        String pathFileName = getPathFileName(baseDir, newName);
+        return pathFileName;
+    }
+
     /**
      * 以默认配置进行文件上传
      *

+ 6 - 2
ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml

@@ -23,7 +23,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="updateBy"     column="update_by"    />
         <result property="updateTime"   column="update_time"  />
         <result property="remark"       column="remark"       />
-        <result property="photo"       column="photo"       />
+        <result property="photo"        column="photo"        />
+        <result property="signUrl"  column="sign_url"   />
         <association property="dept"    column="dept_id" javaType="SysDept" resultMap="deptResult" />
         <collection  property="roles"   javaType="java.util.List"           resultMap="RoleResult" />
     </resultMap>
@@ -48,7 +49,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </resultMap>
 
 	<sql id="selectUserVo">
-        select u.user_id, u.photo, u.dept_id, u.user_name, u.nick_name, u.email, u.avatar, u.phonenumber, u.password, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark,
+        select u.user_id, u.photo, u.dept_id, u.user_name, u.nick_name, u.email, u.avatar, u.phonenumber, u.password, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark, u.sign_url,
         d.dept_id, d.parent_id, d.ancestors, d.dept_name, d.order_num, d.leader, d.status as dept_status,
         r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.status as role_status
         from sys_user u
@@ -163,6 +164,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  			<if test="status != null and status != ''">status,</if>
  			<if test="createBy != null and createBy != ''">create_by,</if>
  			<if test="remark != null and remark != ''">remark,</if>
+ 			<if test="signUrl != null and signUrl != ''">sign_url,</if>
  			create_time
  		)values(
  			<if test="userId != null and userId != ''">#{userId},</if>
@@ -177,6 +179,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  			<if test="status != null and status != ''">#{status},</if>
  			<if test="createBy != null and createBy != ''">#{createBy},</if>
  			<if test="remark != null and remark != ''">#{remark},</if>
+ 			<if test="signUrl != null and signUrl != ''">#{signUrl},</if>
  			sysdate
  		)
 	</insert>
@@ -198,6 +201,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  			<if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if>
  			<if test="remark != null">remark = #{remark},</if>
  			<if test="photo != null">photo = #{photo},</if>
+ 			<if test="signUrl != null">sign_url = #{signUrl},</if>
  			update_time = sysdate
  		</set>
  		where user_id = #{userId}

+ 62 - 1
ruoyi-ui/src/views/system/user/index.vue

@@ -302,7 +302,7 @@
           </el-col>
         </el-row>
         <el-row>
-          <el-col :span="24">
+          <el-col :span="12">
             <el-form-item label="照片" prop="photo" v-if="form.userId">
               <el-upload
                 ref="photo"
@@ -320,6 +320,26 @@
               </el-dialog>
             </el-form-item>
           </el-col>
+          <el-col :span="12">
+            <el-form-item label="签名" prop="signUrl" v-if="form.userId">
+              <el-upload
+                ref="sign"
+                list-type="picture-card"
+                :action="signPic.url + '?pType=' + signPic.pType + '&pId=' + signPic.pId"
+                :headers="signPic.headers"
+                :show-file-list="false"
+                :on-success="handleAvatarSuccess"
+                :before-upload="beforeAvatarUpload"
+              >
+                <img v-if="signUrl" :src="signUrl" class="avatar">
+                <i v-else class="el-icon-plus "></i>
+              </el-upload>
+
+              <el-dialog  :close-on-click-modal="false" v-dialogDrag :visible.sync="dialogVisible" append-to-body>
+                <img width="100%" :src="dialogSignUrl" alt="">
+              </el-dialog>
+            </el-form-item>
+          </el-col>
         </el-row>
       </el-form>
       <div slot="footer" class="dialog-footer">
@@ -372,6 +392,25 @@ export default {
   components: { Treeselect },
   data() {
     return {
+      // signPic: {
+      //   fileList: [],
+      //   // 设置上传的请求头部
+      //   headers: { Authorization: "Bearer " + getToken() },
+      //   // 上传的地址
+      //   url: process.env.VUE_APP_BASE_API + "/system/user/uploadFile",
+      // },
+      signPic: {
+        file: "",
+        // 报告附件上传位置编号
+        ids: 0,
+        // 设置上传的请求头部
+        headers: { Authorization: "Bearer " + getToken() },
+        // 上传的地址
+        url: process.env.VUE_APP_BASE_API + "/system/user/uploadSignUrl",
+        pType: 'userSignUrl',
+        pId: null
+      },
+      signUrl: '',
       // 人员照片参数
       photo: {
         file: "",
@@ -513,9 +552,24 @@ export default {
           this.photoUrl = process.env.VUE_APP_BASE_API + response.data.photo;
           this.dialogImageUrl = process.env.VUE_APP_BASE_API + response.data.photo;
         }
+        if (response.data.signUrl) {
+          this.signUrl = process.env.VUE_APP_BASE_API + response.data.signUrl;
+          this.dialogSignUrl = process.env.VUE_APP_BASE_API + response.data.signUrl;
+        }
       });
       this.$alert(res.msg, '导入结果', { dangerouslyUseHTMLString: true });
     },
+    beforeAvatarUpload(file) {
+      const isJPG = file.type === 'image/jpeg' || file.type === 'image/png'
+      const isLt2M = file.size / 1024 / 1024 < 2;
+      if (!isJPG) {
+        this.$message.error('上传图片只能是 JPG、png 格式!');
+      }
+      if (!isLt2M) {
+        this.$message.error('上传图片大小不能超过 2MB!');
+      }
+      return isJPG && isLt2M;
+    },
     handlePictureCardPreview(file) {
       this.dialogImageUrl = file.url;
       this.dialogVisible = true;
@@ -641,8 +695,15 @@ export default {
         if (response.data.photo) {
           this.photoUrl = process.env.VUE_APP_BASE_API + response.data.photo;
         }
+        if (response.data.signUrl) {
+          this.signUrl = process.env.VUE_APP_BASE_API + response.data.signUrl;
+        }
+        // if (this.form.signUrl) {
+        //   this.imageUrl = process.env.VUE_APP_BASE_API +  this.form.signUrl
+        // }
       });
       this.photo.pId = row.userId;
+      this.signPic.pId = row.userId;
     },
     /** 重置密码按钮操作 */
     handleResetPwd(row) {