Browse Source

Basic: 初次提交

Michael Wang 6 years ago
parent
commit
2602e05f61

+ 0 - 0
src/modules/basic/.ignore


+ 22 - 0
src/modules/basic/constants/constants.js

@@ -0,0 +1,22 @@
+export const core_api = "/api/ecs_core";
+export const LEVEL_TYPE = [
+  { label: "专升本", value: "ZSB" },
+  { label: "高起专", value: "GQZ" },
+  { label: "高起本", value: "GQB" },
+  { label: "不限", value: "ALL" }
+];
+export const ENABLE_TYPE = [
+  { label: "启用", value: true },
+  { label: "禁用", value: false }
+];
+export const ROLE_TYPE = [
+  { code: "ECS_QUES_INPUTER", name: "题库录入员" },
+  { code: "ECS_QUES_AUDITER", name: "题库审核员" },
+  { code: "ECS_QUES_GENER", name: "题库组卷员" },
+  { code: "ECS_QUES_ADMIN", name: "题库管理员" },
+  { code: "ECS_MARKING_MARKER", name: "阅卷评卷员" },
+  { code: "ECS_MARKING_ADMIN", name: "阅卷管理员" },
+  { code: "ECS_OE_STUDENT", name: "网考考生" },
+  { code: "ECS_OE_ADMIN", name: "网考管理员" }
+];
+export const PERMISSION_TYPE = { MENU: "MENU", PAGE: "PAGE" };

+ 61 - 0
src/modules/basic/routes/routes.js

@@ -0,0 +1,61 @@
+import Home from "../../portal/views/home/Home.vue";
+import school from "../view/school.vue";
+import campus from "../view/campus.vue";
+import user from "../view/user.vue";
+import specially from "../view/specially.vue";
+import course from "../view/course.vue";
+import examSite from "../view/exam_site.vue";
+import app_list from "../view/app_list.vue";
+import privilege_group_list from "../view/privilege_group_list.vue";
+import privilege_tree from "../view/privilege_tree.vue";
+import role_privilege_settings from "../view/role_privilege_settings.vue";
+
+export default [
+  {
+    path: "/basic", //基础信息
+    meta: { auth: false },
+    component: Home,
+    children: [
+      {
+        path: "course", //课程管理
+        component: course
+      },
+      {
+        path: "specially", //专业管理
+        component: specially
+      },
+      {
+        path: "school", //学校管理
+        component: school
+      },
+      {
+        path: "campus", //学习中心管理
+        component: campus
+      },
+      {
+        path: "examSite/:orgId", //考点管理
+        component: examSite
+      },
+      {
+        path: "user", //用户管理
+        component: user
+      },
+      {
+        path: "app_list", //应用列表
+        component: app_list
+      },
+      {
+        path: "privilege_group_list", //权限组列表
+        component: privilege_group_list
+      },
+      {
+        path: "privilege_tree/:privilegeGroupId", //权限树
+        component: privilege_tree
+      },
+      {
+        path: "role_privilege_settings", //角色权限设置
+        component: role_privilege_settings
+      }
+    ]
+  }
+];

+ 12 - 0
src/modules/basic/view/App.vue

@@ -0,0 +1,12 @@
+<style scoped>
+div {
+  font-family: "Arial", "Helvetica", "sans-serif", "Hiragino Sans GB",
+    "Micrsoft YaHei";
+}
+</style>
+<template>
+  <div id="app"><router-view></router-view></div>
+</template>
+<script>
+export default {};
+</script>

+ 77 - 0
src/modules/basic/view/app_list.vue

@@ -0,0 +1,77 @@
+<template>
+  <div>
+    <section class="content" style="margin-top: -10px;">
+      <div class="box box-info">
+        <!-- 头信息 -->
+        <div class="box-header with-border">
+          <h3 class="box-title">鉴权管理 > 应用列表</h3>
+          <div class="box-tools pull-right">
+            <button
+              type="button"
+              class="btn btn-box-tool"
+              data-widget="collapse"
+            >
+              <i class="fa fa-minus"></i>
+            </button>
+          </div>
+        </div>
+
+        <!-- 正文信息 -->
+        <div class="box-body">
+          <el-table
+            :data="appList"
+            border
+            style="width: 800px;text-align:center;"
+          >
+            <el-table-column prop="id" label="ID" width="100">
+            </el-table-column>
+            <el-table-column prop="code" label="应用编码"> </el-table-column>
+            <el-table-column prop="name" label="应用名称"> </el-table-column>
+          </el-table>
+        </div>
+      </div>
+    </section>
+  </div>
+</template>
+
+<script>
+import { mapActions, mapState } from "vuex";
+import { USER_SIGNIN } from "../../portal/store/user";
+import { core_api } from "../constants/constants.js";
+
+export default {
+  data() {
+    return {
+      appList: []
+    };
+  },
+  computed: {
+    ...mapState({ user: state => state.user })
+  },
+  methods: {
+    ...mapActions([USER_SIGNIN]),
+
+    queryAppList: function() {
+      var url = core_api + "/app/getAllApp";
+      this.$http
+        .get(url)
+        .then(response => {
+          console.log(response);
+          this.appList = response.data;
+        })
+        .catch(response => {
+          if (response.status == 500) {
+            this.$notify({
+              showClose: true,
+              message: response.data.desc,
+              type: "error"
+            });
+          }
+        });
+    }
+  },
+  created() {
+    this.queryAppList();
+  }
+};
+</script>

+ 744 - 0
src/modules/basic/view/campus.vue

@@ -0,0 +1,744 @@
+<template>
+  <div>
+    <section class="content" style="margin-top: -10px;">
+      <div class="box box-info">
+        <!-- 头信息 -->
+        <div
+          class="box-header with-border"
+          style="background-color:#D3DCE6;margin-bottom:20px;"
+        >
+          <h3 class="box-title">学习中心</h3>
+          <div class="box-tools pull-right">
+            <button
+              type="button"
+              class="btn btn-box-tool"
+              data-widget="collapse"
+            >
+              <i class="fa fa-minus"></i>
+            </button>
+          </div>
+        </div>
+        <!-- 正文信息 -->
+        <div
+          class="box-body"
+          v-loading.body="fileLoading"
+          element-loading-text="机构上传中,请稍后..."
+        >
+          <!-- 表单 -->
+          <el-form
+            :inline="true"
+            :model="formSearch"
+            label-position="right"
+            label-width="100px"
+          >
+            <el-row :gutter="5">
+              <el-form-item label="顶级机构" class="pull-left">
+                <el-select
+                  class="input_width_lg"
+                  v-model="formSearch.parentId"
+                  placeholder="请选择"
+                  :disabled="!isSuperAdmin"
+                >
+                  <el-option
+                    v-for="item in rootOrgList"
+                    :label="item.name"
+                    :value="item.id"
+                    :key="item.id"
+                  >
+                  </el-option>
+                </el-select>
+              </el-form-item>
+              <el-form-item label="中心代码" class="pull-left">
+                <el-input
+                  placeholder="请输入学习中心代码"
+                  v-model="formSearch.code"
+                ></el-input>
+              </el-form-item>
+              <el-form-item label="中心名称" class="pull-left">
+                <el-input
+                  placeholder="请输入学习中心名称"
+                  v-model="formSearch.name"
+                ></el-input>
+              </el-form-item>
+              <el-form-item class="pull-right">
+                <el-button
+                  size="small"
+                  type="primary"
+                  icon="search"
+                  @click="searchForm"
+                  >查询</el-button
+                >
+                <el-button
+                  size="small"
+                  type="primary"
+                  icon="plus"
+                  @click="insert"
+                  >新增</el-button
+                >
+                <el-button
+                  size="small"
+                  type="primary"
+                  icon="upload2"
+                  @click="imp"
+                  >导入</el-button
+                >
+                <el-button size="small" type="success" @click="enableOrg"
+                  ><i class="fa fa-check" aria-hidden="true"></i>启用
+                </el-button>
+                <el-button size="small" type="danger" @click="disableOrg"
+                  ><i class="fa fa-close" aria-hidden="true"></i>禁用
+                </el-button>
+              </el-form-item>
+            </el-row>
+          </el-form>
+
+          <!-- 添加或修改学习中心弹出框 -->
+          <el-dialog title="中心信息" :visible.sync="campusDialog" size="tiny">
+            <el-form
+              :inline="true"
+              :model="campusForm"
+              ref="campusForm"
+              :rules="rules"
+              label-position="right"
+              label-width="90px"
+            >
+              <el-row>
+                <el-form-item label="中心代码" label-width="120px" prop="code">
+                  <el-input
+                    :readonly="null != campusForm.id"
+                    class="pull_length"
+                    v-model="campusForm.code"
+                    auto-complete="off"
+                    placeholder="中心代码"
+                  ></el-input>
+                </el-form-item>
+              </el-row>
+              <el-row>
+                <el-form-item label="中心名称" label-width="120px" prop="name">
+                  <el-input
+                    class="pull_length"
+                    v-model="campusForm.name"
+                    auto-complete="off"
+                    placeholder="中心名称"
+                  ></el-input>
+                </el-form-item>
+              </el-row>
+              <el-row>
+                <el-form-item
+                  label="中心负责人"
+                  label-width="120px"
+                  prop="contacts"
+                >
+                  <el-input
+                    class="pull_length"
+                    v-model="campusForm.contacts"
+                    auto-complete="off"
+                    placeholder="中心负责人"
+                  ></el-input>
+                </el-form-item>
+              </el-row>
+              <el-row>
+                <el-form-item
+                  label="联系方式"
+                  label-width="120px"
+                  prop="telephone"
+                >
+                  <el-input
+                    class="pull_length"
+                    v-model="campusForm.telephone"
+                    auto-complete="off"
+                    placeholder="联系方式"
+                  ></el-input>
+                </el-form-item>
+              </el-row>
+              <el-row>
+                <el-form-item label="状态" label-width="120px" prop="enable">
+                  <el-radio-group
+                    class="pull_right_sm"
+                    v-model="campusForm.enable"
+                  >
+                    <el-radio label="true">启用</el-radio>
+                    <el-radio label="false">禁用</el-radio>
+                  </el-radio-group>
+                </el-form-item>
+              </el-row>
+              <el-row class="pull_center">
+                <el-button type="primary" @click="submitForm">保 存</el-button>
+                <el-button @click="campusDialog = false;">取 消</el-button>
+              </el-row>
+            </el-form>
+          </el-dialog>
+
+          <!-- 导入弹窗 -->
+          <el-dialog title="导入窗口" size="tiny" :visible.sync="impDialog">
+            <el-form>
+              <el-row>
+                <el-form-item style="margin-left:20px">
+                  <el-upload
+                    class="form_left"
+                    ref="upload"
+                    accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
+                    :action="uploadAction"
+                    :headers="uploadHeaders"
+                    :data="uploadData"
+                    :before-upload="beforeUpload"
+                    :on-progress="uploadProgress"
+                    :on-success="uploadSuccess"
+                    :on-error="uploadError"
+                    :file-list="fileList"
+                    :auto-upload="false"
+                    :multiple="false"
+                  >
+                    <el-button size="small" slot="trigger" type="primary"
+                      >选择文件</el-button
+                    >
+                    <el-button size="small" type="success" @click="submitUpload"
+                      >确认上传
+                    </el-button>
+                    <el-button size="small" type="danger" @click="removeFile"
+                      >清空文件
+                    </el-button>
+                    <el-button size="small" type="info" @click="exportFile"
+                      >下载模板
+                    </el-button>
+                    <div slot="tip" class="el-upload__tip">
+                      只能上传xlsx文件
+                    </div>
+                  </el-upload>
+                </el-form-item>
+              </el-row>
+            </el-form>
+          </el-dialog>
+
+          <!-- 导入错误信息列表 -->
+          <el-dialog title="错误提示" :visible.sync="errDialog">
+            <div
+              class="text-danger"
+              v-for="errMessage in errMessages"
+              :key="errMessage.lineNum"
+            >
+              第{{ errMessage.lineNum }}行:{{ errMessage.msg }}
+            </div>
+            <span slot="footer" class="dialog-footer">
+              <el-button @click="errDialog = false;">确定</el-button>
+            </span>
+          </el-dialog>
+
+          <!-- 页面列表 -->
+          <el-table
+            :data="tableData"
+            border
+            style="width: 100%;text-align:center;"
+            @selection-change="selectChange"
+          >
+            <el-table-column type="selection" width="55"> </el-table-column>
+            <el-table-column width="150" label="ID">
+              <template slot-scope="scope">
+                <div>
+                  <span>{{ scope.row.id }}</span>
+                </div>
+              </template>
+            </el-table-column>
+            <el-table-column width="200" label="中心代码">
+              <template slot-scope="scope">
+                <div>
+                  <span>{{ scope.row.code }}</span>
+                </div>
+              </template>
+            </el-table-column>
+            <el-table-column width="200" label="中心名称">
+              <template slot-scope="scope">
+                <div>
+                  <span>{{ scope.row.name }}</span>
+                </div>
+              </template>
+            </el-table-column>
+            <el-table-column width="100" label="负责人">
+              <template slot-scope="scope">
+                <div>
+                  <span>{{ scope.row.contacts }}</span>
+                </div>
+              </template>
+            </el-table-column>
+            <el-table-column width="150" label="联系方式">
+              <template slot-scope="scope">
+                <div>
+                  <span>{{ scope.row.telephone }}</span>
+                </div>
+              </template>
+            </el-table-column>
+            <el-table-column width="170" label="更新时间">
+              <template slot-scope="scope">
+                <div>
+                  <span>{{ scope.row.updateTime }}</span>
+                </div>
+              </template>
+            </el-table-column>
+            <el-table-column width="100" label="状态">
+              <template slot-scope="scope">
+                <div>
+                  <span>
+                    <el-tag :type="getTag(scope.row.enable)">
+                      {{ getStatus(scope.row.enable) }}
+                    </el-tag>
+                  </span>
+                </div>
+              </template>
+            </el-table-column>
+            <el-table-column :context="_self" label="操作">
+              <template slot-scope="scope">
+                <div>
+                  <el-button
+                    size="mini"
+                    type="primary"
+                    @click="edit(scope.row);"
+                  >
+                    <i class="el-icon-edit"></i> 修改
+                  </el-button>
+                  <el-button
+                    size="mini"
+                    type="info"
+                    @click="toExamSite(scope.row);"
+                  >
+                    考点设置
+                  </el-button>
+                </div>
+              </template>
+            </el-table-column>
+          </el-table>
+          <div class="page pull-right">
+            <el-pagination
+              @current-change="handleCurrentChange"
+              :current-page="currentPage"
+              :page-size="pageSize"
+              layout="total, prev, pager, next, jumper"
+              :total="total"
+            >
+            </el-pagination>
+          </div>
+        </div>
+      </div>
+    </section>
+  </div>
+</template>
+<script>
+import { core_api } from "../constants/constants.js";
+import { mapState } from "vuex";
+
+export default {
+  data() {
+    return {
+      isSuperAdmin: false,
+      rootOrgList: [],
+      formSearch: {
+        parentId: null,
+        code: "",
+        name: ""
+      },
+      campusForm: {
+        id: null,
+        name: "",
+        code: "",
+        domainName: "",
+        contacts: "",
+        telephone: "",
+        enable: "true",
+        remark: "",
+        properties: {}
+      },
+      campusDialog: false,
+      selectedOrgIds: [],
+      loading: true,
+      tableData: [],
+      currentPage: 1,
+      pageSize: 10,
+      total: 10,
+
+      impDialog: false,
+      uploadAction: core_api + "/org/importSubOrg",
+      uploadHeaders: {},
+      uploadData: {},
+      errMessages: [],
+      errDialog: false,
+      fileLoading: false,
+      fileList: [],
+
+      rules: {
+        code: [{ required: true, message: "请输入代码", trigger: "blur" }],
+        name: [{ required: true, message: "请输入名称", trigger: "blur" }],
+        contacts: [
+          { required: true, message: "请输入负责人", trigger: "blur" }
+        ],
+        telephone: [
+          { required: true, message: "请输入联系方式", trigger: "blur" }
+        ],
+        enable: [{ required: true, message: "状态", trigger: "change" }]
+      }
+    };
+  },
+  computed: {
+    ...mapState({ user: state => state.user }),
+    orgIds() {
+      var orgIds = "";
+      for (let orgId of this.selectedOrgIds) {
+        if (!orgIds) {
+          orgIds += orgId;
+        } else {
+          orgIds += "," + orgId;
+        }
+      }
+      return orgIds;
+    }
+  },
+  methods: {
+    toExamSite(row) {
+      this.$router.push({ path: "/index/examSite/" + row.id });
+    },
+    getStatus(status) {
+      if (status == true) {
+        return "启用";
+      } else if (status == false) {
+        return "禁用";
+      }
+      return status;
+    },
+    getTag(status) {
+      if (status == true) {
+        return "success";
+      } else if (status == false) {
+        return "danger";
+      }
+      return status;
+    },
+    import() {
+      this.imp = core_api + "/org/" + 0 + "/import";
+    },
+    handleCurrentChange(val) {
+      this.currentPage = val;
+      this.searchForm();
+    },
+    //查询
+    searchForm() {
+      this.loading = true;
+      var param = new URLSearchParams(this.formSearch);
+      console.log("this.formSearch:", this.formSearch);
+      var url =
+        core_api +
+        "/org/subOrgPage/" +
+        (this.currentPage - 1) +
+        "/" +
+        this.pageSize +
+        "?" +
+        param;
+      this.$http.get(url).then(response => {
+        console.log(response);
+        this.tableData = response.data.list;
+        this.total = response.data.total;
+        this.loading = false;
+      });
+    },
+    //导入
+    handleRemove(file, fileList) {
+      console.log(file, fileList);
+    },
+    handlePreview(file) {
+      console.log(file);
+    },
+    //启用
+    enableOrg() {
+      if (this.selectedOrgIds.length === 0) {
+        this.$notify({
+          type: "warning",
+          message: "请选择要启用的机构"
+        });
+      } else {
+        this.$confirm("是否开启这些机构?", "提示", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(() => {
+          var url = core_api + "/org/enable/" + this.orgIds;
+          this.$http
+            .put(url)
+            .then(() => {
+              this.$notify({
+                type: "success",
+                message: "启用成功!"
+              });
+              this.searchForm();
+            })
+            .catch(response => {
+              if (response.status == 500) {
+                this.$notify({
+                  showClose: true,
+                  message: response.data.desc,
+                  type: "error"
+                });
+              }
+            });
+        });
+      }
+    },
+    disableOrg() {
+      if (this.selectedOrgIds.length === 0) {
+        this.$notify({
+          type: "warning",
+          message: "请选择要禁用的机构"
+        });
+      } else {
+        this.$confirm("是否禁用这些机构?", "提示", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(() => {
+          var url = core_api + "/org/disable/" + this.orgIds;
+          this.$http
+            .put(url, {})
+            .then(() => {
+              this.$notify({
+                type: "success",
+                message: "禁用成功!"
+              });
+              this.searchForm();
+            })
+            .catch(response => {
+              if (response.status == 500) {
+                this.$notify({
+                  showClose: true,
+                  message: response.data.desc,
+                  type: "error"
+                });
+              }
+            });
+        });
+      }
+    },
+    selectChange(row) {
+      this.selectedOrgIds = [];
+      row.forEach(element => {
+        this.selectedOrgIds.push(element.id);
+      });
+      console.log(this.selectedOrgIds);
+    },
+    //重置
+    resetForm() {
+      this.$refs.campusForm.resetFields();
+    },
+    //提交
+    submitForm() {
+      this.$refs.campusForm.validate(valid => {
+        if (valid) {
+          if (null != this.campusForm.id) {
+            url = core_api + "/org/updateSubOrg";
+            this.$http.put(url, this.campusForm).then(
+              () => {
+                this.$notify({
+                  type: "success",
+                  message: "修改成功!"
+                });
+                this.searchForm();
+                this.resetForm();
+                this.campusDialog = false;
+              },
+              response => {
+                if (response.status == 500) {
+                  this.$notify({
+                    showClose: true,
+                    message: response.data.desc,
+                    type: "error"
+                  });
+                }
+              }
+            );
+          } else {
+            //新增
+            var url = core_api + "/org/addSubOrg";
+            this.$http.post(url, this.campusForm).then(
+              () => {
+                this.$notify({
+                  type: "success",
+                  message: "新增成功!"
+                });
+                this.searchForm();
+                this.resetForm();
+                this.campusDialog = false;
+              },
+              response => {
+                if (response.status == 500) {
+                  this.$notify({
+                    showClose: true,
+                    message: response.data.desc,
+                    type: "error"
+                  });
+                }
+              }
+            );
+          }
+        } else {
+          console.log("error submit!");
+          return false;
+        }
+      });
+    },
+    //新增
+    insert() {
+      this.campusForm.id = null;
+      this.campusForm.name = "";
+      this.campusForm.code = "";
+      this.campusForm.domainName = "";
+      this.campusForm.telephone = "";
+      this.campusForm.contacts = "";
+      this.campusForm.enable = "true";
+
+      this.campusDialog = true;
+    },
+    //修改
+    edit(row) {
+      this.campusForm.id = row.id;
+      this.campusForm.name = row.name;
+      this.campusForm.code = row.code;
+      this.campusForm.domainName = row.domainName;
+      this.campusForm.telephone = row.telephone;
+      this.campusForm.contacts = row.contacts;
+      this.campusForm.enable = row.enable ? "true" : "false";
+
+      this.campusDialog = true;
+    },
+    //导入
+    imp() {
+      this.impDialog = true;
+      this.initUpload();
+    },
+    initUpload() {
+      this.fileList = [];
+    },
+    beforeUpload(file) {
+      console.log(file);
+    },
+    uploadProgress() {
+      console.log("uploadProgress");
+    },
+    uploadSuccess(response) {
+      if (!response.hasError) {
+        this.$notify({
+          message: "上传成功",
+          type: "success"
+        });
+        this.fileLoading = false;
+        this.impDialog = false;
+        this.searchForm();
+      } else {
+        this.fileLoading = false;
+        this.impDialog = false;
+        this.errMessages = response.failRecords;
+        this.errDialog = response.hasError;
+      }
+    },
+    uploadError(response) {
+      var jsonStr = response.message.substring(4);
+      var resp = eval("(" + jsonStr + ")");
+      if (response.status == 500) {
+        this.$notify({
+          message: resp.desc,
+          type: "error"
+        });
+      }
+      this.fileLoading = false;
+    },
+    //确定上传
+    submitUpload() {
+      if (!this.checkUpload()) {
+        return false;
+      }
+      this.$refs.upload.submit();
+      this.fileLoading = true;
+    },
+    checkUpload() {
+      var fileList = this.$refs.upload.uploadFiles;
+      if (fileList.length == 0) {
+        this.$notify({
+          message: "上传文件不能为空",
+          type: "error"
+        });
+        return false;
+      }
+      if (fileList.length > 1) {
+        this.$notify({
+          message: "每次只能上传一个文件",
+          type: "error"
+        });
+        return false;
+      }
+      for (let file of fileList) {
+        if (!file.name.endsWith(".xlsx")) {
+          this.$notify({
+            message: "上传文件必须为xlsx格式",
+            type: "error"
+          });
+          this.initUpload();
+          return false;
+        }
+      }
+      return true;
+    },
+    //清空文件
+    removeFile() {
+      // this.fileList = [];
+      this.$refs.upload.clearFiles();
+    },
+    //下载模板
+    exportFile() {
+      window.location.href =
+        core_api +
+        "/org/importTemplate?$key=" +
+        this.user.key +
+        "&$token=" +
+        this.user.token;
+    },
+    init() {
+      for (let role of this.user.roleList) {
+        if (role.roleCode == "SUPER_ADMIN") {
+          this.isSuperAdmin = true;
+          break;
+        }
+      }
+
+      this.$http.get(core_api + "/org/getRootOrgList").then(response => {
+        this.rootOrgList = response.data;
+        this.formSearch.parentId = this.user.rootOrgId;
+        this.searchForm();
+      });
+    }
+  },
+  //初始化查询
+  created() {
+    this.init();
+    this.uploadHeaders = {
+      key: this.user.key,
+      token: this.user.token
+    };
+  }
+};
+</script>
+
+<style>
+.page {
+  margin-top: 10px;
+}
+
+.buttonframe {
+  margin-left: 20px;
+}
+
+.el-table th > .cell {
+  text-align: center;
+}
+
+.el-textarea__inner {
+  resize: none;
+}
+
+.el-upload {
+  width: 80px;
+}
+</style>

+ 1209 - 0
src/modules/basic/view/course.vue

@@ -0,0 +1,1209 @@
+<template>
+  <div>
+    <section class="content">
+      <div class="box box-info">
+        <!-- 头信息 -->
+        <div class="box-header with-border">
+          <h3 class="box-title">课程列表</h3>
+          <div class="box-tools pull-right">
+            <button
+              type="button"
+              class="btn btn-box-tool"
+              data-widget="collapse"
+            >
+              <i class="fa fa-minus"></i>
+            </button>
+          </div>
+        </div>
+
+        <!-- 正文信息 -->
+        <div
+          class="box-body"
+          v-loading.body="fileLoading"
+          element-loading-text="课程上传中,请稍后..."
+        >
+          <!-- 表单 -->
+          <el-form
+            :inline="true"
+            :model="formSearch"
+            label-position="right"
+            label-width="100px"
+          >
+            <el-row>
+              <el-form-item label="课程名称" class="pull-left">
+                <el-input
+                  class="input_width_lg"
+                  placeholder="请输入课程名称"
+                  v-model="formSearch.name"
+                ></el-input>
+              </el-form-item>
+              <el-form-item label="课程代码" class="pull-left">
+                <el-input
+                  class="input_width_lg"
+                  placeholder="请输入课程代码"
+                  v-model="formSearch.code"
+                ></el-input>
+              </el-form-item>
+              <el-form-item label="课程状态" class="pull-left">
+                <el-select
+                  class="input_width_lg"
+                  v-model="formSearch.enable"
+                  placeholder="请选择"
+                  clearable
+                >
+                  <el-option
+                    v-for="item in statusList"
+                    :label="item.label"
+                    :value="item.value"
+                    :key="item.value"
+                  >
+                  </el-option>
+                </el-select>
+              </el-form-item>
+              <el-form-item label="层次" class="pull-left">
+                <el-select
+                  class="input_width_lg"
+                  v-model="formSearch.level"
+                  placeholder="请选择"
+                  clearable
+                >
+                  <el-option
+                    v-for="item in levelList"
+                    :label="item.label"
+                    :value="item.value"
+                    :key="item.value"
+                  >
+                  </el-option>
+                </el-select>
+              </el-form-item>
+              <el-form-item label="专业" class="pull-left" prop="specialtyId">
+                <el-select
+                  class="input_width_lg"
+                  remote
+                  :remote-method="getSpecialtyList4Search"
+                  :loading="specialtyLoading4Search"
+                  filterable
+                  clearable
+                  v-model="formSearch.specialtyId"
+                  placeholder="请选择"
+                >
+                  <el-option
+                    v-for="item in specialtyList4SearchWrapper"
+                    :label="item.name"
+                    :value="item.id"
+                    :key="item.id"
+                  >
+                  </el-option>
+                </el-select>
+              </el-form-item>
+              <el-form-item class="pull-right">
+                <el-button
+                  size="small"
+                  type="primary"
+                  icon="search"
+                  @click="searchForm"
+                  >查询</el-button
+                >
+                <el-button size="small" type="primary" @click="impCourse">
+                  <i class="fa fa-upload" aria-hidden="true"></i>导入
+                </el-button>
+                <el-button size="small" type="primary" @click="exportCourse">
+                  <i class="fa fa-download" aria-hidden="true"></i>导出
+                </el-button>
+                <el-button
+                  size="small"
+                  type="primary"
+                  icon="plus"
+                  @click="insertCourse"
+                  >新增</el-button
+                >
+                <el-button size="small" type="success" @click="enableByIds">
+                  <i class="fa fa-check" aria-hidden="true"></i>启用
+                </el-button>
+                <el-button size="small" type="warning" @click="disableByIds">
+                  <i class="fa fa-close" aria-hidden="true"></i>禁用
+                </el-button>
+              </el-form-item>
+            </el-row>
+          </el-form>
+
+          <!-- 添加或新增课程弹出框 -->
+          <el-dialog title="课程学习" :visible.sync="courseDialog" size="tiny">
+            <el-form
+              :inline="true"
+              :model="courseForm"
+              ref="courseForm"
+              :rules="rules"
+              label-position="right"
+              label-width="90px"
+            >
+              <el-row>
+                <el-form-item label="课程代码" label-width="120px" prop="code">
+                  <el-input
+                    :disabled="null != courseForm.id"
+                    class="pull_length"
+                    v-model="courseForm.code"
+                    auto-complete="off"
+                    placeholder="请输入课程代码"
+                  ></el-input>
+                </el-form-item>
+              </el-row>
+              <el-row>
+                <el-form-item label="课程名称" label-width="120px" prop="name">
+                  <el-input
+                    class="pull_length"
+                    v-model="courseForm.name"
+                    auto-complete="off"
+                    placeholder="请输入课程名称"
+                  ></el-input>
+                </el-form-item>
+              </el-row>
+              <el-row>
+                <el-form-item label="层次" label-width="120px" prop="level">
+                  <el-select
+                    style="width: 198px"
+                    class="input_width_lg"
+                    v-model="courseForm.level"
+                    placeholder="请选择"
+                  >
+                    <el-option
+                      v-for="item in levelList"
+                      :label="item.label"
+                      :value="item.value"
+                      :key="item.value"
+                    >
+                    </el-option>
+                  </el-select>
+                </el-form-item>
+              </el-row>
+              <el-row>
+                <el-form-item
+                  label="课程状态"
+                  label-width="120px"
+                  prop="enable"
+                >
+                  <el-radio-group
+                    class="pull_right_sm"
+                    v-model="courseForm.enable"
+                  >
+                    <el-radio label="true">开启</el-radio>
+                    <el-radio label="false">关闭</el-radio>
+                  </el-radio-group>
+                </el-form-item>
+              </el-row>
+              <el-row class="pull-center">
+                <el-button type="primary" @click="submitForm">保 存</el-button>
+                <el-button @click="courseDialog = false;">取 消</el-button>
+              </el-row>
+            </el-form>
+          </el-dialog>
+
+          <!-- 导入弹窗 -->
+          <el-dialog title="导入窗口" size="tiny" :visible.sync="impDialog">
+            <el-form>
+              <el-row>
+                <el-form-item style="margin-left:20px">
+                  <el-upload
+                    class="form_left"
+                    ref="upload"
+                    accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
+                    :action="uploadAction"
+                    :headers="uploadHeaders"
+                    :data="uploadData"
+                    :before-upload="beforeUpload"
+                    :on-progress="uploadProgress"
+                    :on-success="uploadSuccess"
+                    :on-error="uploadError"
+                    :file-list="fileList"
+                    :auto-upload="false"
+                    :multiple="false"
+                  >
+                    <el-button size="small" slot="trigger" type="primary"
+                      >选择文件</el-button
+                    >
+                    <el-button size="small" type="success" @click="submitUpload"
+                      >确认上传</el-button
+                    >
+                    <el-button size="small" type="danger" @click="removeFile"
+                      >清空文件</el-button
+                    >
+                    <el-button size="small" type="info" @click="exportFile"
+                      >下载模板</el-button
+                    >
+                    <div slot="tip" class="el-upload__tip">
+                      只能上传xlsx文件
+                    </div>
+                  </el-upload>
+                </el-form-item>
+              </el-row>
+            </el-form>
+          </el-dialog>
+
+          <!-- 导入错误信息列表 -->
+          <el-dialog title="错误提示" :visible.sync="errDialog">
+            <div
+              class="text-danger"
+              v-for="errMessage in errMessages"
+              :key="errMessage.lineNum"
+            >
+              第{{ errMessage.lineNum }}行:{{ errMessage.msg }}
+            </div>
+            <span slot="footer" class="dialog-footer">
+              <el-button @click="errDialog = false;">确定</el-button>
+            </span>
+          </el-dialog>
+
+          <!-- 关联专业弹出框 -->
+          <el-dialog
+            :title="specialtyDialogTitle"
+            :visible.sync="specialtyDialog"
+            size="small"
+          >
+            <!-- 表单 -->
+            <el-form
+              :inline="true"
+              :model="specialtySearchForm"
+              label-position="right"
+              label-width="100px"
+            >
+              <el-row>
+                <el-form-item label="专业名称" class="pull-left">
+                  <el-input
+                    class="input_width_lg"
+                    placeholder="请输入专业名称"
+                    v-model="specialtySearchForm.name"
+                  ></el-input>
+                </el-form-item>
+                <el-form-item label="专业代码" class="pull-left">
+                  <el-input
+                    class="input_width_lg"
+                    placeholder="请输入专业代码"
+                    v-model="specialtySearchForm.code"
+                  ></el-input>
+                </el-form-item>
+                <el-form-item class="pull-right">
+                  <el-button
+                    size="small"
+                    type="primary"
+                    icon="search"
+                    @click="searchSpecialtyPage"
+                    >查询
+                  </el-button>
+                  <el-button
+                    size="small"
+                    type="primary"
+                    icon="search"
+                    @click="addRelation"
+                    >新增
+                  </el-button>
+                </el-form-item>
+              </el-row>
+            </el-form>
+
+            <!-- 专业列表 -->
+            <el-table
+              :data="specialtyTableData"
+              border
+              style="width: 100%;text-align:center;"
+            >
+              <el-table-column prop="id" label="ID" width="150">
+              </el-table-column>
+              <el-table-column prop="name" label="专业名称" width="250">
+              </el-table-column>
+              <el-table-column prop="code" label="专业代码"> </el-table-column>
+              <el-table-column prop="updateTime" label="更新时间" width="170">
+              </el-table-column>
+              <el-table-column label="操作">
+                <template slot-scope="scope">
+                  <div>
+                    <span>
+                      <el-button
+                        size="mini"
+                        type="info"
+                        @click="deleteRelation(scope.row);"
+                      >
+                        <i class="el-icon-edit"></i> 取消关联
+                      </el-button>
+                    </span>
+                  </div>
+                </template>
+              </el-table-column>
+            </el-table>
+            <div class="page pull-right">
+              <el-pagination
+                @current-change="handleSpecialtyCurrentChange"
+                :current-page="currentSpecialtyPage"
+                :page-size="10"
+                layout="total, prev, pager, next, jumper"
+                :total="specialtyTotal"
+              >
+              </el-pagination>
+            </div>
+          </el-dialog>
+
+          <!-- 添加关联 -->
+          <el-dialog
+            title="添加关联专业"
+            v-model="addRelationDialog"
+            size="tiny"
+          >
+            <el-form
+              :inline="true"
+              :model="addRelationForm"
+              ref="addRelationForm"
+              label-position="right"
+              label-width="100px"
+              :rules="addRelationRules"
+            >
+              <el-row>
+                <el-form-item label="专业" class="pull-left" prop="specialtyId">
+                  <el-select
+                    class="input"
+                    remote
+                    :remote-method="getSpecialtyList4AddRelation"
+                    :loading="specialtyLoading4AddRelation"
+                    filterable
+                    clearable
+                    v-model="addRelationForm.specialtyId"
+                    placeholder="请选择"
+                  >
+                    <el-option
+                      v-for="item in specialtyList4AddRelationWrapper"
+                      :label="item.name"
+                      :value="item.id"
+                      :key="item.id"
+                    >
+                    </el-option>
+                  </el-select>
+                </el-form-item>
+              </el-row>
+              <el-row class="pull_center">
+                <el-button type="primary" @click="submitAddRelationForm"
+                  >保 存</el-button
+                >
+                <el-button @click="addRelationDialog = false;">取 消</el-button>
+              </el-row>
+            </el-form>
+          </el-dialog>
+
+          <!-- 页面列表 -->
+          <el-table
+            :data="tableData"
+            border
+            style="width: 100%;text-align:center;"
+            @selection-change="selectChange"
+          >
+            <el-table-column type="selection" width="50"></el-table-column>
+            <el-table-column prop="id" label="课程ID" width="150">
+            </el-table-column>
+            <el-table-column prop="name" label="课程名称" width="250">
+            </el-table-column>
+            <el-table-column prop="code" label="课程代码"> </el-table-column>
+            <el-table-column label="层次">
+              <template slot-scope="scope">
+                <div>
+                  <span>{{ getLevel(scope.row.level) }}</span>
+                </div>
+              </template>
+            </el-table-column>
+            <el-table-column label="状态" width="70">
+              <template slot-scope="scope">
+                <div>
+                  <span>
+                    <el-tag :type="getTag(scope.row.enable)">
+                      {{ getEnable(scope.row.enable) }}
+                    </el-tag>
+                  </span>
+                </div>
+              </template>
+            </el-table-column>
+            <el-table-column prop="updateTime" label="更新时间" width="170">
+            </el-table-column>
+            <el-table-column label="操作">
+              <template slot-scope="scope">
+                <div>
+                  <el-button size="mini" type="primary" @click="relation(row);">
+                    关联专业
+                  </el-button>
+                  <span>
+                    <el-button
+                      size="mini"
+                      type="info"
+                      @click="editCourse(row);"
+                    >
+                      <i class="el-icon-edit"></i> 修改
+                    </el-button>
+                  </span>
+                  <span v-if="!scope.row.enable">
+                    <el-button
+                      size="mini"
+                      type="success"
+                      @click="enableById(row);"
+                    >
+                      <i class="fa fa-check" aria-hidden="true"></i>启用
+                    </el-button>
+                  </span>
+                  <span v-if="scope.row.enable">
+                    <el-button
+                      size="mini"
+                      type="warning"
+                      @click="disableById(row);"
+                    >
+                      <i class="fa fa-close" aria-hidden="true"></i>禁用
+                    </el-button>
+                  </span>
+                </div>
+              </template>
+            </el-table-column>
+          </el-table>
+          <div class="page pull-right">
+            <el-pagination
+              @current-change="handleCurrentChange"
+              :current-page="currentPage"
+              :page-size="10"
+              layout="total, prev, pager, next, jumper"
+              :total="total"
+            >
+            </el-pagination>
+          </div>
+        </div>
+      </div>
+    </section>
+  </div>
+</template>
+
+<script>
+import { core_api, ENABLE_TYPE, LEVEL_TYPE } from "../constants/constants.js";
+import { mapState } from "vuex";
+
+export default {
+  data() {
+    return {
+      specialtyLoading4Search: false,
+      specialtyList4Search: [],
+      formSearch: {
+        name: "",
+        code: "",
+        enable: "",
+        level: "",
+        specialtyId: ""
+      },
+      courseForm: {
+        id: null,
+        name: "",
+        code: "",
+        level: "ALL",
+        enable: "true"
+      },
+      statusList: ENABLE_TYPE,
+      levelList: LEVEL_TYPE,
+      selectedCourseIds: [],
+      tableData: [],
+      currentPage: 1,
+      pageSize: 10,
+      total: 10,
+      specialtyAllList: [],
+      specialtyList: [],
+      selectedSpecialtyList: [],
+      specialtys: [],
+      specialtyAll: [],
+
+      impDialog: false,
+      uploadAction: core_api + "/course/import",
+      uploadHeaders: {},
+      uploadData: {},
+      errMessages: [],
+      errDialog: false,
+      fileLoading: false,
+      fileList: [],
+
+      courseDialog: false,
+      relationDialog: false,
+
+      rules: {
+        name: [
+          {
+            required: true,
+            message: "请输入课程名称",
+            trigger: "blur"
+          }
+        ],
+        code: [
+          {
+            required: true,
+            message: "请输入课程代码",
+            trigger: "blur"
+          }
+        ],
+        level: [
+          {
+            required: true,
+            message: "请选择层次",
+            trigger: "change"
+          }
+        ],
+        status: [
+          {
+            required: true,
+            message: "请选择状态",
+            trigger: "change"
+          }
+        ]
+      },
+      specialtyDialog: false,
+      specialtyDialogTitle: null,
+      specialtySearchForm: {
+        courseId: null,
+        code: null,
+        name: null
+      },
+      specialtyTableData: [],
+      currentSpecialtyPage: 1,
+      specialtyPageSize: 10,
+      specialtyTotal: 10,
+
+      addRelationDialog: false,
+      addRelationForm: {
+        specialtyId: null,
+        courseId: null
+      },
+      specialtyLoading4AddRelation: false,
+      specialtyList4AddRelation: [],
+      addRelationRules: {
+        specialtyId: [
+          {
+            required: true,
+            type: "number",
+            message: "请选择专业",
+            trigger: "change"
+          }
+        ]
+      }
+    };
+  },
+  computed: {
+    ...mapState({
+      user: state => state.user
+    }),
+    courseIds() {
+      var courseIds = "";
+      for (let courseId of this.selectedCourseIds) {
+        if (!courseIds) {
+          courseIds += courseId;
+        } else {
+          courseIds += "," + courseId;
+        }
+      }
+      return courseIds;
+    },
+    specialtyAllListSelect() {
+      let specialtyList = [];
+      for (let specialty of this.specialtyAllList) {
+        let specialtyInfo = specialty.name + "(" + specialty.code + ")";
+        specialtyList.push({ id: specialty.id, specialtyInfo: specialtyInfo });
+      }
+      return specialtyList;
+    },
+    getSpecialtyAllSelect4Search() {
+      let specialtyList4Search = [];
+      for (let specialty of this.specialtys) {
+        let specialtyInfo = specialty.name + "(" + specialty.code + ")";
+        specialtyList4Search.push({
+          id: specialty.id,
+          specialtyInfo: specialtyInfo
+        });
+      }
+      return specialtyList4Search;
+    },
+    specialtyList4SearchWrapper() {
+      var specialtyList = [];
+      for (let course of this.specialtyList4Search) {
+        var name = course.name + " - " + course.code;
+        var id = course.id;
+        specialtyList.push({ id: id, name: name });
+      }
+      return specialtyList;
+    },
+    specialtyList4AddRelationWrapper() {
+      var specialtyList = [];
+      for (let course of this.specialtyList4AddRelation) {
+        var name = course.name + " - " + course.code;
+        var id = course.id;
+        specialtyList.push({ id: id, name: name });
+      }
+      return specialtyList;
+    }
+  },
+  methods: {
+    deleteRelation(row) {
+      var specialtyId = row.id;
+      var courseId = this.specialtySearchForm.courseId;
+      var param = new URLSearchParams({
+        courseId: courseId,
+        specialtyId: specialtyId
+      });
+      var url = core_api + "/courseSpeciatlyRelation/delete?" + param;
+      this.$http
+        .delete(url)
+        .then(() => {
+          this.$notify({
+            type: "success",
+            message: "取消关联成功!"
+          });
+          this.searchSpecialtyPage();
+        })
+        .catch(response => {
+          if (response.status == 500) {
+            this.$notify({
+              showClose: true,
+              message: response.data.desc,
+              type: "error"
+            });
+          }
+        });
+    },
+    submitAddRelationForm() {
+      this.$refs.addRelationForm.validate(valid => {
+        if (valid) {
+          var param = new URLSearchParams(this.addRelationForm);
+          var url = core_api + "/courseSpeciatlyRelation/add?" + param;
+          this.$http.post(url, this.speciallyForm).then(
+            () => {
+              this.$notify({
+                type: "success",
+                message: "添加成功!"
+              });
+              this.searchSpecialtyPage();
+              this.addRelationDialog = false;
+            },
+            response => {
+              if (response.status == 500) {
+                this.$notify({
+                  showClose: true,
+                  message: response.data.desc,
+                  type: "error"
+                });
+              }
+            }
+          );
+        } else {
+          console.log("error submit!");
+          return false;
+        }
+      });
+    },
+    getSpecialtyList4AddRelation(query) {
+      this.specialtyLoading4AddRelation = true;
+      this.$http
+        .get(core_api + "/specialty/query?name=" + query)
+        .then(response => {
+          this.specialtyList4AddRelation = response.data;
+          this.specialtyLoading4AddRelation = false;
+        });
+    },
+    addRelation() {
+      this.addRelationForm.specialtyId = null;
+      this.addRelationForm.courseId = this.specialtySearchForm.courseId;
+      this.addRelationDialog = true;
+      if (this.$refs.addRelationForm) {
+        this.$refs.addRelationForm.resetFields();
+      }
+    },
+    handleSpecialtyCurrentChange(val) {
+      this.currentSpecialtyPage = val;
+      this.searchSpecialtyPage();
+    },
+    searchSpecialtyPage() {
+      var param = new URLSearchParams(this.specialtySearchForm);
+      var url =
+        core_api +
+        "/specialty/specialtyPage/" +
+        (this.currentPage - 1) +
+        "/" +
+        this.pageSize +
+        "?" +
+        param;
+      this.$http.get(url).then(response => {
+        this.specialtyTableData = response.data.content;
+        this.specialtyTotal = response.data.totalElements;
+      });
+    },
+    getEnable(enable) {
+      if (enable == true) {
+        return "启用";
+      } else if (enable == false) {
+        return "禁用";
+      }
+      return enable;
+    },
+    getTag(status) {
+      if (status == true) {
+        return "success";
+      } else if (status == false) {
+        return "danger";
+      }
+      return status;
+    },
+    getLevel(level) {
+      if (level == "ZSB") {
+        return "专升本";
+      } else if (level == "GQZ") {
+        return "高起专";
+      } else if (level == "GQB") {
+        return "高起本";
+      } else {
+        return "不限";
+      }
+    },
+    getSpecialtyList4Search(query) {
+      this.specialtyLoading4Search = true;
+      this.$http
+        .get(core_api + "/specialty/query?name=" + query)
+        .then(response => {
+          this.specialtyList4Search = response.data;
+          this.specialtyLoading4Search = false;
+        });
+    },
+    searchForm() {
+      var param = new URLSearchParams(this.formSearch);
+      var url =
+        core_api +
+        "/course/coursePage/" +
+        (this.currentPage - 1) +
+        "/" +
+        this.pageSize +
+        "?" +
+        param;
+      this.$http.get(url).then(response => {
+        console.log(response);
+        this.tableData = response.data.content;
+        this.total = response.data.totalElements;
+      });
+    },
+    handleCurrentChange(val) {
+      this.currentPage = val;
+      this.searchForm();
+    },
+    selectChange(row) {
+      this.selectedCourseIds = [];
+      row.forEach(element => {
+        this.selectedCourseIds.push(element.id);
+      });
+      console.log(this.selectedCourseIds);
+    },
+    //新增
+    insertCourse() {
+      this.courseForm.id = null;
+      this.courseForm.name = null;
+      this.courseForm.code = null;
+      this.courseForm.level = "ALL";
+      this.courseForm.enable = "true";
+
+      this.courseDialog = true;
+    },
+    //修改
+    editCourse(row) {
+      this.courseForm = Object.assign({}, row);
+      this.courseForm.enable = row.enable ? "true" : "false";
+      this.courseId = row.id;
+
+      this.courseDialog = true;
+    },
+    exportCourse() {
+      var param = new URLSearchParams(this.formSearch);
+      window.open(
+        core_api +
+          "/course/export?$key=" +
+          this.user.key +
+          "&$token=" +
+          this.user.token +
+          "&" +
+          param
+      );
+    },
+
+    //关联课程
+    relation(row) {
+      this.specialtyDialogTitle =
+        "关联专业列表 【课程名称:" +
+        row.name +
+        "】【       课程代码:" +
+        row.code +
+        "】";
+      this.specialtySearchForm.courseId = row.id;
+      this.specialtySearchForm.name = null;
+      this.specialtySearchForm.code = null;
+
+      this.searchSpecialtyPage();
+      this.specialtyDialog = true;
+    },
+    closeCourse() {
+      this.courseDialog = false;
+    },
+    saveRelation() {},
+    //保存(新增/修改)
+    submitForm() {
+      var url = core_api + "/course";
+      if (null != this.courseForm.id) {
+        //修改
+        this.$refs.courseForm.validate(valid => {
+          if (valid) {
+            this.$http.put(url, this.courseForm).then(
+              () => {
+                this.$notify({
+                  type: "success",
+                  message: "修改成功!"
+                });
+                this.searchForm();
+                this.resetForm();
+                this.courseDialog = false;
+              },
+              response => {
+                if (response.status == 500) {
+                  this.$notify({
+                    showClose: true,
+                    message: response.data.desc,
+                    type: "error"
+                  });
+                }
+              }
+            );
+          } else {
+            console.log("error submit!");
+            return false;
+          }
+        });
+      } else {
+        this.$refs.courseForm.validate(valid => {
+          if (valid) {
+            this.$http.post(url, this.courseForm).then(
+              () => {
+                this.$notify({
+                  type: "success",
+                  message: "添加成功"
+                });
+                this.searchForm();
+                this.resetForm();
+                this.courseDialog = false;
+              },
+              response => {
+                if (response.status == 500) {
+                  this.$notify({
+                    showClose: true,
+                    message: response.data.desc,
+                    type: "error"
+                  });
+                }
+              }
+            );
+          } else {
+            console.log("error submit!");
+            return false;
+          }
+        });
+      }
+    },
+    //重置
+    resetForm() {
+      this.$refs.courseForm.resetFields();
+    },
+    //删除单个数据
+    deleteById(row) {
+      this.$confirm("是否删除该课程?", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        var url = core_api + "/course/" + row.id;
+        this.$http
+          .delete(url)
+          .then(() => {
+            this.$notify({
+              type: "success",
+              message: "删除成功!"
+            });
+            this.searchForm();
+          })
+          .catch(response => {
+            if (response.status == 500) {
+              this.$notify({
+                showClose: true,
+                message: response.data.desc,
+                type: "error"
+              });
+            }
+          });
+      });
+    },
+    //删除多条数据
+    deleteByIds() {
+      if (this.selectedCourseIds.length === 0) {
+        this.$notify({
+          type: "warning",
+          message: "请选择要删除的课程"
+        });
+      } else {
+        this.$confirm("是否删除这些课程?", "提示", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "error"
+        }).then(() => {
+          var url = core_api + "/course/" + this.courseIds;
+          this.$http
+            .delete(url)
+            .then(() => {
+              this.$notify({
+                type: "success",
+                message: "删除成功!"
+              });
+              this.searchForm();
+            })
+            .catch(response => {
+              if (response.status == 500) {
+                this.$notify({
+                  showClose: true,
+                  message: response.data.desc,
+                  type: "error"
+                });
+              }
+            });
+        });
+      }
+    },
+    //启用
+    enableByIds() {
+      if (this.selectedCourseIds.length === 0) {
+        this.$notify({
+          type: "warning",
+          message: "请选择要开启的课程"
+        });
+      } else {
+        this.$confirm("是否启用这些课程?", "提示", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(() => {
+          var url = core_api + "/course/enable/" + this.courseIds;
+          this.$http
+            .put(url, {})
+            .then(() => {
+              this.$notify({
+                type: "success",
+                message: "开启成功!"
+              });
+              this.searchForm();
+            })
+            .catch(response => {
+              if (response.status == 500) {
+                this.$notify({
+                  showClose: true,
+                  message: response.data.desc,
+                  type: "error"
+                });
+              }
+            });
+        });
+      }
+    },
+    enableById(row) {
+      this.$confirm("是否启用该课程?", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        var url = core_api + "/course/enable/" + row.id;
+        this.$http
+          .put(url, {})
+          .then(() => {
+            this.$notify({
+              type: "success",
+              message: "开启成功!"
+            });
+            this.searchForm();
+          })
+          .catch(response => {
+            if (response.status == 500) {
+              this.$notify({
+                showClose: true,
+                message: response.data.desc,
+                type: "error"
+              });
+            }
+          });
+      });
+    },
+    //禁用
+    disableByIds() {
+      if (this.selectedCourseIds.length === 0) {
+        this.$notify({
+          type: "warning",
+          message: "请选择要禁用的课程"
+        });
+      } else {
+        this.$confirm("是否禁用这些课程?", "提示", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "error"
+        }).then(() => {
+          var url = core_api + "/course/disable/" + this.courseIds;
+          this.$http
+            .put(url, {})
+            .then(() => {
+              this.$notify({
+                type: "success",
+                message: "禁用成功!"
+              });
+              this.searchForm();
+            })
+            .catch(response => {
+              if (response.status == 500) {
+                this.$notify({
+                  showClose: true,
+                  message: response.data.desc,
+                  type: "error"
+                });
+              }
+            });
+        });
+      }
+    },
+    //禁用
+    disableById(row) {
+      this.$confirm("是否禁用该课程?", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "error"
+      }).then(() => {
+        var url = core_api + "/course/disable/" + row.id;
+        this.$http
+          .put(url, {})
+          .then(() => {
+            this.$notify({
+              type: "success",
+              message: "禁用成功!"
+            });
+            this.searchForm();
+          })
+          .catch(response => {
+            if (response.status == 500) {
+              this.$notify({
+                showClose: true,
+                message: response.data.desc,
+                type: "error"
+              });
+            }
+          });
+      });
+    },
+    //导入
+    impCourse() {
+      this.impDialog = true;
+      this.initUpload();
+    },
+    initUpload() {
+      this.fileList = [];
+    },
+    beforeUpload(file) {
+      console.log(file);
+    },
+    uploadProgress() {
+      console.log("uploadProgress");
+    },
+    uploadSuccess(response) {
+      if (!response.hasError) {
+        this.$notify({
+          message: "上传成功",
+          type: "success"
+        });
+        this.fileLoading = false;
+        this.impDialog = false;
+        this.searchForm();
+      } else {
+        this.fileLoading = false;
+        this.impDialog = false;
+        this.errMessages = response.failRecords;
+        this.errDialog = true;
+      }
+    },
+    uploadError(response) {
+      var jsonStr = response.message.substring(4);
+      var resp = eval("(" + jsonStr + ")");
+      if (response.status == 500) {
+        this.$notify({
+          message: resp.desc,
+          type: "error"
+        });
+      }
+      this.fileLoading = false;
+    },
+    //确定上传
+    submitUpload() {
+      if (!this.checkUpload()) {
+        return false;
+      }
+      this.$refs.upload.submit();
+      this.fileLoading = true;
+    },
+    checkUpload() {
+      var fileList = this.$refs.upload.uploadFiles;
+      if (fileList.length == 0) {
+        this.$notify({
+          message: "上传文件不能为空",
+          type: "error"
+        });
+        return false;
+      }
+      if (fileList.length > 1) {
+        this.$notify({
+          message: "每次只能上传一个文件",
+          type: "error"
+        });
+        return false;
+      }
+      for (let file of fileList) {
+        if (!file.name.endsWith(".xlsx")) {
+          this.$notify({
+            message: "上传文件必须为xlsx格式",
+            type: "error"
+          });
+          this.initUpload();
+          return false;
+        }
+      }
+      return true;
+    },
+    //清空文件
+    removeFile() {
+      // this.fileList = [];
+      this.$refs.upload.clearFiles();
+    },
+    //下载模板
+    exportFile() {
+      window.location.href =
+        core_api +
+        "/course/importTemplate?$key=" +
+        this.user.key +
+        "&$token=" +
+        this.user.token;
+    }
+  },
+  //初始化查询
+  created() {
+    this.searchForm();
+    this.uploadHeaders = {
+      key: this.user.key,
+      token: this.user.token
+    };
+  }
+};
+</script>
+
+<style scoped>
+.input_width_lg {
+  width: 180px;
+}
+
+.pull-center {
+  margin-left: 30%;
+}
+</style>

+ 493 - 0
src/modules/basic/view/exam_site.vue

@@ -0,0 +1,493 @@
+<style>
+.page {
+  margin-top: 10px;
+}
+
+.buttonframe {
+  margin-left: 20px;
+}
+
+.el-table th > .cell {
+  text-align: center;
+}
+
+.el-textarea__inner {
+  resize: none;
+}
+
+.el-upload {
+  width: 80px;
+}
+</style>
+<template>
+  <div>
+    <section class="content" style="margin-top: -10px;">
+      <div class="box box-info">
+        <!-- 头信息 -->
+        <div
+          class="box-header with-border"
+          style="background-color:#D3DCE6;margin-bottom:20px;"
+        >
+          <h3 class="box-title">考点列表</h3>
+          <div class="box-tools pull-right">
+            <button
+              type="button"
+              class="btn btn-box-tool"
+              data-widget="collapse"
+            >
+              <i class="fa fa-minus"></i>
+            </button>
+          </div>
+        </div>
+        <!-- 正文信息 -->
+        <div class="box-body">
+          <!-- 表单 -->
+          <el-form
+            :inline="true"
+            :model="formSearch"
+            label-position="right"
+            label-width="100px"
+          >
+            <el-row :gutter="5">
+              <el-form-item label="学习中心" class="pull-left">
+                <el-input v-model="orgName" readonly></el-input>
+              </el-form-item>
+              <el-form-item label="考点代码" class="pull-left">
+                <el-input
+                  placeholder="请输入考点代码"
+                  v-model="formSearch.code"
+                ></el-input>
+              </el-form-item>
+              <el-form-item label="考点名称" class="pull-left">
+                <el-input
+                  placeholder="请输入考点名称"
+                  v-model="formSearch.name"
+                ></el-input>
+              </el-form-item>
+              <el-form-item class="pull-right">
+                <el-button
+                  size="small"
+                  type="primary"
+                  icon="search"
+                  @click="searchForm"
+                  >查询</el-button
+                >
+                <el-button
+                  size="small"
+                  type="primary"
+                  icon="plus"
+                  @click="insert"
+                  >新增</el-button
+                >
+                <el-button size="small" type="danger" @click="deleteByIds"
+                  ><i class="el-icon-delete"></i>删除
+                </el-button>
+                <el-button size="small" type="info" @click="back"
+                  >退回</el-button
+                >
+              </el-form-item>
+            </el-row>
+          </el-form>
+
+          <!-- 添加考点信息弹出框 -->
+          <el-dialog
+            title="考点信息"
+            :visible.sync="examSiteDialog"
+            size="tiny"
+          >
+            <el-form
+              :inline="true"
+              :model="examSiteForm"
+              ref="examSiteForm"
+              :rules="rules"
+              label-position="right"
+              label-width="90px"
+            >
+              <el-row>
+                <el-form-item label="学习中心" label-width="120px" prop="code">
+                  <el-input
+                    class="pull_length"
+                    v-model="orgName"
+                    auto-complete="off"
+                    placeholder="中心代码"
+                    readonly
+                  ></el-input>
+                </el-form-item>
+              </el-row>
+              <el-row>
+                <el-form-item label="考点代码" label-width="120px" prop="code">
+                  <el-input
+                    class="pull_length"
+                    v-model="examSiteForm.code"
+                    auto-complete="off"
+                    placeholder="考点代码"
+                    :readonly="null != examSiteForm.id"
+                  ></el-input>
+                </el-form-item>
+              </el-row>
+              <el-row>
+                <el-form-item label="考点名称" label-width="120px" prop="name">
+                  <el-input
+                    class="pull_length"
+                    v-model="examSiteForm.name"
+                    auto-complete="off"
+                    placeholder="考点名称"
+                  ></el-input>
+                </el-form-item>
+              </el-row>
+              <el-row>
+                <el-form-item label="负责人" label-width="120px">
+                  <el-input
+                    class="pull_length"
+                    v-model="examSiteForm.contacts"
+                    auto-complete="off"
+                    placeholder="负责人"
+                  ></el-input>
+                </el-form-item>
+              </el-row>
+              <el-row>
+                <el-form-item label="联系方式" label-width="120px">
+                  <el-input
+                    class="pull_length"
+                    v-model="examSiteForm.telephone"
+                    auto-complete="off"
+                    placeholder="联系方式"
+                  ></el-input>
+                </el-form-item>
+              </el-row>
+              <el-row>
+                <el-form-item label="备注" label-width="120px">
+                  <el-input
+                    class="pull_length"
+                    v-model="examSiteForm.remark"
+                    auto-complete="off"
+                    placeholder="备注"
+                  ></el-input>
+                </el-form-item>
+              </el-row>
+              <el-row class="pull_center">
+                <el-button type="primary" @click="submitForm">保 存</el-button>
+                <el-button @click="examSiteDialog = false;">取 消</el-button>
+              </el-row>
+            </el-form>
+          </el-dialog>
+
+          <!-- 页面列表 -->
+          <el-table
+            :data="tableData"
+            border
+            style="width: 100%;text-align:center;"
+            @selection-change="selectChange"
+          >
+            <el-table-column type="selection" width="50"> </el-table-column>
+            <el-table-column prop="id" width="200" label="ID">
+            </el-table-column>
+            <el-table-column prop="orgName" label="学习中心"> </el-table-column>
+            <el-table-column prop="code" label="考点代码"> </el-table-column>
+            <el-table-column prop="name" label="考点名称"> </el-table-column>
+            <el-table-column prop="contacts" width="100" label="负责人">
+            </el-table-column>
+            <el-table-column prop="telephone" width="100" label="联系方式">
+            </el-table-column>
+            <el-table-column prop="remark" width="150" label="备注">
+            </el-table-column>
+            <el-table-column prop="updateTime" width="180" label="更新时间">
+            </el-table-column>
+            <el-table-column label="操作" width="180">
+              <template slot-scope="scope">
+                <div>
+                  <el-button size="mini" type="primary" @click="edit(row);">
+                    <i class="el-icon-edit"></i> 修改
+                  </el-button>
+                  <el-button
+                    size="mini"
+                    type="danger"
+                    @click="deleteById(row);"
+                  >
+                    <i class="el-icon-delete"></i> 删除
+                  </el-button>
+                </div>
+              </template>
+            </el-table-column>
+          </el-table>
+          <div class="page pull-right">
+            <el-pagination
+              @current-change="handleCurrentChange"
+              :current-page="currentPage"
+              :page-size="pageSize"
+              layout="total, prev, pager, next, jumper"
+              :total="total"
+            >
+            </el-pagination>
+          </div>
+        </div>
+      </div>
+    </section>
+  </div>
+</template>
+
+<script>
+import { core_api } from "../constants/constants.js";
+import { mapState } from "vuex";
+
+let _this = null;
+
+export default {
+  data() {
+    return {
+      orgId: null,
+      formSearch: {
+        code: "",
+        name: "",
+        orgId: ""
+      },
+      examSiteForm: {
+        id: null,
+        name: "",
+        code: "",
+        contacts: "",
+        telephone: "",
+        orgId: "",
+        remark: ""
+      },
+      examSiteDialog: false,
+      selectedExamSiteIds: [],
+      loading: true,
+      tableData: [],
+      currentPage: 1,
+      pageSize: 10,
+      total: 10,
+      orgName: "",
+      rules: {
+        code: [{ required: true, message: "请输入代码", trigger: "blur" }],
+        name: [{ required: true, message: "请输入名称", trigger: "blur" }],
+        contacts: [
+          { required: false, message: "请输入负责人", trigger: "blur" }
+        ],
+        telphone: [
+          { required: false, message: "请输入联系方式", trigger: "blur" }
+        ]
+      }
+    };
+  },
+  computed: {
+    ...mapState({ user: state => state.user }),
+    examSiteIds() {
+      var examSiteIds = "";
+      for (let examSiteId of this.selectedExamSiteIds) {
+        if (!examSiteIds) {
+          examSiteIds += examSiteId;
+        } else {
+          examSiteIds += "," + examSiteId;
+        }
+      }
+      return examSiteIds;
+    }
+  },
+  methods: {
+    back() {
+      this.$router.push({ path: "/index/campus" });
+    },
+    handleCurrentChange(val) {
+      this.currentPage = val;
+      this.searchForm();
+    },
+    //查询
+    searchForm() {
+      this.loading = true;
+      var param = new URLSearchParams(this.formSearch);
+      var url =
+        core_api +
+        "/examSite/examSitePage/" +
+        (this.currentPage - 1) +
+        "/" +
+        this.pageSize +
+        "?" +
+        param;
+      this.$http.get(url).then(response => {
+        console.log(response);
+        this.tableData = response.data.content;
+        this.total = response.data.totalElements;
+        this.loading = false;
+      });
+    },
+    selectChange(row) {
+      this.selectedExamSiteIds = [];
+      row.forEach(element => {
+        this.selectedExamSiteIds.push(element.id);
+      });
+      console.log(this.selectedExamSiteIds);
+    },
+    //重置
+    resetForm() {
+      this.$refs.examSiteForm.resetFields();
+    },
+    //提交
+    submitForm() {
+      this.$refs.examSiteForm.validate(valid => {
+        if (valid) {
+          var url = core_api + "/examSite";
+          if (this.examSiteForm.id) {
+            this.$http.put(url, this.examSiteForm).then(
+              () => {
+                this.$notify({
+                  type: "success",
+                  message: "修改成功!"
+                });
+                this.searchForm();
+                this.resetForm();
+                this.examSiteDialog = false;
+              },
+              response => {
+                if (response.status == 500) {
+                  this.$notify({
+                    showClose: true,
+                    message: response.data.desc,
+                    type: "error"
+                  });
+                }
+              }
+            );
+          } else {
+            this.$http.post(url, this.examSiteForm).then(
+              () => {
+                this.$notify({
+                  type: "success",
+                  message: "新增成功!"
+                });
+                this.searchForm();
+                this.resetForm();
+                this.examSiteDialog = false;
+              },
+              response => {
+                if (response.status == 500) {
+                  this.$notify({
+                    showClose: true,
+                    message: response.data.desc,
+                    type: "error"
+                  });
+                }
+              }
+            );
+          }
+        } else {
+          console.log("error submit!");
+          return false;
+        }
+      });
+    },
+    //新增
+    insert() {
+      this.examSiteForm.id = null;
+      this.examSiteForm.code = null;
+      this.examSiteForm.name = null;
+      this.examSiteForm.orgId = this.orgId;
+      this.examSiteForm.telephone = null;
+      this.examSiteForm.contacts = null;
+      this.examSiteForm.remark = null;
+
+      this.examSiteDialog = true;
+    },
+    //修改
+    edit(row) {
+      this.examSiteForm.id = row.id;
+      this.examSiteForm.code = row.code;
+      this.examSiteForm.name = row.name;
+      this.examSiteForm.orgId = row.orgId;
+      this.examSiteForm.telephone = row.telephone;
+      this.examSiteForm.contacts = row.contacts;
+      this.examSiteForm.remark = row.remark;
+
+      this.examSiteDialog = true;
+    },
+    //删除单个数据
+    deleteById(row) {
+      this.$confirm("是否删除该考点?", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        var url = core_api + "/examSite/" + row.id;
+        this.$http
+          .delete(url)
+          .then(() => {
+            this.$notify({
+              type: "success",
+              message: "删除成功!"
+            });
+            this.searchForm();
+          })
+          .catch(response => {
+            if (response.status == 500) {
+              this.$notify({
+                showClose: true,
+                message: response.data.desc,
+                type: "error"
+              });
+            }
+          });
+      });
+    },
+    //删除多条数据
+    deleteByIds() {
+      if (this.selectedExamSiteIds.length === 0) {
+        this.$notify({
+          type: "warning",
+          message: "请选择要删除的考点"
+        });
+      } else {
+        this.$confirm("是否删除这些考点?", "提示", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "error"
+        }).then(() => {
+          var url = core_api + "/examSite/" + this.examSiteIds;
+          this.$http
+            .delete(url)
+            .then(() => {
+              this.$notify({
+                type: "success",
+                message: "删除成功!"
+              });
+              this.searchForm();
+            })
+            .catch(response => {
+              if (response.status == 500) {
+                this.$notify({
+                  showClose: true,
+                  message: response.data.desc,
+                  type: "error"
+                });
+              }
+            });
+        });
+      }
+    },
+    init() {
+      var url = core_api + "/org/subOrg/" + this.orgId;
+      this.$http
+        .get(url)
+        .then(response => {
+          this.orgName = response.data.name;
+          _this.searchForm();
+        })
+        .catch(response => {
+          if (response.status == 500) {
+            this.$notify({
+              showClose: true,
+              message: response.data.desc,
+              type: "error"
+            });
+          }
+        });
+    }
+  },
+  //初始化查询
+  created: function() {
+    _this = this;
+    this.orgId = this.$route.params.orgId;
+    this.formSearch.orgId = this.$route.params.orgId;
+    this.init();
+  }
+};
+</script>

+ 152 - 0
src/modules/basic/view/index.vue

@@ -0,0 +1,152 @@
+<template>
+  <div>
+    <div class="wrapper">
+      <header class="main-header">
+        <!-- Logo -->
+        <a href="javascript:void(0)" class="logo">
+          <span class="logo-mini"><b>基础</b></span>
+          <span class="logo-lg"><b>基础信息</b></span>
+        </a>
+
+        <!-- Header Navbar: style can be found in header.less -->
+        <nav class="navbar navbar-static-top">
+          <!-- Sidebar toggle button -->
+          <a
+            href="javascript:void(0)"
+            class="sidebar-toggle"
+            data-toggle="offcanvas"
+            role="button"
+          >
+            <span class="sr-only">Toggle navigation</span>
+          </a>
+          <!-- Navbar Right Menu -->
+          <div class="navbar-custom-menu">
+            <ul class="nav navbar-nav">
+              <!-- User Account: style can be found in dropdown.less -->
+              <li class="dropdown user user-menu">
+                <a
+                  href="javascript:void(0)"
+                  class="dropdown-toggle"
+                  data-toggle="dropdown"
+                >
+                  <span class="hidden-xs">
+                    <i class="fa fa-user"></i> {{ user.displayName }}
+                  </span>
+                </a>
+              </li>
+
+              <li class="user user-menu">
+                <a href="javascript:void(0)" @click="backIndex">
+                  <i class="fa fa-home"></i> <span>主页面</span>
+                </a>
+              </li>
+
+              <li class="user user-menu">
+                <a href="javascript:void(0)" @click="logout">
+                  <i class="fa fa-sign-out"></i> <span>退出</span>
+                </a>
+              </li>
+            </ul>
+          </div>
+        </nav>
+      </header>
+      <!-- Left side column. contains the logo and sidebar -->
+      <aside class="main-sidebar">
+        <!-- sidebar: style can be found in sidebar.less -->
+        <section class="sidebar">
+          <!-- sidebar menu: : style can be found in sidebar.less -->
+          <ul class="sidebar-menu">
+            <li class="header"></li>
+            <li class="treeview active">
+              <a href="javascript:void(0)">
+                <i class="fa fa-database"></i> <span>基础信息管理</span>
+                <span class="pull-right-container">
+                  <i class="fa fa-angle-left pull-right"></i>
+                </span>
+              </a>
+            </li>
+          </ul>
+        </section>
+        <!-- /.sidebar -->
+      </aside>
+
+      <!-- Content Wrapper. Contains page content -->
+      <div class="content-wrapper">
+        <!-- Content Header (Page header) -->
+        <section class="content">
+          <div class="row"><router-view></router-view></div>
+        </section>
+        <!-- Main content -->
+      </div>
+      <!-- /.row -->
+    </div>
+  </div>
+</template>
+<style>
+span.logo-lg {
+  font-family: "Micrsoft YaHei";
+  font-size: 30px;
+}
+</style>
+<script>
+import { mapState } from "vuex";
+import { core_api } from "../constants/constants.js";
+
+export default {
+  data() {
+    return {
+      menuList: []
+    };
+  },
+  components: {},
+  computed: {
+    ...mapState({ user: state => state.user })
+  },
+  methods: {
+    logout() {
+      this.$http
+        .post(core_api + "/auth/logout")
+        .then(() => {
+          window.location.href = sessionStorage.getItem("loginUrl");
+        })
+        .catch(response => {
+          if (response.status == 500) {
+            this.$notify({
+              showClose: true,
+              message: response.data.desc,
+              type: "error"
+            });
+          }
+          window.location.href = sessionStorage.getItem("loginUrl");
+        });
+    },
+    backIndex() {
+      window.location.href = sessionStorage.getItem("indexUrl");
+    }
+  },
+  created() {
+    var url = core_api + "/rolePrivilege/getUserPrivileges";
+    this.$http
+      .post(
+        url,
+        {
+          groupCode: "BASIC_MENUS",
+          full: false
+        },
+        { emulateJSON: true }
+      )
+      .then(response => {
+        this.menuList = response.data;
+      })
+      .catch(response => {
+        if (response.status == 500) {
+          this.$notify({
+            showClose: true,
+            message: response.data.desc,
+            type: "error"
+          });
+        }
+      });
+  }
+};
+</script>

+ 132 - 0
src/modules/basic/view/login.vue

@@ -0,0 +1,132 @@
+<template>
+  <div class="container">
+    <div class="row">
+      <div class="col-md-4 col-md-offset-4">
+        <div class="panel panel-default">
+          <div class="panel-heading"><h3 class="login-title">基础信息</h3></div>
+          <div class="panel-body">
+            <fieldset>
+              <div class="form-group">
+                <input
+                  class="form-control"
+                  placeholder="用户名"
+                  v-model="loginName"
+                  name="loginName"
+                  type="text"
+                  autofocus="true"
+                />
+              </div>
+              <div class="form-group">
+                <input
+                  class="form-control"
+                  placeholder="密码"
+                  v-model="password"
+                  name="password"
+                  type="password"
+                  value=""
+                />
+              </div>
+              <button @click="checkLogin" class="btn btn-lg btn-info btn-block">
+                登录
+              </button>
+            </fieldset>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+<style scoped>
+div {
+  font-family: "Arial", "Helvetica", "sans-serif", "Hiragino Sans GB",
+    "Micrsoft YaHei";
+}
+
+.login-title {
+  text-align: center;
+  margin-top: 0px;
+  margin-bottom: 0px;
+  font-weight: bold;
+}
+
+.icon {
+  margin-bottom: 10px;
+  margin-top: 20px;
+}
+
+embed {
+  width: 150px;
+  height: 150px;
+}
+</style>
+<script>
+import { mapActions } from "vuex";
+import { USER_SIGNIN } from "../../portal/store/user";
+import { core_api } from "../constants/constants.js";
+
+export default {
+  data() {
+    return {
+      loginName: "",
+      password: "",
+      errorflag: false,
+      errorinfo: ""
+    };
+  },
+  methods: {
+    ...mapActions([USER_SIGNIN]),
+    checkLogin: function() {
+      this.errorflag = false;
+      this.errorinfo = "";
+      if (!this.loginName || !this.password) {
+        this.errorinfo += "用户名或密码不能为空!\n";
+      }
+      if (this.errorinfo) {
+        this.errorflag = true;
+        this.$notify({
+          showClose: true,
+          message: this.errorinfo,
+          type: "error"
+        });
+        return;
+      } else {
+        this.$http
+          .post(
+            core_api + "/user/login",
+            {},
+            {
+              params: {
+                loginName: this.loginName,
+                password: this.password
+              }
+            }
+          )
+          .then(response => {
+            console.log("response is :", response);
+            var data = response.data;
+
+            this.USER_SIGNIN({
+              loginName: data.loginName,
+              name: data.name,
+              token: data.token,
+              userId: data.userId,
+              orgId: data.orgId,
+              rootOrgId: data.rootOrgId,
+              role: data.userRoles
+            });
+            this.$router.replace({ path: "/index" });
+          })
+          .catch(response => {
+            if (response.status == 500) {
+              this.$notify({
+                showClose: true,
+                message: response.data.desc,
+                type: "error"
+              });
+            }
+          });
+      }
+    }
+  }
+};
+</script>

+ 94 - 0
src/modules/basic/view/platform.vue

@@ -0,0 +1,94 @@
+<style scoped>
+.el-select {
+  width: 200px;
+}
+.content {
+  margin-top: 10px;
+}
+</style>
+<template>
+  <div>
+    <section class="content-header"><h1>平台总览</h1></section>
+    <!-- Main content -->
+    <section class="content">
+      <!-- Info boxes -->
+      <div class="row">
+        <div class="col-md-3 col-sm-6 col-xs-12">
+          <div class="info-box">
+            <span class="info-box-icon bg-green"
+              ><i class="fa fa-flag-o"></i
+            ></span>
+
+            <div class="info-box-content">
+              <span class="info-box-text">考务平台</span>
+              <span class="info-box-number"><small></small></span>
+              <span class="info-box-number"><small></small></span>
+            </div>
+            <!-- /.info-box-content -->
+          </div>
+          <!-- /.info-box -->
+        </div>
+
+        <div class="col-md-3 col-sm-6 col-xs-12">
+          <div class="info-box">
+            <span class="info-box-icon bg-red"
+              ><i class="fa fa-flag-o"></i
+            ></span>
+
+            <div class="info-box-content">
+              <span class="info-box-text">网考平台</span>
+              <span class="info-box-number"><small></small></span>
+              <span class="info-box-number"><small></small></span>
+            </div>
+            <!-- /.info-box-content -->
+          </div>
+          <!-- /.info-box -->
+        </div>
+        <!-- /.col -->
+
+        <div class="col-md-3 col-sm-6 col-xs-12">
+          <div class="info-box">
+            <span class="info-box-icon bg-yellow"
+              ><i class="fa fa-flag-o"></i
+            ></span>
+
+            <div class="info-box-content">
+              <span class="info-box-text">阅卷平台</span>
+              <span class="info-box-number"><small></small></span>
+              <span class="info-box-number"><small></small></span>
+            </div>
+            <!-- /.info-box-content -->
+          </div>
+          <!-- /.info-box -->
+        </div>
+        <!-- /.col -->
+        <div class="col-md-3 col-sm-6 col-xs-12">
+          <div class="info-box">
+            <span class="info-box-icon bg-aqua"
+              ><i class="fa fa-flag-o"></i
+            ></span>
+
+            <div class="info-box-content">
+              <span class="info-box-text">题库平台</span>
+              <span class="info-box-number"><small></small></span>
+              <span class="info-box-number"><small></small></span>
+            </div>
+            <!-- /.info-box-content -->
+          </div>
+          <!-- /.info-box -->
+        </div>
+      </div>
+      <!-- /.row -->
+    </section>
+    <!-- /.content -->
+  </div>
+</template>
+<script>
+export default {
+  data() {
+    return {};
+  },
+  methods: {},
+  created() {}
+};
+</script>

+ 93 - 0
src/modules/basic/view/privilege_group_list.vue

@@ -0,0 +1,93 @@
+<template>
+  <div>
+    <section class="content" style="margin-top: -10px;">
+      <div class="box box-info">
+        <!-- 头信息 -->
+        <div class="box-header with-border">
+          <h3 class="box-title">鉴权管理 &gt; 权限组管理</h3>
+          <div class="box-tools pull-right">
+            <button
+              type="button"
+              class="btn btn-box-tool"
+              data-widget="collapse"
+            >
+              <i class="fa fa-minus"></i>
+            </button>
+          </div>
+        </div>
+
+        <!-- 正文信息 -->
+        <div class="box-body">
+          <el-table
+            :data="privilegeGroupList"
+            border
+            style="width: 100%;text-align:center;"
+          >
+            <el-table-column prop="id" label="ID" width="100">
+            </el-table-column>
+            <el-table-column prop="code" label="权限组编码"> </el-table-column>
+            <el-table-column prop="name" label="权限组名称"> </el-table-column>
+            <el-table-column prop="appName" label="应用名称"> </el-table-column>
+            <el-table-column width="300" label="操作">
+              <template slot-scope="scope">
+                <div>
+                  <el-button
+                    size="small"
+                    type="primary"
+                    @click="editPrivilege(scope.row);"
+                    >权限配置</el-button
+                  >
+                </div>
+              </template>
+            </el-table-column>
+          </el-table>
+        </div>
+      </div>
+    </section>
+  </div>
+</template>
+<style scoped></style>
+<script>
+import { mapActions, mapState } from "vuex";
+import { USER_SIGNIN } from "../../portal/store/user";
+import { core_api } from "../constants/constants.js";
+
+export default {
+  data() {
+    return {
+      privilegeGroupList: []
+    };
+  },
+  computed: {
+    ...mapState({ user: state => state.user })
+  },
+  methods: {
+    ...mapActions([USER_SIGNIN]),
+
+    queryAppList: function() {
+      var url = core_api + "/rolePrivilege/getPrivilegeGroupList";
+      this.$http
+        .get(url)
+        .then(response => {
+          console.log(response);
+          this.privilegeGroupList = response.data;
+        })
+        .catch(response => {
+          if (response.status == 500) {
+            this.$notify({
+              showClose: true,
+              message: response.data.desc,
+              type: "error"
+            });
+          }
+        });
+    },
+    editPrivilege(row) {
+      this.$router.replace({ path: "/index/privilege_tree/" + row.id });
+    }
+  },
+  created() {
+    this.queryAppList();
+  }
+};
+</script>

+ 602 - 0
src/modules/basic/view/privilege_tree.vue

@@ -0,0 +1,602 @@
+<template>
+  <div>
+    <section class="content" style="margin-top: -10px;">
+      <div class="box box-info">
+        <!-- 头信息 -->
+        <div class="box-header with-border">
+          <h3 class="box-title">鉴权管理 &gt; 权限组列表 &gt; 权限树</h3>
+          <div class="box-tools pull-right">
+            <button
+              type="button"
+              class="btn btn-box-tool"
+              data-widget="collapse"
+            >
+              <i class="fa fa-minus"></i>
+            </button>
+          </div>
+        </div>
+
+        <!-- 正文信息 -->
+        <div class="box-body">
+          <!-- 权限树 -->
+          <div style="width: 50%;">
+            <el-tree
+              :data="treeData"
+              :props="defaultProps"
+              node-key="id"
+              ref="tree"
+              highlight-current
+              :default-expanded-keys="[-1]"
+              :expand-on-click-node="false"
+              :render-content="renderContent"
+            >
+            </el-tree>
+          </div>
+
+          <!-- 新增权限 -->
+          <el-dialog title="新增权限" :visible.sync="addingDialog.show">
+            <el-form
+              :model="addingDialog.privilege"
+              ref="addingForm"
+              label-width="100px"
+              :rules="rules"
+            >
+              <el-form-item label="父权限名称" prop="parentName">
+                <el-col>
+                  <el-input
+                    v-model="addingDialog.parentName"
+                    :readonly="true"
+                  ></el-input>
+                </el-col>
+              </el-form-item>
+              <el-form-item label="权限名称" prop="name">
+                <el-col>
+                  <el-input v-model="addingDialog.privilege.name"></el-input>
+                </el-col>
+              </el-form-item>
+              <el-form-item label="权限编码" prop="code">
+                <el-col>
+                  <el-input v-model="addingDialog.privilege.code"></el-input>
+                </el-col>
+              </el-form-item>
+              <el-form-item label="描述" prop="description">
+                <el-col>
+                  <el-input
+                    v-model="addingDialog.privilege.description"
+                  ></el-input>
+                </el-col>
+              </el-form-item>
+              <el-form-item label="权重" prop="weight">
+                <el-col>
+                  <el-input v-model="addingDialog.privilege.weight"></el-input>
+                </el-col>
+              </el-form-item>
+              <el-form-item label="属性1">
+                <el-col>
+                  <el-input v-model="addingDialog.privilege.ext1"></el-input>
+                </el-col>
+              </el-form-item>
+              <el-form-item label="属性2">
+                <el-col>
+                  <el-input v-model="addingDialog.privilege.ext2"></el-input>
+                </el-col>
+              </el-form-item>
+              <el-form-item label="属性3">
+                <el-col>
+                  <el-input v-model="addingDialog.privilege.ext3"></el-input>
+                </el-col>
+              </el-form-item>
+              <el-form-item label="属性4">
+                <el-col>
+                  <el-input v-model="addingDialog.privilege.ext4"></el-input>
+                </el-col>
+              </el-form-item>
+              <el-form-item label="属性5">
+                <el-col>
+                  <el-input v-model="addingDialog.privilege.ext5"></el-input>
+                </el-col>
+              </el-form-item>
+              <el-form-item>
+                <el-button type="primary" @click="addPrivilege">确定</el-button>
+                <el-button @click="addingDialog.show = false;">取消</el-button>
+              </el-form-item>
+            </el-form>
+          </el-dialog>
+
+          <!-- 修改权限 -->
+          <el-dialog title="修改权限" :visible.sync="updateDialog.show">
+            <el-form
+              :model="updateDialog.privilege"
+              ref="updateForm"
+              label-width="100px"
+              :rules="rules"
+            >
+              <el-form-item label="权限名称" prop="name">
+                <el-col>
+                  <el-input v-model="updateDialog.privilege.name"></el-input>
+                </el-col>
+              </el-form-item>
+              <el-form-item label="权限编码" prop="code">
+                <el-col>
+                  <el-input
+                    v-model="updateDialog.privilege.code"
+                    :readonly="true"
+                  ></el-input>
+                </el-col>
+              </el-form-item>
+              <el-form-item label="描述" prop="description">
+                <el-col>
+                  <el-input
+                    v-model="updateDialog.privilege.description"
+                  ></el-input>
+                </el-col>
+              </el-form-item>
+              <el-form-item label="权重" prop="weight">
+                <el-col>
+                  <el-input v-model="updateDialog.privilege.weight"></el-input>
+                </el-col>
+              </el-form-item>
+              <el-form-item label="属性1">
+                <el-col>
+                  <el-input v-model="updateDialog.privilege.ext1"></el-input>
+                </el-col>
+              </el-form-item>
+              <el-form-item label="属性2">
+                <el-col>
+                  <el-input v-model="updateDialog.privilege.ext2"></el-input>
+                </el-col>
+              </el-form-item>
+              <el-form-item label="属性3">
+                <el-col>
+                  <el-input v-model="updateDialog.privilege.ext3"></el-input>
+                </el-col>
+              </el-form-item>
+              <el-form-item label="属性4">
+                <el-col>
+                  <el-input v-model="updateDialog.privilege.ext4"></el-input>
+                </el-col>
+              </el-form-item>
+              <el-form-item label="属性5">
+                <el-col>
+                  <el-input v-model="updateDialog.privilege.ext5"></el-input>
+                </el-col>
+              </el-form-item>
+              <el-form-item>
+                <el-button type="primary" @click="updatePrivilege"
+                  >确定</el-button
+                >
+                <el-button @click="updateDialog.show = false;">取消</el-button>
+              </el-form-item>
+            </el-form>
+          </el-dialog>
+
+          <!-- 查看权限 -->
+          <el-dialog title="查看权限" :visible.sync="showDialog.show">
+            <el-form :model="showDialog.privilege" label-width="100px">
+              <el-form-item label="权限名称">
+                <el-col>
+                  <el-input
+                    v-model="showDialog.privilege.name"
+                    :readonly="true"
+                  ></el-input>
+                </el-col>
+              </el-form-item>
+              <el-form-item label="权限编码">
+                <el-col>
+                  <el-input
+                    v-model="showDialog.privilege.code"
+                    :readonly="true"
+                  ></el-input>
+                </el-col>
+              </el-form-item>
+              <el-form-item label="描述">
+                <el-col>
+                  <el-input
+                    v-model="showDialog.privilege.description"
+                    :readonly="true"
+                  ></el-input>
+                </el-col>
+              </el-form-item>
+              <el-form-item label="权重">
+                <el-col>
+                  <el-input
+                    v-model="showDialog.privilege.weight"
+                    :readonly="true"
+                  ></el-input>
+                </el-col>
+              </el-form-item>
+              <el-form-item label="属性1">
+                <el-col>
+                  <el-input
+                    v-model="showDialog.privilege.ext1"
+                    :readonly="true"
+                  ></el-input>
+                </el-col>
+              </el-form-item>
+              <el-form-item label="属性2">
+                <el-col>
+                  <el-input
+                    v-model="showDialog.privilege.ext2"
+                    :readonly="true"
+                  ></el-input>
+                </el-col>
+              </el-form-item>
+              <el-form-item label="属性3">
+                <el-col>
+                  <el-input
+                    v-model="showDialog.privilege.ext3"
+                    :readonly="true"
+                  ></el-input>
+                </el-col>
+              </el-form-item>
+              <el-form-item label="属性4">
+                <el-col>
+                  <el-input
+                    v-model="showDialog.privilege.ext4"
+                    :readonly="true"
+                  ></el-input>
+                </el-col>
+              </el-form-item>
+              <el-form-item label="属性5">
+                <el-col>
+                  <el-input
+                    v-model="showDialog.privilege.ext5"
+                    :readonly="true"
+                  ></el-input>
+                </el-col>
+              </el-form-item>
+              <el-form-item>
+                <el-button @click="showDialog.show = false;">关闭</el-button>
+              </el-form-item>
+            </el-form>
+          </el-dialog>
+        </div>
+      </div>
+    </section>
+  </div>
+</template>
+<style scoped></style>
+<script type="text/jsx">
+import { core_api } from "../constants/constants.js";
+
+let checkWeight = (rule, value, callback) => {
+    if (('0' != value) && (!value)) {
+        return new Error('请输入权重');
+    } else if (('0' != value) && (!value.match(/^[1-9][0-9]*$/))) {
+        callback(new Error('请输入整数'));
+    } else if (value < 0) {
+        callback(new Error('不能小于0'));
+    } else if (value > 10000) {
+        callback(new Error('不能大于10000'));
+    } else {
+        callback();
+    }
+};
+let checkCode = (rule, value, callback) => {
+    if ((0 != value) && (!value)) {
+        callback(new Error('请输入权限编码'));
+    } else if (!value.match(/^[0-9a-zA-Z_]*$/)) {
+        callback(new Error("只能由数字、字母和\"_\"组成"));
+    } else {
+        callback();
+    }
+};
+
+
+export default {
+    data() {
+        return {
+            privilegeGroupId: null,
+            rootTreeNode: {
+                id: null,
+                label: null
+            },
+            treeData: [],
+            defaultProps: {
+                children: 'children',
+                label: 'label'
+            },
+            store: null,
+            data: null,
+            addingDialog: {
+                show: false,
+                parentName: null,
+                privilege: {
+                    groupId: null,
+                    parentId: null,
+                    name: null,
+                    code: null,
+                    description: null,
+                    weight: null,
+                    ext1: null,
+                    ext2: null,
+                    ext3: null,
+                    ext4: null,
+                    ext5: null
+                }
+            },
+            updateDialog: {
+                show: false,
+                parentName: null,
+                privilege: {
+                    id: null,
+                    groupId: null,
+                    parentId: null,
+                    name: null,
+                    code: null,
+                    description: null,
+                    weight: null,
+                    ext1: null,
+                    ext2: null,
+                    ext3: null,
+                    ext4: null,
+                    ext5: null
+                }
+            },
+            showDialog: {
+                show: false,
+                parentName: null,
+                privilege: {
+                    id: null,
+                    groupId: null,
+                    parentId: null,
+                    name: null,
+                    code: null,
+                    description: null,
+                    weight: null,
+                    ext1: null,
+                    ext2: null,
+                    ext3: null,
+                    ext4: null,
+                    ext5: null
+                }
+            },
+            rules: {
+                name: [{
+                    required: true,
+                    message: '请输入权限名称',
+                    trigger: 'blur'
+                }],
+                code: [{
+                    required: true,
+                    message: '请输入权限编码',
+                    trigger: 'blur'
+                }, {
+                    validator: checkCode, trigger: 'blur'
+                }],
+                weight: [{
+                    required: true,
+                    message: '请输入权重',
+                    trigger: 'blur'
+                }, {
+                    validator: checkWeight, trigger: 'blur'
+                }]
+            }
+        }
+    },
+
+    methods: {
+        openAddingDialog(store, data) {
+            console.log(data);
+            this.store = store;
+            this.data = data;
+            this.addingDialog.parentName = data.label;
+            this.addingDialog.privilege.groupId = this.privilegeGroupId;
+            if (1 == data.$treeNodeId) {
+                this.addingDialog.privilege.parentId = null;
+            } else {
+                this.addingDialog.privilege.parentId = data.id;
+            }
+            this.addingDialog.privilege.name = null;
+            this.addingDialog.privilege.code = null;
+            this.addingDialog.privilege.description = null;
+            this.addingDialog.privilege.weight = "0";
+            this.addingDialog.privilege.ext1 = null;
+            this.addingDialog.privilege.ext2 = null;
+            this.addingDialog.privilege.ext3 = null;
+            this.addingDialog.privilege.ext4 = null;
+            this.addingDialog.privilege.ext5 = null;
+            this.addingDialog.show = true;
+        },
+
+        addPrivilege() {
+            this.$refs.addingForm.validate((valid) => {
+                if (!valid) {
+                    return;
+                }
+                console.log(this.addingDialog.privilege);
+                var url = core_api + '/rolePrivilege/addPrivilege';
+                this.$http.post(url, this.addingDialog.privilege).then((response) => {
+                    this.$notify({
+                        message: '添加成功',
+                        type: 'success'
+                    });
+                    var addedPrivilege = response.data;
+                    this.store.append({
+                        id: addedPrivilege.id,
+                        label: this.addingDialog.privilege.name,
+                        children: []
+                    }, this.data);
+                }).catch((response) => {
+                    if (response.status == 500) {
+                        this.$notify({
+                            showClose: true,
+                            message: response.data.desc,
+                            type: 'error'
+                        });
+                    }
+                });
+                this.addingDialog.show = false;
+            });
+        },
+
+        updatePrivilege() {
+            this.$refs.updateForm.validate((valid) => {
+                if (!valid) {
+                    return;
+                }
+                console.log(this.updateDialog.privilege);
+                var url = core_api + '/rolePrivilege/updatePrivilege';
+                this.$http.put(url, this.updateDialog.privilege).then(() => {
+                    this.$notify({
+                        message: '修改成功',
+                        type: 'success'
+                    });
+                    this.data.label = this.updateDialog.privilege.name;
+                }).catch((response) => {
+                    if (response.status == 500) {
+                        this.$notify({
+                            showClose: true,
+                            message: response.data.desc,
+                            type: 'error'
+                        });
+                    }
+                });
+                this.updateDialog.show = false;
+            });
+        },
+
+        openUpdateDialog(store, data) {
+            console.log(data);
+            this.store = store;
+            this.data = data;
+            this.getPrivilege(data.id, "for-update");
+
+        },
+
+        openShowDialog(store, data) {
+            console.log(data);
+            this.store = store;
+            this.data = data;
+            this.getPrivilege(data.id, "for-show");
+        },
+
+        getPrivilege(id, type) {
+            var url = core_api + '/rolePrivilege/getPrivilege/' + id;
+            this.$http.get(url).then((response) => {
+                var resp = response.data;
+
+                this.updateDialog.privilege.id = resp.id;
+                this.updateDialog.privilege.groupId = resp.groupId;
+                this.updateDialog.privilege.parentId = resp.parentId;
+                this.updateDialog.privilege.name = resp.name;
+                this.updateDialog.privilege.code = resp.code;
+                this.updateDialog.privilege.description = resp.description;
+                this.updateDialog.privilege.weight = resp.weight + "";
+                this.updateDialog.privilege.ext1 = resp.ext1;
+                this.updateDialog.privilege.ext2 = resp.ext2;
+                this.updateDialog.privilege.ext3 = resp.ext3;
+                this.updateDialog.privilege.ext4 = resp.ext4;
+                this.updateDialog.privilege.ext5 = resp.ext5;
+
+                this.showDialog.privilege.id = resp.id;
+                this.showDialog.privilege.groupId = resp.groupId;
+                this.showDialog.privilege.parentId = resp.parentId;
+                this.showDialog.privilege.name = resp.name;
+                this.showDialog.privilege.code = resp.code;
+                this.showDialog.privilege.description = resp.description;
+                this.showDialog.privilege.weight = resp.weight + "";
+                this.showDialog.privilege.ext1 = resp.ext1;
+                this.showDialog.privilege.ext2 = resp.ext2;
+                this.showDialog.privilege.ext3 = resp.ext3;
+                this.showDialog.privilege.ext4 = resp.ext4;
+                this.showDialog.privilege.ext5 = resp.ext5;
+
+                if ("for-update" == type) {
+                    this.updateDialog.show = true;
+                }
+                else if ("for-show" == type) {
+                    this.showDialog.show = true;
+                }
+            }).catch((response) => {
+                if (response.status == 500) {
+                    this.$notify({
+                        showClose: true,
+                        message: response.data.desc,
+                        type: 'error'
+                    });
+                }
+            });
+        },
+
+        remove(store, data) {
+            this.$confirm('此操作将永久删除权限 "' + data.label + '", 是否继续?', '提示', {
+                confirmButtonText: '确定',
+                cancelButtonText: '取消',
+                type: 'warning'
+            }).then(() => {
+                var url = core_api + '/rolePrivilege/deletePrivilege/' + data.id;
+                this.$http.delete(url).then(() => {
+                    this.$notify({
+                        message: '删除成功',
+                        type: 'success'
+                    });
+                    store.remove(data);
+                }).catch((response) => {
+                    if (response.status == 500) {
+                        this.$notify({
+                            showClose: true,
+                            message: response.data.desc,
+                            type: 'error'
+                        });
+                    }
+                });
+            }).catch(() => {
+                this.$message({
+                    type: 'info',
+                    message: '已取消删除'
+                });
+            });
+        },
+
+        renderContent(h, {node, data, store}) {
+            if (-1 == data.id) {
+                return (
+                    <span>
+                    <span>
+                        <span>{node.label}</span>
+                    </span>
+                    <span style="float: right; margin-right: 65px">
+                        <el-button size="mini" on-click={() => this.openAddingDialog(store, data)}>追加</el-button>
+                    </span>
+                </span>
+                )
+            }
+            return (
+                <span>
+                    <span>
+                        <span>{node.label}</span>
+                    </span>
+                    <span style="float: right; margin-right: 20px">
+                          <el-button size="mini" on-click={() => this.openShowDialog(store, data)}>查看</el-button>
+                          <el-button size="mini" on-click={() => this.openUpdateDialog(store, data)}>修改</el-button>
+                          <el-button size="mini" on-click={() => this.openAddingDialog(store, data)}>追加</el-button>
+                          <el-button size="mini" on-click={() => this.remove(store, data)}>删除</el-button>
+                    </span>
+                </span>
+            );
+        },
+
+        initTree() {
+            var url = core_api + '/rolePrivilege/getPrivilegeTree/' + this.privilegeGroupId;
+            this.$http.get(url).then((response) => {
+                console.log(response);
+                this.rootTreeNode.id = response.data.id;
+                this.rootTreeNode.label = response.data.label;
+                this.treeData = [];
+                this.treeData.push(response.data);
+            }).catch((response) => {
+                this.$notify({
+                    showClose: true,
+                    message: response.data.desc,
+                    type: 'error'
+                });
+            });
+        }
+    },
+    created() {
+        this.privilegeGroupId = this.$route.params.privilegeGroupId;
+        this.initTree();
+    }
+};
+</script>

+ 318 - 0
src/modules/basic/view/role_privilege_settings.vue

@@ -0,0 +1,318 @@
+<template>
+  <div>
+    <section class="content" style="margin-top: -10px;">
+      <div class="box box-info">
+        <!-- 头信息 -->
+        <div class="box-header with-border">
+          <h3 class="box-title">鉴权管理 &gt; 角色权限配置</h3>
+          <div class="box-tools pull-right">
+            <button
+              type="button"
+              class="btn btn-box-tool"
+              data-widget="collapse"
+            >
+              <i class="fa fa-minus"></i>
+            </button>
+          </div>
+        </div>
+
+        <!-- 正文信息 -->
+        <div class="box-body">
+          <!-- 选择 -->
+          <el-form
+            :inline="true"
+            :model="form"
+            label-position="right"
+            label-width="100px"
+          >
+            <el-row>
+              <el-form-item label="顶级机构" class="pull-left">
+                <el-select
+                  class="input_width_lg"
+                  v-model="form.orgId"
+                  placeholder="请选择"
+                  @change="rootOrgChanged"
+                  :disabled="!isSuperAdmin"
+                >
+                  <el-option
+                    v-for="item in orgList"
+                    :label="item.name"
+                    :value="item.id"
+                    :key="item.id"
+                  >
+                  </el-option>
+                </el-select>
+              </el-form-item>
+              <el-form-item label="角色" class="pull-left">
+                <el-select
+                  class="input_width_lg"
+                  v-model="form.roleId"
+                  placeholder="请选择"
+                  @change="change"
+                >
+                  <el-option
+                    v-for="item in roleList"
+                    :label="item.roleName"
+                    :value="item.roleId"
+                    :key="item.roleId"
+                  >
+                  </el-option>
+                </el-select>
+              </el-form-item>
+              <el-form-item label="权限组" class="pull-left">
+                <el-select
+                  class="input_width_lg"
+                  v-model="form.privilegeGroupId"
+                  placeholder="请选择"
+                  @change="change"
+                >
+                  <el-option
+                    v-for="item in privilegeGroupList"
+                    :label="item.name"
+                    :value="item.id"
+                    :key="item.id"
+                  >
+                  </el-option>
+                </el-select>
+              </el-form-item>
+            </el-row>
+          </el-form>
+
+          <div style="margin-bottom:10px;margin-left: 50px;">
+            <el-button
+              :plain="true"
+              type="success"
+              :disabled="!treeChanged"
+              @click="save"
+              >保 存</el-button
+            >
+          </div>
+
+          <!-- 权限树 -->
+          <div style="width: 50%;margin-left: 50px;">
+            <el-tree
+              :data="treeData"
+              :props="defaultProps"
+              show-checkbox
+              node-key="id"
+              ref="tree"
+              highlight-current
+              :check-strictly="true"
+              :default-expanded-keys="[-1]"
+              :default-checked-keys="checkedKeys"
+              @check-change="treeChange"
+              :expand-on-click-node="true"
+            >
+            </el-tree>
+          </div>
+        </div>
+      </div>
+    </section>
+  </div>
+</template>
+
+<script>
+import { mapState } from "vuex";
+import { core_api } from "../constants/constants.js";
+
+export default {
+  data() {
+    return {
+      completed: false,
+      isSuperAdmin: false,
+      form: {
+        orgId: null,
+        roleId: null,
+        privilegeGroupId: null
+      },
+      orgList: [],
+      roleList: [],
+      privilegeGroupList: [],
+      treeChanged: false,
+      treeData: [],
+      checkedKeys: [],
+      uncheckChildren_nodeId: null,
+      defaultProps: {
+        children: "children",
+        label: "label"
+      }
+    };
+  },
+  computed: {
+    ...mapState({ user: state => state.user })
+  },
+  methods: {
+    /*初始化*/
+    init() {
+      for (let role of this.user.roleList) {
+        if (role.roleCode == "SUPER_ADMIN") {
+          this.isSuperAdmin = true;
+          break;
+        }
+      }
+
+      var url1 = core_api + "/org/getRootOrgList";
+      var url2 =
+        core_api + "/rolePrivilege/getRoles?includeSuperAdmin=" + false;
+      var url3 = core_api + "/rolePrivilege/getPrivilegeGroupList";
+
+      Promise.all([
+        this.$http.get(url1),
+        this.$http.post(url2),
+        this.$http.get(url3)
+      ]).then(([resp1, resp2, resp3]) => {
+        this.orgList = resp1.data;
+
+        this.form.orgId = this.user.rootOrgId;
+        this.roleList = resp2.data;
+        if (0 < this.roleList.length) {
+          this.form.roleId = this.roleList[0].roleId;
+        }
+        this.privilegeGroupList = resp3.data;
+        if (0 < this.privilegeGroupList.length) {
+          this.form.privilegeGroupId = this.privilegeGroupList[0].id;
+        }
+
+        this.initTree(
+          this.form.orgId,
+          this.form.roleId,
+          this.form.privilegeGroupId
+        );
+      });
+    },
+    /*初始化权限树*/
+    initTree(orgId, roleId, privilegeGroupId) {
+      var url1 =
+        core_api + "/rolePrivilege/getPrivilegeTree/" + privilegeGroupId;
+      var url2 =
+        core_api + "/rolePrivilege/getPrivilegeIdList/" + orgId + "/" + roleId;
+
+      Promise.all([this.$http.get(url1), this.$http.get(url2)]).then(
+        ([resp1, resp2]) => {
+          console.log("initTree(). treeData:", resp1.data.children);
+          console.log("initTree(). checkedKeys:", resp2.data);
+          this.treeData = resp1.data.children;
+          this.checkedKeys = resp2.data;
+          this.completed = true;
+        }
+      );
+    },
+    /*change事件*/
+    change() {
+      if (!this.completed) {
+        return;
+      }
+
+      this.initTree(
+        this.form.orgId,
+        this.form.roleId,
+        this.form.privilegeGroupId
+      );
+    },
+    rootOrgChanged() {
+      if (!this.completed) {
+        return;
+      }
+
+      var url =
+        core_api +
+        "/rolePrivilege/getRoles?includeSuperAdmin=" +
+        false +
+        "&rootOrgId=" +
+        this.form.orgId;
+      this.$http
+        .post(url)
+        .then(response => {
+          this.roleList = response.data;
+          if (0 < this.roleList.length) {
+            this.form.roleId = this.roleList[0].roleId;
+          }
+        })
+        .catch(response => {
+          if (response.status == 500) {
+            this.$notify({
+              showClose: true,
+              message: response.data.desc,
+              type: "error"
+            });
+          }
+        });
+
+      this.initTree(
+        this.form.orgId,
+        this.form.roleId,
+        this.form.privilegeGroupId
+      );
+    },
+    treeChange(node, checked) {
+      console.log("[tree change] node:", node);
+      if (checked && !this.checkedKeys.contains(node.id)) {
+        this.checkedKeys.push(node.id);
+      }
+      if (!checked && this.checkedKeys.contains(node.id)) {
+        this.checkedKeys.remove(node.id);
+      }
+
+      var checkChildren = this.uncheckChildren_nodeId != node.id;
+      this.uncheckChildren_nodeId = null;
+      if (checked) {
+        if (node.parentId) {
+          this.uncheckChildren_nodeId = node.parentId;
+          this.$refs.tree.setChecked(node.parentId, true, false);
+        }
+        if (checkChildren) {
+          if (node.children && 0 < node.children.length) {
+            for (const cur of node.children) {
+              this.$refs.tree.setChecked(cur.id, true, false);
+            }
+          }
+        }
+      } else {
+        if (node.children && 0 < node.children.length) {
+          for (const cur of node.children) {
+            this.$refs.tree.setChecked(cur.id, false, false);
+          }
+        }
+      }
+
+      this.treeChanged = true;
+    },
+    save() {
+      console.log("save(). checkedKeys:", this.checkedKeys);
+      var url = core_api + "/rolePrivilege/updateRolePrivilegeRelations";
+      this.$http
+        .post(url, {
+          rootOrgId: this.form.orgId,
+          roleId: this.form.roleId,
+          privilegeGroupId: this.form.privilegeGroupId,
+          privilegeIdSet: this.checkedKeys
+        })
+        .then(() => {
+          this.$notify({
+            message: "更新成功",
+            type: "success"
+          });
+          this.treeChanged = false;
+        })
+        .catch(response => {
+          if (response.status == 500) {
+            this.$notify({
+              showClose: true,
+              message: response.data.desc,
+              type: "error"
+            });
+          }
+        });
+    }
+  },
+  created() {
+    this.init();
+  }
+};
+</script>
+
+<style scoped>
+.el-radio-group {
+  margin-top: 5px;
+}
+</style>

+ 742 - 0
src/modules/basic/view/school.vue

@@ -0,0 +1,742 @@
+<style>
+.page {
+  margin-top: 10px;
+}
+
+.buttonframe {
+  margin-left: 20px;
+}
+
+.el-table th > .cell {
+  text-align: center;
+}
+
+.el-textarea__inner {
+  resize: none;
+}
+
+.el-upload {
+  width: 80px;
+}
+</style>
+<template>
+  <div>
+    <section class="content" style="margin-top: -10px;">
+      <div class="box box-info">
+        <!-- 头信息 -->
+        <div
+          class="box-header with-border"
+          style="background-color:#D3DCE6;margin-bottom:20px;"
+        >
+          <h3 class="box-title">学校列表</h3>
+          <div class="box-tools pull-right">
+            <button
+              type="button"
+              class="btn btn-box-tool"
+              data-widget="collapse"
+            >
+              <i class="fa fa-minus"></i>
+            </button>
+          </div>
+        </div>
+        <!-- 正文信息 -->
+        <div class="box-body">
+          <!-- 表单 -->
+          <el-form
+            :inline="true"
+            :model="formSearch"
+            label-position="right"
+            label-width="100px"
+          >
+            <el-row :gutter="5">
+              <el-form-item label="学校名称" class="pull-left">
+                <el-input
+                  placeholder="请输入学校名称"
+                  v-model="formSearch.name"
+                ></el-input>
+              </el-form-item>
+              <el-form-item label="学校代码" class="pull-left">
+                <el-input
+                  placeholder="请输入学校代码"
+                  v-model="formSearch.code"
+                ></el-input>
+              </el-form-item>
+              <el-form-item label="学校域名" class="pull-left">
+                <el-input
+                  placeholder="请输入学校域名"
+                  v-model="formSearch.domainName"
+                ></el-input>
+              </el-form-item>
+              <el-form-item class="pull-right">
+                <el-button
+                  size="small"
+                  type="primary"
+                  icon="search"
+                  @click="searchForm"
+                  >查询</el-button
+                >
+                <el-button
+                  size="small"
+                  type="primary"
+                  icon="plus"
+                  @click="insert"
+                  >新增</el-button
+                >
+                <el-button size="small" type="success" @click="enableOrg"
+                  ><i class="fa fa-check" aria-hidden="true"></i>启用
+                </el-button>
+                <el-button size="small" type="danger" @click="disableOrg"
+                  ><i class="fa fa-close" aria-hidden="true"></i>禁用
+                </el-button>
+              </el-form-item>
+            </el-row>
+          </el-form>
+
+          <!-- 添加或修改学校弹出框 -->
+          <el-dialog title="学校信息" :visible.sync="schoolDialog" size="tiny">
+            <el-form
+              :inline="true"
+              :model="schoolForm"
+              ref="schoolForm"
+              :rules="rules"
+              label-position="right"
+              label-width="90px"
+            >
+              <el-row>
+                <el-form-item label="学校代码" label-width="120px" prop="code">
+                  <el-input
+                    class="pull_length"
+                    v-model="schoolForm.code"
+                    auto-complete="off"
+                    placeholder="学校域名"
+                    :readonly="null != schoolForm.id"
+                  ></el-input>
+                </el-form-item>
+              </el-row>
+              <el-row>
+                <el-form-item label="学校名称" label-width="120px" prop="name">
+                  <el-input
+                    class="pull_length"
+                    v-model="schoolForm.name"
+                    auto-complete="off"
+                    placeholder="学校名称"
+                  ></el-input>
+                </el-form-item>
+              </el-row>
+              <el-row>
+                <el-form-item
+                  label="学校域名"
+                  label-width="120px"
+                  prop="domainName"
+                >
+                  <el-input
+                    class="pull_length"
+                    v-model="schoolForm.domainName"
+                    auto-complete="off"
+                    placeholder="学校域名"
+                  ></el-input>
+                </el-form-item>
+              </el-row>
+              <el-row>
+                <el-form-item
+                  label="负责人"
+                  label-width="120px"
+                  prop="contacts"
+                >
+                  <el-input
+                    class="pull_length"
+                    v-model="schoolForm.contacts"
+                    auto-complete="off"
+                    placeholder="负责人"
+                  ></el-input>
+                </el-form-item>
+              </el-row>
+              <el-row>
+                <el-form-item
+                  label="联系方式"
+                  label-width="120px"
+                  prop="telephone"
+                >
+                  <el-input
+                    class="pull_length"
+                    v-model="schoolForm.telephone"
+                    auto-complete="off"
+                    placeholder="联系方式"
+                  ></el-input>
+                </el-form-item>
+              </el-row>
+              <el-row>
+                <el-form-item label="考生端产品名" label-width="120px">
+                  <el-input
+                    class="pull_length"
+                    v-model="schoolForm.properties.OE_STUDENT_SYS_NAME"
+                    auto-complete="off"
+                    placeholder="考生端产品名"
+                  ></el-input>
+                </el-form-item>
+              </el-row>
+              <el-row>
+                <el-form-item label="状态" label-width="120px" prop="enable">
+                  <el-radio-group
+                    class="pull_right_sm"
+                    v-model="schoolForm.enable"
+                  >
+                    <el-radio label="true">启用</el-radio>
+                    <el-radio label="false">禁用</el-radio>
+                  </el-radio-group>
+                </el-form-item>
+              </el-row>
+              <el-row class="pull_center">
+                <el-button type="primary" @click="submitForm">保 存</el-button>
+                <el-button @click="schoolDialog = false;">取 消</el-button>
+              </el-row>
+            </el-form>
+          </el-dialog>
+
+          <!-- 学校产品分配弹出框 -->
+          <el-dialog
+            title="产品分配"
+            :visible.sync="functionDialog"
+            size="tiny"
+          >
+            <div>
+              <el-button type="primary" @click="saveOrgFunction"
+                >保 存</el-button
+              >
+              <el-button @click="functionDialog = false;">取 消</el-button>
+            </div>
+          </el-dialog>
+
+          <!-- logo上传弹窗 -->
+          <el-dialog title="logo上传" size="tiny" :visible.sync="logoDialog">
+            <el-form>
+              <el-row>
+                <el-form-item label="学校名称" label-width="120px">
+                  <el-input
+                    class="pull_length"
+                    v-model="curSchool.name"
+                    :readonly="true"
+                  ></el-input>
+                </el-form-item>
+                <el-form-item label="学校代码" label-width="120px">
+                  <el-input
+                    class="pull_length"
+                    v-model="curSchool.code"
+                    :readonly="true"
+                  ></el-input>
+                </el-form-item>
+                <el-form-item style="margin-left:20px">
+                  <el-upload
+                    class="form_left"
+                    ref="upload"
+                    accept="image/*"
+                    :action="uploadAction"
+                    :headers="uploadHeaders"
+                    :data="uploadData"
+                    :before-upload="beforeUpload"
+                    :on-progress="uploadProgress"
+                    :on-success="uploadSuccess"
+                    :on-error="uploadError"
+                    :file-list="fileList"
+                    :auto-upload="false"
+                    :multiple="false"
+                  >
+                    <el-button size="small" slot="trigger" type="primary"
+                      >选择文件</el-button
+                    >
+                    <el-button size="small" type="success" @click="submitUpload"
+                      >确认上传
+                    </el-button>
+                    <el-button size="small" type="danger" @click="removeFile"
+                      >清空文件
+                    </el-button>
+                    <div slot="tip" class="el-upload__tip">只能上传图片</div>
+                  </el-upload>
+                </el-form-item>
+              </el-row>
+            </el-form>
+          </el-dialog>
+
+          <!-- 页面列表 -->
+          <el-table
+            :data="tableData"
+            border
+            style="width: 100%;text-align:center;"
+            @selection-change="selectChange"
+          >
+            <el-table-column type="selection" width="50"> </el-table-column>
+            <el-table-column prop="id" label="ID" width="100">
+            </el-table-column>
+            <el-table-column label="学校名称" width="250">
+              <template slot-scope="scope">
+                <el-popover trigger="hover" placement="left">
+                  <div style="font-size: 18px;font-family: 新宋体">
+                    <tr>
+                      <td style="color: green">学校名称</td>
+                      <td style="color:purple;padding-left: 20px;">
+                        {{ scope.row.name }}
+                      </td>
+                    </tr>
+                    <tr>
+                      <td style="color: green">学校代码</td>
+                      <td style="color:purple;padding-left: 20px;">
+                        {{ scope.row.code }}
+                      </td>
+                    </tr>
+                    <tr>
+                      <td style="color: green">负责人</td>
+                      <td style="color:purple;padding-left: 20px;">
+                        {{ scope.row.contacts }}
+                      </td>
+                    </tr>
+                    <tr>
+                      <td style="color: green">联系方式</td>
+                      <td style="color:purple;padding-left: 20px;">
+                        {{ scope.row.telephone }}
+                      </td>
+                    </tr>
+                  </div>
+
+                  <div slot="reference" class="name-wrapper">
+                    <span>{{ scope.row.name }}</span>
+                  </div>
+                </el-popover>
+              </template>
+            </el-table-column>
+            <el-table-column prop="domainName" label="学校域名">
+            </el-table-column>
+            <el-table-column prop="updateTime" width="170" label="更新时间">
+            </el-table-column>
+            <el-table-column width="100" label="状态">
+              <template slot-scope="scope">
+                <div>
+                  <span>
+                    <el-tag :type="getTag(scope.row.enable)">
+                      {{ getStatus(scope.row.enable) }}
+                    </el-tag>
+                  </span>
+                </div>
+              </template>
+            </el-table-column>
+            <el-table-column :context="_self" width="300" prop="" label="操作">
+              <div>
+                <span>
+                  <el-button size="mini" type="primary" @click="edit(row);">
+                    <i class="el-icon-edit"></i> 修改
+                  </el-button>
+                </span>
+                <span>
+                  <el-button size="mini" type="primary" @click="setLogo(row);">
+                    <i class="el-icon-edit"></i> logo上传
+                  </el-button>
+                </span>
+              </div>
+            </el-table-column>
+          </el-table>
+          <div class="page pull-right">
+            <el-pagination
+              @current-change="handleCurrentChange"
+              :current-page="currentPage"
+              :page-size="pageSize"
+              layout="total, prev, pager, next, jumper"
+              :total="total"
+            >
+            </el-pagination>
+          </div>
+        </div>
+      </div>
+    </section>
+  </div>
+</template>
+<script>
+import { core_api } from "../constants/constants.js";
+import { mapState } from "vuex";
+
+export default {
+  data() {
+    return {
+      formSearch: {
+        code: "",
+        name: "",
+        domainName: ""
+      },
+      schoolForm: {
+        id: null,
+        name: "",
+        code: "",
+        domainName: "",
+        contacts: "",
+        telephone: "",
+        enable: "true",
+        remark: "",
+        properties: {
+          OE_STUDENT_SYS_NAME: null
+        }
+      },
+      functionDialog: false,
+      functionDialogInited: false,
+      schoolDialog: false,
+      logoDialog: false,
+      curSchool: {
+        name: null,
+        code: null
+      },
+      uploadAction: "",
+      uploadHeaders: {},
+      uploadData: {},
+      fileList: [],
+      selectedOrgIds: [],
+      loading: true,
+      tableData: [],
+      currentPage: 1,
+      pageSize: 10,
+      total: 10,
+      imp: "",
+      rules: {
+        code: [{ required: true, message: "请输入学校代码", trigger: "blur" }],
+        domainName: [
+          { required: true, message: "请输入学校域名", trigger: "blur" }
+        ],
+        name: [{ required: true, message: "请输入学校名称", trigger: "blur" }],
+        contacts: [
+          { required: true, message: "请输入负责人", trigger: "blur" }
+        ],
+        telephone: [
+          { required: true, message: "请输入联系方式", trigger: "blur" }
+        ],
+        enable: [{ required: true, message: "请选择状态", trigger: "change" }]
+      }
+    };
+  },
+  computed: {
+    ...mapState({ user: state => state.user }),
+    orgIds() {
+      var orgIds = "";
+      for (let orgId of this.selectedOrgIds) {
+        if (!orgIds) {
+          orgIds += orgId;
+        } else {
+          orgIds += "," + orgId;
+        }
+      }
+      return orgIds;
+    }
+  },
+  methods: {
+    getStatus(status) {
+      if (status == true) {
+        return "启用";
+      } else if (status == false) {
+        return "禁用";
+      }
+      return status;
+    },
+    getTag(status) {
+      if (status == true) {
+        return "success";
+      } else if (status == false) {
+        return "danger";
+      }
+      return status;
+    },
+    handleCurrentChange(val) {
+      this.currentPage = val;
+      this.searchForm();
+    },
+    //查询
+    searchForm() {
+      this.loading = true;
+      var param = new URLSearchParams(this.formSearch);
+      var url =
+        core_api +
+        "/org/rootOrgPage/" +
+        (this.currentPage - 1) +
+        "/" +
+        this.pageSize +
+        "?" +
+        param;
+      this.$http.get(url).then(response => {
+        this.tableData = response.data.list;
+        this.total = response.data.total;
+        this.loading = false;
+      });
+    },
+    //启用
+    enableOrg() {
+      if (this.selectedOrgIds.length === 0) {
+        this.$notify({
+          type: "warning",
+          message: "请选择要启用的机构"
+        });
+      } else {
+        this.$confirm("是否开启这些机构?", "提示", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(() => {
+          var url = core_api + "/org/enable/" + this.orgIds;
+          this.$http
+            .put(url)
+            .then(() => {
+              this.$notify({
+                type: "success",
+                message: "启用成功!"
+              });
+              this.searchForm();
+            })
+            .catch(response => {
+              if (response.status == 500) {
+                this.$notify({
+                  showClose: true,
+                  message: response.data.desc,
+                  type: "error"
+                });
+              }
+            });
+        });
+      }
+    },
+    disableOrg() {
+      if (this.selectedOrgIds.length === 0) {
+        this.$notify({
+          type: "warning",
+          message: "请选择要禁用的机构"
+        });
+      } else {
+        this.$confirm("是否禁用这些机构?", "提示", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(() => {
+          var url = core_api + "/org/disable/" + this.orgIds;
+          this.$http
+            .put(url, {})
+            .then(() => {
+              this.$notify({
+                type: "success",
+                message: "禁用成功!"
+              });
+              this.searchForm();
+            })
+            .catch(response => {
+              if (response.status == 500) {
+                this.$notify({
+                  showClose: true,
+                  message: response.data.desc,
+                  type: "error"
+                });
+              }
+            });
+        });
+      }
+    },
+    selectChange(row) {
+      this.selectedOrgIds = [];
+      row.forEach(element => {
+        this.selectedOrgIds.push(element.id);
+      });
+      console.log(this.selectedOrgIds);
+    },
+    //重置
+    resetForm() {
+      this.$refs.schoolForm.resetFields();
+    },
+    //提交
+    submitForm() {
+      this.$refs.schoolForm.validate(valid => {
+        if (valid) {
+          if (null != this.schoolForm.id) {
+            //修改
+            url = core_api + "/org/updateRootOrg";
+            this.$http.put(url, this.schoolForm).then(
+              () => {
+                this.$notify({
+                  type: "success",
+                  message: "修改成功!"
+                });
+                this.searchForm();
+                this.schoolDialog = false;
+              },
+              response => {
+                if (response.status == 500) {
+                  this.$notify({
+                    showClose: true,
+                    message: response.data.desc,
+                    type: "error"
+                  });
+                }
+              }
+            );
+          } else {
+            //新增
+            var url = core_api + "/org/addRootOrg";
+            this.$http.post(url, this.schoolForm).then(
+              () => {
+                this.$notify({
+                  type: "success",
+                  message: "新增成功!"
+                });
+                this.searchForm();
+                this.schoolDialog = false;
+              },
+              response => {
+                if (response.status == 500) {
+                  this.$notify({
+                    showClose: true,
+                    message: response.data.desc,
+                    type: "error"
+                  });
+                }
+              }
+            );
+          }
+        } else {
+          console.log("error submit!");
+          return false;
+        }
+      });
+    },
+    //新增
+    insert() {
+      this.schoolForm.id = null;
+      this.schoolForm.name = "";
+      this.schoolForm.code = "";
+      this.schoolForm.domainName = "";
+      this.schoolForm.telephone = "";
+      this.schoolForm.contacts = "";
+      this.schoolForm.properties.OE_STUDENT_SYS_NAME = "";
+      this.schoolForm.enable = "true";
+
+      this.schoolDialog = true;
+    },
+    //修改
+    edit(row) {
+      this.schoolForm.id = row.id;
+      this.schoolForm.name = row.name;
+      this.schoolForm.code = row.code;
+      this.schoolForm.domainName = row.domainName;
+      this.schoolForm.telephone = row.telephone;
+      this.schoolForm.contacts = row.contacts;
+      this.schoolForm.properties.OE_STUDENT_SYS_NAME = "";
+      this.schoolForm.enable = row.enable ? "true" : "false";
+
+      var url = core_api + "/org/allProperties/" + row.id;
+      this.$http.get(url).then(
+        response => {
+          this.schoolForm.properties = Object.assign(
+            this.schoolForm.properties,
+            response.data
+          );
+          this.schoolDialog = true;
+        },
+        response => {
+          this.$notify({
+            type: "error",
+            message: response.data.desc
+          });
+        }
+      );
+    },
+    //设置产品
+    saveOrgFunction() {},
+    //设置logo
+    setLogo(row) {
+      this.uploadAction = core_api + "/org/importLogo/" + row.id;
+      this.removeFile();
+      this.curSchool.name = row.name;
+      this.curSchool.code = row.code;
+      this.logoDialog = true;
+    },
+    initUpload() {
+      this.fileList = [];
+    },
+    beforeUpload(file) {
+      console.log(file);
+    },
+    uploadProgress() {
+      console.log("uploadProgress");
+    },
+    uploadSuccess(response) {
+      console.log("uploadSuccess");
+      console.log(response);
+      if (!response || response.length == 0) {
+        this.$notify({
+          message: "上传成功",
+          type: "success"
+        });
+      } else {
+        this.errMessages = response;
+        this.errDialog = true;
+      }
+      this.fileLoading = false;
+      this.logoDialog = false;
+      this.removeFile();
+      this.searchForm();
+    },
+    uploadError() {
+      this.$notify({
+        message: "上传失败",
+        type: "error"
+      });
+      this.fileLoading = false;
+    },
+    //确定上传
+    submitUpload() {
+      if (!this.checkUpload()) {
+        return false;
+      }
+      this.$refs.upload.submit();
+      this.fileLoading = true;
+    },
+    checkUpload() {
+      var fileList = this.$refs.upload.uploadFiles;
+      if (fileList.length == 0) {
+        this.$notify({
+          message: "上传文件不能为空",
+          type: "error"
+        });
+        return false;
+      }
+      if (fileList.length > 1) {
+        this.$notify({
+          message: "每次只能上传一个文件",
+          type: "error"
+        });
+        return false;
+      }
+      for (let file of fileList) {
+        var fileName = file.name;
+        if (
+          !fileName.endsWith(".jpg") &&
+          !fileName.endsWith(".gif") &&
+          !fileName.endsWith(".png")
+        ) {
+          this.$notify({
+            message: "上传文件必须为[jpg,gif,png]",
+            type: "error"
+          });
+          this.initUpload();
+          return false;
+        }
+      }
+      return true;
+    },
+    //清空文件
+    removeFile() {
+      this.fileList = [];
+      if (this.$refs.upload) {
+        this.$refs.upload.clearFiles();
+      }
+    }
+  },
+  //初始化查询
+  created() {
+    this.searchForm();
+
+    this.uploadHeaders = {
+      key: this.user.key,
+      token: this.user.token
+    };
+  }
+};
+</script>

+ 947 - 0
src/modules/basic/view/specially.vue

@@ -0,0 +1,947 @@
+<template>
+  <div>
+    <section class="content">
+      <div class="box box-info">
+        <!-- 头信息 -->
+        <div class="box-header with-border">
+          <h3 class="box-title">专业列表</h3>
+          <div class="box-tools pull-right">
+            <button
+              type="button"
+              class="btn btn-box-tool"
+              data-widget="collapse"
+            >
+              <i class="fa fa-minus"></i>
+            </button>
+          </div>
+        </div>
+
+        <!-- 正文信息 -->
+        <div class="box-body">
+          <el-form
+            :inline="true"
+            :model="formSearch"
+            label-position="right"
+            label-width="100px"
+          >
+            <el-row>
+              <el-form-item label="专业名称" class="pull-left">
+                <el-input
+                  class="input_width_lg"
+                  placeholder="请输入专业名称"
+                  v-model="formSearch.name"
+                ></el-input>
+              </el-form-item>
+              <el-form-item label="专业代码" class="pull-left">
+                <el-input
+                  class="input_width_lg"
+                  placeholder="请输入专业代码"
+                  v-model="formSearch.code"
+                ></el-input>
+              </el-form-item>
+              <el-form-item label="课程" class="pull-left">
+                <el-select
+                  class="input"
+                  :remote-method="getCourses"
+                  :loading="courseLoading"
+                  remote
+                  filterable
+                  clearable
+                  v-model="formSearch.courseId"
+                  placeholder="请选择"
+                >
+                  <el-option
+                    v-for="item in courseList4SearchWrapper"
+                    :label="item.name"
+                    :value="item.id"
+                    :key="item.id"
+                  >
+                  </el-option>
+                </el-select>
+              </el-form-item>
+              <el-form-item label="" class="pull-right">
+                <el-button
+                  size="small"
+                  type="primary"
+                  icon="search"
+                  @click="searchForm"
+                  >查询</el-button
+                >
+                <el-button size="small" type="primary" @click="impSpecialty"
+                  ><i class="fa fa-upload" aria-hidden="true"></i>导入
+                </el-button>
+                <el-button
+                  size="small"
+                  type="primary"
+                  icon="plus"
+                  @click="insert"
+                  >新增</el-button
+                >
+                <el-button size="small" type="danger" @click="deleteIds">
+                  <i class="el-icon-delete"></i> 删除
+                </el-button>
+                <el-button size="small" type="primary" @click="exportSpeciatly">
+                  <i class="fa fa-upload" aria-hidden="true"></i>&nbsp;导出
+                </el-button>
+              </el-form-item>
+            </el-row>
+          </el-form>
+
+          <!-- 新增或修改弹出框 -->
+          <el-dialog
+            title="专业信息"
+            :visible.sync="speciallyDialog"
+            size="tiny"
+          >
+            <el-form
+              :inline="true"
+              :model="speciallyForm"
+              ref="speciallyForm"
+              :rules="rules"
+              label-position="right"
+              label-width="90px"
+            >
+              <el-row>
+                <el-form-item label="专业代码" label-width="120px" prop="code">
+                  <el-input
+                    :disabled="null != speciallyForm.id"
+                    class="pull_length"
+                    v-model="speciallyForm.code"
+                    auto-complete="off"
+                    placeholder="专业代码"
+                  ></el-input>
+                </el-form-item>
+              </el-row>
+              <el-row>
+                <el-form-item label="专业名称" label-width="120px" prop="name">
+                  <el-input
+                    class="pull_length"
+                    v-model="speciallyForm.name"
+                    auto-complete="off"
+                    placeholder="专业名称"
+                  ></el-input>
+                </el-form-item>
+              </el-row>
+              <el-row class="pull_center">
+                <el-button type="primary" @click="submitForm('speciallyForm');"
+                  >保 存</el-button
+                >
+                <el-button type="danger" @click="close">取 消</el-button>
+              </el-row>
+            </el-form>
+          </el-dialog>
+
+          <!-- 关联课程弹出框 -->
+          <el-dialog
+            :title="courseDialogTitle"
+            v-model="courseDialog"
+            size="small"
+          >
+            <!-- 表单 -->
+            <el-form
+              :inline="true"
+              :model="courseSearchForm"
+              label-position="right"
+              label-width="100px"
+            >
+              <el-row>
+                <el-form-item label="课程名称" class="pull-left">
+                  <el-input
+                    class="input_width_lg"
+                    placeholder="请输入课程名称"
+                    v-model="courseSearchForm.name"
+                  ></el-input>
+                </el-form-item>
+                <el-form-item label="课程代码" class="pull-left">
+                  <el-input
+                    class="input_width_lg"
+                    placeholder="请输入课程代码"
+                    v-model="courseSearchForm.code"
+                  ></el-input>
+                </el-form-item>
+                <el-form-item class="pull-right">
+                  <el-button
+                    size="small"
+                    type="primary"
+                    icon="search"
+                    @click="searchCoursePage"
+                    >查询
+                  </el-button>
+                  <el-button
+                    size="small"
+                    type="primary"
+                    icon="search"
+                    @click="addRelation"
+                    >新增
+                  </el-button>
+                </el-form-item>
+              </el-row>
+            </el-form>
+
+            <!-- 课程列表 -->
+            <el-table
+              :data="courseTableData"
+              border
+              style="width: 100%;text-align:center;"
+            >
+              <el-table-column prop="id" label="ID" width="150">
+              </el-table-column>
+              <el-table-column prop="name" label="课程名称" width="250">
+              </el-table-column>
+              <el-table-column prop="code" label="课程代码"> </el-table-column>
+              <el-table-column prop="updateTime" label="更新时间" width="170">
+              </el-table-column>
+              <el-table-column label="操作">
+                <template slot-scope="scope">
+                  <div>
+                    <span>
+                      <el-button
+                        size="mini"
+                        type="info"
+                        @click="deleteRelation(row);"
+                      >
+                        <i class="el-icon-edit"></i> 取消关联
+                      </el-button>
+                    </span>
+                  </div>
+                </template>
+              </el-table-column>
+            </el-table>
+            <div class="page pull-right">
+              <el-pagination
+                @current-change="handleCourseCurrentChange"
+                :current-page="currentCoursePage"
+                :page-size="10"
+                layout="total, prev, pager, next, jumper"
+                :total="courseTotal"
+              >
+              </el-pagination>
+            </div>
+          </el-dialog>
+
+          <!-- 添加关联 -->
+          <el-dialog
+            title="添加关联课程"
+            v-model="addRelationDialog"
+            size="tiny"
+          >
+            <el-form
+              :inline="true"
+              :model="addRelationForm"
+              ref="addRelationForm"
+              label-position="right"
+              label-width="100px"
+              :rules="addRelationRules"
+            >
+              <el-row>
+                <el-form-item label="课程" class="pull-left" prop="courseId">
+                  <el-select
+                    class="input"
+                    :remote-method="getCourses4AddRelation"
+                    :loading="courseLoading4AddRelation"
+                    remote
+                    filterable
+                    clearable
+                    v-model="addRelationForm.courseId"
+                    placeholder="请选择"
+                  >
+                    <el-option
+                      v-for="item in courseList4AddRelationWrapper"
+                      :label="item.name"
+                      :value="item.id"
+                      :key="item.id"
+                    >
+                    </el-option>
+                  </el-select>
+                </el-form-item>
+              </el-row>
+              <el-row class="pull_center">
+                <el-button type="primary" @click="submitAddRelationForm"
+                  >保 存</el-button
+                >
+                <el-button @click="addRelationDialog = false;">取 消</el-button>
+              </el-row>
+            </el-form>
+          </el-dialog>
+
+          <!-- 页面列表 -->
+          <el-table
+            :data="tableData"
+            border
+            style="width: 100%;text-align:center;"
+            @selection-change="handleSelectionChange"
+          >
+            <el-table-column type="selection" width="50"> </el-table-column>
+            <el-table-column prop="id" label="ID" width="200">
+            </el-table-column>
+            <el-table-column prop="code" label="专业代码"> </el-table-column>
+            <el-table-column prop="name" label="专业名称"> </el-table-column>
+            <el-table-column prop="updateTime" label="更新时间" width="170">
+            </el-table-column>
+            <el-table-column label="操作" width="250">
+              <template slot-scope="scope">
+                <div>
+                  <el-button
+                    size="mini"
+                    type="primary"
+                    @click="relation(scope.row);"
+                  >
+                    关联课程
+                  </el-button>
+                  <el-button size="mini" type="info" @click="edit(scope.row);">
+                    修改
+                  </el-button>
+                  <el-button
+                    size="mini"
+                    type="danger"
+                    @click="deleteId(scope.row);"
+                  >
+                    删除
+                  </el-button>
+                </div>
+              </template>
+            </el-table-column>
+          </el-table>
+          <div class="page pull-right">
+            <el-pagination
+              @current-change="handleCurrentChange"
+              :current-page="currentPage"
+              :page-size="pageSize"
+              layout="total, prev, pager, next, jumper"
+              :total="total"
+            >
+            </el-pagination>
+          </div>
+
+          <!-- 导入弹窗 -->
+          <el-dialog title="导入窗口" size="tiny" :visible.sync="impDialog">
+            <el-form>
+              <el-row>
+                <el-form-item style="margin-left:20px">
+                  <el-upload
+                    class="form_left"
+                    ref="upload"
+                    accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
+                    :action="uploadAction"
+                    :headers="uploadHeaders"
+                    :data="uploadData"
+                    :before-upload="beforeUpload"
+                    :on-progress="uploadProgress"
+                    :on-success="uploadSuccess"
+                    :on-error="uploadError"
+                    :file-list="fileList"
+                    :auto-upload="false"
+                    :multiple="false"
+                  >
+                    <el-button size="small" slot="trigger" type="primary"
+                      >选择文件</el-button
+                    >
+                    <el-button size="small" type="success" @click="submitUpload"
+                      >确认上传</el-button
+                    >
+                    <el-button size="small" type="danger" @click="removeFile"
+                      >清空文件</el-button
+                    >
+                    <el-button size="small" type="info" @click="exportFile"
+                      >下载模板</el-button
+                    >
+                    <div slot="tip" class="el-upload__tip">
+                      只能上传xlsx文件
+                    </div>
+                  </el-upload>
+                </el-form-item>
+              </el-row>
+            </el-form>
+          </el-dialog>
+
+          <!-- 导入错误信息列表 -->
+          <el-dialog title="错误提示" :visible.sync="errDialog">
+            <div
+              class="text-danger"
+              v-for="errMessage in errMessages"
+              :key="errMessage.lineNum"
+            >
+              第{{ errMessage.lineNum }}行:{{ errMessage.msg }}
+            </div>
+            <span slot="footer" class="dialog-footer">
+              <el-button @click="errDialog = false;">确定</el-button>
+            </span>
+          </el-dialog>
+        </div>
+      </div>
+    </section>
+  </div>
+</template>
+
+<script>
+import { core_api } from "../constants/constants.js";
+import { mapState } from "vuex";
+
+export default {
+  data() {
+    return {
+      courseLoading: false,
+      formSearch: {
+        name: "",
+        code: "",
+        courseId: ""
+      },
+      speciallyForm: {
+        id: null,
+        name: "",
+        code: ""
+      },
+      speciatlyId: "",
+      speciallyDialog: false,
+      courseDialog: false,
+      loading: false,
+      multipleSelection: [],
+      tableData: [],
+      currentPage: 1,
+      pageSize: 10,
+      total: 10,
+      courseAllList: [],
+      courseList: [],
+      courseList4Search: [],
+      courseAll: [],
+
+      impDialog: false,
+      uploadAction: core_api + "/specialty/import",
+      uploadHeaders: {},
+      uploadData: {},
+      errMessages: [],
+      errDialog: false,
+      fileLoading: false,
+      fileList: [],
+      rules: {
+        name: [{ required: true, message: "请输入专业名称", trigger: "blur" }],
+        code: [{ required: true, message: "请输入专业代码", trigger: "blur" }]
+      },
+      courseDialogTitle: null,
+      courseSearchForm: {
+        specialtyId: null,
+        code: null,
+        name: null
+      },
+      courseTableData: [],
+      currentCoursePage: 1,
+      coursePageSize: 10,
+      courseTotal: 10,
+
+      addRelationDialog: false,
+      addRelationForm: {
+        specialtyId: null,
+        courseId: null
+      },
+      courseLoading4AddRelation: false,
+      courseList4AddRelation: [],
+      addRelationRules: {
+        courseId: [
+          {
+            required: true,
+            type: "number",
+            message: "请选择课程",
+            trigger: "change"
+          }
+        ]
+      }
+    };
+  },
+  computed: {
+    ...mapState({
+      user: state => state.user
+    }),
+    courseAllListSelect() {
+      let courseList = [];
+      for (let course of this.courseAllList) {
+        let courseInfo = course.name + "(" + course.code + ")";
+        courseList.push({ id: course.id, courseInfo: courseInfo });
+      }
+      return courseList;
+    },
+    courseList4SearchWrapper() {
+      var courseList = [];
+      for (let course of this.courseList4Search) {
+        var name = course.name + " - " + course.code;
+        var id = course.id;
+        courseList.push({ id: id, name: name, enable: course.enable });
+      }
+      return courseList;
+    },
+    courseList4AddRelationWrapper() {
+      var courseList = [];
+      for (let course of this.courseList4AddRelation) {
+        var name = course.name + " - " + course.code;
+        var id = course.id;
+        courseList.push({ id: id, name: name, enable: course.enable });
+      }
+      return courseList;
+    }
+  },
+  methods: {
+    deleteRelation(row) {
+      var courseId = row.id;
+      var specialtyId = this.courseSearchForm.specialtyId;
+      var param = new URLSearchParams({
+        courseId: courseId,
+        specialtyId: specialtyId
+      });
+      var url = core_api + "/courseSpeciatlyRelation/delete?" + param;
+      this.$http
+        .delete(url)
+        .then(() => {
+          this.$notify({
+            type: "success",
+            message: "取消关联成功!"
+          });
+          this.searchCoursePage();
+        })
+        .catch(response => {
+          if (response.status == 500) {
+            this.$notify({
+              showClose: true,
+              message: response.data.desc,
+              type: "error"
+            });
+          }
+        });
+    },
+    submitAddRelationForm() {
+      this.$refs.addRelationForm.validate(valid => {
+        if (valid) {
+          var param = new URLSearchParams(this.addRelationForm);
+          var url = core_api + "/courseSpeciatlyRelation/add?" + param;
+          this.$http.post(url, this.speciallyForm).then(
+            () => {
+              this.$notify({
+                type: "success",
+                message: "添加成功!"
+              });
+              this.searchCoursePage();
+              this.addRelationDialog = false;
+            },
+            response => {
+              if (response.status == 500) {
+                this.$notify({
+                  showClose: true,
+                  message: response.data.desc,
+                  type: "error"
+                });
+              }
+              this.addRelationDialog = false;
+            }
+          );
+        } else {
+          console.log("error submit!");
+          return false;
+        }
+      });
+    },
+    addRelation() {
+      this.addRelationForm.courseId = null;
+      this.addRelationForm.specialtyId = this.courseSearchForm.specialtyId;
+      this.addRelationDialog = true;
+      this.$refs.addRelationForm.resetFields();
+    },
+    searchCoursePage() {
+      var param = new URLSearchParams(this.courseSearchForm);
+      var url =
+        core_api +
+        "/course/coursePage/" +
+        (this.currentPage - 1) +
+        "/" +
+        this.pageSize +
+        "?" +
+        param;
+      this.$http.get(url).then(response => {
+        console.log(response);
+        this.courseTableData = response.data.content;
+        this.courseTotal = response.data.totalElements;
+      });
+    },
+    getCourses(query) {
+      this.courseLoading = true;
+      this.$http
+        .get(core_api + "/course/query?name=" + query)
+        .then(response => {
+          this.courseList4Search = response.data;
+          this.courseLoading = false;
+        });
+    },
+    getCourses4AddRelation(query) {
+      this.courseLoading4AddRelation = true;
+      this.$http
+        .get(core_api + "/course/query?name=" + query)
+        .then(response => {
+          this.courseList4AddRelation = response.data;
+          this.courseLoading4AddRelation = false;
+        });
+    },
+    //查询
+    searchForm() {
+      var param = new URLSearchParams(this.formSearch);
+      var url =
+        core_api +
+        "/specialty/specialtyPage/" +
+        (this.currentPage - 1) +
+        "/" +
+        this.pageSize +
+        "?" +
+        param;
+      this.$http
+        .get(url)
+        .then(response => {
+          console.log("response :", response);
+          this.tableData = response.data.content;
+          this.total = response.data.totalElements;
+        })
+        .catch(response => {
+          if (response.status == 500) {
+            this.$notify({
+              showClose: true,
+              message: response.data.desc,
+              type: "error"
+            });
+          }
+        });
+    },
+    handleCurrentChange(val) {
+      this.currentPage = val;
+      this.searchForm();
+    },
+    handleCourseCurrentChange(val) {
+      this.currentCoursePage = val;
+      this.searchCoursePage();
+    },
+    //全选
+    handleSelectionChange(val) {
+      this.multipleSelection = val;
+    },
+    //删除方法
+    deleteSchool() {
+      this.$confirm("是否删除学校信息?", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "error"
+      }).then(() => {
+        this.loading = true;
+        var vm = this;
+        var url = core_api;
+        vm.$http.delete(url).then(() => {
+          this.loading = false;
+          this.$notify({
+            type: "success",
+            message: "删除成功!"
+          });
+          //this.searchForm()
+        });
+      });
+    },
+    //保存
+    submitForm(formData) {
+      this.$refs[formData].validate(valid => {
+        if (valid) {
+          var url = core_api + "/specialty";
+          //修改
+          if (null != this.speciallyForm.id) {
+            this.$http.put(url, this.speciallyForm).then(
+              () => {
+                this.$notify({
+                  type: "success",
+                  message: "修改成功!"
+                });
+                this.searchForm();
+                this.speciallyDialog = false;
+              },
+              response => {
+                if (response.status == 500) {
+                  this.$notify({
+                    showClose: true,
+                    message: response.data.desc,
+                    type: "error"
+                  });
+                }
+                this.searchForm();
+                this.speciallyDialog = false;
+              }
+            );
+          }
+          //新增
+          else {
+            this.$http.post(url, this.speciallyForm).then(
+              () => {
+                this.$notify({
+                  type: "success",
+                  message: "新增成功!"
+                });
+                this.speciallyDialog = false;
+                this.searchForm();
+              },
+              response => {
+                if (response.status == 500) {
+                  this.$notify({
+                    showClose: true,
+                    message: response.data.desc,
+                    type: "error"
+                  });
+                }
+                this.speciallyDialog = false;
+                this.searchForm();
+              }
+            );
+          }
+        } else {
+          console.log("error submit!");
+          return false;
+        }
+      });
+    },
+
+    //重置
+    resetForm(formData) {
+      this.$refs[formData].resetFields();
+    },
+    close() {
+      this.speciallyDialog = false;
+    },
+    //新增
+    insert() {
+      this.speciallyForm.id = null;
+      this.speciallyForm.name = "";
+      this.speciallyForm.code = "";
+
+      this.speciallyDialog = true;
+    },
+    //修改
+    edit(row) {
+      this.speciallyForm = Object.assign({}, row);
+
+      this.speciallyDialog = true;
+    },
+    //删除
+    deleteId(row) {
+      this.$confirm("是否删除该条课程信息?", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "error"
+      }).then(() => {
+        var url = core_api + "/specialty/" + row.id;
+        this.$http
+          .delete(url)
+          .then(() => {
+            this.$notify({
+              type: "success",
+              message: "删除成功!"
+            });
+            this.searchForm();
+          })
+          .catch(response => {
+            if (response.status == 500) {
+              this.$notify({
+                showClose: true,
+                message: response.data.desc,
+                type: "error"
+              });
+            }
+          });
+      });
+    },
+    //删除多条信息
+    deleteIds() {
+      if (this.multipleSelection.length === 0) {
+        this.$notify({
+          type: "warning",
+          message: "请选择要删除的专业"
+        });
+      } else {
+        this.$confirm("是否删除这些课程信息?", "提示", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "error"
+        }).then(() => {
+          var ids = [];
+          for (var i = 0; i < this.multipleSelection.length; i++) {
+            ids.push(this.multipleSelection[i].id);
+          }
+          var url = core_api + "/specialty/" + ids;
+          this.$http
+            .delete(url)
+            .then(() => {
+              this.$notify({
+                type: "success",
+                message: "删除成功!"
+              });
+              this.searchForm();
+            })
+            .catch(response => {
+              if (response.status == 500) {
+                this.$notify({
+                  showClose: true,
+                  message: response.data.desc,
+                  type: "error"
+                });
+              }
+            });
+        });
+      }
+    },
+    //关联课程
+    relation(row) {
+      this.courseDialogTitle =
+        "关联课程列表 【专业名称:" +
+        row.name +
+        "】【       专业代码:" +
+        row.code +
+        "】";
+      this.courseSearchForm.specialtyId = row.id;
+      this.courseSearchForm.name = null;
+      this.courseSearchForm.code = null;
+
+      this.searchCoursePage();
+      this.courseDialog = true;
+    },
+    closeCourse() {
+      this.courseDialog = false;
+    },
+    saveCourse() {
+      //debugger;
+      var url = core_api + "/CourseSpeciatly/addCourse/" + this.speciatlyId;
+      this.$http.post(url, this.courseList).then(
+        () => {
+          this.$notify({
+            type: "success",
+            message: "课程关联成功!"
+          });
+          this.courseDialog = false;
+          this.searchForm();
+        },
+        () => {
+          this.$notify({
+            type: "error",
+            message: "课程关联失败!"
+          });
+          this.courseDialog = false;
+          this.searchForm();
+        }
+      );
+    },
+    exportSpeciatly() {
+      let param = new URLSearchParams(this.formSearch);
+      window.open(
+        core_api +
+          "/specialty/export?$key=" +
+          this.user.key +
+          "&$token=" +
+          this.user.token +
+          "&" +
+          param
+      );
+    },
+    //导入
+    impSpecialty() {
+      this.impDialog = true;
+      this.initUpload();
+    },
+    initUpload() {
+      this.fileList = [];
+    },
+    beforeUpload(file) {
+      console.log(file);
+    },
+    uploadProgress() {
+      console.log("uploadProgress");
+    },
+    uploadSuccess(response) {
+      if (!response.hasError) {
+        this.$notify({
+          message: "上传成功",
+          type: "success"
+        });
+        this.fileLoading = false;
+        this.impDialog = false;
+        this.searchForm();
+      } else {
+        this.fileLoading = false;
+        this.impDialog = false;
+        this.errMessages = response.failRecords;
+        this.errDialog = true;
+      }
+    },
+    uploadError(response) {
+      var jsonStr = response.message.substring(4);
+      var resp = eval("(" + jsonStr + ")");
+      if (response.status == 500) {
+        this.$notify({
+          message: resp.desc,
+          type: "error"
+        });
+      }
+      this.fileLoading = false;
+    },
+    //确定上传
+    submitUpload() {
+      if (!this.checkUpload()) {
+        return false;
+      }
+      this.$refs.upload.submit();
+      this.fileLoading = true;
+    },
+    checkUpload() {
+      var fileList = this.$refs.upload.uploadFiles;
+      if (fileList.length == 0) {
+        this.$notify({
+          message: "上传文件不能为空",
+          type: "error"
+        });
+        return false;
+      }
+      if (fileList.length > 1) {
+        this.$notify({
+          message: "每次只能上传一个文件",
+          type: "error"
+        });
+        return false;
+      }
+      for (let file of fileList) {
+        if (!file.name.endsWith(".xlsx")) {
+          this.$notify({
+            message: "上传文件必须为xlsx格式",
+            type: "error"
+          });
+          this.initUpload();
+          return false;
+        }
+      }
+      return true;
+    },
+    //清空文件
+    removeFile() {
+      // this.fileList = [];
+      this.$refs.upload.clearFiles();
+    },
+    //下载模板
+    exportFile() {
+      window.location.href =
+        core_api +
+        "/specialty/importTemplate?$key=" +
+        this.user.key +
+        "&$token=" +
+        this.user.token;
+    }
+  },
+  //初始化查询
+  created() {
+    this.searchForm();
+    this.uploadHeaders = {
+      key: this.user.key,
+      token: this.user.token
+    };
+  }
+};
+</script>
+
+<style scoped>
+.pull_center {
+  margin-left: 120px;
+}
+</style>

+ 1119 - 0
src/modules/basic/view/user.vue

@@ -0,0 +1,1119 @@
+<template>
+  <div>
+    <section class="content">
+      <div class="box box-info">
+        <!-- 头信息 -->
+        <div class="box-header with-border">
+          <h3 class="box-title">普通用户管理</h3>
+          <div class="box-tools pull-right">
+            <button
+              type="button"
+              class="btn btn-box-tool"
+              data-widget="collapse"
+            >
+              <i class="fa fa-minus"></i>
+            </button>
+          </div>
+        </div>
+
+        <!-- 正文信息 -->
+        <div class="box-body">
+          <!-- 搜索 -->
+          <el-form
+            :inline="true"
+            :model="searchForm"
+            label-position="right"
+            label-width="80px"
+          >
+            <el-row>
+              <el-form-item label="顶级机构" class="pull-left">
+                <el-select
+                  style="width: 180px"
+                  class="input_width_lg"
+                  v-model="searchForm.rootOrgId"
+                  placeholder="请选择"
+                  :disabled="!isSuperAdmin"
+                  @change="rootOrgChanged4Search"
+                >
+                  <el-option
+                    v-for="item in rootOrgList"
+                    :label="item.name"
+                    :value="item.id"
+                    :key="item.id"
+                  >
+                  </el-option>
+                </el-select>
+              </el-form-item>
+              <el-form-item label="角色" class="pull-left">
+                <el-select
+                  style="width: 180px"
+                  class="input_width_lg"
+                  clearable
+                  v-model="searchForm.roleId"
+                  placeholder="请选择"
+                >
+                  <el-option
+                    v-for="item in roleList4Search"
+                    :label="item.roleName"
+                    :value="item.roleId"
+                    :key="item.roleId"
+                  >
+                  </el-option>
+                </el-select>
+              </el-form-item>
+              <el-form-item label="登录名" class="pull-left">
+                <el-input
+                  style="width: 180px"
+                  class="input_width_lg"
+                  placeholder="请输入登录名"
+                  v-model="searchForm.loginName"
+                ></el-input>
+              </el-form-item>
+              <el-form-item label="姓名" class="pull-left">
+                <el-input
+                  style="width: 180px"
+                  class="input_width_lg"
+                  placeholder="请输入姓名"
+                  v-model="searchForm.name"
+                ></el-input>
+              </el-form-item>
+              <el-form-item class="pull-right">
+                <el-button
+                  size="small"
+                  type="primary"
+                  icon="search"
+                  @click="search"
+                  >查询</el-button
+                >
+                <el-button
+                  size="small"
+                  type="primary"
+                  icon="plus"
+                  @click="openAddingDialog"
+                  >新增
+                </el-button>
+              </el-form-item>
+            </el-row>
+          </el-form>
+
+          <!-- 添加用户信息弹出框 -->
+          <el-dialog title="用户信息" :visible.sync="addingDialog" size="small">
+            <el-form
+              :inline="true"
+              :model="userForm"
+              ref="addingForm"
+              :rules="rules"
+              label-position="right"
+            >
+              <el-row>
+                <el-form-item label="姓名" label-width="120px" prop="name">
+                  <el-input
+                    class="input_width_lg"
+                    v-model="userForm.name"
+                    auto-complete="off"
+                    placeholder="请输入姓名"
+                  ></el-input>
+                </el-form-item>
+              </el-row>
+              <el-row>
+                <el-form-item
+                  label="登录名"
+                  label-width="120px"
+                  prop="loginName"
+                >
+                  <el-input
+                    class="input_width_lg"
+                    v-model="userForm.loginName"
+                    auto-complete="off"
+                    placeholder="请输入登录名"
+                  ></el-input>
+                </el-form-item>
+              </el-row>
+              <el-row>
+                <el-form-item label="密码" label-width="120px" prop="password">
+                  <el-input
+                    class="input_width_lg"
+                    v-model="userForm.password"
+                    auto-complete="off"
+                    placeholder="请输入密码"
+                  ></el-input>
+                </el-form-item>
+              </el-row>
+              <el-row>
+                <el-form-item
+                  label="联系方式"
+                  label-width="120px"
+                  prop="mobile"
+                >
+                  <el-input
+                    class="input_width_lg"
+                    v-model="userForm.mobile"
+                    auto-complete="off"
+                    placeholder="请输入联系方式"
+                  ></el-input>
+                </el-form-item>
+              </el-row>
+              <el-row>
+                <el-form-item
+                  label="顶级机构"
+                  label-width="120px"
+                  prop="rootOrgId"
+                >
+                  <el-select
+                    class="select"
+                    v-model="userForm.rootOrgId"
+                    placeholder="请选择"
+                    :disabled="!isSuperAdmin"
+                    @change="rootOrgChanged4InsertOrUpdate"
+                  >
+                    <el-option
+                      v-for="item in rootOrgList"
+                      :label="item.name"
+                      :value="item.id"
+                      :key="item.id"
+                    >
+                    </el-option>
+                  </el-select>
+                </el-form-item>
+              </el-row>
+              <el-row>
+                <el-form-item label="角色" label-width="120px" prop="roleIds">
+                  <el-select
+                    class="select"
+                    multiple
+                    v-model="userForm.roleIds"
+                    placeholder="请选择"
+                    @change="rolesChanged"
+                  >
+                    <el-option
+                      v-for="item in roleList4InsertOrUpdateWithoutSuperAdmin"
+                      :label="item.roleName"
+                      :value="item.roleId"
+                      :key="item.roleId"
+                    >
+                    </el-option>
+                  </el-select>
+                </el-form-item>
+              </el-row>
+              <el-row>
+                <el-form-item label="子机构" label-width="120px" prop="orgId">
+                  <el-select
+                    class="select"
+                    :remote-method="getOrgList4InsertOrUpdate"
+                    :loading="orgLoading4InsertOrUpdate"
+                    remote
+                    filterable
+                    clearable
+                    v-model="userForm.orgId"
+                    placeholder="请选择"
+                  >
+                    <el-option
+                      v-for="item in orgList4InsertOrUpdate"
+                      :label="item.name"
+                      :value="item.id"
+                      :key="item.id"
+                    >
+                    </el-option>
+                  </el-select>
+                </el-form-item>
+              </el-row>
+              <el-row>
+                <el-form-item label="状态" label-width="120px">
+                  <el-radio-group class="pull_right_sm" v-model="enableStr">
+                    <el-radio label="true">启用</el-radio>
+                    <el-radio label="false">禁用</el-radio>
+                  </el-radio-group>
+                </el-form-item>
+              </el-row>
+              <el-row class="pull_center">
+                <el-button type="primary" @click="add">保 存</el-button>
+                <el-button @click="addingDialog = false;">取 消</el-button>
+              </el-row>
+            </el-form>
+          </el-dialog>
+
+          <!-- 修改用户信息弹出框 -->
+          <el-dialog title="用户信息" :visible.sync="updateDialog" size="small">
+            <el-form
+              :inline="true"
+              :model="userForm"
+              ref="updateForm"
+              :rules="rules"
+              label-position="right"
+            >
+              <el-row>
+                <el-form-item label="ID" label-width="120px">
+                  <el-input
+                    class="input_width_lg"
+                    v-model="userForm.id"
+                    :disabled="true"
+                  ></el-input>
+                </el-form-item>
+              </el-row>
+              <el-row>
+                <el-form-item label="姓名" label-width="120px" prop="name">
+                  <el-input
+                    class="input_width_lg"
+                    v-model="userForm.name"
+                    auto-complete="off"
+                    placeholder="请输入姓名"
+                  ></el-input>
+                </el-form-item>
+              </el-row>
+              <el-row>
+                <el-form-item
+                  label="登录名"
+                  label-width="120px"
+                  prop="loginName"
+                >
+                  <el-input
+                    class="input_width_lg"
+                    v-model="userForm.loginName"
+                    auto-complete="off"
+                    placeholder="请输入登录名"
+                  ></el-input>
+                </el-form-item>
+              </el-row>
+              <el-row>
+                <el-form-item
+                  label="联系方式"
+                  label-width="120px"
+                  prop="mobile"
+                >
+                  <el-input
+                    class="input_width_lg"
+                    v-model="userForm.mobile"
+                    auto-complete="off"
+                    placeholder="请输入联系方式"
+                  ></el-input>
+                </el-form-item>
+              </el-row>
+              <el-row>
+                <el-form-item
+                  label="顶级机构"
+                  label-width="120px"
+                  prop="rootOrgId"
+                >
+                  <el-select
+                    class="select"
+                    v-model="userForm.rootOrgId"
+                    placeholder="请选择"
+                    :disabled="true"
+                  >
+                    <el-option
+                      v-for="item in rootOrgList"
+                      :label="item.name"
+                      :value="item.id"
+                      :key="item.id"
+                    >
+                    </el-option>
+                  </el-select>
+                </el-form-item>
+              </el-row>
+              <el-row>
+                <el-form-item label="角色" label-width="120px" prop="roleIds">
+                  <el-select
+                    class="select"
+                    multiple
+                    v-model="userForm.roleIds"
+                    placeholder="请选择"
+                    :disabled="rowIsSuperAdmin"
+                    @change="rolesChanged"
+                  >
+                    <el-option
+                      v-for="item in roleList4InsertOrUpdate"
+                      :label="item.roleName"
+                      :disabled="item.roleCode == 'SUPER_ADMIN'"
+                      :value="item.roleId"
+                      :key="item.roleId"
+                    >
+                    </el-option>
+                  </el-select>
+                </el-form-item>
+              </el-row>
+              <el-row>
+                <el-form-item label="子机构" label-width="120px" prop="orgId">
+                  <el-select
+                    class="select"
+                    :remote-method="getOrgList4InsertOrUpdate"
+                    :loading="orgLoading4InsertOrUpdate"
+                    remote
+                    filterable
+                    clearable
+                    v-model="userForm.orgId"
+                    placeholder="请选择"
+                  >
+                    <el-option
+                      v-for="item in orgList4InsertOrUpdate"
+                      :label="item.name"
+                      :value="item.id"
+                      :key="item.id"
+                    >
+                    </el-option>
+                  </el-select>
+                </el-form-item>
+              </el-row>
+              <el-row>
+                <el-form-item label="状态" label-width="120px">
+                  <el-radio-group
+                    class="pull_right_sm"
+                    v-model="enableStr"
+                    :disabled="rowIsSuperAdmin"
+                  >
+                    <el-radio label="true">启用</el-radio>
+                    <el-radio label="false">禁用</el-radio>
+                  </el-radio-group>
+                </el-form-item>
+              </el-row>
+              <el-row class="pull_center">
+                <el-button type="primary" @click="update">保 存</el-button>
+                <el-button @click="updateDialog = false;">取 消</el-button>
+              </el-row>
+            </el-form>
+          </el-dialog>
+
+          <!-- 页面列表 -->
+          <el-table
+            :data="tableData"
+            border
+            style="width: 100%;text-align:center;"
+            @selection-change="selectChange"
+          >
+            <el-table-column type="selection" width="55"></el-table-column>
+            <el-table-column prop="id" width="100" label="ID">
+            </el-table-column>
+            <el-table-column prop="name" width="150" label="姓名">
+            </el-table-column>
+            <el-table-column prop="loginName" width="150" label="登录名">
+            </el-table-column>
+            <el-table-column prop="rootOrgName" width="150" label="顶级机构">
+            </el-table-column>
+            <el-table-column prop="roleNamesStr" width="250" label="角色">
+            </el-table-column>
+            <el-table-column prop="updateTime" width="180" label="更新时间">
+            </el-table-column>
+            <el-table-column width="80" label="状态">
+              <template slot-scope="scope">
+                <div>
+                  <span>
+                    <el-tag :type="getTag(scope.row.enable)">
+                      {{ getEnable(scope.row.enable) }}
+                    </el-tag>
+                  </span>
+                </div>
+              </template>
+            </el-table-column>
+            <el-table-column label="操作">
+              <template slot-scope="scope">
+                <div>
+                  <span>
+                    <el-button
+                      size="mini"
+                      type="primary"
+                      @click="openUpdateDialog(scope.row);"
+                    >
+                      <i class="el-icon-edit"></i> 修改
+                    </el-button>
+                  </span>
+                  <span>
+                    <el-button
+                      v-if="false"
+                      size="mini"
+                      type="danger"
+                      @click="deleteById(scope.row);"
+                    >
+                      <i class="el-icon-delete"></i> 删除
+                    </el-button>
+                  </span>
+                  <span>
+                    <el-button
+                      size="mini"
+                      type="info"
+                      @click="resetPass(scope.row);"
+                    >
+                      <i class="el-icon-reset"></i>重置密码
+                    </el-button>
+                  </span>
+                  <span v-if="!scope.row.enable">
+                    <el-button
+                      size="mini"
+                      type="success"
+                      @click="enableById(scope.row);"
+                    >
+                      <i class="fa fa-check" aria-hidden="true"></i>启用
+                    </el-button>
+                  </span>
+                  <span v-if="scope.row.enable">
+                    <el-button
+                      size="mini"
+                      type="warning"
+                      @click="disableById(scope.row);"
+                    >
+                      <i class="fa fa-close" aria-hidden="true"></i>禁用
+                    </el-button>
+                  </span>
+                </div>
+              </template>
+            </el-table-column>
+          </el-table>
+          <div class="page pull-right">
+            <el-pagination
+              @current-change="handleCurrentChange"
+              :current-page="currentPage"
+              :page-size="10"
+              layout="total, prev, pager, next, jumper"
+              :total="total"
+            >
+            </el-pagination>
+          </div>
+        </div>
+      </div>
+    </section>
+  </div>
+</template>
+
+<script>
+import { core_api } from "../constants/constants.js";
+import { mapState } from "vuex";
+
+export default {
+  data() {
+    var validateRootOrg = (rule, value, callback) => {
+      if (0 != value && !value) {
+        callback(new Error("请选择顶级机构"));
+      } else {
+        callback();
+      }
+    };
+    var validateRoles = (rule, value, callback) => {
+      if (value.length == 0) {
+        callback(new Error("请选择角色"));
+      } else {
+        callback();
+      }
+    };
+    return {
+      orgLoading4InsertOrUpdate: false,
+      isSuperAdmin: false,
+      roleList4Search: [],
+      roleList4InsertOrUpdate: [],
+      rootOrgList: [],
+      orgList4InsertOrUpdate: [],
+      searchForm: {
+        name: "",
+        loginName: "",
+        enable: true,
+        rootOrgId: null,
+        roleId: null
+      },
+      userForm: {
+        id: null,
+        name: "",
+        loginName: "",
+        password: "",
+        mobile: "",
+        enable: true,
+        rootOrgId: null,
+        orgId: null,
+        roleIds: []
+      },
+      enableStr: "true",
+
+      tempOrgList: [],
+      userId: "",
+      selectedUserIds: [],
+      tableData: [],
+      currentPage: 1,
+      pageSize: 10,
+      total: 10,
+      addingDialog: false,
+      updateDialog: false,
+      rowIsSuperAdmin: false,
+      rules: {
+        name: [
+          {
+            required: true,
+            message: "请输入姓名",
+            trigger: "blur"
+          }
+        ],
+        loginName: [
+          {
+            required: true,
+            message: "请输入登录名",
+            trigger: "blur"
+          }
+        ],
+        password: [
+          {
+            required: true,
+            message: "请输入密码",
+            trigger: "blur"
+          }
+        ],
+        mobile: [
+          {
+            message: "请输入联系方式",
+            trigger: "blur"
+          }
+        ],
+        rootOrgId: [
+          {
+            validator: validateRootOrg,
+            trigger: "blur,change"
+          }
+        ],
+        orgId: [],
+        roleIds: [
+          {
+            validator: validateRoles,
+            trigger: "blur,change"
+          }
+        ]
+      }
+    };
+  },
+  computed: {
+    ...mapState({
+      user: state => state.user
+    }),
+    userIds() {
+      var userIds = "";
+      for (let userId of this.selectedUserIds) {
+        if (!userIds) {
+          userIds += userId;
+        } else {
+          userIds += "," + userId;
+        }
+      }
+      return userIds;
+    },
+    roleList4InsertOrUpdateWithoutSuperAdmin() {
+      return this.roleList4InsertOrUpdate.filter(
+        item => item.roleCode != "SUPER_ADMIN"
+      );
+    }
+  },
+  methods: {
+    validateOrg(rule, value, callback) {
+      if (0 != value && !value) {
+        callback(new Error("请选择子机构"));
+      } else {
+        callback();
+      }
+    },
+    rolesChanged() {
+      var isLC = false;
+      for (let cur of this.roleList4InsertOrUpdate) {
+        if (
+          cur.roleCode == "LC_USER" &&
+          this.userForm.roleIds.contains(cur.roleId)
+        ) {
+          isLC = true;
+          break;
+        }
+      }
+      console.log("rolesChanged(); isLC:", isLC);
+      if (isLC) {
+        this.rules.orgId = [
+          {
+            validator: this.validateOrg,
+            trigger: "blur,change"
+          }
+        ];
+      } else {
+        this.rules.orgId = [];
+      }
+    },
+    rootOrgChanged4Search() {
+      var url =
+        core_api +
+        "/rolePrivilege/getRoles?includeSuperAdmin=" +
+        true +
+        "&rootOrgId=" +
+        this.searchForm.rootOrgId;
+      this.$http
+        .post(url)
+        .then(response => {
+          this.roleList4Search = response.data;
+        })
+        .catch(response => {
+          if (response.status == 500) {
+            this.$notify({
+              showClose: true,
+              message: response.data.desc,
+              type: "error"
+            });
+          }
+        });
+    },
+    rootOrgChanged4InsertOrUpdate() {
+      this.orgList4InsertOrUpdate = [];
+
+      var url =
+        core_api +
+        "/rolePrivilege/getRoles?includeSuperAdmin=" +
+        true +
+        "&rootOrgId=" +
+        this.userForm.rootOrgId;
+      this.$http
+        .post(url)
+        .then(response => {
+          this.roleList4InsertOrUpdate = response.data;
+          this.rolesChanged();
+        })
+        .catch(response => {
+          if (response.status == 500) {
+            this.$notify({
+              showClose: true,
+              message: response.data.desc,
+              type: "error"
+            });
+          }
+        });
+    },
+    getOrgList4InsertOrUpdate(query) {
+      this.orgLoading4InsertOrUpdate = true;
+      var url =
+        core_api +
+        "/org/query?" +
+        new URLSearchParams({
+          name: query,
+          rootOrgId: this.userForm.rootOrgId
+        });
+      this.$http
+        .get(url)
+        .then(response => {
+          this.orgList4InsertOrUpdate = response.data;
+          this.orgLoading4InsertOrUpdate = false;
+        })
+        .catch(response => {
+          if (response.status == 500) {
+            this.$notify({
+              showClose: true,
+              message: response.data.desc,
+              type: "error"
+            });
+          }
+          this.orgLoading4InsertOrUpdate = false;
+        });
+    },
+    getEnable(enable) {
+      if (enable == true) {
+        return "启用";
+      } else if (enable == false) {
+        return "禁用";
+      }
+      return enable;
+    },
+    getTag(status) {
+      if (status == true) {
+        return "success";
+      } else if (status == false) {
+        return "danger";
+      }
+      return status;
+    },
+    getLevel(level) {
+      if (level == "ZSB") {
+        return "专升本";
+      } else if (level == "GQZ") {
+        return "高起专";
+      }
+      return level;
+    },
+    search() {
+      this.loading = true;
+      var param = new URLSearchParams(this.searchForm);
+      var url =
+        core_api +
+        "/user/all/" +
+        this.currentPage +
+        "/" +
+        this.pageSize +
+        "?" +
+        param;
+      this.$http.get(url).then(response => {
+        console.log(response);
+        this.tableData = response.data.list;
+        this.total = response.data.total;
+        this.loading = false;
+      });
+    },
+    handleCurrentChange(val) {
+      this.currentPage = val;
+      this.search();
+    },
+    selectChange(row) {
+      this.selectedUserIds = [];
+      row.forEach(element => {
+        this.selectedUserIds.push(element.id);
+      });
+      console.log(this.selectedUserIds);
+    },
+    //新增
+    openAddingDialog() {
+      if (this.$refs.addingForm) {
+        this.$refs.addingForm.resetFields();
+      }
+      if (this.$refs.updateForm) {
+        this.$refs.updateForm.resetFields();
+      }
+      this.addingDialog = true;
+      this.userForm.name = "";
+      this.userForm.loginName = "";
+      this.userForm.password = "";
+      this.userForm.mobile = "";
+      this.userForm.roleIds = [];
+      this.userForm.orgId = null;
+      this.enableStr = "true";
+      this.orgList4InsertOrUpdate = [];
+      this.rolesChanged();
+    },
+    //修改
+    openUpdateDialog(row) {
+      if (this.$refs.updateForm) {
+        this.$refs.updateForm.resetFields();
+      }
+      if (this.$refs.addingForm) {
+        this.$refs.addingForm.resetFields();
+      }
+
+      this.updateDialog = true;
+      this.userForm.id = row.id;
+      this.userForm.roleIds = row.roleIds;
+      this.userForm.name = row.name;
+      this.userForm.loginName = row.loginName;
+      this.enableStr = row.enable ? "true" : "false";
+      this.userForm.mobile = row.mobile;
+      this.userForm.password = null;
+      this.userForm.rootOrgId = row.rootOrgId;
+      this.rowIsSuperAdmin = false;
+      for (let roleCode of row.roleCodes) {
+        if (roleCode == "SUPER_ADMIN") {
+          this.rowIsSuperAdmin = true;
+          break;
+        }
+      }
+
+      this.rootOrgChanged4InsertOrUpdate();
+      this.orgList4InsertOrUpdate = [{ id: row.orgId, name: row.orgName }];
+      this.userForm.orgId = row.orgId;
+    },
+    exportUser() {
+      var param = new URLSearchParams(this.searchForm);
+      window.open(core_api + "/user/export?" + param);
+    },
+    //保存
+    add() {
+      var url = core_api + "/user";
+      this.$refs.addingForm.validate(valid => {
+        if (valid) {
+          this.userForm.enable = this.enableStr == "true";
+          this.$http.post(url, this.userForm).then(
+            () => {
+              this.$notify({
+                type: "success",
+                message: "添加成功"
+              });
+              this.search();
+              this.addingDialog = false;
+            },
+            resp => {
+              this.$notify({
+                type: "error",
+                message: resp.body.desc
+              });
+            }
+          );
+        } else {
+          return false;
+        }
+      });
+    },
+    //保存
+    update() {
+      var url = core_api + "/user";
+      this.$refs.updateForm.validate(valid => {
+        if (valid) {
+          this.userForm.enable = this.enableStr == "true";
+          this.$http.put(url, this.userForm).then(
+            () => {
+              this.$notify({
+                type: "success",
+                message: "添加成功"
+              });
+              this.search();
+              this.updateDialog = false;
+            },
+            resp => {
+              this.$notify({
+                type: "error",
+                message: resp.body.desc
+              });
+            }
+          );
+        } else {
+          return false;
+        }
+      });
+    },
+    //重置密码
+    resetPass(row) {
+      this.$confirm("是否重置密码?", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        var url = core_api + "/user/resetPass/" + row.id;
+        this.$http
+          .put(url)
+          .then(() => {
+            this.$notify({
+              type: "success",
+              message: "重置成功!"
+            });
+            this.search();
+          })
+          .catch(response => {
+            if (response.status == 500) {
+              this.$notify({
+                showClose: true,
+                message: response.data.desc,
+                type: "error"
+              });
+            }
+          });
+      });
+    },
+    //删除单个数据
+    deleteById(row) {
+      this.$confirm("是否删除该用户?", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        var url = core_api + "/user/" + row.id;
+        this.$http
+          .delete(url)
+          .then(() => {
+            this.$notify({
+              type: "success",
+              message: "删除成功!"
+            });
+            this.search();
+          })
+          .catch(response => {
+            if (response.status == 500) {
+              this.$notify({
+                showClose: true,
+                message: response.data.desc,
+                type: "error"
+              });
+            }
+          });
+      });
+    },
+    //删除多条数据
+    deleteByIds() {
+      if (this.selectedUserIds.length === 0) {
+        this.$notify({
+          type: "warning",
+          message: "请选择要删除的用户"
+        });
+      } else {
+        this.$confirm("是否删除这些用户?", "提示", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "error"
+        }).then(() => {
+          var url = core_api + "/user/" + this.userIds;
+          this.$http
+            .delete(url)
+            .then(() => {
+              this.$notify({
+                type: "success",
+                message: "删除成功!"
+              });
+              this.search();
+            })
+            .catch(response => {
+              if (response.status == 500) {
+                this.$notify({
+                  showClose: true,
+                  message: response.data.desc,
+                  type: "error"
+                });
+              }
+            });
+        });
+      }
+    },
+    //启用
+    enableByIds() {
+      if (this.selectedUserIds.length === 0) {
+        this.$notify({
+          type: "warning",
+          message: "请选择要开启的用户"
+        });
+      } else {
+        this.$confirm("是否启用这些用户?", "提示", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(() => {
+          var url = core_api + "/user/enable/" + this.userIds;
+          this.$http
+            .put(url, {})
+            .then(() => {
+              this.$notify({
+                type: "success",
+                message: "开启成功!"
+              });
+              this.search();
+            })
+            .catch(response => {
+              if (response.status == 500) {
+                this.$notify({
+                  showClose: true,
+                  message: response.data.desc,
+                  type: "error"
+                });
+              }
+            });
+        });
+      }
+    },
+    enableById(row) {
+      this.$confirm("是否启用该用户?", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        var url = core_api + "/user/enable/" + row.id;
+        this.$http
+          .put(url, {})
+          .then(() => {
+            this.$notify({
+              type: "success",
+              message: "开启成功!"
+            });
+            this.search();
+          })
+          .catch(response => {
+            if (response.status == 500) {
+              this.$notify({
+                showClose: true,
+                message: response.data.desc,
+                type: "error"
+              });
+            }
+          });
+      });
+    },
+    //禁用
+    disableByIds() {
+      if (this.selectedUserIds.length === 0) {
+        this.$notify({
+          type: "warning",
+          message: "请选择要禁用的用户"
+        });
+      } else {
+        this.$confirm("是否禁用这些用户?", "提示", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "error"
+        }).then(() => {
+          var url = core_api + "/user/disable/" + this.userIds;
+          this.$http
+            .put(url, {})
+            .then(() => {
+              this.$notify({
+                type: "success",
+                message: "禁用成功!"
+              });
+              this.search();
+            })
+            .catch(response => {
+              if (response.status == 500) {
+                this.$notify({
+                  showClose: true,
+                  message: response.data.desc,
+                  type: "error"
+                });
+              }
+            });
+        });
+      }
+    },
+    //禁用
+    disableById(row) {
+      this.$confirm("是否禁用该用户?", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "error"
+      }).then(() => {
+        var url = core_api + "/user/disable/" + row.id;
+        this.$http
+          .put(url, {})
+          .then(() => {
+            this.$notify({
+              type: "success",
+              message: "禁用成功!"
+            });
+            this.search();
+          })
+          .catch(response => {
+            if (response.status == 500) {
+              this.$notify({
+                showClose: true,
+                message: response.data.desc,
+                type: "error"
+              });
+            }
+          });
+      });
+    },
+
+    /*初始化*/
+    init() {
+      for (let role of this.user.roleList) {
+        if (role.roleCode == "SUPER_ADMIN") {
+          this.isSuperAdmin = true;
+          break;
+        }
+      }
+
+      this.searchForm.rootOrgId = this.user.rootOrgId;
+      this.userForm.rootOrgId = this.user.rootOrgId;
+
+      var url1 = core_api + "/org/getRootOrgList";
+      var url2 =
+        core_api +
+        "/rolePrivilege/getRoles?includeSuperAdmin=" +
+        true +
+        "&rootOrgId=" +
+        this.user.rootOrgId;
+
+      Promise.all([this.$http.get(url1), this.$http.post(url2)]).then(
+        ([resp1, resp2]) => {
+          this.rootOrgList = resp1.data;
+          this.roleList4Search = resp2.data;
+          this.roleList4InsertOrUpdate = resp2.data;
+          this.search();
+        }
+      );
+    }
+  },
+  //初始化查询
+  created() {
+    this.init();
+  }
+};
+</script>
+
+<style scoped>
+.select {
+  width: 195px;
+}
+</style>

+ 0 - 0
src/modules/oe/.ignore


+ 8 - 1
src/router.js

@@ -1,6 +1,7 @@
 import Vue from "vue";
 import Router from "vue-router";
 import PortalRoutes from "./modules/portal/routes/routes";
+import BasicRoutes from "./modules/basic/routes/routes";
 import MarklRoutes from "./modules/marking/routes/routes";
 import QuestionsRoutes from "./modules/questions/routes/routes";
 import OeRoutes from "./modules/oe/routes/routes";
@@ -9,7 +10,13 @@ Vue.use(Router);
 
 let router = new Router({
   mode: "history",
-  routes: [...PortalRoutes, ...MarklRoutes, ...QuestionsRoutes, ...OeRoutes]
+  routes: [
+    ...PortalRoutes,
+    ...BasicRoutes,
+    ...MarklRoutes,
+    ...QuestionsRoutes,
+    ...OeRoutes
+  ]
 });
 
 // router.beforeEach((to, from, next) => {