Browse Source

实现用户管理基本信息的编辑

huxz 8 years ago
parent
commit
8693365a3e

+ 5 - 16
sso-manage-console-web/src/App.vue

@@ -1,17 +1,6 @@
 <template>
   <div id="app">
     <nav-header></nav-header>
-
-    <!--<div class="container">
-      <div class="row">
-        <div class="col-lg-2">
-          ABC
-        </div>
-        <div class="col-lg-10">
-          1234
-        </div>
-      </div>
-    </div>-->
     <router-view></router-view>
   </div>
 </template>
@@ -21,11 +10,11 @@
   import {NavHeader} from '@/components/common'
 
   export default {
-  name: 'app',
-  components: {
-    NavBar,
-    NavHeader
-  }
+    name: 'app',
+    components: {
+      NavBar,
+      NavHeader
+    }
 }
 </script>
 

+ 4 - 0
sso-manage-console-web/src/components/accounts/AccountIndex.vue

@@ -22,7 +22,11 @@
 </script>
 
 <style scoped>
+  .row {
+    background-color: #303743;
+  }
   .main-content {
     padding: 0;
+    background-color: #FFFFFF;
   }
 </style>

+ 247 - 0
sso-manage-console-web/src/components/accounts/users/UserBasicInfo.vue

@@ -0,0 +1,247 @@
+<template>
+  <div style="min-height: 570px;">
+    <div>
+      <ul class="nav nav-tabs">
+        <li @click="$router.go(-1)">
+          <img src="/static/images/go_back.png" alt="GoBack"/>
+        </li>
+        <li role="presentation" class="active"><a>基本信息</a><span class="triangle"></span></li>
+      </ul>
+    </div>
+    <div class="basic-user-info" style="padding: 30px 0 0;width: 490px;">
+      <el-form ref="form" :model="form" label-width="150px">
+        <el-form-item label="个人UU">
+          <div>{{ userInfo.userUU }}</div>
+        </el-form-item>
+        <el-form-item label="个人名称">
+          <el-input v-model="userInfo.vipName"></el-input>
+        </el-form-item>
+        <el-form-item label="手机号">
+          <el-input v-model="userInfo.mobile"></el-input>
+        </el-form-item>
+        <el-form-item label="手机认证">
+          <el-select v-model="userInfo.mobileValidCode" placeholder="请选择认证状态">
+            <el-option label="已认证" :value="2"></el-option>
+            <el-option label="未认证" :value="0"></el-option>
+            <el-option label="申诉中" :value="1"></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="邮箱">
+          <el-input v-model="userInfo.email"></el-input>
+        </el-form-item>
+        <el-form-item label="邮箱认证">
+          <el-select v-model="userInfo.emailValidCode" width="340" placeholder="请选择认证状态">
+            <el-option label="已认证" :value="2"></el-option>
+            <el-option label="未认证" :value="0"></el-option>
+            <el-option label="申诉中" :value="1"></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="密码">
+          <el-input type="password" v-model="userInfo.password" auto-complete="off"></el-input>
+        </el-form-item>
+        <el-form-item label="账号冻结">
+          <el-select v-model="userInfo.lock" placeholder="请选择是否冻结账号">
+            <el-option label="是" :value="1"></el-option>
+            <el-option label="否" :value="0"></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="真实姓名">
+          <el-input v-model="userInfo.realName"></el-input>
+        </el-form-item>
+        <el-form-item label="身份证号">
+          <el-input v-model="userInfo.idCard"></el-input>
+        </el-form-item>
+        <el-form-item label="实名认证">
+          <el-select v-model="userInfo.identityValidCode" placeholder="请选择认证状态">
+            <el-option label="已认证" :value="2"></el-option>
+            <el-option label="未认证" :value="0"></el-option>
+            <el-option label="待认证" :value="1"></el-option>
+            <el-option label="未通过" :value="3"></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="注册时间">
+          <!-- TODO 注册时间 -->
+          <div>2017-06-11 12:51:44</div>
+        </el-form-item>
+        <el-form-item label="上次登录">
+          <!-- TODO 上次登录 -->
+          <div>2017-06-11 12:51:44</div>
+        </el-form-item>
+        <el-form-item label="注册来源">
+          <div>{{ userInfo.fromApp }}</div>
+        </el-form-item>
+        <el-form-item>
+          <div class="action-form-item">
+            <el-button type="primary" @click="onSubmit" :disabled="!isChange">保存修改</el-button>
+            <el-button @click="$router.go(-1)">返回</el-button>
+          </div>
+        </el-form-item>
+      </el-form>
+    </div>
+  </div>
+</template>
+
+<script>
+  import _ from 'lodash'
+  import axios from '@/assets/js/axios'
+
+  export default {
+    name: 'user-basic-info',
+    data () {
+      return {
+        form: {
+          name: '',
+          region: '',
+          date1: '',
+          date2: '',
+          delivery: false,
+          type: [],
+          resource: '',
+          desc: ''
+        },
+        userInfo: {},
+        isChange: false
+      }
+    },
+    methods: {
+      onSubmit () {
+        const data = _.pick(this.userInfo,
+          [
+            'userUU',
+            'vipName',
+            'mobile',
+            'mobileValidCode',
+            'email',
+            'emailValidCode',
+            'password',
+            'lock',
+            'realName',
+            'idCard',
+            'identityValidCode'
+          ]
+        )
+
+        const success = () => {
+          this.isChange = false
+          this.$message.success('保存成功')
+          this.$route.go(-1)
+        }
+        const error = error => {
+          this.$message.error(error)
+        }
+
+        axios.put('/api/user//modifyUserInfo', data).then(success).catch(error)
+      }
+    },
+    mounted () {
+      this.userInfo = Object.assign({}, this.userInfo, this.$route.params)
+    },
+    watch: {
+      userInfo: {
+        // 监听对象属性变化,触发激活保存修改按钮的行为
+        handler (newValue, oldValue) {
+          if (oldValue.userUU) {
+            this.isChange = !_.isEqual(newValue, this.$route.params)
+            console.log(this.isChange)
+          }
+        },
+        deep: true
+      }
+    }
+  }
+</script>
+
+<style scoped>
+  .nav-tabs {
+    background-color: #E6EDF1;
+  }
+  .nav-tabs>li {
+    height: 60px;
+  }
+  .nav-tabs>li>img {
+    margin: 13px 38px 13px 14px;
+
+    cursor: pointer;
+  }
+  .nav-tabs>li>a {
+    margin: 13px 0;
+    border: none;
+    height: 34px;
+    padding: 9px 8px;
+    line-height: 14px;
+    background: none;
+
+    color: #646464;
+    font-size: 14px;
+    font-family: "Microsoft YaHei", sans-serif;
+  }
+  .nav-tabs>li.active>a {
+    color: #323232;
+    font-weight: bold;
+  }
+  .nav-tabs>li.active>a,
+  .nav-tabs>li.active>a:focus,
+  .nav-tabs>li.active>a:hover {
+    cursor: pointer;
+    border: none;
+    background: none;
+  }
+  .nav-tabs>li.active .triangle{
+    position: absolute;
+    width: 24px;
+    height: 12px;
+    border-right: 12px solid transparent;
+    border-left: 12px solid transparent;
+    border-bottom: 12px solid #FFFFFF;
+    z-index: 99;
+    bottom: 0;
+    left: 50%;
+    margin-left: -12px;
+  }
+  .action-form-item {
+    margin-left: -128px;
+  }
+  .action-form-item .el-button {
+    border-radius: 0;
+    padding: 10px 20px;
+  }
+  .el-button {
+    width: 120px;
+    height: 34px;
+  }
+  .el-button--primary {
+    background-color: #4E8EFC;
+    border-color: #4E8EFC;
+  }
+  .el-button--primary.is-disabled {
+    background-color: #D2D2D2;
+    border-color: #D2D2D2;
+  }
+</style>
+
+<style>
+  .basic-user-info .el-input__inner {
+    height: 34px;
+    width: 340px;
+    border-radius: 0;
+  }
+  .basic-user-info .el-form-item {
+    margin-bottom: 12px;
+  }
+  .basic-user-info .el-form-item__label {
+    margin: 0;
+    height: 34px;
+    padding-left: 26px;
+    text-align: left;
+    line-height: 34px;
+
+    color: #000000;
+    font-size: 14px;
+    font-weight: normal;
+    font-family: "SimHei", sans-serif;
+  }
+  .basic-user-info .el-form-item__content {
+    height: 34px;
+    line-height: 34px;
+  }
+</style>

+ 7 - 3
sso-manage-console-web/src/components/accounts/users/UserHome.vue

@@ -43,7 +43,7 @@
         </template>
       </el-table-column>
       <el-table-column
-        prop="realName"
+        prop="vipName"
         label="用户名称">
       </el-table-column>
       <el-table-column
@@ -107,7 +107,7 @@
   const searchKeys = [
     {
       label: '用户名称',
-      value: 'realName'
+      value: 'vipName'
     }
   ]
 
@@ -123,7 +123,7 @@
           size: 8,
           fromApp: null,
           mobileValidCode: null,
-          key: 'realName',
+          key: 'vipName',
           keyword: null
         },
         pageContent: [],
@@ -174,6 +174,10 @@
         this.pageParams.keyword = keyword
 
         this.fetchData()
+      },
+      handleClick (row) {
+        const routeLocation = {name: 'UserBasicInfo', params: row}
+        this.$router.push(routeLocation)
       }
     }
   }

+ 3 - 1
sso-manage-console-web/src/components/accounts/users/index.js

@@ -1,5 +1,7 @@
 import UserHome from './UserHome'
+import UserBasicInfo from './UserBasicInfo'
 
 export {
-  UserHome
+  UserHome,
+  UserBasicInfo
 }

+ 14 - 1
sso-manage-console-web/src/router/index.js

@@ -11,7 +11,7 @@ import SettingsHome from '@/components/settings/SettingsHome'
 import {BackHome} from '@/components/back'
 import AccountIndex from '@/components/accounts/AccountIndex'
 import {EnterpriseHome} from '@/components/accounts/enterprises'
-import {UserHome} from '@/components/accounts/users'
+import {UserBasicInfo, UserHome} from '@/components/accounts/users'
 import {AppealHome} from '@/components/accounts/appeals'
 
 Vue.use(Router)
@@ -42,6 +42,19 @@ export default new Router({
           name: 'UserHome',
           component: UserHome
         },
+        {
+          path: 'user/basic',
+          name: 'UserBasicInfo',
+          component: UserBasicInfo,
+          beforeEnter: (to, from, next) => {
+            const userInfo = to.params
+            if (userInfo.userUU) {
+              next()
+            } else {
+              next({ name: 'UserHome' })
+            }
+          }
+        },
         {
           path: 'appeal',
           name: 'AppealHome',

BIN
sso-manage-console-web/static/images/go_back.png


+ 26 - 0
sso-manage-console/src/main/java/com/uas/sso/sso/backend/AuthenticationUtils.java

@@ -0,0 +1,26 @@
+package com.uas.sso.sso.backend;
+
+import com.uas.sso.common.encrypt.MD5;
+import com.uas.sso.core.Const;
+import com.uas.sso.exception.AccountException;
+import org.springframework.util.StringUtils;
+
+public class AuthenticationUtils {
+
+    public static String getEncryPassword(String format, String noEncryPwd, String salt) {
+        if (StringUtils.isEmpty(format)) {
+            return noEncryPwd;
+        }
+        // 超过32认为是已加密过的密文
+        if (noEncryPwd.length() >= 32) {
+            /// 之后添加日志时恢复
+            //logger.error("用户密码加密", String.format("传递过来的密码(%s)必须是未加密的明文", noEncryPwd));
+            throw new AccountException("invalid password");
+        }
+        // $password{$salt}
+        String password = format.replace(Const.ENCRY_PARAM_PASSWORD, noEncryPwd);
+        password = password.replace(Const.ENCRY_PARAM_SALT, salt == null ? "" : salt);
+        return MD5.toMD5(password);
+    }
+
+}

+ 9 - 0
sso-manage-console/src/main/java/com/uas/sso/sso/backend/api/UserManageController.java

@@ -2,6 +2,7 @@ package com.uas.sso.sso.backend.api;
 
 import com.uas.sso.entity.User;
 import com.uas.sso.entity.Userspace;
+import com.uas.sso.sso.backend.dto.UpdateUserInfo;
 import com.uas.sso.sso.backend.service.UserService;
 import com.uas.sso.sso.backend.support.ResultBean;
 import java.util.Set;
@@ -9,6 +10,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Pageable;
 import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.PathVariable;
+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.RequestParam;
@@ -56,4 +58,11 @@ public class UserManageController {
 
         return new ResultBean<>(userService.findSpacesByUser(userUu));
     }
+
+    @RequestMapping(method = RequestMethod.PUT, path = "//modifyUserInfo",
+            produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
+    public ResultBean<Boolean> modifyUserInfo(@RequestBody UpdateUserInfo userInfo) {
+
+        return new ResultBean<>(userService.modifyUserInfo(userInfo));
+    }
 }

+ 182 - 0
sso-manage-console/src/main/java/com/uas/sso/sso/backend/dto/UpdateUserInfo.java

@@ -0,0 +1,182 @@
+package com.uas.sso.sso.backend.dto;
+
+import com.uas.sso.entity.User;
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotNull;
+
+/**
+ * 用户信息DTO.
+ *
+ * @author huxz
+ */
+public class UpdateUserInfo {
+
+    /**
+     * uu号
+     */
+    @NotNull(message = "用户UU号不能为空")
+    @Min(value = 10000, message = "用户UU格式不合法")
+    private Long userUU;
+
+    /**
+     * 会员名
+     */
+    @NotNull(message = "个人名称不能为空")
+    private String vipName;
+
+    /**
+     * 手机号
+     */
+    @NotNull(message = "用户手机号不能为空")
+    private String mobile;
+
+    /**
+     * 手机号认证状态
+     */
+    @NotNull(message = "手机认证状态不能为空")
+    private Short mobileValidCode;
+
+    /**
+     * 用户邮箱
+     */
+    private String email;
+
+    /**
+     * 用户邮箱认证状态
+     */
+    @NotNull(message = "邮箱认证状态不能为空")
+    private Short emailValidCode;
+
+    /**
+     * 用户密码
+     */
+    @NotNull(message = "用户密码不能为空")
+    private String password;
+
+    /**
+     * 账户是否冻结(1、冻结)
+     */
+    private Integer lock;
+
+    /**
+     * 用户真实姓名
+     */
+    private String realName;
+
+    /**
+     * 用户身份证号
+     */
+    private String idCard;
+
+    /**
+     * 用户身份认证状态
+     */
+    @NotNull(message = "用户身份认证状态不能为空")
+    private Short identityValidCode;
+
+    public Long getUserUU() {
+        return userUU;
+    }
+
+    public void setUserUU(Long userUU) {
+        this.userUU = userUU;
+    }
+
+    public String getVipName() {
+        return vipName;
+    }
+
+    public void setVipName(String vipName) {
+        this.vipName = vipName;
+    }
+
+    public String getMobile() {
+        return mobile;
+    }
+
+    public void setMobile(String mobile) {
+        this.mobile = mobile;
+    }
+
+    public Short getMobileValidCode() {
+        return mobileValidCode;
+    }
+
+    public void setMobileValidCode(Short mobileValidCode) {
+        this.mobileValidCode = mobileValidCode;
+    }
+
+    public String getEmail() {
+        return email;
+    }
+
+    public void setEmail(String email) {
+        this.email = email;
+    }
+
+    public Short getEmailValidCode() {
+        return emailValidCode;
+    }
+
+    public void setEmailValidCode(Short emailValidCode) {
+        this.emailValidCode = emailValidCode;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    public Integer getLock() {
+        return lock;
+    }
+
+    public void setLock(Integer lock) {
+        this.lock = lock;
+    }
+
+    public String getRealName() {
+        return realName;
+    }
+
+    public void setRealName(String realName) {
+        this.realName = realName;
+    }
+
+    public String getIdCard() {
+        return idCard;
+    }
+
+    public void setIdCard(String idCard) {
+        this.idCard = idCard;
+    }
+
+    public Short getIdentityValidCode() {
+        return identityValidCode;
+    }
+
+    public void setIdentityValidCode(Short identityValidCode) {
+        this.identityValidCode = identityValidCode;
+    }
+
+    public User fillUserInfo(User user) {
+        if (user == null) {
+            user = new User();
+        }
+
+        user.setVipName(this.vipName);
+        user.setMobile(this.mobile);
+        user.setMobileValidCode(this.mobileValidCode);
+        user.setEmail(this.email);
+        user.setEmailValidCode(this.emailValidCode);
+        user.setPassword(this.password);
+        user.setLock(this.lock);
+        user.setRealName(this.realName);
+        user.setIdCard(this.idCard);
+        user.setIdentityValidCode(this.identityValidCode);
+        return user;
+    }
+}

+ 3 - 0
sso-manage-console/src/main/java/com/uas/sso/sso/backend/service/UserService.java

@@ -2,6 +2,7 @@ package com.uas.sso.sso.backend.service;
 
 import com.uas.sso.entity.User;
 import com.uas.sso.entity.Userspace;
+import com.uas.sso.sso.backend.dto.UpdateUserInfo;
 import java.util.List;
 import java.util.Set;
 import org.springframework.data.domain.Page;
@@ -22,4 +23,6 @@ public interface UserService {
 
     Page<User> showUserByPagination(Pageable page, String fromApp, Short mobileValidCode, String key,
             String keyword);
+
+    Boolean modifyUserInfo(UpdateUserInfo userInfo);
 }

+ 33 - 0
sso-manage-console/src/main/java/com/uas/sso/sso/backend/service/impl/UserServiceImpl.java

@@ -1,8 +1,11 @@
 package com.uas.sso.sso.backend.service.impl;
 
+import com.uas.sso.core.Const;
 import com.uas.sso.dao.UserDao;
 import com.uas.sso.entity.User;
 import com.uas.sso.entity.Userspace;
+import com.uas.sso.sso.backend.AuthenticationUtils;
+import com.uas.sso.sso.backend.dto.UpdateUserInfo;
 import com.uas.sso.sso.backend.exceptions.ValidationFailedException;
 import com.uas.sso.sso.backend.service.UserService;
 import java.util.ArrayList;
@@ -111,4 +114,34 @@ public class UserServiceImpl implements UserService {
             return null;
         }, page);
     }
+
+    @Override
+    public Boolean modifyUserInfo(UpdateUserInfo userInfo) {
+
+        User existUser = userDao.findOne(userInfo.getUserUU());
+        if (existUser == null) {
+            throw new ValidationFailedException(String.format("用户%d不存在", userInfo.getUserUU()));
+        }
+
+        // 如果个人名称被修改,则检测是否重名
+        if (!existUser.getVipName().equals(userInfo.getVipName())) {
+            List<User> userList = userDao.findByVipName(userInfo.getVipName());
+            if (!CollectionUtils.isEmpty(userList)) {
+                throw new ValidationFailedException(String.format("个人名称%s已注册", userInfo.getVipName()));
+            }
+        }
+
+        existUser = userInfo.fillUserInfo(existUser);
+
+        if (existUser.getPassword().length() < 32) {
+            String encryPassword = AuthenticationUtils
+                    .getEncryPassword(Const.ENCRY_FORMAT, existUser.getPassword(),
+                            existUser.getSalt());
+            existUser.setPassword(encryPassword);
+        }
+
+        userDao.save(existUser);
+        return true;
+    }
+
 }