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 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 9 <div class="sel-box">
10 10 <el-select
11 11 class="sel"
12   - v-model="query.clazzId"
13   - placeholder=""
  12 + v-model="query.classId"
  13 + placeholder="选择班级"
14 14 @change="changClazz"
15 15 >
16 16 <el-option
... ... @@ -18,11 +18,11 @@
18 18 :key="item.value"
19 19 :label="item.label"
20 20 :value="item.value"
21   - >{{ item.label }}
  21 + >
22 22 </el-option>
23 23 </el-select>
24 24 <el-select
25   - v-if="role == '班主任'"
  25 + v-if="role == 'ROLE_BANZHUREN'"
26 26 class="sel"
27 27 multiple
28 28 collapse-tags
... ... @@ -89,7 +89,7 @@
89 89 <div class="table-box">
90 90 <el-radio-group v-model="tabIndex" style="margin-bottom: 20px">
91 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 93 >阶段问答报表</el-radio-button
94 94 >
95 95 <el-radio-button :label="3">阶段互动报表</el-radio-button>
... ... @@ -283,187 +283,23 @@
283 283 <el-button type="info" plain round icon="fa fa-cloud-download">导出报表</el-button>
284 284 </p>
285 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 287 </div>
449 288 </template>
450 289  
451 290 <script>
452   -import { formatDate, deepClone,checkAnswer } from "utils";
  291 +import { formatDate, deepClone, checkAnswer } from "utils";
453 292 export default {
454 293 data() {
455 294 return {
456 295 role: "",
457 296 loading: false,
458   - dialogVisible: false, //修改答案
459   - editType: true, //修改答案模式
460   - editId: "",
  297 + dialogVisible:false,
461 298 form: { questionList: [] },
462   - form2: { questionList: [] },
463 299 date: "", //今天-昨天-本周
464 300 query: {
465 301 //搜索条件
466   - clazzId: "",
  302 + classId: "",
467 303 subjectId: "",
468 304 startDay: "",
469 305 endDay: "",
... ... @@ -563,7 +399,7 @@ export default {
563 399 ],
564 400 },
565 401 ],
566   - tableAsk:[
  402 + tableAsk: [
567 403 {
568 404 xuehao: 1,
569 405 xingming: "丁芳菲",
... ... @@ -571,8 +407,8 @@ export default {
571 407 dadui: 60,
572 408 canyudu: 90,
573 409 allzheng: 80,
574   - yidazheng:50,
575   - zongpaiming:5
  410 + yidazheng: 50,
  411 + zongpaiming: 5,
576 412 },
577 413 {
578 414 xuehao: 1,
... ... @@ -581,11 +417,11 @@ export default {
581 417 dadui: 20,
582 418 canyudu: 80,
583 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 426 xuehao: 1,
591 427 xingming: "丁芳菲",
... ... @@ -593,19 +429,19 @@ export default {
593 429 dadui: 60,
594 430 chouda: 90,
595 431 choudadui: 80,
596   - canyu:50,
597   - duicuo:5
598   - }
599   - ]
  432 + canyu: 50,
  433 + duicuo: 5,
  434 + },
  435 + ],
600 436 };
601 437 },
602 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 441 this.query.subjectId = [];
606 442 }
607   - // await this._QueryClassList();
608   - // await this._QuerySubjectList();
  443 + await this._QueryClassList();
  444 + await this._QuerySubjectList();
609 445 // await this.setDate(1);
610 446 let startDay = this.query?.startDay;
611 447 if (!startDay) {
... ... @@ -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 463 setDate(index) {
711 464 const that = this;
712 465 this.date = index == this.date ? "" : index;
... ... @@ -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 529 async changClazz() {
785 530 await this._QuerySubjectList();
786 531 await this.setDate(1);
787 532 },
788 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 536 this.classList = data.list.map((item) => {
792 537 return {
793   - value: item.clazzId,
  538 + value: item.classId,
794 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 543 } else {
799   - this.$message.error(message);
  544 + this.$message.error(info);
800 545 }
801 546 },
802 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 553 return {
814 554 value: item.subjectId,
815 555 label: item.subjectName,
816 556 };
817   - });
818   - if (this.role == "班主任") {
  557 + })||[];
  558 + if (this.role == "ROLE_BANZHUREN") {
819 559 this.subjectList.unshift({
820 560 value: "",
821 561 label: "全部",
822 562 });
823 563 }
824   - this.query.subjectId = this.subjectList[0].value;
  564 + this.query.subjectId = this.subjectList[0]?.value;
825 565 } else {
826   - this.$message.error(message);
  566 + this.$message.error(info);
827 567 }
828 568 },
829 569 async _QueryData() {
... ... @@ -835,13 +575,13 @@ export default {
835 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 579 ...query,
840 580 });
841 581 this.loading = false;
842   - if (code === 0) {
  582 + if (status === 0) {
843 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 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 606 .fa-exchange {
917 607 color: #667ffd;
918 608 cursor: pointer;
... ... @@ -924,14 +614,14 @@ export default {
924 614 margin: 0 20px;
925 615 padding: 10px 20px;
926 616 }
927   -.dia-tips{
928   - padding-bottom:10px;
929   - }
  617 +.dia-tips {
  618 + padding-bottom: 10px;
  619 +}
930 620 .dia-question-box {
931 621 padding: 16px 16px 1px;
932 622 background: #f8f8f8;
933 623 border-radius: 10px;
934   -
  624 +
935 625 .answer-s {
936 626 width: 36px;
937 627 height: 28px;
... ... @@ -958,13 +648,13 @@ export default {
958 648 background-size: 19px;
959 649 color: transparent;
960 650 }
961   - .ac{
  651 + .ac {
962 652 border-color: #ff6868;
963 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 660 </style>
971 661 \ No newline at end of file
... ...
src/views/examinationPaper/add.vue
... ... @@ -807,7 +807,7 @@ export default {
807 807 });
808 808 if (status == 0) {
809 809 this.answerTypeList =
810   - data.list.map((item) => {
  810 + data.list?.map((item) => {
811 811 return {
812 812 typeName: item.tag,
813 813 id: item.tagId,
... ... @@ -824,7 +824,7 @@ export default {
824 824 //查询年级列表
825 825 const { data, status, info } = await this.$request.fetchGradeList();
826 826 if (status == 0) {
827   - this.gradeList = [...data.gradeNames] || [];
  827 + this.gradeList = data.gradeNames&&[...data.gradeNames] || [];
828 828 if (this.type != 2) {
829 829 this.form.gradeName = this.gradeList[0];
830 830 }
... ... @@ -838,12 +838,12 @@ export default {
838 838 gradeName: grade,
839 839 });
840 840 if (status === 0) {
841   - this.subjectList = data.subjectNames.map((item) => {
  841 + this.subjectList = data.subjectNames?.map((item) => {
842 842 return {
843 843 value: item,
844 844 label: item,
845 845 };
846   - });
  846 + })||[];
847 847 console.log(this.subjectList);
848 848 if (this.subjectList.length) {
849 849 this.form.subjectName = this.subjectList[0].value;
... ...
src/views/examinationPaper/index.vue
... ... @@ -296,12 +296,12 @@ export default {
296 296 console.log(status)
297 297 if (status === 0) {
298 298 if (!!data.list) {
299   - this.classList = data.list.map((item) => {
  299 + this.classList = data.list?.map((item) => {
300 300 return {
301 301 value: item.classId,
302 302 label: item.className,
303 303 };
304   - });
  304 + })||[];
305 305 this.query.classId = this.classList[0]?.value;
306 306 }
307 307 } else {
... ... @@ -314,12 +314,12 @@ export default {
314 314 classId: this.query.classId,
315 315 });
316 316 if (status === 0) {
317   - this.subjectList = data.subjectNames.map((item) => {
  317 + this.subjectList = data.subjectNames?.map((item) => {
318 318 return {
319 319 value: item,
320 320 label: item,
321 321 };
322   - });
  322 + })||[];
323 323 this.query.subjectName = this.subjectList[0]?.value;
324 324 } else {
325 325 this.$message.error(info);
... ...
src/views/examinationPaper/recycle.vue
... ... @@ -250,12 +250,12 @@ export default {
250 250 console.log(status);
251 251 if (status === 0) {
252 252 if (!!data.list) {
253   - this.classList = data.list.map((item) => {
  253 + this.classList = data.list?.map((item) => {
254 254 return {
255 255 value: item.classId,
256 256 label: item.className,
257 257 };
258   - });
  258 + })||[];
259 259 this.query.classId = this.classList[0]?.value;
260 260 }
261 261 } else {
... ... @@ -268,12 +268,12 @@ export default {
268 268 classId: this.query.classId,
269 269 });
270 270 if (status === 0) {
271   - this.subjectList = data.subjectNames.map((item) => {
  271 + this.subjectList = data.subjectNames?.map((item) => {
272 272 return {
273 273 value: item,
274 274 label: item,
275 275 };
276   - });
  276 + })||[];
277 277 this.query.subjectName = this.subjectList[0]?.value;
278 278 } else {
279 279 this.$message.error(info);
... ... @@ -287,7 +287,7 @@ export default {
287 287 });
288 288 if (status === 0) {
289 289 this.typeList =
290   - data.list.map((item) => {
  290 + data.list?.map((item) => {
291 291 return {
292 292 value: item.tagId,
293 293 label: item.tag,
... ...
src/views/layout/header/header.vue
... ... @@ -63,11 +63,10 @@
63 63 import Cookies from "js-cookie";
64 64 import langSelect from "../../../components/lang/langSelect";
65 65 import tabNav from "./tabNav";
66   -import UserInfo from "../../../components/userForm/userInfo";
67 66  
68 67 export default {
69 68 name: "Header",
70   - components: { tabNav, langSelect, UserInfo },
  69 + components: { tabNav, langSelect },
71 70 computed: {
72 71 permissions: function () {
73 72 return this.$store.getters.info.permissions || [];
... ...