Commit 21dfdeae42638efda117a313af013e4d57b39001

Authored by 梁保满
1 parent 03bce046

平台管理员

src/api/apis/apis.js
... ... @@ -1120,4 +1120,46 @@ export default {
1120 1120 data
1121 1121 });
1122 1122 },
  1123 +
  1124 + /** 平台管理 */
  1125 + //账户管理
  1126 + tenantPage(data) {
  1127 + return service({
  1128 + url: setUpUrls.tenantPage,
  1129 + method: "POST",
  1130 + data
  1131 + });
  1132 + },
  1133 + //修改账号
  1134 + updateTenant(data) {
  1135 + return service({
  1136 + url: setUpUrls.updateTenant,
  1137 + method: "POST",
  1138 + data
  1139 + });
  1140 + },
  1141 + //新增租户账号
  1142 + addTenant(data) {
  1143 + return service({
  1144 + url: setUpUrls.addTenant,
  1145 + method: "POST",
  1146 + data
  1147 + });
  1148 + },
  1149 + //授课端版本管理
  1150 + versionPage(data) {
  1151 + return service({
  1152 + url: setUpUrls.versionPage,
  1153 + method: "POST",
  1154 + data
  1155 + });
  1156 + },
  1157 + //新增授课端版本
  1158 + addVersion(data) {
  1159 + return service({
  1160 + url: setUpUrls.addVersion,
  1161 + method: "POST",
  1162 + data
  1163 + });
  1164 + },
1123 1165 };
... ...
src/router/permission.js
... ... @@ -34,6 +34,9 @@ router.beforeEach((to, from, next) => {
34 34 "portrait",
35 35 "dataSync",
36 36 "down",
  37 + "account",
  38 + "device",
  39 + "clientVersion"
37 40 ]);
38 41 //end
39 42  
... ...
src/store/index.js
... ... @@ -40,9 +40,9 @@ const store = new Vuex.Store({
40 40 },
41 41 setRouters: (state, routers) => {
42 42 let addrouterList = []
43   - if(state.info.showRole == 'ROLE_PINGTAI'){
  43 + if(state.info.showRole == 'ROLE_PERSONAL'){
44 44 addrouterList = [...addroutersPersonal]
45   - }else if(state.info.showRole == 'ROLE_ADMIN'){
  45 + }else if(state.info.showRole == 'ROLE_PINGTAI'){
46 46 addrouterList = [...addRoutersAdmin]
47 47 }else{
48 48 addrouterList = [...addrouters]
... ... @@ -80,33 +80,33 @@ const store = new Vuex.Store({
80 80 const userInfo = { ...response.data };
81 81 if (userInfo.permissions && userInfo.permissions.length) {
82 82 userInfo.showRoleName = response.data.permissions[0]?.roleName;
83   - // userInfo.showRole = response.data.permissions[0]?.role;
  83 + userInfo.showRole = response.data.permissions[0]?.role;
84 84 // 开发用,测试删除
85   - userInfo.showRole = "ROLE_PINGTAI";
  85 + // userInfo.showRole = "ROLE_PERSONAL";
86 86 commit("setToken", "isLogin");
87 87 commit("setInfo", { ...userInfo });
88   - // commit("setRouters", [
89   - // ...userInfo.permissions[0]?.authorityRouter,
90   - // ]);
  88 + commit("setRouters", [
  89 + ...userInfo.permissions[0]?.authorityRouter,
  90 + ]);
91 91 //start 开发用,测试删除
92   - commit("setRouters", [
93   - "setUpStudent",
94   - "examinationPaper",
95   - "examinationPaperAdd",
96   - "examinationPaperEdit",
97   - "examinationPaperRecycle",
98   - "ask",
99   - "askAnalysis",
100   - "test",
101   - "testAnalysis",
102   - "portrait",
103   - "dataSync",
104   - "down",
  92 + // commit("setRouters", [
  93 + // "setUpStudent",
  94 + // "examinationPaper",
  95 + // "examinationPaperAdd",
  96 + // "examinationPaperEdit",
  97 + // "examinationPaperRecycle",
  98 + // "ask",
  99 + // "askAnalysis",
  100 + // "test",
  101 + // "testAnalysis",
  102 + // "portrait",
  103 + // "dataSync",
  104 + // "down",
105 105  
106   - "account",
107   - "device",
108   - "clientVersion"
109   - ]);
  106 + // "account",
  107 + // "device",
  108 + // "clientVersion"
  109 + // ]);
110 110 //end
111 111  
112 112 state.addRouters.forEach((res) => {
... ...
src/views/admin/account/index.vue
1 1 <template>
2 2 <div>
3   - <back-box>
  3 + <back-box>
4 4 <template slot="title">
5 5 <span>账号管理</span>
6 6 </template>
  7 + <template slot="btns">
  8 + <el-tooltip effect="dark" content="添加账号" placement="bottom">
  9 + <el-button
  10 + type="primary"
  11 + icon="el-icon-plus"
  12 + size="mini"
  13 + plain
  14 + circle
  15 + @click="openAddDia"
  16 + ></el-button>
  17 + </el-tooltip>
  18 + </template>
7 19 </back-box>
8   - <div class="page-content">
9   - 功能开发中。
  20 + <div class="answer-header">
  21 + <div class="sel-box">
  22 + <el-select
  23 + class="sel"
  24 + v-model="query.versionType"
  25 + placeholder="选择账号类型"
  26 + @change="(page = 1), _QueryData()"
  27 + >
  28 + <el-option label="无" :value="0"></el-option>
  29 + <el-option label="标准版" :value="1"></el-option>
  30 + <el-option label="个人版" :value="2"></el-option>
  31 + <el-option label="定制版" :value="3"></el-option>
  32 + </el-select>
  33 + <el-select
  34 + class="sel"
  35 + v-model="query.available"
  36 + placeholder="选择账号状态"
  37 + @change="(page = 1), _QueryData()"
  38 + >
  39 + <el-option label="正常" :value="0"></el-option>
  40 + <el-option label="禁用" :value="1"></el-option>
  41 + </el-select>
  42 + <el-input
  43 + placeholder="请输入账号名称"
  44 + v-model="query.loginName"
  45 + class="input-with-select"
  46 + @keyup.enter.native="(page = 1), _QueryData()"
  47 + >
  48 + <el-button
  49 + slot="append"
  50 + icon="el-icon-search"
  51 + @click="(page = 1), _QueryData()"
  52 + ></el-button>
  53 + </el-input>
  54 + <el-button type="primary" round @click="(page = 1), _QueryData()"
  55 + >筛选</el-button
  56 + >
  57 + </div>
  58 + </div>
  59 + <div class="table-box">
  60 + <el-table
  61 + :data="tableData"
  62 + border
  63 + style="width: 100%"
  64 + v-loading="loading"
  65 + >
  66 + <el-table-column
  67 + prop="loginName"
  68 + label="账号"
  69 + align="center"
  70 + ></el-table-column>
  71 + <el-table-column
  72 + prop="realName"
  73 + label="姓名"
  74 + align="center"
  75 + ></el-table-column>
  76 + <el-table-column prop="versionType" label="账号类型" align="center">
  77 + <template slot-scope="scoped">{{
  78 + `${
  79 + scoped.row.versionType == 0
  80 + ? "无"
  81 + : scoped.row.versionType == 1
  82 + ? "标准版"
  83 + : scoped.row.versionType == 2
  84 + ? "个人版"
  85 + : "定制版"
  86 + }`
  87 + }}</template></el-table-column
  88 + >
  89 + <el-table-column
  90 + prop="tenantName"
  91 + label="学校名称"
  92 + align="center"
  93 + ></el-table-column>
  94 + <el-table-column prop="available" label="状态" align="center"
  95 + ><template slot-scope="scoped">{{
  96 + `${scoped.row.available == 0 ? "正常" : "禁用"}`
  97 + }}</template></el-table-column
  98 + >
  99 + <el-table-column
  100 + prop="createdTime"
  101 + label="创建时间"
  102 + align="center"
  103 + width="200"
  104 + ></el-table-column>
  105 + <el-table-column label="操作" align="center" width="160">
  106 + <template slot-scope="scoped">
  107 + <el-tooltip content="修改账号" placement="left">
  108 + <el-button
  109 + class="set-count"
  110 + type="primary"
  111 + circle
  112 + icon="el-icon-edit-outline"
  113 + size="mini"
  114 + @click="setCount(scoped.row)"
  115 + ></el-button>
  116 + </el-tooltip>
  117 + <el-dropdown
  118 + trigger="hover"
  119 + @command="handleDropdownClick($event, scoped.row)"
  120 + >
  121 + <el-button
  122 + type="info"
  123 + size="mini"
  124 + circle
  125 + icon="el-icon-more"
  126 + ></el-button>
  127 + <el-dropdown-menu slot="dropdown">
  128 + <el-dropdown-item :command="0">重置密码</el-dropdown-item>
  129 + <el-dropdown-item :command="1">{{
  130 + `${scoped.row.available == 0 ? "禁用" : "启用"}`
  131 + }}</el-dropdown-item>
  132 + <el-dropdown-item :command="2">删除</el-dropdown-item>
  133 + </el-dropdown-menu>
  134 + </el-dropdown>
  135 + </template>
  136 + </el-table-column>
  137 + </el-table>
  138 + <div class="pagination-box">
  139 + <el-pagination
  140 + layout="total,prev, pager, next"
  141 + :hide-on-single-page="true"
  142 + :total="total"
  143 + @current-change="changePage"
  144 + :current-page="page"
  145 + :page-size="size"
  146 + >
  147 + </el-pagination>
  148 + </div>
10 149 </div>
  150 + <el-dialog title="修改账号信息" :visible.sync="diaCount" width="400">
  151 + <el-form
  152 + class="form-box"
  153 + :model="formCount"
  154 + :rules="ruleCount"
  155 + ref="formCount"
  156 + label-width="160px"
  157 + >
  158 + <el-form-item label="账号:" prop="loginName">
  159 + <el-col :span="12">
  160 + <el-input
  161 + placeholder="请输入账号"
  162 + v-model.trim="formCount.loginName"
  163 + maxlength="30"
  164 + >
  165 + </el-input>
  166 + </el-col>
  167 + </el-form-item>
  168 + <el-form-item label="密码:" prop="password">
  169 + <el-col :span="12">
  170 + <el-input
  171 + placeholder="请输入密码"
  172 + v-model.trim="formCount.password"
  173 + maxlength="18"
  174 + >
  175 + </el-input>
  176 + </el-col>
  177 + </el-form-item>
  178 + <el-form-item label="联系人姓名:" prop="contactPerson">
  179 + <el-col :span="12">
  180 + <el-input
  181 + placeholder="请输入联系人姓名"
  182 + v-model.trim="formCount.contactPerson"
  183 + maxlength="12"
  184 + >
  185 + </el-input>
  186 + </el-col>
  187 + </el-form-item>
  188 + <el-form-item label="联系人手机号:" prop="contactPhone">
  189 + <el-col :span="12">
  190 + <el-input
  191 + placeholder="请输入联系人手机号"
  192 + v-model.trim="formCount.contactPhone"
  193 + type="number"
  194 + oninput="if(value.length > 11) value = value.slice(0,11)"
  195 + >
  196 + </el-input>
  197 + </el-col>
  198 + </el-form-item>
  199 + <el-form-item label="学校/集团名称:" prop="tenantName">
  200 + <el-col :span="12">
  201 + <el-input
  202 + placeholder="学校/集团名称"
  203 + v-model.trim="formCount.tenantName"
  204 + maxlength="30"
  205 + >
  206 + </el-input>
  207 + </el-col>
  208 + </el-form-item>
  209 + </el-form>
  210 + <div class="dialog-footer" slot="footer">
  211 + <el-button @click="saveCount">确 定</el-button>
  212 + <el-button @click="diaCount = false">取 消</el-button>
  213 + </div>
  214 + </el-dialog>
  215 + <el-dialog title="添加账号" :visible.sync="diaAdd" width="400">
  216 + <el-form
  217 + class="form-box"
  218 + :model="formAddCount"
  219 + :rules="ruleAddCount"
  220 + ref="formAddCount"
  221 + label-width="160px"
  222 + >
  223 + <el-form-item label="请输入账号:" prop="loginName">
  224 + <el-col :span="12">
  225 + <el-input
  226 + placeholder="请输入联系电话"
  227 + v-model.trim="formAddCount.loginName"
  228 + type="number"
  229 + oninput="if(value.length > 11) value = value.slice(0,11)"
  230 + >
  231 + </el-input>
  232 + </el-col>
  233 + </el-form-item>
  234 + <el-form-item label="选择账号类型:" prop="versionType">
  235 + <el-col :span="12">
  236 + <el-select
  237 + class="sel"
  238 + v-model="formAddCount.versionType"
  239 + placeholder="请选择账号类型"
  240 + >
  241 + <el-option label="无" :value="0"></el-option>
  242 + <el-option label="标准版" :value="1"></el-option>
  243 + <el-option label="个人版" :value="2"></el-option>
  244 + <el-option label="定制版" :value="3"></el-option>
  245 + </el-select>
  246 + </el-col>
  247 + </el-form-item>
  248 + <el-form-item label="联系人姓名:" prop="contactPerson">
  249 + <el-col :span="12">
  250 + <el-input
  251 + placeholder="请输入联系人姓名"
  252 + v-model.trim="formAddCount.contactPerson"
  253 + maxlength="12"
  254 + >
  255 + </el-input>
  256 + </el-col>
  257 + </el-form-item>
  258 + <el-form-item label="联系人手机号:" prop="contactPhone">
  259 + <el-col :span="12">
  260 + <el-input
  261 + placeholder="请输入联系人手机号"
  262 + v-model.trim="formAddCount.contactPhone"
  263 + type="number"
  264 + oninput="if(value.length > 11) value = value.slice(0,11)"
  265 + >
  266 + </el-input>
  267 + </el-col>
  268 + </el-form-item>
  269 + <el-form-item label="学校/集团名称:" prop="tenantName">
  270 + <el-col :span="12">
  271 + <el-input
  272 + placeholder="学校/集团名称"
  273 + v-model.trim="formAddCount.tenantName"
  274 + maxlength="30"
  275 + >
  276 + </el-input>
  277 + </el-col>
  278 + </el-form-item>
  279 + </el-form>
  280 + <div class="dialog-footer" slot="footer">
  281 + <el-button @click="saveAddCount">确 定</el-button>
  282 + <el-button @click="diaAdd = false">取 消</el-button>
  283 + </div>
  284 + </el-dialog>
11 285 </div>
12 286 </template>
13 287  
14 288 <script>
  289 +import { encryptLoginPassword } from "@/utils";
15 290 export default {
  291 + data() {
  292 + return {
  293 + diaAdd: false,
  294 + loading: false,
  295 + diaCount: false,
  296 + props: { multiple: true, checkStrictly: true },
  297 + query: {
  298 + type: "",
  299 + available: "",
  300 + loginName: "",
  301 + },
  302 + tableData: [],
  303 + total: 0,
  304 + page: 1,
  305 + size: 20,
  306 + formCount: {
  307 + loginName: "",
  308 + type: "",
  309 + tenantName: "",
  310 + contactPerson: "",
  311 + contactPhone: "",
  312 + },
  313 + ruleCount: {
  314 + loginName: [{ required: true, message: "请输入账号", trigger: "blur" }],
  315 + password: [{ required: true, message: "请输入密码", trigger: "blur" }],
  316 + contactPhone: [
  317 + { required: true, message: "请输入联系电话", trigger: "blur" },
  318 + ],
  319 + contactPerson: [
  320 + { required: true, message: "请输入联系人姓名", trigger: "blur" },
  321 + ],
  322 + },
  323 + formAddCount: {
  324 + loginName: "",
  325 + contactPhone: "",
  326 + contactPerson: "",
  327 + versionType: "",
  328 + tenantName: "",
  329 + },
  330 + ruleAddCount: {
  331 + loginName: [{ required: true, message: "请输入账号", trigger: "blur" }],
  332 + contactPhone: [
  333 + { required: true, message: "请输入联系电话", trigger: "blur" },
  334 + ],
  335 + contactPerson: [
  336 + { required: true, message: "请输入联系人姓名", trigger: "blur" },
  337 + ],
  338 + versionType: [
  339 + { required: true, message: "请选择租户类型", trigger: "blur" },
  340 + ],
  341 + },
  342 + };
  343 + },
  344 + created() {
  345 + // _QueryData();
  346 + },
  347 + methods: {
  348 + openAddDia() {
  349 + //添加账号
  350 + this.formAddCount.loginName = "";
  351 + this.formAddCount.contactPhone = "";
  352 + this.formAddCount.contactPerson = "";
  353 + this.formAddCount.tenantName = "";
  354 + this.formAddCount.versionType = 0;
  355 + this.diaAdd = true;
  356 + },
  357 + saveAddCount() {
  358 + //保存新增账号
  359 + this.$refs.formAddCount.validate(async (valid) => {
  360 + if (valid) {
  361 + let params = { ...this.formAddCount };
  362 + const { data, status, info } = await this.$request.addUser({
  363 + ...params,
  364 + });
  365 + if (status === 0) {
  366 + this.$message.success(info);
  367 + this._QueryData();
  368 + this.diaAdd = false;
  369 + } else {
  370 + this.$message.error(info);
  371 + }
  372 + } else {
  373 + this.$message.warning("输入有误请检查!");
  374 + return false;
  375 + }
  376 + });
  377 + },
  378 + setCount(obj) {
  379 + //修改账号
  380 + this.formCount = { ...obj };
  381 + this.diaCount = true;
  382 + },
  383 + handleDropdownClick(value, item) {
  384 + console.log(item);
  385 + //更多
  386 + if (value == 2) {
  387 + this.$confirm("确定要删除这条账号信息吗?", "提示", {
  388 + customClass: "del-model",
  389 + cancelButttonText: "取消",
  390 + confirmButtonText: "确定",
  391 + type: "warning",
  392 + }).then(() => {
  393 + this.updateUser(item, value);
  394 + });
  395 + } else {
  396 + this.updateUser(item, value);
  397 + }
  398 + },
  399 + changePage(page) {
  400 + this.page = page;
  401 + this._QueryData();
  402 + },
  403 + saveCount() {
  404 + //保存修改账号
  405 + this.$refs.formCount.validate(async (valid) => {
  406 + if (valid) {
  407 + let params = { ...this.formCount };
  408 + params.password = encryptLoginPassword(params.password);
  409 + const { data, status, info } = await this.$request.tenantUpdateUser({
  410 + type: 3,
  411 + ...params,
  412 + });
  413 + if (status === 0) {
  414 + this.$message.success(info);
  415 + this.diaCount = false;
  416 + this._QueryData();
  417 + } else {
  418 + this.$message.error(info);
  419 + }
  420 + } else {
  421 + this.$message.warning("输入有误请检查!");
  422 + return false;
  423 + }
  424 + });
  425 + },
  426 + async updateUser(obj, type) {
  427 + let query = {};
  428 + console.log(query);
  429 + if (type == 1) {
  430 + query.available = obj.available == 0 ? 1 : 0;
  431 + }
  432 + const { data, status, info } = await this.$request.tenantUpdateUser({
  433 + userId: obj.id,
  434 + type: type,
  435 + ...query,
  436 + });
  437 + if (status === 0) {
  438 + this.$message.success(info);
  439 + this._QueryData();
  440 + } else {
  441 + this.$message.error(info);
  442 + }
  443 + },
  444 + async _QueryData() {
  445 + let query = { ...this.query };
  446 + if (query.loginName) {
  447 + delete query.type;
  448 + delete query.available;
  449 + }
  450 + this.loading = true;
  451 + this.tableData = [];
  452 + const { data, status, info } = await this.$request.tenantPage({
  453 + ...query,
  454 + page: this.page,
  455 + size: this.size,
  456 + });
16 457  
17   -}
  458 + this.loading = false;
  459 + if (status === 0) {
  460 + this.tableData = data.list || [];
  461 + this.total = data.count;
  462 + } else {
  463 + this.$message.error(info);
  464 + }
  465 + },
  466 + },
  467 +};
18 468 </script>
19   -
20   -<style>
21   -
  469 +<style lang="scss">
  470 +.del-model {
  471 + .el-message-box__btns button:nth-child(1) {
  472 + color: #667ffd;
  473 + }
  474 +}
  475 +</style>
  476 +<style lang="scss" scoped>
  477 +.el-message-box .el-button--default {
  478 + color: red;
  479 +}
  480 +.set-count {
  481 + margin-right: 12px;
  482 +}
  483 +.table-box {
  484 + padding: 0 20px;
  485 +}
22 486 </style>
23 487 \ No newline at end of file
... ...
src/views/admin/clientVersion/components/upLoad.vue 0 → 100644
  1 +<template>
  2 + <div>
  3 + <slot name="down"></slot>
  4 + <div class="d1">
  5 + <el-upload
  6 + class="upload-demo"
  7 + ref="upload"
  8 + :action="url"
  9 + :multiple="false"
  10 + :data="{ ...query }"
  11 + :with-credentials="true"
  12 + :limit="1"
  13 + :on-change="change"
  14 + :on-success="upSuccess"
  15 + :on-error="upError"
  16 + >
  17 + <!-- accept="application/vnd.ms-excel" -->
  18 + <div class="upload-btn">
  19 + <el-button class="btn" size="mini" type="primary">选择文件</el-button>
  20 + </div>
  21 + </el-upload>
  22 + </div>
  23 + </div>
  24 +</template>
  25 +
  26 +<script>
  27 +export default {
  28 + name: "downUpData",
  29 + props: {
  30 + query: {
  31 + type: Object,
  32 + default: function () {
  33 + return {};
  34 + },
  35 + },
  36 + url: {
  37 + type: String,
  38 + default: "",
  39 + },
  40 + },
  41 + data() {
  42 + return {
  43 + file: null,
  44 + };
  45 + },
  46 + methods: {
  47 + async submitUpload() {
  48 + this.$refs.upload.submit();
  49 +
  50 + // const formData = new FormData()
  51 + // formData.append('id',this.componentId)
  52 + // formData.append('file',new File(this.file.raw))
  53 + // let {status,info} = await uploadExcel(formData);
  54 + // if(status===0){
  55 + // this.$message.success(info);
  56 + // this.$emit("upSuccess")
  57 + // } else {
  58 + // this.$message.error(info);
  59 + // }
  60 + },
  61 + upSuccess(res) {
  62 + if (res && res.status == 0) {
  63 + this.$message.success("上传成功");
  64 + this.$emit("upSuccess", res);
  65 + } else {
  66 + this.$message.error(res.info);
  67 + }
  68 + },
  69 + upError(res) {
  70 + if (res && res.status == 0) {
  71 + this.$message.error("上传失败");
  72 + } else {
  73 + this.$message.error(res.message);
  74 + }
  75 + },
  76 + change(file) {
  77 + this.file = file;
  78 + },
  79 + },
  80 +};
  81 +</script>
  82 +
  83 +<style lang="scss" scoped>
  84 +.btn {
  85 + border-radius: 8px;
  86 + font-weight: normal;
  87 +}
  88 +.upload-btn {
  89 + .el-icon-upload {
  90 + font-size: 48px;
  91 + margin-bottom: 6px;
  92 + color: #667ffd;
  93 + }
  94 +}
  95 +</style>
... ...
src/views/admin/clientVersion/components/upLoadImg.vue 0 → 100644
  1 +<template>
  2 + <div>
  3 + <slot name="down"></slot>
  4 + <el-upload
  5 + class="avatar-uploader"
  6 + ref="upload"
  7 + :action="url"
  8 + :multiple="false"
  9 + :data="{ ...query }"
  10 + :with-credentials="true"
  11 + :limit="1"
  12 + :on-success="upSuccess"
  13 + :on-error="upError"
  14 + >
  15 + <!-- accept="application/vnd.ms-excel" -->
  16 + <img v-if="imageUrl" :src="imageUrl" class="avatar" />
  17 + <i v-else class="el-icon-plus avatar-uploader-icon"></i>
  18 + </el-upload>
  19 + </div>
  20 +</template>
  21 +
  22 +<script>
  23 +export default {
  24 + name: "downUpData",
  25 + props: {
  26 + query: {
  27 + type: Object,
  28 + default: function () {
  29 + return {};
  30 + },
  31 + },
  32 + url: {
  33 + type: String,
  34 + default: "",
  35 + },
  36 + },
  37 + data() {
  38 + return {
  39 + file: null,
  40 + imageUrl: "",
  41 + };
  42 + },
  43 + methods: {
  44 + async submitUpload() {
  45 + this.$refs.upload.submit();
  46 +
  47 + // const formData = new FormData()
  48 + // formData.append('id',this.componentId)
  49 + // formData.append('file',new File(this.file.raw))
  50 + // let {status,info} = await uploadExcel(formData);
  51 + // if(status===0){
  52 + // this.$message.success(info);
  53 + // this.$emit("upSuccess")
  54 + // } else {
  55 + // this.$message.error(info);
  56 + // }
  57 + },
  58 + upSuccess(res, file) {
  59 + if (res && res.status == 0) {
  60 + this.imageUrl = URL.createObjectURL(file.raw);
  61 + this.$message.success("上传成功");
  62 + this.$emit("upSuccess", res);
  63 + } else {
  64 + this.$message.error(res.info);
  65 + }
  66 + },
  67 + upError(res) {
  68 + if (res && res.status == 0) {
  69 + this.$message.error("上传失败");
  70 + } else {
  71 + this.$message.error(res.message);
  72 + }
  73 + },
  74 + },
  75 +};
  76 +</script>
  77 +
  78 +<style>
  79 +.avatar-uploader {
  80 + line-height: 1;
  81 +}
  82 +.avatar-uploader .el-upload {
  83 + border: 1px dashed #d9d9d9;
  84 + border-radius: 6px;
  85 + cursor: pointer;
  86 + position: relative;
  87 + overflow: hidden;
  88 +}
  89 +.avatar-uploader .el-upload:hover {
  90 + border-color: #409eff;
  91 +}
  92 +.avatar-uploader .avatar-uploader-icon {
  93 + font-size: 24px;
  94 + color: #8c939d;
  95 + width: 80px;
  96 + height: 80px;
  97 + line-height: 80px;
  98 + text-align: center;
  99 +}
  100 +.avatar-uploader .avatar {
  101 + width: 80px;
  102 + height: 80px;
  103 + display: block;
  104 +}
  105 +</style>
... ...
src/views/admin/clientVersion/index.vue
1 1 <template>
2 2 <div>
3   - <back-box>
  3 + <back-box>
4 4 <template slot="title">
5 5 <span>授课端版本管理</span>
6 6 </template>
  7 + <template slot="btns">
  8 + <el-tooltip effect="dark" content="添加版本" placement="bottom">
  9 + <el-button
  10 + type="primary"
  11 + icon="el-icon-plus"
  12 + size="mini"
  13 + plain
  14 + circle
  15 + @click="openAddDia"
  16 + ></el-button>
  17 + </el-tooltip>
  18 + </template>
7 19 </back-box>
8   - <div class="page-content">
9   - 功能开发中。
  20 + <div class="table-box">
  21 + <el-table
  22 + :data="tableData"
  23 + border
  24 + style="width: 100%"
  25 + v-loading="loading"
  26 + >
  27 + <el-table-column
  28 + prop="md5"
  29 + label="MD5编码"
  30 + align="center"
  31 + ></el-table-column>
  32 + <el-table-column
  33 + prop="versionName"
  34 + label="版本名称"
  35 + align="center"
  36 + ></el-table-column>
  37 + <el-table-column
  38 + prop="versionNumber"
  39 + label="版本号"
  40 + align="center"
  41 + ></el-table-column>
  42 + <el-table-column
  43 + prop="createdTime"
  44 + label="上传时间"
  45 + align="center"
  46 + width="200"
  47 + ></el-table-column>
  48 + <el-table-column
  49 + prop="fileSize"
  50 + label="文件大小"
  51 + align="center"
  52 + ></el-table-column>
  53 + <el-table-column
  54 + prop="description"
  55 + label="更新描述"
  56 + align="center"
  57 + ></el-table-column>
  58 + <el-table-column label="操作" align="center" width="160">
  59 + <template slot-scope="scoped">
  60 + <el-popconfirm title="确定删除吗?" @confirm="remove(scoped.row)">
  61 + <span class="del" slot="reference">删除</span>
  62 + </el-popconfirm>
  63 + </template>
  64 + </el-table-column>
  65 + </el-table>
  66 + <div class="pagination-box">
  67 + <el-pagination
  68 + layout="total,prev, pager, next"
  69 + :hide-on-single-page="true"
  70 + :total="total"
  71 + @current-change="changePage"
  72 + :current-page="page"
  73 + :page-size="size"
  74 + >
  75 + </el-pagination>
  76 + </div>
10 77 </div>
  78 + <el-dialog title="添加账号" :visible.sync="diaAdd" width="400">
  79 + <el-form
  80 + class="form-box"
  81 + :model="formAdd"
  82 + :rules="ruleAdd"
  83 + ref="formAdd"
  84 + label-width="160px"
  85 + >
  86 + <el-form-item label="版本名称:" prop="versionName">
  87 + <el-col :span="12">
  88 + <el-input
  89 + placeholder="请输入版本名称"
  90 + v-model.trim="formAdd.versionName"
  91 + maxlength="30"
  92 + >
  93 + </el-input>
  94 + </el-col>
  95 + </el-form-item>
  96 + <el-form-item label="版本号:" prop="versionNumber">
  97 + <el-col :span="12">
  98 + <el-input
  99 + placeholder="请输入版本号"
  100 + v-model.trim="formAdd.versionNumber"
  101 + maxlength="30"
  102 + >
  103 + </el-input>
  104 + </el-col>
  105 + </el-form-item>
  106 + <el-form-item label="软件图标:" prop="logo">
  107 + <el-col :span="12">
  108 + <upLoadImg :url="url" @upSuccess="logoSuccess"/>
  109 + </el-col>
  110 + </el-form-item>
  111 + <el-form-item label="上传全量文件包:" prop="appfiles">
  112 + <el-col :span="12">
  113 + <upLoad :url="url" @upSuccess="appfilesSuccess"/>
  114 + </el-col>
  115 + </el-form-item>
  116 + <el-form-item label="上传增量文件包:" prop="addfiles">
  117 + <el-col :span="12">
  118 + <upLoad :url="url" @upSuccess="addfilesSuccess"/>
  119 + </el-col>
  120 + </el-form-item>
  121 + <el-form-item label="更新描述:" prop="description">
  122 + <el-col :span="12">
  123 + <el-input
  124 + type="textarea"
  125 + :rows="3"
  126 + v-model="formAdd.description"
  127 + placeholder="填写描述"
  128 + ></el-input>
  129 + </el-col>
  130 + </el-form-item>
  131 + </el-form>
  132 + <div class="dialog-footer" slot="footer">
  133 + <el-button @click="save">确 定</el-button>
  134 + <el-button @click="diaAdd = false">取 消</el-button>
  135 + </div>
  136 + </el-dialog>
11 137 </div>
12 138 </template>
13 139  
14 140 <script>
  141 +import upLoad from "./components/upLoad.vue"
  142 +import upLoadImg from "./components/upLoadImg.vue"
15 143 export default {
  144 + components:{
  145 + upLoad,
  146 + upLoadImg
  147 + },
  148 + data() {
  149 + return {
  150 + url: "/file/uploadApp",
  151 + loading: false,
  152 + diaAdd: false,
  153 + tableData: [
  154 + {
  155 + schoolName: "111",
  156 + },
  157 + ],
  158 + formAdd: {
  159 + versionName: "",
  160 + versionNumber: "",
  161 + appImage: "",
  162 + filePath: "",
  163 + incrementFilePath: "",
  164 + description: "",
  165 + },
  166 + ruleAdd: {
  167 + versionName: [
  168 + { required: true, message: "请输入版本名称", trigger: "blur" },
  169 + ],
  170 + versionNumber: [
  171 + { required: true, message: "请输入版本号", trigger: "blur" },
  172 + ],
  173 + appImage: [
  174 + { required: true, message: "请上传软件图标", trigger: "blur" },
  175 + ],
  176 + filePath: [
  177 + { required: true, message: "请上传全量文件包", trigger: "blur" },
  178 + ],
  179 + incrementFilePath: [
  180 + { required: true, message: "请上传增量文件包", trigger: "blur" },
  181 + ],
  182 + },
  183 + page: 1,
  184 + size: 20,
  185 + total: 0,
  186 + };
  187 + },
  188 + created() {
  189 + // this._QueryData();
  190 + },
  191 + methods: {
  192 + openAddDia() {
  193 + this.formAdd.versionName = "";
  194 + this.formAdd.versionNumber = "";
  195 + this.formAdd.appImage = "";
  196 + this.formAdd.filePath = "";
  197 + this.formAdd.incrementFilePath = "";
  198 + this.formAdd.description = "";
  199 + this.diaAdd = true;
  200 + },
  201 + changePage(page) {
  202 + this.page = page;
  203 + this._QueryData();
  204 + },
  205 + remove(obj) {},
  206 + logoSuccess(res){
  207 + this.formAdd.appImage = res.data;
  208 + },
  209 + appfilesSuccess(res){
  210 + this.formAdd.filePath = res.data;
  211 + },
  212 + addfilesSuccess(res){
  213 + this.formAdd.incrementFilePath = res.data;
  214 + },
  215 + save() {},
  216 + async _QueryData() {
  217 + this.loading = true;
  218 + this.tableData = [];
  219 + const { data, status, info } = await this.$request.versionPage({
  220 + page: this.page,
  221 + size: this.size,
  222 + });
16 223  
17   -}
  224 + this.loading = false;
  225 + if (status === 0) {
  226 + this.tableData = data.list || [];
  227 + this.total = data.count;
  228 + } else {
  229 + this.$message.error(info);
  230 + }
  231 + },
  232 + },
  233 +};
18 234 </script>
19 235  
20   -<style>
21   -
  236 +<style lang="scss" scoped>
  237 +.table-box {
  238 + padding: 20px;
  239 +}
  240 +.del {
  241 + font-size: 14px;
  242 + color: #666;
  243 + cursor: pointer;
  244 +}
22 245 </style>
23 246 \ No newline at end of file
... ...
src/views/admin/device/index.vue
... ... @@ -10,7 +10,6 @@
10 10 <el-radio-group v-model="type">
11 11 <el-radio-button :label="1">基站管理</el-radio-button>
12 12 <el-radio-button :label="2">答题器管理</el-radio-button>
13   - <el-radio-button :label="3">授课端管理</el-radio-button>
14 13 </el-radio-group>
15 14 </div>
16 15 <div class="content">
... ... @@ -24,32 +23,20 @@
24 23 <pie-chart
25 24 id="pieChart"
26 25 :params="chartData"
27   - @clickPieChart="clickPieChart"
28 26 ></pie-chart>
29 27 </div>
30 28 </div>
31 29 <div class="table-box">
32 30 <div class="answer-header">
33 31 <div class="sel-box">
34   - <el-cascader
35   - size="small"
36   - class="sel sel2"
37   - clearable
38   - placeholder="选择班级"
39   - v-model="query.classId"
40   - :options="gradeList"
41   - :props="props"
42   - collapse-tags
43   - :show-all-levels="false"
44   - ></el-cascader>
45 32 <el-select
46 33 class="sel"
47   - v-model="query.onlineStatus"
48   - placeholder="选择状态"
  34 + v-model="query.school"
  35 + placeholder="选择学校"
49 36 @change="_QueryData(true)"
50 37 >
51 38 <el-option
52   - v-for="item in statusList"
  39 + v-for="item in schoolList"
53 40 :key="item.value"
54 41 :label="item.label"
55 42 :value="item.value"
... ... @@ -57,7 +44,7 @@
57 44 </el-option>
58 45 </el-select>
59 46 <el-input
60   - placeholder="请输入设备编码"
  47 + placeholder="请输入租户"
61 48 v-model="query.sn"
62 49 class="input-with-select"
63 50 @keyup.enter.native="_QueryData(true)"
... ... @@ -147,32 +134,20 @@
147 134 <scatter-chart
148 135 id="scatterChart"
149 136 :params="chartData2"
150   - @clickScatterChart="clickScatterChart"
151 137 ></scatter-chart>
152 138 </div>
153 139 </div>
154 140 <div class="table-box">
155 141 <div class="answer-header">
156 142 <div class="sel-box">
157   - <el-cascader
158   - size="small"
159   - class="sel sel2"
160   - clearable
161   - placeholder="选择班级"
162   - v-model="query.classId"
163   - :options="gradeList"
164   - :props="props"
165   - collapse-tags
166   - :show-all-levels="false"
167   - ></el-cascader>
168   - <el-select
  143 + <el-select
169 144 class="sel"
170   - v-model="query.type"
171   - placeholder="选择状态"
  145 + v-model="query.school"
  146 + placeholder="选择学校"
172 147 @change="_QueryData(true)"
173 148 >
174 149 <el-option
175   - v-for="item in typeList"
  150 + v-for="item in schoolList"
176 151 :key="item.value"
177 152 :label="item.label"
178 153 :value="item.value"
... ... @@ -180,7 +155,7 @@
180 155 </el-option>
181 156 </el-select>
182 157 <el-input
183   - placeholder="请输入设备编码"
  158 + placeholder="请输入租户"
184 159 v-model="query.sn"
185 160 class="input-with-select"
186 161 @keyup.enter.native="_QueryData(true)"
... ... @@ -303,36 +278,12 @@ export default {
303 278 return {
304 279 code: "",
305 280 loading: false,
306   - gradeList: [],
307   - gradeListAll: [],
308   - schoolAll: [],
309   - school: {}, //校园账号所属学校信息
310   - props: {
311   - multiple: true,
312   - checkStrictly: true,
313   - },
  281 + schoolList: [],
314 282 type: 1,
315 283 query: {
316   - classId: [],
317   - onlineStatus: "",
318   - sn: "",
319   - type: "",
  284 + school: [],
  285 + zuhu: "",
320 286 },
321   - statusList: [
322   - { label: "全部", value: "" },
323   - { label: "离线", value: 0 },
324   - { label: "在线", value: 1 },
325   - { label: "异常", value: 2 },
326   - ],
327   - typeList: [
328   - { label: "全部", value: 0 },
329   - { label: "1日内", value: 1 },
330   - { label: "3日内", value: 2 },
331   - { label: "7日内", value: 3 },
332   - { label: "1月内", value: 4 },
333   - { label: "3月内", value: 5 },
334   - { label: "3月以上", value: 6 },
335   - ],
336 287 tableData: [],
337 288 total: 0,
338 289 count: 0,
... ... @@ -344,37 +295,8 @@ export default {
344 295 },
345 296 created() {
346 297 this.code = localStorage.getItem("csCode") || "";
347   -
348   - (this.props.lazy = true),
349   - (this.props.lazyLoad = function (node, resolve) {
350   - const { level } = node;
351   - if (level == 2) {
352   - console.log(node);
353   - api
354   - .tenantClassList({
355   - schoolId: node.data.value,
356   - })
357   - .then((res) => {
358   - let children = formatGradeNameClass(res.data?.list).sort(
359   - (a, b) => {
360   - return a.grade - b.grade;
361   - }
362   - );
363   - console.log();
364   -
365   - const nodes = [...children];
366   - // 通过调用resolve将子节点数据返回,通知组件数据加载完成
367   - resolve(nodes);
368   - });
369   - } else {
370   - resolve(node);
371   - }
372   - });
373   -
374   - this.stationReport();
375   - this._QueryGradeList();
376   - this._QueryData();
377   - this.showSchool();
  298 + // this.stationReport();
  299 + // this._QueryData();
378 300 },
379 301 activated() {
380 302 const that = this;
... ... @@ -383,16 +305,13 @@ export default {
383 305 that.page = 1;
384 306 that.total = 0;
385 307 that.count = 0;
386   - that.query.classId = [];
387   - that.query.onlineStatus = "";
388   - that.query.sn = "";
389   - that.query.type = "";
390   - that.stationReport();
391   - that._QueryData();
  308 + that.query.school = "";
  309 + that.query.zuhu = "";
  310 + // that.stationReport();
  311 + // that._QueryData();
392 312 });
393 313 },
394 314 methods: {
395   -
396 315 linkTo(obj, type) {
397 316 this.$router.push({
398 317 path: "/deviceLog",
... ... @@ -402,87 +321,10 @@ export default {
402 321 },
403 322 });
404 323 },
405   - clickPieChart(obj) {
406   - this.query.onlineStatus =
407   - obj.name == "在线" ? 1 : obj.name == "离线" ? 0 : 2;
408   - this.query.sn = "";
409   - this.query.classId = [];
410   - this.page = 1;
411   - this._QueryData(false);
412   - },
413   - clickScatterChart(obj) {
414   - this.query.type =
415   - obj.name == "1日内"
416   - ? 1
417   - : obj.name == "3日内"
418   - ? 2
419   - : obj.name == "7日内"
420   - ? 3
421   - : obj.name == "1月内"
422   - ? 4
423   - : obj.name == "3月内"
424   - ? 5
425   - : 6;
426   - this.query.sn = "";
427   - this.query.classId = [];
428   - this.page = 1;
429   - this._QueryData(false);
430   - },
431 324 changePage(page) {
432 325 this.page = page;
433 326 this._QueryData(false);
434 327 },
435   -
436   - async showSchool() {
437   - const { data, status, info } = await this.$request.schoolList();
438   - if (status === 0) {
439   - let gradeListAll = data.list?.map((item) => {
440   - return {
441   - value: item.id,
442   - label: item.schoolName,
443   - };
444   - });
445   - this.schoolAll = [
446   - {
447   - value: 0,
448   - label: "全部",
449   - children: [...gradeListAll],
450   - },
451   - ];
452   - this.gradeList = [...this.schoolAll, ...this.gradeList];
453   - } else {
454   - this.$message.error(info);
455   - }
456   - },
457   -
458   -
459   - // 查找班级
460   - async _QueryGradeList() {
461   - this.loading = true;
462   - const { data, status, info } = await this.$request.gradeList();
463   - if (status === 0) {
464   - if (!!data.list) {
465   - this.gradeList =
466   - data.list?.map((item) => {
467   - let gradeList = {
468   - value: item.id,
469   - label: item.regionName,
470   - };
471   - gradeList.children =
472   - item.schoolList?.map((items) => {
473   - return {
474   - value: items.id,
475   - label: items.schoolName,
476   - };
477   - }) || [];
478   - return gradeList;
479   - }) || [];
480   - this.gradeList = [...this.schoolAll, ...this.gradeList];
481   - }
482   - } else {
483   - this.$message.error(info);
484   - }
485   - },
486 328 // 基站统计数据
487 329 async stationReport() {
488 330 const { data, status, info } = await this.$request.stationReport();
... ... @@ -595,13 +437,16 @@ export default {
595 437 // 设备列表信息
596 438 async _QueryData(isRef) {
597 439 this.loading = true;
598   - let query = this.setQuery();
  440 + let query = {...this.query};
  441 + if(query.zuhu){
  442 + delete query.school
  443 + }
599 444 if (isRef) {
600 445 this.page = 1;
601 446 }
602 447 this.loading = true;
603 448 this.tableData = [];
604   - const { data, status, info } = await this.$request.deviceList({
  449 + const { data, status, info } = await this.$request.pDeviceList({
605 450 ...query,
606 451 deviceType: this.type,
607 452 page: this.page,
... ... @@ -646,7 +491,6 @@ export default {
646 491 }
647 492 .content {
648 493 background: #f8f8f8;
649   - border: 1px solid #e2e2e2;
650 494 border-radius: 10px;
651 495 overflow: hidden;
652 496 :deep(.fa-edit) {
... ...
src/views/admin/device/log.vue
... ... @@ -267,7 +267,7 @@ export default {
267 267 this._QueryData();
268 268 },
269 269 async _QueryDetail() {
270   - const { data, status, info } = await this.$request.deviceDetail({
  270 + const { data, status, info } = await this.$request.pDeviceDetail({
271 271 deviceId: this.id,
272 272 });
273 273 if (status === 0) {
... ...
src/views/index/mainIndex.vue
... ... @@ -158,7 +158,7 @@
158 158 </li>
159 159 </template>
160 160 </ul>
161   - <ul class="nav-list" v-if="type == 'ROLE_PINGTAI'">
  161 + <ul class="nav-list" v-if="type == 'ROLE_PERSONAL'">
162 162 <li class="nav-item item1" @click="links('/examinationPaper')">
163 163 <img class="icon" src="../../assets/nav/setUpAccount.png" alt="" />
164 164 <div class="text">
... ... @@ -225,7 +225,7 @@
225 225 </li>
226 226  
227 227 </ul>
228   - <ul class="nav-list" v-if="type == 'ROLE_ADMIN'">
  228 + <ul class="nav-list" v-if="type == 'ROLE_PINGTAI'">
229 229 <li class="nav-item item1" @click="links('/account')">
230 230 <img class="icon" src="../../assets/nav/setUpAccount.png" alt="" />
231 231 <div class="text">
... ... @@ -279,7 +279,6 @@ export default {
279 279 },
280 280 _Init(val) {
281 281 this.type = this.$store.getters.info.showRole || this.$store.getters.info.permissions[0].role;
282   - this.type = 'ROLE_PINGTAI'
283 282 this.navList = this.$store.getters.addRouters.map((item) => {
284 283 return {
285 284 name: item.name,
... ... @@ -296,7 +295,7 @@ export default {
296 295 this.tenantIndex();
297 296 } else if (this.type == "ROLE_BANZHUREN") {
298 297 this.classIndex();
299   - } else if (this.type == "ROLE_PINGTAI") {
  298 + } else if (this.type == "ROLE_PERSONAL") {
300 299 this.personalIndex();
301 300 }
302 301 },
... ...
src/views/layout/header/header.vue
... ... @@ -9,7 +9,7 @@
9 9 <!-- <li>
10 10 <langSelect></langSelect>
11 11 </li> -->
12   - <li class="dropdown-box" v-if="role != 'ROLE_PINGTAI'">
  12 + <li class="dropdown-box" v-if="role != 'ROLE_PERSONAL'&&role != 'ROLE_PINGTAI'">
13 13 <div class="userInfo">
14 14 <img :src="avatar" />
15 15 <div class="txt">
... ... @@ -34,7 +34,16 @@
34 34 </el-dropdown-menu>
35 35 </el-dropdown>
36 36 </li>
37   - <li class="dropdown-box" v-else @click="linkToUserInfo">
  37 + <li class="dropdown-box" v-if="role == 'ROLE_PINGTAI'">
  38 + <div class="userInfo">
  39 + <img :src="avatar" />
  40 + <div class="txt">
  41 + <p>{{ `${this.$store.getters.info.name}` }}</p>
  42 + <p>管理员</p>
  43 + </div>
  44 + </div>
  45 + </li>
  46 + <li class="dropdown-box" v-if="role == 'ROLE_PERSONAL'" @click="linkToUserInfo">
38 47 <div class="userInfo">
39 48 <img :src="avatar" />
40 49 <div class="txt">
... ...
src/views/personal/examinationPaper/add.vue
... ... @@ -572,7 +572,6 @@
572 572 questionForm.questionType == 2 ||
573 573 questionForm.questionType == 6
574 574 "
575   - class="answer-box"
576 575 >
577 576 <template v-for="(option, opIdx) in rightOptions">
578 577 <span
... ...
src/views/standard/examinationPaper/add.vue
... ... @@ -570,7 +570,6 @@
570 570 questionForm.questionType == 2 ||
571 571 questionForm.questionType == 6
572 572 "
573   - class="answer-box"
574 573 >
575 574 <template v-for="(option, opIdx) in rightOptions">
576 575 <span
... ... @@ -792,7 +791,7 @@
792 791 >,</span
793 792 >
794 793 </template>
795   - <template v-if="formAns.qusType == 2" class="answer-box">
  794 + <template v-if="formAns.qusType == 2">
796 795 <span
797 796 class="answer-s active"
798 797 v-for="option in formAns.answerOptions.split(',')"
... ...
src/views/standard/examinationPaper/edit.vue
... ... @@ -301,7 +301,7 @@
301 301 >,</span
302 302 >
303 303 </template>
304   - <template v-if="formAns.qusType == 2" class="answer-box">
  304 + <template v-if="formAns.qusType == 2">
305 305 <span
306 306 class="answer-s active"
307 307 v-for="option in formAns.answerOptions.split(',')"
... ...