zhangjie 4 жил өмнө
parent
commit
deedc0afdb

+ 17 - 0
src/api.js

@@ -11,6 +11,23 @@ export const resetPwd = ({ userId, password }) => {
   return $patch(`/api/${userId}/password`, { password }, "json");
 };
 
+// org-manage
+export const orgList = () => {
+  return $get("/api/admin/organization");
+};
+export const createOrg = datas => {
+  return $post(`/api/admin/organization`, datas, "json");
+};
+export const updateOrgUser = datas => {
+  return $put(`/api/admin/organization`, datas, "json");
+};
+export const enableOrgUser = userId => {
+  return $post(`/api/admin/organization/${userId}`, {});
+};
+export const deleteOrg = orgId => {
+  return $del(`/api/admin/organization/${orgId}`);
+};
+
 // work-manage
 export const workList = () => {
   return $get("/api/admin/works");

+ 26 - 0
src/assets/styles/base.less

@@ -148,6 +148,12 @@ body {
     }
   }
 }
+h2.part-box-head-left {
+  font-size: 18px;
+  font-weight: 600;
+  height: 32px;
+  line-height: 32px;
+}
 .part-title {
   font-size: 18px;
   font-weight: 600;
@@ -266,6 +272,26 @@ tr.tr-tips-error td {
   color: @error-color;
 }
 
+.table-block {
+  width: 100%;
+  border-spacing: 0;
+  border-collapse: collapse;
+  margin-bottom: 20px;
+  text-align: center;
+
+  th {
+    padding: 10px;
+    line-height: 20px;
+    letter-spacing: 1px;
+    border: 1px solid @border-color-base-light;
+  }
+  td {
+    padding: 10px;
+    line-height: 20px;
+    border: 1px solid @border-color-base-light;
+  }
+}
+
 /* list */
 .list-lr-right {
   float: right;

+ 1 - 0
src/assets/styles/iview-custom.less

@@ -134,6 +134,7 @@
 .table-action {
   .ivu-icon {
     color: @dark-color-light;
+    font-size: 16px;
     margin: 0 6px;
     transition: transform 0.1s linear;
     cursor: pointer;

+ 26 - 0
src/assets/styles/main.less

@@ -1,3 +1,29 @@
+// org-manage
+.org-manage {
+  .org-table {
+    padding: 10px;
+    border-radius: @box-border-radius-small;
+    background-color: #fff;
+  }
+}
+.modify-org {
+  .form-list {
+    font-size: 0;
+    .modal-form {
+      display: inline-block;
+      vertical-align: top;
+      font-size: 14px;
+      width: 50%;
+      padding: 0 10px;
+    }
+
+    &-1 {
+      .modal-form {
+        width: 100%;
+      }
+    }
+  }
+}
 // work-manage
 
 // work-overview

+ 3 - 0
src/assets/styles/variables.less

@@ -16,6 +16,9 @@
 @dark-color-light: #7c86a3;
 @dark-color-lighter: #8c94ac;
 
+@border-color-base: #dcdfe6;
+@border-color-base-light: #e4e7ed;
+
 @box-border-radius: 20px;
 @box-border-radius-large: 25px;
 @box-border-radius-small: 10px;

+ 4 - 4
src/main.js

@@ -70,10 +70,10 @@ axios.interceptors.request.use(
       config.url = GLOBAL.domain + config.url;
     }
 
-    // 为请求头添加token信息
-    let token = Vue.ls.get("token");
-    if (token) {
-      config.headers["Authorization"] = token;
+    // 为请求头添加信息
+    let organizationId = Vue.ls.get("organizationId");
+    if (organizationId) {
+      config.headers["organizationId"] = organizationId;
     }
 
     // 设置延迟时效

+ 4 - 1
src/modules/grading/GradingDetail.vue

@@ -314,7 +314,10 @@ export default {
       return ["image-view-list", `image-view-list-${this.size / 2}`];
     },
     IS_ADMIN() {
-      return this.curUserRoleType === "ADMIN";
+      return (
+        this.curUserRoleType === "ADMIN" ||
+        this.curUserRoleType === "SUPER_ADMIN"
+      );
     },
     IS_MARK_LEADER() {
       return this.curUserRoleType === "MARK_LEADER";

+ 4 - 1
src/modules/grading/GradingProgress.vue

@@ -182,7 +182,10 @@ export default {
       );
     },
     IS_ADMIN() {
-      return this.curUserRoleType === "ADMIN";
+      return (
+        this.curUserRoleType === "ADMIN" ||
+        this.curUserRoleType === "SUPER_ADMIN"
+      );
     },
     IS_MARK_LEADER() {
       return this.curUserRoleType === "MARK_LEADER";

+ 3 - 1
src/modules/grading/components/GradeAction.vue

@@ -245,7 +245,9 @@ export default {
   },
   computed: {
     IS_ADMIN() {
-      return this.userRole === "ADMIN";
+      return (
+        this.userRole === "ADMIN" || this.curUserRoleType === "SUPER_ADMIN"
+      );
     },
     IS_MARKER() {
       return this.userRole === "MARKER";

+ 9 - 0
src/modules/login/LoginHome.vue

@@ -72,6 +72,9 @@ export default {
         password
       },
       rightRoutes: {
+        SUPER_ADMIN: {
+          router: "OrgManage"
+        },
         ADMIN: {
           router: "WorkManage"
         },
@@ -112,9 +115,15 @@ export default {
       if (!data) return;
 
       this.$ls.set("user", data, this.GLOBAL.authTimeout);
+      this.$ls.set(
+        "organizationId",
+        data.organizationId,
+        this.GLOBAL.authTimeout
+      );
       this.$store.commit("setUser", data);
       // 初次登陆强制修改密码
       if (
+        data.role !== "SUPER_ADMIN" &&
         data.role !== "ADMIN" &&
         data.role !== "INSPECTION" &&
         !data.pwChangedCount

+ 172 - 0
src/modules/main/OrgManage.vue

@@ -0,0 +1,172 @@
+<template>
+  <div class="org-manage home">
+    <view-header class="home-header"></view-header>
+    <div class="home-body">
+      <div class="home-main">
+        <div class="part-box-head">
+          <h2 class="part-box-head-left">机构管理</h2>
+          <div class="part-box-head-right">
+            <Button
+              size="small"
+              type="success"
+              icon="recode-white icon"
+              shape="circle"
+              @click="toAdd"
+              >新增机构</Button
+            >
+          </div>
+        </div>
+
+        <div class="org-table">
+          <table class="table-block">
+            <tr>
+              <th>机构ID号</th>
+              <th>机构名称/项目经理</th>
+              <th>账号</th>
+              <th>密码</th>
+              <th>启用/禁用</th>
+              <th>设置</th>
+              <th>操作</th>
+            </tr>
+
+            <template v-for="org in orgs">
+              <tr :key="org.markUsers[0].id">
+                <td rowspan="2">{{ org.abbreviation }}</td>
+                <td>{{ org.markUsers[0].name }}</td>
+                <td>{{ org.markUsers[0].loginName }}</td>
+                <td>{{ org.markUsers[0].password }}</td>
+                <td class="table-action">
+                  <i
+                    :class="[
+                      'icon',
+                      'ivu-icon',
+                      org.markUsers[0].enabled
+                        ? 'ivu-icon-enable'
+                        : 'ivu-icon-disable'
+                    ]"
+                    :title="org.markUsers[0].enabled ? '禁用' : '启用'"
+                    @click="toAble(org.markUsers[0])"
+                  ></i>
+                </td>
+                <td class="table-action">
+                  <i
+                    :class="[
+                      'ivu-icon',
+                      'ivu-icon-md-create',
+                      { 'btn-disabled': !org.markUsers[0].enabled }
+                    ]"
+                    title="编辑"
+                    @click="toEdit(org.markUsers[0])"
+                  ></i>
+                </td>
+                <td rowspan="2" class="table-action">
+                  <i
+                    class="ivu-icon ivu-icon-md-trash icon-danger"
+                    title="删除"
+                    @click="toDelete(org)"
+                  ></i>
+                  <i
+                    class="ivu-icon ivu-icon-md-arrow-round-forward"
+                    title="进入"
+                    @click="toDetail(org)"
+                  ></i>
+                </td>
+              </tr>
+              <tr :key="org.markUsers[1].id">
+                <td>{{ org.markUsers[1].name }}</td>
+                <td>{{ org.markUsers[1].loginName }}</td>
+                <td>{{ org.markUsers[1].password }}</td>
+                <td class="table-action">
+                  <i
+                    :class="[
+                      'icon',
+                      'ivu-icon',
+                      org.markUsers[1].enabled
+                        ? 'ivu-icon-enable'
+                        : 'ivu-icon-disable'
+                    ]"
+                    :title="org.markUsers[1].enabled ? '禁用' : '启用'"
+                    @click="toAble(org.markUsers[1])"
+                  ></i>
+                </td>
+                <td class="table-action">
+                  <i
+                    :class="[
+                      'ivu-icon',
+                      'ivu-icon-md-create',
+                      { 'btn-disabled': !org.markUsers[1].enabled }
+                    ]"
+                    title="编辑"
+                    @click="toEdit(org.markUsers[1])"
+                  ></i>
+                </td>
+              </tr>
+            </template>
+          </table>
+        </div>
+      </div>
+    </div>
+
+    <view-footer></view-footer>
+
+    <modify-org
+      :instance="curUsers"
+      @modified="getList"
+      ref="ModifyOrg"
+    ></modify-org>
+  </div>
+</template>
+
+<script>
+import { orgList, enableOrgUser, deleteOrg } from "@/api";
+import ModifyOrg from "./components/ModifyOrg";
+
+export default {
+  name: "org-manage",
+  components: { ModifyOrg },
+  data() {
+    return {
+      orgs: [],
+      curUsers: []
+    };
+  },
+  mounted() {
+    this.getList();
+  },
+  methods: {
+    async getList() {
+      const data = await orgList();
+      this.orgs = data;
+    },
+    toAdd() {
+      this.curUsers = [];
+      this.$refs.ModifyOrg.open();
+    },
+    toEdit(user) {
+      this.curUsers = [user];
+      this.$refs.ModifyOrg.open();
+    },
+    async toAble(user) {
+      await enableOrgUser(user.id);
+      user.enabled = !user.enabled;
+    },
+    toDetail(row) {
+      this.$ls.set("organizationId", row.id, this.GLOBAL.authTimeout);
+      this.$router.push({ name: "WorkManage" });
+    },
+    toDelete(row) {
+      this.$Modal.confirm({
+        content: "确定要删除当前机构吗?",
+        onOk: () => {
+          this.toDel(row.id);
+        }
+      });
+    },
+    async toDel(id) {
+      await deleteOrg(id);
+      this.$Message.success("删除成功!");
+      this.getList();
+    }
+  }
+};
+</script>

+ 177 - 0
src/modules/main/components/ModifyOrg.vue

@@ -0,0 +1,177 @@
+<template>
+  <Modal
+    class="modify-org"
+    v-model="modalIsShow"
+    :title="title"
+    :mask-closable="false"
+    :width="modalWidth"
+    @on-visible-change="visibleChange"
+  >
+    <div :class="['form-list', { 'form-list-1': isEdit }]">
+      <Form
+        class="modal-form"
+        v-for="(itemForm, findex) in modalForms"
+        :key="findex"
+        :ref="`modalFormComp${findex}`"
+        :model="itemForm"
+        :rules="rules"
+        :label-width="100"
+      >
+        <FormItem
+          prop="name"
+          :label="itemForm.userType === '1' ? '机构名称' : '项目经理'"
+        >
+          <Input
+            size="large"
+            v-model.trim="itemForm.name"
+            placeholder="请输入名称"
+            clearable
+          ></Input>
+        </FormItem>
+        <FormItem prop="loginName" label="账号">
+          <Input
+            size="large"
+            v-model.trim="itemForm.loginName"
+            placeholder="请输入账号"
+            :disabled="isEdit"
+            clearable
+          ></Input>
+        </FormItem>
+        <FormItem prop="password" label="密码" v-if="isEdit">
+          <Input
+            size="large"
+            type="text"
+            v-model.trim="itemForm.password"
+            placeholder="输入密码"
+            clearable
+          ></Input>
+        </FormItem>
+      </Form>
+    </div>
+    <div slot="footer">
+      <Button shape="circle" type="primary" :disabled="isSubmit" @click="submit"
+        >确认</Button
+      >
+      <Button shape="circle" @click="cancel">取消</Button>
+    </div>
+  </Modal>
+</template>
+
+<script>
+import { createOrg, updateOrgUser } from "@/api";
+import { password } from "@/plugins/formRules";
+
+const initModalForms = [
+  {
+    name: "",
+    loginName: "",
+    userType: "1"
+  },
+  {
+    name: "",
+    loginName: "",
+    userType: "2"
+  }
+];
+
+export default {
+  name: "modify-org",
+  props: {
+    instance: {
+      type: Array,
+      default() {
+        return [];
+      }
+    }
+  },
+  computed: {
+    isEdit() {
+      return !!this.instance.length;
+    },
+    title() {
+      return (this.isEdit ? "编辑" : "新增") + "机构信息";
+    },
+    modalWidth() {
+      return this.isEdit ? 500 : 800;
+    }
+  },
+  data() {
+    return {
+      modalIsShow: false,
+      isSubmit: false,
+      modalForms: [],
+      rules: {
+        name: [
+          {
+            required: true,
+            message: "请输入名称",
+            trigger: "change"
+          }
+        ],
+        loginName: [
+          {
+            required: true,
+            pattern: /^[a-zA-Z0-9_-]{3,20}$/,
+            message: "账号只能包含字母、数字、下划线以及短横线,长度3-20位",
+            trigger: "change"
+          }
+        ],
+        password
+      }
+    };
+  },
+  methods: {
+    initData(val) {
+      if (this.instance.length) {
+        this.modalForms = this.instance.map(item => {
+          return { ...item };
+        });
+      } else {
+        this.modalForms = initModalForms.map(item => {
+          return { ...item };
+        });
+      }
+      // this.modalForms.forEach((item, index) => {
+      //   this.$refs[`modalFormComp${index}`].resetFields();
+      // });
+    },
+    visibleChange(visible) {
+      if (visible) {
+        this.initData();
+      }
+    },
+    cancel() {
+      this.modalIsShow = false;
+    },
+    open() {
+      this.modalIsShow = true;
+    },
+    async submit() {
+      const validAll = this.modalForms.map((item, index) => {
+        return this.$refs[`modalFormComp${index}`][0].validate();
+      });
+      const res = await Promise.all(validAll).catch(() => {});
+      console.log(res);
+      if (res.some(item => !item)) return;
+
+      if (this.isSubmit) return;
+      this.isSubmit = true;
+      let data = null;
+      if (this.isEdit) {
+        data = await updateOrgUser(this.modalForms[0]).catch(() => {});
+      } else {
+        data = await createOrg({
+          markUsers: this.modalForms
+        }).catch(() => {});
+      }
+      this.isSubmit = false;
+
+      if (!data) return;
+
+      this.$Message.success(this.title + "成功!");
+      this.$emit("modified");
+      this.cancel();
+    }
+  }
+};
+</script>

+ 4 - 1
src/modules/mark/MarkDetail.vue

@@ -210,7 +210,10 @@ export default {
       return ["image-view-list", `image-view-list-${this.size / 2}`];
     },
     IS_ADMIN() {
-      return this.curUserRoleType === "ADMIN";
+      return (
+        this.curUserRoleType === "ADMIN" ||
+        this.curUserRoleType === "SUPER_ADMIN"
+      );
     },
     IS_MARK_LEADER() {
       return this.curUserRoleType === "MARK_LEADER";

+ 3 - 1
src/modules/mark/components/MarkAction.vue

@@ -314,7 +314,9 @@ export default {
   },
   computed: {
     IS_ADMIN() {
-      return this.userRole === "ADMIN";
+      return (
+        this.userRole === "ADMIN" || this.curUserRoleType === "SUPER_ADMIN"
+      );
     },
     IS_MARKER() {
       return this.userRole === "MARKER";

+ 1 - 1
src/plugins/formRules.js

@@ -4,7 +4,7 @@
 const username = [
   {
     required: true,
-    pattern: /^[a-zA-Z0-9_-]{2,19}$/,
+    pattern: /^[a-zA-Z0-9_-]{3,20}$/,
     message: "用户名只能包含字母、数字、下划线以及短横线,长度3-20位",
     trigger: "change"
   }

+ 9 - 0
src/routers/main.js

@@ -1,4 +1,5 @@
 import Main from "../modules/main/Main.vue";
+import OrgManage from "../modules/main/OrgManage";
 import WorkManage from "../modules/main/WorkManage";
 import WorkOverview from "../modules/main/WorkOverview";
 import PaperManage from "../modules/main/PaperManage";
@@ -177,6 +178,14 @@ const mainRoutes = [
 ];
 
 export default [
+  {
+    path: "/org-manage",
+    name: "OrgManage",
+    component: OrgManage,
+    meta: {
+      title: "机构管理"
+    }
+  },
   {
     path: "/work-manage",
     name: "WorkManage",