Bladeren bron

Portal: 跳转模块

Michael Wang 6 jaren geleden
bovenliggende
commit
d2214d4aca

+ 1 - 0
package.json

@@ -13,6 +13,7 @@
     "axios": "^0.18.0",
     "element-ui": "^2.4.9",
     "moment": "^2.22.2",
+    "rasterizehtml": "^1.3.0",
     "register-service-worker": "^1.0.0",
     "vue": "^2.5.17",
     "vue-awesome": "^3.2.0",

+ 1 - 1
src/modules/marking/routes/routes.js

@@ -1,4 +1,4 @@
-import Home from "../../portal/views/Home.vue";
+import Home from "../../portal/views/home/Home.vue";
 import Marking from "../views/Marking.vue";
 import MarkSettingMain from "../views/MarkSettingMain.vue";
 import MarkWork from "../views/MarkWork.vue";

+ 0 - 1
src/modules/marking/views/MarkWork.vue

@@ -556,7 +556,6 @@ export default {
     }
   },
   created() {
-    this.user.rootOrgId = 7;
     this.getUserPrivileges();
     this.initMarkWorkData();
     //this.getExamSelect();

+ 9 - 3
src/modules/portal/routes/routes.js

@@ -1,5 +1,6 @@
 import Login from "../views/Login.vue";
-import Home from "../views/Home.vue";
+import Home from "../views/home/Home.vue";
+import HomeMain from "../views/home/HomeMain.vue";
 
 export default [
   {
@@ -14,8 +15,13 @@ export default [
   },
   {
     path: "/home",
-    name: "Home",
-    component: Home
+    component: Home,
+    children: [
+      {
+        path: "overview",
+        component: HomeMain
+      }
+    ]
   }
   // {
   //   path: "/about",

+ 1 - 1
src/modules/portal/views/Login.vue

@@ -127,7 +127,7 @@ export default {
           user.loginUrl = "http://" + window.location.host + "/#/login";
           user.indexUrl = "http://" + window.location.host + "/#/index";
           window.name = JSON.stringify(user);
-          this.$router.replace({ path: "/home" });
+          this.$router.replace({ path: "/home/overview" });
           this.$notify({
             message: "登录成功",
             type: "success"

+ 8 - 116
src/modules/portal/views/Home.vue → src/modules/portal/views/home/Home.vue

@@ -20,92 +20,13 @@
     </el-header>
 
     <el-container>
-      <el-aside width="200px">
-        <el-menu
-          default-active="2"
-          class="el-menu-vertical-demo"
-          background-color="#545c64"
-          text-color="#fff"
-          active-text-color="#ffd04b"
-          style="height: 100%"
-        >
-          <el-submenu index="1">
-            <template slot="title">
-              <i class="el-icon-location"></i> <span>基础信息</span>
-            </template>
-            <el-menu-item-group>
-              <template slot="title"
-                >分组一</template
-              >
-              <el-menu-item index="1-1">选项1</el-menu-item>
-              <el-menu-item index="1-2">选项2</el-menu-item>
-            </el-menu-item-group>
-            <el-menu-item-group title="分组2">
-              <el-menu-item index="1-3">选项3</el-menu-item>
-            </el-menu-item-group>
-            <el-submenu index="1-4">
-              <template slot="title"
-                >选项4</template
-              >
-              <el-menu-item index="1-4-1">选项1</el-menu-item>
-            </el-submenu>
-          </el-submenu>
-          <el-menu-item index="2">
-            <i class="el-icon-menu"></i> <span slot="title">考务</span>
-          </el-menu-item>
-          <el-menu-item index="3" disabled>
-            <i class="el-icon-document"></i> <span slot="title">题库</span>
-          </el-menu-item>
-          <el-menu-item index="4">
-            <i class="el-icon-setting"></i> <span slot="title">网考</span>
-          </el-menu-item>
-          <el-menu-item index="5">
-            <i class="el-icon-setting"></i> <span slot="title">阅卷</span>
-          </el-menu-item>
-          <el-menu-item index="6">
-            <v-icon name="print" class="el-icon-" />
-            <span slot="title">印刷</span>
-          </el-menu-item>
-          <el-menu-item index="7">
-            <v-icon name="flag" class="el-icon-" />
-            <span slot="title">报表</span>
-          </el-menu-item>
-        </el-menu>
-      </el-aside>
+      <HomeSide />
       <el-container>
-        <el-main>
-          <div class="content-wrapper">
-            <section class="content">
-              <div class="row"><router-view></router-view></div>
-            </section>
-          </div>
-        </el-main>
+        <router-view></router-view>
         <el-footer>&copy; 启明泰和 2018</el-footer>
       </el-container>
     </el-container>
 
-    <!--
-      <div class="main-content">
-        <section class="content">
-          <div class="row">
-            <ul class="center">
-              <li
-                class="menu"
-                v-for="menu in menuList.filter(m => m.parentId === null)"
-                :key="menu.id"
-              >
-                <a :href="'/' + menu.code.toLowerCase()">{{ menu.name }}</a>
-                <div v-if="menu.code === 'BASIC'">
-                  <a href=""></a>
-                  得到菜单权限
-                </div>
-              </li>
-            </ul>
-          </div>
-        </section>
-      </div>
-    -->
-
     <!-- 添加用户信息弹出框 -->
     <el-dialog title="个人信息" :visible.sync="userDialog">
       <el-tabs>
@@ -173,10 +94,12 @@
 
 <script>
 import { mapActions, mapState } from "vuex";
-import { USER_SIGNOUT } from "../store/user";
-import { core_api } from "../constants/constants";
+import { USER_SIGNOUT } from "../../store/user";
+import { core_api } from "../../constants/constants";
+import HomeSide from "./HomeSide.vue";
 
 export default {
+  name: "Home",
   data() {
     var validatePass = (rule, value, callback) => {
       if (value === "") {
@@ -198,7 +121,6 @@ export default {
       }
     };
     return {
-      menuList: [],
       userDialog: false,
       passForm: { pass: "", checkPass: "" },
       passRules: {
@@ -207,7 +129,7 @@ export default {
       }
     };
   },
-  components: {},
+  components: { HomeSide },
   computed: {
     ...mapState({ user: state => state.user })
   },
@@ -285,33 +207,11 @@ export default {
           });
         });
     }
-  },
-  created() {
-    var url = core_api + "/rolePrivilege/getUserPrivileges";
-    const params = new URLSearchParams();
-    params.append("groupCode", "PORTAL_MENUS");
-    params.append("full", false);
-    this.$http
-      .post(url, params, {
-        headers: { "content-type": "application/x-www-form-urlencoded" }
-      })
-      .then(response => {
-        this.menuList = response.data;
-      })
-      .catch(response => {
-        if (response.status == 500) {
-          this.$notify({
-            showClose: true,
-            message: response.data.desc,
-            type: "error"
-          });
-        }
-      });
   }
 };
 </script>
 
-<style lang="css">
+<style lang="css" scoped>
 .fr {
   float: right;
 }
@@ -321,20 +221,12 @@ export default {
   text-align: center;
   line-height: 60px;
 }
-.el-menu-vertical-demo {
-  height: calc(100vh - 60px);
-}
 .el-aside {
   background-color: #D3DCE6;
   color: #333;
   line-height: 200px;
 }
 
-.el-main {
-  background-color: #E9EEF3;
-  color: #333;
-}
-
 body > .el-container {
   margin-bottom: 40px;
 }

+ 60 - 0
src/modules/portal/views/home/HomeMain.vue

@@ -0,0 +1,60 @@
+<template>
+  <el-main>
+    <div class="main-content">
+      <section class="content">
+        <div class="row">
+          <ul class="center">
+            <li
+              class="menu"
+              v-for="menu in menuList.filter(m => m.parentId === null)"
+              :key="menu.id"
+            >
+              <a :href="'/' + menu.ext4">{{ menu.name }}</a>
+            </li>
+          </ul>
+        </div>
+      </section>
+    </div>
+  </el-main>
+</template>
+
+<script>
+import { mapState } from "vuex";
+import { core_api } from "../../constants/constants";
+
+export default {
+  name: "HomeMain",
+  data() {
+    return {
+      menuList: []
+    };
+  },
+  components: {},
+  computed: {
+    ...mapState({ user: state => state.user })
+  },
+  methods: {},
+  created() {
+    var url = core_api + "/rolePrivilege/getUserPrivileges";
+    const params = new URLSearchParams();
+    params.append("groupCode", "PORTAL_MENUS");
+    params.append("full", false);
+    this.$http
+      .post(url, params, {
+        headers: { "content-type": "application/x-www-form-urlencoded" }
+      })
+      .then(response => {
+        this.menuList = response.data;
+      });
+  }
+};
+</script>
+
+<style lang="css" scoped>
+.el-main {
+  background-color: #E9EEF3;
+  color: #333;
+  text-align: center;
+  line-height: 60px;
+}
+</style>

+ 204 - 0
src/modules/portal/views/home/HomeSide.vue

@@ -0,0 +1,204 @@
+<template>
+  <el-aside width="200px">
+    <el-menu
+      default-active="2"
+      class="el-menu-vertical-demo"
+      background-color="#545c64"
+      text-color="#fff"
+      active-text-color="#ffd04b"
+    >
+      <el-submenu index="1">
+        <template slot="title">
+          <i class="el-icon-location"></i> <span>基础信息</span>
+        </template>
+        <el-menu-item-group>
+          <template slot="title"
+            >分组一</template
+          >
+          <el-menu-item index="1-1">选项1</el-menu-item>
+          <el-menu-item index="1-2">选项2</el-menu-item>
+        </el-menu-item-group>
+        <el-menu-item-group title="分组2">
+          <el-menu-item index="1-3">选项3</el-menu-item>
+        </el-menu-item-group>
+        <el-submenu index="1-4">
+          <template slot="title"
+            >选项4</template
+          >
+          <el-menu-item index="1-4-1">选项1</el-menu-item>
+        </el-submenu>
+      </el-submenu>
+      <el-menu-item index="2">
+        <i class="el-icon-menu"></i> <span slot="title">考务</span>
+      </el-menu-item>
+      <el-menu-item index="3">
+        <i class="el-icon-document"></i> <span slot="title">题库</span>
+      </el-menu-item>
+      <el-menu-item index="4">
+        <i class="el-icon-setting"></i> <span slot="title">网考</span>
+      </el-menu-item>
+      <el-menu-item index="5">
+        <i class="el-icon-setting"></i> <span slot="title">阅卷</span>
+      </el-menu-item>
+      <el-menu-item index="6">
+        <v-icon name="print" class="el-icon-" />
+        <span slot="title">印刷</span>
+      </el-menu-item>
+      <el-menu-item index="7">
+        <v-icon name="flag" class="el-icon-" />
+        <span slot="title">报表</span>
+      </el-menu-item>
+    </el-menu>
+  </el-aside>
+</template>
+
+<script>
+import { mapActions, mapState } from "vuex";
+import { USER_SIGNOUT } from "../../store/user";
+import { core_api } from "../../constants/constants";
+
+export default {
+  name: "HomeSide",
+  data() {
+    var validatePass = (rule, value, callback) => {
+      if (value === "") {
+        callback(new Error("请输入密码"));
+      } else {
+        if (this.passForm.checkPass !== "") {
+          this.$refs.passForm.validateField("checkPass");
+        }
+        callback();
+      }
+    };
+    var validatePass2 = (rule, value, callback) => {
+      if (value === "") {
+        callback(new Error("请输入确认密码"));
+      } else if (value !== this.passForm.pass) {
+        callback(new Error("两次输入密码不一致!"));
+      } else {
+        callback();
+      }
+    };
+    return {
+      menuList: [],
+      userDialog: false,
+      passForm: { pass: "", checkPass: "" },
+      passRules: {
+        pass: [{ validator: validatePass, trigger: "blur" }],
+        checkPass: [{ validator: validatePass2, trigger: "blur" }]
+      }
+    };
+  },
+  computed: {
+    ...mapState({ user: state => state.user })
+  },
+  methods: {
+    ...mapActions([USER_SIGNOUT]),
+    openUserDialog() {
+      this.passForm = { pass: "", checkPass: "" };
+      this.userDialog = true;
+    },
+    //保存密码
+    submitForm() {
+      this.$refs.passForm.validate(valid => {
+        if (valid) {
+          var userId = this.user.userId;
+          var password = encodeURIComponent(this.passForm.pass);
+          var url =
+            core_api +
+            "/user/password?userId=" +
+            userId +
+            "&password=" +
+            password;
+          this.$http.put(url).then(() => {
+            this.$notify({
+              type: "success",
+              message: "修改密码成功!"
+            });
+            this.resetForm();
+            this.userDialog = false;
+          });
+        } else {
+          console.log("error submit!");
+          return false;
+        }
+      });
+    },
+    //重置
+    resetForm() {
+      this.$refs.passForm.resetFields();
+    },
+    isSuperAdmin() {
+      if (!this.user.roleList) {
+        return false;
+      }
+      for (let role of this.user.roleList) {
+        if (role.roleCode == "SUPER_ADMIN") {
+          return true;
+        }
+      }
+      return false;
+    },
+    logout() {
+      this.$http
+        .post(core_api + "/auth/logout")
+        .then(() => {
+          const orgId = this.user.rootOrgId;
+          this.USER_SIGNOUT();
+          window.name = "";
+          this.$router.replace({
+            path: "/login" + "?orgId=" + orgId
+          });
+        })
+        .catch(response => {
+          const orgId = this.user.rootOrgId;
+          if (response.status == 500) {
+            this.$notify({
+              showClose: true,
+              message: response.data.desc,
+              type: "error"
+            });
+          }
+          this.USER_SIGNOUT();
+          window.name = "";
+          this.$router.replace({
+            path: "/login" + "?orgId=" + orgId
+          });
+        });
+    }
+  },
+  created() {
+    var url = core_api + "/rolePrivilege/getUserPrivileges";
+    const params = new URLSearchParams();
+    params.append("groupCode", "PORTAL_MENUS");
+    params.append("full", false);
+    this.$http
+      .post(url, params, {
+        headers: { "content-type": "application/x-www-form-urlencoded" }
+      })
+      .then(response => {
+        this.menuList = response.data;
+      })
+      .catch(response => {
+        if (response.status == 500) {
+          this.$notify({
+            showClose: true,
+            message: response.data.desc,
+            type: "error"
+          });
+        }
+      });
+  }
+};
+</script>
+
+<style lang="css" scoped>
+.el-menu-vertical-demo {
+  height: calc(100vh - 60px);
+}
+.el-aside {
+  background-color: #D3DCE6;
+  color: #333;
+  line-height: 200px;
+}
+</style>

+ 34 - 1
yarn.lock

@@ -2615,6 +2615,11 @@ css-declaration-sorter@^4.0.1:
     postcss "^7.0.1"
     timsort "^0.3.0"
 
+css-font-face-src@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/css-font-face-src/-/css-font-face-src-1.0.0.tgz#a8c6307d48d9afc84a404082cb1776cd458864b1"
+  integrity sha1-qMYwfUjZr8hKQECCyxd2zUWIZLE=
+
 css-loader@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-1.0.1.tgz#6885bb5233b35ec47b006057da01cc640b6b79fe"
@@ -4757,6 +4762,14 @@ ini@^1.3.4, ini@~1.3.0:
   resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
   integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==
 
+inlineresources@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/inlineresources/-/inlineresources-1.0.0.tgz#633e7d3f863a55935c110027a3541d3b56cdda08"
+  integrity sha512-lhldtEpNb9dLnuz8zkyrl6VlNweu0zb9XP1GZ6EnLb3YNxATAjoNdrYxsBiYVVKf1uQmiIOHckcH/NPVlgtRMQ==
+  dependencies:
+    css-font-face-src "^1.0.0"
+    url "~0.11.0"
+
 inquirer@^3.0.6:
   version "3.3.0"
   resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9"
@@ -7777,6 +7790,16 @@ range-parser@^1.0.3, range-parser@~1.2.0:
   resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e"
   integrity sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=
 
+rasterizehtml@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/rasterizehtml/-/rasterizehtml-1.3.0.tgz#65bd3dc892f880b713a5f29b063203eaec372e73"
+  integrity sha512-d2kM6o82UgdozhniyPy3Af9unN1INBd4Rp7Apu2wmblwFOlGxa9VKp0UAuvL/BTQI3/R+bSWJyNkdpN0FJ4VwA==
+  dependencies:
+    inlineresources "^1.0.0"
+    sane-domparser-error "~0.2.0"
+    url "~0.11.0"
+    xmlserializer "~0.6.0"
+
 raw-body@2.3.3:
   version "2.3.3"
   resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.3.tgz#1b324ece6b5706e153855bc1148c65bb7f6ea0c3"
@@ -8214,6 +8237,11 @@ safe-regex@^1.1.0:
   resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
   integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
 
+sane-domparser-error@~0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/sane-domparser-error/-/sane-domparser-error-0.2.0.tgz#adec5360c8a394526c204e61b00ea125f7b2b01f"
+  integrity sha1-rexTYMijlFJsIE5hsA6hJfeysB8=
+
 sane@^2.0.0:
   version "2.5.2"
   resolved "https://registry.yarnpkg.com/sane/-/sane-2.5.2.tgz#b4dc1861c21b427e929507a3e751e2a2cb8ab3fa"
@@ -9360,7 +9388,7 @@ url-parse@^1.4.3:
     querystringify "^2.0.0"
     requires-port "^1.0.0"
 
-url@^0.11.0:
+url@^0.11.0, url@~0.11.0:
   version "0.11.0"
   resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"
   integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=
@@ -9988,6 +10016,11 @@ xml-name-validator@^3.0.0:
   resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a"
   integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==
 
+xmlserializer@~0.6.0:
+  version "0.6.1"
+  resolved "https://registry.yarnpkg.com/xmlserializer/-/xmlserializer-0.6.1.tgz#14099f60272e16cb608be3758992f998070cc29a"
+  integrity sha512-FNb0eEqqUUbnuvxuHqNuKH8qCGKqxu+558Zi8UzOoQk8Z9LdvpONK+v7m3gpKVHrk5Aq+0nNLsKxu/6OYh7Umw==
+
 xregexp@4.0.0:
   version "4.0.0"
   resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.0.0.tgz#e698189de49dd2a18cc5687b05e17c8e43943020"