Commit d5987f6abf3096cca742d8315a75f9e954bf9a28

Authored by 阿宝
1 parent 75a5cc20

组件修改答案

src/components/setAnswer.vue 0 → 100644
  1 +<template>
  2 + <el-dialog :visible.sync="diaVisible" width="400" center>
  3 + <div slot="title">
  4 + <p>
  5 + <!-- 设置答案 <i class="fa fa-exchange" @click="editType = !editType"></i> -->
  6 + 设置答案
  7 + </p>
  8 + </div>
  9 + <div v-show="editType">
  10 + <div v-for="(item, index) in FormQuestionList" :key="index">
  11 + <template v-for="(subQuestions, indexs) in item.subQuestions">
  12 + <div
  13 + class="sub-questions"
  14 + :key="indexs"
  15 + v-if="subQuestions.correctAnswer"
  16 + >
  17 + <div class="qs-num">题{{ subQuestions.questionIndex }}</div>
  18 + <div class="qs-options qs-options2">
  19 + <p v-if="subQuestions.questionType == 4" class="answer-box">
  20 + <span
  21 + class="answer-s"
  22 + :class="subQuestions.correctAnswer == 1 ? 'active' : ''"
  23 + @click="subQuestions.correctAnswer = 1"
  24 + >✓</span
  25 + >
  26 + <span
  27 + class="answer-s"
  28 + :class="subQuestions.correctAnswer == 2 ? 'active' : ''"
  29 + @click="subQuestions.correctAnswer = 2"
  30 + >✗</span
  31 + >
  32 + </p>
  33 + <p v-if="subQuestions.questionType == 3" class="answer-box">
  34 + <span
  35 + class="answer-s"
  36 + v-for="option in subQuestions.answerOptions"
  37 + :class="
  38 + subQuestions.correctAnswer.includes(option) ? 'active' : ''
  39 + "
  40 + :key="option"
  41 + @click="changAnswer(subQuestions, option)"
  42 + >{{ option }}</span
  43 + >
  44 + </p>
  45 + <p v-if="subQuestions.questionType == 2" class="answer-box">
  46 + <span
  47 + class="answer-s"
  48 + v-for="option in subQuestions.answerOptions"
  49 + :class="subQuestions.correctAnswer == option ? 'active' : ''"
  50 + :key="option"
  51 + @click="subQuestions.correctAnswer = option"
  52 + >{{ option }}</span
  53 + >
  54 + </p>
  55 + </div>
  56 + </div>
  57 + </template>
  58 + </div>
  59 + </div>
  60 + <!-- <div v-show="!editType">
  61 + <p class="dia-tips">
  62 + 请点击选项按钮设置答案,多选题题目之间用“,”隔开,若添加5道题:“AC,AD,BD,AC,CD”
  63 + </p>
  64 + <div class="dia-question-box">
  65 + <div v-for="(item, index) in FormQuestionList2" :key="index">
  66 + <template v-for="(items, indexs) in item.subQuestions">
  67 + <div class="set-questions" :key="indexs">
  68 + <div class="qs-num">
  69 + <p>{{ items.name }}</p>
  70 + <p>共{{ items.list.length }}题</p>
  71 + </div>
  72 + <div class="qs-options">
  73 + <p class="ipt">
  74 + <el-input
  75 + v-model="items.answerList"
  76 + @keydown.native="keydownAnswer($event)"
  77 + ></el-input>
  78 + </p>
  79 + <p class="answer-box">
  80 + <template v-if="items.list[0].questionType == 4">
  81 + <span
  82 + class="answer-s active"
  83 + @click="
  84 + items.answerList.length < items.list.length
  85 + ? (items.answerList += '✓')
  86 + : ''
  87 + "
  88 + >✓</span
  89 + >
  90 + <span
  91 + class="answer-s active"
  92 + @click="
  93 + items.answerList.length < items.list.length
  94 + ? (items.answerList += '✗')
  95 + : ''
  96 + "
  97 + >✗</span
  98 + >
  99 + </template>
  100 + <template v-if="items.list[0].questionType == 3">
  101 + <span
  102 + class="answer-s active"
  103 + v-for="option in items.list[0].answerOptions"
  104 + :key="option"
  105 + @click="setAnswer(items,option)"
  106 + >{{ option }}</span
  107 + >
  108 + <span
  109 + class="answer-s active"
  110 + @click="
  111 + items.answerList.split(',').length < items.list.length
  112 + ? (items.answerList += ',')
  113 + : ''
  114 + "
  115 + >,</span
  116 + >
  117 + </template>
  118 + <template
  119 + v-if="items.list[0].questionType == 2"
  120 + class="answer-box"
  121 + >
  122 + <span
  123 + class="answer-s active"
  124 + v-for="option in items.list[0].answerOptions"
  125 + :key="option"
  126 + @click="
  127 + items.answerList.length < items.list.length
  128 + ? (items.answerList += option)
  129 + : ''
  130 + "
  131 + >{{ option }}</span
  132 + >
  133 + </template>
  134 + <span
  135 + class="answer-s delButton"
  136 + @click="items.answerList = items.answerList.slice(0, -1)"
  137 + >x</span
  138 + >
  139 + <span
  140 + class="answer-s ac"
  141 + @click="items.answerList = ''"
  142 + >AC</span
  143 + >
  144 + </p>
  145 + </div>
  146 + </div>
  147 + </template>
  148 + </div>
  149 + </div>
  150 + </div> -->
  151 + <div slot="footer">
  152 + <el-button class="dia-btn" type="primary" @click="saveAnswer"
  153 + >确 定</el-button
  154 + >
  155 + <el-button class="dia-btn" type="danger" @click="cancel">取 消</el-button>
  156 + </div>
  157 + </el-dialog>
  158 +</template>
  159 +
  160 +<script>
  161 +import { deepClone } from "utils";
  162 +export default {
  163 + name: "SetAnswer",
  164 + props: {
  165 + diaVisible: false, //修改答案
  166 + paperId: "",
  167 + questionList: Array,
  168 + },
  169 + data() {
  170 + return {
  171 + editType: true, //修改答案模式
  172 + FormQuestionList: [],
  173 + };
  174 + },
  175 + watch: {
  176 + questionList: {
  177 + handler: function () {
  178 + this.FormQuestionList = deepClone(this.questionList);
  179 + console.log(this.questionList);
  180 + //组合每道大题中的相同题目
  181 + // let questionList = deepClone(item.questionList);
  182 + // for (let i = 0; i < questionList.length; i++) {
  183 + // let jsons = {};
  184 + // let answerOptions = [];
  185 + // questionList[i].subQuestions.map((items) => {
  186 + // let txt = this.setSubPro(items.questionType);
  187 + // if (jsons[txt]) {
  188 + // jsons[txt].push(items);
  189 + // } else {
  190 + // jsons[txt] = [items];
  191 + // }
  192 + // if (items.questionType == 2 || items.questionType == 3) {
  193 + // if (items.answerOptions.length > answerOptions.length) {
  194 + // answerOptions = items.answerOptions;
  195 + // }
  196 + // jsons[txt][0].answerOptions = answerOptions;
  197 + // }
  198 + // });
  199 + // this.FormQuestionList2[i].subQuestions = Object.keys(jsons).map(
  200 + // (item) => {
  201 + // return {
  202 + // name: item,
  203 + // list: jsons[item],
  204 + // answerList: "",
  205 + // };
  206 + // }
  207 + // );
  208 + // }
  209 + },
  210 + deep: true,
  211 + },
  212 + },
  213 + methods: {
  214 + setSubPro(type) {
  215 + let tit;
  216 + switch (type) {
  217 + case 2:
  218 + tit = "单选题";
  219 + break;
  220 + case 3:
  221 + tit = "多选题";
  222 + break;
  223 + case 4:
  224 + tit = "判断题";
  225 + break;
  226 + case 5:
  227 + tit = "主观题";
  228 + break;
  229 + }
  230 + return tit;
  231 + },
  232 + keydownAnswer(event) {
  233 + //快速答案设置禁止输入
  234 + if (
  235 + event.key == "Meta" ||
  236 + event.key == "CapsLock" ||
  237 + event.key == "Shift" ||
  238 + event.key == "Enter" ||
  239 + event.key == "Alt" ||
  240 + event.key == "Backspace" ||
  241 + event.key == "Delete" ||
  242 + event.key == "ArrowUp" ||
  243 + event.key == "ArrowDown" ||
  244 + event.key == "ArrowLeft" ||
  245 + event.key == "v" ||
  246 + event.key == "V" ||
  247 + event.key == "ArrowRight"
  248 + ) {
  249 + return;
  250 + } else {
  251 + event.returnValue = "";
  252 + }
  253 + },
  254 + setAnswer(obj, answer) {
  255 + //多选答案设置
  256 + obj.answerList += answer;
  257 + let str = obj.answerList;
  258 + let str2 = checkAnswer(
  259 + str,
  260 + 3,
  261 + obj.list[0].answerOptions,
  262 + obj.list.length
  263 + );
  264 + obj.answerList = str2;
  265 + },
  266 + changAnswer(sub, option) {
  267 + //设置多选答案
  268 + let str = new RegExp(option, "g");
  269 + if (sub.correctAnswer?.includes(option)) {
  270 + sub.correctAnswer = sub.correctAnswer.replace(str, "");
  271 + } else {
  272 + let arrs = (sub.correctAnswer && sub.correctAnswer.split("")) || [];
  273 + arrs.push(option);
  274 + sub.correctAnswer = arrs.sort().join("");
  275 + }
  276 + },
  277 + async saveAnswer() {
  278 + const { data, status, message } = await this.$request.modifyPaper({
  279 + paperId: this.paperId,
  280 + questionList: questionList,
  281 + });
  282 + if (status == 0) {
  283 + this.$emit('saveSuccess')
  284 + } else {
  285 + this.$message.error(message);
  286 + }
  287 + },
  288 + cancel() {
  289 + this.$emit('cancel')
  290 + },
  291 + },
  292 +};
  293 +</script>
  294 +
  295 +<style lang="scss" scoped>
  296 +.sub-questions {
  297 + width: 100%;
  298 + display: flex;
  299 + &:hover {
  300 + background: #f8f8f8;
  301 + }
  302 + & > div {
  303 + min-height: 40px;
  304 + padding: 5px;
  305 + flex-shrink: 0;
  306 + display: flex;
  307 + justify-content: center;
  308 + align-items: center;
  309 + }
  310 + .qs-num {
  311 + width: 80px;
  312 + font-size: 16px;
  313 + color: #333;
  314 + font-weight: 500;
  315 + }
  316 + .qs-options {
  317 + flex: 1;
  318 + }
  319 + .qs-options2 {
  320 + text-align: left;
  321 + justify-content: flex-start;
  322 + padding-left: 20px;
  323 + .answer-s {
  324 + cursor: pointer;
  325 + border-color: #667ffd;
  326 + color: #667ffd;
  327 + margin: 0 15px;
  328 + &.active {
  329 + color: #fff;
  330 + }
  331 + }
  332 + }
  333 + :deep(.el-select) {
  334 + .el-input__inner {
  335 + border-radius: 20px;
  336 + border-color: #667ffd;
  337 + width: 150px;
  338 + height: 32px;
  339 + line-height: 32px;
  340 + background: rgba($color: #667ffd, $alpha: 0.05);
  341 + }
  342 + .el-input__icon {
  343 + line-height: 32px;
  344 + }
  345 + }
  346 +}
  347 +</style>
0 \ No newline at end of file 348 \ No newline at end of file
src/components/userForm/userInfo.vue deleted
1 -<template>  
2 - <el-dialog :title="title" width="800px" :visible.sync="visible" destroy-on-close @close="closeCallback">  
3 - <div class="card">  
4 - <p class="title"><i class="fa fa-th-large fa-lg"></i>个人资料</p>  
5 - <el-form :model="ruleForm2" status-icon :rules="rules" ref="ruleForm2" label-width="100px" class="demo-ruleForm">  
6 - <el-form-item label="用户名" prop="username">  
7 - <el-input v-model="ruleForm2.username" autocomplete="off"></el-input>  
8 - </el-form-item>  
9 - <el-form-item v-if="!userId" label="密码" prop="password">  
10 - <el-input type="password" v-model="ruleForm2.password" autocomplete="off"></el-input>  
11 - </el-form-item>  
12 - <el-form-item v-if="!userId" label="确认密码" prop="checkPass">  
13 - <el-input type="password" v-model="ruleForm2.checkPass" autocomplete="off"></el-input>  
14 - </el-form-item>  
15 - <el-form-item label="角色">  
16 - <el-select v-if="roleName" v-model="ruleForm2.roleId" disabled placeholder="请选择等级">  
17 - <el-option  
18 - v-for="item in roleData"  
19 - :key="item.id"  
20 - :label="item.name"  
21 - :value="item.id">  
22 - </el-option>  
23 - </el-select>  
24 - <el-select v-else v-model="ruleForm2.roleId" placeholder="请选择等级">  
25 - <el-option  
26 - v-for="item in roleData"  
27 - :key="item.id"  
28 - :label="item.name"  
29 - :value="item.id"  
30 - :disabled="item.disabled">  
31 - </el-option>  
32 - </el-select>  
33 - </el-form-item>  
34 - <el-form-item label="姓名" prop="name">  
35 - <el-input v-model="ruleForm2.name" autocomplete="off"></el-input>  
36 - </el-form-item>  
37 - <el-form-item label="性别">  
38 - <el-radio-group v-model="ruleForm2.sex">  
39 - <el-radio label="1">男</el-radio>  
40 - <el-radio label="2">女</el-radio>  
41 - </el-radio-group>  
42 - </el-form-item>  
43 - <el-form-item label="年龄" prop="age">  
44 - <el-input v-model="ruleForm2.age" autocomplete="off"></el-input>  
45 - </el-form-item>  
46 - <el-form-item label="手机号" prop="mobilePhone">  
47 - <el-input v-model="ruleForm2.mobilePhone" autocomplete="off"></el-input>  
48 - </el-form-item>  
49 - <el-form-item label="是否启用">  
50 - <el-switch v-model="ruleForm2.status"></el-switch>  
51 - </el-form-item>  
52 - <el-form-item label="头像上传">  
53 - <el-upload  
54 - class="avatar-uploader"  
55 - action="/api/editor/uploadImg"  
56 - :show-file-list="false"  
57 - :on-success="handleAvatarSuccess"  
58 - :before-upload="beforeAvatarUpload">  
59 - <img v-if="ruleForm2.avatar" :src="ruleForm2.avatar" class="avatar">  
60 - <i v-else class="el-icon-plus avatar-uploader-icon"></i>  
61 - </el-upload>  
62 - </el-form-item>  
63 - <el-form-item>  
64 - <el-button type="primary" @click="submitForm('ruleForm2')">确 定</el-button>  
65 - <el-button @click="resetForm('ruleForm2')">重 置</el-button>  
66 - </el-form-item>  
67 - </el-form>  
68 - </div>  
69 - </el-dialog>  
70 -</template>  
71 -  
72 -<script>  
73 -export default {  
74 - name: "userInfo",  
75 - props: {  
76 - title: {  
77 - type: String,  
78 - default: "账号信息"  
79 - },  
80 - dialogVisible: {  
81 - type: Boolean,  
82 - default: false  
83 - },  
84 - userId: {  
85 - type: String,  
86 - default: ""  
87 - }  
88 - },  
89 - data () {  
90 - var validatePass = (rule, value, callback) => {  
91 - if (value === "") {  
92 - callback(new Error("请输入密码"))  
93 - } else {  
94 - if (this.ruleForm2.checkPass !== "") {  
95 - this.$refs.ruleForm2.validateField("checkPass")  
96 - }  
97 - callback()  
98 - }  
99 - }  
100 - var validatePass2 = (rule, value, callback) => {  
101 - if (value === "") {  
102 - callback(new Error("请再次输入密码"))  
103 - } else if (value !== this.ruleForm2.password) {  
104 - callback(new Error("两次输入密码不一致!"))  
105 - } else {  
106 - callback()  
107 - }  
108 - }  
109 - return {  
110 - roleName: false,  
111 - roleData: "",  
112 - visible: this.dialogVisible,  
113 - ruleForm2: {  
114 - mobilePhone: "",  
115 - username: "",  
116 - password: "",  
117 - checkPass: "",  
118 - roleId: "",  
119 - status: "",  
120 - sex: "1",  
121 - age: 0,  
122 - name: "",  
123 - avatar: ""  
124 - },  
125 - rules: {  
126 - username: [  
127 - { required: true, message: "请输入用户名", trigger: "blur" },  
128 - { min: 3, max: 18, message: "长度在 3 到 18 个字符", trigger: "blur" }  
129 - ],  
130 - password: [  
131 - {required: true, validator: validatePass, trigger: "blur"}  
132 - ],  
133 - checkPass: [  
134 - {required: true, validator: validatePass2, trigger: "blur"}  
135 - ],  
136 - roleId: [  
137 - { required: true, message: "请选择用户角色", trigger: "change" }  
138 - ]  
139 - }  
140 - }  
141 - },  
142 - methods: {  
143 - handleAvatarSuccess (res, file) {  
144 - this.ruleForm2.avatar = res.data[0]  
145 - },  
146 - closeCallback () {  
147 - this.$emit("successCallback")  
148 - },  
149 - beforeAvatarUpload (file) {  
150 - const isJPG = file.type === "image/jpeg"  
151 - const isPNG = file.type === "image/png"  
152 - const isLt2M = file.size / 1024 / 1024 < 2  
153 -  
154 - if (!(isJPG || isPNG)) {  
155 - this.$message.error("上传头像图片只能是 JPG/PNG 格式!")  
156 - }  
157 - if (!isLt2M) {  
158 - this.$message.error("上传头像图片大小不能超过 2MB!")  
159 - }  
160 - // eslint-disable-next-line no-mixed-operators  
161 - return isLt2M && isJPG || isPNG  
162 - },  
163 - getList () {  
164 - let that = this  
165 - this.$request.fetchGetRoleList().then(function (response) {  
166 - that.roleData = response.data.rows  
167 - let userId = that.userId  
168 - if (!userId) {  
169 - return false  
170 - }  
171 - that.$request.fetchGetUserInfoId({id: userId})  
172 - .then(function (res) {  
173 - console.log(res)  
174 - res.data.password = ""  
175 - if (res.data.status === "1") {  
176 - res.data.status = true  
177 - } else {  
178 - res.data.status = false  
179 - }  
180 -  
181 - that.ruleForm2 = res.data  
182 - that.roleName = true  
183 - for (let i = 0; i < that.roleData.length; i++) {  
184 - if (that.$store.getters.info.role === "超级管理员" && that.$store.getters.info.uid !== userId) {  
185 - that.roleName = false  
186 - }  
187 - }  
188 - return false  
189 - })  
190 - .catch(function (error) {  
191 - console.log(error)  
192 - })  
193 - })  
194 - .catch(function (error) {  
195 - console.log(error)  
196 - })  
197 - },  
198 - submitForm (formName) {  
199 - let that = this  
200 - this.$refs[formName].validate((valid) => {  
201 - if (valid) {  
202 - let newData = {}  
203 - let fetchFn = this.$request.fetchEditUser  
204 - if (!that.userId) {  
205 - for (let item in that.ruleForm2) {  
206 - if (item !== "checkPass") {  
207 - newData[item] = that.ruleForm2[item]  
208 - }  
209 - }  
210 - fetchFn = this.$request.fetchRegister  
211 - } else {  
212 - for (let item in that.ruleForm2) {  
213 - if (item !== "password" && item !== "checkPass") {  
214 - newData[item] = that.ruleForm2[item]  
215 - }  
216 - }  
217 - }  
218 - fetchFn(newData).then((res) => {  
219 - that.$message({  
220 - showClose: true,  
221 - message: res.data.message,  
222 - type: "success"  
223 - })  
224 - }).catch((err) => {  
225 - console.log(err)  
226 - })  
227 - } else {  
228 - console.log("error submit!!")  
229 - return false  
230 - }  
231 - })  
232 - },  
233 - resetForm (formName) {  
234 - this.$refs[formName].resetFields()  
235 - }  
236 - },  
237 - mounted () {  
238 - // this.getList()  
239 - }  
240 -}  
241 -</script>  
242 -<style scoped>  
243 - .demo-ruleForm {  
244 - width: 460px;  
245 - padding-top: 25px;  
246 - }  
247 - .el-select {  
248 - width: 100%;  
249 - }  
250 - .card {  
251 - width: 560px;  
252 - padding-bottom: 15px;  
253 - margin: 0px auto;  
254 - }  
255 - .avatar-uploader .el-upload {  
256 - border: 1px dashed #d9d9d9;  
257 - border-radius: 6px;  
258 - cursor: pointer;  
259 - position: relative;  
260 - overflow: hidden;  
261 - }  
262 - .avatar-uploader .el-upload:hover {  
263 - border-color: #409EFF;  
264 - }  
265 - .avatar-uploader-icon {  
266 - font-size: 28px;  
267 - color: #8c939d;  
268 - width: 178px;  
269 - height: 178px;  
270 - line-height: 178px;  
271 - text-align: center;  
272 - }  
273 - .avatar {  
274 - width: 178px;  
275 - height: 178px;  
276 - display: block;  
277 - }  
278 -</style>  
src/views/ask/index.vue
@@ -9,8 +9,8 @@ @@ -9,8 +9,8 @@
9 <div class="sel-box"> 9 <div class="sel-box">
10 <el-select 10 <el-select
11 class="sel" 11 class="sel"
12 - v-model="query.clazzId"  
13 - placeholder="" 12 + v-model="query.classId"
  13 + placeholder="选择班级"
14 @change="changClazz" 14 @change="changClazz"
15 > 15 >
16 <el-option 16 <el-option
@@ -18,11 +18,11 @@ @@ -18,11 +18,11 @@
18 :key="item.value" 18 :key="item.value"
19 :label="item.label" 19 :label="item.label"
20 :value="item.value" 20 :value="item.value"
21 - >{{ item.label }} 21 + >
22 </el-option> 22 </el-option>
23 </el-select> 23 </el-select>
24 <el-select 24 <el-select
25 - v-if="role == '班主任'" 25 + v-if="role == 'ROLE_BANZHUREN'"
26 class="sel" 26 class="sel"
27 multiple 27 multiple
28 collapse-tags 28 collapse-tags
@@ -89,7 +89,7 @@ @@ -89,7 +89,7 @@
89 <div class="table-box"> 89 <div class="table-box">
90 <el-radio-group v-model="tabIndex" style="margin-bottom: 20px"> 90 <el-radio-group v-model="tabIndex" style="margin-bottom: 20px">
91 <el-radio-button :label="1">单课时报表</el-radio-button> 91 <el-radio-button :label="1">单课时报表</el-radio-button>
92 - <el-radio-button :label="2" v-if="this.role != '班主任'" 92 + <el-radio-button :label="2" v-if="this.role != 'ROLE_BANZHUREN'"
93 >阶段问答报表</el-radio-button 93 >阶段问答报表</el-radio-button
94 > 94 >
95 <el-radio-button :label="3">阶段互动报表</el-radio-button> 95 <el-radio-button :label="3">阶段互动报表</el-radio-button>
@@ -283,187 +283,23 @@ @@ -283,187 +283,23 @@
283 <el-button type="info" plain round icon="fa fa-cloud-download">导出报表</el-button> 283 <el-button type="info" plain round icon="fa fa-cloud-download">导出报表</el-button>
284 </p> 284 </p>
285 </div> 285 </div>
286 - <el-dialog :visible.sync="dialogVisible" width="400" center>  
287 - <div slot="title">  
288 - <p>  
289 - <!-- 设置答案 <i class="fa fa-exchange" @click="editType = !editType"></i> -->  
290 - 设置答案  
291 - </p>  
292 - </div>  
293 - <div v-show="editType">  
294 - <div v-for="(item, index) in form.questionList" :key="index">  
295 - <template v-for="(subQuestions, indexs) in item.subQuestions">  
296 - <div  
297 - class="sub-questions"  
298 - :key="indexs"  
299 - v-if="subQuestions.correctAnswer"  
300 - >  
301 - <div class="qs-num">题{{ subQuestions.questionIndex }}</div>  
302 - <div class="qs-options qs-options2">  
303 - <p v-if="subQuestions.questionType == 4" class="answer-box">  
304 - <span  
305 - class="answer-s"  
306 - :class="subQuestions.correctAnswer == 1 ? 'active' : ''"  
307 - @click="subQuestions.correctAnswer = 1"  
308 - >✓</span  
309 - >  
310 - <span  
311 - class="answer-s"  
312 - :class="subQuestions.correctAnswer == 2 ? 'active' : ''"  
313 - @click="subQuestions.correctAnswer = 2"  
314 - >✗</span  
315 - >  
316 - </p>  
317 - <p v-if="subQuestions.questionType == 3" class="answer-box">  
318 - <span  
319 - class="answer-s"  
320 - v-for="option in subQuestions.answerOptions"  
321 - :class="  
322 - subQuestions.correctAnswer.includes(option)  
323 - ? 'active'  
324 - : ''  
325 - "  
326 - :key="option"  
327 - @click="changAnswer(subQuestions, option)"  
328 - >{{ option }}</span  
329 - >  
330 - </p>  
331 - <p v-if="subQuestions.questionType == 2" class="answer-box">  
332 - <span  
333 - class="answer-s"  
334 - v-for="option in subQuestions.answerOptions"  
335 - :class="  
336 - subQuestions.correctAnswer == option ? 'active' : ''  
337 - "  
338 - :key="option"  
339 - @click="subQuestions.correctAnswer = option"  
340 - >{{ option }}</span  
341 - >  
342 - </p>  
343 - </div>  
344 - </div>  
345 - </template>  
346 - </div>  
347 - </div>  
348 - <!-- <div v-show="!editType">  
349 - <p class="dia-tips">  
350 - 请点击选项按钮设置答案,多选题题目之间用“,”隔开,若添加5道题:“AC,AD,BD,AC,CD”  
351 - </p>  
352 - <div class="dia-question-box">  
353 - <div v-for="(item, index) in form2.questionList" :key="index">  
354 - <template v-for="(items, indexs) in item.subQuestions">  
355 - <div class="set-questions" :key="indexs">  
356 - <div class="qs-num">  
357 - <p>{{ items.name }}</p>  
358 - <p>共{{ items.list.length }}题</p>  
359 - </div>  
360 - <div class="qs-options">  
361 - <p class="ipt">  
362 - <el-input  
363 - v-model="items.answerList"  
364 - @keydown.native="keydownAnswer($event)"  
365 - ></el-input>  
366 - </p>  
367 - <p class="answer-box">  
368 - <template v-if="items.list[0].questionType == 4">  
369 - <span  
370 - class="answer-s active"  
371 - @click="  
372 - items.answerList.length < items.list.length  
373 - ? (items.answerList += '✓')  
374 - : ''  
375 - "  
376 - >✓</span  
377 - >  
378 - <span  
379 - class="answer-s active"  
380 - @click="  
381 - items.answerList.length < items.list.length  
382 - ? (items.answerList += '✗')  
383 - : ''  
384 - "  
385 - >✗</span  
386 - >  
387 - </template>  
388 - <template v-if="items.list[0].questionType == 3">  
389 - <span  
390 - class="answer-s active"  
391 - v-for="option in items.list[0].answerOptions"  
392 - :key="option"  
393 - @click="setAnswer(items,option)"  
394 - >{{ option }}</span  
395 - >  
396 - <span  
397 - class="answer-s active"  
398 - @click="  
399 - items.answerList.split(',').length < items.list.length  
400 - ? (items.answerList += ',')  
401 - : ''  
402 - "  
403 - >,</span  
404 - >  
405 - </template>  
406 - <template  
407 - v-if="items.list[0].questionType == 2"  
408 - class="answer-box"  
409 - >  
410 - <span  
411 - class="answer-s active"  
412 - v-for="option in items.list[0].answerOptions"  
413 - :key="option"  
414 - @click="  
415 - items.answerList.length < items.list.length  
416 - ? (items.answerList += option)  
417 - : ''  
418 - "  
419 - >{{ option }}</span  
420 - >  
421 - </template>  
422 - <span  
423 - class="answer-s delButton"  
424 - @click="items.answerList = items.answerList.slice(0, -1)"  
425 - >x</span  
426 - >  
427 - <span  
428 - class="answer-s ac"  
429 - @click="items.answerList = ''"  
430 - >AC</span  
431 - >  
432 - </p>  
433 - </div>  
434 - </div>  
435 - </template>  
436 - </div>  
437 - </div>  
438 - </div> -->  
439 - <div slot="footer">  
440 - <el-button class="dia-btn" type="primary" @click="saveAnswer"  
441 - >确 定</el-button  
442 - >  
443 - <el-button class="dia-btn" type="danger" @click="dialogVisible = false"  
444 - >取 消</el-button  
445 - >  
446 - </div>  
447 - </el-dialog> 286 + <set-answer :diaVisible="dialogVisible" :questionList="form.questionList" :paperId="form.id" @saveSuccess="handleSuccess" @cancel="cancel"/>
448 </div> 287 </div>
449 </template> 288 </template>
450 289
451 <script> 290 <script>
452 -import { formatDate, deepClone,checkAnswer } from "utils"; 291 +import { formatDate, deepClone, checkAnswer } from "utils";
453 export default { 292 export default {
454 data() { 293 data() {
455 return { 294 return {
456 role: "", 295 role: "",
457 loading: false, 296 loading: false,
458 - dialogVisible: false, //修改答案  
459 - editType: true, //修改答案模式  
460 - editId: "", 297 + dialogVisible:false,
461 form: { questionList: [] }, 298 form: { questionList: [] },
462 - form2: { questionList: [] },  
463 date: "", //今天-昨天-本周 299 date: "", //今天-昨天-本周
464 query: { 300 query: {
465 //搜索条件 301 //搜索条件
466 - clazzId: "", 302 + classId: "",
467 subjectId: "", 303 subjectId: "",
468 startDay: "", 304 startDay: "",
469 endDay: "", 305 endDay: "",
@@ -563,7 +399,7 @@ export default { @@ -563,7 +399,7 @@ export default {
563 ], 399 ],
564 }, 400 },
565 ], 401 ],
566 - tableAsk:[ 402 + tableAsk: [
567 { 403 {
568 xuehao: 1, 404 xuehao: 1,
569 xingming: "丁芳菲", 405 xingming: "丁芳菲",
@@ -571,8 +407,8 @@ export default { @@ -571,8 +407,8 @@ export default {
571 dadui: 60, 407 dadui: 60,
572 canyudu: 90, 408 canyudu: 90,
573 allzheng: 80, 409 allzheng: 80,
574 - yidazheng:50,  
575 - zongpaiming:5 410 + yidazheng: 50,
  411 + zongpaiming: 5,
576 }, 412 },
577 { 413 {
578 xuehao: 1, 414 xuehao: 1,
@@ -581,11 +417,11 @@ export default { @@ -581,11 +417,11 @@ export default {
581 dadui: 20, 417 dadui: 20,
582 canyudu: 80, 418 canyudu: 80,
583 allzheng: 60, 419 allzheng: 60,
584 - yidazheng:65,  
585 - zongpaiming:4  
586 - } 420 + yidazheng: 65,
  421 + zongpaiming: 4,
  422 + },
587 ], 423 ],
588 - tableStage:[ 424 + tableStage: [
589 { 425 {
590 xuehao: 1, 426 xuehao: 1,
591 xingming: "丁芳菲", 427 xingming: "丁芳菲",
@@ -593,19 +429,19 @@ export default { @@ -593,19 +429,19 @@ export default {
593 dadui: 60, 429 dadui: 60,
594 chouda: 90, 430 chouda: 90,
595 choudadui: 80, 431 choudadui: 80,
596 - canyu:50,  
597 - duicuo:5  
598 - }  
599 - ] 432 + canyu: 50,
  433 + duicuo: 5,
  434 + },
  435 + ],
600 }; 436 };
601 }, 437 },
602 async created() { 438 async created() {
603 - this.role = this.$store.getters.info.permissions[0]?.roleName;  
604 - if (this.role == "班主任") { 439 + this.role = this.$store.getters.info.permissions[0]?.role||"";
  440 + if (this.role == "ROLE_BANZHUREN") {
605 this.query.subjectId = []; 441 this.query.subjectId = [];
606 } 442 }
607 - // await this._QueryClassList();  
608 - // await this._QuerySubjectList(); 443 + await this._QueryClassList();
  444 + await this._QuerySubjectList();
609 // await this.setDate(1); 445 // await this.setDate(1);
610 let startDay = this.query?.startDay; 446 let startDay = this.query?.startDay;
611 if (!startDay) { 447 if (!startDay) {
@@ -623,90 +459,7 @@ export default { @@ -623,90 +459,7 @@ export default {
623 }, 459 },
624 }); 460 });
625 }, 461 },
626 - setSubPro(type) {  
627 - let tit;  
628 - switch (type) {  
629 - case 2:  
630 - tit = "单选题";  
631 - break;  
632 - case 3:  
633 - tit = "多选题";  
634 - break;  
635 - case 4:  
636 - tit = "判断题";  
637 - break;  
638 - case 5:  
639 - tit = "主观题";  
640 - break;  
641 - }  
642 - return tit;  
643 - },  
644 - edit(item) {  
645 - this.form = deepClone(item);  
646 - // this.form2 = deepClone(item);  
647 - // //组合每道大题中的相同题目  
648 - // let questionList = deepClone(item.questionList);  
649 - // for (let i = 0; i < questionList.length; i++) {  
650 - // let jsons = {};  
651 - // let answerOptions = [];  
652 - // questionList[i].subQuestions.map((items) => {  
653 - // let txt = this.setSubPro(items.questionType);  
654 - // if (jsons[txt]) {  
655 - // jsons[txt].push(items);  
656 - // } else {  
657 - // jsons[txt] = [items];  
658 - // }  
659 - // if (items.questionType == 2 || items.questionType == 3) {  
660 - // if (items.answerOptions.length > answerOptions.length) {  
661 - // answerOptions = items.answerOptions;  
662 - // }  
663 - // jsons[txt][0].answerOptions = answerOptions;  
664 - // }  
665 - // });  
666 - // this.form2.questionList[i].subQuestions = Object.keys(jsons).map(  
667 - // (item) => {  
668 - // return {  
669 - // name: item,  
670 - // list: jsons[item],  
671 - // answerList: "",  
672 - // };  
673 - // }  
674 - // );  
675 - // }  
676 - this.dialogVisible = true;  
677 - },  
678 - keydownAnswer(event) {//快速答案设置禁止输入  
679 - if (  
680 - event.key == "Meta" ||  
681 - event.key == "CapsLock" ||  
682 - event.key == "Shift" ||  
683 - event.key == "Enter" ||  
684 - event.key == "Alt" ||  
685 - event.key == "Backspace" ||  
686 - event.key == "Delete" ||  
687 - event.key == "ArrowUp" ||  
688 - event.key == "ArrowDown" ||  
689 - event.key == "ArrowLeft" ||  
690 - event.key == "v" ||  
691 - event.key == "V" ||  
692 - event.key == "ArrowRight"  
693 - ) {  
694 - return;  
695 - } else {  
696 - event.returnValue = "";  
697 - }  
698 - },  
699 - setAnswer(obj,answer){//多选答案设置  
700 - obj.answerList+=answer  
701 - let str = obj.answerList;  
702 - let str2 = checkAnswer(  
703 - str,  
704 - 3,  
705 - obj.list[0].answerOptions,  
706 - obj.list.length  
707 - );  
708 - obj.answerList = str2;  
709 - }, 462 +
710 setDate(index) { 463 setDate(index) {
711 const that = this; 464 const that = this;
712 this.date = index == this.date ? "" : index; 465 this.date = index == this.date ? "" : index;
@@ -762,68 +515,55 @@ export default { @@ -762,68 +515,55 @@ export default {
762 } 515 }
763 } 516 }
764 }, 517 },
765 - changAnswer(sub, option) {  
766 - //设置多选答案  
767 - let str = new RegExp(option, "g");  
768 - if (sub.correctAnswer?.includes(option)) {  
769 - sub.correctAnswer = sub.correctAnswer.replace(str, "");  
770 - } else {  
771 - let arrs = (sub.correctAnswer && sub.correctAnswer.split("")) || [];  
772 - arrs.push(option);  
773 - sub.correctAnswer = arrs.sort().join("");  
774 - } 518 + edit(item) {
  519 + this.form = deepClone(item);
  520 + this.dialogVisible = true;
775 }, 521 },
776 - async saveAnswer(){  
777 - // const { data, code, message } = await this.$request.modifyPaper({...this.form});  
778 - // if (code == 0) {  
779 - this.dialogVisible = false  
780 - // } else {  
781 - // this.$message.error(message);  
782 - // } 522 + cancel(){
  523 + this.dialogVisible = false
  524 + },
  525 + handleSuccess(){
  526 + this.dialogVisible = false
  527 + this._QueryData()
783 }, 528 },
784 async changClazz() { 529 async changClazz() {
785 await this._QuerySubjectList(); 530 await this._QuerySubjectList();
786 await this.setDate(1); 531 await this.setDate(1);
787 }, 532 },
788 async _QueryClassList() { 533 async _QueryClassList() {
789 - const { data, code, message } = await this.$request.fetchClassList();  
790 - if (code === 0) { 534 + const { data, status, info } = await this.$request.fetchClassList();
  535 + if (status === 0) {
791 this.classList = data.list.map((item) => { 536 this.classList = data.list.map((item) => {
792 return { 537 return {
793 - value: item.clazzId, 538 + value: item.classId,
794 label: item.clazzName, 539 label: item.clazzName,
795 }; 540 };
796 }); 541 });
797 - this.query.clazzId = this.classList[0].value; 542 + this.query.classId = this.classList[0]?.value;
798 } else { 543 } else {
799 - this.$message.error(message); 544 + this.$message.error(info);
800 } 545 }
801 }, 546 },
802 async _QuerySubjectList() { 547 async _QuerySubjectList() {
803 - const datas = this.query.clazzId  
804 - ? {  
805 - clazzId: this.query.clazzId,  
806 - }  
807 - : {};  
808 - const { data, code, message } = await this.$request.fetchSubjectList(  
809 - datas 548 + const { data, status, info } = await this.$request.fetchSubjectList(
  549 + {classId: this.query.classId,}
810 ); 550 );
811 - if (code === 0) {  
812 - this.subjectList = data.list.map((item) => { 551 + if (status === 0) {
  552 + this.subjectList = data.list?.map((item) => {
813 return { 553 return {
814 value: item.subjectId, 554 value: item.subjectId,
815 label: item.subjectName, 555 label: item.subjectName,
816 }; 556 };
817 - });  
818 - if (this.role == "班主任") { 557 + })||[];
  558 + if (this.role == "ROLE_BANZHUREN") {
819 this.subjectList.unshift({ 559 this.subjectList.unshift({
820 value: "", 560 value: "",
821 label: "全部", 561 label: "全部",
822 }); 562 });
823 } 563 }
824 - this.query.subjectId = this.subjectList[0].value; 564 + this.query.subjectId = this.subjectList[0]?.value;
825 } else { 565 } else {
826 - this.$message.error(message); 566 + this.$message.error(info);
827 } 567 }
828 }, 568 },
829 async _QueryData() { 569 async _QueryData() {
@@ -835,13 +575,13 @@ export default { @@ -835,13 +575,13 @@ export default {
835 query[key] = this.query[key]; 575 query[key] = this.query[key];
836 } 576 }
837 } 577 }
838 - const { data, code, message } = await this.$request.fetchQuizList({ 578 + const { data, status, info } = await this.$request.fetchQuizList({
839 ...query, 579 ...query,
840 }); 580 });
841 this.loading = false; 581 this.loading = false;
842 - if (code === 0) { 582 + if (status === 0) {
843 } else { 583 } else {
844 - this.$message.error(message); 584 + this.$message.error(info);
845 } 585 }
846 }, 586 },
847 }, 587 },
@@ -862,57 +602,7 @@ export default { @@ -862,57 +602,7 @@ export default {
862 } 602 }
863 } 603 }
864 604
865 -.sub-questions {  
866 - width: 100%;  
867 - display: flex;  
868 - &:hover {  
869 - background: #f8f8f8;  
870 - }  
871 - & > div {  
872 - min-height: 40px;  
873 - padding: 5px;  
874 - flex-shrink: 0;  
875 - display: flex;  
876 - justify-content: center;  
877 - align-items: center;  
878 - }  
879 - .qs-num {  
880 - width: 80px;  
881 - font-size: 16px;  
882 - color: #333;  
883 - font-weight: 500;  
884 - }  
885 - .qs-options {  
886 - flex: 1;  
887 - }  
888 - .qs-options2 {  
889 - text-align: left;  
890 - justify-content: flex-start;  
891 - padding-left: 20px;  
892 - .answer-s {  
893 - cursor: pointer;  
894 - border-color: #667ffd;  
895 - color: #667ffd;  
896 - margin: 0 15px;  
897 - &.active {  
898 - color: #fff;  
899 - }  
900 - }  
901 - }  
902 - :deep(.el-select) {  
903 - .el-input__inner {  
904 - border-radius: 20px;  
905 - border-color: #667ffd;  
906 - width: 150px;  
907 - height: 32px;  
908 - line-height: 32px;  
909 - background: rgba($color: #667ffd, $alpha: 0.05);  
910 - }  
911 - .el-input__icon {  
912 - line-height: 32px;  
913 - }  
914 - }  
915 -} 605 +
916 .fa-exchange { 606 .fa-exchange {
917 color: #667ffd; 607 color: #667ffd;
918 cursor: pointer; 608 cursor: pointer;
@@ -924,14 +614,14 @@ export default { @@ -924,14 +614,14 @@ export default {
924 margin: 0 20px; 614 margin: 0 20px;
925 padding: 10px 20px; 615 padding: 10px 20px;
926 } 616 }
927 -.dia-tips{  
928 - padding-bottom:10px;  
929 - } 617 +.dia-tips {
  618 + padding-bottom: 10px;
  619 +}
930 .dia-question-box { 620 .dia-question-box {
931 padding: 16px 16px 1px; 621 padding: 16px 16px 1px;
932 background: #f8f8f8; 622 background: #f8f8f8;
933 border-radius: 10px; 623 border-radius: 10px;
934 - 624 +
935 .answer-s { 625 .answer-s {
936 width: 36px; 626 width: 36px;
937 height: 28px; 627 height: 28px;
@@ -958,13 +648,13 @@ export default { @@ -958,13 +648,13 @@ export default {
958 background-size: 19px; 648 background-size: 19px;
959 color: transparent; 649 color: transparent;
960 } 650 }
961 - .ac{ 651 + .ac {
962 border-color: #ff6868; 652 border-color: #ff6868;
963 background: #ff6868; 653 background: #ff6868;
964 - color:#fff 654 + color: #fff;
965 } 655 }
966 } 656 }
967 -.down{  
968 -padding-top:16px; 657 +.down {
  658 + padding-top: 16px;
969 } 659 }
970 </style> 660 </style>
971 \ No newline at end of file 661 \ No newline at end of file
src/views/examinationPaper/add.vue
@@ -807,7 +807,7 @@ export default { @@ -807,7 +807,7 @@ export default {
807 }); 807 });
808 if (status == 0) { 808 if (status == 0) {
809 this.answerTypeList = 809 this.answerTypeList =
810 - data.list.map((item) => { 810 + data.list?.map((item) => {
811 return { 811 return {
812 typeName: item.tag, 812 typeName: item.tag,
813 id: item.tagId, 813 id: item.tagId,
@@ -824,7 +824,7 @@ export default { @@ -824,7 +824,7 @@ export default {
824 //查询年级列表 824 //查询年级列表
825 const { data, status, info } = await this.$request.fetchGradeList(); 825 const { data, status, info } = await this.$request.fetchGradeList();
826 if (status == 0) { 826 if (status == 0) {
827 - this.gradeList = [...data.gradeNames] || []; 827 + this.gradeList = data.gradeNames&&[...data.gradeNames] || [];
828 if (this.type != 2) { 828 if (this.type != 2) {
829 this.form.gradeName = this.gradeList[0]; 829 this.form.gradeName = this.gradeList[0];
830 } 830 }
@@ -838,12 +838,12 @@ export default { @@ -838,12 +838,12 @@ export default {
838 gradeName: grade, 838 gradeName: grade,
839 }); 839 });
840 if (status === 0) { 840 if (status === 0) {
841 - this.subjectList = data.subjectNames.map((item) => { 841 + this.subjectList = data.subjectNames?.map((item) => {
842 return { 842 return {
843 value: item, 843 value: item,
844 label: item, 844 label: item,
845 }; 845 };
846 - }); 846 + })||[];
847 console.log(this.subjectList); 847 console.log(this.subjectList);
848 if (this.subjectList.length) { 848 if (this.subjectList.length) {
849 this.form.subjectName = this.subjectList[0].value; 849 this.form.subjectName = this.subjectList[0].value;
src/views/examinationPaper/index.vue
@@ -296,12 +296,12 @@ export default { @@ -296,12 +296,12 @@ export default {
296 console.log(status) 296 console.log(status)
297 if (status === 0) { 297 if (status === 0) {
298 if (!!data.list) { 298 if (!!data.list) {
299 - this.classList = data.list.map((item) => { 299 + this.classList = data.list?.map((item) => {
300 return { 300 return {
301 value: item.classId, 301 value: item.classId,
302 label: item.className, 302 label: item.className,
303 }; 303 };
304 - }); 304 + })||[];
305 this.query.classId = this.classList[0]?.value; 305 this.query.classId = this.classList[0]?.value;
306 } 306 }
307 } else { 307 } else {
@@ -314,12 +314,12 @@ export default { @@ -314,12 +314,12 @@ export default {
314 classId: this.query.classId, 314 classId: this.query.classId,
315 }); 315 });
316 if (status === 0) { 316 if (status === 0) {
317 - this.subjectList = data.subjectNames.map((item) => { 317 + this.subjectList = data.subjectNames?.map((item) => {
318 return { 318 return {
319 value: item, 319 value: item,
320 label: item, 320 label: item,
321 }; 321 };
322 - }); 322 + })||[];
323 this.query.subjectName = this.subjectList[0]?.value; 323 this.query.subjectName = this.subjectList[0]?.value;
324 } else { 324 } else {
325 this.$message.error(info); 325 this.$message.error(info);
src/views/examinationPaper/recycle.vue
@@ -250,12 +250,12 @@ export default { @@ -250,12 +250,12 @@ export default {
250 console.log(status); 250 console.log(status);
251 if (status === 0) { 251 if (status === 0) {
252 if (!!data.list) { 252 if (!!data.list) {
253 - this.classList = data.list.map((item) => { 253 + this.classList = data.list?.map((item) => {
254 return { 254 return {
255 value: item.classId, 255 value: item.classId,
256 label: item.className, 256 label: item.className,
257 }; 257 };
258 - }); 258 + })||[];
259 this.query.classId = this.classList[0]?.value; 259 this.query.classId = this.classList[0]?.value;
260 } 260 }
261 } else { 261 } else {
@@ -268,12 +268,12 @@ export default { @@ -268,12 +268,12 @@ export default {
268 classId: this.query.classId, 268 classId: this.query.classId,
269 }); 269 });
270 if (status === 0) { 270 if (status === 0) {
271 - this.subjectList = data.subjectNames.map((item) => { 271 + this.subjectList = data.subjectNames?.map((item) => {
272 return { 272 return {
273 value: item, 273 value: item,
274 label: item, 274 label: item,
275 }; 275 };
276 - }); 276 + })||[];
277 this.query.subjectName = this.subjectList[0]?.value; 277 this.query.subjectName = this.subjectList[0]?.value;
278 } else { 278 } else {
279 this.$message.error(info); 279 this.$message.error(info);
@@ -287,7 +287,7 @@ export default { @@ -287,7 +287,7 @@ export default {
287 }); 287 });
288 if (status === 0) { 288 if (status === 0) {
289 this.typeList = 289 this.typeList =
290 - data.list.map((item) => { 290 + data.list?.map((item) => {
291 return { 291 return {
292 value: item.tagId, 292 value: item.tagId,
293 label: item.tag, 293 label: item.tag,
src/views/layout/header/header.vue
@@ -63,11 +63,10 @@ @@ -63,11 +63,10 @@
63 import Cookies from "js-cookie"; 63 import Cookies from "js-cookie";
64 import langSelect from "../../../components/lang/langSelect"; 64 import langSelect from "../../../components/lang/langSelect";
65 import tabNav from "./tabNav"; 65 import tabNav from "./tabNav";
66 -import UserInfo from "../../../components/userForm/userInfo";  
67 66
68 export default { 67 export default {
69 name: "Header", 68 name: "Header",
70 - components: { tabNav, langSelect, UserInfo }, 69 + components: { tabNav, langSelect },
71 computed: { 70 computed: {
72 permissions: function () { 71 permissions: function () {
73 return this.$store.getters.info.permissions || []; 72 return this.$store.getters.info.permissions || [];