Commit 13b58a42000676c072cf9711491b5e6230dcb345
1 parent
65f592b6
备题组卷部分前端页面基本完成
Showing
19 changed files
with
2390 additions
and
738 deletions
router
| @@ -136,13 +136,13 @@ | @@ -136,13 +136,13 @@ | ||
| 136 | { | 136 | { |
| 137 | path: "/", | 137 | path: "/", |
| 138 | iconCls: "fa fa-cog", | 138 | iconCls: "fa fa-cog", |
| 139 | - name: '学校管理', | 139 | + name: '学校设置', |
| 140 | component: Layout, | 140 | component: Layout, |
| 141 | children: [ | 141 | children: [ |
| 142 | { | 142 | { |
| 143 | path: "/setUpSchool", | 143 | path: "/setUpSchool", |
| 144 | iconCls: "fa fa-calculator", | 144 | iconCls: "fa fa-calculator", |
| 145 | - name: '学校管理', | 145 | + name: '学校设置', |
| 146 | component: SetUpSchool, | 146 | component: SetUpSchool, |
| 147 | children: [] | 147 | children: [] |
| 148 | }, | 148 | }, |
| @@ -220,14 +220,14 @@ | @@ -220,14 +220,14 @@ | ||
| 220 | { | 220 | { |
| 221 | path: "/down", | 221 | path: "/down", |
| 222 | iconCls: "fa fa-download", // 图标样式class | 222 | iconCls: "fa fa-download", // 图标样式class |
| 223 | - name: "", | 223 | + name: "发卡软件", |
| 224 | component: Down, | 224 | component: Down, |
| 225 | children: [] | 225 | children: [] |
| 226 | }, | 226 | }, |
| 227 | { | 227 | { |
| 228 | path: "/downClient", | 228 | path: "/downClient", |
| 229 | iconCls: "", // 图标样式class | 229 | iconCls: "", // 图标样式class |
| 230 | - name: "", | 230 | + name: "授课端软件", |
| 231 | component: DownClient, | 231 | component: DownClient, |
| 232 | children: [] | 232 | children: [] |
| 233 | } | 233 | } |
src/api/apis/answerSheet.js
| @@ -11,7 +11,7 @@ export default { | @@ -11,7 +11,7 @@ export default { | ||
| 11 | data | 11 | data |
| 12 | }) | 12 | }) |
| 13 | }, | 13 | }, |
| 14 | - // 答题卡列表 | 14 | + // 测验类型 |
| 15 | fetchTypeNames(data) { | 15 | fetchTypeNames(data) { |
| 16 | return axios({ | 16 | return axios({ |
| 17 | url: answerSheet.typeNames, | 17 | url: answerSheet.typeNames, |
| @@ -19,7 +19,7 @@ export default { | @@ -19,7 +19,7 @@ export default { | ||
| 19 | data | 19 | data |
| 20 | }) | 20 | }) |
| 21 | }, | 21 | }, |
| 22 | - // 答题卡列表 | 22 | + // 班级列表 |
| 23 | fetchClassList(data) { | 23 | fetchClassList(data) { |
| 24 | return axios({ | 24 | return axios({ |
| 25 | url: answerSheet.classList, | 25 | url: answerSheet.classList, |
| @@ -27,7 +27,7 @@ export default { | @@ -27,7 +27,7 @@ export default { | ||
| 27 | data | 27 | data |
| 28 | }) | 28 | }) |
| 29 | }, | 29 | }, |
| 30 | - // 答题卡列表 | 30 | + // 科目列表 |
| 31 | fetchSubjectList(data) { | 31 | fetchSubjectList(data) { |
| 32 | return axios({ | 32 | return axios({ |
| 33 | url: answerSheet.subjectList, | 33 | url: answerSheet.subjectList, |
| @@ -35,5 +35,53 @@ export default { | @@ -35,5 +35,53 @@ export default { | ||
| 35 | data | 35 | data |
| 36 | }) | 36 | }) |
| 37 | }, | 37 | }, |
| 38 | + // 年级列表 | ||
| 39 | + fetchGradeList(data) { | ||
| 40 | + return axios({ | ||
| 41 | + url: answerSheet.gradeList, | ||
| 42 | + method: 'POST', | ||
| 43 | + data | ||
| 44 | + }) | ||
| 45 | + }, | ||
| 46 | + // 添加测验类型 | ||
| 47 | + addAnswerTypeName(data) { | ||
| 48 | + return axios({ | ||
| 49 | + url: answerSheet.addAnswerTypeName, | ||
| 50 | + method: 'POST', | ||
| 51 | + data | ||
| 52 | + }) | ||
| 53 | + }, | ||
| 54 | + // 保存答题卡 | ||
| 55 | + saveAnswerSheet(data) { | ||
| 56 | + return axios({ | ||
| 57 | + url: answerSheet.saveAnswerSheet, | ||
| 58 | + method: 'POST', | ||
| 59 | + data | ||
| 60 | + }) | ||
| 61 | + }, | ||
| 62 | + // 删除答题卡 | ||
| 63 | + removeAnswerSheet(data) { | ||
| 64 | + return axios({ | ||
| 65 | + url: answerSheet.removeAnswerSheet, | ||
| 66 | + method: 'POST', | ||
| 67 | + data | ||
| 68 | + }) | ||
| 69 | + }, | ||
| 70 | + // 恢复答题卡 | ||
| 71 | + useAnswerSheet(data) { | ||
| 72 | + return axios({ | ||
| 73 | + url: answerSheet.useAnswerSheet, | ||
| 74 | + method: 'POST', | ||
| 75 | + data | ||
| 76 | + }) | ||
| 77 | + }, | ||
| 78 | + // 恢复答题卡 | ||
| 79 | + updateAnswerSheet(data) { | ||
| 80 | + return axios({ | ||
| 81 | + url: answerSheet.updateAnswerSheet, | ||
| 82 | + method: 'POST', | ||
| 83 | + data | ||
| 84 | + }) | ||
| 85 | + }, | ||
| 38 | } | 86 | } |
| 39 | 87 |
src/api/apis/login.js
| @@ -4,7 +4,11 @@ import loginUrls from "../urls/login" | @@ -4,7 +4,11 @@ import loginUrls from "../urls/login" | ||
| 4 | 4 | ||
| 5 | export default { | 5 | export default { |
| 6 | // 账号密码登陆 | 6 | // 账号密码登陆 |
| 7 | - fetchLogin (data) { | ||
| 8 | - return axios.post(loginUrls.login, data) | ||
| 9 | - } | 7 | + fetchLogin(data) { |
| 8 | + return axios({ | ||
| 9 | + url: loginUrls.login, | ||
| 10 | + method: 'POST', | ||
| 11 | + data | ||
| 12 | + }) | ||
| 13 | + }, | ||
| 10 | } | 14 | } |
src/api/axios.js
| @@ -2,10 +2,12 @@ import axios from "axios" | @@ -2,10 +2,12 @@ import axios from "axios" | ||
| 2 | import Cookies from "js-cookie" | 2 | import Cookies from "js-cookie" |
| 3 | import NProgress from "nprogress" | 3 | import NProgress from "nprogress" |
| 4 | import { Message } from "element-ui" | 4 | import { Message } from "element-ui" |
| 5 | -import config from "../config/index"; // 路径配置 | 5 | +import router from "@/router/index" |
| 6 | +import store from "@/store" | ||
| 7 | +import conf from "../config/index"; // 路径配置 | ||
| 6 | // axios默认配置 | 8 | // axios默认配置 |
| 7 | axios.defaults.timeout = 1000000000 // 超时时间 | 9 | axios.defaults.timeout = 1000000000 // 超时时间 |
| 8 | -axios.defaults.baseURL = config.baseURL | 10 | +axios.defaults.baseURL = conf.baseURL |
| 9 | 11 | ||
| 10 | // http request 拦截器 | 12 | // http request 拦截器 |
| 11 | axios.interceptors.request.use(config => { | 13 | axios.interceptors.request.use(config => { |
| @@ -27,38 +29,62 @@ axios.interceptors.request.use(config => { | @@ -27,38 +29,62 @@ axios.interceptors.request.use(config => { | ||
| 27 | // http response 拦截器 | 29 | // http response 拦截器 |
| 28 | axios.interceptors.response.use( | 30 | axios.interceptors.response.use( |
| 29 | response => { | 31 | response => { |
| 32 | + const res = respones.data; | ||
| 30 | NProgress.done() | 33 | NProgress.done() |
| 31 | if (respones.config.cancelToken) { | 34 | if (respones.config.cancelToken) { |
| 32 | store.commit('delTokenSources', respones.config.cancelToken) | 35 | store.commit('delTokenSources', respones.config.cancelToken) |
| 33 | } | 36 | } |
| 34 | - if (response.data.code === 11000) { | 37 | + if (respones.status == 200) { |
| 35 | Cookies.set("access_token", response.data.message, { expires: 1 / 12 }) | 38 | Cookies.set("access_token", response.data.message, { expires: 1 / 12 }) |
| 36 | - return Promise.resolve() | ||
| 37 | - } else if (response.data.code === 10000) { // 约定报错信息 | ||
| 38 | - Message({ | ||
| 39 | - message: response.data.message, | ||
| 40 | - type: "warning" | ||
| 41 | - }) | ||
| 42 | - return Promise.reject(response) | ||
| 43 | - } else { | ||
| 44 | - return Promise.resolve(response) | 39 | + // console.log(respones.status) |
| 40 | + if (res.code == 999) { | ||
| 41 | + if (!location.href.includes('localhost')) { | ||
| 42 | + if (res.data) { | ||
| 43 | + window.location.href = res.data | ||
| 44 | + } else { | ||
| 45 | + router.push({ path: '/login' }) | ||
| 46 | + if (res.message.includes('不存在')) { | ||
| 47 | + Message({ | ||
| 48 | + message: res.message, | ||
| 49 | + type: 'error', | ||
| 50 | + duration: 3 * 1000 | ||
| 51 | + }) | ||
| 52 | + } | ||
| 53 | + } | ||
| 54 | + } | ||
| 55 | + return | ||
| 56 | + } else { | ||
| 57 | + Cookies.set("access_token", response.data.message, { expires: 1 / 12 }) | ||
| 58 | + } | ||
| 45 | } | 59 | } |
| 60 | + return Promise.resolve(response) | ||
| 46 | }, | 61 | }, |
| 47 | error => { | 62 | error => { |
| 48 | - if (error.response.status === 404) { | 63 | + Message({ |
| 64 | + message: error.message, | ||
| 65 | + type: 'error', | ||
| 66 | + duration: 3 * 1000 | ||
| 67 | + }) | ||
| 68 | + if (error.response == undefined) { | ||
| 69 | + return Promise.reject(error); | ||
| 70 | + } | ||
| 71 | + Message.closeAll() | ||
| 72 | + const { | ||
| 73 | + status | ||
| 74 | + } = error.response | ||
| 75 | + if (status === 403 || status === 401) { | ||
| 49 | Message({ | 76 | Message({ |
| 50 | - message: "请求地址出错", | ||
| 51 | - type: "warning" | 77 | + message: "未登录或登录超时,即将跳转到登录页面", |
| 78 | + type: 'error', | ||
| 79 | + duration: 3 * 1000 | ||
| 52 | }) | 80 | }) |
| 53 | - } else if (error.response.status === 401) { | ||
| 54 | - Message({ | ||
| 55 | - message: error.response.data.message, | ||
| 56 | - type: "warning" | 81 | + router.push({ |
| 82 | + path: '/login', | ||
| 83 | + query: { | ||
| 84 | + url: window.location.href | ||
| 85 | + } | ||
| 57 | }) | 86 | }) |
| 58 | - Cookies.remove("access_token") | ||
| 59 | - setTimeout(() => { | ||
| 60 | - location.reload() | ||
| 61 | - }, 3000) | 87 | + return |
| 62 | } | 88 | } |
| 63 | return Promise.reject(error.response) // 返回接口返回的错误信息 | 89 | return Promise.reject(error.response) // 返回接口返回的错误信息 |
| 64 | }) | 90 | }) |
src/api/urls/answerSheet.js
| 1 | export default { | 1 | export default { |
| 2 | // 答题卡列表 | 2 | // 答题卡列表 |
| 3 | answerList: "/apis/answerList", | 3 | answerList: "/apis/answerList", |
| 4 | - // 答题卡类型 | 4 | + // 测验类型 |
| 5 | typeNames: "/apis/typeNames", | 5 | typeNames: "/apis/typeNames", |
| 6 | + // 查找年级 | ||
| 7 | + gradeList: "/apis/gradeList", | ||
| 6 | // 查找班级 | 8 | // 查找班级 |
| 7 | classList: "/apis/classList", | 9 | classList: "/apis/classList", |
| 8 | // 查找科目 | 10 | // 查找科目 |
| 9 | subjectList: "/apis/subjectList", | 11 | subjectList: "/apis/subjectList", |
| 12 | + // 天假答题卡测验类型 | ||
| 13 | + addAnswerTypeName: "/apis/addAnswerTypeName", | ||
| 14 | + // 保存答题卡 | ||
| 15 | + saveAnswerSheet: "/apis/saveAnswerSheet", | ||
| 16 | + // 删除答题卡 | ||
| 17 | + removeAnswerSheet: "/apis/removeAnswerSheet", | ||
| 18 | + // 恢复使用答题卡 | ||
| 19 | + useAnswerSheet: "/apis/useAnswerSheet", | ||
| 20 | + // 更新答题卡 | ||
| 21 | + updateAnswerSheet: "/apis/updateAnswerSheet", | ||
| 10 | } | 22 | } |
| 11 | \ No newline at end of file | 23 | \ No newline at end of file |
src/assets/css/base.css
| @@ -21,18 +21,25 @@ a { | @@ -21,18 +21,25 @@ a { | ||
| 21 | } | 21 | } |
| 22 | 22 | ||
| 23 | /* element-style */ | 23 | /* element-style */ |
| 24 | -.el-button--default{ | 24 | +.el-button--default { |
| 25 | color: #667ffd; | 25 | color: #667ffd; |
| 26 | border-color: #667ffd; | 26 | border-color: #667ffd; |
| 27 | } | 27 | } |
| 28 | + | ||
| 28 | .el-button--primary { | 29 | .el-button--primary { |
| 29 | background-color: #667ffd; | 30 | background-color: #667ffd; |
| 30 | border-color: #667ffd; | 31 | border-color: #667ffd; |
| 31 | } | 32 | } |
| 32 | -.el-radio__input.is-checked+.el-radio__label{ | 33 | + |
| 34 | +.el-radio__input.is-checked+.el-radio__label { | ||
| 33 | color: #667ffd; | 35 | color: #667ffd; |
| 34 | } | 36 | } |
| 35 | -.el-radio__input.is-checked .el-radio__inner{ | 37 | + |
| 38 | +.el-radio__input.is-checked .el-radio__inner { | ||
| 36 | border-color: #667ffd; | 39 | border-color: #667ffd; |
| 37 | - background: #667ffd; | ||
| 38 | -} | ||
| 39 | \ No newline at end of file | 40 | \ No newline at end of file |
| 41 | + background: #667ffd; | ||
| 42 | +} | ||
| 43 | + | ||
| 44 | +.el-message-box .el-button--default { | ||
| 45 | + color: #fff | ||
| 46 | +} |
src/assets/css/index.scss
0 → 100644
| 1 | +.answer-header { | ||
| 2 | + padding: 16px 40px 12px 20px; | ||
| 3 | + display: flex; | ||
| 4 | + justify-content: space-between; | ||
| 5 | + align-items: center; | ||
| 6 | + .btn-box { | ||
| 7 | + display: flex; | ||
| 8 | + } | ||
| 9 | + .sel-box { | ||
| 10 | + display: flex; | ||
| 11 | + align-items: center; | ||
| 12 | + flex-wrap: nowrap; | ||
| 13 | + .sel { | ||
| 14 | + width: 8%; | ||
| 15 | + min-width: 90px; | ||
| 16 | + margin-right: 20px; | ||
| 17 | + } | ||
| 18 | + .el-input__inner{ | ||
| 19 | + border-radius: 20px; | ||
| 20 | + border: 1px solid #e2e2e2; | ||
| 21 | + height: 36px; | ||
| 22 | + line-height: 34px; | ||
| 23 | + } | ||
| 24 | + .el-input__icon { | ||
| 25 | + line-height: 34px; | ||
| 26 | + } | ||
| 27 | + .el-date-editor.el-input, | ||
| 28 | + .el-date-editor.el-input__inner { | ||
| 29 | + width: 200px; | ||
| 30 | + } | ||
| 31 | + .input-with-select { | ||
| 32 | + width: 200px; | ||
| 33 | + height: 36px; | ||
| 34 | + margin-right: 50px; | ||
| 35 | + border-radius: 20px; | ||
| 36 | + border: 1px solid #e2e2e2; | ||
| 37 | + box-sizing: border-box; | ||
| 38 | + .el-input__inner { | ||
| 39 | + border-radius: 20px; | ||
| 40 | + border: none; | ||
| 41 | + height: 34px; | ||
| 42 | + line-height: 34px; | ||
| 43 | + } | ||
| 44 | + .el-input-group__append, .el-input-group__prepend { | ||
| 45 | + border: none; | ||
| 46 | + background: transparent; | ||
| 47 | + } | ||
| 48 | + } | ||
| 49 | + .d1 { | ||
| 50 | + margin-left: 30px; | ||
| 51 | + } | ||
| 52 | + .p1 { | ||
| 53 | + flex: 1; | ||
| 54 | + .s1 { | ||
| 55 | + margin-left: 36px; | ||
| 56 | + cursor: pointer; | ||
| 57 | + color: #7f7f7f; | ||
| 58 | + &:hover { | ||
| 59 | + color: #409eff; | ||
| 60 | + } | ||
| 61 | + &.active { | ||
| 62 | + color: #667ffd; | ||
| 63 | + } | ||
| 64 | + } | ||
| 65 | + } | ||
| 66 | +} | ||
| 67 | +} | ||
| 0 | \ No newline at end of file | 68 | \ No newline at end of file |
src/main.js
| @@ -18,6 +18,7 @@ import "element-ui/lib/theme-chalk/index.css" | @@ -18,6 +18,7 @@ import "element-ui/lib/theme-chalk/index.css" | ||
| 18 | import "font-awesome/css/font-awesome.css" | 18 | import "font-awesome/css/font-awesome.css" |
| 19 | import "@/router/permission" | 19 | import "@/router/permission" |
| 20 | import "@/assets/css/base.css" | 20 | import "@/assets/css/base.css" |
| 21 | +import "@/assets/css/index.scss" | ||
| 21 | 22 | ||
| 22 | Vue.config.productionTip = false | 23 | Vue.config.productionTip = false |
| 23 | Vue.use(ElementUI) | 24 | Vue.use(ElementUI) |
src/router/index.js
| @@ -5,8 +5,29 @@ import Login from "@/views/login/index" | @@ -5,8 +5,29 @@ import Login from "@/views/login/index" | ||
| 5 | import Layout from "@/views/layout/layout" | 5 | import Layout from "@/views/layout/layout" |
| 6 | import HomeMain from "@/views/index/mainIndex" | 6 | import HomeMain from "@/views/index/mainIndex" |
| 7 | 7 | ||
| 8 | + | ||
| 8 | // 不是必须加载的组件使用懒加载 | 9 | // 不是必须加载的组件使用懒加载 |
| 9 | const NotFound = () => import("@/views/page404") | 10 | const NotFound = () => import("@/views/page404") |
| 11 | +const ExaminationPaper = () => import("@/views/examinationPaper/index") | ||
| 12 | +const ExaminationPaperAdd = () => import("@/views/examinationPaper/add") | ||
| 13 | +const ExaminationPaperEdit = () => import("@/views/examinationPaper/edit") | ||
| 14 | +const ExaminationPaperRecycle = () => import("@/views/examinationPaper/recycle") | ||
| 15 | +const Ask = () => import("@/views/ask/index") | ||
| 16 | +const AskAnalysis = () => import("@/views/ask/analysis") | ||
| 17 | +const Test = () => import("@/views/test/index") | ||
| 18 | +const TestAnalysis = () => import("@/views/test/analysis") | ||
| 19 | +const DataSync = () => import("@/views/dataSync/index") | ||
| 20 | +const Portrait = () => import("@/views/portrait/index") | ||
| 21 | +const Card = () => import("@/views/card/index") | ||
| 22 | +const Analysis = () => import("@/views/analysis/index") | ||
| 23 | +const Device = () => import("@/views/device/index") | ||
| 24 | +const Down = () => import("@/views/down/index") | ||
| 25 | +const DownClient = () => import("@/views/down/client") | ||
| 26 | +const SetUpAccount = () => import("@/views/setUp/account") | ||
| 27 | +const SetUpConglomerate = () => import("@/views/setUp/conglomerate") | ||
| 28 | +const SetUpSchool = () => import("@/views/setUp/school") | ||
| 29 | +const SetUpStudent = () => import("@/views/setUp/student") | ||
| 30 | +const SetUpTeacher = () => import("@/views/setUp/teacher") | ||
| 10 | 31 | ||
| 11 | /** | 32 | /** |
| 12 | * 重写路由的push方法 | 33 | * 重写路由的push方法 |
| @@ -55,7 +76,266 @@ let defaultRouter = [ | @@ -55,7 +76,266 @@ let defaultRouter = [ | ||
| 55 | } | 76 | } |
| 56 | ] | 77 | ] |
| 57 | 78 | ||
| 79 | +let addrouters = [ //测试用,后续后端获取 | ||
| 80 | + { | ||
| 81 | + path: "/examinationPaper", | ||
| 82 | + iconCls: "fa fa-file-text", // 图标样式class | ||
| 83 | + name: "备题组卷", | ||
| 84 | + component: Layout, | ||
| 85 | + alone: true, | ||
| 86 | + children: [ | ||
| 87 | + { | ||
| 88 | + path: "/examinationPaper", | ||
| 89 | + iconCls: "fa fa-file-text", // 图标样式class | ||
| 90 | + name: "", | ||
| 91 | + component: ExaminationPaper, | ||
| 92 | + children: [] | ||
| 93 | + }, | ||
| 94 | + { | ||
| 95 | + path: "/examinationPaperAdd", | ||
| 96 | + iconCls: "", // 图标样式class | ||
| 97 | + name: "添加答题卡", | ||
| 98 | + component: ExaminationPaperAdd, | ||
| 99 | + children: [] | ||
| 100 | + }, | ||
| 101 | + { | ||
| 102 | + path: "/examinationPaperEdit", | ||
| 103 | + iconCls: "", // 图标样式class | ||
| 104 | + name: "修改答题卡", | ||
| 105 | + component: ExaminationPaperEdit, | ||
| 106 | + children: [] | ||
| 107 | + }, | ||
| 108 | + { | ||
| 109 | + path: "/examinationPaperRecycle", | ||
| 110 | + iconCls: "", // 图标样式class | ||
| 111 | + name: "已归档答题卡", | ||
| 112 | + component: ExaminationPaperRecycle, | ||
| 113 | + children: [] | ||
| 114 | + }, | ||
| 115 | + ] | ||
| 116 | + }, | ||
| 117 | + { | ||
| 118 | + path: "/ask", | ||
| 119 | + iconCls: "fa fa-bar-chart", // 图标样式class | ||
| 120 | + name: "随堂问报表", | ||
| 121 | + component: Layout, | ||
| 122 | + alone: true, | ||
| 123 | + children: [ | ||
| 124 | + { | ||
| 125 | + path: "/ask", | ||
| 126 | + iconCls: "fa fa-bar-chart", // 图标样式class | ||
| 127 | + name: "", | ||
| 128 | + component: Ask, | ||
| 129 | + children: [] | ||
| 130 | + | ||
| 131 | + }, | ||
| 132 | + { | ||
| 133 | + path: "/askAnalysis", | ||
| 134 | + iconCls: "", // 图标样式class | ||
| 135 | + name: "随堂问报表分析", | ||
| 136 | + component: AskAnalysis, | ||
| 137 | + children: [] | ||
| 138 | + } | ||
| 139 | + ] | ||
| 140 | + }, | ||
| 141 | + { | ||
| 142 | + path: "/test", | ||
| 143 | + iconCls: "fa fa-pie-chart", // 图标样式class | ||
| 144 | + name: "即时测报表", | ||
| 145 | + component: Layout, | ||
| 146 | + alone: true, | ||
| 147 | + children: [ | ||
| 148 | + { | ||
| 149 | + path: "/test", | ||
| 150 | + iconCls: "fa fa-pie-chart", // 图标样式class | ||
| 151 | + name: "", | ||
| 152 | + component: Test, | ||
| 153 | + children: [] | ||
| 154 | + }, | ||
| 155 | + { | ||
| 156 | + path: "/testAnalysis", | ||
| 157 | + iconCls: "", // 图标样式class | ||
| 158 | + name: "即时测报表分析", | ||
| 159 | + component: TestAnalysis, | ||
| 160 | + children: [] | ||
| 161 | + } | ||
| 162 | + | ||
| 163 | + ] | ||
| 164 | + }, | ||
| 165 | + { | ||
| 166 | + path: "/portrait", | ||
| 167 | + iconCls: "fa fa-users", // 图标样式class | ||
| 168 | + name: "学生画像", | ||
| 169 | + component: Layout, | ||
| 170 | + alone: true, | ||
| 171 | + children: [ | ||
| 172 | + { | ||
| 173 | + path: "/portrait", | ||
| 174 | + iconCls: "fa fa-users", // 图标样式class | ||
| 175 | + name: "", | ||
| 176 | + component: Portrait, | ||
| 177 | + children: [] | ||
| 178 | + } | ||
| 179 | + ] | ||
| 180 | + }, | ||
| 181 | + | ||
| 182 | + { | ||
| 183 | + path: "/setUpConglomerate", | ||
| 184 | + iconCls: "fa fa-building", // 图标样式class | ||
| 185 | + name: "学校管理", | ||
| 186 | + component: Layout, | ||
| 187 | + alone: true, | ||
| 188 | + children: [ | ||
| 189 | + { | ||
| 190 | + path: "/setUpConglomerate", | ||
| 191 | + iconCls: "fa fa-building", | ||
| 192 | + name: '集团管理', | ||
| 193 | + component: SetUpConglomerate, | ||
| 194 | + children: [] | ||
| 195 | + }, | ||
| 196 | + ] | ||
| 197 | + }, | ||
| 198 | + { | ||
| 199 | + path: "/setUpAccount", | ||
| 200 | + iconCls: "fa fa-id-card-o", // 图标样式class | ||
| 201 | + name: "账号管理", | ||
| 202 | + component: Layout, | ||
| 203 | + alone: true, | ||
| 204 | + children: [ | ||
| 205 | + { | ||
| 206 | + path: "/setUpAccount", | ||
| 207 | + iconCls: "fa fa-id-card-o", | ||
| 208 | + name: '', | ||
| 209 | + component: SetUpAccount, | ||
| 210 | + children: [] | ||
| 211 | + }, | ||
| 212 | + ] | ||
| 213 | + }, | ||
| 214 | + { | ||
| 215 | + path: "/", | ||
| 216 | + iconCls: "fa fa-cog", | ||
| 217 | + name: '学校设置', | ||
| 218 | + component: Layout, | ||
| 219 | + children: [ | ||
| 220 | + { | ||
| 221 | + path: "/setUpSchool", | ||
| 222 | + iconCls: "fa fa-calculator", | ||
| 223 | + name: '学校设置', | ||
| 224 | + component: SetUpSchool, | ||
| 225 | + children: [] | ||
| 226 | + }, | ||
| 227 | + { | ||
| 228 | + path: "/setUpTeacher", | ||
| 229 | + iconCls: "fa fa-male", | ||
| 230 | + name: '教师管理', | ||
| 231 | + component: SetUpTeacher, | ||
| 232 | + children: [] | ||
| 233 | + }, | ||
| 234 | + { | ||
| 235 | + path: "/setUpStudent", | ||
| 236 | + iconCls: "fa fa-mortar-board", | ||
| 237 | + name: '学生管理', | ||
| 238 | + component: SetUpStudent, | ||
| 239 | + children: [] | ||
| 240 | + }, | ||
| 241 | + ] | ||
| 242 | + }, | ||
| 243 | + { | ||
| 244 | + path: "/card", | ||
| 245 | + iconCls: "fa fa-id-card", // 图标样式class | ||
| 246 | + name: "发卡记录", | ||
| 247 | + component: Layout, | ||
| 248 | + alone: true, | ||
| 249 | + children: [ | ||
| 250 | + { | ||
| 251 | + path: "/card", | ||
| 252 | + iconCls: "fa fa-id-card", // 图标样式class | ||
| 253 | + name: "", | ||
| 254 | + component: Card, | ||
| 255 | + children: [] | ||
| 256 | + } | ||
| 257 | + ] | ||
| 258 | + }, | ||
| 259 | + { | ||
| 260 | + path: "/device", | ||
| 261 | + iconCls: "fa fa-dashboard", // 图标样式class | ||
| 262 | + name: "设备状态", | ||
| 263 | + component: Layout, | ||
| 264 | + alone: true, | ||
| 265 | + children: [ | ||
| 266 | + { | ||
| 267 | + path: "/device", | ||
| 268 | + iconCls: "fa fa-dashboard", // 图标样式class | ||
| 269 | + name: "", | ||
| 270 | + component: Device, | ||
| 271 | + children: [] | ||
| 272 | + } | ||
| 273 | + ] | ||
| 274 | + }, | ||
| 275 | + { | ||
| 276 | + path: "/analysis", | ||
| 277 | + iconCls: "fa fa-area-chart", // 图标样式class | ||
| 278 | + name: "使用分析", | ||
| 279 | + component: Layout, | ||
| 280 | + alone: true, | ||
| 281 | + children: [ | ||
| 282 | + { | ||
| 283 | + path: "/analysis", | ||
| 284 | + iconCls: "fa fa-area-chart", // 图标样式class | ||
| 285 | + name: "", | ||
| 286 | + component: Analysis, | ||
| 287 | + children: [] | ||
| 288 | + } | ||
| 289 | + ] | ||
| 290 | + }, | ||
| 291 | + { | ||
| 292 | + path: "/down", | ||
| 293 | + iconCls: "fa fa-download", // 图标样式class | ||
| 294 | + name: "软件下载", | ||
| 295 | + component: Layout, | ||
| 296 | + alone: true, | ||
| 297 | + children: [ | ||
| 298 | + { | ||
| 299 | + path: "/down", | ||
| 300 | + iconCls: "fa fa-download", // 图标样式class | ||
| 301 | + name: "发卡软件", | ||
| 302 | + component: Down, | ||
| 303 | + children: [] | ||
| 304 | + }, | ||
| 305 | + { | ||
| 306 | + path: "/downClient", | ||
| 307 | + iconCls: "", // 图标样式class | ||
| 308 | + name: "授课端软件", | ||
| 309 | + component: DownClient, | ||
| 310 | + children: [] | ||
| 311 | + } | ||
| 312 | + ] | ||
| 313 | + }, | ||
| 314 | + { | ||
| 315 | + path: "/dataSync", | ||
| 316 | + iconCls: "fa fa-random", // 图标样式class | ||
| 317 | + name: "数据同步", | ||
| 318 | + component: Layout, | ||
| 319 | + alone: true, | ||
| 320 | + children: [ | ||
| 321 | + { | ||
| 322 | + path: "/dataSync", | ||
| 323 | + iconCls: "fa fa-random", // 图标样式class | ||
| 324 | + name: "", | ||
| 325 | + component: DataSync, | ||
| 326 | + children: [] | ||
| 327 | + } | ||
| 328 | + ] | ||
| 329 | + }, | ||
| 330 | + { | ||
| 331 | + path: "*", | ||
| 332 | + redirect: "/404", | ||
| 333 | + hidden: true, | ||
| 334 | + children: [] | ||
| 335 | + } | ||
| 336 | +] | ||
| 337 | + | ||
| 58 | export default new Router({ | 338 | export default new Router({ |
| 59 | routes: defaultRouter | 339 | routes: defaultRouter |
| 60 | }) | 340 | }) |
| 61 | -export {defaultRouter} | 341 | +export {defaultRouter,addrouters} |
src/router/permission.js
| 1 | import NProgress from "nprogress" | 1 | import NProgress from "nprogress" |
| 2 | -import en from "../i18n/lang/en" | ||
| 3 | -import Layout from "@/views/layout/layout" | ||
| 4 | -import CommerViews from "@/views/commerViews" | ||
| 5 | import router from "./index" | 2 | import router from "./index" |
| 6 | import store from "../store" | 3 | import store from "../store" |
| 7 | -// let routeName = en.routeName | ||
| 8 | - | ||
| 9 | -const ExaminationPaper = () => import("@/views/examinationPaper/index") | ||
| 10 | -const ExaminationPaperAdd = () => import("@/views/examinationPaper/add") | ||
| 11 | -const ExaminationPaperEdit = () => import("@/views/examinationPaper/edit") | ||
| 12 | -const ExaminationPaperRecycle = () => import("@/views/examinationPaper/recycle") | ||
| 13 | -const Ask = () => import("@/views/ask/index") | ||
| 14 | -const AskAnalysis = () => import("@/views/ask/analysis") | ||
| 15 | -const Test = () => import("@/views/test/index") | ||
| 16 | -const TestAnalysis = () => import("@/views/test/analysis") | ||
| 17 | -const DataSync = () => import("@/views/dataSync/index") | ||
| 18 | -const Portrait = () => import("@/views/portrait/index") | ||
| 19 | -const Card = () => import("@/views/card/index") | ||
| 20 | -const Analysis = () => import("@/views/analysis/index") | ||
| 21 | -const Device = () => import("@/views/device/index") | ||
| 22 | -const Down = () => import("@/views/down/index") | ||
| 23 | -const DownClient = () => import("@/views/down/client") | ||
| 24 | -const SetUpAccount = () => import("@/views/setUp/account") | ||
| 25 | -const SetUpConglomerate = () => import("@/views/setUp/conglomerate") | ||
| 26 | -const SetUpSchool = () => import("@/views/setUp/school") | ||
| 27 | -const SetUpStudent = () => import("@/views/setUp/student") | ||
| 28 | -const SetUpTeacher = () => import("@/views/setUp/teacher") | ||
| 29 | -let addrouters = [ //测试用,后续后端获取 | ||
| 30 | - { | ||
| 31 | - path: "/examinationPaper", | ||
| 32 | - iconCls: "fa fa-file-text", // 图标样式class | ||
| 33 | - name: "备题组卷", | ||
| 34 | - component: Layout, | ||
| 35 | - alone: true, | ||
| 36 | - children: [ | ||
| 37 | - { | ||
| 38 | - path: "/examinationPaper", | ||
| 39 | - iconCls: "fa fa-file-text", // 图标样式class | ||
| 40 | - name: "", | ||
| 41 | - component: ExaminationPaper, | ||
| 42 | - children: [] | ||
| 43 | - }, | ||
| 44 | - { | ||
| 45 | - path: "/examinationPaperAdd", | ||
| 46 | - iconCls: "", // 图标样式class | ||
| 47 | - name: "添加答题卡", | ||
| 48 | - component: ExaminationPaperAdd, | ||
| 49 | - children: [] | ||
| 50 | - }, | ||
| 51 | - { | ||
| 52 | - path: "/examinationPaperEdit", | ||
| 53 | - iconCls: "", // 图标样式class | ||
| 54 | - name: "修改答题卡", | ||
| 55 | - component: ExaminationPaperEdit, | ||
| 56 | - children: [] | ||
| 57 | - }, | ||
| 58 | - { | ||
| 59 | - path: "/examinationPaperRecycle", | ||
| 60 | - iconCls: "", // 图标样式class | ||
| 61 | - name: "已归档答题卡", | ||
| 62 | - component: ExaminationPaperRecycle, | ||
| 63 | - children: [] | ||
| 64 | - }, | ||
| 65 | - ] | ||
| 66 | - }, | ||
| 67 | - { | ||
| 68 | - path: "/ask", | ||
| 69 | - iconCls: "fa fa-bar-chart", // 图标样式class | ||
| 70 | - name: "随堂问报表", | ||
| 71 | - component: Layout, | ||
| 72 | - alone: true, | ||
| 73 | - children: [ | ||
| 74 | - { | ||
| 75 | - path: "/ask", | ||
| 76 | - iconCls: "fa fa-bar-chart", // 图标样式class | ||
| 77 | - name: "", | ||
| 78 | - component: Ask, | ||
| 79 | - children: [] | ||
| 80 | - | ||
| 81 | - }, | ||
| 82 | - { | ||
| 83 | - path: "/askAnalysis", | ||
| 84 | - iconCls: "", // 图标样式class | ||
| 85 | - name: "随堂问报表分析", | ||
| 86 | - component: AskAnalysis, | ||
| 87 | - children: [] | ||
| 88 | - } | ||
| 89 | - ] | ||
| 90 | - }, | ||
| 91 | - { | ||
| 92 | - path: "/test", | ||
| 93 | - iconCls: "fa fa-pie-chart", // 图标样式class | ||
| 94 | - name: "即时测报表", | ||
| 95 | - component: Layout, | ||
| 96 | - alone: true, | ||
| 97 | - children: [ | ||
| 98 | - { | ||
| 99 | - path: "/test", | ||
| 100 | - iconCls: "fa fa-pie-chart", // 图标样式class | ||
| 101 | - name: "", | ||
| 102 | - component: Test, | ||
| 103 | - children: [] | ||
| 104 | - }, | ||
| 105 | - { | ||
| 106 | - path: "/testAnalysis", | ||
| 107 | - iconCls: "", // 图标样式class | ||
| 108 | - name: "即时测报表分析", | ||
| 109 | - component: TestAnalysis, | ||
| 110 | - children: [] | ||
| 111 | - } | ||
| 112 | - | ||
| 113 | - ] | ||
| 114 | - }, | ||
| 115 | - { | ||
| 116 | - path: "/portrait", | ||
| 117 | - iconCls: "fa fa-users", // 图标样式class | ||
| 118 | - name: "学生画像", | ||
| 119 | - component: Layout, | ||
| 120 | - alone: true, | ||
| 121 | - children: [ | ||
| 122 | - { | ||
| 123 | - path: "/portrait", | ||
| 124 | - iconCls: "fa fa-users", // 图标样式class | ||
| 125 | - name: "", | ||
| 126 | - component: Portrait, | ||
| 127 | - children: [] | ||
| 128 | - } | ||
| 129 | - ] | ||
| 130 | - }, | ||
| 131 | - | ||
| 132 | - { | ||
| 133 | - path: "/setUpConglomerate", | ||
| 134 | - iconCls: "fa fa-building", // 图标样式class | ||
| 135 | - name: "学校管理", | ||
| 136 | - component: Layout, | ||
| 137 | - alone: true, | ||
| 138 | - children: [ | ||
| 139 | - { | ||
| 140 | - path: "/setUpConglomerate", | ||
| 141 | - iconCls: "fa fa-building", | ||
| 142 | - name: '集团管理', | ||
| 143 | - component: SetUpConglomerate, | ||
| 144 | - children: [] | ||
| 145 | - }, | ||
| 146 | - ] | ||
| 147 | - }, | ||
| 148 | - { | ||
| 149 | - path: "/setUpAccount", | ||
| 150 | - iconCls: "fa fa-id-card-o", // 图标样式class | ||
| 151 | - name: "账号管理", | ||
| 152 | - component: Layout, | ||
| 153 | - alone: true, | ||
| 154 | - children: [ | ||
| 155 | - { | ||
| 156 | - path: "/setUpAccount", | ||
| 157 | - iconCls: "fa fa-id-card-o", | ||
| 158 | - name: '', | ||
| 159 | - component: SetUpAccount, | ||
| 160 | - children: [] | ||
| 161 | - }, | ||
| 162 | - ] | ||
| 163 | - }, | ||
| 164 | - { | ||
| 165 | - path: "/", | ||
| 166 | - iconCls: "fa fa-cog", | ||
| 167 | - name: '学校管理', | ||
| 168 | - component: Layout, | ||
| 169 | - children: [ | ||
| 170 | - { | ||
| 171 | - path: "/setUpSchool", | ||
| 172 | - iconCls: "fa fa-calculator", | ||
| 173 | - name: '学校管理', | ||
| 174 | - component: SetUpSchool, | ||
| 175 | - children: [] | ||
| 176 | - }, | ||
| 177 | - { | ||
| 178 | - path: "/setUpTeacher", | ||
| 179 | - iconCls: "fa fa-male", | ||
| 180 | - name: '教师管理', | ||
| 181 | - component: SetUpTeacher, | ||
| 182 | - children: [] | ||
| 183 | - }, | ||
| 184 | - { | ||
| 185 | - path: "/setUpStudent", | ||
| 186 | - iconCls: "fa fa-mortar-board", | ||
| 187 | - name: '学生管理', | ||
| 188 | - component: SetUpStudent, | ||
| 189 | - children: [] | ||
| 190 | - }, | ||
| 191 | - ] | ||
| 192 | - }, | ||
| 193 | - { | ||
| 194 | - path: "/card", | ||
| 195 | - iconCls: "fa fa-id-card", // 图标样式class | ||
| 196 | - name: "发卡记录", | ||
| 197 | - component: Layout, | ||
| 198 | - alone: true, | ||
| 199 | - children: [ | ||
| 200 | - { | ||
| 201 | - path: "/card", | ||
| 202 | - iconCls: "fa fa-id-card", // 图标样式class | ||
| 203 | - name: "", | ||
| 204 | - component: Card, | ||
| 205 | - children: [] | ||
| 206 | - } | ||
| 207 | - ] | ||
| 208 | - }, | ||
| 209 | - { | ||
| 210 | - path: "/device", | ||
| 211 | - iconCls: "fa fa-dashboard", // 图标样式class | ||
| 212 | - name: "设备状态", | ||
| 213 | - component: Layout, | ||
| 214 | - alone: true, | ||
| 215 | - children: [ | ||
| 216 | - { | ||
| 217 | - path: "/device", | ||
| 218 | - iconCls: "fa fa-dashboard", // 图标样式class | ||
| 219 | - name: "", | ||
| 220 | - component: Device, | ||
| 221 | - children: [] | ||
| 222 | - } | ||
| 223 | - ] | ||
| 224 | - }, | ||
| 225 | - { | ||
| 226 | - path: "/analysis", | ||
| 227 | - iconCls: "fa fa-area-chart", // 图标样式class | ||
| 228 | - name: "使用分析", | ||
| 229 | - component: Layout, | ||
| 230 | - alone: true, | ||
| 231 | - children: [ | ||
| 232 | - { | ||
| 233 | - path: "/analysis", | ||
| 234 | - iconCls: "fa fa-area-chart", // 图标样式class | ||
| 235 | - name: "", | ||
| 236 | - component: Analysis, | ||
| 237 | - children: [] | ||
| 238 | - } | ||
| 239 | - ] | ||
| 240 | - }, | ||
| 241 | - { | ||
| 242 | - path: "/down", | ||
| 243 | - iconCls: "fa fa-download", // 图标样式class | ||
| 244 | - name: "软件下载", | ||
| 245 | - component: Layout, | ||
| 246 | - alone: true, | ||
| 247 | - children: [ | ||
| 248 | - { | ||
| 249 | - path: "/down", | ||
| 250 | - iconCls: "fa fa-download", // 图标样式class | ||
| 251 | - name: "", | ||
| 252 | - component: Down, | ||
| 253 | - children: [] | ||
| 254 | - }, | ||
| 255 | - { | ||
| 256 | - path: "/downClient", | ||
| 257 | - iconCls: "", // 图标样式class | ||
| 258 | - name: "", | ||
| 259 | - component: DownClient, | ||
| 260 | - children: [] | ||
| 261 | - } | ||
| 262 | - ] | ||
| 263 | - }, | ||
| 264 | - { | ||
| 265 | - path: "/dataSync", | ||
| 266 | - iconCls: "fa fa-random", // 图标样式class | ||
| 267 | - name: "数据同步", | ||
| 268 | - component: Layout, | ||
| 269 | - alone: true, | ||
| 270 | - children: [ | ||
| 271 | - { | ||
| 272 | - path: "/dataSync", | ||
| 273 | - iconCls: "fa fa-random", // 图标样式class | ||
| 274 | - name: "", | ||
| 275 | - component: DataSync, | ||
| 276 | - children: [] | ||
| 277 | - } | ||
| 278 | - ] | ||
| 279 | - }, | ||
| 280 | - { | ||
| 281 | - path: "*", | ||
| 282 | - redirect: "/404", | ||
| 283 | - hidden: true, | ||
| 284 | - children: [] | ||
| 285 | - } | ||
| 286 | -] | ||
| 287 | - | 4 | +import {addrouters} from "./index" |
| 288 | 5 | ||
| 289 | // 获取角色信息,根据用户权限动态加载路由 | 6 | // 获取角色信息,根据用户权限动态加载路由 |
| 290 | router.beforeEach((to, from, next) => { | 7 | router.beforeEach((to, from, next) => { |
| @@ -314,7 +31,7 @@ router.beforeEach((to, from, next) => { | @@ -314,7 +31,7 @@ router.beforeEach((to, from, next) => { | ||
| 314 | newAddRouters.forEach(res => { | 31 | newAddRouters.forEach(res => { |
| 315 | router.addRoute(res) | 32 | router.addRoute(res) |
| 316 | }) | 33 | }) |
| 317 | - next({ path: to.path }) | 34 | + next({path: to.fullPath}) |
| 318 | }()) | 35 | }()) |
| 319 | } else { | 36 | } else { |
| 320 | next() | 37 | next() |
src/store/index.js
| @@ -3,291 +3,12 @@ import Vuex from "vuex" | @@ -3,291 +3,12 @@ import Vuex from "vuex" | ||
| 3 | import Cookies from "js-cookie" | 3 | import Cookies from "js-cookie" |
| 4 | import layoutStore from "./modules/layout/index" | 4 | import layoutStore from "./modules/layout/index" |
| 5 | import { defaultRouter } from "@/router/index" | 5 | import { defaultRouter } from "@/router/index" |
| 6 | +import { encryptLoginPassword } from "@/utils"; | ||
| 7 | +import { b64DecodeUnicode } from "@/utils"; | ||
| 6 | 8 | ||
| 7 | import request from "@/api/index" | 9 | import request from "@/api/index" |
| 8 | import router from "@/router/index" | 10 | import router from "@/router/index" |
| 9 | - | ||
| 10 | -import Layout from "@/views/layout/layout" | ||
| 11 | -import CommerViews from "@/views/commerViews" | ||
| 12 | -const ExaminationPaper = () => import("@/views/examinationPaper/index") | ||
| 13 | -const ExaminationPaperAdd = () => import("@/views/examinationPaper/add") | ||
| 14 | -const ExaminationPaperEdit = () => import("@/views/examinationPaper/edit") | ||
| 15 | -const ExaminationPaperRecycle = () => import("@/views/examinationPaper/recycle") | ||
| 16 | -const Ask = () => import("@/views/ask/index") | ||
| 17 | -const AskAnalysis = () => import("@/views/ask/analysis") | ||
| 18 | -const Test = () => import("@/views/test/index") | ||
| 19 | -const TestAnalysis = () => import("@/views/test/analysis") | ||
| 20 | -const DataSync = () => import("@/views/dataSync/index") | ||
| 21 | -const Portrait = () => import("@/views/portrait/index") | ||
| 22 | -const Card = () => import("@/views/card/index") | ||
| 23 | -const Analysis = () => import("@/views/analysis/index") | ||
| 24 | -const Device = () => import("@/views/device/index") | ||
| 25 | -const Down = () => import("@/views/down/index") | ||
| 26 | -const DownClient = () => import("@/views/down/client") | ||
| 27 | -const SetUpAccount = () => import("@/views/setUp/account") | ||
| 28 | -const SetUpConglomerate = () => import("@/views/setUp/conglomerate") | ||
| 29 | -const SetUpSchool = () => import("@/views/setUp/school") | ||
| 30 | -const SetUpStudent = () => import("@/views/setUp/student") | ||
| 31 | -const SetUpTeacher = () => import("@/views/setUp/teacher") | ||
| 32 | -let addrouters = [ //测试用,后续后端获取 | ||
| 33 | - { | ||
| 34 | - path: "/examinationPaper", | ||
| 35 | - iconCls: "fa fa-file-text", // 图标样式class | ||
| 36 | - name: "备题组卷", | ||
| 37 | - component: Layout, | ||
| 38 | - alone: true, | ||
| 39 | - children: [ | ||
| 40 | - { | ||
| 41 | - path: "/examinationPaper", | ||
| 42 | - iconCls: "fa fa-file-text", // 图标样式class | ||
| 43 | - name: "", | ||
| 44 | - component: ExaminationPaper, | ||
| 45 | - children: [] | ||
| 46 | - }, | ||
| 47 | - { | ||
| 48 | - path: "/examinationPaperAdd", | ||
| 49 | - iconCls: "", // 图标样式class | ||
| 50 | - name: "添加答题卡", | ||
| 51 | - component: ExaminationPaperAdd, | ||
| 52 | - children: [] | ||
| 53 | - }, | ||
| 54 | - { | ||
| 55 | - path: "/examinationPaperEdit", | ||
| 56 | - iconCls: "", // 图标样式class | ||
| 57 | - name: "修改答题卡", | ||
| 58 | - component: ExaminationPaperEdit, | ||
| 59 | - children: [] | ||
| 60 | - }, | ||
| 61 | - { | ||
| 62 | - path: "/examinationPaperRecycle", | ||
| 63 | - iconCls: "", // 图标样式class | ||
| 64 | - name: "已归档答题卡", | ||
| 65 | - component: ExaminationPaperRecycle, | ||
| 66 | - children: [] | ||
| 67 | - }, | ||
| 68 | - ] | ||
| 69 | - }, | ||
| 70 | - { | ||
| 71 | - path: "/ask", | ||
| 72 | - iconCls: "fa fa-bar-chart", // 图标样式class | ||
| 73 | - name: "随堂问报表", | ||
| 74 | - component: Layout, | ||
| 75 | - alone: true, | ||
| 76 | - children: [ | ||
| 77 | - { | ||
| 78 | - path: "/ask", | ||
| 79 | - iconCls: "fa fa-bar-chart", // 图标样式class | ||
| 80 | - name: "", | ||
| 81 | - component: Ask, | ||
| 82 | - children: [] | ||
| 83 | - | ||
| 84 | - }, | ||
| 85 | - { | ||
| 86 | - path: "/askAnalysis", | ||
| 87 | - iconCls: "", // 图标样式class | ||
| 88 | - name: "随堂问报表分析", | ||
| 89 | - component: AskAnalysis, | ||
| 90 | - children: [] | ||
| 91 | - } | ||
| 92 | - ] | ||
| 93 | - }, | ||
| 94 | - { | ||
| 95 | - path: "/test", | ||
| 96 | - iconCls: "fa fa-pie-chart", // 图标样式class | ||
| 97 | - name: "即时测报表", | ||
| 98 | - component: Layout, | ||
| 99 | - alone: true, | ||
| 100 | - children: [ | ||
| 101 | - { | ||
| 102 | - path: "/test", | ||
| 103 | - iconCls: "fa fa-pie-chart", // 图标样式class | ||
| 104 | - name: "", | ||
| 105 | - component: Test, | ||
| 106 | - children: [] | ||
| 107 | - }, | ||
| 108 | - { | ||
| 109 | - path: "/testAnalysis", | ||
| 110 | - iconCls: "", // 图标样式class | ||
| 111 | - name: "即时测报表分析", | ||
| 112 | - component: TestAnalysis, | ||
| 113 | - children: [] | ||
| 114 | - } | ||
| 115 | - | ||
| 116 | - ] | ||
| 117 | - }, | ||
| 118 | - { | ||
| 119 | - path: "/portrait", | ||
| 120 | - iconCls: "fa fa-users", // 图标样式class | ||
| 121 | - name: "学生画像", | ||
| 122 | - component: Layout, | ||
| 123 | - alone: true, | ||
| 124 | - children: [ | ||
| 125 | - { | ||
| 126 | - path: "/portrait", | ||
| 127 | - iconCls: "fa fa-users", // 图标样式class | ||
| 128 | - name: "", | ||
| 129 | - component: Portrait, | ||
| 130 | - children: [] | ||
| 131 | - } | ||
| 132 | - ] | ||
| 133 | - }, | ||
| 134 | - | ||
| 135 | - { | ||
| 136 | - path: "/setUpConglomerate", | ||
| 137 | - iconCls: "fa fa-building", // 图标样式class | ||
| 138 | - name: "学校管理", | ||
| 139 | - component: Layout, | ||
| 140 | - alone: true, | ||
| 141 | - children: [ | ||
| 142 | - { | ||
| 143 | - path: "/setUpConglomerate", | ||
| 144 | - iconCls: "fa fa-building", | ||
| 145 | - name: '集团管理', | ||
| 146 | - component: SetUpConglomerate, | ||
| 147 | - children: [] | ||
| 148 | - }, | ||
| 149 | - ] | ||
| 150 | - }, | ||
| 151 | - { | ||
| 152 | - path: "/setUpAccount", | ||
| 153 | - iconCls: "fa fa-id-card-o", // 图标样式class | ||
| 154 | - name: "账号管理", | ||
| 155 | - component: Layout, | ||
| 156 | - alone: true, | ||
| 157 | - children: [ | ||
| 158 | - { | ||
| 159 | - path: "/setUpAccount", | ||
| 160 | - iconCls: "fa fa-id-card-o", | ||
| 161 | - name: '', | ||
| 162 | - component: SetUpAccount, | ||
| 163 | - children: [] | ||
| 164 | - }, | ||
| 165 | - ] | ||
| 166 | - }, | ||
| 167 | - { | ||
| 168 | - path: "/", | ||
| 169 | - iconCls: "fa fa-cog", | ||
| 170 | - name: '学校设置', | ||
| 171 | - component: Layout, | ||
| 172 | - children: [ | ||
| 173 | - { | ||
| 174 | - path: "/setUpSchool", | ||
| 175 | - iconCls: "fa fa-calculator", | ||
| 176 | - name: '学校设置', | ||
| 177 | - component: SetUpSchool, | ||
| 178 | - children: [] | ||
| 179 | - }, | ||
| 180 | - { | ||
| 181 | - path: "/setUpTeacher", | ||
| 182 | - iconCls: "fa fa-male", | ||
| 183 | - name: '教师管理', | ||
| 184 | - component: SetUpTeacher, | ||
| 185 | - children: [] | ||
| 186 | - }, | ||
| 187 | - { | ||
| 188 | - path: "/setUpStudent", | ||
| 189 | - iconCls: "fa fa-mortar-board", | ||
| 190 | - name: '学生管理', | ||
| 191 | - component: SetUpStudent, | ||
| 192 | - children: [] | ||
| 193 | - }, | ||
| 194 | - ] | ||
| 195 | - }, | ||
| 196 | - { | ||
| 197 | - path: "/card", | ||
| 198 | - iconCls: "fa fa-id-card", // 图标样式class | ||
| 199 | - name: "发卡记录", | ||
| 200 | - component: Layout, | ||
| 201 | - alone: true, | ||
| 202 | - children: [ | ||
| 203 | - { | ||
| 204 | - path: "/card", | ||
| 205 | - iconCls: "fa fa-id-card", // 图标样式class | ||
| 206 | - name: "", | ||
| 207 | - component: Card, | ||
| 208 | - children: [] | ||
| 209 | - } | ||
| 210 | - ] | ||
| 211 | - }, | ||
| 212 | - { | ||
| 213 | - path: "/device", | ||
| 214 | - iconCls: "fa fa-dashboard", // 图标样式class | ||
| 215 | - name: "设备状态", | ||
| 216 | - component: Layout, | ||
| 217 | - alone: true, | ||
| 218 | - children: [ | ||
| 219 | - { | ||
| 220 | - path: "/device", | ||
| 221 | - iconCls: "fa fa-dashboard", // 图标样式class | ||
| 222 | - name: "", | ||
| 223 | - component: Device, | ||
| 224 | - children: [] | ||
| 225 | - } | ||
| 226 | - ] | ||
| 227 | - }, | ||
| 228 | - { | ||
| 229 | - path: "/analysis", | ||
| 230 | - iconCls: "fa fa-area-chart", // 图标样式class | ||
| 231 | - name: "使用分析", | ||
| 232 | - component: Layout, | ||
| 233 | - alone: true, | ||
| 234 | - children: [ | ||
| 235 | - { | ||
| 236 | - path: "/analysis", | ||
| 237 | - iconCls: "fa fa-area-chart", // 图标样式class | ||
| 238 | - name: "", | ||
| 239 | - component: Analysis, | ||
| 240 | - children: [] | ||
| 241 | - } | ||
| 242 | - ] | ||
| 243 | - }, | ||
| 244 | - { | ||
| 245 | - path: "/down", | ||
| 246 | - iconCls: "fa fa-download", // 图标样式class | ||
| 247 | - name: "软件下载", | ||
| 248 | - component: Layout, | ||
| 249 | - alone: true, | ||
| 250 | - children: [ | ||
| 251 | - { | ||
| 252 | - path: "/down", | ||
| 253 | - iconCls: "fa fa-download", // 图标样式class | ||
| 254 | - name: "发卡软件", | ||
| 255 | - component: Down, | ||
| 256 | - children: [] | ||
| 257 | - }, | ||
| 258 | - { | ||
| 259 | - path: "/downClient", | ||
| 260 | - iconCls: "", // 图标样式class | ||
| 261 | - name: "授课端软件", | ||
| 262 | - component: DownClient, | ||
| 263 | - children: [] | ||
| 264 | - } | ||
| 265 | - ] | ||
| 266 | - }, | ||
| 267 | - { | ||
| 268 | - path: "/dataSync", | ||
| 269 | - iconCls: "fa fa-random", // 图标样式class | ||
| 270 | - name: "数据同步", | ||
| 271 | - component: Layout, | ||
| 272 | - alone: true, | ||
| 273 | - children: [ | ||
| 274 | - { | ||
| 275 | - path: "/dataSync", | ||
| 276 | - iconCls: "fa fa-random", // 图标样式class | ||
| 277 | - name: "", | ||
| 278 | - component: DataSync, | ||
| 279 | - children: [] | ||
| 280 | - } | ||
| 281 | - ] | ||
| 282 | - }, | ||
| 283 | - { | ||
| 284 | - path: "*", | ||
| 285 | - redirect: "/404", | ||
| 286 | - hidden: true, | ||
| 287 | - children: [] | ||
| 288 | - } | ||
| 289 | -] | ||
| 290 | - | 11 | +import {addrouters} from "@/router/index" |
| 291 | Vue.use(Vuex) | 12 | Vue.use(Vuex) |
| 292 | 13 | ||
| 293 | const store = new Vuex.Store({ | 14 | const store = new Vuex.Store({ |
| @@ -310,7 +31,7 @@ const store = new Vuex.Store({ | @@ -310,7 +31,7 @@ const store = new Vuex.Store({ | ||
| 310 | name: data.name, | 31 | name: data.name, |
| 311 | authorityRouter: data.authorityRouter, | 32 | authorityRouter: data.authorityRouter, |
| 312 | avatar: data.avatar ? data.avatar : "", | 33 | avatar: data.avatar ? data.avatar : "", |
| 313 | - uid: data.id | 34 | + uid: data.uid |
| 314 | } | 35 | } |
| 315 | localStorage.setItem("info", JSON.stringify(store.getters.info)) | 36 | localStorage.setItem("info", JSON.stringify(store.getters.info)) |
| 316 | }, | 37 | }, |
| @@ -330,9 +51,13 @@ const store = new Vuex.Store({ | @@ -330,9 +51,13 @@ const store = new Vuex.Store({ | ||
| 330 | }, | 51 | }, |
| 331 | }, | 52 | }, |
| 332 | actions: { | 53 | actions: { |
| 333 | - Login({ commit }, that) { | ||
| 334 | - // request.fetchLogin(that.loginForm).then(res => { | 54 | + Login({ state,commit }, params) { |
| 55 | + let loginForm={} | ||
| 56 | + loginForm.username = params.username; | ||
| 57 | + loginForm.password = encryptLoginPassword(params.password); | ||
| 58 | + // request.fetchLogin(loginForm).then(res => { | ||
| 335 | // if (res.status == 200) { | 59 | // if (res.status == 200) { |
| 60 | + // const dataJSON = JSON.parse(b64DecodeUnicode(res.data)); | ||
| 336 | commit("setToken", "xxxx") | 61 | commit("setToken", "xxxx") |
| 337 | commit("setInfo", { | 62 | commit("setInfo", { |
| 338 | permissions: [ | 63 | permissions: [ |
| @@ -347,14 +72,19 @@ const store = new Vuex.Store({ | @@ -347,14 +72,19 @@ const store = new Vuex.Store({ | ||
| 347 | // authorityRouter:[], | 72 | // authorityRouter:[], |
| 348 | }); | 73 | }); |
| 349 | commit("setRouters", addrouters) | 74 | commit("setRouters", addrouters) |
| 350 | - addrouters.forEach((res) => { | ||
| 351 | - that.$router.addRoute(res); | 75 | + state.addRouters.forEach((res) => { |
| 76 | + router.addRoute(res); | ||
| 352 | }); | 77 | }); |
| 353 | - that.$router.push({ path: "/" }) | 78 | + console.log() |
| 79 | + if (params.url) { | ||
| 80 | + window.location.href = params.url; | ||
| 81 | + } else { | ||
| 82 | + router.push({ path: "/" }) | ||
| 83 | + } | ||
| 354 | // } | 84 | // } |
| 355 | // }) | 85 | // }) |
| 356 | }, | 86 | }, |
| 357 | - permissions({ commit }, that) { | 87 | + permissions({ state,commit }, that) { |
| 358 | // request.fetchLogin(that.loginForm).then(res => { | 88 | // request.fetchLogin(that.loginForm).then(res => { |
| 359 | // if (res.status == 200) { | 89 | // if (res.status == 200) { |
| 360 | commit("setToken", "xxxx") | 90 | commit("setToken", "xxxx") |
| @@ -371,7 +101,7 @@ const store = new Vuex.Store({ | @@ -371,7 +101,7 @@ const store = new Vuex.Store({ | ||
| 371 | // authorityRouter:[], | 101 | // authorityRouter:[], |
| 372 | }); | 102 | }); |
| 373 | commit("setRouters", addrouters) | 103 | commit("setRouters", addrouters) |
| 374 | - addrouters.forEach((res) => { | 104 | + state.addRouters.forEach((res) => { |
| 375 | that.$router.addRoute(res); | 105 | that.$router.addRoute(res); |
| 376 | }); | 106 | }); |
| 377 | that.$router.push({ path: "/" }) | 107 | that.$router.push({ path: "/" }) |
src/utils/index.js
| 1 | 1 | ||
| 2 | -import CryptoJS from "crypto-js" | 2 | +// import CryptoJS from "crypto-js" |
| 3 | +import { JSEncrypt } from 'jsencrypt' | ||
| 3 | 4 | ||
| 4 | const encryptKey = "WfJTKO9S4eLkrPz2JKrAnzdb" | 5 | const encryptKey = "WfJTKO9S4eLkrPz2JKrAnzdb" |
| 5 | const encryptIV = "D076D35C" | 6 | const encryptIV = "D076D35C" |
| 7 | +/** | ||
| 8 | + * 登录密码加密,公钥直接写死在方法里 | ||
| 9 | + * @param data: 待加密数据 | ||
| 10 | + * @returns 加密结果 | ||
| 11 | + */ | ||
| 12 | +export function encryptLoginPassword(data){ | ||
| 13 | + const secret = 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjh2ei17z5k2r4VzbqoSCE6RmYzWySJTgVQYulgfVM+vqcDoUE4cFB4XCFA2lHWjjpsuJP1EtwKlvUgxo5okr3x/a88o8eERxBynnVQZbEYpKteW5aqSEb/g1yPLWnKV88b/ED445ITYbZZuInRo5lkCvd6QEjL6d2Fch6mEo5awYXC4/S4BJf9YlYRhGzR7wpiXCLvyBHQ4iSIIDNpmrPBPQzGP0rx09aDu54kz/42CR6SX2OqXSi4ZoieqkPFl/iuX4RoD/NKKR+haDn1UzoD3k1WzHSTBFFs27rxRpxfBUZzfXQeskgKyw/Slcl3jUFizczsY4CLgTRrfey48Q6QIDAQAB'; | ||
| 14 | + // 新建JSEncrypt对象 | ||
| 15 | + let encryptor = new JSEncrypt(); | ||
| 16 | + // 设置公钥 | ||
| 17 | + encryptor.setPublicKey(secret); | ||
| 18 | + // 加密数据 | ||
| 19 | + return encryptor.encrypt(data); | ||
| 20 | +} | ||
| 21 | + | ||
| 22 | +/** | ||
| 23 | +* 对称加密 | ||
| 24 | +* @param secret:加密公钥 | ||
| 25 | +* @param data: 待加密数据 | ||
| 26 | +* @returns 加密结果 | ||
| 27 | +*/ | ||
| 28 | +export function encryptData(secret, data){ | ||
| 29 | + // 新建JSEncrypt对象 | ||
| 30 | + let encryptor = new JSEncrypt(); | ||
| 31 | + // 设置公钥 | ||
| 32 | + encryptor.setPublicKey(secret); | ||
| 33 | + // 加密数据 | ||
| 34 | + return encryptor.encrypt(data); | ||
| 35 | +} | ||
| 6 | 36 | ||
| 7 | // 深度复制 | 37 | // 深度复制 |
| 8 | export function deepClone (obj) { | 38 | export function deepClone (obj) { |
| @@ -19,29 +49,29 @@ export function deepClone (obj) { | @@ -19,29 +49,29 @@ export function deepClone (obj) { | ||
| 19 | return result | 49 | return result |
| 20 | } | 50 | } |
| 21 | 51 | ||
| 22 | -// 3DES加密 | ||
| 23 | -export function desEncrypt (str, key = encryptKey, iv = encryptIV) { | ||
| 24 | - var cryptoKey = CryptoJS.enc.Utf8.parse(key) | ||
| 25 | - var cryptoIv = CryptoJS.enc.Utf8.parse(iv.substr(0, 8)) | ||
| 26 | - var encodeStr = CryptoJS.TripleDES.encrypt(str, cryptoKey, { | ||
| 27 | - iv: cryptoIv, | ||
| 28 | - mode: CryptoJS.mode.CBC, | ||
| 29 | - padding: CryptoJS.pad.Pkcs7 | ||
| 30 | - }) | ||
| 31 | - return encodeStr.toString() | ||
| 32 | -} | 52 | +// // 3DES加密 |
| 53 | +// export function desEncrypt (str, key = encryptKey, iv = encryptIV) { | ||
| 54 | +// var cryptoKey = CryptoJS.enc.Utf8.parse(key) | ||
| 55 | +// var cryptoIv = CryptoJS.enc.Utf8.parse(iv.substr(0, 8)) | ||
| 56 | +// var encodeStr = CryptoJS.TripleDES.encrypt(str, cryptoKey, { | ||
| 57 | +// iv: cryptoIv, | ||
| 58 | +// mode: CryptoJS.mode.CBC, | ||
| 59 | +// padding: CryptoJS.pad.Pkcs7 | ||
| 60 | +// }) | ||
| 61 | +// return encodeStr.toString() | ||
| 62 | +// } | ||
| 33 | 63 | ||
| 34 | -// 3DES解密 | ||
| 35 | -export function desDecrypt (str, key = encryptKey, iv = encryptIV) { | ||
| 36 | - var cryptoKey = CryptoJS.enc.Utf8.parse(key) | ||
| 37 | - var cryptoIv = CryptoJS.enc.Utf8.parse(iv.substr(0, 8)) | ||
| 38 | - var decryptStr = CryptoJS.TripleDES.decrypt(str, cryptoKey, { | ||
| 39 | - iv: cryptoIv, | ||
| 40 | - mode: CryptoJS.mode.CBC, | ||
| 41 | - padding: CryptoJS.pad.Pkcs7 | ||
| 42 | - }) | ||
| 43 | - return decryptStr.toString(CryptoJS.enc.Utf8) | ||
| 44 | -} | 64 | +// // 3DES解密 |
| 65 | +// export function desDecrypt (str, key = encryptKey, iv = encryptIV) { | ||
| 66 | +// var cryptoKey = CryptoJS.enc.Utf8.parse(key) | ||
| 67 | +// var cryptoIv = CryptoJS.enc.Utf8.parse(iv.substr(0, 8)) | ||
| 68 | +// var decryptStr = CryptoJS.TripleDES.decrypt(str, cryptoKey, { | ||
| 69 | +// iv: cryptoIv, | ||
| 70 | +// mode: CryptoJS.mode.CBC, | ||
| 71 | +// padding: CryptoJS.pad.Pkcs7 | ||
| 72 | +// }) | ||
| 73 | +// return decryptStr.toString(CryptoJS.enc.Utf8) | ||
| 74 | +// } | ||
| 45 | 75 | ||
| 46 | // 随机生成由字母+数字的字符串 | 76 | // 随机生成由字母+数字的字符串 |
| 47 | export function randomWord (randomFlag, min, max) { | 77 | export function randomWord (randomFlag, min, max) { |
| @@ -86,6 +116,21 @@ export function getCookie (name, defaultValue) { | @@ -86,6 +116,21 @@ export function getCookie (name, defaultValue) { | ||
| 86 | return result[0] === document.cookie.match(result[1]) ? unescape(result[0][2]) : defaultValue | 116 | return result[0] === document.cookie.match(result[1]) ? unescape(result[0][2]) : defaultValue |
| 87 | } | 117 | } |
| 88 | 118 | ||
| 119 | + | ||
| 120 | +/** | ||
| 121 | + * base64转化unicode | ||
| 122 | + */ | ||
| 123 | + export function b64DecodeUnicode(str) { | ||
| 124 | + let uni; | ||
| 125 | + try { | ||
| 126 | + // atob 经过 base-64 编码的字符串进行解码 | ||
| 127 | + uni = decodeURIComponent(atob(str).split('').map(function (c) { | ||
| 128 | + return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2); | ||
| 129 | + }).join('')); | ||
| 130 | + } catch (e) {} | ||
| 131 | + return uni; | ||
| 132 | +} | ||
| 133 | + | ||
| 89 | // base64ToFile | 134 | // base64ToFile |
| 90 | export function base64ToFile (base64Data, tempfilename, contentType) { | 135 | export function base64ToFile (base64Data, tempfilename, contentType) { |
| 91 | contentType = contentType || "" | 136 | contentType = contentType || "" |
| @@ -228,3 +273,28 @@ export function getNewTime (dayNum) { | @@ -228,3 +273,28 @@ export function getNewTime (dayNum) { | ||
| 228 | var time = date.getTime() | 273 | var time = date.getTime() |
| 229 | return time | 274 | return time |
| 230 | } | 275 | } |
| 276 | + | ||
| 277 | +/* | ||
| 278 | + * 获取URL参数 | ||
| 279 | + * | ||
| 280 | + * */ | ||
| 281 | +export function getURLParams(variable) { | ||
| 282 | + let str = window.location.href.split("?")[1]; | ||
| 283 | + if (!str) return null; | ||
| 284 | + let ar = str.split("&"); | ||
| 285 | + let obj = {}; | ||
| 286 | + let data; | ||
| 287 | + for (var i = 0; i < ar.length; i++) { | ||
| 288 | + var pair = ar[i].split("="); | ||
| 289 | + pair[1] = decodeURIComponent(pair[1]) | ||
| 290 | + | ||
| 291 | + if (pair[0] == variable) { | ||
| 292 | + data = pair[1] | ||
| 293 | + return pair[1] | ||
| 294 | + } | ||
| 295 | + if (pair[0]) { | ||
| 296 | + obj[pair[0]] = pair[1] | ||
| 297 | + } | ||
| 298 | + } | ||
| 299 | + return variable ? data : obj | ||
| 300 | +} | ||
| 231 | \ No newline at end of file | 301 | \ No newline at end of file |
src/views/examinationPaper/add.vue
| 1 | <template> | 1 | <template> |
| 2 | - <div>添加答题卡</div> | 2 | + <div> |
| 3 | + <back-box> | ||
| 4 | + <template slot="title"> | ||
| 5 | + <span>{{ "创建答题卡" }}</span> | ||
| 6 | + </template> | ||
| 7 | + </back-box> | ||
| 8 | + <div class="content"> | ||
| 9 | + <el-steps | ||
| 10 | + :active="step" | ||
| 11 | + finish-status="success" | ||
| 12 | + simple | ||
| 13 | + style="margin: 20px 0" | ||
| 14 | + > | ||
| 15 | + <el-step title="基础信息" icon="el-icon-edit"></el-step> | ||
| 16 | + <el-step title="题目编辑" icon="el-icon-tickets"></el-step> | ||
| 17 | + <el-step title="设置答案" icon="el-icon-edit-outline"></el-step> | ||
| 18 | + </el-steps> | ||
| 19 | + <div v-show="step == 0"> | ||
| 20 | + <el-form | ||
| 21 | + ref="forms" | ||
| 22 | + :model="form" | ||
| 23 | + :rules="formRules" | ||
| 24 | + label-width="140px" | ||
| 25 | + > | ||
| 26 | + <el-form-item label="答题卡名称:" prop="title"> | ||
| 27 | + <el-col :span="10" | ||
| 28 | + ><el-input | ||
| 29 | + type="text" | ||
| 30 | + placeholder="请输入答题卡名称" | ||
| 31 | + v-model.trim="form.title" | ||
| 32 | + maxlength="30" | ||
| 33 | + size="45" | ||
| 34 | + show-word-limit | ||
| 35 | + > | ||
| 36 | + </el-input | ||
| 37 | + ></el-col> | ||
| 38 | + </el-form-item> | ||
| 39 | + <el-form-item label="测验类型:"> | ||
| 40 | + <el-select v-model="form.tag" placeholder="选择测验类型"> | ||
| 41 | + <el-option | ||
| 42 | + v-for="item in answerTypeList" | ||
| 43 | + :key="item.id" | ||
| 44 | + :label="item.typeName" | ||
| 45 | + :value="item.id" | ||
| 46 | + >{{ item.typeName }}</el-option | ||
| 47 | + > | ||
| 48 | + </el-select> | ||
| 49 | + <el-button | ||
| 50 | + class="ml-20" | ||
| 51 | + type="primary" | ||
| 52 | + round | ||
| 53 | + circle | ||
| 54 | + icon="el-icon-plus" | ||
| 55 | + @click="dialogVisible = true" | ||
| 56 | + ></el-button> | ||
| 57 | + </el-form-item> | ||
| 58 | + <el-form-item label="年级:" prop="gradeName"> | ||
| 59 | + <el-select | ||
| 60 | + class="sel" | ||
| 61 | + v-model="form.gradeName" | ||
| 62 | + placeholder="" | ||
| 63 | + @change="changeGrade" | ||
| 64 | + > | ||
| 65 | + <el-option | ||
| 66 | + v-for="item in gradeList" | ||
| 67 | + :key="item" | ||
| 68 | + :label="item" | ||
| 69 | + :value="item" | ||
| 70 | + > | ||
| 71 | + </el-option> | ||
| 72 | + </el-select> | ||
| 73 | + </el-form-item> | ||
| 74 | + <el-form-item label="科目:" prop="subjectId"> | ||
| 75 | + <el-select class="sel" v-model="form.subjectId" placeholder=""> | ||
| 76 | + <el-option | ||
| 77 | + v-for="item in subjectList" | ||
| 78 | + :key="item.value" | ||
| 79 | + :label="item.label" | ||
| 80 | + :value="item.value" | ||
| 81 | + > | ||
| 82 | + </el-option> | ||
| 83 | + </el-select> | ||
| 84 | + </el-form-item> | ||
| 85 | + <el-form-item label="考试时长:" prop="examsDuration"> | ||
| 86 | + <el-input-number | ||
| 87 | + size="medium" | ||
| 88 | + :min="1" | ||
| 89 | + :max="240" | ||
| 90 | + v-model="form.examsDuration" | ||
| 91 | + label="考试时长" | ||
| 92 | + ></el-input-number> | ||
| 93 | + </el-form-item> | ||
| 94 | + <el-form-item label="分享范围:" prop="share"> | ||
| 95 | + <el-radio-group v-model="form.share"> | ||
| 96 | + <el-radio :label="1">任课班级分享</el-radio> | ||
| 97 | + <el-radio :label="2">全年级分享</el-radio> | ||
| 98 | + </el-radio-group> | ||
| 99 | + </el-form-item> | ||
| 100 | + </el-form> | ||
| 101 | + <div class="btn-box"> | ||
| 102 | + <el-button type="danger" plain round @click="linkBack" | ||
| 103 | + >取消</el-button | ||
| 104 | + > | ||
| 105 | + <el-button type="primary" round @click="setStep1">下一步</el-button> | ||
| 106 | + </div> | ||
| 107 | + <el-dialog | ||
| 108 | + title="天假测验类型" | ||
| 109 | + :visible.sync="dialogVisible" | ||
| 110 | + width="500px" | ||
| 111 | + > | ||
| 112 | + <div class="dia-content"> | ||
| 113 | + <p class="add-type"> | ||
| 114 | + <el-input | ||
| 115 | + type="text" | ||
| 116 | + placeholder="请输入答题卡类型名称" | ||
| 117 | + v-model.trim="answerTypeName" | ||
| 118 | + maxlength="10" | ||
| 119 | + show-word-limit | ||
| 120 | + > | ||
| 121 | + </el-input> | ||
| 122 | + </p> | ||
| 123 | + </div> | ||
| 124 | + <div class="" slot="footer"> | ||
| 125 | + <el-button type="primary" @click="addAnswerTypeName" | ||
| 126 | + >确 定</el-button | ||
| 127 | + > | ||
| 128 | + <el-button @click="dialogVisible = false">取 消</el-button> | ||
| 129 | + </div> | ||
| 130 | + </el-dialog> | ||
| 131 | + </div> | ||
| 132 | + <div v-show="step == 1"> | ||
| 133 | + <div v-for="(question, index) in form.questionList" :key="index"> | ||
| 134 | + <p class="question-title"> | ||
| 135 | + <span>{{ setBigNum(index) }}、</span> | ||
| 136 | + <el-input | ||
| 137 | + class="ipt" | ||
| 138 | + v-model.trim="question.questionTitle" | ||
| 139 | + placeholder="填写大题名称" | ||
| 140 | + ></el-input> | ||
| 141 | + <el-popconfirm | ||
| 142 | + title="确定删除这道大题吗?" | ||
| 143 | + @confirm="form.questionList.splice(index, 1)" | ||
| 144 | + > | ||
| 145 | + <el-button | ||
| 146 | + slot="reference" | ||
| 147 | + class="delete" | ||
| 148 | + type="danger" | ||
| 149 | + size="mini" | ||
| 150 | + circle | ||
| 151 | + icon="el-icon-delete" | ||
| 152 | + ></el-button> | ||
| 153 | + </el-popconfirm> | ||
| 154 | + | ||
| 155 | + <span>总分数:{{ setScore(question) }}分</span> | ||
| 156 | + </p> | ||
| 157 | + <ul class="questions-ul"> | ||
| 158 | + <li class="sub-questions"> | ||
| 159 | + <div class="qs-num">题号</div> | ||
| 160 | + <div class="qs-type">题型</div> | ||
| 161 | + <div class="qs-score">分数</div> | ||
| 162 | + <div class="qs-partScore">部分分值</div> | ||
| 163 | + <div class="qs-options">选项设置</div> | ||
| 164 | + <div class="qs-set">操作</div> | ||
| 165 | + </li> | ||
| 166 | + <li | ||
| 167 | + class="sub-questions" | ||
| 168 | + v-for="(subQuestions, indexs) in question.subQuestions" | ||
| 169 | + :key="indexs" | ||
| 170 | + > | ||
| 171 | + <div class="qs-num">{{ setNum(index, indexs) }}</div> | ||
| 172 | + <div class="qs-type"> | ||
| 173 | + <el-select | ||
| 174 | + v-model="subQuestions.questionType" | ||
| 175 | + placeholder="选择答题卡类型" | ||
| 176 | + @change="changeSubQuestions($event, subQuestions)" | ||
| 177 | + > | ||
| 178 | + <el-option label="单选题" :value="2"></el-option> | ||
| 179 | + <el-option label="多选题" :value="3"></el-option> | ||
| 180 | + <el-option label="判断题" :value="4"></el-option> | ||
| 181 | + <el-option label="主观题" :value="5"></el-option> | ||
| 182 | + </el-select> | ||
| 183 | + </div> | ||
| 184 | + <div class="qs-score"> | ||
| 185 | + <el-input-number | ||
| 186 | + class="number-ipt" | ||
| 187 | + size="medium" | ||
| 188 | + :min="1" | ||
| 189 | + :max="200" | ||
| 190 | + :precision="2" | ||
| 191 | + v-model="subQuestions.score" | ||
| 192 | + label="单题分值" | ||
| 193 | + ></el-input-number> | ||
| 194 | + </div> | ||
| 195 | + <div class="qs-partScore"> | ||
| 196 | + <p v-if="subQuestions.questionType != 3">--</p> | ||
| 197 | + <el-input-number | ||
| 198 | + class="number-ipt" | ||
| 199 | + v-else | ||
| 200 | + size="medium" | ||
| 201 | + :min="0" | ||
| 202 | + :precision="2" | ||
| 203 | + :max="subQuestions.score" | ||
| 204 | + :step="0.5" | ||
| 205 | + v-model="subQuestions.partScore" | ||
| 206 | + label="部分分值" | ||
| 207 | + ></el-input-number> | ||
| 208 | + </div> | ||
| 209 | + <div class="qs-options"> | ||
| 210 | + <p v-if="subQuestions.questionType == 5">--</p> | ||
| 211 | + <p | ||
| 212 | + v-else-if="subQuestions.questionType == 4" | ||
| 213 | + class="answer-box" | ||
| 214 | + > | ||
| 215 | + <span class="answer-s">✓</span> | ||
| 216 | + <span class="answer-s">✗</span> | ||
| 217 | + </p> | ||
| 218 | + <p v-else class="answer-box"> | ||
| 219 | + <span | ||
| 220 | + class="answer-s" | ||
| 221 | + v-for="option in subQuestions.answerOptions" | ||
| 222 | + :key="option" | ||
| 223 | + >{{ option }}</span | ||
| 224 | + > | ||
| 225 | + <el-button | ||
| 226 | + size="mini" | ||
| 227 | + type="primary" | ||
| 228 | + icon="el-icon-plus" | ||
| 229 | + circle | ||
| 230 | + @click="addOptions(subQuestions)" | ||
| 231 | + ></el-button> | ||
| 232 | + <el-button | ||
| 233 | + size="mini" | ||
| 234 | + type="primary" | ||
| 235 | + icon="el-icon-minus" | ||
| 236 | + round | ||
| 237 | + circle | ||
| 238 | + @click="removeOptions(subQuestions)" | ||
| 239 | + ></el-button> | ||
| 240 | + </p> | ||
| 241 | + </div> | ||
| 242 | + <div class="qs-set"> | ||
| 243 | + <el-popconfirm | ||
| 244 | + title="确定删除这道题吗?" | ||
| 245 | + @confirm="delTabData(indexs, index)" | ||
| 246 | + > | ||
| 247 | + <el-button | ||
| 248 | + slot="reference" | ||
| 249 | + class="delete" | ||
| 250 | + type="danger" | ||
| 251 | + size="mini" | ||
| 252 | + circle | ||
| 253 | + icon="el-icon-delete" | ||
| 254 | + ></el-button> | ||
| 255 | + </el-popconfirm> | ||
| 256 | + </div> | ||
| 257 | + </li> | ||
| 258 | + <li class="sub-questions"> | ||
| 259 | + <div class="qs-num">添加</div> | ||
| 260 | + <div class="qs-type"> | ||
| 261 | + <el-select | ||
| 262 | + v-model="addSubQuestionsType" | ||
| 263 | + placeholder="选择答题卡类型" | ||
| 264 | + @change="changeAddSubQuestions($event, question)" | ||
| 265 | + > | ||
| 266 | + <el-option label="单选题" :value="2"></el-option> | ||
| 267 | + <el-option label="多选题" :value="3"></el-option> | ||
| 268 | + <el-option label="判断题" :value="4"></el-option> | ||
| 269 | + <el-option label="主观题" :value="5"></el-option> | ||
| 270 | + </el-select> | ||
| 271 | + </div> | ||
| 272 | + <div class="qs-score"></div> | ||
| 273 | + <div class="qs-partScore"></div> | ||
| 274 | + <div class="qs-options"></div> | ||
| 275 | + <div class="qs-set"></div> | ||
| 276 | + </li> | ||
| 277 | + </ul> | ||
| 278 | + </div> | ||
| 279 | + <div class="add-box"> | ||
| 280 | + <p class="add-question" @click="openQuestion"> | ||
| 281 | + <el-button | ||
| 282 | + size="mini" | ||
| 283 | + type="primary" | ||
| 284 | + icon="el-icon-plus" | ||
| 285 | + circle | ||
| 286 | + ></el-button> | ||
| 287 | + <span class="s1">添加大题</span> | ||
| 288 | + </p> | ||
| 289 | + </div> | ||
| 290 | + <div class="btn-box"> | ||
| 291 | + <el-button type="danger" plain round @click="linkBack" | ||
| 292 | + >取消</el-button | ||
| 293 | + > | ||
| 294 | + <el-button round @click="step = 0">上一步</el-button> | ||
| 295 | + <el-button type="primary" round @click="setStep2">下一步</el-button> | ||
| 296 | + </div> | ||
| 297 | + <el-dialog | ||
| 298 | + title="添加大题" | ||
| 299 | + :visible.sync="addQuestionVisible" | ||
| 300 | + width="600px" | ||
| 301 | + > | ||
| 302 | + <div class="dia-content"> | ||
| 303 | + <el-form | ||
| 304 | + ref="form" | ||
| 305 | + :model="questionForm" | ||
| 306 | + :rules="questionFormRules" | ||
| 307 | + label-width="100px" | ||
| 308 | + > | ||
| 309 | + <el-form-item label="标题:" prop="questionTitle"> | ||
| 310 | + <el-col :span="12"> | ||
| 311 | + <el-input | ||
| 312 | + v-model.trim="questionForm.questionTitle" | ||
| 313 | + maxlength="30" | ||
| 314 | + placeholder="输入大题名称" | ||
| 315 | + ></el-input> | ||
| 316 | + </el-col> | ||
| 317 | + </el-form-item> | ||
| 318 | + <el-form-item label="选择题型:"> | ||
| 319 | + <el-select v-model="questionForm.questionType" placeholder=""> | ||
| 320 | + <el-option | ||
| 321 | + v-for="item in questionOptions" | ||
| 322 | + :key="item.value" | ||
| 323 | + :label="item.label" | ||
| 324 | + :value="item.value" | ||
| 325 | + > | ||
| 326 | + </el-option> | ||
| 327 | + </el-select> | ||
| 328 | + </el-form-item> | ||
| 329 | + <el-form-item label="默认题数:"> | ||
| 330 | + <el-input-number | ||
| 331 | + v-model="questionForm.number" | ||
| 332 | + :min="1" | ||
| 333 | + :max="50" | ||
| 334 | + label="label" | ||
| 335 | + ></el-input-number> | ||
| 336 | + </el-form-item> | ||
| 337 | + </el-form> | ||
| 338 | + </div> | ||
| 339 | + <div class="dialog-footer" slot="footer"> | ||
| 340 | + <el-button type="primary" @click="addQuestion">确 定</el-button> | ||
| 341 | + <el-button @click="addQuestionVisible = false">取 消</el-button> | ||
| 342 | + </div> | ||
| 343 | + </el-dialog> | ||
| 344 | + </div> | ||
| 345 | + <div v-show="step == 2"> | ||
| 346 | + <div v-for="(question, index) in form.questionList" :key="index"> | ||
| 347 | + <p class="question-title"> | ||
| 348 | + <span>{{ setBigNum(index) }}、</span> | ||
| 349 | + <span class="title-txt">{{ question.questionTitle }}</span> | ||
| 350 | + <span>共 {{ setScore(question) }} 分</span> | ||
| 351 | + </p> | ||
| 352 | + <ul class="questions-ul"> | ||
| 353 | + <li class="sub-questions"> | ||
| 354 | + <div class="qs-num">题号</div> | ||
| 355 | + <div class="qs-score">分数</div> | ||
| 356 | + <div class="qs-options qs-options2">选项设置</div> | ||
| 357 | + </li> | ||
| 358 | + <li | ||
| 359 | + class="sub-questions" | ||
| 360 | + v-for="(subQuestions, indexs) in question.subQuestions" | ||
| 361 | + :key="indexs" | ||
| 362 | + > | ||
| 363 | + <div class="qs-num">{{ setNum(index, indexs) }}</div> | ||
| 364 | + <div class="qs-type"> | ||
| 365 | + {{ setSubPro(subQuestions.questionType) }} | ||
| 366 | + </div> | ||
| 367 | + <div class="qs-score"> | ||
| 368 | + <el-input-number | ||
| 369 | + class="number-ipt" | ||
| 370 | + size="medium" | ||
| 371 | + :min="1" | ||
| 372 | + :max="200" | ||
| 373 | + :precision="2" | ||
| 374 | + v-model="subQuestions.score" | ||
| 375 | + label="单题分值" | ||
| 376 | + ></el-input-number> | ||
| 377 | + </div> | ||
| 378 | + <div class="qs-options qs-options2"> | ||
| 379 | + <p v-if="subQuestions.questionType == 5">--</p> | ||
| 380 | + <p v-if="subQuestions.questionType == 4" class="answer-box"> | ||
| 381 | + <span | ||
| 382 | + class="answer-s" | ||
| 383 | + :class="subQuestions.correctAnswer == 1 ? 'active' : ''" | ||
| 384 | + @click="subQuestions.correctAnswer = 1" | ||
| 385 | + >✓</span | ||
| 386 | + > | ||
| 387 | + <span | ||
| 388 | + class="answer-s" | ||
| 389 | + :class="subQuestions.correctAnswer == 2 ? 'active' : ''" | ||
| 390 | + @click="subQuestions.correctAnswer = 2" | ||
| 391 | + >✗</span | ||
| 392 | + > | ||
| 393 | + </p> | ||
| 394 | + <p v-if="subQuestions.questionType == 3" class="answer-box"> | ||
| 395 | + <span | ||
| 396 | + class="answer-s" | ||
| 397 | + v-for="option in subQuestions.answerOptions" | ||
| 398 | + :class=" | ||
| 399 | + subQuestions.correctAnswer.includes(option) | ||
| 400 | + ? 'active' | ||
| 401 | + : '' | ||
| 402 | + " | ||
| 403 | + :key="option" | ||
| 404 | + @click="changAnswer(subQuestions, option)" | ||
| 405 | + >{{ option }}</span | ||
| 406 | + > | ||
| 407 | + </p> | ||
| 408 | + <p v-if="subQuestions.questionType == 2" class="answer-box"> | ||
| 409 | + <span | ||
| 410 | + class="answer-s" | ||
| 411 | + v-for="option in subQuestions.answerOptions" | ||
| 412 | + :class=" | ||
| 413 | + subQuestions.correctAnswer == option ? 'active' : '' | ||
| 414 | + " | ||
| 415 | + :key="option" | ||
| 416 | + @click="subQuestions.correctAnswer = option" | ||
| 417 | + >{{ option }}</span | ||
| 418 | + > | ||
| 419 | + </p> | ||
| 420 | + </div> | ||
| 421 | + </li> | ||
| 422 | + </ul> | ||
| 423 | + </div> | ||
| 424 | + <div class="btn-box"> | ||
| 425 | + <el-button type="danger" plain round @click="linkBack" | ||
| 426 | + >取消</el-button | ||
| 427 | + > | ||
| 428 | + <el-button round @click="step = 1">上一步</el-button> | ||
| 429 | + <el-button type="primary" round @click="save">保存</el-button> | ||
| 430 | + </div> | ||
| 431 | + </div> | ||
| 432 | + </div> | ||
| 433 | + </div> | ||
| 3 | </template> | 434 | </template> |
| 4 | 435 | ||
| 5 | <script> | 436 | <script> |
| 437 | +const questionForm = { | ||
| 438 | + questionTitle: "", | ||
| 439 | + questionType: 2, | ||
| 440 | + number: 10, | ||
| 441 | +}; | ||
| 442 | +const subQuesOptions = { | ||
| 443 | + questionType: 2, | ||
| 444 | + score: 1, | ||
| 445 | + partScore: 0, | ||
| 446 | + selectNum: 4, | ||
| 447 | + answerOptions: ["A", "B", "C", "D"], | ||
| 448 | + correctAnswer: "", | ||
| 449 | +}; | ||
| 6 | export default { | 450 | export default { |
| 451 | + data() { | ||
| 452 | + return { | ||
| 453 | + type: 1, //1-创建,2-复制答题卡 | ||
| 454 | + dialogVisible: false, //测验类型设置弹窗 | ||
| 455 | + addQuestionVisible: false, //添加大题弹窗 | ||
| 456 | + questionForm: { ...questionForm }, | ||
| 457 | + questionFormRules: { | ||
| 458 | + questionTitle: [ | ||
| 459 | + { required: true, message: "请输入答题卡名称", trigger: "blur" }, | ||
| 460 | + { | ||
| 461 | + min: 1, | ||
| 462 | + max: 30, | ||
| 463 | + message: "长度在 1 到 30 个字符", | ||
| 464 | + trigger: "blur", | ||
| 465 | + }, | ||
| 466 | + ], | ||
| 467 | + }, | ||
| 468 | + questionOptions: [ | ||
| 469 | + { label: "单选题", value: 2 }, | ||
| 470 | + { label: "多选题", value: 3 }, | ||
| 471 | + { label: "判断题", value: 4 }, | ||
| 472 | + { label: "主观题", value: 5 }, | ||
| 473 | + ], | ||
| 474 | + rightOptions: ["A", "B", "C", "D", "E", "F", "G"], | ||
| 475 | + addSubQuestionsType: "", | ||
| 476 | + step: 0, //步骤 | ||
| 477 | + gradeList: [], //年级 | ||
| 478 | + subjectList: [], //科目 | ||
| 479 | + answerTypeList: [], //测验类型 | ||
| 480 | + answerTypeName: [], //测验类型名称 | ||
| 481 | + form: { | ||
| 482 | + //答题卡详情 | ||
| 483 | + title: "", | ||
| 484 | + tag: "", | ||
| 485 | + subjectId: "", | ||
| 486 | + examsDuration: 0, | ||
| 487 | + gradeName: "", | ||
| 488 | + share: 1, | ||
| 489 | + questionList: [], | ||
| 490 | + }, | ||
| 491 | + formRules: { | ||
| 492 | + //答题卡验证 | ||
| 493 | + title: [ | ||
| 494 | + { required: true, message: "请输入答题卡名称", trigger: "blur" }, | ||
| 495 | + { | ||
| 496 | + min: 1, | ||
| 497 | + max: 30, | ||
| 498 | + message: "长度在 1 到 30 个字符", | ||
| 499 | + trigger: "blur", | ||
| 500 | + }, | ||
| 501 | + ], | ||
| 502 | + gradeName: [{ required: true, message: "请选择年级", trigger: "blur" }], | ||
| 503 | + subjectId: [{ required: true, message: "请选择科目", trigger: "blur" }], | ||
| 504 | + examsDuration: [ | ||
| 505 | + { required: true, message: "请设置考试时长", trigger: "blur" }, | ||
| 506 | + ], | ||
| 507 | + }, | ||
| 508 | + }; | ||
| 509 | + }, | ||
| 510 | + created() { | ||
| 511 | + this.type = this.$route.query.type ? this.$route.query.type : 1; | ||
| 512 | + if (this.type == 2) { | ||
| 513 | + this.form = this.$route.query.form && JSON.parse(this.$route.query.form); | ||
| 514 | + console.log(this.form.examsDuration) | ||
| 515 | + this.form.examsDuration = Number(this.form.examsDuration)/60 | ||
| 516 | + } | ||
| 517 | + }, | ||
| 518 | + methods: { | ||
| 519 | + linkBack() { | ||
| 520 | + this.$confirm( | ||
| 521 | + (this.type == 2 ? "修改复制的" : "组建的") + | ||
| 522 | + "答题卡未保存,确认退出吗?", | ||
| 523 | + "提示", | ||
| 524 | + { | ||
| 525 | + confirmButtonText: "取消", | ||
| 526 | + cancelButtonText: "确定", | ||
| 527 | + confirmButtonClass: "el-button--danger1", | ||
| 528 | + cancelButtonClass: "el-button--primary", | ||
| 529 | + showClose: false, | ||
| 530 | + roundButton: true, | ||
| 531 | + center: true, | ||
| 532 | + type: "warning", | ||
| 533 | + } | ||
| 534 | + ) | ||
| 535 | + .then(() => {}) | ||
| 536 | + .catch(() => { | ||
| 537 | + this.$router.push({ | ||
| 538 | + path: "/examinationPaper", | ||
| 539 | + }); | ||
| 540 | + }); | ||
| 541 | + }, | ||
| 542 | + setSubPro(type) { | ||
| 543 | + let tit; | ||
| 544 | + switch (type) { | ||
| 545 | + case 2: | ||
| 546 | + tit = "单选题"; | ||
| 547 | + break; | ||
| 548 | + case 3: | ||
| 549 | + tit = "多选题"; | ||
| 550 | + break; | ||
| 551 | + case 4: | ||
| 552 | + tit = "判断题"; | ||
| 553 | + break; | ||
| 554 | + case 5: | ||
| 555 | + tit = "主观题"; | ||
| 556 | + break; | ||
| 557 | + } | ||
| 558 | + return tit; | ||
| 559 | + }, | ||
| 560 | + setNum(index, indexs) { | ||
| 561 | + let lengths = 0; | ||
| 562 | + for (let i = 0; i < index; i++) { | ||
| 563 | + lengths += this.form.questionList[i].subQuestions.length; | ||
| 564 | + } | ||
| 565 | + return lengths + indexs + 1; | ||
| 566 | + }, | ||
| 567 | + setBigNum(num) { | ||
| 568 | + let txt = ""; | ||
| 569 | + let bigNum = [ | ||
| 570 | + "一", | ||
| 571 | + "二", | ||
| 572 | + "三", | ||
| 573 | + "四", | ||
| 574 | + "五", | ||
| 575 | + "六", | ||
| 576 | + "七", | ||
| 577 | + "八", | ||
| 578 | + "九", | ||
| 579 | + "十", | ||
| 580 | + "十一", | ||
| 581 | + "十二", | ||
| 582 | + "十三", | ||
| 583 | + "十四", | ||
| 584 | + "十五", | ||
| 585 | + "十六", | ||
| 586 | + "十七", | ||
| 587 | + "十八", | ||
| 588 | + "十九", | ||
| 589 | + "二十", | ||
| 590 | + ]; | ||
| 591 | + txt = bigNum[num]; | ||
| 7 | 592 | ||
| 8 | -} | ||
| 9 | -</script> | 593 | + return txt; |
| 594 | + }, | ||
| 595 | + setAddIndex(index) {}, | ||
| 596 | + setStep1() { | ||
| 597 | + this.$refs["forms"].validate((valid) => { | ||
| 598 | + // 验证通过:保存 | ||
| 599 | + if (valid) { | ||
| 600 | + this.step = 1; | ||
| 601 | + } else { | ||
| 602 | + this.$message.error("数据有误,请检查!"); | ||
| 603 | + return false; | ||
| 604 | + } | ||
| 605 | + }); | ||
| 606 | + }, | ||
| 607 | + setStep2() { | ||
| 608 | + let valid = true; | ||
| 609 | + this.form.questionList.map((item) => { | ||
| 610 | + if (!item.questionTitle) { | ||
| 611 | + valid = false; | ||
| 612 | + } | ||
| 613 | + }); | ||
| 614 | + if (valid) { | ||
| 615 | + this.step = 2; | ||
| 616 | + } else { | ||
| 617 | + this.$message.error("大题名称不能为空,请检查!"); | ||
| 618 | + } | ||
| 619 | + }, | ||
| 620 | + openQuestion() { | ||
| 621 | + this.questionForm = { ...questionForm }; | ||
| 622 | + this.addQuestionVisible = true; | ||
| 623 | + }, | ||
| 624 | + addQuestion() { | ||
| 625 | + let subQuestions = []; | ||
| 626 | + let questionsOptions = { | ||
| 627 | + ...subQuesOptions, | ||
| 628 | + questionType: this.questionForm.questionType, | ||
| 629 | + }; | ||
| 630 | + switch (questionsOptions.questionType) { | ||
| 631 | + case 2: | ||
| 632 | + questionsOptions.answerOptions = this.rightOptions.slice( | ||
| 633 | + 0, | ||
| 634 | + questionsOptions.selectNum | ||
| 635 | + ); | ||
| 636 | + break; | ||
| 637 | + case 3: | ||
| 638 | + questionsOptions.answerOptions = this.rightOptions.slice( | ||
| 639 | + 0, | ||
| 640 | + questionsOptions.selectNum | ||
| 641 | + ); | ||
| 642 | + questionsOptions.partScore = 0.5; | ||
| 643 | + break; | ||
| 644 | + case 4: | ||
| 645 | + case 5: | ||
| 646 | + questionsOptions.selectNum = 0; | ||
| 647 | + break; | ||
| 648 | + } | ||
| 649 | + for (let i = 0; i < this.questionForm.number; i++) { | ||
| 650 | + subQuestions.push({ ...questionsOptions }); | ||
| 651 | + } | ||
| 652 | + this.form.questionList.push({ | ||
| 653 | + questionTitle: this.questionForm.questionTitle, | ||
| 654 | + number: this.questionForm.number, | ||
| 655 | + source: 10, | ||
| 656 | + subQuestions: [...subQuestions], | ||
| 657 | + }); | ||
| 658 | + this.addQuestionVisible = false; | ||
| 659 | + }, | ||
| 660 | + delTabData(subIndex, index) { | ||
| 661 | + //删除小题 | ||
| 662 | + console.log(subIndex); | ||
| 663 | + console.log(index); | ||
| 664 | + this.form.questionList[index].subQuestions.splice(subIndex, 1); | ||
| 665 | + }, | ||
| 666 | + setScore(question) { | ||
| 667 | + let score = question.subQuestions.reduce((a, b) => { | ||
| 668 | + return a + b.score; | ||
| 669 | + }, 0); | ||
| 670 | + return score; | ||
| 671 | + }, | ||
| 672 | + changeAddSubQuestions(val, question) { | ||
| 673 | + if (val) { | ||
| 674 | + let questionsOptions = { | ||
| 675 | + ...subQuesOptions, | ||
| 676 | + questionType: val, | ||
| 677 | + }; | ||
| 678 | + switch (questionsOptions.questionType) { | ||
| 679 | + case 2: | ||
| 680 | + questionsOptions.answerOptions = this.rightOptions.slice( | ||
| 681 | + 0, | ||
| 682 | + questionsOptions.selectNum | ||
| 683 | + ); | ||
| 684 | + break; | ||
| 685 | + case 3: | ||
| 686 | + questionsOptions.answerOptions = this.rightOptions.slice( | ||
| 687 | + 0, | ||
| 688 | + questionsOptions.selectNum | ||
| 689 | + ); | ||
| 690 | + questionsOptions.partScore = 0.5; | ||
| 691 | + break; | ||
| 692 | + case 4: | ||
| 693 | + case 5: | ||
| 694 | + questionsOptions.selectNum = 0; | ||
| 695 | + break; | ||
| 696 | + } | ||
| 697 | + question.subQuestions.push(questionsOptions); | ||
| 698 | + this.addSubQuestionsType = ""; | ||
| 699 | + } | ||
| 700 | + }, | ||
| 701 | + changeSubQuestions(val, subQuestions) { | ||
| 702 | + //切换多题型-小题题型 | ||
| 703 | + const that = this; | ||
| 704 | + subQuestions.score = 1; | ||
| 705 | + subQuestions.partScore = 0; | ||
| 706 | + subQuestions.correctAnswer = ""; | ||
| 707 | + subQuestions.selectNum = 4; | ||
| 708 | + switch (val) { | ||
| 709 | + case 2: | ||
| 710 | + subQuestions.answerOptions = that.rightOptions.slice( | ||
| 711 | + 0, | ||
| 712 | + subQuestions.selectNum | ||
| 713 | + ); | ||
| 714 | + break; | ||
| 715 | + case 3: | ||
| 716 | + subQuestions.answerOptions = that.rightOptions.slice( | ||
| 717 | + 0, | ||
| 718 | + subQuestions.selectNum | ||
| 719 | + ); | ||
| 720 | + subQuestions.partScore = 0.5; | ||
| 721 | + break; | ||
| 722 | + case 4: | ||
| 723 | + case 5: | ||
| 724 | + subQuestions.selectNum = 0; | ||
| 725 | + break; | ||
| 726 | + } | ||
| 727 | + }, | ||
| 728 | + addOptions(subQuestions) { | ||
| 729 | + //添加选项 | ||
| 730 | + let length = subQuestions.answerOptions.length; | ||
| 731 | + if (length > 6) return; | ||
| 732 | + subQuestions.selectNum = length + 1; | ||
| 733 | + subQuestions.answerOptions = this.rightOptions.slice( | ||
| 734 | + 0, | ||
| 735 | + subQuestions.selectNum | ||
| 736 | + ); | ||
| 737 | + }, | ||
| 738 | + removeOptions(subQuestions) { | ||
| 739 | + //删除选项 | ||
| 740 | + let length = subQuestions.answerOptions.length; | ||
| 741 | + if (length < 2) return; | ||
| 742 | + subQuestions.selectNum = length - 1; | ||
| 743 | + subQuestions.answerOptions = this.rightOptions.slice( | ||
| 744 | + 0, | ||
| 745 | + subQuestions.selectNum | ||
| 746 | + ); | ||
| 747 | + }, | ||
| 748 | + changAnswer(sub, option) { | ||
| 749 | + //设置多选答案 | ||
| 750 | + let str = new RegExp(option, "g"); | ||
| 751 | + if (sub.correctAnswer?.includes(option)) { | ||
| 752 | + sub.correctAnswer = sub.correctAnswer.replace(str, ""); | ||
| 753 | + } else { | ||
| 754 | + let arrs = (sub.correctAnswer && sub.correctAnswer.split("")) || []; | ||
| 755 | + arrs.push(option); | ||
| 756 | + sub.correctAnswer = arrs.sort().join(""); | ||
| 757 | + } | ||
| 758 | + }, | ||
| 759 | + async addAnswerTypeName() { | ||
| 760 | + //保存测验类型 | ||
| 761 | + if (!this.answerTypeName) { | ||
| 762 | + this.$message.error("请填写测验名称!"); | ||
| 763 | + return; | ||
| 764 | + } | ||
| 765 | + //添加测验类型 | ||
| 766 | + const { data, code, message } = await this.$request.addAnswerTypeName({ | ||
| 767 | + typeName: this.answerTypeName, | ||
| 768 | + }); | ||
| 769 | + if (code == 0) { | ||
| 770 | + this._CreatedTypeList(); | ||
| 771 | + this.dialogVisible = false; | ||
| 772 | + this.answerTypeName = ""; | ||
| 773 | + this.$message.success("添加成功"); | ||
| 774 | + } else { | ||
| 775 | + this.$message.error(message); | ||
| 776 | + } | ||
| 777 | + }, | ||
| 778 | + async save() { | ||
| 779 | + if (this.saceLoading) return; | ||
| 780 | + this.saceLoading = true; | ||
| 781 | + const { data, code, message } = await this.$request.saveAnswerSheet({ | ||
| 782 | + ...this.form, | ||
| 783 | + }); | ||
| 784 | + this.saceLoading = false; | ||
| 785 | + if (code == 0) { | ||
| 786 | + this.$router.push({ | ||
| 787 | + path:"/examinationPaper" | ||
| 788 | + }) | ||
| 789 | + } else { | ||
| 790 | + this.$message.error(message); | ||
| 791 | + } | ||
| 792 | + }, | ||
| 793 | + async changeGrade() { | ||
| 794 | + //切换年级查询科目 | ||
| 795 | + this._QuerySubjectList(this.form.gradeName); | ||
| 796 | + }, | ||
| 797 | + async _CreatedTypeList() { | ||
| 798 | + //测验类型查询 | ||
| 799 | + const { data, code, message } = await this.$request.fetchTypeNames(); | ||
| 800 | + if (code == 0) { | ||
| 801 | + this.answerTypeList = [...data.list] || []; | ||
| 802 | + this.answerTypeList.unshift({ | ||
| 803 | + typeName: "--", | ||
| 804 | + id: "", | ||
| 805 | + }); | ||
| 806 | + if (this.type != 2) { | ||
| 807 | + this.form.tag = this.answerTypeList[0].id || ""; | ||
| 808 | + } | ||
| 809 | + } else { | ||
| 810 | + this.$message.error(message); | ||
| 811 | + } | ||
| 812 | + }, | ||
| 813 | + async _GradeList() { | ||
| 814 | + //查询年级列表 | ||
| 815 | + const { data, code, message } = await this.$request.fetchGradeList(); | ||
| 816 | + if (code == 0) { | ||
| 817 | + this.gradeList = [...data.gradeNames] || []; | ||
| 818 | + if (this.type != 2) { | ||
| 819 | + this.form.gradeName = this.gradeList[0]; | ||
| 820 | + } | ||
| 821 | + this._QuerySubjectList(this.gradeList[0]); | ||
| 822 | + } else { | ||
| 823 | + this.$message.error(message); | ||
| 824 | + } | ||
| 825 | + }, | ||
| 826 | + async _QuerySubjectList(grade, dont) { | ||
| 827 | + //查询科目列表 | ||
| 828 | + let param = {}; | ||
| 829 | + if (grade) { | ||
| 830 | + param.gradeName = grade; | ||
| 831 | + } | ||
| 832 | + const { data, code, message } = await this.$request.fetchSubjectList( | ||
| 833 | + param | ||
| 834 | + ); | ||
| 835 | + if (code === 0) { | ||
| 836 | + this.subjectList = data.list.map((item) => { | ||
| 837 | + return { | ||
| 838 | + value: item.subjectId, | ||
| 839 | + label: item.subjectName, | ||
| 840 | + }; | ||
| 841 | + }); | ||
| 842 | + if (this.subjectList.length > 1) { | ||
| 843 | + let isTeachingCourse = false; | ||
| 844 | + this.subjectList.map((item) => { | ||
| 845 | + if (item.isTeachingCourse) { | ||
| 846 | + isTeachingCourse = true; | ||
| 847 | + } | ||
| 848 | + }); | ||
| 849 | + if (this.type != 2) { | ||
| 850 | + !isTeachingCourse && !dont | ||
| 851 | + ? (this.form.subjectId = this.subjectList[0].value) | ||
| 852 | + : ""; | ||
| 853 | + } | ||
| 854 | + } | ||
| 855 | + if (this.subjectList.length > 0 && !dont) { | ||
| 856 | + this.form.subjectId = this.subjectList[0].value; | ||
| 857 | + } | ||
| 858 | + } else { | ||
| 859 | + this.$message.error(message); | ||
| 860 | + } | ||
| 861 | + }, | ||
| 10 | 862 | ||
| 11 | -<style> | 863 | + |
| 864 | + }, | ||
| 865 | +}; | ||
| 866 | +</script> | ||
| 12 | 867 | ||
| 868 | +<style lang="scss" scoped> | ||
| 869 | +.red { | ||
| 870 | + color: #f30; | ||
| 871 | +} | ||
| 872 | +.content { | ||
| 873 | + width: 100%; | ||
| 874 | + box-sizing: border-box; | ||
| 875 | + padding: 0 50px; | ||
| 876 | + .ml-20 { | ||
| 877 | + margin-left: 20px; | ||
| 878 | + } | ||
| 879 | + .btn-box { | ||
| 880 | + text-align: right; | ||
| 881 | + margin-left: 140px; | ||
| 882 | + } | ||
| 883 | +} | ||
| 884 | +.dia-content { | ||
| 885 | + .dia-tit { | ||
| 886 | + font-size: 20px; | ||
| 887 | + color: #333; | ||
| 888 | + font-weight: 700; | ||
| 889 | + text-align: center; | ||
| 890 | + } | ||
| 891 | + .add-type { | ||
| 892 | + display: flex; | ||
| 893 | + } | ||
| 894 | + .add-btn { | ||
| 895 | + margin-left: 20px; | ||
| 896 | + } | ||
| 897 | +} | ||
| 898 | +.el-message-box { | ||
| 899 | + :deep(.el-button--default) { | ||
| 900 | + color: #fff; | ||
| 901 | + } | ||
| 902 | +} | ||
| 903 | +.add-box { | ||
| 904 | + display: flex; | ||
| 905 | + justify-content: center; | ||
| 906 | + align-items: center; | ||
| 907 | + .add-question { | ||
| 908 | + display: flex; | ||
| 909 | + justify-content: center; | ||
| 910 | + align-items: center; | ||
| 911 | + font-size: 16px; | ||
| 912 | + font-weight: bolder; | ||
| 913 | + padding: 2px; | ||
| 914 | + cursor: pointer; | ||
| 915 | + .s1 { | ||
| 916 | + margin-left: 6px; | ||
| 917 | + } | ||
| 918 | + :deep(.el-icon-plus) { | ||
| 919 | + font-size: 24px; | ||
| 920 | + font-weight: 900; | ||
| 921 | + } | ||
| 922 | + :deep(.el-button--mini.is-circle) { | ||
| 923 | + padding: 3px; | ||
| 924 | + } | ||
| 925 | + } | ||
| 926 | +} | ||
| 927 | +.dialog-footer { | ||
| 928 | + text-align: center; | ||
| 929 | + :deep(.el-button) { | ||
| 930 | + border-radius: 20px; | ||
| 931 | + padding: 8px 20px 7px; | ||
| 932 | + margin: 0 12px; | ||
| 933 | + } | ||
| 934 | +} | ||
| 935 | +.question-title { | ||
| 936 | + line-height: 40px; | ||
| 937 | + .ipt { | ||
| 938 | + width: 300px; | ||
| 939 | + margin: 0 16px 0 10px; | ||
| 940 | + :deep(.el-input__inner) { | ||
| 941 | + border-radius: 20px; | ||
| 942 | + border-color: #667ffd; | ||
| 943 | + background: rgba($color: #667ffd, $alpha: 0.05); | ||
| 944 | + } | ||
| 945 | + } | ||
| 946 | + .delete { | ||
| 947 | + margin-right: 8px; | ||
| 948 | + } | ||
| 949 | + .title-txt { | ||
| 950 | + margin-right: 20px; | ||
| 951 | + font-size: 16px; | ||
| 952 | + font-weight: 700; | ||
| 953 | + } | ||
| 954 | +} | ||
| 955 | +.el-input-number { | ||
| 956 | + width: 140px; | ||
| 957 | +} | ||
| 958 | +.answer-box { | ||
| 959 | + .answer-s { | ||
| 960 | + display: inline-block; | ||
| 961 | + width: 30px; | ||
| 962 | + height: 30px; | ||
| 963 | + border: 1px solid #e2e2e2; | ||
| 964 | + border-radius: 3px; | ||
| 965 | + margin: 0 6px; | ||
| 966 | + font-size: 16px; | ||
| 967 | + color: #333; | ||
| 968 | + text-align: center; | ||
| 969 | + line-height: 30px; | ||
| 970 | + &.active { | ||
| 971 | + background: #5e78fa; | ||
| 972 | + border-color: #5e78fa; | ||
| 973 | + color: #fff; | ||
| 974 | + } | ||
| 975 | + } | ||
| 976 | +} | ||
| 977 | +.questions-ul { | ||
| 978 | + border-left: 1px solid #e2e2e2; | ||
| 979 | + border-top: 1px solid #e2e2e2; | ||
| 980 | + margin: 12px 0; | ||
| 981 | +} | ||
| 982 | +.sub-questions { | ||
| 983 | + width: 100%; | ||
| 984 | + display: flex; | ||
| 985 | + border-bottom: 1px solid #e2e2e2; | ||
| 986 | + & > div { | ||
| 987 | + min-height: 40px; | ||
| 988 | + padding: 5px; | ||
| 989 | + flex-shrink: 0; | ||
| 990 | + border-right: 1px solid #e2e2e2; | ||
| 991 | + display: flex; | ||
| 992 | + justify-content: center; | ||
| 993 | + align-items: center; | ||
| 994 | + } | ||
| 995 | + .qs-num { | ||
| 996 | + width: 80px; | ||
| 997 | + } | ||
| 998 | + .qs-type { | ||
| 999 | + width: 160px; | ||
| 1000 | + } | ||
| 1001 | + .qs-score, | ||
| 1002 | + .qs-partScore { | ||
| 1003 | + width: 160px; | ||
| 1004 | + } | ||
| 1005 | + .qs-options { | ||
| 1006 | + flex: 1; | ||
| 1007 | + } | ||
| 1008 | + .qs-set { | ||
| 1009 | + width: 80px; | ||
| 1010 | + } | ||
| 1011 | + .qs-options2 { | ||
| 1012 | + text-align: left; | ||
| 1013 | + justify-content: flex-start; | ||
| 1014 | + padding-left: 20px; | ||
| 1015 | + .answer-s { | ||
| 1016 | + cursor: pointer; | ||
| 1017 | + } | ||
| 1018 | + } | ||
| 1019 | + :deep(.el-select) { | ||
| 1020 | + .el-input__inner { | ||
| 1021 | + border-radius: 20px; | ||
| 1022 | + border-color: #667ffd; | ||
| 1023 | + width: 150px; | ||
| 1024 | + height: 32px; | ||
| 1025 | + line-height: 32px; | ||
| 1026 | + background: rgba($color: #667ffd, $alpha: 0.05); | ||
| 1027 | + } | ||
| 1028 | + .el-input__icon { | ||
| 1029 | + line-height: 32px; | ||
| 1030 | + } | ||
| 1031 | + } | ||
| 1032 | +} | ||
| 13 | </style> | 1033 | </style> |
| 14 | \ No newline at end of file | 1034 | \ No newline at end of file |
src/views/examinationPaper/edit.vue
| @@ -5,12 +5,349 @@ | @@ -5,12 +5,349 @@ | ||
| 5 | <span>修改答案</span> | 5 | <span>修改答案</span> |
| 6 | </template> | 6 | </template> |
| 7 | </back-box> | 7 | </back-box> |
| 8 | + <div class="content"> | ||
| 9 | + <p class="tips"> | ||
| 10 | + <i class="fa fa-bell-o"></i> 2022-11-24 14:30张老师修改了答案。 | ||
| 11 | + </p> | ||
| 12 | + <div class="answer-title"> | ||
| 13 | + <p class="name">{{ form.title }}</p> | ||
| 14 | + <p class="totals">卷面总分:{{ allScore }}分</p> | ||
| 15 | + </div> | ||
| 16 | + <div v-for="(question, index) in form.questionList" :key="index"> | ||
| 17 | + <p class="question-title"> | ||
| 18 | + <span>{{ setBigNum(index) }}、</span> | ||
| 19 | + <el-input | ||
| 20 | + class="ipt" | ||
| 21 | + v-model.trim="question.questionTitle" | ||
| 22 | + placeholder="填写大题名称" | ||
| 23 | + ></el-input> | ||
| 24 | + <span>共 {{ setScore(question) }} 分</span> | ||
| 25 | + </p> | ||
| 26 | + <ul class="questions-ul"> | ||
| 27 | + <li class="sub-questions"> | ||
| 28 | + <div class="qs-num">题号</div> | ||
| 29 | + <div class="qs-score">分数</div> | ||
| 30 | + <div class="qs-options qs-options2">选项设置</div> | ||
| 31 | + </li> | ||
| 32 | + <li | ||
| 33 | + class="sub-questions" | ||
| 34 | + v-for="(subQuestions, indexs) in question.subQuestions" | ||
| 35 | + :key="indexs" | ||
| 36 | + > | ||
| 37 | + <div class="qs-num">{{ subQuestions.questionIndex }}</div> | ||
| 38 | + <div class="qs-type"> | ||
| 39 | + {{ setSubPro(subQuestions.questionType) }} | ||
| 40 | + </div> | ||
| 41 | + <div class="qs-score"> | ||
| 42 | + <el-input-number | ||
| 43 | + class="number-ipt" | ||
| 44 | + size="medium" | ||
| 45 | + :min="1" | ||
| 46 | + :max="200" | ||
| 47 | + :precision="2" | ||
| 48 | + v-model="subQuestions.score" | ||
| 49 | + label="单题分值" | ||
| 50 | + ></el-input-number> | ||
| 51 | + </div> | ||
| 52 | + <div class="qs-options qs-options2"> | ||
| 53 | + <p v-if="subQuestions.questionType == 5">--</p> | ||
| 54 | + <p v-if="subQuestions.questionType == 4" class="answer-box"> | ||
| 55 | + <span | ||
| 56 | + class="answer-s" | ||
| 57 | + :class="subQuestions.correctAnswer == 1 ? 'active' : ''" | ||
| 58 | + @click="subQuestions.correctAnswer = 1" | ||
| 59 | + >✓</span | ||
| 60 | + > | ||
| 61 | + <span | ||
| 62 | + class="answer-s" | ||
| 63 | + :class="subQuestions.correctAnswer == 2 ? 'active' : ''" | ||
| 64 | + @click="subQuestions.correctAnswer = 2" | ||
| 65 | + >✗</span | ||
| 66 | + > | ||
| 67 | + </p> | ||
| 68 | + <p v-if="subQuestions.questionType == 3" class="answer-box"> | ||
| 69 | + <span | ||
| 70 | + class="answer-s" | ||
| 71 | + v-for="option in subQuestions.answerOptions" | ||
| 72 | + :class=" | ||
| 73 | + subQuestions.correctAnswer.includes(option) ? 'active' : '' | ||
| 74 | + " | ||
| 75 | + :key="option" | ||
| 76 | + @click="changAnswer(subQuestions, option)" | ||
| 77 | + >{{ option }}</span | ||
| 78 | + > | ||
| 79 | + </p> | ||
| 80 | + <p v-if="subQuestions.questionType == 2" class="answer-box"> | ||
| 81 | + <span | ||
| 82 | + class="answer-s" | ||
| 83 | + v-for="option in subQuestions.answerOptions" | ||
| 84 | + :class="subQuestions.correctAnswer == option ? 'active' : ''" | ||
| 85 | + :key="option" | ||
| 86 | + @click="subQuestions.correctAnswer = option" | ||
| 87 | + >{{ option }}</span | ||
| 88 | + > | ||
| 89 | + </p> | ||
| 90 | + </div> | ||
| 91 | + </li> | ||
| 92 | + </ul> | ||
| 93 | + </div> | ||
| 94 | + <div class="btn-box"> | ||
| 95 | + <el-button type="danger" plain round @click="linkBack">取消</el-button> | ||
| 96 | + <el-button type="primary" round @click="save">保存</el-button> | ||
| 97 | + </div> | ||
| 98 | + </div> | ||
| 8 | </div> | 99 | </div> |
| 9 | </template> | 100 | </template> |
| 10 | 101 | ||
| 11 | <script> | 102 | <script> |
| 12 | -export default {}; | 103 | +export default { |
| 104 | + data() { | ||
| 105 | + return { | ||
| 106 | + form: { | ||
| 107 | + //答题卡详情 | ||
| 108 | + title: "", | ||
| 109 | + tag: "", | ||
| 110 | + subjectId: "", | ||
| 111 | + examsDuration: 90, | ||
| 112 | + gradeName: "", | ||
| 113 | + share: 1, | ||
| 114 | + questionList: [], | ||
| 115 | + }, | ||
| 116 | + }; | ||
| 117 | + }, | ||
| 118 | + computed: { | ||
| 119 | + allScore: function () { | ||
| 120 | + let score = 0; | ||
| 121 | + this.form.questionList.map((item) => { | ||
| 122 | + score += item.subQuestions.reduce((a, b) => { | ||
| 123 | + return a + Number(b.score); | ||
| 124 | + }, 0); | ||
| 125 | + }, 0); | ||
| 126 | + return Number(score).toFixed(2); | ||
| 127 | + }, | ||
| 128 | + }, | ||
| 129 | + created() { | ||
| 130 | + this.form = this.$route.query.form && JSON.parse(this.$route.query.form); | ||
| 131 | + }, | ||
| 132 | + methods: { | ||
| 133 | + linkBack() { | ||
| 134 | + this.$router.push({ | ||
| 135 | + path: "/examinationPaper", | ||
| 136 | + }); | ||
| 137 | + }, | ||
| 138 | + setSubPro(type) { | ||
| 139 | + let tit; | ||
| 140 | + switch (type) { | ||
| 141 | + case 2: | ||
| 142 | + tit = "单选题"; | ||
| 143 | + break; | ||
| 144 | + case 3: | ||
| 145 | + tit = "多选题"; | ||
| 146 | + break; | ||
| 147 | + case 4: | ||
| 148 | + tit = "判断题"; | ||
| 149 | + break; | ||
| 150 | + case 5: | ||
| 151 | + tit = "主观题"; | ||
| 152 | + break; | ||
| 153 | + } | ||
| 154 | + return tit; | ||
| 155 | + }, | ||
| 156 | + setBigNum(num) { | ||
| 157 | + let txt = ""; | ||
| 158 | + let bigNum = [ | ||
| 159 | + "一", | ||
| 160 | + "二", | ||
| 161 | + "三", | ||
| 162 | + "四", | ||
| 163 | + "五", | ||
| 164 | + "六", | ||
| 165 | + "七", | ||
| 166 | + "八", | ||
| 167 | + "九", | ||
| 168 | + "十", | ||
| 169 | + "十一", | ||
| 170 | + "十二", | ||
| 171 | + "十三", | ||
| 172 | + "十四", | ||
| 173 | + "十五", | ||
| 174 | + "十六", | ||
| 175 | + "十七", | ||
| 176 | + "十八", | ||
| 177 | + "十九", | ||
| 178 | + "二十", | ||
| 179 | + ]; | ||
| 180 | + txt = bigNum[num]; | ||
| 181 | + | ||
| 182 | + return txt; | ||
| 183 | + }, | ||
| 184 | + setScore(question) { | ||
| 185 | + let score = question.subQuestions.reduce((a, b) => { | ||
| 186 | + return a + b.score; | ||
| 187 | + }, 0); | ||
| 188 | + return score; | ||
| 189 | + }, | ||
| 190 | + changAnswer(sub, option) { | ||
| 191 | + //设置多选答案 | ||
| 192 | + let str = new RegExp(option, "g"); | ||
| 193 | + if (sub.correctAnswer?.includes(option)) { | ||
| 194 | + sub.correctAnswer = sub.correctAnswer.replace(str, ""); | ||
| 195 | + } else { | ||
| 196 | + let arrs = (sub.correctAnswer && sub.correctAnswer.split("")) || []; | ||
| 197 | + arrs.push(option); | ||
| 198 | + sub.correctAnswer = arrs.sort().join(""); | ||
| 199 | + } | ||
| 200 | + }, | ||
| 201 | + save(){ | ||
| 202 | + //删除答题卡 | ||
| 203 | + // const { data, code, message } = await this.$request.updateAnswerSheet({...this.form}); | ||
| 204 | + // if (code == 0) { | ||
| 205 | + this.$router.push({ | ||
| 206 | + path:"/examinationPaper" | ||
| 207 | + }) | ||
| 208 | + // } else { | ||
| 209 | + // this.$message.error(message); | ||
| 210 | + // } | ||
| 211 | + } | ||
| 212 | + }, | ||
| 213 | +}; | ||
| 13 | </script> | 214 | </script> |
| 14 | 215 | ||
| 15 | -<style> | 216 | +<style lang="scss" scoped> |
| 217 | +.content { | ||
| 218 | + width: 100%; | ||
| 219 | + box-sizing: border-box; | ||
| 220 | + padding: 0 50px; | ||
| 221 | + .ml-20 { | ||
| 222 | + margin-left: 20px; | ||
| 223 | + } | ||
| 224 | + .btn-box { | ||
| 225 | + text-align: right; | ||
| 226 | + margin-left: 140px; | ||
| 227 | + } | ||
| 228 | + .tips { | ||
| 229 | + height: 48px; | ||
| 230 | + line-height: 48px; | ||
| 231 | + padding: 0 16px; | ||
| 232 | + border: 1px solid #fac7cc; | ||
| 233 | + background-color: #ffebec; | ||
| 234 | + font-size: 14px; | ||
| 235 | + color: #fd9795; | ||
| 236 | + margin: 10px 0 20px 0; | ||
| 237 | + .fa-bell-o { | ||
| 238 | + font-size: 18px; | ||
| 239 | + margin-right: 5px; | ||
| 240 | + } | ||
| 241 | + } | ||
| 242 | +} | ||
| 243 | +.answer-title { | ||
| 244 | + text-align: center; | ||
| 245 | + font-size: 20px; | ||
| 246 | + color: #333; | ||
| 247 | + font-weight: 700; | ||
| 248 | + padding: 20px 0 0 0; | ||
| 249 | + .totals { | ||
| 250 | + font-size: 16px; | ||
| 251 | + color: #888; | ||
| 252 | + font-weight: normal; | ||
| 253 | + } | ||
| 254 | +} | ||
| 255 | +.question-title { | ||
| 256 | + line-height: 40px; | ||
| 257 | + .ipt { | ||
| 258 | + width: 300px; | ||
| 259 | + margin: 0 16px 0 10px; | ||
| 260 | + :deep(.el-input__inner) { | ||
| 261 | + border-radius: 20px; | ||
| 262 | + border-color: #667ffd; | ||
| 263 | + background: rgba($color: #667ffd, $alpha: 0.05); | ||
| 264 | + } | ||
| 265 | + } | ||
| 266 | + .delete { | ||
| 267 | + margin-right: 8px; | ||
| 268 | + } | ||
| 269 | + .title-txt { | ||
| 270 | + margin-right: 20px; | ||
| 271 | + font-size: 16px; | ||
| 272 | + font-weight: 700; | ||
| 273 | + } | ||
| 274 | +} | ||
| 275 | +.el-input-number { | ||
| 276 | + width: 140px; | ||
| 277 | +} | ||
| 278 | +.answer-box { | ||
| 279 | + .answer-s { | ||
| 280 | + display: inline-block; | ||
| 281 | + width: 30px; | ||
| 282 | + height: 30px; | ||
| 283 | + border: 1px solid #e2e2e2; | ||
| 284 | + border-radius: 3px; | ||
| 285 | + margin: 0 6px; | ||
| 286 | + font-size: 16px; | ||
| 287 | + color: #333; | ||
| 288 | + text-align: center; | ||
| 289 | + line-height: 30px; | ||
| 290 | + &.active { | ||
| 291 | + background: #5e78fa; | ||
| 292 | + border-color: #5e78fa; | ||
| 293 | + color: #fff; | ||
| 294 | + } | ||
| 295 | + } | ||
| 296 | +} | ||
| 297 | +.questions-ul { | ||
| 298 | + border-left: 1px solid #e2e2e2; | ||
| 299 | + border-top: 1px solid #e2e2e2; | ||
| 300 | + margin: 12px 0; | ||
| 301 | +} | ||
| 302 | +.sub-questions { | ||
| 303 | + width: 100%; | ||
| 304 | + display: flex; | ||
| 305 | + border-bottom: 1px solid #e2e2e2; | ||
| 306 | + & > div { | ||
| 307 | + min-height: 40px; | ||
| 308 | + padding: 5px; | ||
| 309 | + flex-shrink: 0; | ||
| 310 | + border-right: 1px solid #e2e2e2; | ||
| 311 | + display: flex; | ||
| 312 | + justify-content: center; | ||
| 313 | + align-items: center; | ||
| 314 | + } | ||
| 315 | + .qs-num { | ||
| 316 | + width: 80px; | ||
| 317 | + } | ||
| 318 | + .qs-type { | ||
| 319 | + width: 160px; | ||
| 320 | + } | ||
| 321 | + .qs-score, | ||
| 322 | + .qs-partScore { | ||
| 323 | + width: 160px; | ||
| 324 | + } | ||
| 325 | + .qs-options { | ||
| 326 | + flex: 1; | ||
| 327 | + } | ||
| 328 | + .qs-set { | ||
| 329 | + width: 80px; | ||
| 330 | + } | ||
| 331 | + .qs-options2 { | ||
| 332 | + text-align: left; | ||
| 333 | + justify-content: flex-start; | ||
| 334 | + padding-left: 20px; | ||
| 335 | + .answer-s { | ||
| 336 | + cursor: pointer; | ||
| 337 | + } | ||
| 338 | + } | ||
| 339 | + :deep(.el-select) { | ||
| 340 | + .el-input__inner { | ||
| 341 | + border-radius: 20px; | ||
| 342 | + border-color: #667ffd; | ||
| 343 | + width: 150px; | ||
| 344 | + height: 32px; | ||
| 345 | + line-height: 32px; | ||
| 346 | + background: rgba($color: #667ffd, $alpha: 0.05); | ||
| 347 | + } | ||
| 348 | + .el-input__icon { | ||
| 349 | + line-height: 32px; | ||
| 350 | + } | ||
| 351 | + } | ||
| 352 | +} | ||
| 16 | </style> | 353 | </style> |
| 17 | \ No newline at end of file | 354 | \ No newline at end of file |
src/views/examinationPaper/index.vue
| @@ -11,7 +11,7 @@ | @@ -11,7 +11,7 @@ | ||
| 11 | icon="el-icon-plus" | 11 | icon="el-icon-plus" |
| 12 | plain | 12 | plain |
| 13 | circle | 13 | circle |
| 14 | - @click="toAdd" | 14 | + @click="toAdd({})" |
| 15 | ></el-button> | 15 | ></el-button> |
| 16 | </el-tooltip> | 16 | </el-tooltip> |
| 17 | </template> | 17 | </template> |
| @@ -201,6 +201,27 @@ export default { | @@ -201,6 +201,27 @@ export default { | ||
| 201 | teacher: "张老师", | 201 | teacher: "张老师", |
| 202 | date: "2022-11-04 18:09:49", | 202 | date: "2022-11-04 18:09:49", |
| 203 | share: 1, | 203 | share: 1, |
| 204 | + score: 100, | ||
| 205 | + gradeName:"二年级", | ||
| 206 | + subjectId:1, | ||
| 207 | + examsDuration:4800, | ||
| 208 | + questionList: [ | ||
| 209 | + { | ||
| 210 | + questionTitle: "f", | ||
| 211 | + score: 1, | ||
| 212 | + subQuestions: [ | ||
| 213 | + { | ||
| 214 | + questionIndex: 1, | ||
| 215 | + questionType: 2, | ||
| 216 | + score: 1, | ||
| 217 | + partScore: 0, | ||
| 218 | + selectNum: 4, | ||
| 219 | + answerOptions: ["A", "B", "C", "D"], | ||
| 220 | + correctAnswer: "B", | ||
| 221 | + }, | ||
| 222 | + ], | ||
| 223 | + }, | ||
| 224 | + ], | ||
| 204 | }, | 225 | }, |
| 205 | { | 226 | { |
| 206 | title: "数学样例试卷202211-4180949", | 227 | title: "数学样例试卷202211-4180949", |
| @@ -212,6 +233,27 @@ export default { | @@ -212,6 +233,27 @@ export default { | ||
| 212 | teacher: "张老师", | 233 | teacher: "张老师", |
| 213 | date: "2022-11-04 18:09:49", | 234 | date: "2022-11-04 18:09:49", |
| 214 | share: 1, | 235 | share: 1, |
| 236 | + score: 100, | ||
| 237 | + gradeName:"二年级", | ||
| 238 | + subjectId:1, | ||
| 239 | + examsDuration:3000, | ||
| 240 | + questionList: [ | ||
| 241 | + { | ||
| 242 | + questionTitle: "f", | ||
| 243 | + score: 1, | ||
| 244 | + subQuestions: [ | ||
| 245 | + { | ||
| 246 | + questionIndex: 2, | ||
| 247 | + questionType: 3, | ||
| 248 | + score: 1, | ||
| 249 | + partScore: 0, | ||
| 250 | + selectNum: 4, | ||
| 251 | + answerOptions: ["A", "B", "C", "D"], | ||
| 252 | + correctAnswer: "A,C", | ||
| 253 | + }, | ||
| 254 | + ], | ||
| 255 | + }, | ||
| 256 | + ], | ||
| 215 | }, | 257 | }, |
| 216 | ], | 258 | ], |
| 217 | shareForm: { | 259 | shareForm: { |
| @@ -226,25 +268,27 @@ export default { | @@ -226,25 +268,27 @@ export default { | ||
| 226 | }, | 268 | }, |
| 227 | methods: { | 269 | methods: { |
| 228 | toAdd(query) { | 270 | toAdd(query) { |
| 229 | - this.$router.push({ | 271 | + let routerItem = { |
| 230 | path: "/examinationPaperAdd", | 272 | path: "/examinationPaperAdd", |
| 231 | - query:query&&{...query} | ||
| 232 | - }); | 273 | + }; |
| 274 | + query ? (routerItem["query"] = { ...query }) : ""; | ||
| 275 | + this.$router.push(routerItem); | ||
| 233 | }, | 276 | }, |
| 234 | toEdit(item) { | 277 | toEdit(item) { |
| 235 | this.$router.push({ | 278 | this.$router.push({ |
| 236 | path: "/examinationPaperEdit", | 279 | path: "/examinationPaperEdit", |
| 237 | query: { | 280 | query: { |
| 238 | - id: item.id, | 281 | + form: JSON.stringify(item), |
| 239 | }, | 282 | }, |
| 240 | }); | 283 | }); |
| 241 | }, | 284 | }, |
| 242 | - handleDropdownClick(value, item) {//更多 | 285 | + handleDropdownClick(value, item) { |
| 286 | + //更多 | ||
| 243 | const that = this; | 287 | const that = this; |
| 244 | switch (value) { | 288 | switch (value) { |
| 245 | case 1: | 289 | case 1: |
| 246 | //授课端同步 | 290 | //授课端同步 |
| 247 | - that.syncMeg(item) | 291 | + that.syncMeg(item); |
| 248 | break; | 292 | break; |
| 249 | case 2: | 293 | case 2: |
| 250 | //修改分享范围 | 294 | //修改分享范围 |
| @@ -255,15 +299,16 @@ export default { | @@ -255,15 +299,16 @@ export default { | ||
| 255 | break; | 299 | break; |
| 256 | case 3: | 300 | case 3: |
| 257 | //复制 | 301 | //复制 |
| 258 | - that.toAdd() | 302 | + that.toAdd({ type: 2, form: JSON.stringify(item), }); |
| 259 | break; | 303 | break; |
| 260 | case 4: | 304 | case 4: |
| 261 | //归档 | 305 | //归档 |
| 262 | - that.recovery(item) | 306 | + that.recovery(item); |
| 263 | break; | 307 | break; |
| 264 | } | 308 | } |
| 265 | }, | 309 | }, |
| 266 | - async syncMeg() {//同步 | 310 | + async syncMeg() { |
| 311 | + //同步 | ||
| 267 | // const { data, code, message } = await this.$request.fetchAnswerList({ | 312 | // const { data, code, message } = await this.$request.fetchAnswerList({ |
| 268 | // ...this.shareForm, | 313 | // ...this.shareForm, |
| 269 | // }); | 314 | // }); |
| @@ -274,7 +319,8 @@ export default { | @@ -274,7 +319,8 @@ export default { | ||
| 274 | // this.$message.error(message); | 319 | // this.$message.error(message); |
| 275 | // } | 320 | // } |
| 276 | }, | 321 | }, |
| 277 | - async saveShare() {//修改分享范围 | 322 | + async saveShare() { |
| 323 | + //修改分享范围 | ||
| 278 | // const { data, code, message } = await this.$request.fetchAnswerList({ | 324 | // const { data, code, message } = await this.$request.fetchAnswerList({ |
| 279 | // ...this.shareForm, | 325 | // ...this.shareForm, |
| 280 | // }); | 326 | // }); |
| @@ -288,20 +334,22 @@ export default { | @@ -288,20 +334,22 @@ export default { | ||
| 288 | // this.$message.error(message); | 334 | // this.$message.error(message); |
| 289 | // } | 335 | // } |
| 290 | }, | 336 | }, |
| 291 | - async recovery(item) {//归档 | 337 | + async recovery(item) { |
| 338 | + //归档 | ||
| 292 | // const { data, code, message } = await this.$request.fetchAnswerList({ | 339 | // const { data, code, message } = await this.$request.fetchAnswerList({ |
| 293 | // ...this.shareForm, | 340 | // ...this.shareForm, |
| 294 | // }); | 341 | // }); |
| 295 | // if (code === 0) { | 342 | // if (code === 0) { |
| 296 | - this.tableData = this.tableData.filter(items=>{ | ||
| 297 | - return items.id != item.id | ||
| 298 | - }) | 343 | + this.tableData = this.tableData.filter((items) => { |
| 344 | + return items.id != item.id; | ||
| 345 | + }); | ||
| 299 | // } else { | 346 | // } else { |
| 300 | // this.$message.error(message); | 347 | // this.$message.error(message); |
| 301 | // } | 348 | // } |
| 302 | }, | 349 | }, |
| 303 | 350 | ||
| 304 | - async changClazz() {//切换班级 | 351 | + async changClazz() { |
| 352 | + //切换班级 | ||
| 305 | await this._QuerySubjectList(); | 353 | await this._QuerySubjectList(); |
| 306 | this._QueryData(); | 354 | this._QueryData(); |
| 307 | }, | 355 | }, |
| @@ -348,7 +396,8 @@ export default { | @@ -348,7 +396,8 @@ export default { | ||
| 348 | this.$message.error(message); | 396 | this.$message.error(message); |
| 349 | } | 397 | } |
| 350 | }, | 398 | }, |
| 351 | - async _QueryData(type) {//获取答题卡列表 | 399 | + async _QueryData(type) { |
| 400 | + //获取答题卡列表 | ||
| 352 | let query = {}; | 401 | let query = {}; |
| 353 | if (!type) { | 402 | if (!type) { |
| 354 | this.query.title = ""; | 403 | this.query.title = ""; |
| @@ -387,73 +436,6 @@ export default { | @@ -387,73 +436,6 @@ export default { | ||
| 387 | </script> | 436 | </script> |
| 388 | 437 | ||
| 389 | <style scoped lang="scss"> | 438 | <style scoped lang="scss"> |
| 390 | -.answer-header { | ||
| 391 | - padding: 16px 40px 12px 20px; | ||
| 392 | - display: flex; | ||
| 393 | - justify-content: space-between; | ||
| 394 | - align-items: center; | ||
| 395 | - .btn-box { | ||
| 396 | - display: flex; | ||
| 397 | - } | ||
| 398 | -} | ||
| 399 | -.sel-box { | ||
| 400 | - display: flex; | ||
| 401 | - align-items: center; | ||
| 402 | - flex-wrap: nowrap; | ||
| 403 | - .sel { | ||
| 404 | - width: 8%; | ||
| 405 | - min-width: 90px; | ||
| 406 | - margin-right: 20px; | ||
| 407 | - } | ||
| 408 | - :deep(.el-input__inner) { | ||
| 409 | - border-radius: 20px; | ||
| 410 | - border: 1px solid #e2e2e2; | ||
| 411 | - height: 36px; | ||
| 412 | - line-height: 34px; | ||
| 413 | - } | ||
| 414 | - :deep(.el-input__icon) { | ||
| 415 | - line-height: 34px; | ||
| 416 | - } | ||
| 417 | - :deep(.el-date-editor.el-input), | ||
| 418 | - :deep(.el-date-editor.el-input__inner) { | ||
| 419 | - width: 200px; | ||
| 420 | - } | ||
| 421 | - .input-with-select { | ||
| 422 | - width: 200px; | ||
| 423 | - height: 36px; | ||
| 424 | - margin-right: 50px; | ||
| 425 | - border-radius: 20px; | ||
| 426 | - border: 1px solid #e2e2e2; | ||
| 427 | - box-sizing: border-box; | ||
| 428 | - :deep(.el-input__inner) { | ||
| 429 | - border-radius: 20px; | ||
| 430 | - border: none; | ||
| 431 | - height: 34px; | ||
| 432 | - line-height: 34px; | ||
| 433 | - } | ||
| 434 | - :deep(.el-input-group__append, .el-input-group__prepend) { | ||
| 435 | - border: none; | ||
| 436 | - background: transparent; | ||
| 437 | - } | ||
| 438 | - } | ||
| 439 | - .d1 { | ||
| 440 | - margin-left: 30px; | ||
| 441 | - } | ||
| 442 | - .p1 { | ||
| 443 | - flex: 1; | ||
| 444 | - .s1 { | ||
| 445 | - margin-left: 36px; | ||
| 446 | - cursor: pointer; | ||
| 447 | - color: #7f7f7f; | ||
| 448 | - &:hover { | ||
| 449 | - color: #409eff; | ||
| 450 | - } | ||
| 451 | - &.active { | ||
| 452 | - color: #667ffd; | ||
| 453 | - } | ||
| 454 | - } | ||
| 455 | - } | ||
| 456 | -} | ||
| 457 | .tips { | 439 | .tips { |
| 458 | display: flex; | 440 | display: flex; |
| 459 | padding-left: 30px; | 441 | padding-left: 30px; |
src/views/examinationPaper/recycle.vue
| 1 | <template> | 1 | <template> |
| 2 | <div> | 2 | <div> |
| 3 | - <back-box> | 3 | + <back-box> |
| 4 | <template slot="title"> | 4 | <template slot="title"> |
| 5 | - <span>归档</span> | 5 | + <span>已归档答题卡</span> |
| 6 | </template> | 6 | </template> |
| 7 | </back-box> | 7 | </back-box> |
| 8 | + <div class="answer-header"> | ||
| 9 | + <div class="sel-box"> | ||
| 10 | + <el-select | ||
| 11 | + class="sel" | ||
| 12 | + v-model="query.gradeName" | ||
| 13 | + placeholder="" | ||
| 14 | + @change="changeGrade" | ||
| 15 | + > | ||
| 16 | + <el-option | ||
| 17 | + v-for="item in gradeList" | ||
| 18 | + :key="item" | ||
| 19 | + :label="item" | ||
| 20 | + :value="item" | ||
| 21 | + > | ||
| 22 | + </el-option> | ||
| 23 | + </el-select> | ||
| 24 | + <el-select | ||
| 25 | + class="sel" | ||
| 26 | + v-model="query.type" | ||
| 27 | + placeholder="选择类型" | ||
| 28 | + @change="_QueryData()" | ||
| 29 | + > | ||
| 30 | + <el-option label="全部" value=""></el-option> | ||
| 31 | + <el-option | ||
| 32 | + v-for="item in typeList" | ||
| 33 | + :key="item.value" | ||
| 34 | + :label="item.label" | ||
| 35 | + :value="item.value" | ||
| 36 | + >{{ item.label }} | ||
| 37 | + </el-option> | ||
| 38 | + </el-select> | ||
| 39 | + <el-select | ||
| 40 | + class="sel" | ||
| 41 | + v-model="query.subjectId" | ||
| 42 | + placeholder="选择科目" | ||
| 43 | + @change="_QueryData()" | ||
| 44 | + > | ||
| 45 | + <el-option label="全部" value=""></el-option> | ||
| 46 | + <el-option | ||
| 47 | + v-for="item in subjectList" | ||
| 48 | + :key="item.value" | ||
| 49 | + :label="item.label" | ||
| 50 | + :value="item.value" | ||
| 51 | + > | ||
| 52 | + </el-option> | ||
| 53 | + </el-select> | ||
| 54 | + <el-input | ||
| 55 | + placeholder="输入试卷名称" | ||
| 56 | + v-model="query.title" | ||
| 57 | + class="input-with-select" | ||
| 58 | + @keyup.enter.native="_QueryData(true)" | ||
| 59 | + > | ||
| 60 | + <el-button | ||
| 61 | + slot="append" | ||
| 62 | + icon="el-icon-search" | ||
| 63 | + @click="_QueryData(true)" | ||
| 64 | + ></el-button> | ||
| 65 | + </el-input> | ||
| 66 | + </div> | ||
| 67 | + </div> | ||
| 68 | + <ul class="content"> | ||
| 69 | + <li class="item" v-for="item in tableData" :key="item.id"> | ||
| 70 | + <div class="pic-box"> | ||
| 71 | + <p class="i-box"><i class="fa fa-map-o"></i></p> | ||
| 72 | + <p class="ids">{{ item.id }}</p> | ||
| 73 | + </div> | ||
| 74 | + <div class="info"> | ||
| 75 | + <p class="title"> | ||
| 76 | + {{ item.title }} <span class="label">{{ item.typeName }}</span> | ||
| 77 | + </p> | ||
| 78 | + <p class="num"> | ||
| 79 | + {{ item.gradeName }} | ||
| 80 | + <em class="s-line">|</em> | ||
| 81 | + 总题数:{{ item.answerNum }} | ||
| 82 | + <em class="s-line">|</em> | ||
| 83 | + 预计时长:{{ item.time }} | ||
| 84 | + <em class="s-line">|</em> | ||
| 85 | + </p> | ||
| 86 | + <p class="person"> | ||
| 87 | + {{ item.teacher }}<em class="s-line">|</em | ||
| 88 | + ><span class="date">{{ item.date }}</span> | ||
| 89 | + </p> | ||
| 90 | + </div> | ||
| 91 | + <div class="btn-box"> | ||
| 92 | + <el-tooltip effect="dark" content="使用" placement="bottom"> | ||
| 93 | + <el-button | ||
| 94 | + class="edit" | ||
| 95 | + type="info" | ||
| 96 | + size="mini" | ||
| 97 | + circle | ||
| 98 | + icon="fa fa-mail-reply" | ||
| 99 | + @click="have(item)" | ||
| 100 | + ></el-button> | ||
| 101 | + </el-tooltip> | ||
| 102 | + <el-popconfirm title="确定删除这张答题卡吗?" @confirm="remove(item)"> | ||
| 103 | + <el-button | ||
| 104 | + slot="reference" | ||
| 105 | + class="delete" | ||
| 106 | + type="info" | ||
| 107 | + size="mini" | ||
| 108 | + circle | ||
| 109 | + icon="el-icon-delete" | ||
| 110 | + ></el-button> | ||
| 111 | + </el-popconfirm> | ||
| 112 | + </div> | ||
| 113 | + </li> | ||
| 114 | + </ul> | ||
| 8 | </div> | 115 | </div> |
| 9 | </template> | 116 | </template> |
| 10 | 117 | ||
| 11 | <script> | 118 | <script> |
| 12 | export default { | 119 | export default { |
| 13 | - | ||
| 14 | -} | 120 | + data() { |
| 121 | + return { | ||
| 122 | + query: { | ||
| 123 | + gradeName: "二年级", | ||
| 124 | + type: "", | ||
| 125 | + subjectId: "", | ||
| 126 | + title: "", | ||
| 127 | + }, | ||
| 128 | + gradeList: ["二年级"], | ||
| 129 | + typeList: [ | ||
| 130 | + { label: "随堂问", value: 1 }, | ||
| 131 | + { label: "即使测", value: 2 }, | ||
| 132 | + ], | ||
| 133 | + subjectList: [], | ||
| 134 | + tableData: [ | ||
| 135 | + { | ||
| 136 | + title: "数学样例试卷202211-324654", | ||
| 137 | + id: "1062837", | ||
| 138 | + gradeName: "二年级", | ||
| 139 | + typeName: "周测", | ||
| 140 | + answerNum: 45, | ||
| 141 | + time: 90, | ||
| 142 | + aboutClazz: [203, 204], | ||
| 143 | + teacher: "张老师", | ||
| 144 | + date: "2022-11-04 18:09:49", | ||
| 145 | + share: 1, | ||
| 146 | + }, | ||
| 147 | + { | ||
| 148 | + title: "数学样例试卷202211-4180949", | ||
| 149 | + id: "1062838", | ||
| 150 | + gradeName: "二年级", | ||
| 151 | + typeName: "周测", | ||
| 152 | + answerNum: 45, | ||
| 153 | + time: 90, | ||
| 154 | + aboutClazz: [203, 204], | ||
| 155 | + teacher: "张老师", | ||
| 156 | + date: "2022-11-04 18:09:49", | ||
| 157 | + share: 1, | ||
| 158 | + }, | ||
| 159 | + ], | ||
| 160 | + total: 0, | ||
| 161 | + }; | ||
| 162 | + }, | ||
| 163 | + methods: { | ||
| 164 | + have(obj) { | ||
| 165 | + //删除答题卡 | ||
| 166 | + // const { data, code, message } = await this.$request.useAnswerSheet(); | ||
| 167 | + // if (code == 0) { | ||
| 168 | + this.tableData = this.tableData.filter(item=>{ | ||
| 169 | + return obj.if != item.id | ||
| 170 | + }) | ||
| 171 | + // } else { | ||
| 172 | + // this.$message.error(message); | ||
| 173 | + // } | ||
| 174 | + }, | ||
| 175 | + remove(obj) { | ||
| 176 | + //删除答题卡 | ||
| 177 | + // const { data, code, message } = await this.$request.removeAnswerSheet(); | ||
| 178 | + // if (code == 0) { | ||
| 179 | + this.tableData = this.tableData.filter(item=>{ | ||
| 180 | + return obj.if != item.id | ||
| 181 | + }) | ||
| 182 | + // } else { | ||
| 183 | + // this.$message.error(message); | ||
| 184 | + // } | ||
| 185 | + }, | ||
| 186 | + async _QueryData(type) { | ||
| 187 | + //获取答题卡列表 | ||
| 188 | + let query = {}; | ||
| 189 | + if (!type) { | ||
| 190 | + this.query.title = ""; | ||
| 191 | + query = { ...this.query }; | ||
| 192 | + } else { | ||
| 193 | + query = { title: this.query.title }; | ||
| 194 | + this.query.type = ""; | ||
| 195 | + this.query.subjectId = ""; | ||
| 196 | + } | ||
| 197 | + for (let key in query) { | ||
| 198 | + if (!query[key]) { | ||
| 199 | + query[key] = null; | ||
| 200 | + } | ||
| 201 | + } | ||
| 202 | + this.loading = true; | ||
| 203 | + const { data, code, message } = await this.$request.fetchAnswerList({ | ||
| 204 | + ...query, | ||
| 205 | + }); | ||
| 206 | + this.loading = false; | ||
| 207 | + if (code === 0) { | ||
| 208 | + this.total = data.total; | ||
| 209 | + this.tableData = (data.list && [...data.list]) || []; | ||
| 210 | + } else { | ||
| 211 | + this.$message.error(message); | ||
| 212 | + } | ||
| 213 | + }, | ||
| 214 | + async changeGrade() { | ||
| 215 | + this._QueryData(); | ||
| 216 | + this._GradeList(); | ||
| 217 | + this._QuerySubjectList(); | ||
| 218 | + }, | ||
| 219 | + async _GradeList() { | ||
| 220 | + //查询年级列表 | ||
| 221 | + const { data, code, message } = await this.$request.fetchGradeList(); | ||
| 222 | + if (code == 0) { | ||
| 223 | + this.gradeList = [...data.gradeNames] || []; | ||
| 224 | + this.query.gradeName = this.gradeList[0]; | ||
| 225 | + this._QuerySubjectList(this.gradeList[0]); | ||
| 226 | + } else { | ||
| 227 | + this.$message.error(message); | ||
| 228 | + } | ||
| 229 | + }, | ||
| 230 | + async _QuerySubjectList(grade, dont) { | ||
| 231 | + //查询科目列表 | ||
| 232 | + let param = {}; | ||
| 233 | + if (grade) { | ||
| 234 | + param.gradeName = grade; | ||
| 235 | + } | ||
| 236 | + const { data, code, message } = await this.$request.fetchSubjectList( | ||
| 237 | + param | ||
| 238 | + ); | ||
| 239 | + if (code === 0) { | ||
| 240 | + this.subjectList = data.list.map((item) => { | ||
| 241 | + return { | ||
| 242 | + value: item.subjectId, | ||
| 243 | + label: item.subjectName, | ||
| 244 | + }; | ||
| 245 | + }); | ||
| 246 | + } else { | ||
| 247 | + this.$message.error(message); | ||
| 248 | + } | ||
| 249 | + }, | ||
| 250 | + }, | ||
| 251 | +}; | ||
| 15 | </script> | 252 | </script> |
| 16 | 253 | ||
| 17 | -<style> | ||
| 18 | - | 254 | +<style lang="scss" scoped> |
| 255 | +.answer-header { | ||
| 256 | + .sel-box { | ||
| 257 | + .sel { | ||
| 258 | + min-width: 160px; | ||
| 259 | + } | ||
| 260 | + } | ||
| 261 | +} | ||
| 262 | +.content { | ||
| 263 | + margin: 0 20px; | ||
| 264 | + background: #f8f8f8; | ||
| 265 | + padding: 12px; | ||
| 266 | + border-radius: 20px; | ||
| 267 | + .item { | ||
| 268 | + display: flex; | ||
| 269 | + align-items: center; | ||
| 270 | + width: 100%; | ||
| 271 | + overflow: hidden; | ||
| 272 | + box-sizing: border-box; | ||
| 273 | + padding: 12px; | ||
| 274 | + border-radius: 20px; | ||
| 275 | + background: #fff; | ||
| 276 | + margin-bottom: 12px; | ||
| 277 | + &:last-of-type { | ||
| 278 | + margin-bottom: 0; | ||
| 279 | + } | ||
| 280 | + .pic-box { | ||
| 281 | + width: 80px; | ||
| 282 | + height: 80px; | ||
| 283 | + border-radius: 10px; | ||
| 284 | + margin-right: 10px; | ||
| 285 | + flex-shrink: 0; | ||
| 286 | + background: #d7d7d7; | ||
| 287 | + text-align: center; | ||
| 288 | + color: #fff; | ||
| 289 | + font-weight: 500; | ||
| 290 | + .i-box { | ||
| 291 | + padding-top: 10px; | ||
| 292 | + font-size: 32px; | ||
| 293 | + margin-bottom: 3px; | ||
| 294 | + } | ||
| 295 | + } | ||
| 296 | + .info { | ||
| 297 | + height: 80px; | ||
| 298 | + flex: 1; | ||
| 299 | + overflow: hidden; | ||
| 300 | + display: flex; | ||
| 301 | + flex-direction: column; | ||
| 302 | + justify-content: space-between; | ||
| 303 | + .s-line { | ||
| 304 | + padding: 0 5px; | ||
| 305 | + color: #e2e2e2; | ||
| 306 | + } | ||
| 307 | + .title { | ||
| 308 | + font-size: 16px; | ||
| 309 | + color: #222; | ||
| 310 | + font-weight: 500; | ||
| 311 | + .label { | ||
| 312 | + display: inline-block; | ||
| 313 | + font-size: 12px; | ||
| 314 | + color: #2e9afe; | ||
| 315 | + line-height: 16px; | ||
| 316 | + padding: 0 10px; | ||
| 317 | + border: 1px solid #2e9afe; | ||
| 318 | + border-radius: 10px; | ||
| 319 | + transform: translateY(-2px); | ||
| 320 | + } | ||
| 321 | + } | ||
| 322 | + .person { | ||
| 323 | + color: #666; | ||
| 324 | + } | ||
| 325 | + } | ||
| 326 | + .btn-box { | ||
| 327 | + flex-shrink: 0; | ||
| 328 | + .edit { | ||
| 329 | + margin-right: 12px; | ||
| 330 | + } | ||
| 331 | + } | ||
| 332 | + } | ||
| 333 | +} | ||
| 19 | </style> | 334 | </style> |
| 20 | \ No newline at end of file | 335 | \ No newline at end of file |
src/views/layout/header/header.vue
| @@ -126,7 +126,6 @@ export default { | @@ -126,7 +126,6 @@ export default { | ||
| 126 | }, | 126 | }, |
| 127 | handleCommand(command) { | 127 | handleCommand(command) { |
| 128 | //刷新权限跳转首页 | 128 | //刷新权限跳转首页 |
| 129 | - this.$message("click on item " + command); | ||
| 130 | this.$store.dispatch("permissions", this); | 129 | this.$store.dispatch("permissions", this); |
| 131 | }, | 130 | }, |
| 132 | logOut() { | 131 | logOut() { |
src/views/layout/layout.vue
| @@ -22,6 +22,7 @@ import layoutAside from "./aside/aside"; | @@ -22,6 +22,7 @@ import layoutAside from "./aside/aside"; | ||
| 22 | import layoutHeader from "./header/header"; | 22 | import layoutHeader from "./header/header"; |
| 23 | import Bottom from "./Footer/bottom"; | 23 | import Bottom from "./Footer/bottom"; |
| 24 | import langSelect from "../../components/lang/langSelect"; | 24 | import langSelect from "../../components/lang/langSelect"; |
| 25 | +import { getURLParams } from "@/utils"; | ||
| 25 | 26 | ||
| 26 | export default { | 27 | export default { |
| 27 | name: "layout", | 28 | name: "layout", |
| @@ -31,6 +32,39 @@ export default { | @@ -31,6 +32,39 @@ export default { | ||
| 31 | langSelect, | 32 | langSelect, |
| 32 | layoutAside, | 33 | layoutAside, |
| 33 | }, | 34 | }, |
| 35 | + data() { | ||
| 36 | + return { | ||
| 37 | + code: "", | ||
| 38 | + }; | ||
| 39 | + }, | ||
| 40 | + created() { | ||
| 41 | + this.code = getURLParams("code") || ""; | ||
| 42 | + if (this.code) { | ||
| 43 | + localStorage.setItem("code",this.code) | ||
| 44 | + this._LoginCheck(); | ||
| 45 | + } | ||
| 46 | + }, | ||
| 47 | + methods: { | ||
| 48 | + async _LoginCheck() { | ||
| 49 | + let params = {}; | ||
| 50 | + if (this.code) { | ||
| 51 | + params = { | ||
| 52 | + code: this.code, | ||
| 53 | + }; | ||
| 54 | + } | ||
| 55 | + const { data = {}, message, code } = await loginCheck(params); | ||
| 56 | + if (code === 0) { | ||
| 57 | + if (data) { | ||
| 58 | + this.school = data.schoolName; | ||
| 59 | + this.user.name = data.realName; | ||
| 60 | + this.user.id = data.id; | ||
| 61 | + this.user.tx = data.smallHeaderImgPath; | ||
| 62 | + } | ||
| 63 | + } else { | ||
| 64 | + this.$message.error(message); | ||
| 65 | + } | ||
| 66 | + }, | ||
| 67 | + }, | ||
| 34 | }; | 68 | }; |
| 35 | </script> | 69 | </script> |
| 36 | 70 | ||
| @@ -81,7 +115,7 @@ ul.el-menu { | @@ -81,7 +115,7 @@ ul.el-menu { | ||
| 81 | 115 | ||
| 82 | #elmain { | 116 | #elmain { |
| 83 | background-color: #fff; | 117 | background-color: #fff; |
| 84 | - padding:0; | 118 | + padding: 0; |
| 85 | } | 119 | } |
| 86 | 120 | ||
| 87 | .avatar-uploader .el-upload { | 121 | .avatar-uploader .el-upload { |
src/views/login/index.vue
| @@ -101,8 +101,12 @@ export default { | @@ -101,8 +101,12 @@ export default { | ||
| 101 | { required: true, message: "请输入账号密码",trigger: "blur" } | 101 | { required: true, message: "请输入账号密码",trigger: "blur" } |
| 102 | ] | 102 | ] |
| 103 | }, | 103 | }, |
| 104 | + url: "", | ||
| 104 | }; | 105 | }; |
| 105 | }, | 106 | }, |
| 107 | + created() { | ||
| 108 | + this.url = this.$route.query?.url || ""; | ||
| 109 | + }, | ||
| 106 | methods: { | 110 | methods: { |
| 107 | showPwd() { | 111 | showPwd() { |
| 108 | if (this.passwordType === "password") { | 112 | if (this.passwordType === "password") { |
| @@ -115,7 +119,6 @@ export default { | @@ -115,7 +119,6 @@ export default { | ||
| 115 | }); | 119 | }); |
| 116 | }, | 120 | }, |
| 117 | submitForm() { | 121 | submitForm() { |
| 118 | - let that = this; | ||
| 119 | if (this.loginForm.username === "" || this.loginForm.password === "") { | 122 | if (this.loginForm.username === "" || this.loginForm.password === "") { |
| 120 | this.$message({ | 123 | this.$message({ |
| 121 | showClose: true, | 124 | showClose: true, |
| @@ -124,7 +127,7 @@ export default { | @@ -124,7 +127,7 @@ export default { | ||
| 124 | }); | 127 | }); |
| 125 | return false; | 128 | return false; |
| 126 | } else { | 129 | } else { |
| 127 | - this.$store.dispatch("Login",this) | 130 | + this.$store.dispatch("Login",{...this.loginForm,url:this.url}) |
| 128 | } | 131 | } |
| 129 | }, | 132 | }, |
| 130 | }, | 133 | }, |