Просмотр исходного кода

简单实现后台申诉管理审核操作

huxz 8 лет назад
Родитель
Сommit
1aaaa05a6a

+ 277 - 8
sso-manage-console-web/src/components/accounts/appeals/AppealHome.vue

@@ -121,6 +121,156 @@
         label="邮箱">
       </el-table-column>
     </el-table>
+
+    <!-- 申诉审核对话框 -->
+    <el-dialog
+      :title="appealTitle"
+      :visible.sync="isShowDialog"
+      width="920px"
+      :show-close="true"
+      :append-to-body="true">
+
+      <div class="reset-or-validate" v-if="approveType === 'resetPassword' || approveType === 'validAccount'">
+        <div class="row">
+          <div class="col-lg-6">
+            <div class="message-label">UU号</div>
+            <div class="message-value" v-text="selectedAppeal.submitterUU"></div>
+          </div>
+          <div class="col-lg-6">
+            <div class="message-label">申诉来源</div>
+            <div class="message-value" v-text="selectedAppeal.fromApp || '无'"></div>
+          </div>
+        </div>
+        <div class="row">
+          <div class="col-lg-6">
+            <div class="message-label">申诉人</div>
+            <div class="message-value message-value-highlight" v-text="selectedAppeal.contactName"></div>
+          </div>
+          <div class="col-lg-6">
+            <div class="message-label">联系人</div>
+            <div class="message-value" v-text="selectedAppeal.contactName"></div>
+          </div>
+        </div>
+        <div class="row">
+          <div class="col-lg-6">
+            <div class="message-label">新手机号</div>
+            <div class="message-value" v-text="selectedAppeal.mobile"></div>
+          </div>
+          <div class="col-lg-6">
+            <div class="message-label">手机号</div>
+            <div class="message-value" v-text="selectedAppeal.contactTel"></div>
+          </div>
+        </div>
+        <!-- 找回密码 -->
+        <div class="reset-password" v-if="approveType === 'resetPassword'">
+          <div class="row">
+            <div class="col-lg-6">
+              <div class="message-label">新密码</div>
+              <div class="message-value" v-text="selectedAppeal.password">12345</div>
+            </div>
+            <div class="col-lg-6">
+              <div class="message-label">电子邮箱</div>
+              <div class="message-value" v-text="selectedAppeal.contactEmail">12345</div>
+            </div>
+          </div>
+        </div>
+        <!-- 验证手机 -->
+        <div class="validate-mobile" v-if="approveType === 'validAccount'">
+          <div class="row">
+            <div class="col-lg-6">
+              <div class="message-label">原手机号</div>
+              <div class="message-value" v-text="selectedAppeal.contactEmail">12345</div>
+            </div>
+            <div class="col-lg-6">
+              <div class="message-label">电子邮箱</div>
+              <div class="message-value" v-text="selectedAppeal.contactEmail">12345</div>
+            </div>
+          </div>
+          <div class="row">
+            <div class="col-lg-6">
+              <div class="message-label">登录密码</div>
+              <div class="message-value" v-text="selectedAppeal.password">12345</div>
+            </div>
+          </div>
+        </div>
+        <!-- 申诉说明 -->
+        <div class="row appeal-reason">
+          <div class="message-label">申述说明</div>
+          <div class="message-value" v-text="selectedAppeal.description"></div>
+        </div>
+      </div>
+
+      <!-- 更换管理员 -->
+      <div class="change-admin" v-if="approveType === 'changeAdmin'">
+        <div style="border-bottom: 1px solid #E5E5E5;padding-bottom: 40px;">
+          <div class="row">
+            <div class="col-lg-6">
+              <div class="message-label">企业UU</div>
+              <div class="message-value">12345</div>
+            </div>
+            <div class="col-lg-6">
+              <div class="message-label">申诉来源</div>
+              <div class="message-value" v-text="selectedAppeal.fromApp || '无'">12345</div>
+            </div>
+          </div>
+          <div class="row">
+            <div class="col-lg-6">
+              <div class="message-label">企业名称</div>
+              <div class="message-value">12345</div>
+            </div>
+            <div class="col-lg-6">
+              <div class="message-label">法定代表人</div>
+              <div class="message-value">12345</div>
+            </div>
+          </div>
+          <div class="row">
+            <div class="col-lg-6">
+              <div class="message-label">营业执照号</div>
+              <div class="message-value">12345</div>
+            </div>
+            <div class="col-lg-6">
+              <div class="message-label">营业执照附件</div>
+              <div class="message-value">12345</div>
+            </div>
+          </div>
+          <div class="row">
+            <div class="col-lg-6" style="width: 840px;">
+              <div class="message-label">注册地址</div>
+              <div class="message-value">不同场景索引组件的用法不同,如城市选择的列表,根据城市首个拼音字母进行排列</div>
+            </div>
+          </div>
+          <!-- 申诉说明 -->
+          <div class="row appeal-reason">
+            <div class="message-label">申述说明</div>
+            <div class="message-value">不同场景索引组件的用法不同,如城市选择的列表,根据城市首个拼音字母进行排列,当手势下拉列表,该字母置顶,直到该字母下的城市全部滑完;对右边字母索引点击</div>
+          </div>
+        </div>
+        <div style="border-bottom: 1px solid #E5E5E5;padding: 26px 0;">
+          <div class="row">
+            <div class="col-lg-6">
+              <div class="message-label">管理员UU</div>
+              <div class="message-value">12345</div>
+            </div>
+          </div>
+          <div class="row">
+            <div class="col-lg-6">
+              <div class="message-label">管理员姓名</div>
+              <div class="message-value">12345</div>
+            </div>
+            <div class="col-lg-6">
+              <div class="message-label">管理员手机号</div>
+              <div class="message-value">12345</div>
+            </div>
+          </div>
+        </div>
+      </div>
+
+      <!-- 对话框尾部 -->
+      <span slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="approveAppeal(selectedAppeal.id, true)">通过</el-button>
+        <el-button @click="approveAppeal(selectedAppeal.id, false)">不通过</el-button>
+      </span>
+    </el-dialog>
   </common-home>
 </template>
 
@@ -138,6 +288,14 @@
       .catch(error)
   }
 
+  function approveAppealRequest (appealId, isPass, success, error) {
+    const params = { isPass }
+
+    axios.put(`/api/appeal/${appealId}/approveAppealRequest`, {}, { params })
+      .then(success)
+      .catch(error)
+  }
+
   function formatDate (row, column, value) {
     if (!value) {
       return ''
@@ -213,6 +371,12 @@
     }
   ]
 
+  const appealTitles = {
+    resetPassword: '找回密码',
+    validAccount: '验证手机',
+    changeAdmin: '更换管理员'
+  }
+
   export default {
     name: 'appeal-home',
     components: {
@@ -235,7 +399,15 @@
         typeOptions: typeOptions,
         fromAppOptions: fromAppOptions,
         statusOptions: statusOptions,
-        searchKeys: searchKeys
+        searchKeys: searchKeys,
+        isShowDialog: false,
+        approveType: '',
+        selectedAppeal: {}
+      }
+    },
+    computed: {
+      appealTitle () {
+        return appealTitles[this.approveType]
       }
     },
     methods: {
@@ -267,17 +439,34 @@
         this.fetchData()
       },
       approveRequest (appeal) {
-        console.log(appeal)
-        if (appeal.type === 'resetPassword') {
-          console.log('找回密码')
-        } else if (appeal.type === 'validAccount') {
-          console.log('验证手机')
-        } else if (appeal.type === 'changeAdmin') {
-          console.log('更换管理员')
+        if (appeal.type !== 'resetPassword' && appeal.type !== 'validAccount' &&
+          appeal.type !== 'changeAdmin') {
+          this.$message.error(`不支持的申诉类型${appeal.type()}`)
+          return -1
         }
+
+        this.approveType = appeal.type
+        const submitInfo = JSON.parse(appeal.submitInfo)
+        this.selectedAppeal = _.defaultsDeep({}, appeal, submitInfo)
+        this.isShowDialog = true
+
+        console.log(this.selectedAppeal)
       },
       showDetail () {
         this.$message.info('此功能暂未开通')
+      },
+      approveAppeal (appealId, isPass) {
+        const success = result => {
+          if (result) {
+            this.isShowDialog = false
+            this.$message.info('操作成功')
+
+            // 刷新页面数据
+            this.fetchData()
+          }
+        }
+
+        approveAppealRequest(appealId, isPass, success, this.showErrorMessage)
       }
     },
     created () {
@@ -290,9 +479,89 @@
 </script>
 
 <style scoped>
+  .row {
+    margin: 0;
+    padding: 16px 0;
+    height: 46px;
+    line-height: 14px;
+  }
+  .row .col-lg-6 {
+    padding: 0;
+  }
+  .row .col-lg-6>div {
+    display: inline-block;
+  }
+  .message-label {
+    width: 105px;
 
+    color: #000000;
+    font-size: 14px;
+    font-weight: normal;
+    font-family: "Microsoft YaHei", sans-serif;
+  }
+  .message-value {
+    color: #828282;
+    font-size: 14px;
+    font-weight: normal;
+    font-family: "Microsoft YaHei", sans-serif;
+  }
+  .message-value-highlight {
+    color: #000000;
+    font-weight: bold;
+  }
+  .reset-or-validate {
+    width: 840px;
+  }
+  .appeal-reason {
+    width: 840px;
+  }
+  .appeal-reason>div {
+    display: inline-block;
+  }
+  .appeal-reason .message-value {
+    width: 730px;
+  }
+  .change-admin {
+    width: 840px;
+  }
 </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;
+  }
+  .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>

+ 10 - 0
sso-manage-console/src/main/java/com/uas/sso/sso/backend/api/AppealBackendController.java

@@ -9,6 +9,7 @@ import java.util.List;
 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;
@@ -45,4 +46,13 @@ public class AppealBackendController {
                 appealService.showAppealsByPagination(page, type, fromApp, status, key, keyword));
     }
 
+    @RequestMapping(method = RequestMethod.PUT, path = "/{appealId}/approveAppealRequest",
+            produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
+    public ResultBean<Boolean> approveAppealRequest(@PathVariable("appealId") Long appealId,
+            Boolean isPass) {
+
+        appealService.approveAppealRequest(appealId, isPass);
+        return new ResultBean<>(true);
+    }
+
 }

+ 8 - 0
sso-manage-console/src/main/java/com/uas/sso/sso/backend/service/AppealService.java

@@ -25,4 +25,12 @@ public interface AppealService {
      */
     Page<Appeal> showAppealsByPagination(Pageable page, String type, String fromApp,
             Short status, String key, String keyword);
+
+    /**
+     * 审核未处理的申诉信息
+     *
+     * @param appealId  申诉信息id
+     * @param isPass    是否审核通过
+     */
+    void approveAppealRequest(Long appealId, Boolean isPass);
 }

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

@@ -3,7 +3,9 @@ package com.uas.sso.sso.backend.service.impl;
 import com.uas.sso.dao.AppealDao;
 import com.uas.sso.entity.Appeal;
 import com.uas.sso.entity.Userspace;
+import com.uas.sso.sso.backend.exceptions.ValidationFailedException;
 import com.uas.sso.sso.backend.service.AppealService;
+import java.sql.Timestamp;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
@@ -16,6 +18,7 @@ import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
 import org.springframework.data.jpa.domain.Specification;
 import org.springframework.stereotype.Service;
+import org.springframework.util.Assert;
 import org.springframework.util.StringUtils;
 
 /**
@@ -73,4 +76,25 @@ public class AppealServiceImpl implements AppealService {
             }
         }, page);
     }
+
+    @Override
+    public void approveAppealRequest(Long appealId, Boolean isPass) {
+        Assert.notNull(isPass, "审核状态不能为空");
+        Appeal appeal = assertAppealExist(appealId);
+
+        appeal.setAuditor("系统管理员");
+        appeal.setAuditDate(new Timestamp(System.currentTimeMillis()));
+        appeal.setStatus((short) (isPass ? 2 : 3));
+        appealDao.save(appeal);
+
+        // TODO 处理对应的用户信息
+    }
+
+    private Appeal assertAppealExist(Long appealId) {
+        Appeal appeal = appealDao.findOne(appealId);
+        if (appeal == null) {
+            throw new ValidationFailedException(String.format("申诉 %d 不存在", appealId));
+        }
+        return appeal;
+    }
 }