Selaa lähdekoodia

修改账户中心后台管理用户身份认证逻辑

huxz 8 vuotta sitten
vanhempi
commit
5c759fd646

+ 199 - 0
sso-manage-console-web/src/components/accounts/users/UserAuth.vue

@@ -0,0 +1,199 @@
+<template>
+  <div>
+    <message-list :messages="messages" v-if="userValid && userValid.validCode">
+      <button class="btn btn-default btn-auth" slot="action" @click="passAuth">认证通过</button>
+      <button class="btn btn-default" slot="action" @click="failAuth">不通过</button>
+    </message-list>
+    <div v-if="!userValid || !userValid.validCode" style="text-align: center; padding: 15px; font-size: 18px;">
+      暂无用户身份认证信息
+    </div>
+
+    <!-- 更换管理员对话框 -->
+    <el-dialog
+      title="未通过原因"
+      :visible.sync="isShowReasonDialog"
+      width="450px"
+      :show-close="true"
+      :append-to-body="true">
+      <!-- 对话框内容 -->
+      <!-- 用户信息展示 -->
+      <div class="input-fail-pass-reason">
+        <textarea class="form-control" rows="4" placeholder="请输入未通过原因" v-model="reason"></textarea>
+      </div>
+      <!-- 对话框尾部 -->
+      <span slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitFailReason">确 定</el-button>
+        <el-button @click="isShowReasonDialog = false">取 消</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  import _ from 'lodash'
+  import axios from '@/assets/js/axios'
+  import MessageList from '../enterprises/common/MessageList'
+  import * as types from '@/store/mutation-types'
+
+  export default {
+    name: 'enterprise-auth',
+    components: {
+      MessageList
+    },
+    data () {
+      return {
+        isShowReasonDialog: false,
+        reason: '',
+        userValid: ''
+      }
+    },
+    computed: {
+      messages () {
+        const userInfo = this.userValid || {}
+        const messages = []
+
+        messages.push({ label: '真实姓名', value: userInfo.realName || '' })
+        messages.push({ label: '身份证号', value: userInfo.idCard || '' })
+        return messages
+      },
+      userInfo () {
+        return this.$store.state.accounts.savedUser
+      }
+    },
+    methods: {
+      showErrorMessage (error) {
+        this.$message.error(error)
+      },
+      passAuth () {
+        const success = userInfo => {
+          this.$store.commit(types.CHOOSE_USER, userInfo)
+
+          this.$message.success('保存成功')
+          this.$router.push({ path: '/accounts/user/basic' })
+        }
+
+        this.saveAuthInfo(true, null, success, this.showErrorMessage)
+      },
+      failAuth () {
+        this.reason = ''
+
+        this.isShowReasonDialog = true
+      },
+      submitFailReason () {
+        if (!this.reason) {
+          this.$message.error('不通过原因不能为空')
+          return 0
+        }
+
+        const success = userInfo => {
+          this.$store.commit(types.CHOOSE_USER, userInfo)
+
+          this.$message.success('保存成功')
+          this.isShowReasonDialog = false
+          this.$router.push({ path: '/accounts/user/basic' })
+        }
+
+        this.saveAuthInfo(false, this.reason, success, this.showErrorMessage)
+      },
+      saveAuthInfo (isPass, reason, success, error) {
+        const validId = this.userValid.id
+        const userUU = this.userInfo.userUU
+        const params = { isPass, validId }
+        if (!isPass) {
+          params.reason = reason
+        }
+
+        console.log('Auth params', params)
+        return axios.put(`/api/user/${userUU}/authUserValid`, {}, { params })
+          .then(success)
+          .catch(error)
+      }
+    },
+    mounted () {
+      const params = { userUU: this.userInfo.userUU }
+      axios.get('/api/user//loadUserValid', { params })
+        .then(valid => {
+          if (valid && valid.validCode === 1) {
+            const submitInfo = JSON.parse(valid.submitInfo)
+            this.userValid = _.defaultsDeep({}, valid, submitInfo)
+
+            console.log('User Valid:', this.userValid)
+          } else {
+            this.userValid = {}
+          }
+        })
+        .catch(error => {
+          console.log(error)
+          this.userValid = {}
+        })
+    }
+  }
+</script>
+
+<style scoped>
+  .message-panel .message-action button.btn-auth {
+    border-color: #4E8EFC;
+    background-color: #4E8EFC;
+
+    color: #FFFFFF;
+  }
+</style>
+
+<style>
+  .el-dialog {
+    border-radius: 5px;
+  }
+  .el-dialog__header {
+    padding: 14px 20px;
+    height: 44px;
+    line-height: 16px;
+    border: 1px none #D2D2D2;
+    border-bottom-style: solid;
+  }
+  .el-dialog__header .el-dialog__title {
+    color: #000000;
+    font-size: 16px;
+    font-weight: normal;
+    font-family: "SimHei", sans-serif;
+  }
+  .el-dialog__body {
+    padding: 22px 0 22px 40px;
+  }
+  .input-fail-pass-reason {
+    margin: 0 30px 30px -10px;
+    width: 400px;
+  }
+  .input-fail-pass-reason textarea {
+    width: 400px;
+    resize: none;
+  }
+  .el-select .el-input__inner {
+    border-radius: 0;
+    width: 128px;
+    height: 32px;
+  }
+  .search-group .el-input__inner {
+    width: 186px;
+    height: 30px;
+    border-radius: 0;
+    border: none;
+  }
+  .el-dialog__footer {
+    text-align: center;
+  }
+  .el-dialog__footer .el-button {
+    width: 180px;
+    height: 30px;
+    border-radius: 15px;
+    line-height: 14px;
+    padding: 8px 0;
+
+    background: none;
+
+    color: #656565;
+  }
+  .el-dialog__footer .el-button--primary {
+    background-color: #4E8EFC;
+    color: #FFFFFF;
+  }
+</style>

+ 79 - 0
sso-manage-console-web/src/components/accounts/users/UserBaseAction.vue

@@ -0,0 +1,79 @@
+<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>
+        <router-link tag="li" active-class="active" :to="{name: 'UserBasicInfo'}" replace>
+          <a>基本信息</a><span class="triangle"></span></router-link>
+        <router-link tag="li" active-class="active" :to="{name: 'UserAuth'}" replace>
+          <a>认证信息</a><span class="triangle"></span></router-link>
+      </ul>
+    </div>
+
+    <router-view></router-view>
+  </div>
+</template>
+
+<script>
+  import * as types from '@/store/mutation-types'
+
+  export default {
+    name: 'common-menu',
+    beforeRouteLeave (to, from, next) {
+      // 清除 store 数据
+      this.$store.commit(types.CLEAR_USER)
+      next()
+    }
+  }
+</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;
+  }
+</style>

+ 77 - 79
sso-manage-console-web/src/components/accounts/users/UserBasicInfo.vue

@@ -1,87 +1,78 @@
 <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="userInfo" 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="注册时间">
-          <div v-text="formatDate(userInfo.registerDate)"></div>
-        </el-form-item>
-        <el-form-item label="上次登录">
-          <div v-text="formatDate(userInfo.lastLoginTime)"></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 class="basic-user-info" style="padding: 30px 0 0;width: 490px;">
+    <el-form ref="form" :model="userInfo" 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="注册时间">
+        <div v-text="formatDate(userInfo.registerDate)"></div>
+      </el-form-item>
+      <el-form-item label="上次登录">
+        <div v-text="formatDate(userInfo.lastLoginTime)"></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>
 </template>
 
 <script>
   import _ from 'lodash'
   import axios from '@/assets/js/axios'
+  import * as types from '@/store/mutation-types'
   import { formatDate } from '@/assets/js/utils'
 
   export default {
@@ -110,7 +101,9 @@
           ]
         )
 
-        const success = () => {
+        const success = (userInfo) => {
+          this.$store.commit(types.CHOOSE_USER, userInfo)
+
           this.isChange = false
           this.$message.success('保存成功')
         }
@@ -125,7 +118,12 @@
       }
     },
     mounted () {
-      this.userInfo = Object.assign({}, this.userInfo, this.$route.params)
+      if (this.$route.params && this.$route.params.userUU) {
+        this.$store.commit(types.CHOOSE_USER, this.$route.params)
+      }
+      const user = this.$store.state.accounts.savedUser
+
+      this.userInfo = Object.assign({}, this.userInfo, user)
     },
     watch: {
       userInfo: {

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

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

+ 16 - 5
sso-manage-console-web/src/router/index.js

@@ -7,7 +7,7 @@ import {
   EnterpriseAdmin, EnterpriseApps, EnterpriseAuth, EnterpriseBaseAction,
   EnterpriseBasicInfo, EnterpriseHome, EnterpriseMembers
 } from '@/components/accounts/enterprises'
-import {UserBasicInfo, UserHome} from '@/components/accounts/users'
+import {UserBasicInfo, UserBaseAction, UserHome, UserAuth} from '@/components/accounts/users'
 import {AppealHome} from '@/components/accounts/appeals'
 
 Vue.use(Router)
@@ -87,9 +87,8 @@ export default new Router({
           component: UserHome
         },
         {
-          path: 'user/basic',
-          name: 'UserBasicInfo',
-          component: UserBasicInfo,
+          path: 'user',
+          component: UserBaseAction,
           beforeEnter: (to, from, next) => {
             const userInfo = to.params
             if (userInfo.userUU) {
@@ -97,7 +96,19 @@ export default new Router({
             } else {
               next({ name: 'UserHome', replace: true })
             }
-          }
+          },
+          children: [
+            {
+              path: 'basic',
+              name: 'UserBasicInfo',
+              component: UserBasicInfo
+            },
+            {
+              path: 'auth',
+              name: 'UserAuth',
+              component: UserAuth
+            }
+          ]
         },
         {
           path: 'appeal',

+ 8 - 1
sso-manage-console-web/src/store/modules/accounts.js

@@ -7,7 +7,8 @@ function countUnHandleAppeals () {
 
 // State
 const state = {
-  unHandleCount: 0
+  unHandleCount: 0,
+  savedUser: {}
 }
 
 // Getters
@@ -35,6 +36,12 @@ const actions = {
 const mutations = {
   [types.COUNT_UN_HANDLE_APPEALS] (state, count) {
     state.unHandleCount = count || 0
+  },
+  [types.CHOOSE_USER] (state, user) {
+    state.savedUser = user || {}
+  },
+  [types.CLEAR_USER] (state) {
+    state.savedUser = {}
   }
 }
 

+ 2 - 0
sso-manage-console-web/src/store/mutation-types.js

@@ -6,3 +6,5 @@ export const ADD_TO_CART = 'ADD_TO_CART'
 export const SET_CART_ITEMS = 'SET_CART_ITEMS'
 export const SET_CHECKOUT_STATUS = 'SET_CHECKOUT_STATUS'
 export const RECEIVE_PRODUCTS = 'RECEIVE_PRODUCTS'
+export const CHOOSE_USER = 'CHOOSE_USER'
+export const CLEAR_USER = 'CLEAR_USER'

+ 18 - 1
sso-manage-console/src/main/java/com/uas/sso/sso/backend/api/UserManageController.java

@@ -1,6 +1,7 @@
 package com.uas.sso.sso.backend.api;
 
 import com.uas.sso.entity.User;
+import com.uas.sso.entity.UserValid;
 import com.uas.sso.sso.backend.dto.AddNewUserInfo;
 import com.uas.sso.sso.backend.dto.UpdateUserInfo;
 import com.uas.sso.sso.backend.service.UserBackendService;
@@ -10,6 +11,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Pageable;
 import org.springframework.http.MediaType;
 import org.springframework.validation.annotation.Validated;
+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;
@@ -69,7 +71,7 @@ public class UserManageController {
 
     @RequestMapping(method = RequestMethod.PUT, path = "//modifyUserInfo",
             produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
-    public ResultBean<Boolean> modifyUserInfo(@RequestBody UpdateUserInfo userInfo) {
+    public ResultBean<User> modifyUserInfo(@RequestBody UpdateUserInfo userInfo) {
 
         return new ResultBean<>(userBackendService.modifyUserInfo(userInfo));
     }
@@ -80,4 +82,19 @@ public class UserManageController {
 
         return new ResultBean<>(userBackendService.addNewUser(userInfo));
     }
+
+    @RequestMapping(method = RequestMethod.GET, path = "//loadUserValid",
+            produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
+    public ResultBean<UserValid> loadUserValid(Long userUU) {
+
+        return new ResultBean<>(userBackendService.loadUserValid(userUU));
+    }
+
+    @RequestMapping(method = RequestMethod.PUT, path = "/{userUU}/authUserValid",
+            produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
+    public ResultBean<User> authUserValid(@PathVariable("userUU") Long userUU,
+        Long validId, Boolean isPass, @RequestParam(required = false) String reason) {
+
+        return new ResultBean<>(userBackendService.authUserValid(userUU, validId, isPass, reason));
+    }
 }

+ 12 - 1
sso-manage-console/src/main/java/com/uas/sso/sso/backend/service/UserBackendService.java

@@ -1,6 +1,7 @@
 package com.uas.sso.sso.backend.service;
 
 import com.uas.sso.entity.User;
+import com.uas.sso.entity.UserValid;
 import com.uas.sso.sso.backend.dto.AddNewUserInfo;
 import com.uas.sso.sso.backend.dto.UpdateUserInfo;
 import java.util.List;
@@ -63,7 +64,7 @@ public interface UserBackendService {
      * @param userInfo  用户信息
      * @return  操作状态
      */
-    Boolean modifyUserInfo(UpdateUserInfo userInfo);
+    User modifyUserInfo(UpdateUserInfo userInfo);
 
     /**
      * 后台新增用户。
@@ -72,5 +73,15 @@ public interface UserBackendService {
      * @return  新创建的用户
      */
     User addNewUser(AddNewUserInfo userInfo);
+
+    /**
+     * 获取用户的身份认证信息
+     *
+     * @param userUU    用户UU
+     * @return  用户身份认证信息
+     */
+    UserValid loadUserValid(Long userUU);
+
+    User authUserValid(Long userUU, Long validId, Boolean isPass, String reason);
 }
 

+ 55 - 3
sso-manage-console/src/main/java/com/uas/sso/sso/backend/service/impl/UserBackendServiceImpl.java

@@ -1,22 +1,28 @@
 package com.uas.sso.sso.backend.service.impl;
 
+import com.alibaba.fastjson.JSONObject;
 import com.uas.sso.core.Const;
 import com.uas.sso.core.Status;
 import com.uas.sso.dao.AppDao;
 import com.uas.sso.dao.UserDao;
+import com.uas.sso.dao.UserValidDao;
 import com.uas.sso.entity.App;
 import com.uas.sso.entity.User;
 import com.uas.sso.entity.UserRecord;
+import com.uas.sso.entity.UserValid;
 import com.uas.sso.entity.Userspace;
 import com.uas.sso.sso.backend.AuthenticationUtils;
 import com.uas.sso.sso.backend.dto.AddNewUserInfo;
 import com.uas.sso.sso.backend.dto.UpdateUserInfo;
 import com.uas.sso.sso.backend.exceptions.ValidationFailedException;
 import com.uas.sso.sso.backend.service.UserBackendService;
+import com.uas.sso.sso.backend.util.JacksonUtils;
 import com.uas.sso.util.InfoAsyncUtils;
 import java.sql.Timestamp;
+import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.Date;
 import java.util.List;
 import javax.persistence.criteria.CriteriaBuilder;
 import javax.persistence.criteria.CriteriaQuery;
@@ -25,8 +31,11 @@ import javax.persistence.criteria.Root;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.domain.Sort.Direction;
 import org.springframework.data.jpa.domain.Specification;
 import org.springframework.stereotype.Service;
+import org.springframework.util.Assert;
 import org.springframework.util.CollectionUtils;
 import org.springframework.util.StringUtils;
 
@@ -42,10 +51,13 @@ public class UserBackendServiceImpl implements UserBackendService {
 
     private final UserDao userDao;
 
+    private final UserValidDao userValidDao;
+
     @Autowired
-    public UserBackendServiceImpl(AppDao appDao, UserDao userDao) {
+    public UserBackendServiceImpl(AppDao appDao, UserDao userDao, UserValidDao userValidDao) {
         this.appDao = appDao;
         this.userDao = userDao;
+        this.userValidDao = userValidDao;
     }
 
     @Override
@@ -175,7 +187,7 @@ public class UserBackendServiceImpl implements UserBackendService {
     }
 
     @Override
-    public Boolean modifyUserInfo(UpdateUserInfo userInfo) {
+    public User modifyUserInfo(UpdateUserInfo userInfo) {
 
         User existUser = userDao.findOne(userInfo.getUserUU());
         if (existUser == null) {
@@ -200,7 +212,7 @@ public class UserBackendServiceImpl implements UserBackendService {
         }
 
         userDao.save(existUser);
-        return true;
+        return existUser;
     }
 
     @Override
@@ -232,6 +244,46 @@ public class UserBackendServiceImpl implements UserBackendService {
         return user;
     }
 
+    @Override
+    public UserValid loadUserValid(Long userUU) {
+        Sort sort = new Sort(Direction.DESC, "submitDate");
+
+        List<UserValid> validList = userValidDao.findBySubmitterUUAndValidCode(userUU, (short) 1, sort);
+        return CollectionUtils.isEmpty(validList) ? null : validList.get(0);
+    }
+
+    @Override
+    public User authUserValid(Long userUU, Long validId, Boolean isPass, String reason) {
+        User userInfo = userDao.findOne(userUU);
+        Assert.notNull(userInfo, String.format("用户[%d]不存在", userUU));
+
+        UserValid userValid = userValidDao.findOne(validId);
+        Assert.notNull(userValid, "用户身份认证信息不能为空");
+        Assert.isTrue(userValid.getValidCode() == 1, "用户身份认证必须为待认证状态");
+
+        userValid.setAuditor("系统管理员");
+        userValid.setValidCode(isPass ? (short) Status.AUTHENTICATED.getCode() : (short) Status.NOT_PASSED.getCode());
+        userValid.setValidDate(new Timestamp(System.currentTimeMillis()));
+
+        // When admin disapproves, only handle user valid info.
+        if (!isPass) {
+            Assert.hasText(reason, "用户身份认证不通过时,不通过原因不能为空");
+            userValid.setInvalidReason(reason);
+            userValidDao.save(userValid);
+            return userInfo;
+        }
+
+        // Handle user valid and user info.
+        JSONObject newUser = JacksonUtils.fromJson(userValid.getSubmitInfo(), JSONObject.class);
+        Assert.notNull(newUser, "用户身份的企业信息不能为空");
+
+        userInfo.setRealName(newUser.getString("realName"));
+        userInfo.setIdCard(newUser.getString("idCard"));
+
+        userDao.save(userInfo);
+        return userInfo;
+    }
+
     private void emailHasRegistered(String mobile) {
         User user = userDao.findByMobile(mobile);
         if (user != null) {

+ 4 - 0
sso-server/src/main/java/com/uas/sso/dao/UserValidDao.java

@@ -1,6 +1,8 @@
 package com.uas.sso.dao;
 
 import com.uas.sso.entity.UserValid;
+import java.util.List;
+import org.springframework.data.domain.Sort;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 
@@ -10,4 +12,6 @@ import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
  * @desc 用户申请日志Dao
  **/
 public interface UserValidDao extends JpaRepository<UserValid, Long>, JpaSpecificationExecutor<UserValid> {
+
+    List<UserValid> findBySubmitterUUAndValidCode(Long userUU, short validCode, Sort sort);
 }