Эх сурвалжийг харах

Merge remote-tracking branch 'origin/master'

Administrator 4 жил өмнө
parent
commit
cc164c9258
61 өөрчлөгдсөн 5328 нэмэгдсэн , 728 устгасан
  1. 5 4
      boman-api/boman-api-system/src/main/java/com/boman/system/api/RemoteUserService.java
  2. 24 0
      boman-api/boman-api-wechat/pom.xml
  3. 22 0
      boman-api/boman-api-wechat/src/main/java/com/boman/wechat/api/RemoteWechatService.java
  4. 10 0
      boman-api/boman-domain/src/main/java/com.boman.domain/SysFile.java
  5. 11 1
      boman-api/boman-domain/src/main/java/com.boman.domain/SysUser.java
  6. 21 0
      boman-api/boman-domain/src/main/java/com.boman.domain/WechatEnum.java
  7. 5 0
      boman-api/boman-domain/src/main/java/com.boman.domain/constant/ServiceNameConstants.java
  8. 44 53
      boman-api/boman-domain/src/main/java/com.boman.domain/dto/AjaxResult.java
  9. 18 0
      boman-api/boman-domain/src/main/java/com.boman.domain/dto/FileDto.java
  10. 26 5
      boman-api/boman-domain/src/main/java/com/boman/domain/form/LoginBody.java
  11. 1 0
      boman-api/pom.xml
  12. 5 1
      boman-auth/pom.xml
  13. 43 14
      boman-auth/src/main/java/com/boman/auth/controller/TokenController.java
  14. 17 23
      boman-auth/src/main/java/com/boman/auth/service/SysLoginService.java
  15. 2 2
      boman-common/boman-common-datascope/src/main/java/com/boman/common/datascope/aspect/DataScopeAspect.java
  16. 2 0
      boman-common/boman-common-redis/src/main/java/com/boman/common/redis/RedisKey.java
  17. 0 0
      boman-common/boman-common-security/src/main/java/com/boman/common/security/service/TokenService.java
  18. 6 0
      boman-gateway/src/main/java/com/boman/gateway/filter/ValidateCodeFilter.java
  19. 35 9
      boman-modules/boman-file/src/main/java/com/boman/file/controller/SysFileController.java
  20. 12 2
      boman-modules/boman-file/src/main/java/com/boman/file/service/ISysFileService.java
  21. 57 14
      boman-modules/boman-file/src/main/java/com/boman/file/service/LocalSysFileServiceImpl.java
  22. 7 8
      boman-modules/boman-system/src/main/java/com/boman/system/controller/SysUserController.java
  23. 3 0
      boman-modules/boman-system/src/main/java/com/boman/system/mapper/SysUserMapper.java
  24. 7 0
      boman-modules/boman-system/src/main/java/com/boman/system/service/ISysUserService.java
  25. 13 0
      boman-modules/boman-system/src/main/java/com/boman/system/service/impl/SysUserServiceImpl.java
  26. 6 1
      boman-modules/boman-system/src/main/resources/mapper/system/SysUserMapper.xml
  27. 11 17
      boman-web-core/src/main/java/com/boman/web/core/controller/TableController.java
  28. 102 0
      boman-web-core/src/main/java/com/boman/web/core/mapper/JFTaskBusinessMapper.java
  29. 1 1
      boman-web-core/src/main/java/com/boman/web/core/mapper/StandardMapper.java
  30. 3 0
      boman-web-core/src/main/java/com/boman/web/core/service/TableServiceCmdService.java
  31. 105 0
      boman-wechat/pom.xml
  32. 33 0
      boman-wechat/src/main/java/com/boman/wechat/BomanWechatApplication.java
  33. 53 0
      boman-wechat/src/main/java/com/boman/wechat/config/WechatProperties.java
  34. 30 0
      boman-wechat/src/main/java/com/boman/wechat/controller/WechatInfoController.java
  35. 14 0
      boman-wechat/src/main/java/com/boman/wechat/service/WechatService.java
  36. 119 0
      boman-wechat/src/main/java/com/boman/wechat/service/impl/WechatServiceImpl.java
  37. 92 0
      boman-wechat/src/main/java/com/boman/wechat/utils/HttpClientUtils.java
  38. 4 0
      boman-wechat/src/main/resources/application.properties
  39. 19 0
      boman-wechat/src/main/resources/bootstrap-prod.yml
  40. 19 0
      boman-wechat/src/main/resources/bootstrap-test.yml
  41. 19 0
      boman-wechat/src/main/resources/bootstrap.yml
  42. 74 0
      boman-wechat/src/main/resources/logback.xml
  43. 4 0
      boman-wechat/src/main/resources/rebel-remote.xml
  44. 16 0
      boman-wechat/src/main/resources/rebel.xml
  45. 1 0
      pom.xml
  46. 1 0
      ruoyi-ui/package.json
  47. BIN
      ruoyi-ui/public/ceshi.pdf
  48. 91 0
      ruoyi-ui/src/api/system/election.js
  49. 68 0
      ruoyi-ui/src/api/system/group.js
  50. 136 0
      ruoyi-ui/src/api/system/isses.js
  51. BIN
      ruoyi-ui/src/assets/images/dele.png
  52. 60 2
      ruoyi-ui/src/components/DynamicFormsteo/index.vue
  53. 4 4
      ruoyi-ui/src/router/index.js
  54. 2 4
      ruoyi-ui/src/views/index.vue
  55. 1017 0
      ruoyi-ui/src/views/system/collection/index.vue
  56. 547 0
      ruoyi-ui/src/views/system/election/index.vue
  57. 359 0
      ruoyi-ui/src/views/system/group/index.vue
  58. 1175 0
      ruoyi-ui/src/views/system/issue/index.vue
  59. 41 0
      ruoyi-ui/src/views/system/pdf/index.vue
  60. 82 10
      ruoyi-ui/src/views/system/surface/index.vue
  61. 624 553
      ruoyi-ui/src/views/system/table/index.vue

+ 5 - 4
boman-api/boman-api-system/src/main/java/com/boman/system/api/RemoteUserService.java

@@ -1,15 +1,13 @@
 package com.boman.system.api;
 
 import com.boman.domain.SysUser;
+import com.boman.domain.dto.AjaxResult;
 import org.springframework.cloud.openfeign.FeignClient;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.*;
 import com.boman.domain.constant.ServiceNameConstants;
 import com.boman.domain.dto.R;
 import com.boman.system.api.factory.RemoteUserFallbackFactory;
 import com.boman.system.api.model.LoginUser;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
 
 import java.util.List;
 
@@ -38,4 +36,7 @@ public interface RemoteUserService
      */
     @PostMapping("/user/listByDeptId")
     List<SysUser> listByDeptId(@RequestBody List<Long> deptIdList);
+
+    @PostMapping("/user/updateUnionId")
+    public AjaxResult updateUnionId(@RequestBody SysUser sysUser);
 }

+ 24 - 0
boman-api/boman-api-wechat/pom.xml

@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <groupId>com.boman</groupId>
+        <artifactId>boman-api</artifactId>
+        <version>2.5.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>boman-api-wechat</artifactId>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.boman</groupId>
+            <artifactId>boman-domain</artifactId>
+            <version>2.5.0-SNAPSHOT</version>
+        </dependency>
+
+    </dependencies>
+
+
+</project>

+ 22 - 0
boman-api/boman-api-wechat/src/main/java/com/boman/wechat/api/RemoteWechatService.java

@@ -0,0 +1,22 @@
+package com.boman.wechat.api;
+
+import com.alibaba.fastjson.JSONObject;
+import com.boman.domain.constant.ServiceNameConstants;
+import com.boman.domain.dto.AjaxResult;
+import com.boman.domain.form.LoginBody;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+@FeignClient(contextId = "remoteObjService", value = ServiceNameConstants.WECHAT_SERVICE)
+public interface RemoteWechatService {
+
+    /**
+     * 功能描述: 根据微信登录后获取的code获取用户的授权信息
+     *
+     * @param loginBody 登录信息体
+     * @return com.boman.domain.dto.AjaxResult
+     */
+    @PostMapping("/wechat/p/c/wechatInfo")
+    AjaxResult getWechatInfo(@RequestBody LoginBody loginBody);
+}

+ 10 - 0
boman-api/boman-domain/src/main/java/com.boman.domain/SysFile.java

@@ -27,6 +27,16 @@ public class SysFile
      */
     private String uid;
 
+    private String absolutePath;
+
+    public String getAbsolutePath() {
+        return absolutePath;
+    }
+
+    public void setAbsolutePath(String absolutePath) {
+        this.absolutePath = absolutePath;
+    }
+
     public String getName()
     {
         return name;

+ 11 - 1
boman-api/boman-domain/src/main/java/com.boman.domain/SysUser.java

@@ -92,6 +92,8 @@ public class SysUser extends BaseEntity
     /** 岗位组 */
     private Long[] postIds;
 
+    private String unionId;
+
     public SysUser()
     {
 
@@ -306,7 +308,15 @@ public class SysUser extends BaseEntity
     {
         this.postIds = postIds;
     }
-    
+
+    public String getUnionId() {
+        return unionId;
+    }
+
+    public void setUnionId(String unionId) {
+        this.unionId = unionId;
+    }
+
     @Override
     public String toString() {
         return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)

+ 21 - 0
boman-api/boman-domain/src/main/java/com.boman.domain/WechatEnum.java

@@ -0,0 +1,21 @@
+package com.boman.domain;
+
+public enum WechatEnum {
+    /** 用户账号登录 */
+    U("u"),
+    /** 微信授权登录 */
+    W("w");
+
+
+    private String value;
+
+    private WechatEnum(String value)
+    {
+        this.value = value;
+    }
+
+    public String getValue()
+    {
+        return value;
+    }
+}

+ 5 - 0
boman-api/boman-domain/src/main/java/com.boman.domain/constant/ServiceNameConstants.java

@@ -36,4 +36,9 @@ public class ServiceNameConstants
      * boman-jflow
      */
     public static final String JFLOW_SERVICE = "boman-jflow";
+
+    /**
+     * boman-wechat
+     */
+    public static final String WECHAT_SERVICE = "boman-wechat";
 }

+ 44 - 53
boman-api/boman-domain/src/main/java/com.boman.domain/dto/AjaxResult.java

@@ -1,62 +1,64 @@
 package com.boman.domain.dto;
 
 import java.util.HashMap;
+
 import com.boman.domain.constant.HttpStatus;
 
 /**
  * 操作消息提醒
- * 
+ *
  * @author ruoyi
  */
-public class AjaxResult extends HashMap<String, Object>
-{
+public class AjaxResult extends HashMap<String, Object> {
     private static final long serialVersionUID = 1L;
 
-    /** 状态码 */
+    /**
+     * 状态码
+     */
     public static final String CODE_TAG = "code";
 
-    /** 返回内容 */
+    /**
+     * 返回内容
+     */
     public static final String MSG_TAG = "msg";
 
-    /** 数据对象 */
+    /**
+     * 数据对象
+     */
     public static final String DATA_TAG = "data";
 
     /**
      * 初始化一个新创建的 AjaxResult 对象,使其表示一个空消息。
      */
-    public AjaxResult()
-    {
+    public AjaxResult() {
     }
 
     /**
      * 初始化一个新创建的 AjaxResult 对象
-     * 
+     *
      * @param code 状态码
-     * @param msg 返回内容
+     * @param msg  返回内容
      */
-    public AjaxResult(int code, String msg)
-    {
+    public AjaxResult(int code, String msg) {
         super.put(CODE_TAG, code);
         super.put(MSG_TAG, msg);
     }
 
     /**
      * 初始化一个新创建的 AjaxResult 对象
-     * 
+     *
      * @param code 状态码
-     * @param msg 返回内容
+     * @param msg  返回内容
      * @param data 数据对象
      */
-    public AjaxResult(int code, String msg, Object data)
-    {
+    public AjaxResult(int code, String msg, Object data) {
         super.put(CODE_TAG, code);
         super.put(MSG_TAG, msg);
-        if (null != data)
-        {
+        if (null != data) {
             super.put(DATA_TAG, data);
         }
     }
-    
+
     /**
      * 方便链式调用
      *
@@ -65,117 +67,106 @@ public class AjaxResult extends HashMap<String, Object>
      * @return
      */
     @Override
-    public AjaxResult put(String key, Object value)
-    {
+    public AjaxResult put(String key, Object value) {
         super.put(key, value);
         return this;
     }
 
     /**
      * 返回成功消息
-     * 
+     *
      * @return 成功消息
      */
-    public static AjaxResult success()
-    {
+    public static AjaxResult success() {
         return AjaxResult.success("操作成功");
     }
 
     /**
      * 返回成功数据
-     * 
+     *
      * @return 成功消息
      */
-    public static AjaxResult success(Object data)
-    {
+    public static AjaxResult success(Object data) {
         return AjaxResult.success("操作成功", data);
     }
 
     /**
      * 返回成功消息
-     * 
+     *
      * @param msg 返回内容
      * @return 成功消息
      */
-    public static AjaxResult success(String msg)
-    {
+    public static AjaxResult success(String msg) {
         return AjaxResult.success(msg, null);
     }
 
     /**
      * 返回成功消息
-     * 
-     * @param msg 返回内容
+     *
+     * @param msg  返回内容
      * @param data 数据对象
      * @return 成功消息
      */
-    public static AjaxResult success(String msg, Object data)
-    {
+    public static AjaxResult success(String msg, Object data) {
         return new AjaxResult(HttpStatus.SUCCESS, msg, data);
     }
 
     /**
      * 返回成功消息
      *
-     * @param msg 返回内容
      * @param data 数据对象
      * @return 成功消息
      */
-    public static AjaxResult successZero( Object data)
-    {
+    public static AjaxResult successZero(Object data) {
         return new AjaxResult(HttpStatus.ZEROSUCCESS, "", data);
     }
 
     /**
      * 返回错误消息
-     * 
+     *
      * @return
      */
-    public static AjaxResult error()
-    {
+    public static AjaxResult error() {
         return AjaxResult.error("操作失败");
     }
 
     /**
      * 返回错误消息
-     * 
+     *
      * @param msg 返回内容
      * @return 警告消息
      */
-    public static AjaxResult error(String msg)
-    {
+    public static AjaxResult error(String msg) {
         return AjaxResult.error(msg, null);
     }
 
     /**
      * 返回错误消息
-     * 
-     * @param msg 返回内容
+     *
+     * @param msg  返回内容
      * @param data 数据对象
      * @return 警告消息
      */
-    public static AjaxResult error(String msg, Object data)
-    {
+    public static AjaxResult error(String msg, Object data) {
         return new AjaxResult(HttpStatus.ERROR, msg, data);
     }
 
     /**
      * 返回错误消息
-     * 
+     *
      * @param code 状态码
-     * @param msg 返回内容
+     * @param msg  返回内容
      * @return 警告消息
      */
-    public static AjaxResult error(int code, String msg)
-    {
+    public static AjaxResult error(int code, String msg) {
         return new AjaxResult(code, msg, null);
     }
 
-    public static boolean checkSuccess(AjaxResult ajaxResult){
+    public static boolean checkSuccess(AjaxResult ajaxResult) {
         return null != ajaxResult && HttpStatus.SUCCESS == ((int) ajaxResult.get(CODE_TAG));
     }
 
-    public static boolean checkFail(AjaxResult ajaxResult){
+    public static boolean checkFail(AjaxResult ajaxResult) {
         return !checkSuccess(ajaxResult);
     }
 }

+ 18 - 0
boman-api/boman-domain/src/main/java/com.boman.domain/dto/FileDto.java

@@ -0,0 +1,18 @@
+package com.boman.domain.dto;
+
+
+import lombok.Data;
+
+/**
+ * @author shiqian
+ * @date 2021年07月08日 11:09
+ **/
+@Data
+public class FileDto {
+
+
+    private String absolutePath;
+
+    private Boolean preview;
+
+}

+ 26 - 5
boman-auth/src/main/java/com/boman/auth/form/LoginBody.java → boman-api/boman-domain/src/main/java/com/boman/domain/form/LoginBody.java

@@ -1,12 +1,13 @@
-package com.boman.auth.form;
+package com.boman.domain.form;
+
+import com.boman.domain.WechatEnum;
 
 /**
  * 用户登录对象
- * 
+ *
  * @author ruoyi
  */
-public class LoginBody
-{
+public class LoginBody {
     /**
      * 用户名
      */
@@ -17,6 +18,10 @@ public class LoginBody
      */
     private String password;
 
+    private String code;
+
+    private String logintype;
+
     public String getUsername()
     {
         return username;
@@ -36,4 +41,20 @@ public class LoginBody
     {
         this.password = password;
     }
-}
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getLogintype() {
+        return logintype;
+    }
+
+    public void setLogintype(String logintype) {
+        this.logintype = logintype;
+    }
+}

+ 1 - 0
boman-api/pom.xml

@@ -14,6 +14,7 @@
         <module>boman-domain</module>
         <module>boman-api-web-core</module>
         <module>boman-api-jflow</module>
+        <module>boman-api-wechat</module>
     </modules>
 
     <artifactId>boman-api</artifactId>

+ 5 - 1
boman-auth/pom.xml

@@ -64,7 +64,11 @@
             <groupId>com.boman</groupId>
             <artifactId>boman-common-security</artifactId>
         </dependency>
-        
+        <dependency>
+            <groupId>com.boman</groupId>
+            <artifactId>boman-api-wechat</artifactId>
+            <version>${project.version}</version>
+        </dependency>
     </dependencies>
 	
     <build>

+ 43 - 14
boman-auth/src/main/java/com/boman/auth/controller/TokenController.java

@@ -2,9 +2,15 @@ package com.boman.auth.controller;
 
 import javax.servlet.http.HttpServletRequest;
 
+import com.alibaba.fastjson.JSONObject;
+import com.boman.common.core.exception.BaseException;
+import com.boman.domain.SysUser;
+import com.boman.domain.WechatEnum;
+import com.boman.domain.dto.AjaxResult;
+import com.boman.domain.form.LoginBody;
+import com.boman.wechat.api.RemoteWechatService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
-import com.boman.auth.form.LoginBody;
 import com.boman.auth.service.SysLoginService;
 import com.boman.domain.dto.R;
 import com.boman.common.core.utils.StringUtils;
@@ -13,34 +19,59 @@ import com.boman.system.api.model.LoginUser;
 
 /**
  * token 控制
- * 
+ *
  * @author ruoyi
  */
 @RestController
 //@CrossOrigin
-public class TokenController
-{
+public class TokenController {
+
     @Autowired
     private TokenService tokenService;
 
     @Autowired
     private SysLoginService sysLoginService;
 
+    @Autowired
+    private RemoteWechatService remoteWechatService;
+
     @PostMapping("login")
-    public R<?> login(@RequestBody LoginBody form)
-    {
+    public R<?> login(@RequestBody LoginBody form) {
+        String unionId = "";
+        // 验证是pc还是小程序
+        if (form.getLogintype() != null && form.getLogintype().equals(WechatEnum.W.getValue())) {
+            AjaxResult result = remoteWechatService.getWechatInfo(form);
+            if ((Integer) result.get(AjaxResult.CODE_TAG) != 0) {
+                throw new BaseException((String) result.get(AjaxResult.MSG_TAG));
+            }
+            JSONObject jsonObject = (JSONObject) result.get(AjaxResult.DATA_TAG);
+            if (jsonObject == null) {
+                throw new BaseException("未获取到微信鉴权相关信息!");
+            }
+            unionId = (String) jsonObject.get("unionid");
+        }
         // 用户登录
         LoginUser userInfo = sysLoginService.login(form.getUsername(), form.getPassword());
+        // 如果是微信登录并且获取到的用户的unionId不为空
+        if (form.getLogintype() != null
+                && form.getLogintype().equals(WechatEnum.W.getValue())
+                && StringUtils.isNotEmpty(unionId)) {
+            SysUser sysUser = new SysUser();
+            sysUser.setId(userInfo.getUserid());
+            sysUser.setUnionId(unionId);
+            AjaxResult updateResult = sysLoginService.updateUnionId(sysUser);
+            if((Integer) updateResult.get(AjaxResult.CODE_TAG) != 0) {
+                throw new BaseException("保存小程序唯一标识出错!");
+            }
+        }
         // 获取登录token
         return R.ok(tokenService.createToken(userInfo));
     }
 
     @DeleteMapping("logout")
-    public R<?> logout(HttpServletRequest request)
-    {
+    public R<?> logout(HttpServletRequest request) {
         LoginUser loginUser = tokenService.getLoginUser(request);
-        if (StringUtils.isNotNull(loginUser))
-        {
+        if (StringUtils.isNotNull(loginUser)) {
             String username = loginUser.getUsername();
             // 删除用户缓存记录
             tokenService.delLoginUser(loginUser.getToken());
@@ -51,11 +82,9 @@ public class TokenController
     }
 
     @PostMapping("refresh")
-    public R<?> refresh(HttpServletRequest request)
-    {
+    public R<?> refresh(HttpServletRequest request) {
         LoginUser loginUser = tokenService.getLoginUser(request);
-        if (StringUtils.isNotNull(loginUser))
-        {
+        if (StringUtils.isNotNull(loginUser)) {
             // 刷新令牌有效期
             tokenService.refreshToken(loginUser);
             return R.ok();

+ 17 - 23
boman-auth/src/main/java/com/boman/auth/service/SysLoginService.java

@@ -1,5 +1,6 @@
 package com.boman.auth.service;
 
+import com.boman.domain.dto.AjaxResult;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 import com.boman.domain.constant.Constants;
@@ -16,12 +17,11 @@ import com.boman.system.api.model.LoginUser;
 
 /**
  * 登录校验方法
- * 
+ *
  * @author ruoyi
  */
 @Component
-public class SysLoginService
-{
+public class SysLoginService {
     @Autowired
     private RemoteLogService remoteLogService;
 
@@ -31,56 +31,47 @@ public class SysLoginService
     /**
      * 登录
      */
-    public LoginUser login(String username, String password)
-    {
+    public LoginUser login(String username, String password) {
         // 用户名或密码为空 错误
-        if (StringUtils.isAnyBlank(username, password))
-        {
+        if (StringUtils.isAnyBlank(username, password)) {
             remoteLogService.saveLogininfor(username, Constants.LOGIN_FAIL, "用户/密码必须填写");
             throw new BaseException("用户/密码必须填写");
         }
         // 密码如果不在指定范围内 错误
         if (password.length() < UserConstants.PASSWORD_MIN_LENGTH
-                || password.length() > UserConstants.PASSWORD_MAX_LENGTH)
-        {
+                || password.length() > UserConstants.PASSWORD_MAX_LENGTH) {
             remoteLogService.saveLogininfor(username, Constants.LOGIN_FAIL, "用户密码不在指定范围");
             throw new BaseException("用户密码不在指定范围");
         }
         // 用户名不在指定范围内 错误
         if (username.length() < UserConstants.USERNAME_MIN_LENGTH
-                || username.length() > UserConstants.USERNAME_MAX_LENGTH)
-        {
+                || username.length() > UserConstants.USERNAME_MAX_LENGTH) {
             remoteLogService.saveLogininfor(username, Constants.LOGIN_FAIL, "用户名不在指定范围");
             throw new BaseException("用户名不在指定范围");
         }
         // 查询用户信息
         R<LoginUser> userResult = remoteUserService.getUserInfo(username);
 
-        if (R.FAIL == userResult.getCode())
-        {
+        if (R.FAIL == userResult.getCode()) {
             throw new BaseException(userResult.getMsg());
         }
 
-        if (StringUtils.isNull(userResult) || StringUtils.isNull(userResult.getData()))
-        {
+        if (StringUtils.isNull(userResult) || StringUtils.isNull(userResult.getData())) {
             remoteLogService.saveLogininfor(username, Constants.LOGIN_FAIL, "登录用户不存在");
             throw new BaseException("登录用户:" + username + " 不存在");
         }
         LoginUser userInfo = userResult.getData();
         SysUser user = userResult.getData().getSysUser();
-        if (UserStatus.DELETED.getCode().equals(user.getDelFlag()))
-        {
+        if (UserStatus.DELETED.getCode().equals(user.getDelFlag())) {
             remoteLogService.saveLogininfor(username, Constants.LOGIN_FAIL, "对不起,您的账号已被删除");
 
             throw new BaseException("对不起,您的账号:" + username + " 已被删除");
         }
-        if (UserStatus.DISABLE.getCode().equals(user.getStatus()))
-        {
+        if (UserStatus.DISABLE.getCode().equals(user.getStatus())) {
             remoteLogService.saveLogininfor(username, Constants.LOGIN_FAIL, "用户已停用,请联系管理员");
             throw new BaseException("对不起,您的账号:" + username + " 已停用");
         }
-        if (!SecurityUtils.matchesPassword(password, user.getPassword()))
-        {
+        if (!SecurityUtils.matchesPassword(password, user.getPassword())) {
             remoteLogService.saveLogininfor(username, Constants.LOGIN_FAIL, "用户密码错误");
             throw new BaseException("用户不存在/密码错误");
         }
@@ -88,8 +79,11 @@ public class SysLoginService
         return userInfo;
     }
 
-    public void logout(String loginName)
-    {
+    public AjaxResult updateUnionId(SysUser sysUser) {
+        return remoteUserService.updateUnionId(sysUser);
+    }
+
+    public void logout(String loginName) {
         remoteLogService.saveLogininfor(loginName, Constants.LOGOUT, "退出成功");
     }
 }

+ 2 - 2
boman-common/boman-common-datascope/src/main/java/com/boman/common/datascope/aspect/DataScopeAspect.java

@@ -81,11 +81,11 @@ public class DataScopeAspect
      */
     @AfterReturning(returning = "rvt", pointcut = "@annotation(com.boman.common.datascope.annotation.DataScope)")
     public Object AfterExec(JoinPoint joinPoint, Object rvt) {
-        System.out.println("AfterReturning增强:获取目标方法的返回值:" + rvt);
+//        System.out.println("AfterReturning增强:获取目标方法的返回值:" + rvt);
         MethodSignature signature = (MethodSignature) joinPoint.getSignature();
         Method method = signature.getMethod();
         String name = method.getName();
-        System.out.println("AfterReturning增强:获取目标方法的方法:" + name);
+//        System.out.println("AfterReturning增强:获取目标方法的方法:" + name);
         return rvt;
     }
 

+ 2 - 0
boman-common/boman-common-redis/src/main/java/com/boman/common/redis/RedisKey.java

@@ -32,4 +32,6 @@ public class RedisKey {
      * 单据的seq
      */
     public static final String BILL_SQE = "BILL:SEQ:";
+
+    public static final String USER_OPPEN_ID_AND_SESSION_KEY_PREFIX = "openId:sessionKey:";
 }

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 0
boman-common/boman-common-security/src/main/java/com/boman/common/security/service/TokenService.java


+ 6 - 0
boman-gateway/src/main/java/com/boman/gateway/filter/ValidateCodeFilter.java

@@ -36,6 +36,8 @@ public class ValidateCodeFilter extends AbstractGatewayFilterFactory<Object>
 
     private static final String UUID = "uuid";
 
+    private static final String LOGINTYPE = "logintype";
+
     @Override
     public GatewayFilter apply(Object config)
     {
@@ -52,6 +54,10 @@ public class ValidateCodeFilter extends AbstractGatewayFilterFactory<Object>
             {
                 String rspStr = resolveBodyFromRequest(request);
                 JSONObject obj = JSONObject.parseObject(rspStr);
+                String loginType = (String) obj.get(LOGINTYPE);
+                if(StringUtils.isNotEmpty(loginType) && loginType.equals("w")) {
+                    return chain.filter(exchange);
+                }
                 validateCodeService.checkCapcha(obj.getString(CODE), obj.getString(UUID));
             }
             catch (Exception e)

+ 35 - 9
boman-modules/boman-file/src/main/java/com/boman/file/controller/SysFileController.java

@@ -1,18 +1,23 @@
 package com.boman.file.controller;
 
 import com.boman.domain.dto.AjaxResult;
+import com.boman.domain.dto.FileDto;
+import org.apache.commons.lang3.BooleanUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 import com.boman.domain.dto.R;
 import com.boman.common.core.utils.file.FileUtils;
 import com.boman.file.service.ISysFileService;
 import com.boman.domain.SysFile;
 
+import javax.servlet.http.HttpServletResponse;
+import java.io.*;
+import java.net.URL;
+import java.util.List;
+
 /**
  * 文件请求处理
  * 
@@ -35,10 +40,15 @@ public class SysFileController
         try
         {
             // 上传并返回访问地址
-            String url = sysFileService.uploadFile(file);
+            List<String> urlList = sysFileService.uploadFile(file);
+
             SysFile sysFile = new SysFile();
-            sysFile.setName(FileUtils.getName(url));
-            sysFile.setUrl(url);
+            String staticPath = urlList.get(0);
+            String absolutePath = urlList.get(1);
+            sysFile.setName(FileUtils.getName(staticPath));
+            sysFile.setUrl(staticPath);
+            sysFile.setAbsolutePath(absolutePath);
+
             return R.ok(sysFile);
         }
         catch (Exception e)
@@ -54,10 +64,14 @@ public class SysFileController
     @PostMapping("/upload/base64")
     public AjaxResult uploadFileBase64(@RequestBody String base64) {
         try {
-            String url = sysFileService.uploadFileBase64(base64);
+            List<String> urlList = sysFileService.uploadFileBase64(base64);
+            String staticPath = urlList.get(0);
+            String absolutePath = urlList.get(1);
+
             AjaxResult ajax = AjaxResult.success();
-            ajax.put("name", FileUtils.getName(url));
-            ajax.put("url", url);
+            ajax.put("name", FileUtils.getName(staticPath));
+            ajax.put("url", staticPath);
+            ajax.put("absolutePath", absolutePath);
             return ajax;
         } catch (Exception e) {
             return AjaxResult.error(e.getMessage());
@@ -65,4 +79,16 @@ public class SysFileController
     }
 
 
+    /**
+     * 功能描述: 查看BooleanUtils.isTrue(dto.getPreview())
+     *          下载BooleanUtils.isFalse(dto.getPreview())
+     *
+     * @param dto      absolutePath preview
+     * @param response response
+     */
+    @PostMapping("/previewAndDownload")
+    public void previewAndDownload(@RequestBody FileDto dto, HttpServletResponse response) throws RuntimeException, IOException {
+        sysFileService.previewAndDownload(dto, response);
+    }
+
 }

+ 12 - 2
boman-modules/boman-file/src/main/java/com/boman/file/service/ISysFileService.java

@@ -3,6 +3,7 @@ package com.boman.file.service;
 import com.alibaba.fastjson.JSONObject;
 import com.boman.domain.dto.AjaxResult;
 import com.boman.domain.dto.ExportExcelDto;
+import com.boman.domain.dto.FileDto;
 import com.boman.domain.dto.ImportExcelDto;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -24,7 +25,7 @@ public interface ISysFileService
      * @return 访问地址
      * @throws Exception
      */
-    public String uploadFile(MultipartFile file) throws Exception;
+    public List<String>  uploadFile(MultipartFile file) throws Exception;
 
     /**
      * 功能描述: 上传base64
@@ -32,7 +33,7 @@ public interface ISysFileService
      * @param base64 base64
      * @return java.lang.String
      */
-    String uploadFileBase64(String base64) throws IOException;
+    List<String> uploadFileBase64(String base64) throws IOException;
 
     /**
      * 功能描述: 通用的导入接口
@@ -61,4 +62,13 @@ public interface ISysFileService
      * @return com.boman.domain.dto.AjaxResult
      */
     AjaxResult exportExcelCommon(HttpServletResponse response, ExportExcelDto dto);
+
+    /**
+     * 功能描述: 查看BooleanUtils.isTrue(dto.getPreview())
+     *          下载BooleanUtils.isFalse(dto.getPreview())
+     *
+     * @param dto      absolutePath preview
+     * @param response response
+     */
+    void previewAndDownload(FileDto dto, HttpServletResponse response) throws IOException;
 }

+ 57 - 14
boman-modules/boman-file/src/main/java/com/boman/file/service/LocalSysFileServiceImpl.java

@@ -3,17 +3,16 @@ package com.boman.file.service;
 import com.alibaba.fastjson.JSONObject;
 import com.boman.common.core.utils.obj.ObjectUtils;
 import com.boman.common.core.utils.poi.ExcelUtil;
-import com.boman.domain.dto.AjaxResult;
+import com.boman.domain.dto.*;
 import com.boman.common.redis.RedisKey;
 import com.boman.common.redis.service.RedisService;
 import com.boman.domain.GenTable;
 import com.boman.domain.GenTableColumn;
 import com.boman.domain.constant.MaskConstant;
-import com.boman.domain.dto.ExportExcelDto;
-import com.boman.domain.dto.FormDataDto;
-import com.boman.domain.dto.ImportExcelDto;
 import com.boman.file.utils.FileUploadUtils;
 import com.boman.web.core.api.RemoteObjService;
+import com.google.common.collect.Lists;
+import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.BooleanUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -25,7 +24,8 @@ import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
+import java.io.*;
+import java.net.URL;
 import java.util.*;
 
 import static com.boman.common.core.utils.obj.ObjectUtils.map;
@@ -74,12 +74,12 @@ public class LocalSysFileServiceImpl implements ISysFileService
      * @throws Exception
      */
     @Override
-    public String uploadFile(MultipartFile file) throws Exception
-    {
+    public List<String> uploadFile(MultipartFile file) throws Exception {
         String name = FileUploadUtils.upload(localFilePath, file);
-        String url = domain + localFilePrefix + name;
-        LOGGER.info("上传的路径为: {}", url);
-        return url;
+        String absolutePath = localFilePath + "\\" + name;
+        String staticUrl = domain + localFilePrefix + name;
+        LOGGER.info("上传静态路径路径为: {}, 绝对路径为: {}", staticUrl, absolutePath);
+        return Lists.newArrayList(staticUrl, absolutePath);
     }
 
     /**
@@ -89,12 +89,13 @@ public class LocalSysFileServiceImpl implements ISysFileService
      * @return java.lang.String
      */
     @Override
-    public String uploadFileBase64(String base64) throws IOException {
+    public List<String>  uploadFileBase64(String base64) throws IOException {
         MultipartFile multipartFile = FileUploadUtils.base64ToMultipart(base64);
         String name = FileUploadUtils.upload(localFilePath, multipartFile);
-        String path = domain + localFilePrefix + name;
-        LOGGER.info("上传的路径为: {}", path);
-        return path;
+        String absolutePath = localFilePath + "\\" + name;
+        String staticUrl = domain + localFilePrefix + name;
+        LOGGER.info("上传静态路径路径为: {}, 绝对路径为: {}", staticUrl, absolutePath);
+        return Lists.newArrayList(staticUrl, absolutePath);
     }
 
     /**
@@ -175,6 +176,48 @@ public class LocalSysFileServiceImpl implements ISysFileService
         return null;
     }
 
+    /**
+     * 功能描述: 查看BooleanUtils.isTrue(dto.getPreview())
+     *          下载BooleanUtils.isFalse(dto.getPreview())
+     *
+     * @param dto      absolutePath preview
+     * @param response response
+     */
+    @Override
+    public void previewAndDownload(FileDto dto, HttpServletResponse response) throws RuntimeException, IOException {
+        String filePath = dto.getAbsolutePath();
+        File file = new File(filePath);
+        if (!file.exists()) {
+            response.sendError(404, "file is not exist, filePath = " + filePath);
+            return;
+        }
+
+        response.reset();
+        if (BooleanUtils.isTrue(dto.getPreview())) {
+            // 查看
+            URL url = new URL("file:///" + filePath);
+            String contentType = url.openConnection().getContentType();
+            response.setContentType(contentType);
+            response.setHeader("Content-Disposition", "inline;filename=test.pdf");
+        } else {
+            // 下载
+            response.setContentType("application/x-msdownload");
+            response.setHeader("Content-Disposition", "attachment;filename=test.pdf");
+        }
+
+        int len;
+        byte[] bs = new byte[1024];
+        BufferedInputStream br = new BufferedInputStream(new FileInputStream(file));
+        OutputStream out = response.getOutputStream();
+        while ((len = br.read(bs)) > 0) {
+            out.write(bs, 0, len);
+        }
+
+        out.flush();
+        IOUtils.closeQuietly(out);
+        IOUtils.closeQuietly(br);
+    }
+
     public void handleNullColumnValue(List<Map<String, Object>> result, List<String> showData) {
         for (Map<String, Object> map : result) {
             Set<String> resultKeySet = map.keySet();

+ 7 - 8
boman-modules/boman-system/src/main/java/com/boman/system/controller/SysUserController.java

@@ -13,14 +13,7 @@ import com.boman.system.service.*;
 import com.google.common.collect.Lists;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PutMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 import com.boman.domain.constant.UserConstants;
 import com.boman.domain.dto.R;
@@ -168,6 +161,12 @@ public class SysUserController extends BaseController
         return ajax;
     }
 
+    @Log(title = "修改用户的小程序唯一标识", businessType = BusinessType.UPDATE)
+    @PostMapping("/updateUnionId")
+    public AjaxResult updateUnionId(@RequestBody SysUser sysUser) {
+        return userService.updateUnionId(sysUser);
+    }
+
     /**
      * 根据用户编号获取详细信息
      */

+ 3 - 0
boman-modules/boman-system/src/main/java/com/boman/system/mapper/SysUserMapper.java

@@ -37,6 +37,9 @@ public interface SysUserMapper
      */
     public SysUser selectUserById(Long id);
 
+    int updateUnionId(SysUser user);
+
+
     /**
      * 新增用户信息
      * 

+ 7 - 0
boman-modules/boman-system/src/main/java/com/boman/system/service/ISysUserService.java

@@ -38,6 +38,13 @@ public interface ISysUserService
      */
     public SysUser selectUserById(Long id);
 
+    /**
+     * 根据id修改用户的unionId(来自微信小程序)
+     * @param sysUser
+     * @return
+     */
+    public AjaxResult updateUnionId(SysUser sysUser);
+
     /**
      * 根据用户ID查询用户所属角色组
      * 

+ 13 - 0
boman-modules/boman-system/src/main/java/com/boman/system/service/impl/SysUserServiceImpl.java

@@ -103,6 +103,19 @@ public class SysUserServiceImpl implements ISysUserService
         return userMapper.selectUserById(id);
     }
 
+    @Override
+    public AjaxResult updateUnionId(SysUser user) {
+        try {
+            if(userMapper.updateUnionId(user) > 0) {
+                return AjaxResult.successZero("");
+            }
+        }catch (Exception e) {
+            return AjaxResult.error(-1, "保存异常");
+        }
+
+        return AjaxResult.error(-1, "保存失败");
+    }
+
     /**
      * 查询用户所属角色组
      * 

+ 6 - 1
boman-modules/boman-system/src/main/resources/mapper/system/SysUserMapper.xml

@@ -46,7 +46,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 	</resultMap>
 	
 	<sql id="selectUserVo">
-        select u.id, 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.id, u.union_id, 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,
         d.id, d.parent_id, d.dept_name, d.order_num, d.leader, d.status as dept_status,
         r.id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.status as role_status
         from sys_user u
@@ -132,6 +132,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  			sysdate()
  		)
 	</insert>
+
+	<update id="updateUnionId" parameterType="com.boman.domain.SysUser">
+		update sys_user set union_id = #{unionId} where id = #{id}
+	</update>
+
 	
 	<update id="updateUser" parameterType="com.boman.domain.SysUser">
  		update sys_user

+ 11 - 17
boman-web-core/src/main/java/com/boman/web/core/controller/TableController.java

@@ -1,14 +1,12 @@
 package com.boman.web.core.controller;
 
+import com.boman.common.redis.RedisKey;
 import com.boman.domain.dto.AjaxResult;
 import com.boman.domain.GenTable;
 import com.boman.web.core.service.TableServiceCmdService;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 
 /**
@@ -17,27 +15,23 @@ import org.springframework.web.bind.annotation.RestController;
  * @date 2021年03月22日 09:19
  **/
 @RestController
-@RequestMapping("/p/cs/table")
+@RequestMapping("/p/cs/table/")
 public class TableController {
 
     @Autowired
-    private TableServiceCmdService tableServiceCmdService;
+    private TableServiceCmdService cmdService;
 
     /**
      * 功能描述: 根据表名获取表信息、表字段和表字段对应的字典值
-     *                {
-     *                    "table": "sys_config",
-     *                }
      *
-     *
-     * @param condition condition
+     * @param tableName tableName
      * @return com.boman.domain.dto.AjaxResult
      */
-//    @ApiOperation(value = "根据表名获取表单所有信息")
-//    @PostMapping("/getByTableName")
-//    public AjaxResult getByTableName(@RequestBody BaseTableSaveDTO condition) {
-//        return tableServiceCmdService.getByTableName(condition);
-//    }
+    @ApiOperation(value = "根据表名获取表单所有信息")
+    @GetMapping("/getByTableName/{tableName}")
+    public AjaxResult getByTableName(@PathVariable("tableName") String tableName) {
+        return AjaxResult.success(cmdService.getTableFromRedisByTableName(RedisKey.TABLE_INFO, tableName));
+    }
 
     /**
      * 功能描述: 根据表名获取表信息、表字段和表字段对应的字典值
@@ -51,7 +45,7 @@ public class TableController {
     @ApiOperation(value = "根据表名获取表单所有信息, 没有过滤")
     @PostMapping("/listAllColumnsByTableId")
     public AjaxResult listAllColumnsByTableId(@RequestBody GenTable table) {
-        return tableServiceCmdService.listAllColumnsByTableId(table);
+        return cmdService.listAllColumnsByTableId(table);
     }
 
 

+ 102 - 0
boman-web-core/src/main/java/com/boman/web/core/mapper/JFTaskBusinessMapper.java

@@ -0,0 +1,102 @@
+package com.boman.web.core.mapper;
+
+import com.alibaba.fastjson.JSONObject;
+import com.boman.common.core.utils.obj.ObjectUtils;
+import com.boman.domain.jflow.ProcessNodeCandidator;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.ibatis.annotations.*;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+
+import static com.mysql.cj.util.StringUtils.isNullOrEmpty;
+
+/**
+ * 流程针对业务数据层面接口
+ *
+ *
+ * @author zhong.h
+ */
+@Mapper
+@Component
+public interface JFTaskBusinessMapper {
+    Logger LOGGER = LoggerFactory.getLogger(JFTaskBusinessMapper.class);
+
+    @InsertProvider(type = StandardMapper.SqlProvider.class, method = "insert")
+    int insert(@Param("tableName") String var1, @Param("model") JSONObject var2);
+
+    @UpdateProvider(type = StandardMapper.SqlProvider.class, method = "update")
+    int updateByIdList(@Param("tableName") String tableName, @Param("pkName") String pkName
+            , @Param("idList") List<Long> idList, @Param("model") JSONObject models);
+
+
+    @Select("select * from process_node_candidators t where t.business_code = #{businessCode} and t.module_id = #{moduleId} and t.node_id = #{nodeId}")
+    ProcessNodeCandidator selectData(@Param("businessCode") Long businessCode, @Param("moduleId") Long moduleId, @Param("nodeId") Long nodeId);
+
+    class SqlProvider {
+
+        public String insertList(Map<String, Object> para) {
+            List<JSONObject> dataList = (List<JSONObject>) para.get("dataList");
+            String tableName = (String) para.get("tableName");
+            if (isNullOrEmpty(tableName)) {
+                throw new IllegalArgumentException("tableName 无效");
+            }
+
+            if (ObjectUtils.isEmpty(dataList)) {
+                throw new IllegalArgumentException("需要插入的数据为空");
+            }
+
+            StringBuilder stringBuilder = new StringBuilder();
+            stringBuilder.append("insert into ").append(tableName).append(" ( ");
+            JSONObject keySet = dataList.get(0);
+            stringBuilder.append(String.join(", ", keySet.keySet()));
+            stringBuilder.append(" ) ").append("values ");
+
+            for (JSONObject data : dataList) {
+                StringBuilder values = new StringBuilder();
+                values.append(" ( ");
+                for (Map.Entry<String, Object> entry : data.entrySet()) {
+                    values.append("#{model.").append(entry.getKey()).append("}, ");
+                }
+
+                String beforeLast = StringUtils.substringBeforeLast(values.toString(), ", ");
+                stringBuilder.append(beforeLast).append(" ) ");
+            }
+
+            String sqlStr = stringBuilder.toString();
+            LOGGER.info("批量新增的sql语句为: {} \r\n 新增的数据为: {}", sqlStr, dataList);
+            return sqlStr;
+        }
+
+        public String update(Map<String, Object> para) {
+            String tableName = (String) para.get("tableName");
+            String pkName = (String) para.get("pkName");
+            List<Long> idList = (List<Long>) para.get("idList");
+            JSONObject models = (JSONObject) para.get("model");
+
+            StringBuilder wholeSql = new StringBuilder();
+            wholeSql.append("update ").append(tableName).append(" set ");
+            for (Map.Entry<String, Object> entry : models.entrySet()) {
+                String key = entry.getKey();
+                Object value = entry.getValue();
+                wholeSql.append(key).append(" = ").append(value).append(" , ");
+            }
+
+            wholeSql = new StringBuilder(StringUtils.substringBeforeLast(wholeSql.toString(), ","));
+            wholeSql.append(" where ").append(pkName).append(" in ( ");
+
+            for (int i = 0; i < idList.size(); ++i) {
+                wholeSql.append(String.format("#{idList[%d]}", i));
+                wholeSql.append(",");
+            }
+
+            wholeSql.setCharAt(wholeSql.length() - 1, ')');
+            String sqlStr = wholeSql.toString();
+            LOGGER.info("批量更新的sql语句为: {} \r\n 更改的数据为: {} \r\n idList: {}", sqlStr, models, idList);
+            return sqlStr;
+        }
+    }
+}

+ 1 - 1
boman-web-core/src/main/java/com/boman/web/core/mapper/StandardMapper.java

@@ -83,7 +83,7 @@ public interface StandardMapper {
 
 
     /* ***************************************************** select ******************************************************/
-    @Select("select max(${pkName} from ${tableName}")
+    @Select("select max(${pkName}) from ${tableName}")
     int selectMaxId(@Param("tableName") String tableName, @Param("pkName") String pkName);
 
     /**

+ 3 - 0
boman-web-core/src/main/java/com/boman/web/core/service/TableServiceCmdService.java

@@ -553,6 +553,9 @@ public class TableServiceCmdService {
         GenTable genTable = getTableFromRedisByTableName(RedisKey.TABLE_INFO, dto.getTable());
 
         JSONObject jsonObject = selectService.selectById(dto.getTable(), IdUtils.getPkName(genTable.getColumns()), dto.getObjId(), dto.getOther());
+        if(jsonObject == null) {
+            return AjaxResult.error("没有表单数据", jsonObject);
+        }
         List<GenTableColumn> columns = genTable.getColumns();
         JSONArray addcolums = new JSONArray();
         this.addOtherColumn(columns, dto.getOther());

+ 105 - 0
boman-wechat/pom.xml

@@ -0,0 +1,105 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>boman</artifactId>
+        <groupId>com.boman</groupId>
+        <version>2.5.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>boman-wechat</artifactId>
+
+    <properties>
+
+    </properties>
+
+    <dependencies>
+        <!-- SpringCloud Ailibaba Nacos -->
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
+        </dependency>
+
+        <!-- SpringCloud Ailibaba Nacos Config -->
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
+        </dependency>
+
+        <!-- SpringCloud Ailibaba Sentinel -->
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
+        </dependency>
+
+        <!-- SpringBoot Actuator -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-actuator</artifactId>
+        </dependency>
+
+        <!-- Swagger UI -->
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger-ui</artifactId>
+            <version>${swagger.fox.version}</version>
+        </dependency>
+
+        <!-- Mysql Connector -->
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+        </dependency>
+
+        <!-- RuoYi Common DataSource -->
+        <dependency>
+            <groupId>com.boman</groupId>
+            <artifactId>boman-common-datasource</artifactId>
+        </dependency>
+
+        <!--         RuoYi Common DataScope-->
+        <dependency>
+            <groupId>com.boman</groupId>
+            <artifactId>boman-common-datascope</artifactId>
+        </dependency>
+
+        <!--         RuoYi Common Log-->
+        <dependency>
+            <groupId>com.boman</groupId>
+            <artifactId>boman-common-log</artifactId>
+        </dependency>
+
+        <!--         RuoYi Common Swagger-->
+        <dependency>
+            <groupId>com.boman</groupId>
+            <artifactId>boman-common-swagger</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>commons-beanutils</groupId>
+            <artifactId>commons-beanutils</artifactId>
+            <version>1.9.4</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <version>1.18.4</version>
+        </dependency>
+
+        <!--        远程调用 gen-->
+        <dependency>
+            <groupId>com.boman</groupId>
+            <artifactId>boman-api-gen</artifactId>
+            <version>2.5.0-SNAPSHOT</version>
+        </dependency>
+
+        <!--        远程调用 system-->
+        <dependency>
+            <groupId>com.boman</groupId>
+            <artifactId>boman-api-system</artifactId>
+            <version>2.5.0-SNAPSHOT</version>
+        </dependency>
+    </dependencies>
+</project>

+ 33 - 0
boman-wechat/src/main/java/com/boman/wechat/BomanWechatApplication.java

@@ -0,0 +1,33 @@
+package com.boman.wechat;
+
+import com.boman.common.security.annotation.EnableCustomConfig;
+import com.boman.common.security.annotation.EnableRyFeignClients;
+import com.boman.common.swagger.annotation.EnableCustomSwagger2;
+import org.springframework.boot.SpringApplication;
+import org.springframework.cloud.client.SpringCloudApplication;
+import org.springframework.context.annotation.ComponentScan;
+
+/**
+ * 微信对接模块
+ *
+ * @author zhong.h
+ */
+@EnableCustomConfig
+@EnableCustomSwagger2
+@EnableRyFeignClients
+@SpringCloudApplication
+@ComponentScan(value = "com.boman")
+public class BomanWechatApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(BomanWechatApplication.class, args);
+        System.out.println("--------------------------------------------------------------------------------------------");
+        System.out.println("--------------------------------------------------------------------------------------------");
+        System.out.println("--------------------------------------------------------------------------------------------");
+        System.out.println("--------------------------------- boman wechat 模块启动成功------------------------------------");
+        System.out.println("----------------------------------boman wechat 模块启动成功-----------------------------------");
+        System.out.println("--------------------------------------------------------------------------------------------");
+        System.out.println("--------------------------------------------------------------------------------------------");
+        System.out.println("--------------------------------------------------------------------------------------------");
+    }
+}

+ 53 - 0
boman-wechat/src/main/java/com/boman/wechat/config/WechatProperties.java

@@ -0,0 +1,53 @@
+package com.boman.wechat.config;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+@Component
+public class WechatProperties {
+
+    @Value("${auth.wechat.sessionHost}")
+    private String host;
+
+    @Value("${auth.wechat.appId}")
+    private String appId;
+
+    @Value("${auth.wechat.secret}")
+    private String secret;
+
+    @Value("${auth.wechat.grantType}")
+    private String grantType;
+
+
+    public String getHost() {
+        return host;
+    }
+
+    public void setHost(String host) {
+        this.host = host;
+    }
+
+    public String getAppId() {
+        return appId;
+    }
+
+    public void setAppId(String appId) {
+        this.appId = appId;
+    }
+
+    public String getSecret() {
+        return secret;
+    }
+
+    public void setSecret(String secret) {
+        this.secret = secret;
+    }
+
+    public String getGrantType() {
+        return grantType;
+    }
+
+    public void setGrantType(String grantType) {
+        this.grantType = grantType;
+    }
+}

+ 30 - 0
boman-wechat/src/main/java/com/boman/wechat/controller/WechatInfoController.java

@@ -0,0 +1,30 @@
+package com.boman.wechat.controller;
+
+import com.boman.domain.dto.AjaxResult;
+import com.boman.domain.form.LoginBody;
+import com.boman.wechat.service.WechatService;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 微信登录验证
+ *
+ * @author zhong.h
+ */
+@RequestMapping("/wechat/p/c")
+@RestController
+public class WechatInfoController {
+
+    @Autowired
+    private WechatService wechatService;
+
+    @ApiOperation(value = "小程序相关信息获取")
+    @RequestMapping(value = "/wechatInfo", method = RequestMethod.POST)
+    public AjaxResult getWechatInfo(@RequestBody LoginBody loginBody) {
+        return wechatService.getWechatInfo(loginBody);
+    }
+}

+ 14 - 0
boman-wechat/src/main/java/com/boman/wechat/service/WechatService.java

@@ -0,0 +1,14 @@
+package com.boman.wechat.service;
+
+import com.boman.domain.dto.AjaxResult;
+import com.boman.domain.form.LoginBody;
+
+/**
+ * 获取微信信息接口
+ *
+ * @author zhong.h
+ */
+public interface WechatService {
+
+    AjaxResult getWechatInfo(LoginBody loginBody);
+}

+ 119 - 0
boman-wechat/src/main/java/com/boman/wechat/service/impl/WechatServiceImpl.java

@@ -0,0 +1,119 @@
+package com.boman.wechat.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.boman.common.redis.RedisKey;
+import com.boman.common.redis.service.RedisService;
+import com.boman.domain.dto.AjaxResult;
+import com.boman.domain.form.LoginBody;
+import com.boman.wechat.config.WechatProperties;
+import com.boman.wechat.service.WechatService;
+import com.boman.wechat.utils.HttpClientUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+@Slf4j
+@Service
+public class WechatServiceImpl implements WechatService {
+
+    private static final Logger logger = LoggerFactory.getLogger(WechatServiceImpl.class);
+
+    @Resource
+    private RedisService redisService;
+    @Autowired
+    private WechatProperties properties;
+
+    @Override
+    public AjaxResult getWechatInfo(LoginBody loginBody) {
+        JSONObject infoJsonObject = new JSONObject();
+        String code = loginBody.getCode();
+        // 获取openId && sessionKey
+        String openId = "";
+        // 这里的ErrorCodeEnum是自定义错误字段,可以删除,用自己的方式处理
+        String sessionKey = "";
+
+        // logger报错的话,删掉就好,或者替换为自己的日志对象
+        logger.info("Start get SessionKey,loginRequest的数据为:" + JSONObject.toJSONString(loginBody));
+        JSONObject authInfo = null;
+        try {
+            authInfo = this.getSessionKeyAndOpenId(code);
+        }catch (Exception e) {
+            return AjaxResult.error(-1, "获取信息失败");
+        }
+        // 这里的ErrorCodeEnum是自定义错误字段,可以删除,用自己的方式处理
+        if(authInfo == null) {
+            return AjaxResult.error(-1, "未获取到认证");
+        }
+        String errMsg = this.validatWechatInfo(authInfo);
+        if(StringUtils.isNotEmpty(errMsg)) {
+            return AjaxResult.error(-1, errMsg);
+        }
+        // 获取openId && sessionKey
+        openId = authInfo.getString("openid");
+        // 这里的ErrorCodeEnum是自定义错误字段,可以删除,用自己的方式处理
+        sessionKey = authInfo.getString("session_key");
+        // 根据code保存openId和sessionKey
+        JSONObject sessionObj = new JSONObject();
+        sessionObj.put("openId", openId);
+        sessionObj.put("sessionKey", sessionKey);
+        // sessionkey 保存到redis
+        redisService.setCacheObject(RedisKey.USER_OPPEN_ID_AND_SESSION_KEY_PREFIX, sessionObj.toJSONString(), 10L, TimeUnit.DAYS);
+        infoJsonObject.put("unionid", authInfo.get("unionid"));
+        infoJsonObject.put("openId", openId);
+        infoJsonObject.put("sessionKey", sessionKey);
+        return AjaxResult.successZero(infoJsonObject);
+    }
+
+    private String validatWechatInfo(JSONObject authInfo) {
+        String errMsg = "";
+        int errcode =  (Integer) authInfo.get("errcode");
+        switch (errcode) {
+            case -1:
+                errMsg = "系统繁忙,此时请开发者稍候再试";
+                break;
+            case 40029:
+                errMsg = "code 无效";
+                break;
+            case 41002:
+                errMsg = "appId 丢失";
+                break;
+            case 45011:
+                errMsg = "频率限制,每个用户每分钟100次";
+                break;
+            default:
+                errMsg = "信息接口调用未知错误";
+                break;
+        }
+        return errMsg;
+    }
+
+    /**
+     * 获取小程序验证信息
+     * @param code
+     * @return
+     * @throws Exception
+     */
+    private JSONObject getSessionKeyAndOpenId(String code) throws Exception {
+        Map<String, String> requestUrlParam = new HashMap<>();
+        // 小程序appId,自己补充
+        requestUrlParam.put("appid", properties.getAppId());
+        // 小程序secret,自己补充
+        requestUrlParam.put("secret", properties.getSecret());
+        // 小程序端返回的code
+        requestUrlParam.put("js_code", code);
+        // 默认参数
+        requestUrlParam.put("grant_type", properties.getGrantType());
+        // 发送post请求读取调用微信接口获取openid用户唯一标识
+        String result = HttpClientUtils.doGet(properties.getHost(), requestUrlParam);
+        return JSON.parseObject(result);
+    }
+}

+ 92 - 0
boman-wechat/src/main/java/com/boman/wechat/utils/HttpClientUtils.java

@@ -0,0 +1,92 @@
+package com.boman.wechat.utils;
+
+import org.apache.http.NameValuePair;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.entity.UrlEncodedFormEntity;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.message.BasicNameValuePair;
+import org.apache.http.util.EntityUtils;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+public class HttpClientUtils {
+
+    final static int TIMEOUT = 1000;
+    final static int TIMEOUT_MSEC = 5 * 1000;
+
+    public static String doPost(String url, Map<String, String> paramMap) throws IOException {
+        // 创建Httpclient对象
+        CloseableHttpClient httpClient = HttpClients.createDefault();
+        CloseableHttpResponse response = null;
+        String resultString = "";
+        try {
+            // 创建Http Post请求
+            HttpPost httpPost = new HttpPost(url);
+            // 创建参数列表
+            if (paramMap != null) {
+                List<NameValuePair> paramList = new ArrayList<>();
+                for (Map.Entry<String, String> param : paramMap.entrySet()) {
+                    paramList.add(new BasicNameValuePair(param.getKey(), param.getValue()));
+                }
+                // 模拟表单
+                UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList);
+                httpPost.setEntity(entity);
+            }
+
+            httpPost.setConfig(builderRequestConfig());
+
+            // 执行http请求
+            response = httpClient.execute(httpPost);
+
+            resultString = EntityUtils.toString(response.getEntity(), "UTF-8");
+        } catch (Exception e) {
+            throw e;
+        } finally {
+            try {
+                response.close();
+            } catch (IOException e) {
+                throw e;
+            }
+        }
+
+        return resultString;
+    }
+
+    public static String doGet(String url, Map<String, String> paramMap) throws IOException {
+        url += "?appid=" + paramMap.get("appid") + "&secret=" + paramMap.get("secret") + "&js_code=" + paramMap.get("js_code") + "&grant_type=" + paramMap.get("grant_type");
+        // 创建Httpclient对象
+        CloseableHttpClient httpClient = HttpClients.createDefault();
+        CloseableHttpResponse response = null;
+        String resultString = "";
+        try {
+            // 创建Http Post请求
+            HttpGet httpGet = new HttpGet(url);
+            // 执行http请求
+            response = httpClient.execute(httpGet);
+            resultString = EntityUtils.toString(response.getEntity(), "UTF-8");
+        } catch (Exception e) {
+            throw e;
+        } finally {
+            try {
+                response.close();
+            } catch (IOException e) {
+                throw e;
+            }
+        }
+        return resultString;
+    }
+
+    private static RequestConfig builderRequestConfig() {
+        return RequestConfig.custom()
+                .setConnectTimeout(TIMEOUT_MSEC)
+                .setConnectionRequestTimeout(TIMEOUT_MSEC)
+                .setSocketTimeout(TIMEOUT_MSEC).build();
+    }
+}

+ 4 - 0
boman-wechat/src/main/resources/application.properties

@@ -0,0 +1,4 @@
+auth.wechat.sessionHost=https://api.weixin.qq.com/sns/jscode2session
+auth.wechat.appId=
+auth.wechat.secret=
+auth.wechat.grantType=authorization_code

+ 19 - 0
boman-wechat/src/main/resources/bootstrap-prod.yml

@@ -0,0 +1,19 @@
+server:
+  port: 7000
+
+spring: 
+  application:
+    name: boman-wechat
+  profiles:
+    active: prod
+  cloud:
+    nacos:
+      discovery:
+        server-addr: 118.178.139.79:8848
+        namespace: 5d3b2dc4-f69e-47de-baa1-234d60012c04
+      config:
+        server-addr: 118.178.139.79:8848
+        file-extension: yml
+        shared-configs:
+          - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
+        namespace: 5d3b2dc4-f69e-47de-baa1-234d60012c04

+ 19 - 0
boman-wechat/src/main/resources/bootstrap-test.yml

@@ -0,0 +1,19 @@
+server:
+  port: 7000
+
+spring: 
+  application:
+    name: boman-wechat
+  profiles:
+    active: test
+  cloud:
+    nacos:
+      discovery:
+        server-addr: 192.168.101.10:8848
+        namespace: 9690deba-607a-472c-9444-5a6a3b660db3
+      config:
+        server-addr: 192.168.101.10:8848
+        file-extension: yml
+        shared-configs:
+          - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
+        namespace: 9690deba-607a-472c-9444-5a6a3b660db3

+ 19 - 0
boman-wechat/src/main/resources/bootstrap.yml

@@ -0,0 +1,19 @@
+server:
+  port: 8093
+
+spring: 
+  application:
+    name: boman-wechat
+  profiles:
+    active: jiaoyu
+  cloud:
+    nacos:
+      discovery:
+        server-addr: 192.168.101.10:8848
+        namespace: d8110874-ad03-4826-80bc-ff00126c1644  #潜山教育局
+      config:
+        server-addr: 192.168.101.10:8848
+        file-extension: yml
+        shared-configs:
+          - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
+        namespace: d8110874-ad03-4826-80bc-ff00126c1644  #潜山教育局

+ 74 - 0
boman-wechat/src/main/resources/logback.xml

@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration scan="true" scanPeriod="60 seconds" debug="false">
+    <!-- 日志存放路径 -->
+	<property name="log.path" value="logs/boman-web-core" />
+   <!-- 日志输出格式 -->
+	<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />
+
+    <!-- 控制台输出 -->
+	<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
+		<encoder>
+			<pattern>${log.pattern}</pattern>
+		</encoder>
+	</appender>
+
+    <!-- 系统日志输出 -->
+	<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
+	    <file>${log.path}/info.log</file>
+        <!-- 循环政策:基于时间创建日志文件 -->
+		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 日志文件名格式 -->
+			<fileNamePattern>${log.path}/info.%d{yyyy-MM-dd}.log</fileNamePattern>
+			<!-- 日志最大的历史 60天 -->
+			<maxHistory>60</maxHistory>
+		</rollingPolicy>
+		<encoder>
+			<pattern>${log.pattern}</pattern>
+		</encoder>
+		<filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <!-- 过滤的级别 -->
+            <level>INFO</level>
+            <!-- 匹配时的操作:接收(记录) -->
+            <onMatch>ACCEPT</onMatch>
+            <!-- 不匹配时的操作:拒绝(不记录) -->
+            <onMismatch>DENY</onMismatch>
+        </filter>
+	</appender>
+
+    <appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
+	    <file>${log.path}/error.log</file>
+        <!-- 循环政策:基于时间创建日志文件 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 日志文件名格式 -->
+            <fileNamePattern>${log.path}/error.%d{yyyy-MM-dd}.log</fileNamePattern>
+			<!-- 日志最大的历史 60天 -->
+			<maxHistory>60</maxHistory>
+        </rollingPolicy>
+        <encoder>
+            <pattern>${log.pattern}</pattern>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <!-- 过滤的级别 -->
+            <level>ERROR</level>
+			<!-- 匹配时的操作:接收(记录) -->
+            <onMatch>ACCEPT</onMatch>
+			<!-- 不匹配时的操作:拒绝(不记录) -->
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+    <!-- 系统模块日志级别控制  -->
+	<logger name="com.boman" level="debug" />
+	<!-- Spring日志级别控制  -->
+	<logger name="org.springframework" level="warn" />
+
+	<root level="debug">
+		<appender-ref ref="console" />
+	</root>
+	
+	<!--系统操作日志-->
+    <root level="info">
+        <appender-ref ref="file_info" />
+        <appender-ref ref="file_error" />
+    </root>
+</configuration>

+ 4 - 0
boman-wechat/src/main/resources/rebel-remote.xml

@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<rebel-remote xmlns="http://www.zeroturnaround.com/rebel/remote">
+    <id>com.boman.boman-wechat</id>
+</rebel-remote>

+ 16 - 0
boman-wechat/src/main/resources/rebel.xml

@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+  This is the JRebel configuration file. It maps the running application to your IDE workspace, enabling JRebel reloading for this project.
+  Refer to https://manuals.jrebel.com/jrebel/standalone/config.html for more information.
+-->
+<application generated-by="intellij" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.zeroturnaround.com" xsi:schemaLocation="http://www.zeroturnaround.com http://update.zeroturnaround.com/jrebel/rebel-2_3.xsd">
+
+	<id>boman-wechat</id>
+
+	<classpath>
+		<dir name="E:/jiaoyuju/boman-wechat/target/classes">
+		</dir>
+	</classpath>
+
+</application>

+ 1 - 0
pom.xml

@@ -231,6 +231,7 @@
 		<module>boman-api</module>
 		<module>boman-common</module>
 		<module>boman-web-core</module>
+        <module>boman-wechat</module>
     </modules>
     <packaging>pom</packaging>
 

+ 1 - 0
ruoyi-ui/package.json

@@ -58,6 +58,7 @@
     "vue": "2.6.12",
     "vue-count-to": "1.0.13",
     "vue-cropper": "0.5.5",
+    "vue-pdf": "^4.3.0",
     "vue-router": "3.4.9",
     "vuedraggable": "2.24.3",
     "vuex": "3.6.0"

BIN
ruoyi-ui/public/ceshi.pdf


+ 91 - 0
ruoyi-ui/src/api/system/election.js

@@ -0,0 +1,91 @@
+import request from '@/utils/request'
+
+// 查询角色列表
+export function group(query) {
+  return request({
+    url: '/system/group/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询部门详细
+export function getRole(id) {
+  return request({
+    url: '/system/dept/user/' + id,
+    method: 'get'
+  })
+}
+
+// 查询组详细
+export function getMembers(id) {
+  return request({
+    url: '/system/group/user/' + id,
+    method: 'get'
+  })
+}
+
+// 查询角色详细
+export function getPersonnel(id) {
+  return request({
+    url: '/system/role/user/' + id,
+    method: 'get'
+  })
+}
+
+// 保存
+export function setMenu(data) {
+  return request({
+    url: '/boman-system/role/menu',
+    method: 'post',
+    data: data
+  })
+}
+
+// 新增角色
+export function addRole(data) {
+  return request({
+    url: '/system/role',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改角色
+export function updateRole(data) {
+  return request({
+    url: '/system/role',
+    method: 'put',
+    data: data
+  })
+}
+
+// 角色数据权限
+export function dataScope(data) {
+  return request({
+    url: '/system/role/dataScope',
+    method: 'put',
+    data: data
+  })
+}
+
+// 角色状态修改
+export function changeRoleStatus(id, status) {
+  const data = {
+    id,
+    status
+  }
+  return request({
+    url: '/system/role/changeStatus',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除角色
+export function delRoleses(id,ids) {
+  return request({
+    url: '/system/group/addGroupUser/' + id + '/' + ids,
+    method: 'get'
+  })
+}

+ 68 - 0
ruoyi-ui/src/api/system/group.js

@@ -0,0 +1,68 @@
+import request from '@/utils/request'
+
+// 查询部门列表
+export function listDept(query) {
+  return request({
+    url: '/system/group/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询部门列表(排除节点)
+export function listDeptExcludeChild(id) {
+  return request({
+    url: '/system/dept/list/exclude/' + id,
+    method: 'get'
+  })
+}
+
+// 查询部门详细
+export function getDept(id) {
+  return request({
+    url: '/system/group/' + id,
+    method: 'get'
+  })
+}
+
+// 查询部门下拉树结构
+export function treeselect() {
+  return request({
+    url: '/system/dept/treeselect',
+    method: 'get'
+  })
+}
+
+// 根据角色ID查询部门树结构
+export function roleDeptTreeselect(roleId) {
+  return request({
+    url: '/system/dept/roleDeptTreeselect/' + roleId,
+    method: 'get'
+  })
+}
+
+// 新增用户组
+export function addDept(data) {
+  return request({
+    url: '/system/group',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改部门
+export function updateDept(data) {
+  return request({
+    url: '/system/group/edit',
+    method: 'post',
+    data: data
+  })
+}
+
+// 删除部门
+export function delDept(id) {
+  return request({
+    url: '/system/group/delete/' + id,
+    method: 'get'
+  })
+}

+ 136 - 0
ruoyi-ui/src/api/system/isses.js

@@ -0,0 +1,136 @@
+import request from '@/utils/request'
+
+// 查询角色列表
+export function listRoles(data) {
+  return request({
+    url: '/boman-web-core/p/cs/one/map',
+    method: 'POST',
+    data
+  })
+}
+// 历史字号
+export function listIndex(data) {
+   return request({
+     url: '/boman-web-core/p/cs/queryList',
+     method: 'post',
+     data: data
+   })
+ }
+ // 根据人员查询角色,部门
+ export function buent(data) {
+    return request({
+      url: '/system/user/getDeptNameAndRoleName',
+      method: 'post',
+      data: data
+    })
+  }
+
+ // 保存
+ export function addbjectSave(data) {
+   return request({
+     url: '/boman-web-core/p/cs/complex/save ',
+     method: 'POST',
+     data
+   })
+ }
+
+ // 保存
+ export function addbjectSavety(data) {
+   return request({
+     url: '/boman-web-core/p/cs/objectSave',
+     method: 'POST',
+     data
+   })
+ }
+
+
+
+
+// 查询分发单位  名称
+export function issdanelist(id) {
+  return request({
+    url: '/boman-web-core/messageReceive/' + id,
+    method: 'get'
+  })
+}
+
+// 查询表单id
+export function issdaneid(id) {
+  return request({
+    url: '/boman-web-core/p/cs/table/getByTableName/' + id,
+    method: 'get'
+  })
+}
+
+// 查询角色详细
+export function getRole(id) {
+  return request({
+    url: '/system/role/' + id,
+    method: 'get'
+  })
+}
+
+// 保存
+export function setMenu(data) {
+  return request({
+    url: '/boman-system/role/menu',
+    method: 'post',
+    data: data
+  })
+}
+
+// 新增角色
+export function addRole(data) {
+  return request({
+    url: '/system/role',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改角色
+export function updateRole(data) {
+  return request({
+    url: '/system/role',
+    method: 'put',
+    data: data
+  })
+}
+
+// 角色数据权限
+export function dataScope(data) {
+  return request({
+    url: '/system/role/dataScope',
+    method: 'put',
+    data: data
+  })
+}
+
+// 角色状态修改
+export function changeRoleStatus(id, status) {
+  const data = {
+    id,
+    status
+  }
+  return request({
+    url: '/system/role/changeStatus',
+    method: 'put',
+    data: data
+  })
+}
+
+// 查询部门下拉树结构
+export function treeselectid() {
+  return request({
+    url: '/boman-system/user/listUserTree',
+    method: 'get'
+  })
+}
+
+// 删除角色
+export function delRole(id) {
+  return request({
+    url: '/system/role/' + id,
+    method: 'delete'
+  })
+}

BIN
ruoyi-ui/src/assets/images/dele.png


+ 60 - 2
ruoyi-ui/src/components/DynamicFormsteo/index.vue

@@ -60,7 +60,35 @@
     <!-- 富文本 -->
     <editor :disabled="formConfig.disabshow" v-model="config[formConfig.columnName]" v-if="formConfig.htmlType == 'editor'"
       :min-height="192" />
+      <!-- 树形 -->
+      <el-upload :disabled="true" class="upload-demo" :headers="{Authorization: 'Bearer ' + getToken()}"
+        v-if="formConfig.htmlType == 'imageUpload'" :action="process + '/boman-file/upload'" :on-change="handleChange"
+        :on-success="upImageFn" :on-error="err" :on-remove="reseImage" >
+        <el-button size="small" type="primary" @click="tree">点击选择人员</el-button>
+        <!-- <div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div> -->
+      </el-upload>
+      <div v-if="formConfig.htmlType == 'imageUpload'">
+        <!-- 输入框 -->
+        <el-input v-if="formConfig.htmlType == 'imageUpload'" @change="iChange" v-model="config[formConfig.columnName]" :placeholder="'请输入'+formConfig.columnComment"
+          clearable @keyup.enter.native="handleQuery"  >
+          <el-button slot="append" @click="changekan">查看</el-button>
+          </el-input>
+       <!-- <el-button size="small" type="primary" @click="tree">查看历史</el-button> -->
+      </div>
   </el-form-item>
+  <el-dialog   :close-on-click-modal="false" title="选择人员" :visible.sync="shouew" width="980px" append-to-body>
+    <el-table v-loading="loading" :data="list" @selection-change="handleSelectionChange">
+      <el-table-column label="日志编号" align="center" prop="id" />
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParamsde.pageNum"
+      :limit.sync="queryParamsde.pageSize"
+      @pagination="getList"
+    />
+    </el-dialog>
   </el-col>
   <!-- </el-row> -->
 </template>
@@ -85,6 +113,7 @@
         disabled: false,
         loading: false,
         filterList: [],
+        total:1,
         config: {},
         aliemg: {
           table: '',
@@ -94,8 +123,15 @@
           fixedData: {
             condition: {}
           },
-          ieug:8
+          ieug:8,
+
         },
+        shouew:false,
+        list:[],
+        queryParamsde:{
+          pageNum:1,
+          pageSize:10
+        }
       }
     },
     components: {
@@ -114,13 +150,17 @@
         type: Object,
         required: true,
         'default': {
-          sysDictData: []
+        sysDictData: [],
         }
       },
       type: {
         type: Number,
         default: 1
       },
+      modalShow:{
+        type:Boolean,
+        default: false
+      }
     },
     created() {
       this.config = {}
@@ -191,6 +231,7 @@
    },
     mounted() {
       console.log(this.formConfig)
+      // console.log(this.modalShow)
     },
     methods: {
       iChange(val){
@@ -250,6 +291,7 @@
         }
       },
       handleChange(file, fileList) {
+        console.log(fileList.slice(-3))
         this.fileList = fileList.slice(-3);
       },
       getToken() {
@@ -294,6 +336,22 @@
       },
       handleCheckedCitiesChange(value) {
         console.log(this.config)
+      },
+      tree(){
+        // this.modalShow = true
+        // this.shouew = true
+        this.$emit('closepop')
+        console.log(this.modalShow)
+      },
+      changekan(){
+        console.log(1234)
+         this.shouew = true
+      },
+      handleSelectionChange(){
+
+      },
+      getList(){
+
       }
     }
   }

+ 4 - 4
ruoyi-ui/src/router/index.js

@@ -74,15 +74,15 @@ export const constantRoutes = [
         path: 'index/approval',
         hidden: false,
         component: approval,
-        name: '待我审批',
-        meta: { title: '待我审批', icon: 'dashboard', noCache: false},
+        name: '待审核',
+        meta: { title: '待审核', icon: 'dashboard', noCache: false},
       },
       {
         path: 'index/handled',
         hidden: false,
         component: handled,
-        name: '已办理',
-        meta: { title: '已办理', icon: 'dashboard', noCache: false},
+        name: '经我审核',
+        meta: { title: '经我审核', icon: 'dashboard', noCache: false},
       },
       // {
       //   path: 'index/process',

+ 2 - 4
ruoyi-ui/src/views/index.vue

@@ -193,13 +193,12 @@
            </div>
          </el-col >
          <!-- 通讯录 -->
-         <el-col :sm="24" :lg="24">
+         <!-- <el-col :sm="24" :lg="24">
            <div class="index_nav index_memoranduMail">
                        <div class="index_navTime ">
                          <p class="index_navTimep">
                            <span>通讯录</span>
                            <img src="../assets/images/icon_more.png" alt="" class="index_navTimeimgtwo">
-                           <!-- <span><i class="el-icon-date"></i>创建日程</span> -->
                          </p>
                         <div class="index_memoranduMailnav">
                            <div class="tab_tol">
@@ -216,7 +215,6 @@
                              </el-table>
                            </div>
                           <div class="index_haderPagin index_haderPaginfoiu">
-                            <!-- getLisail -->
                             <el-pagination
                                  @size-change="handleSizeChangeali"
                                  @current-change="handleCurrentChangeali"
@@ -231,7 +229,7 @@
                       <img src="../assets/images/pic_kpbg.png" alt="" class="index_navTimeimg">
                        </div>
             </div>
-         </el-col>
+         </el-col> -->
 
 
       </el-col>

+ 1017 - 0
ruoyi-ui/src/views/system/collection/index.vue

@@ -0,0 +1,1017 @@
+<template>
+  <div class="app-container">
+    <div class="jeuhg">
+      <h3 style="text-align: center; font-size: 30px; color: red; margin-bottom: 20px;">{{user.userName}}发文收文办理签</h3>
+      <el-form :model="colleobje" ref="colleobje" v-show="showSearch" :inline="true">
+      <el-row :gutter="10" class="mb8">
+        <el-col :span="6" class="eigj" style="border: 1px solid red; border-bottom: 0; padding: 15px 0 15px 10px;" >
+        <el-form-item label="收文编号" prop="id">
+          <el-input
+            autosize
+
+            v-model="colleobje.id">
+          </el-input>
+        </el-form-item>
+        </el-col>
+        <el-col :span="6" class="eigj" style="border: 1px solid red; border-bottom: 0; border-left: 0; padding: 15px 0 15px 10px;">
+        <el-form-item label="来文机关" prop="message_from">
+          <el-input
+            autosize
+            placeholder=""
+            v-model="colleobje.message_from">
+          </el-input>
+        </el-form-item>
+        </el-col>
+        <el-col :span="6" class="eigj" style="border: 1px solid red; border-bottom: 0; border-left: 0; padding: 15px 0 15px 10px;">
+        <el-form-item label="文件字号" prop="message_code">
+          <el-input
+            autosize
+            placeholder=""
+            v-model="colleobje.message_code">
+          </el-input>
+        </el-form-item>
+        </el-col>
+        <el-col :span="6" class="eigj" style="border: 1px solid red; border-bottom: 0; border-left: 0; padding: 15px 0 15px 10px;">
+        <el-form-item label="收到日期" prop="roleName">
+          <el-date-picker :disabled="false" @change="iChange" v-model="queryParams.roleName"   style="width: 100%"        type="date" :placeholder="'请输入'">
+          </el-date-picker>
+        </el-form-item>
+        </el-col>
+        <el-col :span="24" style="border: 1px solid red; border-bottom: 0; padding: 15px 0 15px 10px;">
+        <el-form-item class="renhdy" label="文件标题" prop="message_title">
+          <el-input
+            type="textarea"
+            autosize
+            placeholder=""
+            v-model="colleobje.message_title">
+          </el-input>
+        </el-form-item>
+        </el-col>
+        <el-col :span="24" style="border: 1px solid red; border-bottom: 0; padding: 15px 0 15px 10px;">
+        <el-form-item class="renhdy" label="正文上传:" prop="roleName">
+          <el-upload :disabled="false" class="upload-demo" :headers="{Authorization: 'Bearer ' + getToken()}"
+             :action="process + '/boman-file/upload'" :on-change="handleChangert"
+            :on-success="upImageFn" :on-error="err" :on-remove="reseImage" :file-list="config">
+            <el-button size="small" type="primary">点击上传</el-button>
+          </el-upload>
+        </el-form-item>
+        </el-col>
+        <el-col :span="24" style="border: 1px solid red; border-bottom: 0; padding: 15px 0 15px 10px;">
+        <el-form-item class="renhdy" style="width: 100%;" label="审核人" prop="roleName">
+          <el-input :disabled="true" v-model="colleobje.check_user_name">
+              <el-button slot="prepend" @click="changeren">选择人员</el-button>
+            </el-input>
+            <!-- <p style="display: flex; justify-content: space-between;">
+              <span style="width: 80%;">23</span>
+              <el-button size="small" type="primary">点击上传</el-button>
+            </p> -->
+        </el-form-item>
+        </el-col>
+        <el-col :span="24" style="border: 1px solid red; border-bottom: 0; padding: 15px 0 15px 10px;">
+        <el-form-item class="renhdy" label="部门拟办意见" prop="dept_suggest">
+          <el-input
+            type="textarea"
+            autosize
+            :disabled="true"
+            v-model="colleobje.dept_suggest">
+          </el-input>
+        </el-form-item>
+        </el-col>
+        <el-col :span="24" style="border: 1px solid red; border-bottom: 0; padding: 15px 0 15px 10px;">
+        <el-form-item class="renhdy" label="办公室协办意见" prop="office_suggest">
+          <el-input
+            type="textarea"
+            autosize
+            :disabled="true"
+            v-model="colleobje.office_suggest">
+          </el-input>
+        </el-form-item>
+        </el-col>
+        <el-col :span="24" style="border: 1px solid red; border-bottom: 0; padding: 15px 0 15px 10px;">
+        <el-form-item class="renhdy" label="领导批示" prop="leader_suggest">
+          <el-input
+            type="textarea"
+            autosize
+            :disabled="true"
+            v-model="colleobje.leader_suggest">
+          </el-input>
+        </el-form-item>
+        </el-col>
+        <el-col :span="24" style="border: 1px solid red;  padding: 15px 0 15px 10px;">
+        <el-form-item class="renhdy" label="承办结果" prop="result">
+          <el-input
+            type="textarea"
+            autosize
+            :disabled="true"
+            v-model="colleobje.result">
+          </el-input>
+        </el-form-item>
+        </el-col>
+
+        <!-- <el-col :span="24" style="border: 1px solid red;  padding: 20px 0 20px 10px;">
+        <el-form-item class="renhdy" label="备注:" prop="roleName">
+          <el-input
+            type="textarea"
+            autosize
+            placeholder="请输入内容"
+            v-model="textarea1">
+          </el-input>
+        </el-form-item>
+        </el-col> -->
+        <el-col :span="24" style="text-align: right; padding-top: 20px;">
+          <el-button type="danger" @click="submitForm" >点击保存</el-button>
+        </el-col>
+        </el-row>
+      </el-form>
+    </div>
+
+    <!-- 添加或修改角色配置对话框 -->
+   <el-dialog   :close-on-click-modal="false" title="选择人员" :visible.sync="shouew" width="980px" append-to-body>
+     <el-table v-loading="loading" :data="list" @selection-change="handleSelectionChange">
+       <el-table-column label="日志编号" align="center" prop="id" />
+     </el-table>
+
+     <pagination
+       v-show="total>0"
+       :total="total"
+       :page.sync="queryParams.pageNum"
+       :limit.sync="queryParams.pageSize"
+       @pagination="getList"
+     />
+     </el-dialog>
+    <!-- 分配角色数据权限对话框 -->
+    <el-dialog   :close-on-click-modal="false" title="选择人员" :visible.sync="modalShow" width="980px" append-to-body>
+      <!-- <Flowshoe  :instanceId="instanceId"></Flowshoe> -->
+      <div class="tab_bott">
+        <div style="display: flex; flex-direction: column;">
+          <div class="head-container">
+            <el-input
+              v-model="deptName"
+              placeholder="请输入人员名称"
+              clearable
+              size="small"
+              prefix-icon="el-icon-search"
+              style="margin-bottom: 20px"
+            />
+          </div>
+          <div class="head-container">
+            <el-tree
+              :data="deptOptions"
+              :props="defaultProps"
+              :expand-on-click-node="false"
+              :filter-node-method="filterNode"
+              ref="tree"
+              @node-click="handleNodeClick"
+            />
+          </div>
+        </div>
+        <!-- <div class="tabBot_oje">
+          <el-tabs type="border-card" v-model="activeName" @tab-click="handleClick">
+            <el-tab-pane label="按部门" name="first">
+              <el-tree :data="data" :props="defaultProps" show-checkbox   default-expand-all node-key="id" :setCheckedKeys='setCheckedKeys'  @check = "check"   ref="tree"  highlight-current @node-click="handleNodeClick" ></el-tree>
+            </el-tab-pane>
+            <el-tab-pane label="按角色" name="second">配置管理</el-tab-pane>
+            <el-tab-pane label="按组" name="third">角色管理</el-tab-pane>
+          </el-tabs>
+        </div>
+        <div class="tabBot_two">
+          <el-card class="box-card" shadow="always">
+            <div slot="header" class="clearfix">
+              <span>人员对应的单位</span>
+              <el-button style="float: right; padding: 3px 0" type="text">操作按钮</el-button>
+            </div>
+            <ul class="infinite-list infinite-listty" v-infinite-scroll="load" style="overflow:auto">
+              <li v-for="i in count" class="infinite-list-item">{{ i }}</li>
+            </ul>
+          </el-card>
+          <el-card class="box-card box-cardtt" shadow="always">
+              <div slot="header" class="clearfix">
+                <span>已选择</span>
+               <el-button style="float: right; padding: 3px 0" type="text">确定</el-button>
+               <el-button style="float: right; padding: 3px 0" type="text">取消</el-button>
+              </div>
+              <ul class="infinite-list infinite-listty" v-infinite-scroll="load" style="overflow:auto">
+                <li v-for="item in liseh" class="infinite-list-item"> <el-checkbox
+            style="margin-left: 30px"
+            :indeterminate="item.isIndeterminate"
+            v-model="item.isCheck"
+            @change="checkTitle(item.isCheck, index)"
+            >全选</el-checkbox
+          >
+
+          <el-checkbox-group
+            v-model="item.checkedData"
+            @change="checkItem(item.checkedData, index)"
+          >
+            <el-checkbox
+              v-for="(a, index) in item.children"
+              :label="a.value"
+              :key="index"
+              >{{ a.label }}</el-checkbox
+            >
+          </el-checkbox-group></li>
+              </ul>
+            </el-card>
+        </div> -->
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listRoles,listIndex,   delRole, addRole,addbjectSave,addbjectSavety, updateRole, exportRole, dataScope, changeRoleStatus, buent,treeselectid } from "@/api/system/isses";
+import {
+    getToken
+  } from "@/utils/auth";
+  import {getUserProfile} from "@/api/system/config";
+  import { group , getRole, getPersonnel, getMembers,delRoleses } from '@/api/system/election';
+  import { listDept } from "@/api/system/dept";
+  import { listRole } from "@/api/system/role";
+  import { treeselect } from "@/api/system/dept";
+  import Treeselect from "@riophae/vue-treeselect";
+  import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+export default {
+  name: "Role",
+   components: {  Treeselect },
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 无限滚动
+      count: 0,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 部门名称
+      deptName: undefined,
+      // 角色表格数据
+      roleList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 是否显示弹出层(数据权限)
+      openDataScope: false,
+      menuExpand: false,
+      menuNodeAll: false,
+      deptExpand: true,
+      deptNodeAll: false,
+      // 日期范围
+      dateRange: [],
+      // 状态数据字典
+      statusOptions: [],
+      // 数据范围选项
+      dataScopeOptions: [
+        {
+          value: "1",
+          label: "全部数据权限"
+        },
+        {
+          value: "2",
+          label: "自定数据权限"
+        },
+        {
+          value: "3",
+          label: "本部门数据权限"
+        },
+        {
+          value: "4",
+          label: "本部门及以下数据权限"
+        },
+        {
+          value: "5",
+          label: "仅本人数据权限"
+        }
+      ],
+      // 菜单列表
+      menuOptions: [],
+      // 部门列表
+      deptOptions: [],
+      // 角色
+      deptOptionstwo:[],
+      deptOptionsthre:[],
+      // 查询参数
+      queryParams: {
+      },
+      // 表单参数
+      form: {},
+      // 单位  名称
+      mpany:{
+        ompany:[],
+        name:[]
+        },
+      defaultProps: {
+        children: "users",
+        label: "deptName",
+        value:"id"
+      },
+      //
+      // 表单校验
+      rules: {
+        roleName: [
+          { required: true, message: "角色名称不能为空", trigger: "blur" }
+        ],
+        roleKey: [
+          { required: true, message: "权限字符不能为空", trigger: "blur" }
+        ],
+        roleSort: [
+          { required: true, message: "角色顺序不能为空", trigger: "blur" }
+        ]
+      },
+      dialogImageUrl: '',
+      process: process.env.VUE_APP_BASE_API,
+      dialogVisible: false,
+      disabled: false,
+      filterList: [],
+      config: [],
+      configtwo: [],
+      shouew:false,
+      modalShow:false,
+      forew:{
+       table:'',
+       fixedData:{
+         id:-1
+       }
+      },
+      list:[],
+      activeName:'first',
+      querjtgoe:{
+        message_code:'',
+        message_title:'',
+        message_remark:'',
+        send_time:''
+      },
+      liseh: [
+            ],
+      queryParamsser:{
+       table:'',
+       orderBy:'create_time desc',
+       pageSize:10,
+       pageNo:1,
+       showData:['message_code']
+      },
+      tabData:[],
+      postList:[],
+      faerform:{
+        table: '',
+        objId: -1,
+        fixedData: {}
+      },
+      lisehtwo:[
+      ],
+      data: [],
+      deptList: [],
+      rtuer: false,
+      showtabc: 0,
+      showche: false,
+      idneese: {},
+      quandet:false,
+      dhiuw:[],
+      // 组id
+      elezu:0,
+      fileList: [],
+      titlet:'',
+      user:{},
+      colleobje:{}
+
+    };
+  },
+  created() {
+    this.forew.table = this.$route.query.tables;
+    this.queryParamsser.table = this.$route.query.tables;
+    this.forew.fixedData.id = this.$route.query.id;
+    this.faerform.objId = this.$route.query.id;
+    this.faerform.table = this.$route.query.tables;
+    if(this.$route.query.tabname == 'shouwen'){
+      this.titlet = '收文'
+    }else if(this.$route.query.tabname == 'fawen'){
+      this.titlet = '待归档'
+    }
+    this.getList();
+    this.getTreeselect()
+    this.getUser()
+    this.getDicts("sys_normal_disable").then(response => {
+      this.statusOptions = response.data;
+    });
+  },
+  watch: {
+    // 根据名称筛选部门树
+    deptName(val) {
+      this.$refs.tree.filter(val);
+    }
+  },
+  methods: {
+    /** 查询角色列表 */
+    getList() {
+      this.loading = true;
+      console.log(this.forew)
+      listRoles(this.forew).then(
+        res => {
+          console.log(res)
+          if(res.data !== undefined){
+            this.querjtgoe = res.data
+            if(res.data.message_upload !== undefined){
+              this.config = res.data.message_upload
+            }
+          }
+        }
+      );
+    },
+    // 历史字号数据查询
+    lishiList(){
+      console.log(346)
+      listIndex(this.queryParamsser).then(response => {
+        this.total = response.data.total;
+        this.tabData = response.data.tableHeadList;
+        this.postList = response.data.rows;
+        for(var i = 0 ; i < this.postList.length; i++){
+          console.log(this.postList[i].leavefrom_photo == '[]')
+        }
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 取消按钮(数据权限)
+    cancelDataScope() {
+      this.openDataScope = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      if (this.$refs.menu != undefined) {
+        this.$refs.menu.setCheckedKeys([]);
+      }
+      this.menuExpand = false,
+      this.menuNodeAll = false,
+      this.deptExpand = true,
+      this.deptNodeAll = false,
+      this.form = {
+        roleId: undefined,
+        roleName: undefined,
+        roleKey: undefined,
+        roleSort: 0,
+        status: "0",
+        menuIds: [],
+        deptIds: [],
+        menuCheckStrictly: true,
+        deptCheckStrictly: true,
+        remark: undefined
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.dateRange = [];
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!=1
+      this.multiple = !selection.length
+    },
+    // 树权限(展开/折叠)
+    handleCheckedTreeExpand(value, type) {
+      // if (type == 'menu') {
+      //   let treeList = this.menuOptions;
+      //   for (let i = 0; i < treeList.length; i++) {
+      //     this.$refs.menu.store.nodesMap[treeList[i].id].expanded = value;
+      //   }
+      // } else if (type == 'dept') {
+        let treeList = this.deptOptions;
+        for (let i = 0; i < treeList.length; i++) {
+          this.$refs.dept.store.nodesMap[treeList[i].id].expanded = value;
+        }
+      // }
+    },
+    /** 提交按钮 */
+    submitForm: function() {
+
+      this.colleobje.message_upload = JSON.stringify(this.querjtgoe.message_upload)
+      // this.colleobje.message_enclosure = JSON.stringify(this.querjtgoe.message_enclosure)
+      this.faerform.fixedData = this.colleobje
+      console.log(this.faerform)
+      // this.$refs["form"].validate(valid => {
+      //   if (valid) {
+      //     if (this.form.roleId != undefined) {
+      //       this.form.menuIds = this.getMenuAllCheckedKeys();
+      //       updateRole(this.form).then(response => {
+      //         this.msgSuccess("修改成功");
+      //         this.open = false;
+      //         this.getList();
+      //       });
+      //     } else {
+      //       this.form.menuIds = this.getMenuAllCheckedKeys();
+            addbjectSavety(this.faerform).then(response => {
+              this.msgSuccess("操作成功");
+              // this.open = false;
+              // this.getList();
+            });
+      //     }
+      //   }
+      // });
+    },
+    /** 提交按钮(数据权限) */
+    submitDataScope: function() {
+      if (this.form.roleId != undefined) {
+        this.form.deptIds = this.getDeptAllCheckedKeys();
+        dataScope(this.form).then(response => {
+          this.msgSuccess("修改成功");
+          this.openDataScope = false;
+          this.getList();
+        });
+      }
+    },
+    handleClick(index){
+    if(index.index == 0){
+      this.getTreeselect()
+    }else if(index.index == 1){
+      this.getTreeselectjue()
+    }else if(index.index == 2){
+      this.getTreeselecu()
+    }
+    },
+    ziao(){
+      console.log(23)
+      this.shouew = true
+      this.lishiList()
+    },
+    // 人员选择
+    changeren(){
+    this.modalShow = true
+
+    },
+    // 上传文件
+    handleChangert(file, fileList) {
+      this.fileList = fileList.slice(-3);
+    },
+    getToken() {
+      return getToken()
+    },
+    reseImage(file, fileList) {
+      let urls = ""
+      if (file.response) {
+        urls = file.response.url
+      } else {
+        urls = file.url
+      }
+      for (let i = this.config.length - 1; i >= 0; i--) {
+        if (this.config[i].url == urls) {
+          this.config.splice(i, 1);
+        }
+      }
+      this.querjtgoe.message_upload = this.config
+    },
+    reseImagetwo(file, fileList) {
+      let urls = ""
+      if (file.response) {
+        urls = file.response.url
+      } else {
+        urls = file.url
+      }
+      for (let i = this.configtwo.length - 1; i >= 0; i--) {
+        if (this.configtwo[i].url == urls) {
+          this.configtwo.splice(i, 1);
+        }
+      }
+     console.log(this.configtwo)
+     this.querjtgoe.message_enclosure = this.configtwo
+    },
+    handlePictureCardPreview(file) {
+      console.log(file)
+      this.dialogImageUrl = file.url;
+      this.dialogVisible = true;
+    },
+    upImageFn(res, file) {
+      this.config.push(res.data);
+      this.querjtgoe.message_upload = this.config
+      console.log(this.config)
+    },
+    upImageFntwo(res, file) {
+      this.configtwo.push(res.data);
+      this.querjtgoe.message_enclosure  = this.configtwo
+      console.log(this.configtwo)
+    },
+    // 时间控件
+    iChange(){
+
+    },
+    err(){
+      this.msgSuccess("上传失败");
+     console.log(35)
+    },
+    load(){
+
+    },
+    // 点击单元格
+    cellClick(row){
+      console.log(row)
+      this.shouew =  false
+      this.querjtgoe.message_code = row.message_code
+
+    },
+    // 树形结构
+    // 节点单击事件
+   handleNodeClick(data) {
+     console.log(data);
+     this.colleobje.check_user_id = data.id
+     this.colleobje.check_user_name = data.userName
+     // this.queryParams.deptId = data.id;
+     // this.staff(data.id);
+     this.modalShow = false
+     // this.getList();
+   },
+    /** 查询部门下拉树结构 */
+    getTreeselect() {
+      treeselectid().then(response => {
+        this.deptOptions = response.data;
+      });
+    },
+    // 查询角色
+    getTreeselectjue() {
+      this.loading = true;
+      listRole(this.queryParams).then(response => {
+        this.deptOptionstwo = this.handleTree(response.rows, "id");
+        this.loading = false;
+      });
+    },
+    // 查询组
+    getTreeselecu() {
+      this.loading = true;
+      group(this.queryParams).then(response => {
+        this.deptOptionsthre = this.handleTree(response.data, "id");
+        this.loading = false;
+      });
+    },
+    /** 转换角色数据结构 */
+    normalizer(node) {
+      // if (node.children && !node.children.length) {
+      //   delete node.children;
+      // }
+      return {
+        id: node.id,
+        label: node.roleName,
+      };
+    },
+    /** 转换组数据结构 */
+    normalizerty(node) {
+      return {
+        id: node.id,
+        label: node.groupName,
+      };
+    },
+   // 点击组/角色
+     djieskle(node, instanceId) {
+       this.personnel(node.id);
+       console.log(node, instanceId);
+     },
+     djieskletwo(node, instanceId) {
+       this.members(node.id);
+       this.elezu = node.id
+       console.log(node, instanceId);
+     },
+     check(data, value) {
+       console.log(this.$refs.tree.getCheckedKeys());
+       // 获取选中的子节点
+       // let checkedKeys = this.$refs.tree.getCheckedKeys();
+       // 获取选中的父节点
+       let hafCheckedKeys = this.$refs.tree.getHalfCheckedKeys();
+       console.log(this.$refs.tree.getHalfCheckedKeys());
+
+       console.log(data, value);
+     },
+     // 点击全选
+     quande(){
+       var dueg = []
+       dueg = (this.dhiuw)
+      this.quandet = true
+      var that =  this
+      // dueg.push(index)
+      // this.lisehtwo = dueg
+      // this.lisehtwo.push(index);
+      // this.lisehtwo = [...new Set(this.lisehtwo)];
+      // that.positions.map(train => {
+      //   that.new_Positions.push(train.trainId);
+      // });
+      // that.resultArr = []; //去重后的数组
+      var flag;
+      for (var i in dueg) {
+        flag = true;
+        for (var j in that.lisehtwo) {
+          if (that.lisehtwo[j].id == dueg[i].id) {
+            flag = false;
+            break;
+          }
+        }
+        if (flag) {
+          that.lisehtwo.push(dueg[i]);
+        }
+      }
+     },
+     // 点击全部删除
+     eledelte(){
+      this.lisehtwo = []
+     },
+     // 点击删除
+     lidele(index) {
+       for (let i = this.lisehtwo.length - 1; i >= 0; i--) {
+         if (this.lisehtwo[i].id == index.id) {
+           this.lisehtwo.splice(i, 1)
+         }
+       }
+     },
+     // 点击添加
+     reyantt(index) {
+       var dueg = [];
+       this.idneese = index;
+       var that =  this
+       dueg.push(index)
+       // this.lisehtwo = dueg
+       // this.lisehtwo.push(index);
+       // this.lisehtwo = [...new Set(this.lisehtwo)];
+       // that.positions.map(train => {
+       //   that.new_Positions.push(train.trainId);
+       // });
+       // that.resultArr = []; //去重后的数组
+       var flag;
+       for (var i in dueg) {
+         flag = true;
+         for (var j in that.lisehtwo) {
+           if (that.lisehtwo[j].id == dueg[i].id) {
+             flag = false;
+             break;
+           }
+         }
+         if (flag) {
+           that.lisehtwo.push(dueg[i]);
+         }
+       }
+
+       // for(var i = 0 ; i <this.lisehtwo.length; i++ ){
+       //   if(this.lisehtwo[i].id == index.id){
+       //     this.lisehtwo.splice(i,1)
+       //   }
+       // }
+       // })
+     },
+     // 点击确定
+     determine(){
+       var eledete = []
+      this.lisehtwo.filter(route=>{
+        eledete.push(route.id)
+      })
+      eledete  = eledete.join(',')
+      console.log(eledete)
+      // this.elezu
+      this.loading = true;
+      buent(this.lisehtwo).then(response => {
+        // this.lisehtwo = response.data;
+        // this.dhiuw = response.data
+        this.mpany.ompany = response.deptNameList
+        this.mpany.name = response.roleNameList
+        console.log( this.mpany.ompany)
+        if(response.code == 200){
+          this.msgSuccess('操作成功');
+          this.modalShow = false
+        }
+        this.loading = false;
+      });
+     },
+     checkItem(val, index) {
+       console.log(val);
+       this.showche = !this.showche;
+       console.log(this.showche);
+       var that = this;
+       let jueg = [];
+       let checkedCount = val.length;
+       this.liseh[index].isCheck = checkedCount === this.liseh[index].children.length;
+
+       this.liseh[index].isIndeterminate = checkedCount > 0 && checkedCount < this.liseh[index].children.length;
+       this.liseh[index].children.filter(router => {
+         // console.log(123)
+         for (var i = 0; i < val.length; i++) {
+           if (this.showche == true) {
+             //选中
+             console.log('选中');
+             if (router.id == val[i]) {
+               jueg.push(router);
+               this.lisehtwo.push(router);
+               // console.log(router)
+               console.log(this.lisehtwo);
+               for (var j = 0; j < that.lisehtwo.length; j++) {
+                 if (that.lisehtwo[i].id !== val[i]) {
+                   this.lisehtwo.push(router);
+                 }
+               }
+               // that.lisehtwo.filter(routers=>{
+               //   console.log(this.lisehtwo)
+               //   console.log(routers,val[i])
+               //   if(routers.id !== val[i]){
+               //      this.lisehtwo.push(router)
+               //   }
+               // })
+             }
+           } else {
+             // 取消选中
+           }
+         }
+       });
+       // this.lisehtwo.push(jueg)
+       console.log(this.lisehtwo);
+       // console.log(this.liseh[index].isIndeterminate)
+     },
+     checkTitle(val, index) {
+       console.log(val, index);
+       let arr = [];
+       let jueg = [];
+       const re = this.liseh[index].children;
+       //全选
+       if (val) {
+         for (let i = 0; i < re.length; i++) {
+           arr[i] = re[i]['id'];
+           jueg[i] = re[i];
+           this.lisehtwo.push(re[i]);
+         }
+         // this.lisehtwo.push(jueg)
+       } else {
+         this.lisehtwo = [];
+       }
+       console.log(this.lisehtwo);
+       this.liseh[index].checkedData = arr;
+       this.liseh[index].isIndeterminate = false;
+     },
+     // 筛选节点
+     filterNode(value, data) {
+       // return console.log(value)
+       if (!value) return true;
+       return data.deptName.indexOf(value) !== -1;
+     },
+     // 按照部门查询人员
+     staff(index) {
+       this.loading = true;
+       var that = this;
+       getRole(index).then(response => {
+         // this.deptOptionsthre = this.handleTree(response.data, "id");
+         // this.rtuer = true
+         this.liseh = []
+         this.liseh = response.data;
+         this.dhiuw = response.data
+         this.loading = false;
+       });
+     },
+     // 按照角色查询人员
+     personnel(index) {
+       this.loading = true;
+       getPersonnel(index).then(response => {
+         // this.deptOptionsthre = this.handleTree(response.data, "id");        this.liseh = response.data;
+         this.liseh = []
+         this.liseh = response.data;
+         this.dhiuw = response.data
+         this.loading = false;
+       });
+     },
+     // 按照组查询人员
+     members(index) {
+       this.loading = true;
+       getMembers(index).then(response => {
+         // this.deptOptionsthre = this.handleTree(response.data, "id");
+         // this.liseh = response.data;
+         // response.data
+         // this.lisehtwo.push(response.data)
+         this.dhiuw = response.data
+         this.dhiuw.filter(route=>{
+           this.lisehtwo.push(route)
+         })
+         this.loading = false;
+       });
+     },
+     // 用户信息
+           getUser() {
+             getUserProfile().then(response => {
+               this.user = response.data;
+               // this.getLisalendar()
+               // this.getLismemorandum()
+             });
+           },
+   }
+  // }
+  // }
+};
+</script>
+
+
+<style lang="scss">
+  .jeuhg{
+   .el-form-item{
+     margin-bottom: 0;
+     width: 100%;
+   }
+   .el-form-item__content{
+      width: 100%;
+   }
+   .el-form-item__label{
+     color: red;
+    width: 12%;
+    text-align: center;
+   }
+   .eigj{
+     .el-form-item__label{
+       width: 100%;
+       text-align: center;
+     }
+   }
+   input{
+     background: none;
+     	  outline: none;
+     	  border: none;
+   }
+  .el-input-group__prepend{
+    background-color: #1890ff !important;
+    color: #fff !important;
+  }
+  .el-input-group__append{
+    background-color: #1890ff !important;
+    color: #fff !important;
+  }
+  .renhdy{
+    .el-form-item__content{
+      width: 85%;
+    }
+
+  }
+  .upload-demo{
+     text-align: right;
+     display: flex;
+     // ul{
+     //   display: flex;
+     // }
+  }
+  .el-textarea__inner{
+    background-color: #fff !important;
+    border: 0 !important;
+  }
+  .el-input__inner{
+    background-color: #fff !important;
+    border: 0 !important;
+  }
+  .el-input.is-disabled .el-input__inner{
+    color: #333;
+  }
+  }
+</style>
+<style scoped  lang="scss">
+  .app-container{
+    padding: 0 80px !important;
+    padding-top: 20px !important;
+  }
+  .infinite-list {
+    height: 150px;
+    margin-bottom: 20px;
+  }
+  .infinite-listty{
+    display: flex;
+    flex-wrap: wrap;
+    li{
+      // width: 25%;
+      flex: 1;
+      display: flex;
+      height: 40px;
+      line-height: 40px;
+      text-align: center;
+      list-style: none;
+      // border-radius: 40px;
+      // border: 1px solid #eee;
+      // border-bottom: 1px solid #eee;
+    }
+  }
+  .tab_bott {
+    display: flex;
+  }
+  .tabBot_oje {
+    width: 40%;
+  }
+  .tabBot_two {
+    width: 50%;
+    margin-left: 30px;
+  }
+  .box-cardtt{
+    margin-top: 30px;
+  }
+</style>

+ 547 - 0
ruoyi-ui/src/views/system/election/index.vue

@@ -0,0 +1,547 @@
+<template>
+  <div class="iegeu">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="岗位编码" prop="postCode">
+        <el-input v-model="queryParams.postCode" placeholder="请输入岗位编码" clearable size="small" @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item label="岗位名称" prop="postName">
+        <el-input v-model="queryParams.postName" placeholder="请输入岗位名称" clearable size="small" @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item label="状态" prop="status">
+        <!-- <el-select v-model="queryParams.status" placeholder="岗位状态" clearable size="small">
+          <el-option
+            v-for="dict in statusOptions"
+            :key="dict.dictValue"
+            :label="dict.dictLabel"
+            :value="dict.dictValue"
+          />
+        </el-select> -->
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+    <div class="tab_bott">
+      <div class="tabBot_oje">
+        <el-tabs type="border-card" v-model="activeName" @tab-click="handleClick">
+          <!-- :setCheckedKeys='setCheckedKeys' :getCheckedKeys = "getCheckedKeys" -->
+          <el-tab-pane label="按部门" name="first">
+            <div class="head-container">
+              <el-input v-model="deptName" placeholder="请输入部门名称" clearable size="small" prefix-icon="el-icon-search" style="margin-bottom: 20px" />
+            </div>
+            <div class="head-container">
+              <el-tree
+                :data="deptOptions"
+                :props="defaultProps"
+                :expand-on-click-node="false"
+                :filter-node-method="filterNode"
+                ref="tree"
+                default-expand-all
+                @node-click="handleNodeClick"
+              />
+            </div>
+          </el-tab-pane>
+          <el-tab-pane label="按角色" name="second" style="height: 400px;">
+            <treeselect v-model="form.parentId" :options="deptOptionstwo" :normalizer="normalizer" :flat="true" :maxHeight="150" @select="djieskle" placeholder="点击选择角色" />
+          </el-tab-pane>
+          <el-tab-pane label="按组" name="third" style="height: 400px;">
+            <treeselect
+              v-model="form.parentIdty"
+              :options="deptOptionsthre"
+              :normalizer="normalizerty"
+              :flat="true"
+              @select="djieskletwo"
+              :maxHeight="350"
+              placeholder="点击选择组"
+            />
+          </el-tab-pane>
+        </el-tabs>
+      </div>
+      <div class="tabBot_two">
+        <el-card class="box-card box-cardtt" shadow="always">
+          <div slot="header" class="clearfix" >
+            <span>人员</span>
+            <!-- <div> -->
+              <el-button style=" float: right;  padding: 3px 10px;" type="danger" plain @click="eledelte">删除</el-button>
+              <el-button style=" float: right; padding: 3px 10px;margin-right: 20px;" type="primary" plain @click="quande">全选</el-button>
+            <!-- </div> -->
+
+          </div>
+          <ul class="infinite-list infinite-listty" v-infinite-scroll="load" style="overflow:auto">
+            <li
+              v-for="(item, index) in liseh"
+              :class="[ quandet==true? 'infinite-list-itemty infinite-list-itemss' : item.id == idneese.id ? 'infinite-list-itemty infinite-list-itemss' : 'infinite-list-itemty']"
+              :key="index"
+              @click="reyantt(item)"
+            >
+              {{ item.userName }}
+              <!-- <el-checkbox
+          style="margin-right: 30px"
+          :indeterminate="item.isIndeterminate"
+          v-model="item.isCheck"
+          @change="checkTitle(item.isCheck, index)"
+          >全选</el-checkbox
+        >
+
+        <el-checkbox-group
+          v-model="item.checkedData"
+          @change="checkItem(item.checkedData, index)"
+        >
+          <el-checkbox
+            v-for="(items, index) in item.children"
+            :label="items.id"
+            :key="items.id"
+            >{{ items.userName }}</el-checkbox
+          >
+        </el-checkbox-group> -->
+            </li>
+          </ul>
+        </el-card>
+        <el-card class="box-card box-cardtt" shadow="always">
+          <div slot="header" class="clearfix">
+            <span>已选择</span>
+            <el-button style="float: right; padding: 3px 0" type="text" @click = 'determine'>确定</el-button>
+          </div>
+          <ul class="infinite-list infinite-listty" v-infinite-scroll="load" style="overflow:auto">
+            <li v-for="item in lisehtwo" @click="lidele(item)" :key="item.id" class="infinite-list-item">
+              {{ item.userName }}
+              <img src="../../../assets/images/dele.png" alt="" class="index_navTimeimg" />
+            </li>
+          </ul>
+        </el-card>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import Flowshoe from '@/components/flowshoe';
+import { getTableQuery, getQueryList, tableSubimt, tableSubimtanit, addbjectSave, delMenutab, tabsubm, getUserProfiletab, bohuie } from '@/api/system/table.js';
+
+import { group, getRole, getPersonnel, getMembers,delRoleses } from '@/api/system/election';
+import { listDept } from '@/api/system/dept';
+import { listRole } from '@/api/system/role';
+import { treeselect } from '@/api/system/dept';
+import Treeselect from '@riophae/vue-treeselect';
+import '@riophae/vue-treeselect/dist/vue-treeselect.css';
+
+export default {
+  name: 'table',
+  inject: ['reload'],
+  components: { Flowshoe, Treeselect },
+  data() {
+    return {
+      instanceId: 0,
+      modalShow: false,
+      // 部门树选项
+      deptOptions: undefined,
+      // 角色
+      deptOptionstwo: [],
+      deptOptionsthre: [],
+      // 部门名称
+      deptName: undefined,
+      // 无限滚动
+      count: 0,
+      activeName: 'first',
+      liseh: [
+        // {
+        //   isCheck: false,
+        //   isIndeterminate: true,
+        //   checkedData: [],
+        //   children: [
+        //   ],
+        // }
+      ],
+      lisehtwo: [],
+      queryParams: {},
+      showSearch: true,
+      data: [],
+      defaultProps: {
+        children: 'children',
+        label: 'label'
+      },
+      // 表单参数
+      form: {},
+      deptList: [],
+      rtuer: false,
+      showtabc: 0,
+      showche: false,
+      idneese: {},
+      quandet:false,
+      dhiuw:[],
+      // 组id
+      elezu:0
+    };
+  },
+  mounted() {
+    this.getTreeselect();
+    // this.staff(100)
+    // this.getUser();
+    // this.tablsie()
+  },
+  watch: {
+    // 根据名称筛选部门树
+    deptName(val) {
+      this.$refs.tree.filter(val);
+    }
+  },
+  methods: {
+    getList() {},
+    load() {
+      this.count += 2;
+    },
+    // 树形结构
+    // 节点单击事件
+    handleNodeClick(data) {
+      console.log(data);
+      this.queryParams.deptId = data.id;
+      this.staff(data.id);
+      this.quandet = false
+      // this.getList();
+    },
+    /** 查询部门下拉树结构 */
+    getTreeselect() {
+      treeselect().then(response => {
+        this.deptOptions = response.data;
+      });
+    },
+    // 查询角色
+    getTreeselectjue() {
+      this.loading = true;
+      listRole(this.queryParams).then(response => {
+        this.deptOptionstwo = this.handleTree(response.rows, 'id');
+        this.loading = false;
+      });
+    },
+    // 查询组
+    getTreeselecu() {
+      this.loading = true;
+      group(this.queryParams).then(response => {
+        this.deptOptionsthre = this.handleTree(response.data, 'id');
+        this.loading = false;
+      });
+    },
+    /** 转换角色数据结构 */
+    normalizer(node) {
+      // if (node.children && !node.children.length) {
+      //   delete node.children;
+      // }
+      return {
+        id: node.id,
+        label: node.roleName
+      };
+    },
+    /** 转换组数据结构 */
+    normalizerty(node) {
+      return {
+        id: node.id,
+        label: node.groupName
+      };
+    },
+
+    // getCheckedKeys(leafOnly) {
+    //   console.log(leafOnly)
+    //   console.log(this.$refs.tree.getCheckedKeys());
+    // },
+    setCheckedKeys(keys, leafOnly) {
+      console.log(keys, leafOnly);
+      this.$refs.tree.setCheckedKeys([3]);
+    },
+    resetChecked() {
+      this.$refs.tree.setCheckedKeys([]);
+    },
+    handleClick(index) {
+      console.log(index.index);
+      this.showtabc = index.index;
+      this.showche = false;
+      if (index.index == 0) {
+        this.getTreeselect();
+      } else if (index.index == 1) {
+        this.getTreeselectjue();
+      } else if (index.index == 2) {
+        this.getTreeselecu();
+      }
+    },
+    // 搜索
+    handleQuery() {},
+    // 重置
+    resetQuery() {},
+    // 点击组/角色
+    djieskle(node, instanceId) {
+      this.personnel(node.id);
+      console.log(node, instanceId);
+    },
+    djieskletwo(node, instanceId) {
+      this.members(node.id);
+      this.elezu = node.id
+      console.log(node, instanceId);
+    },
+    check(data, value) {
+      console.log(this.$refs.tree.getCheckedKeys());
+      // 获取选中的子节点
+      // let checkedKeys = this.$refs.tree.getCheckedKeys();
+      // 获取选中的父节点
+      let hafCheckedKeys = this.$refs.tree.getHalfCheckedKeys();
+      console.log(this.$refs.tree.getHalfCheckedKeys());
+
+      console.log(data, value);
+    },
+    // 点击全选
+    quande(){
+      var dueg = []
+      dueg = (this.dhiuw)
+     this.quandet = true
+     var that =  this
+     // dueg.push(index)
+     // this.lisehtwo = dueg
+     // this.lisehtwo.push(index);
+     // this.lisehtwo = [...new Set(this.lisehtwo)];
+     // that.positions.map(train => {
+     //   that.new_Positions.push(train.trainId);
+     // });
+     // that.resultArr = []; //去重后的数组
+     var flag;
+     for (var i in dueg) {
+       flag = true;
+       for (var j in that.lisehtwo) {
+         if (that.lisehtwo[j].id == dueg[i].id) {
+           flag = false;
+           break;
+         }
+       }
+       if (flag) {
+         that.lisehtwo.push(dueg[i]);
+       }
+     }
+    },
+    // 点击全部删除
+    eledelte(){
+     this.lisehtwo = []
+    },
+    // 点击删除
+    lidele(index) {
+      for (let i = this.lisehtwo.length - 1; i >= 0; i--) {
+        if (this.lisehtwo[i].id == index.id) {
+          this.lisehtwo.splice(i, 1)
+        }
+      }
+    },
+    // 点击添加
+    reyantt(index) {
+      var dueg = [];
+      this.idneese = index;
+      var that =  this
+      dueg.push(index)
+      // this.lisehtwo = dueg
+      // this.lisehtwo.push(index);
+      // this.lisehtwo = [...new Set(this.lisehtwo)];
+      // that.positions.map(train => {
+      //   that.new_Positions.push(train.trainId);
+      // });
+      // that.resultArr = []; //去重后的数组
+      var flag;
+      for (var i in dueg) {
+        flag = true;
+        for (var j in that.lisehtwo) {
+          if (that.lisehtwo[j].id == dueg[i].id) {
+            flag = false;
+            break;
+          }
+        }
+        if (flag) {
+          that.lisehtwo.push(dueg[i]);
+        }
+      }
+
+      // for(var i = 0 ; i <this.lisehtwo.length; i++ ){
+      //   if(this.lisehtwo[i].id == index.id){
+      //     this.lisehtwo.splice(i,1)
+      //   }
+      // }
+      // })
+    },
+    // 点击确定
+    determine(){
+      var eledete = []
+     this.lisehtwo.filter(route=>{
+       eledete.push(route.id)
+     })
+     eledete  = eledete.join(',')
+     console.log(eledete)
+     // this.elezu
+     this.loading = true;
+     delRoleses(this.elezu,eledete).then(response => {
+       // this.lisehtwo = response.data;
+       // this.dhiuw = response.data
+       if(response.data == 200){
+         this.msgSuccess('操作成功');
+       }
+       this.loading = false;
+     });
+    },
+    checkItem(val, index) {
+      console.log(val);
+      this.showche = !this.showche;
+      console.log(this.showche);
+      var that = this;
+      let jueg = [];
+      let checkedCount = val.length;
+      this.liseh[index].isCheck = checkedCount === this.liseh[index].children.length;
+
+      this.liseh[index].isIndeterminate = checkedCount > 0 && checkedCount < this.liseh[index].children.length;
+      this.liseh[index].children.filter(router => {
+        // console.log(123)
+        for (var i = 0; i < val.length; i++) {
+          if (this.showche == true) {
+            //选中
+            console.log('选中');
+            if (router.id == val[i]) {
+              jueg.push(router);
+              this.lisehtwo.push(router);
+              // console.log(router)
+              console.log(this.lisehtwo);
+              for (var j = 0; j < that.lisehtwo.length; j++) {
+                if (that.lisehtwo[i].id !== val[i]) {
+                  this.lisehtwo.push(router);
+                }
+              }
+              // that.lisehtwo.filter(routers=>{
+              //   console.log(this.lisehtwo)
+              //   console.log(routers,val[i])
+              //   if(routers.id !== val[i]){
+              //      this.lisehtwo.push(router)
+              //   }
+              // })
+            }
+          } else {
+            // 取消选中
+          }
+        }
+      });
+      // this.lisehtwo.push(jueg)
+      console.log(this.lisehtwo);
+      // console.log(this.liseh[index].isIndeterminate)
+    },
+    checkTitle(val, index) {
+      console.log(val, index);
+      let arr = [];
+      let jueg = [];
+      const re = this.liseh[index].children;
+      //全选
+      if (val) {
+        for (let i = 0; i < re.length; i++) {
+          arr[i] = re[i]['id'];
+          jueg[i] = re[i];
+          this.lisehtwo.push(re[i]);
+        }
+        // this.lisehtwo.push(jueg)
+      } else {
+        this.lisehtwo = [];
+      }
+      console.log(this.lisehtwo);
+      this.liseh[index].checkedData = arr;
+      this.liseh[index].isIndeterminate = false;
+    },
+    // 筛选节点
+    filterNode(value, data) {
+      if (!value) return true;
+      return data.label.indexOf(value) !== -1;
+    },
+    // 按照部门查询人员
+    staff(index) {
+      this.loading = true;
+      var that = this;
+      getRole(index).then(response => {
+        // this.deptOptionsthre = this.handleTree(response.data, "id");
+        // this.rtuer = true
+        this.liseh = response.data;
+        this.dhiuw = response.data
+        this.loading = false;
+      });
+    },
+    // 按照角色查询人员
+    personnel(index) {
+      this.loading = true;
+      getPersonnel(index).then(response => {
+        // this.deptOptionsthre = this.handleTree(response.data, "id");        this.liseh = response.data;
+        this.liseh = response.data;
+        this.dhiuw = response.data
+        this.loading = false;
+      });
+    },
+    // 按照组查询人员
+    members(index) {
+      this.loading = true;
+      getMembers(index).then(response => {
+        // this.deptOptionsthre = this.handleTree(response.data, "id");       this.liseh = response.data;
+        // response.data
+        // this.lisehtwo.push(response.data)
+        this.dhiuw = response.data
+        this.dhiuw.filter(route=>{
+          this.lisehtwo.push(route)
+        })
+        this.loading = false;
+      });
+    }
+  }
+};
+</script>
+
+<style scoped lang="scss">
+.iegeu {
+  padding: 30px;
+}
+.infinite-list {
+  height: 150px;
+  margin-bottom: 20px;
+  .infinite-list-item {
+    width: 20% !important;
+    display: flex;
+    // justify-content: space-between;
+    align-items: center;
+    text-align: center;
+    list-style: none;
+    height: 30px;
+    // line-height: 30px;
+  }
+  .infinite-list-itemss {
+    color: #1890ff;
+  }
+}
+.infinite-listty {
+  display: flex;
+  flex-wrap: wrap;
+  .infinite-list-itemty {
+    width: 20%;
+    display: flex;
+    // justify-content: space-between;
+    height: 40px;
+    line-height: 40px;
+    // text-align: center;
+    list-style: none;
+    // border-radius: 40px;
+    // border: 1px solid #eee;
+    // border-bottom: 1px solid #eee;
+  }
+}
+
+.tab_bott {
+  display: flex;
+}
+.tabBot_oje {
+  width: 40%;
+}
+.tabBot_two {
+  width: 50%;
+  margin-left: 30px;
+}
+.box-cardtt {
+  margin-top: 30px;
+}
+.index_navTimeimg {
+  width: 10px;
+  height: 10px;
+  margin-left: 5px;
+}
+</style>

+ 359 - 0
ruoyi-ui/src/views/system/group/index.vue

@@ -0,0 +1,359 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch">
+      <el-form-item label="名称" prop="deptName">
+        <el-input
+          v-model="queryParams.deptName"
+          placeholder="请输入名称"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="状态" prop="status">
+        <el-select v-model="queryParams.status" placeholder="状态" clearable size="small">
+          <el-option
+            v-for="dict in statusOptions"
+            :key="dict.dictValue"
+            :label="dict.dictLabel"
+            :value="dict.dictValue"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['system:dept:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['system:notice:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="etup"
+          v-hasPermi="['system:notice:edit']"
+        >设置用户</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['system:notice:remove']"
+        >删除</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table
+      v-loading="loading"
+      :data="deptList"
+      row-key="id"
+      default-expand-all
+       @selection-change="handleSelectionChange"
+    >
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column prop="groupName" label="名称" width="260"></el-table-column>
+      <el-table-column prop="number" label="排序" width="200"></el-table-column>
+      <el-table-column prop="status" label="状态" :formatter="statusFormat" width="100"></el-table-column>
+      <el-table-column label="创建时间" align="center" prop="createTime" width="200"/>
+        <!-- <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+          <span>{{ scope.row.createTime }}</span>
+        </template>
+      </el-table-column> -->
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['system:dept:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-plus"
+            @click="handleAdd(scope.row)"
+            v-hasPermi="['system:dept:add']"
+          >新增</el-button>
+          <el-button
+            v-if="scope.row.parentId != 0"
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['system:dept:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <!-- 添加或修改部门对话框 -->
+    <el-dialog :close-on-click-modal="false" :title="title" :visible.sync="open" width="600px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-row>
+          <!-- <el-col :span="24" v-if="form.parentId !== 0">
+            <el-form-item label="上级名称" prop="parentId">
+              <treeselect v-model="form.parentId" :options="deptOptions" :normalizer="normalizer" placeholder="选择上级名称" />
+            </el-form-item>
+          </el-col> -->
+          <el-col :span="12">
+            <el-form-item label="名称" prop="groupName">
+              <el-input v-model="form.groupName" placeholder="请输入名称" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="显示排序" prop="number">
+              <el-input-number v-model="form.number" controls-position="right" :min="0" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="状态">
+              <el-radio-group v-model="form.status">
+                <el-radio
+                  v-for="dict in statusOptions"
+                  :key="dict.dictValue"
+                  :label="dict.dictValue"
+                >{{dict.dictLabel}}</el-radio>
+              </el-radio-group>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listDept, getDept, delDept, addDept, updateDept, listDeptExcludeChild } from "@/api/system/group";
+
+import Treeselect from "@riophae/vue-treeselect";
+import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+
+export default {
+  name: "Dept",
+  components: { Treeselect },
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 表格树数据
+      deptList: [],
+      // 部门树选项
+      deptOptions: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 状态数据字典
+      statusOptions: [],
+      // 查询参数
+      queryParams: {
+        deptName: undefined,
+        status: undefined
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        groupName: [
+          { required: true, message: "部门名称不能为空", trigger: "blur" }
+        ],
+        number: [
+          { required: true, message: "菜单顺序不能为空", trigger: "blur" }
+        ],
+        email: [
+          {
+            type: "email",
+            message: "'请输入正确的邮箱地址",
+            trigger: ["blur", "change"]
+          }
+        ],
+        phone: [
+          {
+            pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
+            message: "请输入正确的手机号码",
+            trigger: "blur"
+          }
+        ]
+      }
+    };
+  },
+  created() {
+    this.getList();
+    this.getDicts("sys_normal_disable").then(response => {
+      this.statusOptions = response.data;
+    });
+  },
+  methods: {
+    /** 查询部门列表 */
+    getList() {
+      this.loading = true;
+      listDept(this.queryParams).then(response => {
+        this.deptList = this.handleTree(response.data, "id");
+        this.loading = false;
+      });
+    },
+    /** 转换部门数据结构 */
+    normalizer(node) {
+      if (node.children && !node.children.length) {
+        delete node.children;
+      }
+      return {
+        id: node.id,
+        label: node.deptName,
+        children: node.children
+      };
+    },
+    // 字典状态字典翻译
+    statusFormat(row, column) {
+      return this.selectDictLabel(this.statusOptions, row.status);
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: undefined,
+        parentId: undefined,
+        deptName: undefined,
+        orderNum: undefined,
+        leader: undefined,
+        phone: undefined,
+        email: undefined,
+        status: "0"
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    /** 新增按钮操作 */
+    handleAdd(row) {
+      this.reset();
+      if (row != undefined) {
+        this.form.parentId = row.id;
+      }
+      this.open = true;
+      this.title = "添加";
+      listDept().then(response => {
+	        this.deptOptions = this.handleTree(response.data, "id");
+      });
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      console.log(selection)
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!=1
+      this.multiple = !selection.length
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      console.log(this.ids[0])
+      const id = row.id || this.ids[0]
+      getDept(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改";
+      });
+      // listDeptExcludeChild(row.id).then(response => {
+	     //    this.deptOptions = this.handleTree(response.data, "id");
+      // });
+    },
+    // 设置用户组
+    etup(){
+     const id =  this.ids
+     this.$router.push({
+       path: '/system/election',
+       query: {
+         id
+       },
+     })
+    },
+    /** 提交按钮 */
+    submitForm: function() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != undefined) {
+            updateDept(this.form).then(response => {
+              this.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addDept(this.form).then(response => {
+              this.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids
+      this.$confirm('是否确认删除?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(function() {
+          return delDept(ids);
+        }).then(() => {
+          this.getList();
+          this.msgSuccess("删除成功");
+        })
+    }
+  }
+};
+</script>

+ 1175 - 0
ruoyi-ui/src/views/system/issue/index.vue

@@ -0,0 +1,1175 @@
+<template>
+  <div class="app-container">
+    <div class="jeuhg">
+      <h3 style="text-align: center; font-size: 30px; color: red; margin-bottom: 20px;">潜山市教育局{{titlet}}稿纸</h3>
+      <el-form :model="querjtgoe" ref="querjtgoe" :rules="rules" v-show="showSearch" :inline="true">
+      <el-row :gutter="10" class="mb8">
+        <el-col :span="12" style="border: 1px solid red; border-bottom: 0; padding: 15px 0 15px 10px;" >
+        <el-form-item :label="titlet + '字号:'" prop="message_code">
+          <el-input placeholder="请输入内容" v-model="querjtgoe.message_code">
+              <el-button slot="append" @click="ziao">历史字号</el-button>
+            </el-input>
+        </el-form-item>
+        </el-col>
+        <el-col :span="12" style="border: 1px solid red; border-bottom: 0; border-left: 0; padding: 15px 0 15px 10px;">
+        <el-form-item :label="titlet + '日期:'" prop="message_time">
+          <el-date-picker :disabled="false" @change="iChange" v-model="querjtgoe.message_time" value-format="yyyy-MM-dd"   style="width: 100%"    type="date" :placeholder="'请输入'">
+          </el-date-picker>
+        </el-form-item>
+        </el-col>
+        <el-col :span="24" style="border: 1px solid red; border-bottom: 0; padding: 15px 0 15px 10px;">
+        <el-form-item class="renhdy" label="正文上传:" prop="roleName">
+          <el-upload :disabled="false" class="upload-demo" :headers="{Authorization: 'Bearer ' + getToken()}"
+             :action="process + '/boman-file/upload'" :on-change="handleChangert"
+            :on-success="upImageFn" :on-error="err" :on-remove="reseImage" :file-list="config">
+            <el-button size="small" type="primary">点击上传</el-button>
+          </el-upload>
+        </el-form-item>
+        </el-col>
+        <el-col :span="24" style="border: 1px solid red; border-bottom: 0; padding: 15px 0 15px 10px;">
+        <el-form-item class="renhdy" label="附件上传:" prop="roleName">
+          <el-upload :disabled="false" class="upload-demo" :headers="{Authorization: 'Bearer ' + getToken()}"
+             :action="process + '/boman-file/upload'" :on-change="handleChangert"
+          :on-preview="handlePictureCardPreview"  :on-success="upImageFntwo" :on-error="err" :on-remove="reseImagetwo" :file-list="configtwo">
+            <el-button size="small" type="primary">点击上传</el-button>
+          </el-upload>
+        </el-form-item>
+        </el-col>
+        <el-col :span="24" style="border: 1px solid red; border-bottom: 0; padding: 15px 0 15px 10px;">
+        <el-form-item class="renhdy" style="width: 100%;" label="分发人员:" prop="roleName">
+          <el-input v-model="messageReun"  :disabled="true"  >
+              <el-button slot="prepend" @click="changeren">选择人员</el-button>
+            </el-input>
+            <!-- <p style="display: flex; justify-content: space-between;">
+              <span style="width: 80%;">23</span>
+              <el-button size="small" type="primary">点击上传</el-button>
+            </p> -->
+        </el-form-item>
+        </el-col>
+        <el-col :span="24" style="border: 1px solid red; border-bottom: 0; padding: 15px 0 15px 10px;">
+        <el-form-item class="renhdy" label="分发单位:" prop="ompany">
+          <!-- <el-input
+            type="textarea"
+            autosize
+            :disabled="true"
+            placeholder="请输入内容"
+            v-model="mpany.ompany">
+          </el-input> infinite-list infinite-listty-->
+          <ul class="infinite-listopma " v-infinite-scroll="load" style="overflow:auto">
+              <li v-for="item in mpany.ompany" :key = 'item'>{{item}}</li>
+            </ul>
+          <!-- <p><span>34</span></p> -->
+        </el-form-item>
+        </el-col>
+        <el-col :span="24" style="border: 1px solid red; border-bottom: 0; padding: 15px 0 15px 10px;">
+        <el-form-item class="renhdy" label="角色名称:" prop="name">
+          <ul class="infinite-listopma " v-infinite-scroll="load" style="overflow:auto">
+              <li v-for="item in mpany.name" :key = 'item'>{{item}}</li>
+            </ul>
+        </el-form-item>
+        </el-col>
+        <el-col :span="24" style="border: 1px solid red; border-bottom: 0; padding: 15px 0 15px 10px;">
+        <el-form-item label="文件标题:" prop="message_title">
+          <el-input
+            v-model="querjtgoe.message_title"
+            placeholder="请输入文件标题"
+            clearable
+            size="small"
+            style="width: 100%"
+            @keyup.enter.native="handleQuery"
+          />
+        </el-form-item>
+        </el-col>
+        <el-col :span="24" style="border: 1px solid red;  padding: 20px 0 20px 10px;">
+        <el-form-item class="renhdy" label="备注:" prop="message_remark">
+          <el-input
+            type="textarea"
+            autosize
+            placeholder="请输入内容"
+            v-model="querjtgoe.message_remark">
+          </el-input>
+        </el-form-item>
+        </el-col>
+        <el-col :span="24" style="text-align: right; padding-top: 20px;">
+          <el-button type="danger" :disabled="taegshouw" @click="submitForm">提交</el-button>
+        </el-col>
+        </el-row>
+      </el-form>
+    </div>
+
+    <!-- 添加或修改角色配置对话框 -->
+   <el-dialog   :close-on-click-modal="false" title="选择字号" :visible.sync="shouew" width="980px" append-to-body>
+     <el-table @cell-click= 'cellClick' v-loading="loading" :data="postList" @selection-change="handleSelectionChange">
+       <el-table-column label="日志编号" align="center" prop="message_code" />
+     </el-table>
+
+     <pagination
+       v-show="total>0"
+       :total="total"
+       :page.sync="queryParams.pageNum"
+       :limit.sync="queryParams.pageSize"
+       @pagination="getList"
+     />
+     </el-dialog>
+    <!-- 分配角色数据权限对话框 -->
+    <el-dialog   :close-on-click-modal="false" title="选择人员" :visible.sync="modalShow" width="980px" append-to-body>
+      <!-- <Flowshoe  :instanceId="instanceId"></Flowshoe> -->
+      <div class="tab_bott">
+        <div class="tabBot_oje">
+          <el-tabs type="border-card" v-model="activeName" @tab-click="handleClick">
+            <!-- :setCheckedKeys='setCheckedKeys' :getCheckedKeys = "getCheckedKeys" -->
+            <el-tab-pane label="按部门" name="first">
+              <div class="head-container">
+                <el-input
+                  v-model="deptName"
+                  placeholder="请输入部门名称"
+                  clearable
+                  size="small"
+                  prefix-icon="el-icon-search"
+                  style="margin-bottom: 20px"
+                />
+              </div>
+              <div class="head-container">
+                <el-tree
+                  :data="deptOptions"
+                  :props="defaultProps"
+                  :expand-on-click-node="false"
+                  :filter-node-method="filterNode"
+                  ref="tree"
+                  default-expand-all
+                  @node-click="handleNodeClick"
+                />
+              </div>
+            </el-tab-pane>
+            <el-tab-pane label="按角色" name="second" style="height: 400px;">
+               <treeselect v-model="form.parentId" :options="deptOptionstwo" :normalizer="normalizer" :flat="true" :maxHeight="150" @select="djieskle" placeholder="点击选择角色" />
+            </el-tab-pane>
+            <el-tab-pane label="按组" name="third" style="height: 400px;">
+             <treeselect  v-model="form.parentIdty" :options="deptOptionsthre" :normalizer="normalizerty" :flat="true" @select="djieskletwo" :maxHeight="350" placeholder="点击选择组" />
+            </el-tab-pane>
+          </el-tabs>
+        </div>
+        <div class="tabBot_two">
+          <el-card class="box-card box-cardtt" shadow="always">
+              <div slot="header" class="clearfix">
+                <span>人员</span>
+               <el-button style=" float: right;  padding: 3px 10px;" type="danger" plain @click="eledelte">删除</el-button>
+               <el-button style=" float: right; padding: 3px 10px;margin-right: 20px;" type="primary" plain @click="quande">全选</el-button>
+              </div>
+              <ul class="infinite-list infinite-listty" v-infinite-scroll="load" style="overflow:auto">
+                  <li
+                    v-for="(item, index) in liseh"
+                    :class="[ quandet==true? 'infinite-list-itemty infinite-list-itemss' : item.id == idneese.id ? 'infinite-list-itemty infinite-list-itemss' : 'infinite-list-itemty']"
+                    :key="index"
+                    @click="reyantt(item)"
+                  >
+                    {{ item.userName }}
+                  </li>
+                </ul>
+              </el-card>
+              <el-card class="box-card box-cardtt" shadow="always">
+                <div slot="header" class="clearfix">
+                  <span>已选择</span>
+                  <el-button style="float: right; padding: 3px 0" type="text" @click = 'determine'>确定</el-button>
+                </div>
+                <ul class="infinite-list infinite-listty" v-infinite-scroll="load" style="overflow:auto">
+                  <li v-for="item in lisehtwo" @click="lidele(item)" :key="item.id" class="infinite-list-item">
+                    {{ item.userName }}
+                    <img src="../../../assets/images/dele.png" alt="" class="index_navTimeimg" />
+                  </li>
+                </ul>
+              </el-card>
+        </div>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listRoles,listIndex,   delRole, addRole,addbjectSave, updateRole, exportRole, dataScope, changeRoleStatus, buent,issdanelist,issdaneid } from "@/api/system/isses";
+import {
+    getToken
+  } from "@/utils/auth";
+   import {getUserProfile} from "@/api/system/config";
+   import {tabsubm} from "@/api/system/table";
+  import { group , getRole, getPersonnel, getMembers,delRoleses } from '@/api/system/election';
+  import { listDept } from "@/api/system/dept";
+  import { listRole } from "@/api/system/role";
+  import { treeselect } from "@/api/system/dept";
+  import Treeselect from "@riophae/vue-treeselect";
+  import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+export default {
+  name: "Role",
+   components: {  Treeselect },
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 无限滚动
+      count: 0,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 部门名称
+      deptName: undefined,
+      // 角色表格数据
+      roleList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 是否显示弹出层(数据权限)
+      openDataScope: false,
+      menuExpand: false,
+      menuNodeAll: false,
+      deptExpand: true,
+      deptNodeAll: false,
+      // 日期范围
+      dateRange: [],
+      // 状态数据字典
+      statusOptions: [],
+      // 数据范围选项
+      dataScopeOptions: [
+        {
+          value: "1",
+          label: "全部数据权限"
+        },
+        {
+          value: "2",
+          label: "自定数据权限"
+        },
+        {
+          value: "3",
+          label: "本部门数据权限"
+        },
+        {
+          value: "4",
+          label: "本部门及以下数据权限"
+        },
+        {
+          value: "5",
+          label: "仅本人数据权限"
+        }
+      ],
+      // 菜单列表
+      menuOptions: [],
+      // 部门列表
+      deptOptions: [],
+      // 角色
+      deptOptionstwo:[],
+      deptOptionsthre:[],
+      // 查询参数
+      queryParams: {
+      },
+      // 表单参数
+      form: {},
+      // 单位  名称
+      mpany:{
+        ompany:[],
+        name:[]
+        },
+      defaultProps: {
+        children: "children",
+        label: "label"
+      },
+      // 表单校验
+      rules: {
+        message_code: [
+          { required: true, message: "发文字号不能为空", trigger: "blur" }
+        ],
+        message_time: [
+          { required: true, message: "发文日期不能为空", trigger: "blur" }
+        ],
+        message_title: [
+          { required: true, message: "文件标题不能为空", trigger: "blur" }
+        ]
+      },
+      dialogImageUrl: '',
+      process: process.env.VUE_APP_BASE_API,
+      dialogVisible: false,
+      disabled: false,
+      filterList: [],
+      config: [],
+      configtwo: [],
+      shouew:false,
+      modalShow:false,
+      forew:{
+       table:'',
+       fixedData:{
+         id:-1
+       }
+      },
+      list:[],
+      activeName:'first',
+      querjtgoe:{
+        message_code:'',
+        message_title:'',
+        message_remark:'',
+        send_time:''
+      },
+      liseh: [
+            ],
+      queryParamsser:{
+       table:'',
+       orderBy:'create_time desc',
+       pageSize:10,
+       pageNo:1,
+       showData:['message_code']
+      },
+      tabData:[],
+      postList:[],
+      faerform:{
+        table: '',
+        objId: -1,
+        fixedData: {},
+        children:[{
+        table: '',
+        objId: -1,
+        fixedData:{}
+        }]
+      },
+      lisehtwo:[
+      ],
+      data: [],
+      deptList: [],
+      rtuer: false,
+      showtabc: 0,
+      showche: false,
+      idneese: {},
+      quandet:false,
+      dhiuw:[],
+      // 组id
+      elezu:0,
+      fileList: [],
+      titlet:'',
+      tabled:'',
+      objeuisd:-1,
+      messageReun:'',
+      frowtse:{
+
+      },
+      taegshouw:false,
+
+
+    };
+  },
+  created() {
+    this.forew.table = this.$route.query.tables;
+    this.queryParamsser.table = this.$route.query.tables;
+    this.tabled =  this.$route.query.tables;
+    this.objeuisd = this.$route.query.id - 0;
+    this.forew.fixedData.id = this.$route.query.id - 0;
+    this.faerform.objId = this.$route.query.id - 0;
+    this.faerform.table = this.$route.query.tables;
+
+    this.frowtse.businessTypeName = this.$route.query.tables;
+    this.frowtse.dbname = this.$route.query.tables;
+
+    this.querjtgoe.message_situation = this.$route.query.tabname - 0;
+    if(this.$route.query.tabname == 'shouwen'){
+      this.titlet = '收文'
+    }else if(this.$route.query.tabname == 1){
+      this.titlet = '发文'
+    }
+    if(this.objeuisd !== -1){
+      this.frowtse.businessType = this.$route.query.id - 0;
+      this.issdane()
+    }
+    this.getUser()
+    this.gerdw()
+    this.getList();
+    this.getTreeselect()
+    this.getDicts("sys_normal_disable").then(response => {
+      this.statusOptions = response.data;
+    });
+  },
+  methods: {
+    /** 查询角色列表 */
+    getList() {
+      this.loading = true;
+      console.log(this.forew)
+      listRoles(this.forew).then(
+        res => {
+          console.log(res)
+          if(res.data !== undefined){
+            this.querjtgoe = res.data
+            if(res.data.message_upload !== undefined && res.data.message_upload !== null ){
+              this.config = JSON.parse(res.data.message_upload)
+              // this.configtwo = res.data.message_enclosure
+            }
+            if(res.data.message_enclosure !== undefined && res.data.message_enclosure !== null ){
+              // this.config = res.data.message_upload
+              this.configtwo = JSON.parse(res.data.message_enclosure)
+            }
+
+            if(res.data.status == '未提交'){
+              this.taegshouw = false
+            }else{
+              this.taegshouw = true
+            }
+          }
+        }
+      );
+    },
+    // 分发单位  人员名称查询
+    issdane(){
+      console.log(346)
+      this.loading = false;
+      let jueg = []
+      let nese = []
+      issdanelist(this.objeuisd).then(response => {
+        if(response.code == 200){
+          this.lisehtwo = response.data
+          this.messageReun = '已选择' + response.data.length +'人'
+          this.lisehtwo.filter(route=>{
+            jueg.push(route.receive_dept_name)
+            nese.push(route.receive_user_name)
+          })
+          this.mpany.ompany = jueg
+          this.mpany.name = nese
+        }
+
+        // this.total = response.data.total;
+        // this.tabData = response.data.tableHeadList;
+        // this.postList = response.data.rows;
+        // for(var i = 0 ; i < this.postList.length; i++){
+        //   console.log(this.postList[i].leavefrom_photo == '[]')
+        // }
+        this.loading = false;
+      });
+    },
+    // 历史字号数据查询
+    lishiList(){
+      console.log(346)
+      this.loading = false;
+      listIndex(this.queryParamsser).then(response => {
+        this.total = response.data.total;
+        this.tabData = response.data.tableHeadList;
+        this.postList = response.data.rows;
+        for(var i = 0 ; i < this.postList.length; i++){
+          console.log(this.postList[i].leavefrom_photo == '[]')
+        }
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 取消按钮(数据权限)
+    cancelDataScope() {
+      this.openDataScope = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      if (this.$refs.menu != undefined) {
+        this.$refs.menu.setCheckedKeys([]);
+      }
+      this.menuExpand = false,
+      this.menuNodeAll = false,
+      this.deptExpand = true,
+      this.deptNodeAll = false,
+      this.form = {
+        roleId: undefined,
+        roleName: undefined,
+        roleKey: undefined,
+        roleSort: 0,
+        status: "0",
+        menuIds: [],
+        deptIds: [],
+        menuCheckStrictly: true,
+        deptCheckStrictly: true,
+        remark: undefined
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.dateRange = [];
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!=1
+      this.multiple = !selection.length
+    },
+    // 树权限(展开/折叠)
+    handleCheckedTreeExpand(value, type) {
+      if (type == 'menu') {
+        let treeList = this.menuOptions;
+        for (let i = 0; i < treeList.length; i++) {
+          this.$refs.menu.store.nodesMap[treeList[i].id].expanded = value;
+        }
+      } else if (type == 'dept') {
+        let treeList = this.deptOptions;
+        for (let i = 0; i < treeList.length; i++) {
+          this.$refs.dept.store.nodesMap[treeList[i].id].expanded = value;
+        }
+      }
+    },
+    /** 提交按钮 */
+    submitForm: function() {
+      // 获取当前时间戳
+      var  date1 =new Date();
+      // let tmie = Date.parse(date1) / 1000
+      let tmie = this.dateFormat()
+      console.log(tmie)
+      if(this.lisehtwo.length == 0){
+         this.msgSuccess("请选择分发人员");
+         return false
+      }
+      for(var i = 0 ; i < this.lisehtwo.length; i++){
+        this.faerform.children[i] = {table:'',objId:'',fixedData:{}}
+        this.faerform.children[i].table = 'boman_message_receive'
+        if(this.objeuisd == -1){
+          this.faerform.children[i].objId = this.objeuisd
+        }else{
+          this.faerform.children[i].objId = this.lisehtwo[i].id
+        }
+
+        // this.faerform.children[i].fixedData.receive_user_id = this.lisehtwo[i]
+        this.faerform.children[i].fixedData.message_id = 'fk.boman_message'
+        this.faerform.children[i].fixedData.send_message_time = tmie
+        if(this.objeuisd == -1){
+          this.faerform.children[i].fixedData.receive_user_id = this.lisehtwo[i].id
+        }else{
+          this.faerform.children[i].fixedData.receive_user_id = this.lisehtwo[i].receive_user_id
+        }
+
+        this.faerform.children[i].fixedData.receive_user_name = this.lisehtwo[i].userName
+        if(this.lisehtwo[i].dept !== undefined && this.lisehtwo[i].dept !==null){
+          this.faerform.children[i].fixedData.receive_dept_name = this.lisehtwo[i].dept.deptName
+        }else{
+          this.faerform.children[i].fixedData.receive_dept_name = this.lisehtwo[i].deptName
+        }
+
+      }
+      console.log(this.faerform.children[i])
+      // this.faerform.children
+      // this.querjtgoe.message_upload = JSON.stringify(this.querjtgoe.message_upload)
+      // this.querjtgoe.message_enclosure = JSON.stringify(this.querjtgoe.message_enclosure)
+      this.querjtgoe.message_id = 'fk.boman_message'
+      this.querjtgoe.send_time = tmie
+      this.faerform.fixedData = this.querjtgoe
+      console.log(this.faerform)
+      this.$refs["querjtgoe"].validate(valid => {
+      //   if (valid) {
+      //     if (this.form.roleId != undefined) {
+      //       this.form.menuIds = this.getMenuAllCheckedKeys();
+      //       updateRole(this.form).then(response => {
+      //         this.msgSuccess("修改成功");
+      //         this.open = false;
+      //         this.getList();
+      //       });
+      //     } else {
+      //       this.form.menuIds = this.getMenuAllCheckedKeys();
+            addbjectSave(this.faerform).then(response => {
+              // this.msgSuccess("操作成功");
+              this.frowtse.businessCodes = response.data[0].data
+              
+              this.sbreulw()
+              // this.$router.go(-1);
+              // this.open = false;
+              // this.getList();
+            });
+      //     }
+      //   }
+      });
+    },
+    /** 提交按钮(数据权限) */
+    submitDataScope: function() {
+      if (this.form.roleId != undefined) {
+        this.form.deptIds = this.getDeptAllCheckedKeys();
+        dataScope(this.form).then(response => {
+          this.msgSuccess("修改成功");
+          this.openDataScope = false;
+          this.getList();
+        });
+      }
+    },
+    handleClick(index){
+    if(index.index == 0){
+      this.getTreeselect()
+    }else if(index.index == 1){
+      this.getTreeselectjue()
+    }else if(index.index == 2){
+      this.getTreeselecu()
+    }
+    },
+    ziao(){
+      console.log(23)
+      this.shouew = true
+      this.lishiList()
+    },
+    // 人员选择
+    changeren(){
+    this.modalShow = true
+
+    },
+    // 上传文件
+    handleChangert(file, fileList) {
+      this.fileList = fileList.slice(-3);
+    },
+    getToken() {
+      return getToken()
+    },
+    reseImage(file, fileList) {
+      let urls = ""
+      if (file.response) {
+        urls = file.response.url
+      } else {
+        urls = file.url
+      }
+      for (let i = this.config.length - 1; i >= 0; i--) {
+        if (this.config[i].url == urls) {
+          this.config.splice(i, 1);
+        }
+      }
+      this.querjtgoe.message_upload = this.config
+    },
+    reseImagetwo(file, fileList) {
+      let urls = ""
+      if (file.response) {
+        urls = file.response.url
+      } else {
+        urls = file.url
+      }
+      for (let i = this.configtwo.length - 1; i >= 0; i--) {
+        if (this.configtwo[i].url == urls) {
+          this.configtwo.splice(i, 1);
+        }
+      }
+     console.log(this.configtwo)
+     this.querjtgoe.message_enclosure = this.configtwo
+    },
+    handlePictureCardPreview(file) {
+      console.log(file)
+      this.dialogImageUrl = file.url;
+      this.dialogVisible = true;
+    },
+    upImageFn(res, file) {
+      if(res.code !== 200){
+        this.msgSuccess('上传失败');
+        return false
+      }else{
+        this.msgSuccess('上传成功');
+        this.config.push(res.data);
+        this.querjtgoe.message_upload = this.config
+        this.querjtgoe.message_upload = JSON.stringify(this.querjtgoe.message_upload)
+      }
+
+      console.log(res)
+    },
+    upImageFntwo(res, file) {
+      if(res.code == 200){
+        this.msgSuccess('上传成功');
+        this.configtwo.push(res.data);
+        this.querjtgoe.message_enclosure  = this.configtwo
+        this.querjtgoe.message_enclosure  = JSON.stringify(this.querjtgoe.message_enclosure)
+      }else{
+        this.msgSuccess('上传失败');
+        return false
+      }
+
+      console.log(this.configtwo)
+    },
+    // 时间控件
+    iChange(){
+
+    },
+    err(){
+      this.msgSuccess("上传失败");
+     console.log(35)
+    },
+    load(){
+
+    },
+    // 点击单元格
+    cellClick(row){
+      console.log(row)
+      this.shouew =  false
+      this.querjtgoe.message_code = row.message_code
+
+    },
+    // 树形结构
+    // 节点单击事件
+   handleNodeClick(data) {
+     console.log(data);
+     // this.queryParams.deptId = data.id;
+     this.staff(data.id);
+     this.quandet = false
+     // this.getList();
+   },
+    /** 查询部门下拉树结构 */
+    getTreeselect() {
+      treeselect().then(response => {
+        this.deptOptions = response.data;
+      });
+    },
+    // 查询角色
+    getTreeselectjue() {
+      this.loading = true;
+      listRole(this.queryParams).then(response => {
+        this.deptOptionstwo = this.handleTree(response.rows, "id");
+        this.loading = false;
+      });
+    },
+    // 查询组
+    getTreeselecu() {
+      this.loading = true;
+      group(this.queryParams).then(response => {
+        this.deptOptionsthre = this.handleTree(response.data, "id");
+        this.loading = false;
+      });
+    },
+    /** 转换角色数据结构 */
+    normalizer(node) {
+      // if (node.children && !node.children.length) {
+      //   delete node.children;
+      // }
+      return {
+        id: node.id,
+        label: node.roleName,
+      };
+    },
+    /** 转换组数据结构 */
+    normalizerty(node) {
+      return {
+        id: node.id,
+        label: node.groupName,
+      };
+    },
+   // 点击组/角色
+     djieskle(node, instanceId) {
+       this.personnel(node.id);
+       console.log(node, instanceId);
+     },
+     djieskletwo(node, instanceId) {
+       this.members(node.id);
+       this.elezu = node.id
+       console.log(node, instanceId);
+     },
+     check(data, value) {
+       console.log(this.$refs.tree.getCheckedKeys());
+       // 获取选中的子节点
+       // let checkedKeys = this.$refs.tree.getCheckedKeys();
+       // 获取选中的父节点
+       let hafCheckedKeys = this.$refs.tree.getHalfCheckedKeys();
+       console.log(this.$refs.tree.getHalfCheckedKeys());
+
+       console.log(data, value);
+     },
+     // 点击全选
+     quande(){
+       var dueg = []
+       dueg = (this.dhiuw)
+      this.quandet = true
+      var that =  this
+      // dueg.push(index)
+      // this.lisehtwo = dueg
+      // this.lisehtwo.push(index);
+      // this.lisehtwo = [...new Set(this.lisehtwo)];
+      // that.positions.map(train => {
+      //   that.new_Positions.push(train.trainId);
+      // });
+      // that.resultArr = []; //去重后的数组
+      var flag;
+      for (var i in dueg) {
+        flag = true;
+        for (var j in that.lisehtwo) {
+          if (that.lisehtwo[j].id == dueg[i].id) {
+            flag = false;
+            break;
+          }
+        }
+        if (flag) {
+          that.lisehtwo.push(dueg[i]);
+        }
+      }
+     },
+     // 点击全部删除
+     eledelte(){
+      this.lisehtwo = []
+     },
+     // 点击删除
+     lidele(index) {
+       for (let i = this.lisehtwo.length - 1; i >= 0; i--) {
+         if (this.lisehtwo[i].id == index.id) {
+           this.lisehtwo.splice(i, 1)
+         }
+       }
+     },
+     // 点击添加
+     reyantt(index) {
+       var dueg = [];
+       this.idneese = index;
+       var that =  this
+       dueg.push(index)
+       // this.lisehtwo = dueg
+       // this.lisehtwo.push(index);
+       // this.lisehtwo = [...new Set(this.lisehtwo)];
+       // that.positions.map(train => {
+       //   that.new_Positions.push(train.trainId);
+       // });
+       // that.resultArr = []; //去重后的数组
+       var flag;
+       for (var i in dueg) {
+         flag = true;
+         for (var j in that.lisehtwo) {
+           if (that.lisehtwo[j].id == dueg[i].id) {
+             flag = false;
+             break;
+           }
+         }
+         if (flag) {
+           that.lisehtwo.push(dueg[i]);
+         }
+       }
+
+       // for(var i = 0 ; i <this.lisehtwo.length; i++ ){
+       //   if(this.lisehtwo[i].id == index.id){
+       //     this.lisehtwo.splice(i,1)
+       //   }
+       // }
+       // })
+     },
+     // 点击确定
+     determine(){
+       var eledete = []
+      this.lisehtwo.filter(route=>{
+        eledete.push(route.id)
+      })
+      eledete  = eledete.join(',')
+      console.log(this.lisehtwo)
+      this.messageReun = '已选择' + this.lisehtwo.length +'人'
+      // this.elezu
+      this.loading = true;
+      buent(this.lisehtwo).then(response => {
+        // this.lisehtwo = response.data;
+        // this.dhiuw = response.data
+        this.mpany.ompany = response.deptNameList
+        this.mpany.name = response.roleNameList
+        console.log( this.mpany.ompany)
+        if(response.code == 200){
+          this.msgSuccess('操作成功');
+          this.modalShow = false
+        }
+        this.loading = false;
+      });
+     },
+     checkItem(val, index) {
+       console.log(val);
+       this.showche = !this.showche;
+       console.log(this.showche);
+       var that = this;
+       let jueg = [];
+       let checkedCount = val.length;
+       this.liseh[index].isCheck = checkedCount === this.liseh[index].children.length;
+
+       this.liseh[index].isIndeterminate = checkedCount > 0 && checkedCount < this.liseh[index].children.length;
+       this.liseh[index].children.filter(router => {
+         // console.log(123)
+         for (var i = 0; i < val.length; i++) {
+           if (this.showche == true) {
+             //选中
+             console.log('选中');
+             if (router.id == val[i]) {
+               jueg.push(router);
+               this.lisehtwo.push(router);
+               // console.log(router)
+               console.log(this.lisehtwo);
+               for (var j = 0; j < that.lisehtwo.length; j++) {
+                 if (that.lisehtwo[i].id !== val[i]) {
+                   this.lisehtwo.push(router);
+                 }
+               }
+               // that.lisehtwo.filter(routers=>{
+               //   console.log(this.lisehtwo)
+               //   console.log(routers,val[i])
+               //   if(routers.id !== val[i]){
+               //      this.lisehtwo.push(router)
+               //   }
+               // })
+             }
+           } else {
+             // 取消选中
+           }
+         }
+       });
+       // this.lisehtwo.push(jueg)
+       console.log(this.lisehtwo);
+       // console.log(this.liseh[index].isIndeterminate)
+     },
+     checkTitle(val, index) {
+       console.log(val, index);
+       let arr = [];
+       let jueg = [];
+       const re = this.liseh[index].children;
+       //全选
+       if (val) {
+         for (let i = 0; i < re.length; i++) {
+           arr[i] = re[i]['id'];
+           jueg[i] = re[i];
+           this.lisehtwo.push(re[i]);
+         }
+         // this.lisehtwo.push(jueg)
+       } else {
+         this.lisehtwo = [];
+       }
+       console.log(this.lisehtwo);
+       this.liseh[index].checkedData = arr;
+       this.liseh[index].isIndeterminate = false;
+     },
+     // 筛选节点
+     filterNode(value, data) {
+       if (!value) return true;
+       return data.label.indexOf(value) !== -1;
+     },
+     // 按照部门查询人员
+     staff(index) {
+       this.loading = true;
+       var that = this;
+       getRole(index).then(response => {
+         // this.deptOptionsthre = this.handleTree(response.data, "id");
+         // this.rtuer = true
+         this.liseh = []
+         this.liseh = response.data;
+         this.dhiuw = response.data
+         this.loading = false;
+       });
+     },
+     // 按照角色查询人员
+     personnel(index) {
+       this.loading = true;
+       getPersonnel(index).then(response => {
+         // this.deptOptionsthre = this.handleTree(response.data, "id");        this.liseh = response.data;
+         this.liseh = []
+         this.liseh = response.data;
+         this.dhiuw = response.data
+         this.loading = false;
+       });
+     },
+     // 按照组查询人员
+     members(index) {
+       this.loading = true;
+       getMembers(index).then(response => {
+         // this.deptOptionsthre = this.handleTree(response.data, "id");
+         // this.liseh = response.data;
+         // response.data
+         // this.lisehtwo.push(response.data)
+         this.liseh = []
+         this.liseh = response.data;
+         // this.dhiuw = response.data
+         // this.dhiuw.filter(route=>{
+         //   this.lisehtwo.push(route)
+         // })
+         this.loading = false;
+       });
+     },
+     // 提交
+     sbreulw(){
+        tabsubm(this.frowtse).then(response => {
+          if (response.resultCode == 0) {
+            this.msgSuccess('提交成功');
+          }
+          this.$store.dispatch('tagsView/delView', this.$route);
+          // this.reload();
+          this.$router.go(-1)
+          // this.formeanti.commitData = []
+          // this.formy.status = 1
+          // this.formeanti.commitData.push(this.formy)
+          // this.antiSubmission();
+        });
+     },
+     // 获取表单id
+     gerdw(){
+      issdaneid(this.faerform.table).then(res=>{
+        console.log(res)
+        this.frowtse.businessType = res.data.id
+      })
+     },
+     // 用户信息
+           getUser() {
+             getUserProfile().then(response => {
+               this.querjtgoe.send_user_id = response.data.id
+               this.querjtgoe.send_user_name = response.data.userName
+               this.querjtgoe.create_dept_nam = response.data.dept.deptName
+               this.faerform.fixedData.send_user_id = response.data.id
+               this.frowtse.initiator = response.data.id
+               this.frowtse.userName = response.data.userName
+               // this.user = response.data;
+               // this.getLisalendar()
+               // this.getLismemorandum()
+               this.init();
+               this.getList();
+             });
+           },
+           // 时间转换
+     dateFormat() {
+           var date = new Date();
+               var month = date.getMonth() + 1;
+               var strDate = date.getDate();
+               var hours = date.getHours()
+               var minus = date.getMinutes()
+               var secong = date.getSeconds()
+               if (month >= 1 && month <= 9) {
+                   month = "0" + month;
+               }
+               if (strDate >= 0 && strDate <= 9) {
+                   strDate = "0" + strDate;
+               }
+               if (hours >= 0 && hours <= 9) {
+                   hours = "0" + hours;
+               }
+               if (minus >= 0 && minus <= 9) {
+                   minus = "0" + minus;
+               }
+               if (secong >= 0 && secong <= 9) {
+                   secong = "0" + secong;
+               }
+               var currentDate = date.getFullYear() + "-" + month + "-" + strDate
+                       + " " + hours + ":" + minus + ":" + secong;
+               return currentDate;
+         },
+   }
+  // }
+  // }
+};
+</script>
+
+
+<style lang="scss">
+  .jeuhg{
+   .el-form-item{
+     margin-bottom: 0;
+     width: 100%;
+   }
+   .el-form-item__content{
+      width: 80%;
+   }
+   .el-form-item__label{
+     color: red;
+   }
+   input{
+     background: none;
+     	  outline: none;
+     	  border: none;
+   }
+  .el-input-group__prepend{
+    background-color: #1890ff !important;
+    color: #fff !important;
+  }
+  .el-input-group__append{
+    background-color: #1890ff !important;
+    color: #fff !important;
+  }
+  .renhdy{
+    .el-form-item__content{
+      width: 85%;
+    }
+
+  }
+  .upload-demo{
+     text-align: right;
+     display: flex;
+     // ul{
+     //   display: flex;
+     // }
+  }
+  .el-textarea__inner{
+    background-color: #fff !important;
+    border: 0 !important;
+  }
+  .el-input__inner{
+    background-color: #fff !important;
+    border: 0 !important;
+  }
+  .el-input.is-disabled .el-input__inner{
+    color: #333;
+  }
+  }
+</style>
+<style scoped  lang="scss">
+  .app-container{
+    padding: 0 80px !important;
+    padding-top: 20px !important;
+  }
+  .infinite-list {
+    height: 150px;
+    margin-bottom: 20px;
+    .infinite-list-item {
+      width: 20% !important;
+      display: flex;
+      // justify-content: space-between;
+      align-items: center;
+      text-align: center;
+      list-style: none;
+      height: 30px;
+      // line-height: 30px;
+    }
+    .infinite-list-itemss {
+      color: #1890ff;
+    }
+  }
+  .infinite-listty {
+    display: flex;
+    flex-wrap: wrap;
+    .infinite-list-itemty {
+      width: 20%;
+      display: flex;
+      // justify-content: space-between;
+      height: 40px;
+      line-height: 40px;
+      // text-align: center;
+      list-style: none;
+      // border-radius: 40px;
+      // border: 1px solid #eee;
+      // border-bottom: 1px solid #eee;
+    }
+  }
+  // 分发人员
+  .infinite-listopma{
+   width: 100%;
+   display: flex;
+   flex-wrap: wrap;
+   justify-content: flex-start;
+   li{
+     list-style: none;
+     width: 20%;
+   }
+  }
+  .tab_bott {
+    display: flex;
+  }
+  .tabBot_oje {
+    width: 40%;
+  }
+  .tabBot_two {
+    width: 50%;
+    margin-left: 30px;
+  }
+  .box-cardtt{
+    margin-top: 30px;
+  }
+  .index_navTimeimg {
+    width: 10px;
+    height: 10px;
+    margin-left: 5px;
+  }
+</style>

+ 41 - 0
ruoyi-ui/src/views/system/pdf/index.vue

@@ -0,0 +1,41 @@
+<template>
+  <div class="pdf" v-show="fileType === 'pdf'">
+    <p class="arrow">
+    <!-- // 上一页 -->
+    <span @click="changePdfPage(0)" class="turn" :class="{grey: currentPage==1}">Preview</span>
+    {{currentPage}} / {{pageCount}}
+    <!-- // 下一页 -->
+    <span @click="changePdfPage(1)" class="turn" :class="{grey: currentPage==pageCount}">Next</span>
+    </p>
+    <div>
+      <p style="font-size: 28px; font-weight: 700;">正文:</p>
+        <a :href="src" download="测试">下载</a>
+    </div>
+    <p style="font-size: 28px; font-weight: 700;">附件:</p>
+    <iframe :src="src" frameborder="0" style="width: 100%; height: 100vh;"></iframe>
+  </div>
+</template>
+<script>
+import Pdf from 'vue-pdf'
+export default {
+  components: {
+    Pdf
+  },
+  data() {
+    return {
+      dialogVisible: true,
+      src: `${window.location.origin}/ceshi.pdf`,
+      fileType:'pdf'
+    }
+  },
+  created() {
+
+  },
+  methods: {
+
+  }
+}
+</script>
+
+<style>
+</style>

+ 82 - 10
ruoyi-ui/src/views/system/surface/index.vue

@@ -28,6 +28,9 @@
                 :src="scope.row[scope.column.property] == '[]' ? '' : JSON.parse(scope.row[scope.column.property])[0].url  " alt="">
              <span :style="scope.row.list_class" v-else-if="item.htmlType=='imageUpload' && scope.row[scope.column.property] && scope.row[scope.column.property] == '[]'">暂无图片</span>
               <span :style="scope.row.list_class" v-else-if="item.columnName == 'status' ">{{ scope.row[scope.column.property] }}</span>
+              <div v-else-if="item.columnName == 'message_title' && tabnaem == 'yidu' || tabnaem == 'weidu' " @click="titey">
+                 {{scope.row[scope.column.property]}}
+              </div>
               <div v-else>
                 <span v-if="item.fkInfo">{{scope.row[scope.column.property].value}}</span>
                 <span v-else>{{scope.row[scope.column.property]}}</span>
@@ -52,6 +55,7 @@
     delMenu,
     getObject
   } from '@/api/system/table.js'
+  import {getUserProfile} from "@/api/system/config";
   import {
     mapGetters,
     mapState
@@ -98,7 +102,8 @@
 
             }
           }
-        }
+        },
+        tabnaem:''
       };
     },
     filters: {
@@ -127,6 +132,7 @@
       ...mapGetters(["sidebarRouters", "sidebar", "tabIndex"]),
     },
     mounted() {
+      this.getUser()
       const route = this.$route;
       const {
         meta,
@@ -137,11 +143,32 @@
       })[0].children.filter(res => {
         return res.path == path.split('/')[2]
       })[0]
+      let naem = route.name.split('/')
+      let nmaelist = naem[naem.length - 1]
+      this.tabnaem = nmaelist
+      console.log(nmaelist)
       this.tabName = items.sysTableName
       this.queryParams.table = items.sysTableName
+      if(nmaelist == 1){
+        this.queryParams.fixedData.condition.message_situation = nmaelist
+      }else if(nmaelist == 'shouwen'){
+        this.queryParams.fixedData.condition.message_situation = 2
+      }else if(nmaelist == 'shenqingzhong'){
+        this.queryParams.fixedData.condition.status = 4
+      }else if(nmaelist == 2){
+        this.queryParams.fixedData.condition.message_situation = 3
+      }
+      else if(nmaelist == 3){
+        this.queryParams.fixedData.condition.message_situation = 4
+      }
+      else{
+        this.queryParams.fixedData.condition.message_situation = undefined
+      }
+
+      // this.queryParams.fixedData.condition.message_situation
       this.form.table = items.sysTableName
-      this.init();
-      this.getList();
+
+
     },
     methods: {
       zjFn(str) {
@@ -165,25 +192,30 @@
         this.$refs.BigPicture.hidden.status = true
       },
       routerFn(id, tables) {
-        if (this.queryData.viewType == 'crud') {
+
+        console.log(this.tabnaem)
+        if (this.tabnaem == 'shouwen' || this.tabnaem == 'yidu' || this.tabnaem == 'weidu' ) {
+          console.log(34)
           this.$router.push({
-            path: '/business/table',
+            path: '/business/collection',
             query: {
               id,
               tables,
+              tabname:'shouwen'
             },
           })
-        } else if (this.queryData.viewType == 'headTab') {
+        } else if (this.tabnaem == 1) {
           this.$router.push({
-            path: '/business/editing',
+            path: '/business/issue',
             query: {
               id,
               tables,
+              tabname:this.tabnaem
             },
           })
-        } else if (this.queryData.viewType == 'itemTab') {
+        } else {
           this.$router.push({
-            path: '/business/form',
+            path: '/business/issue',
             query: {
               id,
               tables,
@@ -327,7 +359,47 @@
           this.queryData = data
         })
       },
-      handleChange(val) {}
+      handleChange(val) {},
+      // 点击标题
+      titey(){
+        // query: {
+        //   id,
+        //   tables,
+        //   tabname:this.tabnaem
+        // },
+        console.log(2354)
+        this.$router.push({
+          path: '/system/pdf'
+
+        })
+      },
+// 用户信息
+      getUser() {
+        getUserProfile().then(response => {
+          if(this.tabnaem == 'yidu'){
+             this.queryParams.fixedData.condition.visible =  'Y'
+             this.queryParams.fixedData.condition.status = 'Y'
+             this.queryParams.fixedData.condition.receive_user_id = response.data.id
+             this.queryParams.fixedData.condition.send_user_id = undefined
+             console.log(this.queryParams.fixedData.condition.send_user_id)
+          }else if(this.tabnaem == 'weidu'){
+            this.queryParams.fixedData.condition.visible =  'Y'
+            this.queryParams.fixedData.condition.status = 'N'
+            this.queryParams.fixedData.condition.receive_user_id = response.data.id
+            this.queryParams.fixedData.condition.send_user_id = undefined
+          }else{
+            this.queryParams.fixedData.condition.send_user_id = response.data.id
+
+          }
+
+          // this.queryParams.fixedData.condition.receive_user_id = response.data.id
+          // this.user = response.data;
+          // this.getLisalendar()
+          // this.getLismemorandum()
+          this.init();
+          this.getList();
+        });
+      },
     },
   };
 </script>

+ 624 - 553
ruoyi-ui/src/views/system/table/index.vue

@@ -4,52 +4,62 @@
       <!-- <p>单表</p>
       <el-divider></el-divider> -->
       <div class="imge_tab">
-        <img src="../../../assets/images/pic_sy_ytj.png" alt="" v-if="imgShoew == 2">
-        <img src="../../../assets/images/pic_sy_shz.png" alt="" v-if="imgShoew == 4">
-        <img src="../../../assets/images/pic_sy_ybh.png" alt="" v-if="imgShoew == 3">
+        <img src="../../../assets/images/pic_sy_ytj.png" alt="" v-if="imgShoew == 2" />
+        <img src="../../../assets/images/pic_sy_shz.png" alt="" v-if="imgShoew == 4" />
+        <img src="../../../assets/images/pic_sy_ybh.png" alt="" v-if="imgShoew == 3" />
       </div>
-      <div class="table_headerBtun table_headerBtuntwo" >
-        <el-button type="primary" size="mini" plain v-for="(item,index) in jeigneutwo" :key="index"
-                   @click="handleQuery(item)">{{item}}
-        </el-button>
+      <div class="table_headerBtun table_headerBtuntwo">
+        <el-button type="primary" size="mini" plain v-for="(item, index) in jeigneutwo" :key="index" @click="handleQuery(item)">{{ item }}</el-button>
       </div>
     </div>
     <!-- 内容 -->
     <div class="table_nav headertable_nav table_forem">
       <el-collapse v-model="activeNames" @change="handleChange">
-        <el-form :model="queryParams" :rules="queryData.rules" ref="queryForm" :inline="true"
-                 :label-width="this.queryData.table_column == 6 ? '70px' :'110px'">
-          <el-collapse-item :title="item.columnComment" :name="index" v-for="(item,index) in queryData.showData"
-                            :key="index">
-            <dynamic-formsteo @iChange="iChange" :queryData="queryData" @modelFn="modelFn" :ref="items.columnName"
-                              :config="queryParams" @inputs="changeFn" :formConfig="items"
-                              v-for="(items,indexs) in item.hrChildren"
-                              :key='indexs'/>
+        <el-form :model="queryParams" :rules="queryData.rules" ref="queryForm" :inline="true" :label-width="this.queryData.table_column == 6 ? '70px' : '110px'">
+          <el-collapse-item :title="item.columnComment" :name="index" v-for="(item, index) in queryData.showData" :key="index">
+            <dynamic-formsteo
+              @iChange="iChange"
+              :queryData="queryData"
+              @modelFn="modelFn"
+              :ref="items.columnName"
+              :config="queryParams"
+              @inputs="changeFn"
+              :formConfig="items"
+              v-for="(items, indexs) in item.hrChildren"
+              :key="indexs"
+              :modalShow.sync="modalShow"
+               @closepop="closepop"
+            />
           </el-collapse-item>
+
         </el-form>
         <div>
-          <el-dialog :close-on-click-modal="false" title="选择人员" :visible.sync="modalShow" width="980px" append-to-body>
-           <!-- <Flowshoe  :instanceId="instanceId"></Flowshoe> -->
-          <div class="tab_bott">
-            <div class="tabBot_oje">
-              <el-tabs type="border-card" v-model="activeName" @tab-click="handleClick">
-                  <el-tab-pane label="按部门" name="first">用户管理</el-tab-pane>
+          <!-- :showde.sync="modalShow" -->
+          <el-dialog   :close-on-click-modal="false" title="选择人员" :visible.sync="modalShow" width="980px" append-to-body>
+            <!-- <Flowshoe  :instanceId="instanceId"></Flowshoe> -->
+            <div class="tab_bott">
+              <div class="tabBot_oje">
+                <el-tabs type="border-card" v-model="activeName" @tab-click="handleClick">
+                  <!-- :setCheckedKeys='setCheckedKeys' :getCheckedKeys = "getCheckedKeys" -->
+                  <el-tab-pane label="按部门" name="first">
+                    <el-tree :data="data" :props="defaultProps" show-checkbox   default-expand-all node-key="id" :setCheckedKeys='setCheckedKeys'  @check = "check"   ref="tree"  highlight-current @node-click="handleNodeClick" ></el-tree>
+                  </el-tab-pane>
                   <el-tab-pane label="按角色" name="second">配置管理</el-tab-pane>
                   <el-tab-pane label="按组" name="third">角色管理</el-tab-pane>
                 </el-tabs>
+              </div>
+              <div class="tabBot_two">
+                <el-card class="box-card" shadow="always">
+                  <div slot="header" class="clearfix">
+                    <span>人员对应的单位</span>
+                    <el-button style="float: right; padding: 3px 0" type="text">操作按钮</el-button>
+                  </div>
+                  <ul class="infinite-list infinite-listty" v-infinite-scroll="load" style="overflow:auto">
+                    <li v-for="i in count" class="infinite-list-item">{{ i }}</li>
+                  </ul>
+                </el-card>
+              </div>
             </div>
-            <div class="tabBot_two">
-              <el-card class="box-card" shadow="always">
-                <div slot="header" class="clearfix">
-                  <span>人员对应的单位</span>
-                  <el-button style="float: right; padding: 3px 0" type="text">操作按钮</el-button>
-                </div>
-                <ul class="infinite-list infinite-listty" v-infinite-scroll="load" style="overflow:auto">
-                 <li v-for="i in count" class="infinite-list-item">{{ i }}</li>
-                </ul>
-              </el-card>
-            </div>
-          </div>
           </el-dialog>
         </div>
       </el-collapse>
@@ -57,578 +67,639 @@
   </div>
 </template>
 <script>
-  import Flowshoe from '@/components/flowshoe'
-  import {
-    getTableQuery,
-    getQueryList,
-    tableSubimt,
-    tableSubimtanit,
-    addbjectSave,
-    delMenutab,
-    tabsubm,
-    getUserProfiletab,
-    bohuie
-  } from '@/api/system/table.js'
-
-  export default {
-    name: "table",
-    inject: ['reload'],
-    components:{Flowshoe},
-    data() {
-      return {
-        // 显示搜索条件
-        showSearch: true,
-        activeNames: [0],
-        title: '单表1',
-        tabledeLise: {
-          table: '',
-          isUi: true
-        },
-        queryData: {},
-        // 查询参数
-        queryParams: {},
-        labletit: '查询参数1233',
-        tableZbie: {
-          table: '',
-          isUi: true,
-          fixedData: {
-            id: -1
-          }
-
-        },
-        taleLisst: [],
-        forme: {
-          table: '',
-          objId: -1,
-          fixedData: {}
-        },
-        formeanti: {
-          table: '',
-          commitData: [],
-        },
-        formy: {
-          id: 0,
-          status: 1
-        },
-        // 删除参数
-        deledlid: {
-          table: '',
-          idList: []
-        },
-        jeigneu: [],
-        jeigneutwo: [],
-        xidugje: 0,
-        tijeq: 0,
-        imgShoew: 0,
-        tablees: -1,
-        juegkae: '',
-        tabdiese: '',
-        cielsshow: false,
-        oieufr: 0,
-        ojeuduj: 0,
-        juegh:{
-
+import Flowshoe from '@/components/flowshoe';
+import { getTableQuery, getQueryList, tableSubimt, tableSubimtanit, addbjectSave, delMenutab, tabsubm, getUserProfiletab, bohuie } from '@/api/system/table.js';
+
+export default {
+  name: 'table',
+  inject: ['reload'],
+  components: { Flowshoe },
+  data() {
+    return {
+      // 显示搜索条件
+      showSearch: true,
+      activeNames: [0],
+      title: '单表1',
+      tabledeLise: {
+        table: '',
+        isUi: true
+      },
+      queryData: {},
+      // 查询参数
+      queryParams: {},
+      labletit: '查询参数1233',
+      tableZbie: {
+        table: '',
+        isUi: true,
+        fixedData: {
+          id: -1
+        }
+      },
+      taleLisst: [],
+      forme: {
+        table: '',
+        objId: -1,
+        fixedData: {}
+      },
+      formeanti: {
+        table: '',
+        commitData: []
+      },
+      formy: {
+        id: 0,
+        status: 1
+      },
+      // 删除参数
+      deledlid: {
+        table: '',
+        idList: []
+      },
+      jeigneu: [],
+      jeigneutwo: [],
+      xidugje: 0,
+      tijeq: 0,
+      imgShoew: 0,
+      tablees: -1,
+      juegkae: '',
+      tabdiese: '',
+      cielsshow: false,
+      oieufr: 0,
+      ojeuduj: 0,
+      juegh: {},
+      oejgtueo: {
+        businessCode: 0
+      },
+      instanceId: 0,
+      modalShow: false,
+      // 无限滚动
+      count: 0,
+      data: [
+        {
+          id: 1,
+          label: '一级 1',
+          children: [
+            {
+              id: 4,
+              label: '二级 1-1',
+              children: [
+                {
+                  id: 9,
+                  label: '三级 1-1-1'
+                },
+                {
+                  id: 10,
+                  label: '三级 1-1-2'
+                }
+              ]
+            }
+          ]
         },
-        oejgtueo:{
-          businessCode:0
+        {
+          id: 2,
+          label: '一级 2',
+          children: [
+            {
+              id: 5,
+              label: '二级 2-1'
+            },
+            {
+              id: 6,
+              label: '二级 2-2'
+            }
+          ]
         },
-        instanceId: 0,
-        modalShow:false,
-        // 无限滚动
-        count: 0
-      };
-    },
-    mounted() {
-      this.deledlid.idList = []
-      this.formeanti.table = this.$route.query.tables
-      this.instanceId = this.$route.query.id- 0
-      this.forme.table = this.$route.query.tables
-      this.forme.objId = this.$route.query.id
-      this.oejgtueo.businessCode = this.$route.query.id
-      this.tableZbie.table = this.$route.query.tables
-      this.tableZbie.fixedData.id = this.$route.query.id
-      this.juegh.businessCodes = this.$route.query.id - 0
-      this.juegh.businessTypeName = this.$route.query.tables
-      this.juegh.dbname = this.$route.query.tables
-      this.formy.id = this.$route.query.id
-      this.deledlid.table = this.$route.query.tables
-      this.ojeuduj = this.$route.query.id
-      this.deledlid.idList.push(this.$route.query.id)
-      if (this.$route.query.tabfe) {
-        this.tablees = this.$route.query.tabfe
-        this.juegkae = this.$route.query.tabik + '_id'
-        this.tabdiese = this.$route.query.tabik
-        console.log(this.juegkae)
-      } else {
-        this.tablees = undefined
-        this.juegkae = undefined
-        this.tabdiese = this.$route.query.tabik
-      }
-      this.init()
-      this.getUser()
-      // this.tablsie()
-    },
-    methods: {
-      iChange(name, val) {
-        for (let item of this.queryData.showData) {
-          for (let itemChild of item.hrChildren) {
-            if (itemChild.columnName == name) {
-              itemChild.columnValue = (val ? val : null)
+        {
+          id: 3,
+          label: '一级 3',
+          children: [
+            {
+              id: 7,
+              label: '二级 3-1'
+            },
+            {
+              id: 8,
+              label: '二级 3-2'
             }
-          }
+          ]
         }
+      ],
+      defaultProps: {
+        children: 'children',
+        label: 'label'
       },
-      modelFn(obj, cont) {
-        this.$set(this.queryParams, obj, cont)
-      },
-      changeFn(obj) {
-        for (let key in obj) {
-          this.queryParams[key] = obj[key]
+      activeName:''
+    };
+  },
+  mounted() {
+    this.deledlid.idList = [];
+    this.formeanti.table = this.$route.query.tables;
+    this.instanceId = this.$route.query.id - 0;
+    this.forme.table = this.$route.query.tables;
+    this.forme.objId = this.$route.query.id;
+    this.oejgtueo.businessCode = this.$route.query.id;
+    this.tableZbie.table = this.$route.query.tables;
+    this.tableZbie.fixedData.id = this.$route.query.id;
+    this.juegh.businessCodes = this.$route.query.id - 0;
+    this.juegh.businessTypeName = this.$route.query.tables;
+    this.juegh.dbname = this.$route.query.tables;
+    this.formy.id = this.$route.query.id;
+    this.deledlid.table = this.$route.query.tables;
+    this.ojeuduj = this.$route.query.id;
+    this.deledlid.idList.push(this.$route.query.id);
+    if (this.$route.query.tabfe) {
+      this.tablees = this.$route.query.tabfe;
+      this.juegkae = this.$route.query.tabik + '_id';
+      this.tabdiese = this.$route.query.tabik;
+      console.log(this.juegkae);
+    } else {
+      this.tablees = undefined;
+      this.juegkae = undefined;
+      this.tabdiese = this.$route.query.tabik;
+    }
+    this.init();
+    this.getUser();
+    // this.tablsie()
+  },
+  methods: {
+    iChange(name, val) {
+      for (let item of this.queryData.showData) {
+        for (let itemChild of item.hrChildren) {
+          if (itemChild.columnName == name) {
+            itemChild.columnValue = val ? val : null;
+          }
         }
-      },
-      resetQuery() {
-
-      },
-      /** 搜索按钮操作 */
-      handleQuery(index) {
-        console.log(index)
-        for (let item of this.queryData.showData) {
-          for (var i = 0; i < item.hrChildren.length; i++) {
-            if (item.hrChildren[i].htmlType == 'checkbox') {
-              this.queryParams[item.hrChildren[i].columnName] = this.$refs[item.hrChildren[i].columnName][0].config
-            } else if (item.hrChildren[i].htmlType == 'imageUpload' || item.hrChildren[i].htmlType == 'fileUpload') {
-              if (this.$refs[item.hrChildren[i].columnName][0].config.length) {
-                this.queryParams[item.hrChildren[i].columnName] = JSON.stringify(this.$refs[item.hrChildren[i].columnName][0].config)
-              }
-            } else if (item.hrChildren[i].htmlType == 'datetime') {
-              if (this.$refs[item.hrChildren[i].columnName][0].config[item.hrChildren[i].columnName]) {
-                this.queryParams[item.hrChildren[i].columnName] = this.$refs[item.hrChildren[i].columnName][0].config[item.hrChildren[i].columnName]
-              } else {
-                this.queryParams[item.hrChildren[i].columnName] = null
-              }
+      }
+    },
+    modelFn(obj, cont) {
+      this.$set(this.queryParams, obj, cont);
+    },
+    closepop(obj){
+      this.modalShow = true
+     console.log(obj)
+    },
+    changeFn(obj) {
+      for (let key in obj) {
+        this.queryParams[key] = obj[key];
+      }
+    },
+    resetQuery() {},
+    /** 搜索按钮操作 */
+    handleQuery(index) {
+      console.log(index);
+      // this.modalShow = true;
+      for (let item of this.queryData.showData) {
+        for (var i = 0; i < item.hrChildren.length; i++) {
+          if (item.hrChildren[i].htmlType == 'checkbox') {
+            this.queryParams[item.hrChildren[i].columnName] = this.$refs[item.hrChildren[i].columnName][0].config;
+          } else if (item.hrChildren[i].htmlType == 'imageUpload' || item.hrChildren[i].htmlType == 'fileUpload') {
+            if (this.$refs[item.hrChildren[i].columnName][0].config.length) {
+              this.queryParams[item.hrChildren[i].columnName] = JSON.stringify(this.$refs[item.hrChildren[i].columnName][0].config);
+            }
+          } else if (item.hrChildren[i].htmlType == 'datetime') {
+            if (this.$refs[item.hrChildren[i].columnName][0].config[item.hrChildren[i].columnName]) {
+              this.queryParams[item.hrChildren[i].columnName] = this.$refs[item.hrChildren[i].columnName][0].config[item.hrChildren[i].columnName];
             } else {
-              this.queryParams[item.hrChildren[i].columnName] = this.$refs[item.hrChildren[i].columnName][0].config[
-                item.hrChildren[i].columnName]
+              this.queryParams[item.hrChildren[i].columnName] = null;
             }
+          } else {
+            this.queryParams[item.hrChildren[i].columnName] = this.$refs[item.hrChildren[i].columnName][0].config[item.hrChildren[i].columnName];
           }
         }
-        if (this.queryParams.pageNum !== undefined) {
-          this.queryParams.pageNum = undefined
-        }
-        if (this.queryParams.pageSize !== undefined) {
-          this.queryParams.pageSize = undefined
-        }
-
-        if (index == '删除') {
-          //删除
-          this.handleDelete(this.deledlid)
-        } else if (index == '提交') {
-          //提交  保存
-          this.formeanti.commitData = []
-          this.formy.status = 4
-          this.formeanti.commitData.push(this.formy)
-          this.antiSubmission()
-        } else if (index == '反提交') {
-          //反提交  保存
-          this.formeanti.commitData = []
-          this.formy.status = 2
-          this.formeanti.commitData.push(this.formy)
-          this.antiSubmission()
-        } else if (index == '保存') {
-          // 修改
-          this.forme.fixedData = this.queryParams
-          this.forme.fixedData[this.juegkae] = this.tablees
-          this.submitForm()
-        } else if (index == '新增') {
-          //新增
-          this.xidugje = 0
-          this.reload()
-        } else if (index == '返回') {
-          this.$store.dispatch("tagsView/delView", this.$route);
-          this.$router.go(-1)
-        } else if (index == '刷新') {
-          this.xidugje = 1
-          this.reload()
-        }else if(index == '流程详情'){
-          console.log(23)
-         this.modalShow = true
-        }
-        // this.getList();
-      },
-      getList() {
+      }
+      if (this.queryParams.pageNum !== undefined) {
+        this.queryParams.pageNum = undefined;
+      }
+      if (this.queryParams.pageSize !== undefined) {
+        this.queryParams.pageSize = undefined;
+      }
 
-      },
-      init() {
-        getTableQuery(
-          this.tableZbie
-        ).then(res => {
-          let data = res.data
-          this.juegh.businessType = res.data.showData[0].tableId
-          console.log(res.data.showData[0].tableId)
-          this.queryData = {}
-          this.queryData = data
-          // imgShoew
-          this.jeigneutwo = []
+      if (index == '删除') {
+        //删除
+        this.handleDelete(this.deledlid);
+      } else if (index == '提交') {
+        //提交  保存
+        this.formeanti.commitData = [];
+        this.formy.status = 4;
+        this.formeanti.commitData.push(this.formy);
+        this.antiSubmission();
+      } else if (index == '反提交') {
+        //反提交  保存
+        this.formeanti.commitData = [];
+        this.formy.status = 2;
+        this.formeanti.commitData.push(this.formy);
+        this.antiSubmission();
+      } else if (index == '保存') {
+        // 修改
+        this.forme.fixedData = this.queryParams;
+        this.forme.fixedData[this.juegkae] = this.tablees;
+        this.submitForm();
+      } else if (index == '新增') {
+        //新增
+        this.xidugje = 0;
+        this.reload();
+      } else if (index == '返回') {
+        this.$store.dispatch('tagsView/delView', this.$route);
+        this.$router.go(-1);
+      } else if (index == '刷新') {
+        this.xidugje = 1;
+        this.reload();
+      } else if (index == '流程详情') {
+        console.log(23);
+        // this.modalShow = true;
+      }
 
-          this.jeigneu = []
-          if(data.buttonList !== ''){
-            this.jeigneu = data.buttonList.split('')
-          }else{
-            this.jeigneu = []
-            this.jeigneutwo.push('流程详情')
+      // this.getList();
+    },
+    getList() {},
+    init() {
+      this.jeigneutwo.push('流程详情');
+      getTableQuery(this.tableZbie).then(res => {
+        let data = res.data;
+        this.juegh.businessType = res.data.showData[0].tableId;
+        console.log(res.data.showData[0].tableId);
+        this.queryData = {};
+        this.queryData = data;
+        // imgShoew
+        this.jeigneutwo = [];
+
+        this.jeigneu = [];
+        if (data.buttonList !== '') {
+          this.jeigneu = data.buttonList.split('');
+        } else {
+          this.jeigneu = [];
+          this.jeigneutwo.push('流程详情');
+        }
+        // console.log(data.buttonList)
 
+        this.jeigneu.filter(route => {
+          if (route == 'A') {
+            if (this.formy.id == -1) {
+              route = '保存';
+              this.jeigneutwo.push(route);
+            } else {
+              route = '新增';
+            }
+          } else if (route == 'M') {
+            route = '保存';
+            // if (this.formy.id != -1) {
+            this.jeigneutwo.push(route);
+            // }
+          } else if (route == 'D') {
+            route = '删除';
+            // if (this.formy.id != -1) {
+            this.jeigneutwo.push(route);
+            // }
+          } else if (route == 'Q') {
+            route = '查询';
+            this.jeigneutwo.push(route);
+          } else if (route == 'S') {
+            route = '提交';
+            // if (this.formy.id != -1) {
+            this.jeigneutwo.push(route);
+            // }
+          } else if (route == 'U') {
+            route = '反提交';
+            // if (this.formy.id != -1) {
+            this.jeigneutwo.push(route);
+            // }
+          } else if (route == 'I') {
+            route = '导入';
+            this.jeigneutwo.push(route);
+          } else if (route == 'E') {
+            route = '导出';
+            this.jeigneutwo.push(route);
+          }
+        });
+        this.jeigneutwo.push('刷新');
+        this.jeigneutwo.push('返回');
+        if (this.xidugje == '刷新') {
+          if (res.code == 200) {
+            this.msgSuccess('操作成功');
           }
-          // console.log(data.buttonList)
+        }
+        // 图片的显示隐藏
+        if (this.queryData.showData.length !== 0) {
+          this.queryData.showData.filter(route => {
+            route.hrChildren.filter(routerst => {
+              if (this.queryData.table_column == undefined) {
+                this.queryData.table_column = null;
+              }
+              routerst.tableColumnuy = this.queryData.table_column;
+              routerst.tableid = this.ojeuduj;
+            });
+            if (route.cssClass !== null) {
+              this.imgShoew = route.cssClass;
 
-          this.jeigneu.filter(route => {
-            if (route == 'A') {
-              if (this.formy.id == -1) {
-                route = '保存'
-                this.jeigneutwo.push(route)
+              if (route.cssClass == 2 || route.cssClass == 4) {
+                route.hrChildren.filter(routers => {
+                  routers.isonliy = true;
+                });
               } else {
-                route = '新增'
+                route.hrChildren.filter(routers => {
+                  routers.isonliy = false;
+                });
+              }
+              if (this.imgShoew == 3) {
               }
-
-            } else if (route == 'M') {
-              route = '保存'
-              // if (this.formy.id != -1) {
-                this.jeigneutwo.push(route)
-              // }
-            } else if (route == 'D') {
-              route = '删除'
-              // if (this.formy.id != -1) {
-                this.jeigneutwo.push(route)
-              // }
-            } else if (route == 'Q') {
-              route = '查询'
-              this.jeigneutwo.push(route)
-            } else if (route == 'S') {
-              route = '提交'
-              // if (this.formy.id != -1) {
-                this.jeigneutwo.push(route)
-              // }
-            } else if (route == 'U') {
-              route = '反提交'
-              // if (this.formy.id != -1) {
-                this.jeigneutwo.push(route)
-              // }
-            } else if (route == 'I') {
-              route = '导入'
-              this.jeigneutwo.push(route)
-            } else if (route == 'E') {
-              route = '导出'
-              this.jeigneutwo.push(route)
             }
-
-          })
-           this.jeigneutwo.push('刷新')
-           this.jeigneutwo.push('返回')
-          if (this.xidugje == '刷新') {
-            if (res.code == 200) {
-              this.msgSuccess("操作成功");
+          });
+        }
+      });
+    },
+    tablsie() {
+      getQueryList(this.tabledeLise).then(res => {
+        let data = res.data;
+        this.taleLisst = data;
+      });
+    },
+    handleChange(val) {},
+    // 按钮点击
+    delet(index) {
+      if (index == 'D') {
+        this.handleDelete(this.formy.id);
+      }
+    },
+    /** 新增 修改提交按钮 */
+    submitForm: function() {
+      this.$refs['queryForm'].validate(valid => {
+        if (valid) {
+          addbjectSave(this.forme).then(response => {
+            this.msgSuccess('保存成功');
+            if (response.code == 200) {
+              this.cielsshow = true;
+            } else {
+              this.cielsshow = false;
             }
-          }
-          // 图片的显示隐藏
-          if (this.queryData.showData.length !== 0) {
-            this.queryData.showData.filter(route => {
-              route.hrChildren.filter(routerst => {
-                if (this.queryData.table_column == undefined) {
-                  this.queryData.table_column = null
-                }
-                routerst.tableColumnuy = this.queryData.table_column
-                routerst.tableid = this.ojeuduj
-              })
-              if (route.cssClass !== null) {
-                this.imgShoew = route.cssClass
-
-                if (route.cssClass == 2 || route.cssClass == 4) {
-                  route.hrChildren.filter(routers => {
-                    routers.isonliy = true
-                  })
-                } else {
-                  route.hrChildren.filter(routers => {
-                    routers.isonliy = false
-                  })
-                }
-                if(this.imgShoew == 3){
-                }
-              }
-            })
-          }
-        })
-      },
-      tablsie() {
-        getQueryList(
-          this.tabledeLise
-        ).then(res => {
-          let data = res.data
-          this.taleLisst = data
-        })
-      },
-      handleChange(val) {
-      },
-      // 按钮点击
-      delet(index) {
-        if (index == 'D') {
-          this.handleDelete(this.formy.id)
+            let query = Object.assign({ id: response.data, tables: this.forme.table }, {});
+            this.oieufr = response.data;
+            // this.mounted()
+            this.$store.dispatch('tagsView/delView', this.$route);
+            this.$router.go(-1);
+          });
         }
-      },
-      /** 新增 修改提交按钮 */
-      submitForm: function () {
-        this.$refs["queryForm"].validate(valid => {
-          if (valid) {
-            addbjectSave(this.forme).then(response => {
-              this.msgSuccess("保存成功");
-              if (response.code == 200) {
-                this.cielsshow = true;
-              } else {
-                this.cielsshow = false;
-              }
-              let query = Object.assign({'id': response.data, 'tables': this.forme.table}, {})
-              this.oieufr = response.data
-              // this.mounted()
-              this.$store.dispatch("tagsView/delView", this.$route);
-              this.$router.go(-1)
+      });
+    },
+    // 提交反提交
+    antiSubmission() {
+      this.$refs['queryForm'].validate(valid => {
+        if (valid) {
+          if (this.formy.status == 4) {
+            // 提交
+            tableSubimt(this.formeanti).then(response => {
+              // this.msgSuccess("提交成功");
+              this.$store.dispatch('tagsView/delView', this.$route);
+              this.submoii();
+              // this.$router.go(-1)
+              // this.getList();
+            });
+          } else if (this.formy.status == 2) {
+            // 反提交
+            tableSubimtanit(this.formeanti).then(response => {
+              this.msgSuccess('反提交成功');
+              this.$store.dispatch('tagsView/delView', this.$route);
+              this.$router.go(-1);
+              // this.getList();
             });
           }
-        });
-      },
-      // 提交反提交
-      antiSubmission() {
-        this.$refs["queryForm"].validate(valid => {
-          if (valid) {
-            if (this.formy.status == 4) {
-              // 提交
-              tableSubimt(this.formeanti).then(response => {
-                // this.msgSuccess("提交成功");
-                this.$store.dispatch("tagsView/delView", this.$route);
-                this.submoii()
-                // this.$router.go(-1)
-                // this.getList();
-              });
-            } else if (this.formy.status == 2) {
-              // 反提交
-              tableSubimtanit(this.formeanti).then(response => {
-                this.msgSuccess("反提交成功");
-                this.$store.dispatch("tagsView/delView", this.$route);
-                this.$router.go(-1)
-                // this.getList();
-              });
-            }
-          }
-        });
-      },
-      // 提交2.0
-      submoii(){
-       tabsubm(this.juegh).then(response => {
-         if(response.resultCode == 0){
-           this.msgSuccess("提交成功");
-         }
-         this.$store.dispatch("tagsView/delView", this.$route);
-         this.reload()
-         // this.$router.go(-1)
-         // this.formeanti.commitData = []
-         // this.formy.status = 1
-         // this.formeanti.commitData.push(this.formy)
-         // this.antiSubmission();
-       });
-      },
-      getUser() {
-        getUserProfiletab().then(response => {
-          this.juegh.initiator = response.data.id
-          this.juegh.userName = response.data.userName
-          console.log(response.data,877)
-        });
-      },
-      //删除
-      handleDelete(index) {
-        this.$confirm('是否确认删除', "警告", {
-          confirmButtonText: "确定",
-          cancelButtonText: "取消",
-          type: "warning"
-        }).then(function () {
+        }
+      });
+    },
+    // 提交2.0
+    submoii() {
+      tabsubm(this.juegh).then(response => {
+        if (response.resultCode == 0) {
+          this.msgSuccess('提交成功');
+        }
+        this.$store.dispatch('tagsView/delView', this.$route);
+        this.reload();
+        // this.$router.go(-1)
+        // this.formeanti.commitData = []
+        // this.formy.status = 1
+        // this.formeanti.commitData.push(this.formy)
+        // this.antiSubmission();
+      });
+    },
+    getUser() {
+      getUserProfiletab().then(response => {
+        this.juegh.initiator = response.data.id;
+        this.juegh.userName = response.data.userName;
+        console.log(response.data, 877);
+      });
+    },
+    //删除
+    handleDelete(index) {
+      this.$confirm('是否确认删除', '警告', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      })
+        .then(function() {
           return delMenutab(index);
-        }).then(() => {
-          // this.getList();
-          this.msgSuccess("删除成功");
-          this.$store.dispatch("tagsView/delView", this.$route);
-          this.$router.go(-1)
         })
-      },
-      load(){
-        this.count += 2
-      }
+        .then(() => {
+          // this.getList();
+          this.msgSuccess('删除成功');
+          this.$store.dispatch('tagsView/delView', this.$route);
+          this.$router.go(-1);
+        });
+    },
+    load() {
+      this.count += 2;
+    },
+    // 树形结构
+    handleNodeClick(data) {
+      console.log(data);
     },
-  };
+    // getCheckedKeys(leafOnly) {
+    //   console.log(leafOnly)
+    //   console.log(this.$refs.tree.getCheckedKeys());
+    // },
+    setCheckedKeys(keys, leafOnly) {
+      console.log(keys, leafOnly)
+      this.$refs.tree.setCheckedKeys([3]);
+    },
+    resetChecked() {
+      this.$refs.tree.setCheckedKeys([]);
+    },
+    handleClick(){
+
+    },
+    check(data,value){
+      console.log(this.$refs.tree.getCheckedKeys());
+       // 获取选中的子节点
+      // let checkedKeys = this.$refs.tree.getCheckedKeys();
+      // 获取选中的父节点
+      let hafCheckedKeys = this.$refs.tree.getHalfCheckedKeys();
+      console.log(this.$refs.tree.getHalfCheckedKeys())
+
+      console.log(data,value)
+
+    }
+  }
+};
 </script>
 
 <style lang="scss">
-  .table_header {
-    position: relative;
-    .el-divider--horizontal {
-      margin-top: 16px;
-    }
+.table_header {
+  position: relative;
+  .el-divider--horizontal {
+    margin-top: 16px;
   }
+}
 
-  .table_forem {
-    .el-form--inline .el-form-item {
-      width: 100% !important;
-    }
-    .el-select {
-      width: 100%;
-    }
-    .el-date-editor.el-input {
-      width: 100% !important;
-    }
-    .el-form-item--medium .el-form-item__content {
-      width: 70%;
-    }
+.table_forem {
+  .el-form--inline .el-form-item {
+    width: 100% !important;
+  }
+  .el-select {
+    width: 100%;
   }
+  .el-date-editor.el-input {
+    width: 100% !important;
+  }
+  .el-form-item--medium .el-form-item__content {
+    width: 70%;
+  }
+}
 
-  .headertable_nav {
-    .el-collapse-item__wrap {
-      border-bottom: 0;
-    }
-    .el-collapse-item__header {
-      border-bottom: 0;
-      font-size: 15px;
-      font-family: PingFang SC;
-      font-weight: bold;
-      color: #3C8DBC;
-      line-height: 36px;
-    }
-    // .el-form-item__content{
-    //   width: 55%;
-    // }
-    .el-collapse {
-      border-top: 0;
-    }
+.headertable_nav {
+  .el-collapse-item__wrap {
+    border-bottom: 0;
   }
-   .infinite-list{
-     height: 200px;
-   }
-   .tab_bott{
-     display: flex;
-   }
-  .tabBot_oje{
-    width: 40%;
+  .el-collapse-item__header {
+    border-bottom: 0;
+    font-size: 15px;
+    font-family: PingFang SC;
+    font-weight: bold;
+    color: #3c8dbc;
+    line-height: 36px;
   }
-  .tabBot_two{
-    width: 50%;
-    margin-left: 30px;
+  // .el-form-item__content{
+  //   width: 55%;
+  // }
+  .el-collapse {
+    border-top: 0;
   }
+}
+.infinite-list {
+  height: 200px;
+}
+.tab_bott {
+  display: flex;
+}
+.tabBot_oje {
+  width: 40%;
+}
+.tabBot_two {
+  width: 50%;
+  margin-left: 30px;
+}
 </style>
 
-
 <style scoped lang="scss">
-  .app-main {
-    // background-color: #eef0ff !important;
-  }
-
-  .table_total {
-    background-color: #eef0ff;
-    height: 100%;
-    padding: 20px;
-    // 头部
-    .table_header {
-      background-color: #fff;
-      border-radius: 6px;
-      padding: 13px;
-      margin-bottom: 10px;
-      p {
-        font-size: 15px;
-        font-weight: bold;
-        color: #3C8DBC;
-        line-height: 36px;
-      }
-      p::before {
-        content: "";
-        display: block;
-        width: 18px;
-        height: 8px;
-        background: #3C8DBC;
-        border-radius: 3px;
-
-      }
-      .table_headerBtuntwo {
-        margin-bottom: 0 !important;
-      }
+.app-main {
+  // background-color: #eef0ff !important;
+}
+
+.table_total {
+  background-color: #eef0ff;
+  height: 100%;
+  padding: 20px;
+  // 头部
+  .table_header {
+    background-color: #fff;
+    border-radius: 6px;
+    padding: 13px;
+    margin-bottom: 10px;
+    p {
+      font-size: 15px;
+      font-weight: bold;
+      color: #3c8dbc;
+      line-height: 36px;
     }
-    // 内容
-    .headertable_nav {
-      background-color: #fff;
-      border-radius: 6px;
-      padding: 23px;
+    p::before {
+      content: '';
+      display: block;
+      width: 18px;
+      height: 8px;
+      background: #3c8dbc;
+      border-radius: 3px;
+    }
+    .table_headerBtuntwo {
+      margin-bottom: 0 !important;
     }
   }
-
-  p {
-    margin: 0;
-
-  }
-
-  .imge_tab {
-    position: absolute;
-    right: 0;
-    top: 5px;
-  }
-  .infinite-list{
-    // border: 1px solid #eee;
-    padding: 30px;
-  }
-  .infinite-listty{
-    margin-top: 20px;
-    // border: 1px solid #eee;
+  // 内容
+  .headertable_nav {
+    background-color: #fff;
+    border-radius: 6px;
+    padding: 23px;
   }
+}
+
+p {
+  margin: 0;
+}
+
+.imge_tab {
+  position: absolute;
+  right: 0;
+  top: 5px;
+}
+.infinite-list {
+  // border: 1px solid #eee;
+  padding: 30px;
+}
+.infinite-listty {
+  margin-top: 20px;
+  // border: 1px solid #eee;
+}
 </style>
 
-
 <style scoped lang="scss">
-  .app-main {
-    // background-color: #eef0ff !important;
-  }
-
-  .table_total {
-    background-color: #eef0ff;
-    height: 100%;
-    padding: 20px;
+.app-main {
+  // background-color: #eef0ff !important;
+}
 
-    // 头部
-    .table_header {
-      background-color: #fff;
-      border-radius: 6px;
-      padding: 13px;
-      margin-bottom: 10px;
+.table_total {
+  background-color: #eef0ff;
+  height: 100%;
+  padding: 20px;
 
-      p {
-        font-size: 15px;
-        font-weight: bold;
-        color: #3C8DBC;
-        line-height: 36px;
-      }
-
-      p::before {
-        content: "";
-        display: block;
-        width: 18px;
-        height: 8px;
-        background: #3C8DBC;
-        border-radius: 3px;
+  // 头部
+  .table_header {
+    background-color: #fff;
+    border-radius: 6px;
+    padding: 13px;
+    margin-bottom: 10px;
 
-      }
+    p {
+      font-size: 15px;
+      font-weight: bold;
+      color: #3c8dbc;
+      line-height: 36px;
     }
 
-    // 内容
-    .headertable_nav {
-      background-color: #fff;
-      border-radius: 6px;
-      padding: 23px;
-      padding-top: 0;
+    p::before {
+      content: '';
+      display: block;
+      width: 18px;
+      height: 8px;
+      background: #3c8dbc;
+      border-radius: 3px;
     }
   }
 
-  p {
-    margin: 0;
-
+  // 内容
+  .headertable_nav {
+    background-color: #fff;
+    border-radius: 6px;
+    padding: 23px;
+    padding-top: 0;
   }
+}
+
+p {
+  margin: 0;
+}
 </style>

Энэ ялгаанд хэт олон файл өөрчлөгдсөн тул зарим файлыг харуулаагүй болно