Ver código fonte

增加实体保存自动填充,过滤器解析post

xusl 2 anos atrás
pai
commit
74717e8968

+ 2 - 2
backend/src/main/java/com/jiayue/ssi/config/WebSecurityConfig.java

@@ -60,8 +60,8 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
     protected void configure(HttpSecurity httpSecurity) throws Exception {
         httpSecurity.addFilterBefore(new InterfaceLimitFilter(), UsernamePasswordAuthenticationFilter.class);
         httpSecurity.addFilterBefore(new VerifySmFilter(), UsernamePasswordAuthenticationFilter.class);
-        httpSecurity.addFilterBefore(new VerifyCodeFilter(), UsernamePasswordAuthenticationFilter.class);
-        httpSecurity.addFilterBefore(new MailCodeFilter(), UsernamePasswordAuthenticationFilter.class);
+//        httpSecurity.addFilterBefore(new VerifyCodeFilter(), UsernamePasswordAuthenticationFilter.class);
+//        httpSecurity.addFilterBefore(new MailCodeFilter(), UsernamePasswordAuthenticationFilter.class);
         httpSecurity.addFilterBefore(jwtAuthenticationTokenFilter, UsernamePasswordAuthenticationFilter.class);
         httpSecurity
                 // 由于使用的是JWT,我们这里不需要csrf

+ 70 - 24
backend/src/main/java/com/jiayue/ssi/controller/SysUserController.java

@@ -1,13 +1,18 @@
 package com.jiayue.ssi.controller;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.jiayue.ssi.entity.SysUser;
 import com.jiayue.ssi.service.SysUserService;
 import com.jiayue.ssi.util.ResponseVO;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
-import java.util.List;
+import javax.servlet.http.HttpServletRequest;
 
 /**
  * 用户信息controller
@@ -23,16 +28,26 @@ public class SysUserController {
     SysUserService sysUserService;
 
     /**
-     * 获取用户信息
+     * 获取用户分页信息
      *
      * @return 用户信息
      */
 
     @GetMapping(value = "/getAll")
-    public ResponseVO getAll() {
+    public ResponseVO getAll(Integer currentPage, Integer pageSize, String username,String password,String status) {
         try {
-            List<SysUser> ps = sysUserService.queryAllUsers();
-            return ResponseVO.success(ps);
+            QueryWrapper<SysUser> wrapper = new QueryWrapper<>();
+            if(StringUtils.isNotEmpty(username)){
+                wrapper.eq("username",username);
+            }
+            if(StringUtils.isNotEmpty(password)){
+                wrapper.eq("password",password);
+            }
+            if(StringUtils.isNotEmpty(status)){
+                wrapper.eq("status",status);
+            }
+            Page<SysUser> result = sysUserService.page(new Page<>(currentPage,pageSize),wrapper);
+            return ResponseVO.success(result);
         } catch (Exception e) {
             e.printStackTrace();
             log.error(" 获取所有用户异常");
@@ -41,28 +56,59 @@ public class SysUserController {
     }
 
     /**
-     * 保存用户信息
-     *
-     * @param sysUser 参数
-     * @return 执行结果
+     * 新增用户
      */
-    @PostMapping(value = "sysUser/")
-    public ResponseVO save(@RequestBody SysUser sysUser) {
-        try {
-            boolean bo = sysUserService.saveUser(sysUser);
-            if (bo){
-                return ResponseVO.success("保存用户信息成功");
-            }
-            else{
-                log.error("保存用户信息失败");
-                return ResponseVO.fail();
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-            log.error("保存用户信息异常");
-            return ResponseVO.fail("保存用户信息异常");
+    @PostMapping
+    public ResponseVO add(@RequestBody SysUser user, HttpServletRequest request) {
+        if (StringUtils.isEmpty(user.getUsername())){
+            return ResponseVO.fail("用户账号不能为空!");
+        }
+        else if (sysUserService.queryUserName(user.getUsername())!=null){
+            return ResponseVO.fail(user.getUsername() + "账号已存在!");
+        }
+
+        if (StringUtils.isEmpty(user.getPhonenumber())) {
+            return ResponseVO.fail("手机号码不能为空!");
+        }
+        if (StringUtils.isEmpty(user.getNickname())) {
+            return ResponseVO.fail("姓名不能为空!");
         }
+
+        if (StringUtils.isEmpty(user.getMailbox())){
+            return ResponseVO.fail("邮箱不能为空!");
+        }
+        else if (sysUserService.queryMailBox(user.getMailbox())!=null){
+            return ResponseVO.fail(user.getMailbox() + "邮箱已存在!");
+        }
+
+//        user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
+        // 生成初始密码
+
+        return ResponseVO.success(sysUserService.save(user));
     }
+//    /**
+//     * 保存用户信息
+//     *
+//     * @param sysUser 参数
+//     * @return 执行结果
+//     */
+//    @PostMapping(value = "sysUser/")
+//    public ResponseVO save(@RequestBody SysUser sysUser) {
+//        try {
+//            boolean bo = sysUserService.saveUser(sysUser);
+//            if (bo){
+//                return ResponseVO.success("保存用户信息成功");
+//            }
+//            else{
+//                log.error("保存用户信息失败");
+//                return ResponseVO.fail();
+//            }
+//        } catch (Exception e) {
+//            e.printStackTrace();
+//            log.error("保存用户信息异常");
+//            return ResponseVO.fail("保存用户信息异常");
+//        }
+//    }
 
     /**
      * 更新用户信息

+ 34 - 13
backend/src/main/java/com/jiayue/ssi/controller/UserLoginController.java

@@ -1,5 +1,7 @@
 package com.jiayue.ssi.controller;
 
+import cn.hutool.captcha.CaptchaUtil;
+import cn.hutool.captcha.CircleCaptcha;
 import com.jiayue.ssi.annotation.InterfaceLimit;
 import com.jiayue.ssi.constant.CacheConstants;
 import com.jiayue.ssi.entity.SysUser;
@@ -58,30 +60,49 @@ public class UserLoginController {
         // ArithmeticCaptcha captcha = new ArithmeticCaptcha(130, 48);
         // png类型
         // 三个参数分别为宽、高、位数
-         SpecCaptcha captcha = new SpecCaptcha(150, 40, 4);
-        /**
-         * 验证码字符类型 TYPE_DEFAULT 数字和字母混合 TYPE_ONLY_NUMBER 纯数字 TYPE_ONLY_CHAR 纯字母 TYPE_ONLY_UPPER 纯大写字母 TYPE_ONLY_LOWER
-         * 纯小写字母 TYPE_NUM_AND_UPPER 数字和大写字母
-         **/
-        // 设置类型 数字和字母混合
-        captcha.setCharType(Captcha.TYPE_DEFAULT);
-        // 设置字体
-        captcha.setCharType(Captcha.FONT_9);
+        String textcode="";
+        String base64 = "";
+        while (true) {
+            SpecCaptcha captcha = new SpecCaptcha(150, 40, 4);
+            /**
+             * 验证码字符类型 TYPE_DEFAULT 数字和字母混合 TYPE_ONLY_NUMBER 纯数字 TYPE_ONLY_CHAR 纯字母 TYPE_ONLY_UPPER 纯大写字母 TYPE_ONLY_LOWER
+             * 纯小写字母 TYPE_NUM_AND_UPPER 数字和大写字母
+             **/
+            // 设置类型 数字和字母混合
+            captcha.setCharType(Captcha.TYPE_DEFAULT);
+            // 设置字体
+            captcha.setCharType(Captcha.FONT_9);
+            int digits = 0;
+            char[] text = captcha.textChar();
+            for (int i = 0; i < text.length; i++) {
+                if (Character.isDigit(text[i])) {
+                    digits++;
+                }
+            }
+            if (digits == 0 || digits == 4) {
+                // 重新生成
+            }
+            else{
+                textcode = String.valueOf(text);
+                base64 = captcha.toBase64();
+                break;
+            }
+        }
 
         String uuid = IdUtils.simpleUUID();
         String verifyKey = CacheConstants.CAPTCHA_CODE_KEY + uuid;
         // uuid存入缓存,失效时间默认5分钟
-        LocalCache.set(verifyKey, captcha.text());
+        LocalCache.set(verifyKey, textcode);
         // 输出图片流
         // captcha.out(httpServletResponse.getOutputStream());
-        String base64 = captcha.toBase64();
+
         int index = base64.indexOf(",");
         String substring = base64.substring(index + 1);
 
         Map<String, String> dataMap = new HashMap<>(16);
         dataMap.put("uuid", uuid);
         dataMap.put("imgBase64", substring);
-        dataMap.put("captchaText", captcha.text());
+        dataMap.put("captchaText", textcode);
         return ResponseVO.success(dataMap);
     }
 
@@ -105,7 +126,7 @@ public class UserLoginController {
             MimeMessage mimeMessage = javaMailSender.createMimeMessage();
             MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true, "utf-8");
             mimeMessageHelper.setFrom(fromMailAddress);
-            mimeMessageHelper.setTo(sysUser.getMailBox());
+            mimeMessageHelper.setTo(sysUser.getMailbox());
             mimeMessageHelper.setSubject("邮箱验证码");
             // 生成6位邮箱口令
             String mailRandom = RandomUtil.mailRandom();

+ 33 - 22
backend/src/main/java/com/jiayue/ssi/entity/SysUser.java

@@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.userdetails.User;
 import org.springframework.security.core.userdetails.UserDetails;
 
 import java.util.Collection;
@@ -20,33 +21,43 @@ import java.util.Collection;
 @Data
 @EqualsAndHashCode(callSuper = false)
 @TableName(value = "t_sys_user")
-public class SysUser implements UserDetails {
-    @TableId(value = "C_ID", type = IdType.AUTO)
+public class SysUser extends BaseEntity implements UserDetails {
+    @TableId(value = "id", type = IdType.AUTO)
     private Integer id;
 
-    @TableField("C_LOCK_TIME")
-    private Long lockTime;
-
-    @TableField("C_NAME")
-    private String name;
-
-    @TableField("C_PASSWORD")
+    /**
+     * 用户账号
+     */
+    private String username;
+    /**
+     * 用户密码
+     */
     private String password;
-
-    @TableField("C_PWD_ERR_NUM")
-    private Integer pwdErrNum;
-
-    @TableField("C_ROLES")
-    private String roles;
-
-    @TableField("C_STATUS")
+    /**
+     * 用户姓名
+     */
+    private String nickname;
+    /**
+     * 账号状态(0激活、1休眠、2注销)
+     */
     private String status;
+    /**
+     * 邮箱
+     */
+    private String mailbox;
+    /**
+     * 手机号码
+     */
+    private String phonenumber;
+    /**
+     * 失败次数
+     */
+    private Integer errNum;
+    /**
+     * 锁定时间
+     */
+    private Long lockTime;
 
-    @TableField("C_USERNAME")
-    private String username;
-
-    @TableField("C_MAIL_BOX")
-    private String mailBox;
 
     @Override
     public boolean isEnabled() {

+ 30 - 8
backend/src/main/java/com/jiayue/ssi/filter/VerifySmFilter.java

@@ -1,8 +1,10 @@
 package com.jiayue.ssi.filter;
 
+import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
 import com.jiayue.ssi.constant.SecretKeyConstants;
 import com.jiayue.ssi.servlet.ParameterRequestWrapper;
+import com.jiayue.ssi.util.JwtTokenUtil;
 import com.jiayue.ssi.util.ResponseInfo;
 import com.jiayue.ssi.util.SM2CryptUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -13,6 +15,7 @@ import javax.servlet.ServletException;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
+import java.nio.charset.StandardCharsets;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -45,6 +48,12 @@ public class VerifySmFilter extends OncePerRequestFilter {
                     ResponseInfo.doResponse(response,"token验签失败,不能访问系统!",401);
                     return;
                 }
+                JwtTokenUtil jwtTokenUtil = new JwtTokenUtil();
+                if (jwtTokenUtil.isTokenExpired(decryptTokenStr)){
+                    ResponseInfo.doResponse(response,"登录超时,请重新登录!",403);
+                    return;
+                }
+
                 initWrapper.addHeader("Authorization",decryptTokenStr);
             }
             else{
@@ -54,9 +63,19 @@ public class VerifySmFilter extends OncePerRequestFilter {
         }
         // 解密后的参数字符串
         String decryptStr = "";
+
         if ("POST".equalsIgnoreCase(request.getMethod())){
+
+                byte[] bytes = null;
+                try {
+                    bytes = initWrapper.getBodyContent(request).getBytes(StandardCharsets.UTF_8);
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+                String json = new String(bytes);
+                JSONObject jsonObject = JSONUtil.parseObj(json);
             // 验证加密的参数文本
-            String data_sm2 = request.getParameter("secretData");
+            String data_sm2 = jsonObject.getStr("secretData");
             if (StringUtils.isNotEmpty(data_sm2)){
                 try {
                     decryptStr = SM2CryptUtils.decrypt(data_sm2, SecretKeyConstants.SERVER_PRIVATE_KEY);
@@ -67,7 +86,7 @@ public class VerifySmFilter extends OncePerRequestFilter {
                     return;
                 }
                 // 验签前端参数
-                String paramSign = request.getParameter("paramSign");
+                String paramSign = jsonObject.getStr("paramSign");
                 try {
                     // 验证签名
                     boolean verifySign = SM2CryptUtils.verifySign(SecretKeyConstants.CLIENT_PUBLIC_KEY, decryptStr, paramSign);
@@ -83,11 +102,7 @@ public class VerifySmFilter extends OncePerRequestFilter {
                     return;
                 }
                 if (!"".equals(decryptStr)){
-                    String[] tempInterval = decryptStr.split("&");
-                    for (int i=0;i<tempInterval.length;i++){
-                        String[] fieldKeyValue = tempInterval[i].split("=");
-                        stringToMap.put(fieldKeyValue[0],fieldKeyValue[1]);
-                    }
+                    stringToMap = JSONUtil.parseObj(decryptStr);
                 }
             }
         }
@@ -132,7 +147,14 @@ public class VerifySmFilter extends OncePerRequestFilter {
             }
         }
 
-        ParameterRequestWrapper pr = new ParameterRequestWrapper(initWrapper, stringToMap);
+        ParameterRequestWrapper pr = null;
+        try {
+            pr = new ParameterRequestWrapper(initWrapper, stringToMap,decryptStr);
+        } catch (Exception e) {
+            e.printStackTrace();
+            ResponseInfo.doResponse(response,"访问失败,联系管理员!",401);
+            return;
+        }
         filterChain.doFilter(pr, response);
     }
 }

+ 8 - 1
backend/src/main/java/com/jiayue/ssi/service/SysUserService.java

@@ -1,5 +1,6 @@
 package com.jiayue.ssi.service;
 
+import com.baomidou.mybatisplus.extension.service.IService;
 import com.jiayue.ssi.entity.SysUser;
 import java.util.List;
 
@@ -8,7 +9,7 @@ import java.util.List;
 * @author xsl
 * @date 2023/2/16
 */
-public interface SysUserService {
+public interface SysUserService extends IService<SysUser> {
     /**
     * 获取所有用户
     * @return  List<SysUser>
@@ -38,4 +39,10 @@ public interface SysUserService {
      * @return SysUser
      */
     SysUser queryUserName(String username);
+    /**
+     * 根据邮箱查找
+     * @param mailbox
+     * @return SysUser
+     */
+    SysUser queryMailBox(String mailbox);
 }

+ 12 - 0
backend/src/main/java/com/jiayue/ssi/service/impl/SysUserServiceImpl.java

@@ -67,4 +67,16 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
         SysUser sysUser = sysUserMapper.selectOne(queryWrapper);
         return sysUser;
     }
+    /**
+     * 根据邮箱查找
+     * @param mailbox
+     * @return SysUser
+     */
+    @Override
+    public SysUser queryMailBox(String mailbox){
+        LambdaQueryWrapper<SysUser> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(SysUser::getMailbox,mailbox);
+        SysUser sysUser = sysUserMapper.selectOne(queryWrapper);
+        return sysUser;
+    }
 }

+ 1 - 1
backend/src/main/java/com/jiayue/ssi/service/impl/UserServiceImpl.java

@@ -23,7 +23,7 @@ public class UserServiceImpl implements UserDetailsService {
 
     @Override
     public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
-        SysUser sysUser = sysUserMapper.selectOne(new QueryWrapper<SysUser>().eq("c_name",username));
+        SysUser sysUser = sysUserMapper.selectOne(new QueryWrapper<SysUser>().eq("username",username));
         if (sysUser == null) {
             throw new UsernameNotFoundException("用户名错误!");
         }

+ 66 - 2
backend/src/main/java/com/jiayue/ssi/servlet/ParameterRequestWrapper.java

@@ -1,7 +1,16 @@
 package com.jiayue.ssi.servlet;
 
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import org.springframework.util.StreamUtils;
+
+import java.io.*;
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
 import java.util.*;
 
+import javax.servlet.ReadListener;
+import javax.servlet.ServletInputStream;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletRequestWrapper;
 
@@ -12,7 +21,7 @@ import javax.servlet.http.HttpServletRequestWrapper;
  * @since 2023/02/27
  */
 public class ParameterRequestWrapper extends HttpServletRequestWrapper {
-
+    private byte[] body;
     private Map<String, String[]> params = new HashMap<>();
     private Map<String, String> headerMap = new HashMap<>();
 
@@ -21,13 +30,46 @@ public class ParameterRequestWrapper extends HttpServletRequestWrapper {
         this.params.putAll(request.getParameterMap());
     }
 
-    public ParameterRequestWrapper(HttpServletRequest request, Map<String, Object> extendParams) {
+    public ParameterRequestWrapper(HttpServletRequest request, Map<String, Object> extendParams,String jsonStr) throws Exception{
         this(request);
         //这里将扩展参数写入参数表
         addAllParameters(extendParams);
+        if (!"".equals(jsonStr)){
+            InputStream stream = new ByteArrayInputStream(jsonStr.getBytes());
+            body = StreamUtils.copyToByteArray(stream);
+        }
+    }
+    @Override
+    public BufferedReader getReader() throws IOException {
+        return new BufferedReader(new InputStreamReader(getInputStream()));
     }
 
     @Override
+    public ServletInputStream getInputStream() throws IOException {
+        if (body==null){
+            return null;
+        }
+        final ByteArrayInputStream bais = new ByteArrayInputStream(body);
+        return new ServletInputStream() {
+            @Override
+            public int read() throws IOException {
+                return bais.read();
+            }
+            @Override
+            public boolean isFinished() {
+                return false;
+            }
+            @Override
+            public boolean isReady() {
+                return false;
+            }
+            @Override
+            public void setReadListener(ReadListener readListener) {
+
+            }
+        };
+    }
+    @Override
     public Enumeration<String> getParameterNames() {
         return new Vector(params.keySet()).elements();
     }
@@ -106,4 +148,26 @@ public class ParameterRequestWrapper extends HttpServletRequestWrapper {
         }
         return Collections.enumeration(values);
     }
+
+    public String getBodyContent(HttpServletRequest request) throws Exception{
+        StringBuilder sb = new StringBuilder();
+        InputStream inputStream = null;
+        BufferedReader reader = null;
+        try {
+            inputStream = request.getInputStream();
+            reader = new BufferedReader(new InputStreamReader(inputStream, Charset.forName("UTF-8")));
+            String line;
+            while ((line = reader.readLine())!=null){
+                sb.append(line);
+            }
+        }
+        catch (Exception e){
+            e.printStackTrace();
+        }
+        finally {
+            inputStream.close();
+            reader.close();
+        }
+        return sb.toString();
+    }
 }

+ 3 - 2
backend/src/main/java/com/jiayue/ssi/util/JwtTokenUtil.java

@@ -25,7 +25,7 @@ public class JwtTokenUtil {
     /**
      * 过期时长(毫秒)
      */
-    private Long expiration = 300000L;
+    private Long expiration = 1800000L;
 
     private String authorization;
 
@@ -51,7 +51,7 @@ public class JwtTokenUtil {
         try {
             claims = Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody();
         } catch (Exception e) {
-            e.printStackTrace();
+//            e.printStackTrace();
             claims = null;
         }
         return claims;
@@ -155,6 +155,7 @@ public class JwtTokenUtil {
         claims.put(Claims.ISSUED_AT, new Date());
         String token=jwtTokenUtil.generateToken(claims);
         System.out.println(jwtTokenUtil.getUsernameFromToken(token));
+        System.out.println(jwtTokenUtil.isTokenExpired(token));
         Claims claims1 = jwtTokenUtil.getClaimsFromToken(token);
         System.out.println("过期时间:"+claims1.getExpiration());
         System.out.println("过期时间提前2分钟:"+new Date(claims1.getExpiration().getTime()-1000*60*2));

+ 2 - 0
backend/src/main/resources/application.yml

@@ -73,6 +73,8 @@ mybatis:
     type: mysql #数据库类型 目前只支持mysql
 mybatis-plus:
   mapper-locations: classpath:/mapper/*Mapper.xml
+  global-config:
+    db-column-underline: true
 
 # 服务端密钥
 # 客户端公钥:MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEz9IxRa8TDtsQABm/zl1VCFGVjyklybVfoVKupC759hevR7R9R8sS4flOFJbk8z++Pp/YSb9aHNDMR+S6SpuAXg==

+ 17 - 8
ui/src/main.js

@@ -21,8 +21,7 @@ import VXETable from 'vxe-table'
 import 'vxe-table/lib/index.css'
 
 import {removeToken} from './utils/auth'
-import {getBrowserToken} from './utils/commonFuc'
-import {sm2 as sm222, sm2} from "sm-crypto"; // get token from cookie
+import { resetForm} from "@/utils/index";
 Vue.prototype.$moment = moment
 Vue.prototype.$echarts = echarts
 Vue.use(VXETable)
@@ -54,6 +53,8 @@ VXETable.setup({
   validArgs: 'obsolete' // 将自定义校验参数还原为 Function(rule, cellValue, callback)
 })
 
+Vue.prototype.resetForm = resetForm
+
 // 公钥Q
 let publicKey2 = '041967638ca43d4577d8dba166bff4437fde944270101f398a95b846ec2f8177d09f8abc5d62b6cd2c7216274d7abe0c8e04b0bb691207a32dd2e12d6bd2798672'
 // 私钥D
@@ -75,12 +76,19 @@ Vue.prototype.$axios.interceptors.request.use(
     if (config.method === 'post' || config.method === 'put') {
       if (config.url != '/getMailCode') {
         if (config.data !== undefined) {
+          console.log(JSON.stringify(config.data))
           // 参数加密
-          let encryptParam = doEncrypt(config.data.toString())
+          let encryptParam = doEncrypt(JSON.stringify(config.data))
           // 参数签名
-          let paramSign = doSign(config.data.toString())
-          let result = 'secretData=' + encryptParam + '&paramSign=' + paramSign
-          config.data = result
+          let paramSign = doSign(JSON.stringify(config.data))
+          const param = {
+            secretData: encryptParam,
+            paramSign: paramSign
+          }
+          config.data = param
+          if (config.url!='/user/login'){
+            config.headers.post['Content-Type'] = 'application/json';
+          }
         }
       }
     }
@@ -177,6 +185,7 @@ Vue.prototype.$axios.interceptors.response.use(
             type: 'error',
             duration: 5 * 1000
           })
+          return
           break
         case 500:
           Message({
@@ -209,8 +218,6 @@ Vue.prototype.$axios.interceptors.response.use(
                     cb();
                   });
                   requests = [];  //注意要清空
-                  ///////////////////////////////问媛媛////////////////////
-                error.config.url='/sysUserController/getAll'
                   return Vue.prototype.$axios.request(error.config);
                   // return error.response.config
                 }).catch(err => {
@@ -237,6 +244,7 @@ Vue.prototype.$axios.interceptors.response.use(
       }
     }
     else{
+      alert(4)
       return Promise.reject(error)
     }
     /*    console.log('err' + error) // for debug
@@ -329,3 +337,4 @@ export function doVerifySignature(msgString, sigValueHex) {
   let verifyResult = sm2.doVerifySignature(msgString, sigValueHex, publicKey2, {hash: true, der: true}) // 验签结果
   return verifyResult;
 }
+

+ 7 - 0
ui/src/utils/index.js

@@ -105,3 +105,10 @@ export function param2Obj(url) {
       '"}'
   )
 }
+
+// 表单重置
+export function resetForm(refName) {
+  if (this.$refs[refName]) {
+    this.$refs[refName].resetFields();
+  }
+}

+ 13 - 6
ui/src/views/login/index.vue

@@ -224,12 +224,19 @@ export default {
             this.loading = false
             return
           }
-          const param = new URLSearchParams()
-          param.append('username', this.loginForm.username)
-          param.append('password', this.loginForm.password)
-          param.append('code', this.loginForm.verifyCode)
-          param.append('verifyuuid', this.verifyuuid)
-          param.append('mailbox', this.loginForm.mailbox)
+          // const param = new URLSearchParams()
+          // param.append('username', this.loginForm.username)
+          // param.append('password', this.loginForm.password)
+          // param.append('code', this.loginForm.verifyCode)
+          // param.append('verifyuuid', this.verifyuuid)
+          // param.append('mailbox', this.loginForm.mailbox)
+          const param = {
+            username: this.loginForm.username,
+            password: this.loginForm.password,
+            code: this.loginForm.verifyCode,
+            verifyuuid: this.loginForm.verifyuuid,
+            mailbox: this.loginForm.mailbox
+          }
           this.$axios.post('/user/login', param).then((res) => {
             // sessionStorage.setItem('token', data)
             // document.cookie = "token=" + data;

+ 402 - 517
ui/src/views/sysManager/userManager/index.vue

@@ -1,543 +1,428 @@
-<template xmlns:v-slot="http://www.w3.org/1999/XSL/Transform">
-
+<template>
   <div class="app-container">
-    <div>
-      <el-card>
-        <div slot="header" class="clearfix">
-          <b><span>用户管理</span></b>
-        </div>
+    <el-row :gutter="24">
+      <!--用户数据-->
+      <el-col :span="24" :xs="24">
+        <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" label-width="68px">
+          <el-form-item label="用户账号" prop="username">
+            <el-input
+              v-model="queryParams.username"
+              placeholder="请输入用户账号"
+              clearable
+              style="width: 240px"
+              @keyup.enter.native="handleQuery"
+            />
+          </el-form-item>
+          <el-form-item label="手机号码" prop="phonenumber">
+            <el-input
+              v-model="queryParams.phonenumber"
+              placeholder="请输入手机号码"
+              clearable
+              style="width: 240px"
+              @keyup.enter.native="handleQuery"
+            />
+          </el-form-item>
+          <el-form-item label="用户状态" prop="status">
+            <el-select
+              v-model="queryParams.status"
+              placeholder="请选择用户状态"
+              clearable
+              style="width: 240px"
+            >
+              <el-option
+                v-for="item in statusOptions"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value">
+              </el-option>
+            </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="filter-container">
-          <el-button type="primary" size="small" style="round-clip: 10px" @click="insertEvent"
-                     :loading="loadButton">添加
-          </el-button>
-        </div>
+        <el-row :gutter="10" class="mb8">
+          <el-col :span="1.5">
+            <el-button
+              type="primary"
+              plain
+              icon="el-icon-plus"
+              size="mini"
+              @click="handleAdd"
+            >新增</el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button
+              type="success"
+              plain
+              icon="el-icon-edit"
+              size="mini"
+              :disabled="single"
+              @click="handleUpdate"
+            >修改</el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button
+              type="danger"
+              plain
+              icon="el-icon-delete"
+              size="mini"
+              :disabled="multiple"
+              @click="handleDelete"
+            >删除</el-button>
+          </el-col>
+        </el-row>
         <div style="padding-top: 10px">
-          <vxe-table
-            ref="xTable"
-            border
-            export-config
-            keep-source
-            auto-resize
-            resizable
-            :edit-rules="rules"
-            :loading="loading"
-            :data="tableData"
-            v-show="showTable"
-            show-overflow
-            highlight-current-row
-            align="center"
-          >
-            <!--:edit-config="{trigger: 'manual', mode: 'row',autoClear:false,showStatus: true,icon:'none'}"-->
-            <vxe-table-column title="用户基本信息" align="center">
-              <vxe-table-column
-                field="username"
-                title="用户名"
-                width="7%"
-                align="center"
-              />
-              <!--:edit-render="{name: '$input', attrs: {type: 'text'}}"-->
-<!--              <vxe-table-column-->
-<!--                field="password"-->
-<!--                title="密码"-->
-<!--                width="12%"-->
-<!--                align="center"-->
-<!--              />-->
-                            <vxe-table-column
-                              field="mailbox"
-                              title="邮箱"
-                              width="12%"
-                              align="center"
-                            />
-              <!--:edit-render="{name: '$input', attrs: {type: 'text'}}"-->
-              <vxe-table-column
-                field="name"
-                title="姓名"
-                width="7%"
-                align="center"
-              />
-              <!--:edit-render="{name: '$input', attrs: {type: 'text'}}"-->
-              <vxe-table-column
-                field="status"
-                title="状态"
-                width="8%"
-                align="center"
-                :formatter="formatStatus"
-              />
-              <!--:edit-render="{name: '$select', options: userStatus }"-->
-              <vxe-table-column title="操作" width="15%" align="center">
-                <template v-slot="{ row }">
-                  <!--<template v-if="$refs.xTable.isActiveByRow(row)">-->
-                  <!--<el-button-->
-                  <!--type="success"-->
-                  <!--style="padding: 3px 4px 3px 4px;margin: 2px;"-->
-                  <!--size="mini"-->
-                  <!--icon="el-icon-edit"-->
-                  <!--@click="editSave(row)"-->
-                  <!--&gt;保存-->
-                  <!--</el-button>-->
-                  <!--<el-button-->
-                  <!--class="cancel-btn"-->
-                  <!--icon="el-icon-refresh"-->
-                  <!--type="warning"-->
-                  <!--style="padding: 3px 4px 3px 4px;margin: 2px;"-->
-                  <!--size="mini"-->
-                  <!--@click="cancelRowEvent(row)"-->
-                  <!--&gt;取消-->
-                  <!--</el-button>-->
-                  <!--</template>-->
-                  <!--<template v-else>-->
-                  <el-button
-                    :loading="loadButton"
-                    type="primary"
-                    style="padding: 3px 4px 3px 4px;margin: 2px;"
-                    size="mini "
-                    icon="el-icon-edit"
-                    @click="editRowEvent(row)"
-                  >编辑
-                  </el-button>
-                  <el-button
-                    :loading="loadButton"
-                    type="danger"
-                    style="padding: 3px 4px 3px 4px;margin: 2px;"
-                    size="mini "
-                    icon="el-icon-delete"
-                    @click="deleteRowEvent(row)"
-                  >删除
-                  </el-button>
-                  <!--</template>-->
-                </template>
-              </vxe-table-column>
-            </vxe-table-column>
-          </vxe-table>
-          <vxe-modal
-            ref="xModal"
-            v-model="showEdit"
-            :title="selectRow ? '编辑&保存' : '新增&保存'"
-            width="800"
-            resize
-            destroy-on-close
-          >
-            <el-form
-              :model="formData"
-              :rules="rules"
-              ref="ruleForm"
-              label-width="100px"
-              title-align="center"
-              title-width="100"
-            >
-              <el-form-item label="用户名" prop="username" class="formItem" >
-                <el-input v-model="formData.username" placeholder="填写用户名" clearable></el-input>
-              </el-form-item>
-              <el-form-item label="密码" prop="password" class="formItem" >
-                <el-input type="password" v-model="formData.password" placeholder="填写密码" clearable></el-input>
-              </el-form-item>
-              <el-form-item label="姓名" prop="name" class="formItem" >
-                <el-input v-model="formData.name" placeholder="填写姓名" clearable></el-input>
-              </el-form-item>
-              <el-form-item label="状态" prop="status" class="formItem" >
-                <el-select v-model="formData.status" placeholder="请选择状态" size="medium">
-                  <el-option
-                    v-for="item in userStatus"
-                    :key="item.value"
-                    :value="item.value"
-                    :label="item.label"
-                  ></el-option>
-                </el-select>
-              </el-form-item>
-              <el-form-item label="配置菜单" prop="menu" class="formItem" >
-                  <el-cascader
-                    v-model="formData.menu"
-                    :options="options"
-                    :props="props"
-                    collapse-tags
-                  />
-              </el-form-item>
-              <el-form-item align="center" span="24">
-                <el-button status="primary" @click="editSave">保存</el-button>
-                <el-button @click="cancelRowEvent">取消</el-button>
-              </el-form-item>
-            </el-form>
-          </vxe-modal>
+        <vxe-table
+          ref="userList"
+          align="center"
+          :loading="loading"
+          class="mytable-style"
+          auto-resize
+          border
+          resizable
+          export-config
+          highlight-current-row
+          show-overflow
+          max-height="700"
+          :data="userList"
+        >
+          <vxe-table-column field="username" title="用户账号" />
+          <vxe-table-column field="nickname" title="用户姓名" />
+          <vxe-table-column field="mailbox" title="邮箱" />
+          <vxe-table-column field="phonenumber" title="手机号码"/>
+          <vxe-table-column field="status" title="状态" :formatter="statusFormat"/>
+          <vxe-table-column title="操作" width="320">
+            <template slot-scope="scope" v-if="scope.row.userId !== 1">
+                            <el-button
+                              size="mini"
+                              type="text"
+                              icon="el-icon-edit"
+                              @click="handleResetPwd(scope.row)"
+                            >重置密码</el-button>
+                            <el-button
+                              size="mini"
+                              type="text"
+                              icon="el-icon-delete"
+                              @click="handleAuthRole(scope.row)"
+                            >分配角色</el-button>
+                          </template>
+          </vxe-table-column>
+        </vxe-table>
+        <vxe-pager
+          v-show="showTable"
+          perfect
+          :current-page.sync="currentPage"
+          :page-size.sync="pageSize"
+          :total="total"
+          :page-sizes="[10,50,100]"
+          :layouts="['PrevJump', 'PrevPage','JumpNumber', 'NextPage', 'NextJump', 'Sizes', 'FullJump', 'Total']"
+          @page-change="handlePageChange"
+        >
+        </vxe-pager>
         </div>
-      </el-card>
-    </div>
+      </el-col>
+    </el-row>
 
-    <!-- 删除提示框 -->
-    <el-dialog :visible.sync="delVisible" title="提示" width="300px" center>
-      <div class="del-dialog-cnt">删除不可恢复,是否确定删除?</div>
-      <span slot="footer" class="dialog-footer">
-        <el-button type="primary" @click="deleteCancel()">取 消</el-button>
-        <el-button type="primary" @click="deleteInfo()">确 定</el-button>
-      </span>
+    <!-- 添加或修改用户配置对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="650px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" width="630px" label-width="80px">
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="用户账号" prop="username">
+              <el-input style="width: 220px" v-model="form.username" placeholder="请输入用户账号" maxlength="20" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="用户姓名" prop="nickname">
+              <el-input style="width: 220px" v-model="form.nickname" placeholder="请输入用户姓名" maxlength="30" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="邮箱" prop="mailbox">
+              <el-input style="width: 220px" v-model="form.mailbox" placeholder="请输入邮箱" maxlength="50" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="手机号码" prop="phonenumber">
+              <el-input style="width: 220px" v-model="form.phonenumber" placeholder="请输入手机号码" maxlength="11" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="角色">
+              <el-select style="width: 220px" v-model="form.roleIds" multiple placeholder="请选择角色">
+                <el-option
+                  v-for="item in roleOptions"
+                  :key="item.roleId"
+                  :label="item.roleName"
+                  :value="item.roleId"
+                  :disabled="item.status == 1"
+                ></el-option>
+              </el-select>
+            </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 { listUser, getUser, delUser, addUser, updateUser, resetUserPwd, changeUserStatus } from "@/api/system/user";
 
-  export default {
-    data() {
-      let strTopShiftReg = /(\~(?=\!)|\!(?=\@)|\@(?=\#)|\#(?=\$)|\$(?=\%)|\%(?=\^)|\^(?=\&)|\&(?=\*)|\*(?=\()|\((?=\))|\)(?=\_)|\_(?=\+)|\+(?=\~)){3}/
-      let strTopResverShiftReg = /(\+(?=\_)|\_(?=\))|\)(?=\()|\((?=\*)|\*(?=\&)|\&(?=\^)|\^(?=\%)|\%(?=\$)|\$(?=\#)|\#(?=\@)|\@(?=\!)|\!(?=\~)|\~(?=\+)){3}/
-      //字母连续规则
-      let strReg = /(a(?=b)|b(?=c)|c(?=d)|d(?=e)|e(?=f)|f(?=g)|g(?=h)|h(?=i)|i(?=j)|j(?=k)|k(?=l)|l(?=m)|m(?=n)|n(?=o)|o(?=p)|p(?=q)|q(?=r)|r(?=s)|s(?=t)|t(?=u)|u(?=v)|v(?=w)|w(?=x)|x(?=y)|y(?=z)|z(?=a)){3}[a-z]/i
-      let strResverReg = /(a(?=z)|z(?=y)|y(?=x)|x(?=w)|w(?=v)|v(?=u)|u(?=t)|t(?=s)|s(?=r)|r(?=q)|q(?=p)|p(?=o)|o(?=n)|n(?=m)|m(?=l)|l(?=k)|k(?=j)|j(?=i)|i(?=h)|h(?=g)|g(?=f)|f(?=e)|e(?=d)|d(?=c)|c(?=b)|b(?=a)){3}[a-z]/i
-      //数字连续规则
-      let numReg = /(\`(?=1)|1(?=2)|2(?=3)|3(?=4)|4(?=5)|5(?=6)|6(?=7)|7(?=8)|8(?=9)|9(?=0)|0(?=\-)|\-(?=\=)|\=(?=\`)){3}/
-      let numResverReg = /(\=(?=\-)|\-(?=0)|0(?=9)|9(?=8)|8(?=7)|7(?=6)|6(?=5)|5(?=4)|4(?=3)|3(?=2)|2(?=1)|1(?=\`)|\`(?=\=)){3}/
-      //键盘字母横向连续规则
-      let keyboardHorizontalReg = /(q(?=w)|w(?=e)|e(?=r)|r(?=t)|t(?=y)|y(?=u)|u(?=i)|i(?=o)|o(?=p)|p(?=q)|a(?=s)|s(?=d)|d(?=f)|f(?=g)|g(?=h)|h(?=j)|j(?=k)|k(?=l)|l(?=a)|z(?=x)|x(?=c)|c(?=v)|v(?=b)|b(?=n)|n(?=m)|m(?=z)){3}[a-z]/i
-      let keyboardHorizontalResverReg = /(p(?=o)|o(?=i)|i(?=u)|u(?=y)|y(?=t)|t(?=r)|r(?=e)|e(?=w)|w(?=q)|q(?=p)|l(?=k)|k(?=j)|j(?=h)|h(?=g)|g(?=f)|f(?=d)|d(?=s)|s(?=a)|a(?=l)|m(?=n)|n(?=b)|b(?=v)|v(?=c)|c(?=x)|x(?=z)|z(?=m)){3}[a-z]/i
-      //多个相同字母、数字规则
-      let sameReg = /([0-9a-zA-Z])\1{3}/
-      let keyboardSlopeArr = ["1qaz", "2wsx", "3edc", "4rfv", "5tgb", "6yhn", "7ujm", "8ik,", "9ol.", "0p;/", "/;p0", ".lo9", ",ki8", "mju7", "nhy6", "bgt5", "vfr4", "cde3", "xsw2", "zaq1", "4esz", "5rdx", "6tfc", "7ygv", "8uhb", "9ijn", "0okm", "-pl,", "=[;.", ".;[=", ",lp-", "mko0", "nji9", "bhu8", "vgy7", "cft6", "xdr5", "zse4"]
-      let keyboardSlopeShiftArr = ["!qaz", "@wsx", "#edc","$rfv", "%tgb", "^yhn", "&ujm", "*ik<", "(ol>", ")p:?", "?:p)", ">lo(", "<ki*", "mju&", "nhy^", "bgt%", "vfr$", "cde#", "xsw@", "zaq!", "$esz", "%rdx", "^tfc", "&ygv", "*uhb", "(ijn", ")okm", "_pl<", "+{:>", ">:{+", "<lp_", "mko)", "nji(", "bhu*", "vgy&", "cft^", "xdr%", "zse$"]
-      const checkName = ({rule, value, callback}) => {
-        var username = this.formData.username
-        var s6 = this.tableDatas
-        if (username == null || username === '') {
-          return Promise.reject(new Error('请填写用户名'))
+export default {
+  name: "User",
+  data() {
+    return {
+      statusOptions: [
+        { value: '0', label: '激活' },
+        { value: '1', label: '休眠' },
+        { value: '2', label: '注销' }
+      ],
+      // 遮罩层
+      loading: true,
+      showTable: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      currentPage: 1,
+      pageSize: 10,
+      // 总条数
+      total: 0,
+      // 用户表格数据
+      userList: null,
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 默认密码
+      initPassword: undefined,
+      // 角色选项
+      roleOptions: [],
+      // 表单参数
+      form: {},
+      // 查询参数
+      queryParams: {
+        username: undefined,
+        phonenumber: undefined,
+        status: undefined
+      },
+      // 表单校验
+      rules: {
+        username: [
+          { required: true, message: "用户账号不能为空", trigger: "blur" },
+          { min: 5, max: 20, message: '用户名称长度必须介于 5 和 20 之间', trigger: 'blur' }
+        ],
+        nickname: [
+          { required: true, message: "用户姓名不能为空", trigger: "blur" },
+          { min: 5, max: 20, message: '用户姓名长度必须介于 5 和 20 之间', trigger: 'blur' }
+        ],
+        mailbox: [
+          { required: true, message: "邮箱不能为空", trigger: "blur" },
+          { type: "email", message: "请输入正确的邮箱地址", trigger: ["blur", "change"]}
+        ],
+        phonenumber: [
+          { required: true, message: "手机号码不能为空", trigger: "blur" },
+          { pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: "请输入正确的手机号码", trigger: "blur"}
+        ]
+      }
+    };
+  },
+  watch: {
+  },
+  created() {
+    this.getList()
+  },
+  methods: {
+    handlePageChange({currentPage, pageSize}) {
+      this.currentPage = currentPage
+      this.pageSize = pageSize
+      this.getList()
+    },
+    // 时间格式化
+    statusFormat({cellValue}) {
+      let belongTo = '未知的类型'
+      for (let i = 0; i < this.statusOptions.length; i++) {
+        if (cellValue =="0") {
+          belongTo ="激活"
         }
-        for (let i = 0; i < s6.length; i++) {
-          if (this.id == '' || this.id == undefined) {
-            // 新增
-            if ((username == s6[i].username)) {
-              return Promise.reject(new Error('用户名不能重复'))
-            }
-          } else {
-            // 修改
-            if (this.id != s6[i].id) {
-              if ((username == s6[i].username)) {
-                return Promise.reject(new Error('用户名不能重复'))
-              }
-            }
-          }
+        else if (cellValue =="1") {
+          belongTo ="休眠"
         }
-        return Promise.resolve()
-      }
-      const checkpassword = (rule, value, callback) => {
-        var password = this.formData.password
-        if (this.fileUploadNodeShowSysValue==0){
-          if (sameReg.test(password)) {
-            return Promise.reject(new Error('密码不能含有连续4位相同的数字或字母'))
-          } else if (strResverReg.test(password)) {
-            return Promise.reject(new Error('密码不能含有4位连续的字母'))
-          } else if (strReg.test(password)) {
-            return Promise.reject(new Error('密码不能含有4位键盘横向方向连续的字符'))
-          } else if (numReg.test(password)) {
-            return Promise.reject(new Error('密码不能含有4位键盘横向方向连续的字符'))
-          } else if (numResverReg.test(password)) {
-            return Promise.reject(new Error('密码不能含有4位连续的数字'))
-          } else if (keyboardHorizontalReg.test(password)) {
-            return Promise.reject(new Error('密码不能含有4位键盘横向方向连续的字母'))
-          } else if (keyboardHorizontalResverReg.test(password)) {
-            return Promise.reject(new Error('密码不能含有4位键盘横向方向连续的字母'))
-          } else if (keyboardSlopeArr.some(v => password.toLowerCase().indexOf(v) > -1)) {
-            return Promise.reject(new Error('密码不能含有4位键盘斜向方向连续的字符'))
-          }else if (keyboardSlopeShiftArr.some(v => password.toLowerCase().indexOf(v) > -1)) {
-            return Promise.reject(new Error('密码不能含有4位键盘斜向方向连续的字符'))
-          }else if (strTopShiftReg.test(password)) {
-            return Promise.reject(new Error('密码不能含有4位键盘横向方向连续的字符'))
-          }else if (strTopResverShiftReg.test(password)) {
-            return Promise.reject(new Error('密码不能含有4位键盘横向方向连续的字符'))
-          }
+        else if (cellValue =="2") {
+          belongTo ="注销"
         }
-        return Promise.resolve()
       }
-      return {
-        fileUploadNodeShowSysValue: '1',
-        id: '',
-        tableDatas: [],
-        elStations: [],
-        elStation: '',
-        total: 0,
-        pageSize: 5,
-        currentPage: 1,
-        loadButton: false,
-        rowId: '',
-        showTable: true,
-        tableData: [],
-        delVisible: false,
-        loading: false,
-        // 是否为编辑
-        isEdit: false,
-        pvRotationMode: [],
-        userStatus: [{value: "0", label: "正常"}, {value: "2", label: "禁用"}],
-        // 表单验证规则
-        rules: {
-          username: [
-            {required: true, validator: checkName},
-            {message: '输入过长', max: 15}
-          ],
-          password: [
-            {required: true, message: '请填写密码', validator: checkpassword},
-            {
-              pattern: /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[$@$!%*?&])[A-Za-z\d$@$!%*?&]{7,10}/,
-              message: '由8位数字、字母大小写及特殊符号组成'
-            }
-          ],
-          name:[{required: true, message: '请填写姓名', trigger: 'blur'}],
-          status:[{required: true, message: '请选择状态', trigger: 'change'}]
-        },
-        formData:{},
-        showEdit:false,
-        selectRow:false,
-        props: { multiple: true },
-        options:[],
-        childrenOption:[]
+      return belongTo
+    },
+    /** 查询用户列表 */
+    getList() {
+      this.loading = true;
+      var searchParams={
+        currentPage:this.currentPage,
+        pageSize:this.pageSize,
+        username:this.queryParams.username,
+        phonenumber:this.queryParams.phonenumber,
+        status:this.queryParams.status
       }
+
+      this.$axios.get('/sysUserController/getAll',
+        {params:searchParams}).then((res) => {
+        this.userList = res.data.records
+        this.total = res.data.total
+
+        if (res.data.records == '') {
+          this.showTable = false
+        } else {
+          this.showTable = true
+        }
+        this.loading = false
+      }).catch((error) => {
+        this.$message.error('获取数据出错' + error)
+      })
+
+      // this.$axios.get('/sysUserController/getAll').then((res) => {
+      //   this.userList = res.data
+      //   this.loading = false
+      // }).catch((error) => {
+      //   this.loading = false
+      //   console.log('获取用户信息出错' + error)
+      // })
+    },
+    // 用户状态修改
+    handleStatusChange(row) {
+      let text = row.status === "0" ? "启用" : "停用";
+      this.$modal.confirm('确认要"' + text + '""' + row.userName + '"用户吗?').then(function() {
+        return changeUserStatus(row.userId, row.status);
+      }).then(() => {
+        this.$modal.msgSuccess(text + "成功");
+      }).catch(function() {
+        row.status = row.status === "0" ? "1" : "0";
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        userId: undefined,
+        username: undefined,
+        nickname: undefined,
+        phonenumber: undefined,
+        mailbox: undefined,
+        status: "0",
+        remark: undefined
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.getList();
     },
-    created() {
-      // this.getParameterBySysKey()
-      this.getAll()
-      // this.getAllMenu()
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
     },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+        // this.postOptions = response.posts;
+        // this.roleOptions = response.roles;
+        this.open = true;
+        this.title = "添加用户";
+        this.form.password = this.initPassword;
 
-    methods: {
-      // getParameterBySysKey(){
-      //   this.$axios.get('/sysParameter/sysParameterKey/FILE_UPLOAD_NODE_SHOW').then(res => {
-      //     this.fileUploadNodeShowSysValue = res.data.sysValue
-      //   })
-      // },
-      getAll() {
-        this.loading = true
-        this.$axios.get('/sysUserController/getAll').then((res) => {
-          this.tableData = res.data
-          if (res.data == null) {
-            this.showTable = false
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const userId = row.userId || this.ids;
+      getUser(userId).then(response => {
+        this.form = response.data;
+        this.postOptions = response.posts;
+        this.roleOptions = response.roles;
+        this.$set(this.form, "postIds", response.postIds);
+        this.$set(this.form, "roleIds", response.roleIds);
+        this.open = true;
+        this.title = "修改用户";
+        this.form.password = "";
+      });
+    },
+    /** 重置密码按钮操作 */
+    handleResetPwd(row) {
+      this.$prompt('请输入"' + row.userName + '"的新密码', "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        closeOnClickModal: false,
+        inputPattern: /^.{5,20}$/,
+        inputErrorMessage: "用户密码长度必须介于 5 和 20 之间"
+      }).then(({ value }) => {
+          resetUserPwd(row.userId, value).then(response => {
+            this.$modal.msgSuccess("修改成功,新密码是:" + value);
+          });
+        }).catch(() => {});
+    },
+    /** 分配角色操作 */
+    handleAuthRole: function(row) {
+      const userId = row.userId;
+      this.$router.push("/system/user-auth/role/" + userId);
+    },
+    /** 提交按钮 */
+    submitForm: function() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.userId != undefined) {
+            // 更新操作
+            updateUser(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
           } else {
-            this.showTable = true
-          }
-          this.loading = false
-        }).catch((error) => {
-          this.loading = false
-          this.$message.error('获取用户信息出错' + error)
-        })
-      },
-      // getAllMenu(){
-      //   this.$axios.get('/sysMenu').then(res => {
-      //     // console.log(res.data)
-      //     var data = res.data
-      //     var option = [{value:9001,label:'后台管理', disabled: true}]
-      //     var option9000=[{value:9000,label:'统计查询', disabled: true}]
-      //     for(var i=0;i<data.length;i++){
-      //       var children = []
-      //       if(data[i].children.length>0){
-      //         for (var j =0;j<data[i].children.length;j++) {
-      //           if(data[i].children[j].id ==1){
-      //             children.push({
-      //               id: data[i].children[j].id,
-      //               fId:58,
-      //               value:data[i].children[j].id,
-      //               label: data[i].children[j].title,
-      //               path: data[i].children[j].path,
-      //               itemPath: data[i].children[j].itemPath,
-      //               url: data[i].children[j].url
-      //             })
-      //             this.childrenOption.push({
-      //               id: data[i].children[j].id,
-      //               fId:58,
-      //               value:data[i].children[j].id,
-      //               label: data[i].children[j].title,
-      //               path: data[i].children[j].path,
-      //               itemPath: data[i].children[j].itemPath,
-      //               url: data[i].children[j].url
-      //             })
-      //           }else{
-      //             children.push({
-      //               id: data[i].children[j].id,
-      //               fId:data[i].id,
-      //               value:data[i].children[j].id,
-      //               label: data[i].children[j].title,
-      //               path: data[i].children[j].path,
-      //               itemPath: data[i].children[j].itemPath,
-      //               url: data[i].children[j].url
-      //             })
-      //             this.childrenOption.push({
-      //               id: data[i].children[j].id,
-      //               fId:data[i].id,
-      //               value:data[i].children[j].id,
-      //               label: data[i].children[j].title,
-      //               path: data[i].children[j].path,
-      //               itemPath: data[i].children[j].itemPath,
-      //               url: data[i].children[j].url
-      //             })
-      //           }
-      //
-      //         }
-      //       }
-      //       if(data[i].url == '9000'){
-      //         option9000.push({
-      //           id: data[i].id,
-      //           value:data[i].id,
-      //           label: data[i].title,
-      //           itemPath: data[i].itemPath,
-      //           url: data[i].url,
-      //           children:children
-      //         })
-      //       }else{
-      //         option.push({
-      //           id: data[i].id,
-      //           value:data[i].id,
-      //           label: data[i].title,
-      //           itemPath: data[i].itemPath,
-      //           url: data[i].url,
-      //           children:children
-      //         })
-      //       }
-      //     }
-      //     this.options = option.concat(option9000)
-      //     // console.log(this.childrenOption)
-      //   })
-      // },
-      insertEvent(row) {
-        this.id = ''
-        this.showTable = true
-        this.isEdit = false
-        // this.loadButton = true
-        this.showEdit = true
-        this.selectRow = false
-        this.formData={}
-        // this.$refs.xTable.insert().then(({row}) => this.$refs.xTable.setActiveRow(row))
-      },
-      editRowEvent(row) {
-        this.id = row.id
-        this.isEdit = true
-        // this.loadButton = true
-        this.showEdit = true
-        this.selectRow = true
-        this.formData = row
-        this.formData.menu = this.formatMenu(this.formData.menu)
-        // this.$refs.xTable.setActiveRow(row)
-      },
-      editSave() {
-        this.$refs["ruleForm"].validate(valid => {
-          if (valid) {
-            var menu = []
-            if(this.formData.menu != null){
-              for(var i=0;i<this.formData.menu.length;i++){
-                if(menu.find(value=>value == this.formData.menu[i][0])){
-                  menu.push(this.formData.menu[i][1])
-                }else{
-                  menu.push(this.formData.menu[i][0])
-                  menu.push(this.formData.menu[i][1])
-                }
-              }
-              // console.log(this.formData.menu)
-              this.formData.menu = menu.toString()
-            }else{
-              this.formData.menu = ''
-            }
-            if (this.isEdit) {
-              // 编辑保存
-              this.$axios.put('/sysUser/', this.formData).then(res => {
-                this.$message({
-                  message: '修改成功',
-                  type: 'success'
-                })
-                this.loadButton = false
-                this.getAll()
-              }).catch((error) => {
-                // this.$refs.xTable.setActiveRow(row)
-                this.$message.error('修改用户出错' + error)
-              })
-            } else {
-              // 新增保存
-              this.formData.stationCode = this.elStation
-              console.log(this.formData)
-              this.$axios.post('/sysUser/', this.formData).then(res => {
-                this.$message({
-                  message: '保存成功',
-                  type: 'success'
-                })
-                this.loadButton = false
-                this.getAll()
-              }).catch((error) => {
-                this.$message.error('修改用户出错' + error)
-              })
-            }
-            this.showEdit = false
-            this.selectRow = false
-          }
-        })
-
-      },
-      cancelRowEvent(row) {
-        // const xTable = this.$refs.xTable
-        this.$refs.xModal.close()
-        this.loadButton = false
-        // xTable.clearActived().then(() => {
-        //   // 还原行数据
-        //   if (this.isEdit) {
-        //     // 编辑
-        //     xTable.revertData(row)
-        //   } else {
-        //     // 新增
-        //     xTable.remove(row)
-        //   }
-        //   this.loadButton = false
-        // })
-      },
-      // 删除场站信息
-      deleteRowEvent(row) {
-        this.rowId = row.id
-        this.delVisible = true
-      },
-      deleteCancel() {
-        this.delVisible = false
-      },
-      deleteInfo() {
-        this.$axios.delete('/sysUser/' + this.rowId).then(res => {
-          this.$message({
-            message: '删除成功',
-            type: 'success'
-          })
-          this.delVisible = false
-          this.getAll()
-        }).catch((error) => {
-          this.$message.error('删除用户出错' + error)
-        })
-      },
-      formatStatus({ cellValue }){
-        const item = this.userStatus.find(item => item.value === cellValue)
-        return item ? item.label : ''
-      },
-      formatMenu(menu){
-        if(menu === null){
-          return null
-        }else{
-          var data = menu.split(",")
-          var menuArr = []
-          for (var i=0;i<data.length;i++){
-            for(var j=0;j<this.childrenOption.length;j++){
-              if(this.childrenOption[j].id == data[i]){
-                menuArr.push([this.childrenOption[j].fId,this.childrenOption[j].id])
-              }
+            const param = {
+              username: this.form.username,
+              nickname: this.form.nickname,
+              phonenumber: this.form.phonenumber,
+              mailbox: this.form.mailbox
             }
+            this.$axios.post('/sysUserController', param).then((res) => {
+              this.$message.success('新增成功')
+              // this.getList();
+              this.loading = false
+            }).catch((error) => {
+              console.log(error)
+              this.loading = false
+            })
           }
-          return menuArr
         }
-
-      }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const userIds = row.userId || this.ids;
+      this.$modal.confirm('是否确认删除用户编号为"' + userIds + '"的数据项?').then(function() {
+        return delUser(userIds);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
     }
   }
+};
 </script>
-
-<style scoped>
-
-  .my_table_insert .vxe-body--row.is--new {
-    background-color: #f1fdf1;
-  }
-  .formItem{
-    width: 45%;
-    display: inline-block;
-  }
-  /*/deep/*/
-  /*.vxe-input--inner{*/
-  /*  width: auto;*/
-  /*}*/
-
-</style>