Compare commits

..

336 Commits

Author SHA1 Message Date
c6a47d0e69 删除首页5条限制 2021-11-26 10:18:19 +08:00
25ee3c9bb0
线上密码 2021-03-26 14:33:11 +08:00
ba2a295f09
学生名成从用户名改为中文名 2021-03-26 11:38:26 +08:00
f1dacb165a
修改权限 2021-03-23 11:48:58 +08:00
40f7e34528
批改移动到后台 2021-03-23 11:45:51 +08:00
1757a8fd4f
删除了学生端批改 2021-03-23 11:19:11 +08:00
3a947518ef
权限与后台提交 2021-03-23 11:17:51 +08:00
f318e23220
session 过期时间 2021-03-22 09:30:48 +08:00
45b2507948
修正了错误 2021-03-22 09:29:22 +08:00
b4b8c38294
删除了lang en 2021-03-17 11:25:12 +08:00
597dfccf84
修复了列表的问题 2021-03-17 11:23:53 +08:00
alvis
04ff77ed3e
Merge pull request #83 from mindskip/alvis
v3.3.0
2021-03-16 12:25:44 +08:00
alvis
fd2ac75c44 v3.3.0 2021-03-16 12:25:19 +08:00
思维跳跃科技
b6a9a1d435
Merge pull request #82 from mindskip/mindskip
数据库设计
2021-03-15 12:57:20 +08:00
mindskip
13ddda300e 数据库设计 2021-03-15 12:53:22 +08:00
思维跳跃科技
1cf243e542
Merge pull request #81 from mindskip/mindskip
数据库设计
2021-03-12 12:34:11 +08:00
mindskip
ece6e571f3 数据库设计 2021-03-12 12:32:54 +08:00
思维跳跃科技
98f4d75d59
Merge pull request #80 from mindskip/mindskip
数据库设计
2021-03-11 13:05:03 +08:00
mindskip
9403199719 数据库设计 2021-03-11 13:04:04 +08:00
思维跳跃科技
db012a8f51
Merge pull request #79 from mindskip/mindskip
数据库设计
2021-03-10 12:48:14 +08:00
mindskip
583beb6448 数据库设计 2021-03-10 12:47:22 +08:00
alvis
eab090c2a7
Merge pull request #78 from mindskip/alvis
http -> https
2021-03-09 12:45:49 +08:00
alvis
839af4f589 http -> https 2021-03-09 12:45:36 +08:00
alvis
6f3054a030
Merge pull request #77 from mindskip/alvis
组件升级
2021-03-08 13:10:40 +08:00
alvis
9ee89c5287 组件升级 2021-03-08 13:10:16 +08:00
思维跳跃科技
d9b98386d2
Merge pull request #76 from mindskip/mindskip
文档更新
2021-03-04 23:22:44 -06:00
mindskip
10d177d61d 文档更新 2021-03-05 13:21:11 +08:00
思维跳跃科技
89e883ff2c
Merge pull request #75 from mindskip/mindskip
数据库设计
2021-03-03 22:40:32 -06:00
mindskip
2853357b8f 数据库设计 2021-03-04 12:39:47 +08:00
思维跳跃科技
fd614d9f21
Merge pull request #74 from mindskip/mindskip
数据库设计
2021-03-02 22:58:13 -06:00
mindskip
5ef8bb1d9a 数据库设计 2021-03-03 12:52:29 +08:00
思维跳跃科技
bd36a8f321
Merge pull request #73 from mindskip/mindskip
数据库设计
2021-03-02 13:12:42 +08:00
mindskip
01899d7e14 数据库设计 2021-03-02 13:11:27 +08:00
思维跳跃科技
d08d8f2cda
Merge pull request #72 from mindskip/mindskip
修复IE浏览器bug
2021-03-01 20:45:19 +08:00
mindskip
9ebef8ec92 修复IE浏览器bug 2021-03-01 20:43:36 +08:00
思维跳跃科技
02e5a206bf
Merge pull request #71 from mindskip/mindskip
数据库设计
2021-02-26 10:37:08 +08:00
mindskip
5217896e3d 数据库设计 2021-02-26 10:35:52 +08:00
思维跳跃科技
b6a9f488cb
Merge pull request #70 from mindskip/mindskip
数据库设计
2021-02-25 10:06:48 +08:00
mindskip
ec50d66c65 数据库设计 2021-02-25 10:01:56 +08:00
思维跳跃科技
3738c5b744
Merge pull request #69 from mindskip/mindskip
QQ交流群八:902855996
2021-02-24 09:21:40 +08:00
mindskip
ddf742e4d9 QQ交流群八:902855996 2021-02-24 09:19:04 +08:00
alvis
9518070c08
Merge pull request #68 from mindskip/alvis
修复选项清空bug
2021-02-23 08:52:19 +08:00
alvis
aac89f3df7 修复选项清空bug 2021-02-23 08:51:04 +08:00
思维跳跃科技
9a629b7ea3
Merge pull request #67 from mindskip/mindskip
数据库设计
2021-02-22 09:56:47 +08:00
mindskip
2d1860f052 数据库设计 2021-02-22 09:55:07 +08:00
思维跳跃科技
918c4c1de8
Merge pull request #66 from mindskip/mindskip
数据库设计
2021-02-20 13:44:20 +08:00
mindskip
0c4fd32a77 数据库设计 2021-02-20 13:38:39 +08:00
思维跳跃科技
acf3a907b4
Merge pull request #65 from mindskip/mindskip
数据库设计
2021-02-19 10:04:49 +08:00
mindskip
038c6e4637 数据库设计 2021-02-19 09:53:55 +08:00
思维跳跃科技
e9b3520023
Merge pull request #64 from mindskip/mindskip
数据库设计
2021-02-18 09:28:53 +08:00
mindskip
70ecf0aed8 数据库设计 2021-02-18 09:26:06 +08:00
alvis
d89dc8b2d8
Merge pull request #63 from mindskip/alvis
优化
2021-02-07 12:10:47 +08:00
alvis
cb9c5ffcc5 优化 2021-02-07 12:09:37 +08:00
alvis
d2c976323e
Merge pull request #62 from mindskip/alvis
优化
2021-02-05 10:10:17 +08:00
alvis
1dee271b14 优化 2021-02-05 10:00:33 +08:00
alvis
faeee8cdce
Merge pull request #61 from mindskip/alvis
bug fix
2021-02-04 10:23:27 +08:00
alvis
be2b51ad1e bug fix 2021-02-04 10:22:14 +08:00
alvis
7fe265c45d
Merge pull request #60 from mindskip/alvis
成绩管理
2021-02-03 09:32:11 +08:00
alvis
5f31d444d4 成绩管理 2021-02-03 09:29:20 +08:00
思维跳跃科技
a2f6cc7c79
Merge pull request #59 from mindskip/mindskip
文档更新
2021-02-02 09:20:01 +08:00
mindskip
7b549f3079 文档更新 2021-02-02 09:16:11 +08:00
alvis
626ba788c7 成绩管理 2021-02-01 12:11:37 +08:00
思维跳跃科技
edcf038602
Merge pull request #58 from mindskip/mindskip
docker更新
2021-02-01 10:10:15 +08:00
mindskip
45ef20468b 1.docker镜像更新
2.教程地址更新
2021-02-01 10:01:11 +08:00
alvis
e934fdc2d5
Merge pull request #57 from mindskip/alvis
主题切换
2021-02-01 09:59:05 +08:00
alvis
e8159a17e1 主题切换 2021-02-01 09:58:14 +08:00
思维跳跃科技
4614ee3f53
Merge pull request #56 from mindskip/mindskip
update docs/README.md
2021-01-29 09:16:06 +08:00
mindskip
bb85feb549 update docs/README.md 2021-01-29 09:14:39 +08:00
alvis
5398f551ba
Merge pull request #55 from mindskip/alvis
bug fix
2021-01-28 10:26:56 +08:00
alvis
f2d0192277 bug fix 2021-01-28 10:22:59 +08:00
alvis
b809fe7b69
Merge pull request #54 from mindskip/alvis
bug fix
2021-01-27 09:16:55 +08:00
alvis
e97a614832 bug fix 2021-01-27 09:15:37 +08:00
alvis
595a71792c
Merge pull request #53 from mindskip/alvis
bug fix
2021-01-26 09:15:37 +08:00
alvis
3be08dfa92 bug fix 2021-01-26 09:14:15 +08:00
alvis
42237dfe11
Merge pull request #52 from mindskip/alvis
bug fix
2021-01-25 09:56:36 +08:00
alvis
7fc051fdb0 bug fix 2021-01-25 09:52:09 +08:00
mindskip
81adf94725 v3.2.0 2021-01-22 10:36:32 +08:00
mindskip
24d82e4772 v3.1.0 2021-01-22 10:34:11 +08:00
alvis
64a49ad0ee
Merge pull request #50 from mindskip/alvis
移除lombok
2021-01-22 09:37:39 +08:00
alvis
4ee3c69a4a 移除lombok 2021-01-22 09:35:34 +08:00
alvis
af0c1b82b1
Merge pull request #49 from mindskip/alvis
优化
2021-01-21 09:33:17 +08:00
alvis
6fbf2cc6c0 优化 2021-01-21 09:31:34 +08:00
alvis
861d5d849b
Merge pull request #48 from mindskip/alvis
优化
2021-01-20 08:57:17 +08:00
alvis
b650bae481 优化 2021-01-20 08:56:22 +08:00
alvis
ca12f4a83e
Merge pull request #47 from mindskip/alvis
bug fix
2021-01-19 09:35:21 +08:00
alvis
b8bfbbe71d bug fix 2021-01-19 09:34:05 +08:00
alvis
33372e5c1e
Merge pull request #46 from mindskip/alvis
优化
2021-01-18 10:07:22 +08:00
alvis
03192bf0fd 优化 2021-01-18 10:06:15 +08:00
思维跳跃科技
193ccc9712
Merge pull request #45 from mindskip/mindskip
文档更新
2021-01-15 12:59:44 +08:00
mindskip
85860fb80a update 2021-01-15 12:58:15 +08:00
mindskip
1c2ee04d8c Merge branch 'master' of github.com:mindskip/xzs-mysql 2021-01-15 11:47:24 +08:00
思维跳跃科技
7c4ee0a1e8 !51 sync
Merge pull request !51 from 思维跳跃科技/other
2021-01-15 11:43:50 +08:00
思维跳跃科技
13f2f54e2a sync 2021-01-15 11:43:37 +08:00
mindskip
ba63ef6d15 sync 2021-01-15 11:39:44 +08:00
alvis
79fe372f80 !49 优化
Merge pull request !49 from alvis/alvis
2021-01-15 09:18:54 +08:00
alvis
5e0b942d3f
Merge pull request #44 from mindskip/alvis
优化
2021-01-15 09:17:44 +08:00
alvis
80cba65fc3 优化 2021-01-15 09:16:14 +08:00
alvis
fc066ade71 优化 2021-01-15 09:16:12 +08:00
alvis
c29e36ca1f 优化 2021-01-15 09:13:40 +08:00
alvis
71359d813c 优化 2021-01-15 09:13:33 +08:00
alvis
4153660620
Merge pull request #43 from mindskip/alvis
bug fix
2021-01-14 08:55:15 +08:00
alvis
e484e2142a !48 bug fix
Merge pull request !48 from alvis/alvis
2021-01-14 08:53:20 +08:00
alvis
3b38399d32 bug fix 2021-01-14 08:43:41 +08:00
alvis
10b01a2e23 bug fix 2021-01-14 08:43:28 +08:00
czm
01eafa8efc admin update 2021-01-13 20:51:59 +08:00
czm
eddbccaf23 admin update 2021-01-13 11:38:14 +08:00
alvis
4290a53654
Merge pull request #42 from mindskip/alvis
优化
2021-01-13 09:17:20 +08:00
alvis
eb00e2b31e !47 优化
Merge pull request !47 from alvis/alvis
2021-01-13 09:17:12 +08:00
alvis
4830dad754 优化 2021-01-13 09:16:31 +08:00
alvis
ecbe67e666 优化 2021-01-13 09:16:29 +08:00
czm
4916845156 vue admin update 2021-01-12 11:11:16 +08:00
思维跳跃科技
826351981c
Merge pull request #41 from mindskip/mindskip
文档更新
2021-01-12 09:27:35 +08:00
思维跳跃科技
e2382b3cec !46 文档更新
Merge pull request !46 from 思维跳跃科技/mindskip
2021-01-12 09:27:04 +08:00
mindskip
8b608641b0 更新 2021-01-12 09:25:11 +08:00
mindskip
fa1810ebd7 更新 2021-01-12 09:25:05 +08:00
alvis
9d46e6eb2b
Merge pull request #40 from mindskip/alvis
优化
2021-01-11 09:19:31 +08:00
alvis
761eb1853f !45 优化
Merge pull request !45 from alvis/alvis
2021-01-11 09:19:12 +08:00
alvis
61adcc0b32 优化 2021-01-11 09:18:12 +08:00
alvis
cf0b0dc077 优化 2021-01-11 09:18:05 +08:00
jimmy
d856c7c821 Merge branch 'master' of https://gitee.com/buddytu/xzs-mysql 2021-01-10 18:02:11 +08:00
jimmy
85b275c143 Update error msg :by jimmy 2021-01-10 18:01:54 +08:00
czm
a0eec79b25 vue admin update 2021-01-10 17:35:11 +08:00
jimmy
0d038bd0fe Add en-locale :by jimmy 2021-01-10 17:10:51 +08:00
jimmy
7010aa5658 Update wording :by jimmy 2021-01-09 23:22:46 +08:00
思维跳跃科技
4b9ea7a1de
Merge pull request #39 from mindskip/mindskip
Mindskip
2021-01-08 08:25:21 +08:00
思维跳跃科技
568367d2e7 !44 QQ交流群七:873533715
Merge pull request !44 from 思维跳跃科技/mindskip
2021-01-08 08:25:05 +08:00
mindskip
34f7f2bd62 QQ交流群七:873533715 2021-01-08 08:23:48 +08:00
mindskip
9e337a6692 QQ交流群七:873533715 2021-01-08 08:23:45 +08:00
alvis
2170658930
Merge pull request #38 from mindskip/alvis
优化
2021-01-08 08:22:07 +08:00
alvis
da2451257f !43 优化
Merge pull request !43 from alvis/alvis
2021-01-08 08:21:46 +08:00
alvis
7ca9c45855 优化 2021-01-08 08:21:14 +08:00
alvis
a1cac655ce 优化 2021-01-08 08:20:22 +08:00
alvis
e4af04df97
Merge pull request #37 from mindskip/alvis
优化
2021-01-07 11:04:39 +08:00
alvis
7ff9a9fe50 !42 优化
Merge pull request !42 from alvis/alvis
2021-01-07 11:04:28 +08:00
alvis
01f9ff0f80 优化 2021-01-07 11:03:11 +08:00
alvis
576c47a90d 优化 2021-01-07 11:02:55 +08:00
czm
a5ba2d2ad9 vue admin update 2021-01-06 23:00:13 +08:00
KukuKeng
bb2f60d22b update static file 2021-01-06 22:48:35 +08:00
KukuKeng
7e62b47795 update the static file 2021-01-06 22:29:10 +08:00
jimmy
9821987e2d Merge branch 'master' of https://gitee.com/buddytu/xzs-mysql 2021-01-06 22:24:06 +08:00
jimmy
c6f6ed0cd6 Translate into English :by jimmy 2021-01-06 22:23:32 +08:00
czm
6252f2154c Merge remote-tracking branch 'origin/master' 2021-01-06 22:06:14 +08:00
czm
487e184a9c question random update 2021-01-06 22:05:51 +08:00
KukuKeng
636963cfd1 update the static file 2021-01-06 21:58:54 +08:00
alvis
ea53348511
Merge pull request #36 from mindskip/alvis
优化
2021-01-06 10:40:08 +08:00
alvis
3399a4ff11 !41 优化
Merge pull request !41 from alvis/alvis
2021-01-06 10:39:47 +08:00
alvis
9241c4cae5 优化 2021-01-06 10:39:13 +08:00
alvis
4de5327e87 优化 2021-01-06 10:39:11 +08:00
czm
1a3ecaf9e0 question random update 2021-01-06 00:39:18 +08:00
alvis
9dd5329ef0
Merge pull request #35 from mindskip/alvis
优化
2021-01-05 10:21:42 +08:00
alvis
e3b5a4463f !40 优化
Merge pull request !40 from alvis/alvis
2021-01-05 10:21:35 +08:00
alvis
75ffa05d65 优化 2021-01-05 10:20:25 +08:00
alvis
47488d6bf5 优化 2021-01-05 10:20:19 +08:00
alvis
44ac257c3b
Merge pull request #34 from mindskip/alvis
移除lombok
2021-01-04 15:50:15 +08:00
alvis
2543014ae2 !39 移除lombok
Merge pull request !39 from alvis/alvis
2021-01-04 15:49:25 +08:00
alvis
cd8f97aab3 移除lombok 2021-01-04 15:47:33 +08:00
alvis
ac7702ad20 移除lombok 2021-01-04 15:47:08 +08:00
KukuKeng
a5a6b40b5e update student static 2020-12-31 13:14:18 +08:00
alvis
24e59e302a
Merge pull request #33 from mindskip/alvis
bug fix
2020-12-31 09:54:16 +08:00
alvis
1220f02793 !38 bug fix
Merge pull request !38 from alvis/alvis
2020-12-31 09:53:15 +08:00
alvis
d635029b00 bug fix 2020-12-31 09:52:35 +08:00
alvis
a4633b809c bug fix 2020-12-31 09:52:23 +08:00
KukuKeng
f9f2d5b956 update student static 2020-12-30 22:34:46 +08:00
KukuKeng
0195b0259c update student static 2020-12-30 18:04:59 +08:00
wushaofeng
09bd9583c2 Finish all-By Ternece 2020-12-30 17:35:13 +08:00
wushaofeng
7f96ccca8b Merge remote-tracking branch 'origin/master' 2020-12-30 17:18:16 +08:00
wushaofeng
cf41c0e75f 完成筛选页面--By Ternece 2020-12-30 17:17:52 +08:00
czm
4200a7c5de admin page update 2020-12-30 17:09:04 +08:00
czm
307523b3be Merge remote-tracking branch 'origin/master' 2020-12-30 16:49:52 +08:00
czm
e3fd87ce21 admin page update 2020-12-30 16:49:37 +08:00
wushaofeng
6ab33b7c64 Merge remote-tracking branch 'origin/master' 2020-12-30 16:39:53 +08:00
wushaofeng
25371bad43 完成试卷生成的方法 final--By Ternece 2020-12-30 16:39:28 +08:00
czm
8be8ca7cb4 admin page and log update 2020-12-30 15:06:48 +08:00
czm
20f6db1dc6 Merge remote-tracking branch 'origin/master' 2020-12-30 14:42:34 +08:00
czm
fa0eb26d9a admin page and log update 2020-12-30 14:41:49 +08:00
alvis
299cdd1770
Merge pull request #32 from mindskip/alvis
bug fix
2020-12-30 09:46:50 +08:00
alvis
9326ca716b !37 bug fix
Merge pull request !37 from alvis/alvis
2020-12-30 09:45:53 +08:00
alvis
6d2ab99fa3 Merge branch 'alvis' of github.com:mindskip/xzs-mysql into alvis 2020-12-30 09:44:06 +08:00
alvis
898159ab3a Merge branch 'alvis' of gitee.com:mindskip/xzs-mysql into alvis 2020-12-30 09:43:24 +08:00
alvis
2ecbee9561 bug fix 2020-12-30 09:41:59 +08:00
alvis
8ad34b997e bug fix 2020-12-30 09:41:50 +08:00
思维跳跃科技
004a3f5668 !36 sync
Merge pull request !36 from 思维跳跃科技/master
2020-12-29 19:04:58 +08:00
思维跳跃科技
095ba9f694 !35 sync
Merge pull request !35 from 思维跳跃科技/master
2020-12-29 19:04:36 +08:00
思维跳跃科技
8f227774ea
Merge pull request #31 from mindskip/master
sync
2020-12-29 19:03:05 +08:00
思维跳跃科技
b9efae5595
Merge pull request #30 from mindskip/master
update
2020-12-29 19:00:29 +08:00
mindskip
951f44a105 Merge branch 'master' of github.com:mindskip/xzs-mysql
# Conflicts:
#	README.md
2020-12-29 18:58:06 +08:00
思维跳跃科技
ce22c048de !34 文档更新
Merge pull request !34 from 思维跳跃科技/skill
2020-12-29 18:51:11 +08:00
mindskip
4b87315419 revert 2020-12-29 18:47:33 +08:00
思维跳跃科技
f78f7bf5f4 !33 分支同步
Merge pull request !33 from 思维跳跃科技/master
2020-12-29 18:41:50 +08:00
wushaofeng
21ee444e3f 完成试卷生成的方法 test3--By Ternece 2020-12-29 17:34:50 +08:00
wushaofeng
57c275e242 完成试卷生成的方法 test2--By Ternece 2020-12-29 17:17:23 +08:00
wushaofeng
e4b01330ae 完成试卷生成的方法--By Ternece 2020-12-29 16:42:57 +08:00
mindskip
65d0169aa7 revert 2020-12-29 16:16:39 +08:00
mindskip
60882a1d47 skill 2020-12-29 16:09:36 +08:00
czm
78435af514 admin question and static update 2020-12-29 14:27:24 +08:00
czm
9b30d479fd admin and student static update 2020-12-29 11:36:06 +08:00
czm
5b1e48e301 admin update 2020-12-29 10:05:18 +08:00
czm
27fe05a636 Merge remote-tracking branch 'remotes/origin/feature/tek-system-ui' into skill 2020-12-28 18:01:07 +08:00
jimmy
689da6d2ac Change industry api: by jimmy 2020-12-28 15:37:05 +08:00
czm
d3e39b3d6c Merge remote-tracking branch 'remotes/origin/feature/tek-system-ui' into skill 2020-12-28 15:12:36 +08:00
jimmy
8d5c1a616f Update url :by jimmy 2020-12-28 15:11:57 +08:00
czm
6b4fc9ed42 Merge remote-tracking branch 'remotes/origin/feature/tek-system-ui' into skill 2020-12-28 15:09:22 +08:00
jimmy
1f03b484d1 Update api url: by jimmy 2020-12-28 15:05:04 +08:00
czm
5b54371cfc Merge remote-tracking branch 'remotes/origin/feature/tek-system-ui' into skill 2020-12-28 14:36:08 +08:00
joycewsx
aae5223ad2 add industry page 2020-12-28 10:49:34 +08:00
思维跳跃科技
233061fae4
Merge pull request #29 from mindskip/mindskip
文档更新
2020-12-28 09:42:23 +08:00
思维跳跃科技
121b0b4dac !30 文档更新
Merge pull request !30 from 思维跳跃科技/mindskip
2020-12-28 09:42:11 +08:00
mindskip
aad4a4ac13 文档更新 2020-12-28 09:40:29 +08:00
mindskip
fc3fc344a4 文档更新 2020-12-28 09:40:21 +08:00
思维跳跃科技
5195975a37
Merge pull request #28 from mindskip/mindskip
文档更新
2020-12-26 14:10:25 +08:00
思维跳跃科技
87824ad22f !29 文档更新
Merge pull request !29 from 思维跳跃科技/mindskip
2020-12-26 14:08:04 +08:00
mindskip
250974ca58 文档更新 2020-12-26 14:05:51 +08:00
mindskip
6b22ad9eee 文档更新 2020-12-26 14:05:45 +08:00
mindskip
a4977f80b3 文档更新 2020-12-26 13:59:51 +08:00
mindskip
868ec844d1 文档更新 2020-12-26 13:59:42 +08:00
Kevin Cui
cc72c55751 Merge remote-tracking branch 'origin/master' 2020-12-25 14:46:53 +08:00
Kevin Cui
f0c861c796 拆表及行业,技能添加 by kevin.cui 2020-12-25 14:46:28 +08:00
buddytu
0108fdb36b !2 change file
Merge pull request !2 from JoyceWei/feature/tek-system-ui
2020-12-25 14:37:15 +08:00
joycewsx
d9c8047cf8 change file 2020-12-25 14:34:47 +08:00
buddytu
7e7f313aed !1 change wording
Merge pull request !1 from JoyceWei/feature/tek-system-ui
2020-12-25 14:11:29 +08:00
Joyce-wei
4ead559ae2 edit wording & change copyright 2020-12-25 13:50:56 +08:00
alvis
97fec2b58b
Merge pull request #27 from mindskip/alvis
bug fix
2020-12-25 09:31:29 +08:00
alvis
da10e9d1a8 !28 bug fix
Merge pull request !28 from alvis/alvis
2020-12-25 09:30:49 +08:00
alvis
6577201387 bug fix 2020-12-25 09:29:38 +08:00
alvis
4f4ee30cff bug fix 2020-12-25 09:29:31 +08:00
Kevin Cui
513bf28f67 拆表及行业,技能添加 by kevin.cui 2020-12-24 17:09:38 +08:00
Kevin Cui
a28e6dcd25 拆表及行业,技能添加 by kevin.cui 2020-12-24 17:06:42 +08:00
buddytu
fc58997116 upload sql file 2020-12-23 17:42:49 +08:00
思维跳跃科技
eb470320fa
Merge pull request #26 from mindskip/mindskip
文档更新
2020-12-23 09:24:09 +08:00
思维跳跃科技
4b4350b1b9 !27 文档更新
Merge pull request !27 from 思维跳跃科技/mindskip
2020-12-23 09:23:33 +08:00
mindskip
2cfa14bc51 文档更新 2020-12-23 09:20:25 +08:00
mindskip
4f4cb35490 文档更新 2020-12-23 09:20:07 +08:00
思维跳跃科技
6db2b55225
Merge pull request #25 from mindskip/mindskip
文档更新
2020-12-22 10:13:03 +08:00
思维跳跃科技
c0e918ab0e !26 文档更新
Merge pull request !26 from 思维跳跃科技/mindskip
2020-12-22 10:12:06 +08:00
mindskip
e9903beecc 文档更新 2020-12-22 10:10:38 +08:00
mindskip
52c1832f99 文档更新 2020-12-22 10:10:30 +08:00
思维跳跃科技
f8723cc8ff
Merge pull request #24 from mindskip/mindskip
文档更新
2020-12-21 11:54:34 +08:00
思维跳跃科技
6cdf1403e8 !25 文档更新
Merge pull request !25 from 思维跳跃科技/mindskip
2020-12-21 11:53:09 +08:00
mindskip
2a6c057ec1 文档更新 2020-12-21 11:52:18 +08:00
mindskip
335ab745ca 文档更新 2020-12-21 11:47:06 +08:00
思维跳跃科技
cebd237b98
Merge pull request #23 from mindskip/mindskip
文档更新
2020-12-21 11:43:24 +08:00
思维跳跃科技
dcbdfdbbce !24 文档更新
Merge pull request !24 from 思维跳跃科技/mindskip
2020-12-21 11:41:52 +08:00
mindskip
714e59b605 文档更新 2020-12-21 11:32:13 +08:00
mindskip
d096dc656f 文档更新 2020-12-21 11:31:39 +08:00
alvis
1a17d36cce
Merge pull request #22 from mindskip/alvis
bug fix
2020-12-21 09:53:24 +08:00
alvis
c739f2fbed !23 bug fix
Merge pull request !23 from alvis/alvis
2020-12-21 09:51:50 +08:00
alvis
9bb4a3dae7 bug fix 2020-12-21 09:49:33 +08:00
alvis
96dac789eb bug fix 2020-12-21 09:49:23 +08:00
alvis
6a0c620f6e
Merge pull request #21 from mindskip/alvis
v3.1.0
2020-12-18 09:51:00 +08:00
alvis
947c15f404 !22 v3.1.0
Merge pull request !22 from alvis/alvis
2020-12-18 09:50:49 +08:00
alvis
071919defd v3.1.0 2020-12-18 09:49:32 +08:00
alvis
cd575ebc3f v3.1.0 2020-12-18 09:48:37 +08:00
思维跳跃科技
beafc51393
Merge pull request #20 from mindskip/mindskip
文档更新
2020-12-17 13:34:57 +08:00
思维跳跃科技
6da3ef4c5b !21 文档更新
Merge pull request !21 from 思维跳跃科技/mindskip
2020-12-17 13:34:29 +08:00
mindskip
95f40b903f 文档更新 2020-12-17 13:33:28 +08:00
mindskip
3e706b361a 文档更新 2020-12-17 13:33:20 +08:00
思维跳跃科技
c8c47607f4
Merge pull request #19 from mindskip/mindskip
教程修订
2020-12-16 10:10:46 +08:00
思维跳跃科技
cbe91187e6 !20 教程修订
Merge pull request !20 from 思维跳跃科技/mindskip
2020-12-16 10:10:09 +08:00
mindskip
8e79a71b1f 教程修订 2020-12-16 10:08:50 +08:00
mindskip
75eea70d6f 教程修订 2020-12-16 10:08:33 +08:00
alvis
9cb23a94a7
Merge pull request #18 from mindskip/alvis
bug fix
2020-12-15 09:23:42 +08:00
alvis
ed8ada2ecc !19 bug fix
Merge pull request !19 from alvis/alvis
2020-12-15 09:21:59 +08:00
alvis
6794b1135c bug fix 2020-12-15 09:21:29 +08:00
alvis
05922d6484 bug fix 2020-12-15 09:21:14 +08:00
alvis
09f6a81797 !18 bug修复
Merge pull request !18 from alvis/alvis
2020-12-14 09:14:50 +08:00
alvis
30cf0c06fc
Merge pull request #17 from mindskip/alvis
bug fix
2020-12-14 09:14:42 +08:00
alvis
c68fc57e55 bug fix 2020-12-14 09:13:38 +08:00
alvis
b6bcff27c0 bug fix 2020-12-14 09:13:18 +08:00
alvis
01d27afdde
Merge pull request #16 from mindskip/alvis
bug修复
2020-12-11 11:03:48 +08:00
alvis
072a27c5b3 !17 bug修复
Merge pull request !17 from alvis/alvis
2020-12-11 11:03:25 +08:00
alvis
c885a0e60b bug修复 2020-12-11 11:02:27 +08:00
alvis
a29aaed59c bug修复 2020-12-11 11:02:10 +08:00
alvis
dd9590ea84
Merge pull request #15 from mindskip/alvis
日期bug修复
2020-12-10 10:15:23 +08:00
alvis
efccda92ea !16 日期bug修复
Merge pull request !16 from alvis/alvis
2020-12-10 10:14:56 +08:00
alvis
3d25cba611 日期bug修复 2020-12-10 10:13:42 +08:00
alvis
ffd4f03f04 日期bug修复 2020-12-10 10:13:12 +08:00
alvis
b27f525152 !15 修复日期选择bug
Merge pull request !15 from alvis/alvis
2020-12-09 10:04:34 +08:00
alvis
d8c583b5a6
Merge pull request #14 from mindskip/alvis
修复日期选择bug
2020-12-09 10:04:30 +08:00
alvis
895f6c81c8 修复日期选择bug 2020-12-09 10:03:09 +08:00
alvis
4661a5aa5c 修复日期选择bug 2020-12-09 10:02:43 +08:00
alvis
53512232be
Merge pull request #13 from mindskip/alvis
bug修复
2020-12-08 09:43:26 +08:00
alvis
04a5cba4f1 !14 bug修复
Merge pull request !14 from alvis/alvis
2020-12-08 09:40:36 +08:00
alvis
16f476e84f bug修复 2020-12-08 09:39:44 +08:00
alvis
7de7784428 bug修复 2020-12-08 09:38:23 +08:00
思维跳跃科技
05fb737bf4
Merge pull request #12 from mindskip/mindskip
教程更新
2020-12-04 10:02:26 +08:00
思维跳跃科技
d812d2a928 !13 教程更新
Merge pull request !13 from 思维跳跃科技/mindskip
2020-12-04 10:01:34 +08:00
mindskip
edeeeb06c1 教程更新 2020-12-04 10:00:16 +08:00
mindskip
89e408ce90 教程更新 2020-12-04 10:00:11 +08:00
思维跳跃科技
1d9d9d057d
Merge pull request #11 from mindskip/mindskip
文档更新
2020-12-04 09:37:37 +08:00
思维跳跃科技
489faeda9a !12 教程更新
Merge pull request !12 from 思维跳跃科技/mindskip
2020-12-04 09:36:24 +08:00
mindskip
039a824302 文档更新 2020-12-03 10:30:33 +08:00
mindskip
fed4d3aa84 文档更新 2020-12-03 10:30:09 +08:00
思维跳跃科技
c1a915d8c5
Merge pull request #10 from mindskip/mindskip
教程更新
2020-12-03 10:26:35 +08:00
思维跳跃科技
475c822992
Merge pull request #9 from mindskip/alvis
bug修复
2020-12-03 10:26:25 +08:00
思维跳跃科技
4d1d45f85f !11 教程更新
Merge pull request !11 from 思维跳跃科技/mindskip
2020-12-03 10:24:59 +08:00
思维跳跃科技
129b5bea16 !10 bug修复
Merge pull request !10 from alvis/alvis
2020-12-03 10:24:53 +08:00
mindskip
9f32af9dfe 教程更新 2020-12-03 10:22:17 +08:00
mindskip
799f12bbf1 教程更新 2020-12-03 10:21:04 +08:00
alvis
b587430e3b bug修复 2020-12-03 10:09:24 +08:00
alvis
e81dc80a57 bug修复 2020-12-03 10:09:01 +08:00
alvis
945af9de76
Merge pull request #8 from mindskip/alvis
bug修复
2020-12-02 09:54:31 +08:00
alvis
c15c981254 !9 bug修复
Merge pull request !9 from alvis/alvis
2020-12-02 09:54:12 +08:00
alvis
879f0ab05e bug修复 2020-12-02 09:53:23 +08:00
alvis
ec2b7d1a0a bug修复 2020-12-02 09:53:01 +08:00
alvis
40ecab5a08
Merge pull request #7 from mindskip/alvis
主题切换
2020-12-01 09:17:59 +08:00
alvis
5f726d9dc6 !8 主题切换
Merge pull request !8 from alvis/alvis
2020-12-01 09:17:54 +08:00
alvis
945fe04b15 主题切换 2020-12-01 09:16:55 +08:00
alvis
db79588ca5 主题切换 2020-12-01 09:16:27 +08:00
alvis
c181e74ae5 !7 bug修复 缓存优化
Merge pull request !7 from alvis/alvis
2020-11-30 09:01:05 +08:00
alvis
50a41fb154
Merge pull request #6 from mindskip/alvis
bug修复、缓存优化
2020-11-30 08:58:59 +08:00
alvis
30a85560ab bug修复、缓存优化 2020-11-30 08:58:46 +08:00
alvis
18b5b2ccf7 bug修复、缓存优化 2020-11-30 08:58:07 +08:00
alvis
5b79ff5cd3
Merge pull request #5 from mindskip/alvis
bug修复
2020-11-27 10:56:05 +08:00
alvis
e714443e8d !6 bug修复
Merge pull request !6 from alvis/alvis
2020-11-27 10:55:38 +08:00
alvis
0cb5f1c107 bug修复 2020-11-27 10:54:51 +08:00
alvis
36e885ffde bug修复 2020-11-27 10:54:13 +08:00
mindskip
e9ceca7f2d Merge branch 'master' of gitee.com:mindskip/xzs-mysql 2020-11-26 11:59:32 +08:00
mindskip
6fb0f49cb0 update README.md 2020-11-26 11:58:20 +08:00
alvis
96dd9d77f9
Merge pull request #4 from mindskip/alvis
bug fix
2020-11-26 10:00:39 +08:00
alvis
ddf41b5307 !5 bug fix
Merge pull request !5 from alvis/alvis
2020-11-26 09:50:52 +08:00
alvis
9fb56f7b08 bug fix 2020-11-26 09:49:24 +08:00
alvis
6cc0613668 bug fix 2020-11-26 09:48:39 +08:00
alvis
6fab2ea2cd
Merge pull request #2 from mindskip/alvis
组件升级:
2020-11-25 11:30:52 +08:00
alvis
dd1a47344a !3 组件升级 bug修复
Merge pull request !3 from alvis/alvis
2020-11-25 11:27:56 +08:00
alvis
5a99fe23d8 组件升级:
+ @vue/cli-service@4.5.9
+ @vue/cli-plugin-router@4.5.9
+ @vue/cli-plugin-eslint@4.5.9
+ @vue/cli-plugin-babel@4.5.9
+ @vue/cli-plugin-vuex@4.5.9

bug 修复:
重置
2020-11-25 11:24:23 +08:00
alvis
2a6b3bd909 组件升级:
+ @vue/cli-service@4.5.9
+ @vue/cli-plugin-router@4.5.9
+ @vue/cli-plugin-eslint@4.5.9
+ @vue/cli-plugin-babel@4.5.9
+ @vue/cli-plugin-vuex@4.5.9

bug 修复:
重置
2020-11-25 11:23:30 +08:00
alvis
e8272a723e
Merge pull request #1 from mindskip/alvis
bug 修复
2020-11-24 11:33:22 +08:00
alvis
2fc25ad943 bug 修复 2020-11-24 11:31:23 +08:00
思维跳跃科技
25bf2959f0 !2 bug修复
Merge pull request !2 from alvis/alvis
2020-11-24 10:58:25 +08:00
alvis
f1dc6e77af bug修复 2020-11-24 10:52:18 +08:00
mindskip
e53c08839f v3.0.8 2020-11-23 10:52:40 +08:00
mindskip
adb674d5ed Merge branch 'master' of gitee.com:mindskip/xzs-mysql 2020-11-23 10:26:14 +08:00
mindskip
1bcd1e25d0 学之思交流群⑥:593529956 2020-11-23 10:24:54 +08:00
alvis
4ee37785c2 remove useless code 2020-11-22 13:32:37 +08:00
mindskip
15ce5c73cd v3.0.8 2020-11-21 14:22:39 +08:00
mindskip
423ca88806 文档更新 2020-11-20 08:45:05 +08:00
309 changed files with 23947 additions and 28728 deletions

6
.gitattributes vendored
View File

@ -1,2 +1,4 @@
*.js linguist-language=java *.js linguist-language=javascript
*.css linguist-language=java *.css linguist-language=css
*.java linguist-language=java
*.vue linguist-language=vue

View File

@ -1,4 +1,23 @@
# 学之思在线考试系统 <p></p>
<p></p>
<p align="center">
<a href="https://www.mindskip.net" target="_blank">
<img src="doc/image/logo/1.png" height="80"/>
<a/>
</p>
<div align="center">
[![Gitee star](https://gitee.com/mindskip/xzs-mysql/badge/star.svg?theme=gitee)](https://gitee.com/mindskip/xzs-mysql)
[![Gitee fork](https://gitee.com/mindskip/xzs-mysql/badge/fork.svg?theme=gitee)](https://gitee.com/mindskip/xzs-mysql)
[![Github stars](https://img.shields.io/github/stars/mindskip/xzs-mysql?logo=github)](https://github.com/mindskip/xzs-mysql)
[![Github forks](https://img.shields.io/github/forks/mindskip/xzs-mysql?logo=github)](https://github.com/mindskip/xzs-mysql)
[![Github license](https://img.shields.io/badge/license-AGPL-yellow)](https://gitee.com/mindskip/xzs-mysql/blob/master/LICENSE)
</div>
# 学之思在线考试系统 - Mysql版
## 项目介绍 ## 项目介绍
@ -12,11 +31,11 @@
### 演示地址 ### 演示地址
* 官网:[http://www.mindskip.net](http://www.mindskip.net) * 官网:[https://www.mindskip.net](https://www.mindskip.net)
* 学之思考试系统:[http://www.mindskip.net/xzs.html](http://www.mindskip.net/xzs.html) * 学之思考试系统:[https://www.mindskip.net/xzs.html](https://www.mindskip.net/xzs.html)
* 学多多考试系统:[http://www.mindskip.net/xdd.html](http://www.mindskip.net/xdd.html) * 思多多智能考试平台:[https://www.mindskip.net/sdd.html](https://www.mindskip.net/sdd.html)
* 思多多智能考试平台:[http://www.mindskip.net/sdd.html](http://www.mindskip.net/sdd.html) * 维多多培训考试系统:[https://www.mindskip.net/wdd.html](https://www.mindskip.net/wdd.html)
* 维多多培训考试系统:[http://www.mindskip.net/wdd.html](http://www.mindskip.net/wdd.html) * 学多多考试系统:[https://www.mindskip.net/xdd.html](https://www.mindskip.net/xdd.html)
### 学之思仓库版本地址 ### 学之思仓库版本地址
@ -27,13 +46,13 @@
### 学之思交流群(加群获取数据库脚本) ### 学之思交流群(加群获取数据库脚本)
* 交流五群:`1074095891` * QQ交流群八`902855996`
* QQ`2693073475` * QQ`2693073475`
* 微信:`alvis-u` * 微信:`alvis-u`
### 开发部署教程 ### 开发部署教程
* [http://mindskip.gitee.io/uexam/](http://mindskip.gitee.io/uexam/) * [https://www.mindskip.net:999](https://www.mindskip.net:999)
### 学生系统功能 ### 学生系统功能
@ -50,7 +69,7 @@
* 登录: 账号为: admin/123456 * 登录: 账号为: admin/123456
* 主页: 包含了试卷、题目、做卷数、做题数、用户活跃度的统计功能,活跃度和做题数是按月统计 * 主页: 包含了试卷、题目、做卷数、做题数、用户活跃度的统计功能,活跃度和做题数是按月统计
* 用户管理: 对不同角色 学生、教师、管理员 的增删改查管理功能 * 用户管理: 对不同角色 学生、管理员 的增删改查管理功能
* 卷题管理: * 卷题管理:
1. 试卷列表:试卷的增删改查,新增包含选择学科、试卷类型、试卷名称、考试时间,试卷内容包含添加大标题,然后添加题目到此试卷中,组成一套完整的试卷 1. 试卷列表:试卷的增删改查,新增包含选择学科、试卷类型、试卷名称、考试时间,试卷内容包含添加大标题,然后添加题目到此试卷中,组成一套完整的试卷
2. 题目列表:题目的增删改查,目前题型包含单选题、多选题、判断题、填空题、简单题,支持图片、公式等。 2. 题目列表:题目的增删改查,目前题型包含单选题、多选题、判断题、填空题、简单题,支持图片、公式等。
@ -63,13 +82,9 @@
* 用户登录登出功能,登录会自动绑定微信账号,登出会解绑 * 用户登录登出功能,登录会自动绑定微信账号,登出会解绑
* 首页包含任务中心、固定试卷、时段试卷和web端保持一致 * 首页包含任务中心、固定试卷、时段试卷和web端保持一致
* 试卷模块,固定试卷和时段试卷的分页查询,下拉加载更多,上拉刷新当前数据 * 试卷模块:固定试卷和时段试卷的分页查询,下拉加载更多、上拉刷新当前数据
* 记录模块,考试结果的分页,包含了试卷基本信息 * 记录模块:考试结果的分页,包含了试卷基本信息
* 我的模块,包含个人资料的修改,个人动态,消息中心模块 * 我的模块:包含个人资料的修改、个人动态、消息中心模块
### 软件架构图
![](doc/image/frame/2.png)
### 系统展示 ### 系统展示

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 551 KiB

After

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 105 KiB

BIN
doc/image/logo/1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

BIN
docs/1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

View File

@ -10,26 +10,10 @@
禁止将本项目的代码和资源进行任何形式的出售,产生的一切任何后果责任由侵权者自负 禁止将本项目的代码和资源进行任何形式的出售,产生的一切任何后果责任由侵权者自负
## 演示地址 ## 学之思仓库地址
官网:<http://www.mindskip.net>
学之思考试系统:<http://www.mindskip.net/xzs.html>
学多多考试系统:<http://www.mindskip.net/xdd.html>
思多多智能考试平台:<http://www.mindskip.net/sdd.html>
维多多培训考试系统:<http://www.mindskip.net/wdd.html>
## 学之思仓库版本地址
gitee - postgresql [https://gitee.com/mindskip/uexam](https://gitee.com/mindskip/uexam)
gitee - mysql [https://gitee.com/mindskip/xzs-mysql](https://gitee.com/mindskip/xzs-mysql) gitee - mysql [https://gitee.com/mindskip/xzs-mysql](https://gitee.com/mindskip/xzs-mysql)
github - postgresql [https://github.com/mindskip/xzs](https://github.com/mindskip/xzs)
github - mysql [https://github.com/mindskip/xzs-mysql](https://github.com/mindskip/xzs-mysql) github - mysql [https://github.com/mindskip/xzs-mysql](https://github.com/mindskip/xzs-mysql)
## 运行环境 ## 运行环境
@ -37,9 +21,9 @@ github - mysql [https://github.com/mindskip/xzs-mysql](https://github.com/min
| 环境 | 版本 | | 环境 | 版本 |
| ---- | ---- | | ---- | ---- |
| 操作系统 | Windows / Linux | | 操作系统 | Windows / Linux |
| Jdk | 8 | | Jdk | 1.8 |
| Redis | 6.0 | | Redis | 6.0 |
| PostgreSql / Mysql | 12.0 / 8.0 | | Mysql | 8.0 |
## 技术栈列表 ## 技术栈列表
@ -48,40 +32,241 @@ github - mysql [https://github.com/mindskip/xzs-mysql](https://github.com/min
* spring-boot 2.1.6.RELEASE * spring-boot 2.1.6.RELEASE
* spring-boot-security 用户登录验证 * spring-boot-security 用户登录验证
* undertow web容器 * undertow web容器
* postgresql/mysql 优秀的开源数据库 * mysql 最流行的开源数据库
* redis 缓存,提升系统性能 * redis 缓存,提升系统性能
* mybatis 数据库中间件 * mybatis 数据库中间件
* hikari 速度最快的数据库连接池 * hikari 速度最快的数据库连接池
* 七牛云存储 目前10G内免费 * 七牛云存储 分布式文件存储中心
### 前台系统 ### 前台系统
* Vue.js 采用新版使用了vue-cli3搭建的系统,减少大量配置文件 * vue 采用新版使用了vue-cli4搭建的系统,减少大量配置文件
* element-ui 最流行的vue组件,采用的最新版 * element-ui 最流行的vue UI框架
* vue-element-admin 最新版,对该系统做了大量精简,只保留了部分样式和控件 * vue-element-admin 深度定制版
* echarts 图表统计 * echarts 图表统计
* ueditor 填空题扩展插件 * ueditor 深度定制版
### 微信小程序 ### 微信小程序
* iView 主题样式 * iView 主题样式
## 架构图
![架构图](1.png)
## 数据库设计
### 试卷表 t_exam_paper
| 字段名 | 类型 | 注释 |
| ---- | ---- | ---- |
| id | int | |
| name | varchar | 试卷名称 |
| subject_id | int | 学科 |
| paper_type | int | 试卷类型( 1固定试卷 4.时段试卷 6.任务试卷) |
| grade_level | int | 年级 |
| score | int | 试卷总分(千分制) |
| question_count | int | 题目数量 |
| suggest_time | int | 建议时长(分钟) |
| limit_start_time | datetime | 时段试卷 开始时间 |
| limit_end_time | datetime | 时段试卷 结束时间 |
| frame_text_content_id | int | 试卷框架 内容为JSON |
| create_user | int | |
| create_time | datetime | |
| deleted | bit | |
| task_exam_id | int | |
### 试卷答案表 t_exam_paper_answer
| 字段名 | 类型 | 注释 |
| ---- | ---- | ---- |
| id | int | |
| exam_paper_id | int | |
| paper_name | varchar | 试卷名称 |
| paper_type | int | 试卷类型( 1固定试卷 2临时试卷 3班级试卷 4.时段试卷 ) |
| subject_id | int | 学科 |
| system_score | int | 系统判定得分 |
| user_score | int | 最终得分(千分制) |
| paper_score | int | 试卷总分 |
| question_correct | int | 做对题目数量 |
| question_count | int | 题目总数量 |
| do_time | int | 做题时间(秒) |
| status | int | 试卷状态(1待判分 2完成) |
| create_user | int | 学生 |
| create_time | datetime | 提交时间 |
| task_exam_id | int | |
### 试卷题目答案表 t_exam_paper_question_customer_answer
| 字段名 | 类型 | 注释 |
| ---- | ---- | ---- |
| id | int | |
| question_id | int | 题目Id |
| exam_paper_id | int | 答案Id |
| exam_paper_answer_id | int | |
| question_type | int | 题型 |
| subject_id | int | 学科 |
| customer_score | int | 得分 |
| question_score | int | 题目原始分数 |
| question_text_content_id | int | 问题内容 |
| answer | varchar | 做题答案 |
| text_content_id | int | 做题内容 |
| do_right | bit | 是否正确 |
| create_user | int | 做题人 |
| create_time | datetime | |
| item_order | int | |
### 消息表 t_message
| 字段名 | 类型 | 注释 |
| ---- | ---- | ---- |
| id | int | |
| title | varchar | 标题 |
| content | varchar | 内容 |
| create_time | datetime | |
| send_user_id | int | 发送者用户ID |
| send_user_name | varchar | 发送者用户名 |
| send_real_name | varchar | 发送者真实姓名 |
| receive_user_count | int | 接收人数 |
| read_count | int | 已读人数 |
### 用户消息表 t_message_user
| 字段名 | 类型 | 注释 |
| ---- | ---- | ---- |
| id | int | |
| message_id | int | 消息内容ID |
| receive_user_id | int | 接收人ID |
| receive_user_name | varchar | 接收人用户名 |
| receive_real_name | varchar | 接收人真实姓名 |
| readed | bit | 是否已读 |
| create_time | datetime | |
| read_time | datetime | 阅读时间 |
### 题目表 t_question
| 字段名 | 类型 | 注释 |
| ---- | ---- | ---- |
| id | int | |
| question_type | int | 1.单选题 2.多选题 3.判断题 4.填空题 5.简答题 |
| subject_id | int | 学科 |
| score | int | 题目总分(千分制) |
| grade_level | int | 级别 |
| difficult | int | 题目难度 |
| correct | text | 正确答案 |
| info_text_content_id | int | 题目 填空、 题干、解析、答案等信息 |
| create_user | int | 创建人 |
| status | int | 1.正常 |
| create_time | datetime | 创建时间 |
| deleted | bit | |
### 学科表 t_subject
| 字段名 | 类型 | 注释 |
| ---- | ---- | ---- |
| id | int | |
| name | varchar | 语文 数学 英语 等 |
| level | int | 年级 (1-12) 小学 初中 高中 大学 |
| level_name | varchar | 一年级、二年级等 |
| item_order | int | 排序 |
| deleted | bit | |
### 任务表 t_task_exam
| 字段名 | 类型 | 注释 |
| ---- | ---- | ---- |
| id | int | |
| title | varchar | |
| grade_level | int | 级别 |
| frame_text_content_id | int | 任务框架 内容为JSON |
| create_user | int | |
| create_time | datetime | |
| deleted | bit | |
| create_user_name | varchar | |
### 用户任务表 t_task_exam_customer_answer
| 字段名 | 类型 | 注释 |
| ---- | ---- | ---- |
| id | int | |
| task_exam_id | int | |
| create_user | int | |
| create_time | datetime | |
| text_content_id | int | 任务完成情况(Json) |
### 文本表 t_text_content
| 字段名 | 类型 | 注释 |
| ---- | ---- | ---- |
| id | int | |
| content | text | |
| create_time | datetime | |
### 用户表 t_user
| 字段名 | 类型 | 注释 |
| ---- | ---- | ---- |
| id | int | |
| user_uuid | varchar | |
| user_name | varchar | 用户名 |
| password | varchar | |
| real_name | varchar | 真实姓名 |
| age | int | |
| sex | int | 1.男 2女 |
| birth_day | datetime | |
| user_level | int | 学生年级(1-12) |
| phone | varchar | |
| role | int | 1.学生 2.老师 3.管理员 |
| status | int | 1.启用 2禁用 |
| image_path | varchar | 头像地址 |
| create_time | datetime | |
| modify_time | datetime | |
| last_active_time | datetime | |
| deleted | bit | 是否删除 |
| wx_open_id | varchar | 微信openId |
### 用户日志表 t_user_event_log
| 字段名 | 类型 | 注释 |
| ---- | ---- | ---- |
| id | int | |
| user_id | int | 用户id |
| user_name | varchar | 用户名 |
| real_name | varchar | 真实姓名 |
| content | text | 内容 |
| create_time | datetime | 时间 |
### 用户Token表 t_user_token
| 字段名 | 类型 | 注释 |
| ---- | ---- | ---- |
| id | int | |
| token | varchar | |
| user_id | int | 用户Id |
| wx_open_id | varchar | 微信openId |
| create_time | datetime | |
| end_time | datetime | |
| user_name | varchar | 用户名 |
## 项目开发 ## 项目开发
### 开发说明 ### 开发说明
* redis 安装 * redis 安装
* 进群获取到数据库脚本创建表初始化数据数据库名称为xzs * 进群获取到数据库脚本创建表初始化数据数据库名称为xzs
* 代码分为 mysql / postgresql 2个版本配合响应的数据库使用 * 代码分为 mysql版本配合相应的数据库使用
* 安装mysql / postgresql ,数据库二选一即可 导入sql脚本。mysql导入xzs-mysql.sql脚本。postgresql导入xzx-postgresql.sql脚本。 * 安装mysql 导入xzs-mysql.sql脚本。
* 学生端默认账号student / 123456
* 管理端默认账号admin / 123456
### 后端开发 ### 后端开发
* /uexam/source/xzs为后台代码建议使用IntelliJ IDEA打开 * /uexam/source/xzs为后台代码建议使用IntelliJ IDEA打开
* 打开application-dev.yml文件中配置好postgesql/mysql、redis的服务地址 * 打开application-dev.yml文件中配置好postgesql/mysql、redis的服务地址
* 去七牛云官网申请好云存储账号修改application.yml中的qn相关的配置
* 启动后台程序,默认端口为8000。 * 启动后台程序,默认端口为8000。
* 学生系统地址:<http://localhost:8000/student> * 学生系统地址:<http://ip:8000/student>
* 管理端地址:<http://localhost:8000/admin> * 管理端地址:<http://ip:8000/admin>
### 前端开发 ### 前端开发
@ -131,7 +316,7 @@ npm run build
* 执行下列命令,运行程序 * 执行下列命令,运行程序
```java ```java
nohup java -Duser.timezone=Asia/Shanghai -jar -Dspring.profiles.active=prod xzs-3.0.7.jar > start1.log 2>&1 & nohup java -Duser.timezone=Asia/Shanghai -jar -Dspring.profiles.active=prod xzs-3.2.0.jar > start1.log 2>&1 &
``` ```
### 前后端分离部署 ### 前后端分离部署
@ -152,7 +337,7 @@ server {
index index.html; index index.html;
} }
location /api/ { location /api/ {
proxy_pass https://localhost:8000; proxy_pass http://localhost:8000;
} }
} }
``` ```
@ -166,6 +351,6 @@ server {
* 管理员端访问地址为:<http://ip:8001/admin> * 管理员端访问地址为:<http://ip:8001/admin>
```docker ```docker
docker pull registry.cn-hangzhou.aliyuncs.com/mindskip/xzs:v3.0.6 docker pull registry.cn-hangzhou.aliyuncs.com/mindskip/xzs:v3.2.0
docker run -d --name xzs --privileged -it -d -p 8001:8001 registry.cn-hangzhou.aliyuncs.com/mindskip/xzs:v3.0.6 /usr/sbin/init docker run -d --name xzs --privileged -it -d -p 8001:8001 -v /etc/localtime:/etc/localtime:ro registry.cn-hangzhou.aliyuncs.com/mindskip/xzs:v3.2.0 /usr/sbin/init
``` ```

View File

@ -1,7 +1,7 @@
# 学之思考试系统 # 学之思考试系统
> 学之思在线考试系统支持多种题型选择题、多选题、判断题、填空题、解答题以及数学公式包含PC端、小程序端扩展性强部署方便、界面设计友好、代码结构清晰 > 学之思在线考试系统是一款 java + vue 的前后端分离的考试系统。主要优点是开发、部署简单快捷、界面设计友好、代码结构清晰。支持web端和微信小程序能覆盖到pc机和手机等设备。 支持多种部署方式集成部署、前后端分离部署、docker部署
[Gitee](https://gitee.com/mindskip/uexam) [Gitee](https://gitee.com/mindskip/uexam)
[Get Started](#quick-start) [Get Started](#目录)

1
docs/docsify@4.js Normal file

File diff suppressed because one or more lines are too long

BIN
docs/favicon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@ -1,23 +1,42 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html lang="en">
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<title>学之思考试系统</title> <title>学之思开发部署教程</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta name="description" content="Description"> <meta name="description" content="Description">
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<link rel="stylesheet" href="//unpkg.com/docsify/lib/themes/vue.css"> <link rel="stylesheet" href="vue.css">
<link rel="stylesheet" href="xzs.css"> <link rel="stylesheet" href="xzs.css">
<link rel="shortcut icon" href="favicon.png">
</head> </head>
<body>
<body style="min-width: 1024px;">
<nav class="head">
<div class="head-logo">
<a href="https://www.mindskip.net" target="_blank">
<img src="logo.png" />
</a>
</div>
<div class="head-link">
<a href="https://www.mindskip.net/" target="_blank">官网</a>
<a href="https://www.mindskip.net/sdd.html" target="_blank">思多多</a>
<a href="https://www.mindskip.net/wdd.html" target="_blank">维多多</a>
<a href="https://www.mindskip.net/xdd.html" target="_blank">学多多</a>
<a href="https://www.mindskip.net/xzs.html" target="_blank">学之思</a>
<a href="https://www.mindskip.net/buy.html" target="_blank">商业购买</a>
</div>
</nav>
<div id="app"></div> <div id="app"></div>
<script> <script>
window.$docsify = { window.$docsify = {
name: '学之思考试系统', name: '学之思开发部署教程',
repo: 'http://www.mindskip.net/xzs.html',
coverpage: false coverpage: false
} }
</script> </script>
<script src="//unpkg.com/docsify/lib/docsify.min.js"></script> <!-- Docsify v4 -->
<script src="docsify@4.js"></script>
</body> </body>
</html> </html>

BIN
docs/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

1005
docs/vue.css Normal file

File diff suppressed because it is too large Load Diff

View File

@ -5,3 +5,35 @@ table th {
table td { table td {
text-align: center; text-align: center;
} }
.head {
display: flex;
flex-direction: row;
justify-content: space-between;
width: 100%;
margin: 0px !important;
line-height: 58px;
padding: 10px 20px;
background-color: #f8f8f8;
flex-wrap: wrap;
}
.head-logo {
height: 58px;
width: 182px;
line-height: 78px;
}
.head-link {
display: flex;
justify-content: flex-start;
flex-wrap: wrap;
}
.head-link a {
margin-left: 25px;
}
.content {
padding-top: 80px !important;
}

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
{ {
"name": "xzs-admin", "name": "xzs-admin",
"version": "3.0.7", "version": "3.3.0",
"author": "武汉思维跳跃科技有限公司", "author": "武汉思维跳跃科技有限公司",
"description": "学之思管理系统", "description": "学之思管理系统",
"license": "AGPL-3.0", "license": "AGPL-3.0",
@ -16,22 +16,22 @@
}, },
"dependencies": { "dependencies": {
"axios": "^0.19.0", "axios": "^0.19.0",
"core-js": "^3.7.0", "core-js": "^3.9.0",
"element-ui": "^2.14.1", "element-ui": "^2.15.0",
"js-cookie": "2.2.0", "js-cookie": "2.2.0",
"normalize.css": "8.0.1", "normalize.css": "8.0.1",
"nprogress": "0.2.0", "nprogress": "0.2.0",
"vue": "^2.6.10", "vue": "^2.6.10",
"vue-count-to": "^1.0.13", "vue-count-to": "^1.0.13",
"vue-router": "^3.4.9", "vue-router": "^3.5.1",
"vuex": "^3.5.1" "vuex": "^3.6.2"
}, },
"devDependencies": { "devDependencies": {
"@vue/cli-plugin-babel": "^4.5.8", "@vue/cli-plugin-babel": "^4.5.11",
"@vue/cli-plugin-eslint": "^4.5.8", "@vue/cli-plugin-eslint": "^4.5.11",
"@vue/cli-plugin-router": "^4.5.8", "@vue/cli-plugin-router": "^4.5.11",
"@vue/cli-plugin-vuex": "^4.5.8", "@vue/cli-plugin-vuex": "^4.5.11",
"@vue/cli-service": "^4.5.8", "@vue/cli-service": "^4.5.11",
"@vue/eslint-config-standard": "^4.0.0", "@vue/eslint-config-standard": "^4.0.0",
"babel-eslint": "^10.1.0", "babel-eslint": "^10.1.0",
"eslint": "^5.16.0", "eslint": "^5.16.0",

File diff suppressed because one or more lines are too long

View File

@ -1,5 +1,5 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html>
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" /> <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />

View File

@ -0,0 +1,5 @@
import { post } from '@/utils/request'
export default {
page: query => post('/api/admin/examPaperAnswer/page', query)
}

View File

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1569065326528" class="icon" viewBox="0 0 1152 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3178" xmlns:xlink="http://www.w3.org/1999/xlink" width="225" height="200"><defs><style type="text/css"></style></defs><path d="M1023.584 0 128.416 0C57.472 0 0 57.504 0 128.416L0 767.584C0 838.496 57.472 896 128.416 896L192 896 192 985.856C192 1007.904 210.08 1024 230.112 1024 235.552 1024 241.12 1022.816 246.528 1020.256L480.544 908.48C497.76 900.256 516.608 896 535.68 896L1023.584 896C1094.496 896 1152 838.496 1152 767.584L1152 128.416C1152 57.504 1094.496 0 1023.584 0ZM319.9936 352C319.9936 334.32689 334.221792 320 352.021504 320L799.965696 320C817.654208 320 831.9936 334.203674 831.9936 352 831.9936 369.67311 817.765408 384 799.965696 384L352.021504 384C334.332992 384 319.9936 369.796326 319.9936 352ZM319.9936 544C319.9936 526.32689 334.221792 512 352.021504 512L799.965696 512C817.654208 512 831.9936 526.203674 831.9936 544 831.9936 561.67311 817.765408 576 799.965696 576L352.021504 576C334.332992 576 319.9936 561.796326 319.9936 544Z" p-id="3179"></path></svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -9,7 +9,7 @@
</div> </div>
<app-main /> <app-main />
<div class="foot-copyright"> <div class="foot-copyright">
<span>Copyright © 2020 武汉思维跳跃科技有限公司 版权所有</span> <span>Copyright © 2021 武汉思维跳跃科技有限公司 版权所有</span>
</div> </div>
<back-to-top :visibility-height="100" :back-position="0" transition-name="fade" ref="backTop"/> <back-to-top :visibility-height="100" :back-position="0" transition-name="fade" ref="backTop"/>
</div> </div>

View File

@ -187,6 +187,24 @@ const constantRoutes = [
} }
] ]
}, },
{
path: '/answer',
component: Layout,
name: 'AnswerPage',
meta: {
title: '成绩管理',
icon: 'answer'
},
alwaysShow: true,
children: [
{
path: 'list',
component: () => import('@/views/answer/list'),
name: 'AnswerPageList',
meta: { title: '答卷列表', noCache: true }
}
]
},
{ {
path: '/message', path: '/message',
component: Layout, component: Layout,

View File

@ -0,0 +1,96 @@
<template>
<div class="app-container">
<el-form :model="queryParam" ref="queryForm" :inline="true">
<el-form-item label="学科:" >
<el-select v-model="queryParam.subjectId" clearable>
<el-option v-for="item in subjects" :key="item.id" :value="item.id" :label="item.name"></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="submitForm">查询</el-button>
</el-form-item>
</el-form>
<el-table v-loading="listLoading" :data="tableData" border fit highlight-current-row style="width: 100%">
<el-table-column prop="id" label="Id" width="100" />
<el-table-column prop="paperName" label="试卷名称"/>
<el-table-column prop="userName" label="用户名称"/>
<el-table-column label="得分" width="100px" >
<template slot-scope="{row}">
{{row.userScore}} / {{row.paperScore}}
</template>
</el-table-column>
<el-table-column label="题目对错" width="80px" >
<template slot-scope="{row}">
{{row.questionCorrect}} / {{row.questionCount}}
</template>
</el-table-column>
<el-table-column prop="doTime" label="耗时" width="100px"/>
<el-table-column prop="createTime" label="提交时间" width="160px"/>
<el-table-column label="操作" width="160px">
<template slot-scope="scope" >
<el-button v-show="scope.row.status == 1" type="primary" round @click="toedit(scope.row.id,1)">批改</el-button>
<el-button v-show="scope.row.status == 2" type="primary" round @click="toedit(scope.row.id,0)">查看试卷</el-button>
</template>
</el-table-column>
</el-table>
<pagination v-show="total>0" :total="total" :page.sync="queryParam.pageIndex" :limit.sync="queryParam.pageSize"
@pagination="search"/>
</div>
</template>
<script>
import { mapGetters, mapState, mapActions } from 'vuex'
import Pagination from '@/components/Pagination'
import examPaperAnswerApi from '@/api/examPaperAnwser'
export default {
components: { Pagination },
data () {
return {
queryParam: {
subjectId: null,
pageIndex: 1,
pageSize: 10
},
listLoading: false,
tableData: [],
total: 0
}
},
created () {
this.initSubject()
this.search()
},
methods: {
search () {
this.listLoading = true
examPaperAnswerApi.page(this.queryParam).then(data => {
const re = data.response
this.tableData = re.list
this.total = re.total
this.queryParam.pageIndex = re.pageNum
this.listLoading = false
})
},
submitForm () {
this.queryParam.pageIndex = 1
this.search()
},
toedit(id,type){
if(type == 1){
window.open("/student/index.html#/edit?id=" + id)
}else{
window.open("/student/index.html#/read?id=" + id)
}
},
...mapActions('exam', { initSubject: 'initSubject' })
},
computed: {
...mapGetters('enumItem', ['enumFormat']),
...mapGetters('exam', ['subjectEnumFormat']),
...mapState('exam', { subjects: state => state.subjects })
}
}
</script>

View File

@ -65,7 +65,15 @@ export default {
}) })
}, },
resetForm () { resetForm () {
let lastId = this.form.id
this.$refs['form'].resetFields() this.$refs['form'].resetFields()
this.form = {
id: null,
name: '',
level: 1,
levelName: ''
}
this.form.id = lastId
}, },
...mapActions('tagsView', { delCurrentView: 'delCurrentView' }) ...mapActions('tagsView', { delCurrentView: 'delCurrentView' })
}, },

View File

@ -238,7 +238,19 @@ export default {
return this.subjectEnumFormat(cellValue) return this.subjectEnumFormat(cellValue)
}, },
resetForm () { resetForm () {
let lastId = this.form.id
this.$refs['form'].resetFields() this.$refs['form'].resetFields()
this.form = {
id: null,
level: null,
subjectId: null,
paperType: 1,
limitDateTime: [],
name: '',
suggestTime: null,
titleItems: []
}
this.form.id = lastId
}, },
...mapActions('exam', { initSubject: 'initSubject' }), ...mapActions('exam', { initSubject: 'initSubject' }),
...mapActions('tagsView', { delCurrentView: 'delCurrentView' }) ...mapActions('tagsView', { delCurrentView: 'delCurrentView' })

View File

@ -208,7 +208,22 @@ export default {
this.questionShow.question = this.form this.questionShow.question = this.form
}, },
resetForm () { resetForm () {
let lastId = this.form.id
this.$refs['form'].resetFields() this.$refs['form'].resetFields()
this.form = {
id: null,
questionType: 4,
gradeLevel: null,
subjectId: null,
title: '',
items: [
],
analyze: '',
correct: '',
score: '',
difficult: 0
}
this.form.id = lastId
}, },
...mapActions('exam', { initSubject: 'initSubject' }), ...mapActions('exam', { initSubject: 'initSubject' }),
...mapActions('tagsView', { delCurrentView: 'delCurrentView' }) ...mapActions('tagsView', { delCurrentView: 'delCurrentView' })

View File

@ -195,7 +195,27 @@ export default {
this.questionShow.question = this.form this.questionShow.question = this.form
}, },
resetForm () { resetForm () {
let lastId = this.form.id
this.$refs['form'].resetFields() this.$refs['form'].resetFields()
this.form = {
id: null,
questionType: 2,
gradeLevel: null,
subjectId: null,
title: '',
items: [
{ id: null, prefix: 'A', content: '' },
{ id: null, prefix: 'B', content: '' },
{ id: null, prefix: 'C', content: '' },
{ id: null, prefix: 'D', content: '' }
],
analyze: '',
correct: '',
correctArray: [],
score: '',
difficult: 0
}
this.form.id = lastId
}, },
...mapActions('exam', { initSubject: 'initSubject' }), ...mapActions('exam', { initSubject: 'initSubject' }),
...mapActions('tagsView', { delCurrentView: 'delCurrentView' }) ...mapActions('tagsView', { delCurrentView: 'delCurrentView' })

View File

@ -161,7 +161,21 @@ export default {
}) })
}, },
resetForm () { resetForm () {
let lastId = this.form.id
this.$refs['form'].resetFields() this.$refs['form'].resetFields()
this.form = {
id: null,
questionType: 5,
gradeLevel: null,
subjectId: null,
title: '',
items: [],
analyze: '',
correct: '',
score: '',
difficult: 0
}
this.form.id = lastId
}, },
levelChange () { levelChange () {
this.form.subjectId = null this.form.subjectId = null

View File

@ -157,8 +157,13 @@ export default {
}, },
questionItemAdd () { questionItemAdd () {
let items = this.form.items let items = this.form.items
let newLastPrefix
if (items.length > 0) {
let last = items[items.length - 1] let last = items[items.length - 1]
let newLastPrefix = String.fromCharCode(last.prefix.charCodeAt() + 1) newLastPrefix = String.fromCharCode(last.prefix.charCodeAt() + 1)
} else {
newLastPrefix = 'A'
}
items.push({ id: null, prefix: newLastPrefix, content: '' }) items.push({ id: null, prefix: newLastPrefix, content: '' })
}, },
submitForm () { submitForm () {
@ -185,7 +190,26 @@ export default {
}) })
}, },
resetForm () { resetForm () {
let lastId = this.form.id
this.$refs['form'].resetFields() this.$refs['form'].resetFields()
this.form = {
id: null,
questionType: 1,
gradeLevel: null,
subjectId: null,
title: '',
items: [
{ prefix: 'A', content: '' },
{ prefix: 'B', content: '' },
{ prefix: 'C', content: '' },
{ prefix: 'D', content: '' }
],
analyze: '',
correct: '',
score: '',
difficult: 0
}
this.form.id = lastId
}, },
levelChange () { levelChange () {
this.form.subjectId = null this.form.subjectId = null

View File

@ -172,7 +172,24 @@ export default {
}) })
}, },
resetForm () { resetForm () {
let lastId = this.form.id
this.$refs['form'].resetFields() this.$refs['form'].resetFields()
this.form = {
id: null,
questionType: 3,
gradeLevel: null,
subjectId: null,
title: '',
items: [
{ id: null, prefix: 'A', content: '是' },
{ id: null, prefix: 'B', content: '否' }
],
analyze: '',
correct: '',
score: '',
difficult: 0
}
this.form.id = lastId
}, },
levelChange () { levelChange () {
this.form.subjectId = null this.form.subjectId = null

View File

@ -52,7 +52,7 @@
</el-form> </el-form>
<div class="account-foot-copyright"> <div class="account-foot-copyright">
<span>Copyright © 2020 武汉思维跳跃科技有限公司 版权所有</span> <span>Copyright © 2021 武汉思维跳跃科技有限公司 版权所有</span>
</div> </div>
</div> </div>
</template> </template>

View File

@ -89,9 +89,14 @@ export default {
}) })
}, },
resetForm () { resetForm () {
let lastId = this.form.id
this.$refs['form'].resetFields() this.$refs['form'].resetFields()
this.options = [] this.form = {
this.form.receiveUserIds = [] title: '',
content: '',
receiveUserIds: []
}
this.form.id = lastId
}, },
...mapActions('tagsView', { delCurrentView: 'delCurrentView' }) ...mapActions('tagsView', { delCurrentView: 'delCurrentView' })
} }

View File

@ -175,7 +175,15 @@ export default {
}) })
}, },
resetForm () { resetForm () {
let lastId = this.form.id
this.$refs['form'].resetFields() this.$refs['form'].resetFields()
this.form = {
id: null,
gradeLevel: null,
title: '',
paperItems: []
}
this.form.id = lastId
}, },
subjectFormatter (row, column, cellValue, index) { subjectFormatter (row, column, cellValue, index) {
return this.subjectEnumFormat(cellValue) return this.subjectEnumFormat(cellValue)

View File

@ -20,7 +20,7 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="出生日期:"> <el-form-item label="出生日期:">
<el-date-picker v-model="form.birthDay" type="date" placeholder="选择日期"/> <el-date-picker v-model="form.birthDay" value-format="yyyy-MM-dd" type="date" placeholder="选择日期"/>
</el-form-item> </el-form-item>
<el-form-item label="手机:"> <el-form-item label="手机:">
<el-input v-model="form.phone"></el-input> <el-input v-model="form.phone"></el-input>
@ -104,7 +104,21 @@ export default {
}) })
}, },
resetForm () { resetForm () {
let lastId = this.form.id
this.$refs['form'].resetFields() this.$refs['form'].resetFields()
this.form = {
id: null,
userName: '',
password: '',
realName: '',
role: 3,
status: 1,
age: '',
sex: '',
birthDay: null,
phone: null
}
this.form.id = lastId
}, },
...mapActions('tagsView', { delCurrentView: 'delCurrentView' }) ...mapActions('tagsView', { delCurrentView: 'delCurrentView' })
}, },

View File

@ -20,7 +20,7 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="出生日期:"> <el-form-item label="出生日期:">
<el-date-picker v-model="form.birthDay" type="date" placeholder="选择日期" /> <el-date-picker v-model="form.birthDay" type="date" value-format="yyyy-MM-dd" placeholder="选择日期" />
</el-form-item> </el-form-item>
<el-form-item label="手机:"> <el-form-item label="手机:">
<el-input v-model="form.phone"></el-input> <el-input v-model="form.phone"></el-input>
@ -113,7 +113,22 @@ export default {
}) })
}, },
resetForm () { resetForm () {
let lastId = this.form.id
this.$refs['form'].resetFields() this.$refs['form'].resetFields()
this.form = {
id: null,
userName: '',
password: '',
realName: '',
role: 1,
status: 1,
age: '',
sex: '',
birthDay: null,
phone: null,
userLevel: null
}
this.form.id = lastId
}, },
...mapActions('tagsView', { delCurrentView: 'delCurrentView' }) ...mapActions('tagsView', { delCurrentView: 'delCurrentView' })
}, },

View File

@ -1,122 +0,0 @@
<template>
<div class="app-container">
<el-form :model="form" ref="form" label-width="100px" v-loading="formLoading" :rules="rules">
<el-form-item label="用户名:" prop="userName" required>
<el-input v-model="form.userName"></el-input>
</el-form-item>
<el-form-item label="密码:" required>
<el-input v-model="form.password"></el-input>
</el-form-item>
<el-form-item label="真实姓名:" prop="realName" required>
<el-input v-model="form.realName"></el-input>
</el-form-item>
<el-form-item label="年龄:">
<el-input v-model="form.age"></el-input>
</el-form-item>
<el-form-item label="性别:">
<el-select v-model="form.sex" placeholder="性别" clearable>
<el-option v-for="item in sexEnum" :key="item.key" :value="item.key" :label="item.value"></el-option>
</el-select>
</el-form-item>
<el-form-item label="出生日期:">
<el-date-picker v-model="form.birthDay" type="date" placeholder="选择日期" />
</el-form-item>
<el-form-item label="手机:">
<el-input v-model="form.phone"></el-input>
</el-form-item>
<el-form-item label="状态:" required>
<el-select v-model="form.status" placeholder="状态">
<el-option v-for="item in statusEnum" :key="item.key" :value="item.key" :label="item.value"></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="submitForm">提交</el-button>
<el-button @click="resetForm">重置</el-button>
</el-form-item>
</el-form>
</div>
</template>
<script>
import { mapGetters, mapState, mapActions } from 'vuex'
import userApi from '@/api/user'
export default {
data () {
return {
form: {
id: null,
userName: '',
password: '',
realName: '',
role: 2,
status: 1,
age: '',
sex: '',
birthDay: null,
phone: null
},
formLoading: false,
rules: {
userName: [
{ required: true, message: '请输入用户名', trigger: 'blur' }
],
realName: [
{ required: true, message: '请输入真实姓名', trigger: 'blur' }
]
}
}
},
created () {
let id = this.$route.query.id
let _this = this
if (id && parseInt(id) !== 0) {
_this.formLoading = true
userApi.selectUser(id).then(re => {
_this.form = re.response
_this.formLoading = false
})
}
},
methods: {
submitForm () {
let _this = this
this.$refs.form.validate((valid) => {
if (valid) {
this.formLoading = true
userApi.createUser(this.form).then(data => {
if (data.code === 1) {
_this.$message.success(data.message)
_this.delCurrentView(_this).then(() => {
_this.$router.push('/user/teacher/list')
})
} else {
_this.$message.error(data.message)
_this.formLoading = false
}
}).catch(e => {
_this.formLoading = false
})
} else {
return false
}
})
},
resetForm () {
this.$refs['form'].resetFields()
},
...mapActions('tagsView', { delCurrentView: 'delCurrentView' })
},
computed: {
...mapGetters('enumItem', [
'enumFormat'
]),
...mapState('enumItem', {
sexEnum: state => state.user.sexEnum,
roleEnum: state => state.user.roleEnum,
statusEnum: state => state.user.statusEnum
})
}
}
</script>

View File

@ -1,131 +0,0 @@
<template>
<div class="app-container">
<el-form :model="queryParam" ref="queryForm" :inline="true">
<el-form-item label="用户名:">
<el-input v-model="queryParam.userName"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="submitForm">查询</el-button>
<router-link :to="{path:'/user/teacher/edit'}" class="link-left">
<el-button type="primary">添加</el-button>
</router-link>
</el-form-item>
</el-form>
<el-table v-loading="listLoading" :data="tableData" border fit highlight-current-row style="width: 100%">
<el-table-column prop="id" label="Id" />
<el-table-column prop="userName" label="用户名"/>
<el-table-column prop="realName" label="真实姓名" />
<el-table-column prop="sex" label="性别" width="60px;" :formatter="sexFormatter"/>
<el-table-column prop="phone" label="手机号"/>
<el-table-column prop="createTime" label="创建时间" width="160px"/>
<el-table-column label="状态" prop="status" width="70px">
<template slot-scope="{row}">
<el-tag :type="statusTagFormatter(row.status)">
{{ statusFormatter(row.status) }}
</el-tag>
</template>
</el-table-column>
<el-table-column width="220px" label="操作" align="center">
<template slot-scope="{row}">
<el-button size="mini" @click="changeStatus(row)" class="link-left">
{{ statusBtnFormatter(row.status) }}
</el-button>
<router-link :to="{path:'/user/teacher/edit', query:{id:row.id}}" class="link-left">
<el-button size="mini" >编辑</el-button>
</router-link>
<el-button size="mini" type="danger" @click="deleteUser(row)" class="link-left">删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination v-show="total>0" :total="total" :page.sync="queryParam.pageIndex" :limit.sync="queryParam.pageSize"
@pagination="search"/>
</div>
</template>
<script>
import { mapGetters, mapState } from 'vuex'
import Pagination from '@/components/Pagination'
import userApi from '@/api/user'
export default {
components: { Pagination },
data () {
return {
queryParam: {
userName: '',
role: 2,
pageIndex: 1,
pageSize: 10
},
listLoading: true,
tableData: [],
total: 0
}
},
created () {
this.search()
},
methods: {
search () {
this.listLoading = true
userApi.getUserPageList(this.queryParam).then(data => {
const re = data.response
this.tableData = re.list
this.total = re.total
this.queryParam.pageIndex = re.pageNum
this.listLoading = false
})
},
changeStatus (row) {
let _this = this
userApi.changeStatus(row.id).then(re => {
if (re.code === 1) {
row.status = re.response
_this.$message.success(re.message)
} else {
_this.$message.error(re.message)
}
})
},
deleteUser (row) {
let _this = this
userApi.deleteUser(row.id).then(re => {
if (re.code === 1) {
_this.search()
_this.$message.success(re.message)
} else {
_this.$message.error(re.message)
}
})
},
submitForm () {
this.queryParam.pageIndex = 1
this.search()
},
sexFormatter (row, column, cellValue, index) {
return this.enumFormat(this.sexEnum, cellValue)
},
statusFormatter (status) {
return this.enumFormat(this.statusEnum, status)
},
statusTagFormatter (status) {
return this.enumFormat(this.statusTag, status)
},
statusBtnFormatter (status) {
return this.enumFormat(this.statusBtn, status)
}
},
computed: {
...mapGetters('enumItem', [
'enumFormat'
]),
...mapState('enumItem', {
sexEnum: state => state.user.sexEnum,
statusEnum: state => state.user.statusEnum,
statusTag: state => state.user.statusTag,
statusBtn: state => state.user.statusBtn
})
}
}
</script>

View File

@ -19,7 +19,7 @@ module.exports = {
hotOnly: false, hotOnly: false,
proxy: { proxy: {
'/api': { '/api': {
target: 'http://localhost:8000', target: 'http://129.211.1.159:8080',
changeOrigin: true changeOrigin: true
} }
} }

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
{ {
"name": "xzs-student", "name": "xzs-student",
"version": "3.0.7", "version": "3.3.0",
"author": "武汉思维跳跃科技有限公司", "author": "武汉思维跳跃科技有限公司",
"description": "学之思考试系统", "description": "学之思考试系统",
"license": "AGPL-3.0", "license": "AGPL-3.0",
@ -16,26 +16,26 @@
}, },
"dependencies": { "dependencies": {
"axios": "^0.19.0", "axios": "^0.19.0",
"core-js": "^3.7.0", "core-js": "^3.8.3",
"element-ui": "^2.14.1", "element-ui": "^2.15.0",
"js-cookie": "2.2.0", "js-cookie": "2.2.0",
"normalize.css": "8.0.1", "normalize.css": "8.0.1",
"nprogress": "0.2.0", "nprogress": "0.2.0",
"vue": "^2.6.10", "vue": "^2.6.10",
"vue-router": "^3.4.9", "vue-router": "^3.5.1",
"vuex": "^3.5.1" "vuex": "^3.6.2"
}, },
"devDependencies": { "devDependencies": {
"@vue/cli-plugin-babel": "^4.5.8", "@vue/cli-plugin-babel": "^4.5.11",
"@vue/cli-plugin-eslint": "^4.5.8", "@vue/cli-plugin-eslint": "^4.5.11",
"@vue/cli-plugin-router": "^4.5.8", "@vue/cli-plugin-router": "^4.5.11",
"@vue/cli-plugin-vuex": "^4.5.8", "@vue/cli-plugin-vuex": "^4.5.11",
"@vue/cli-service": "^4.5.8", "@vue/cli-service": "^4.5.11",
"@vue/eslint-config-standard": "^4.0.0", "@vue/eslint-config-standard": "^4.0.0",
"babel-eslint": "^10.0.3", "babel-eslint": "^10.0.3",
"eslint": "^5.16.0", "eslint": "^5.16.0",
"eslint-plugin-vue": "^5.0.0", "eslint-plugin-vue": "^5.0.0",
"node-sass": "^4.14.1", "node-sass": "^4.0.0",
"sass-loader": "^8.0.0", "sass-loader": "^8.0.0",
"svg-sprite-loader": "4.1.6", "svg-sprite-loader": "4.1.6",
"vue-template-compiler": "^2.6.10" "vue-template-compiler": "^2.6.10"

View File

@ -1,5 +1,5 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html>
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" /> <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />

View File

@ -35,10 +35,10 @@
<div class="container"> <div class="container">
<div class="footer-main"> <div class="footer-main">
<h4>产品介绍</h4> <h4>产品介绍</h4>
<a href="http://www.mindskip.net/sdd.html" target="_blank" class="footer-main-link">思多多智能考试平台</a> <a href="https://www.mindskip.net/sdd.html" target="_blank" class="footer-main-link">思多多智能考试平台</a>
<a href="http://www.mindskip.net/wdd.html" target="_blank" class="footer-main-link">维多多培训考试系统</a> <a href="https://www.mindskip.net/wdd.html" target="_blank" class="footer-main-link">维多多培训考试系统</a>
<a href="http://www.mindskip.net/xdd.html" target="_blank" class="footer-main-link">学多多考试系统</a> <a href="https://www.mindskip.net/xdd.html" target="_blank" class="footer-main-link">学多多考试系统</a>
<a href="http://www.mindskip.net/xzs.html" target="_blank" class="footer-main-link">学之思考试系统</a> <a href="https://www.mindskip.net/xzs.html" target="_blank" class="footer-main-link">学之思考试系统</a>
</div> </div>
<div class="footer-main"> <div class="footer-main">
<h4>学多多小程序</h4> <h4>学多多小程序</h4>
@ -66,7 +66,7 @@
</div> </div>
</el-footer> </el-footer>
<div class="foot-copyright"> <div class="foot-copyright">
<span>Copyright © 2020 武汉思维跳跃科技有限公司 版权所有</span> <span>Copyright © 2021 武汉思维跳跃科技有限公司 版权所有</span>
</div> </div>
</el-container> </el-container>
</template> </template>

View File

@ -89,7 +89,7 @@ html {
.footer-main { .footer-main {
display: inline-block; display: inline-block;
vertical-align: top; vertical-align: top;
margin-right: 110px; margin-right: 70px;
.footer-main-link { .footer-main-link {
display: block; display: block;

View File

@ -1,6 +1,5 @@
import axios from 'axios' import axios from 'axios'
import vue from 'vue' import vue from 'vue'
const request = function (loadtip, query) { const request = function (loadtip, query) {
let loading let loading
if (loadtip) { if (loadtip) {

View File

@ -50,8 +50,8 @@
</el-row> </el-row>
<el-row class="app-item-contain"> <el-row class="app-item-contain">
<h3 class="index-title-h3">固定试卷</h3> <h3 class="index-title-h3">固定试卷</h3>
<div style="padding-left: 15px"> <div style="padding-left: 15px;display: flex;flex-wrap: wrap;">
<el-col :span="4" v-for="(item, index) in fixedPaper" :key="index" :offset="index > 0 ? 1 : 0"> <el-col style="float: unset;" :span="4" v-for="(item, index) in fixedPaper" :key="index" :offset="index > 0 ? 1 : 0">
<el-card :body-style="{ padding: '0px' }" v-loading="loading"> <el-card :body-style="{ padding: '0px' }" v-loading="loading">
<img src="@/assets/exam-paper/show1.png" class="image"> <img src="@/assets/exam-paper/show1.png" class="image">
<div style="padding: 14px;"> <div style="padding: 14px;">

View File

@ -67,10 +67,13 @@
<span v-html="question.analyze" class="q-item-span-content" /> <span v-html="question.analyze" class="q-item-span-content" />
</div> </div>
<div class="question-answer-show-item"> <div class="question-answer-show-item">
<span class="question-show-item">正确答案</span> <span :class="{'question-show-item': qType!=4}">正确答案</span>
<span v-if="qType==1||qType==2 ||qType==5" v-html="question.correct" class="q-item-span-content"/> <span v-if="qType==1||qType==2 ||qType==5" v-html="question.correct" class="q-item-span-content"/>
<span v-if="qType==3" v-html="trueFalseFormatter(question)" class="q-item-span-content"/> <span v-if="qType==3" v-html="trueFalseFormatter(question)" class="q-item-span-content"/>
<span v-if="qType==4">{{question.correctArray}}</span> <!-- <span v-if="qType==4" v-for="(item,key) in question.correctArray" :key="key" v-html="item"></span> -->
<ol v-if="qType==4">
<li v-for="(item,key) in question.correctArray" :key="key" v-html="item"></li>
</ol>
</div> </div>
</div> </div>
<div v-else> <div v-else>

View File

@ -95,7 +95,7 @@ export default {
_this.$alert('试卷得分:' + re.response + '分', '考试结果', { _this.$alert('试卷得分:' + re.response + '分', '考试结果', {
confirmButtonText: '返回考试记录', confirmButtonText: '返回考试记录',
callback: action => { callback: action => {
_this.$router.push('/record/index') window.close()
} }
}) })
} else { } else {

View File

@ -31,7 +31,7 @@
</div> </div>
</div> </div>
<div class="account-foot-copyright"> <div class="account-foot-copyright">
<span>Copyright © 2020 武汉思维跳跃科技有限公司 版权所有</span> <span>Copyright © 2021 武汉思维跳跃科技有限公司 版权所有</span>
</div> </div>
</div> </div>
</template> </template>

View File

@ -16,10 +16,11 @@
<el-table-column prop="createTime" label="做题时间" width="170" /> <el-table-column prop="createTime" label="做题时间" width="170" />
<el-table-column align="right" width="70"> <el-table-column align="right" width="70">
<template slot-scope="{row}"> <template slot-scope="{row}">
<router-link target="_blank" :to="{path:'/edit',query:{id:row.id}}" v-if="row.status === 1 "> <!-- <router-link target="_blank" :to="{path:'/edit',query:{id:row.id}}" v-if="row.status === 1 ">
<el-button type="text" size="small">批改</el-button> <el-button type="text" size="small">批改</el-button>
</router-link> </router-link> -->
<router-link target="_blank" :to="{path:'/read',query:{id:row.id}}" v-if="row.status === 2 "> <!-- v-if="row.status === 2 -->
<router-link target="_blank" :to="{path:'/read',query:{id:row.id}}">
<el-button type="text" size="small">查看试卷</el-button> <el-button type="text" size="small">查看试卷</el-button>
</router-link> </router-link>
</template> </template>

View File

@ -37,7 +37,7 @@
</div> </div>
</div> </div>
<div class="account-foot-copyright"> <div class="account-foot-copyright">
<span>Copyright © 2020 武汉思维跳跃科技有限公司 版权所有</span> <span>Copyright © 2021 武汉思维跳跃科技有限公司 版权所有</span>
</div> </div>
</div> </div>
</template> </template>

View File

@ -51,7 +51,7 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="出生日期:"> <el-form-item label="出生日期:">
<el-date-picker v-model="form.birthDay" type="date" placeholder="选择日期"/> <el-date-picker v-model="form.birthDay" value-format="yyyy-MM-dd" type="date" placeholder="选择日期"/>
</el-form-item> </el-form-item>
<el-form-item label="手机:"> <el-form-item label="手机:">
<el-input v-model="form.phone"></el-input> <el-input v-model="form.phone"></el-input>

View File

@ -19,7 +19,7 @@ module.exports = {
hotOnly: false, hotOnly: false,
proxy: { proxy: {
'/api': { '/api': {
target: 'http://localhost:8000', target: 'http://129.211.1.159:8080',
changeOrigin: true changeOrigin: true
} }
} }

File diff suppressed because it is too large Load Diff

View File

@ -5,7 +5,7 @@
<groupId>com.mindskip</groupId> <groupId>com.mindskip</groupId>
<artifactId>xzs</artifactId> <artifactId>xzs</artifactId>
<version>3.0.7</version> <version>3.2.0</version>
<packaging>jar</packaging> <packaging>jar</packaging>
<name>xzs</name> <name>xzs</name>
@ -118,13 +118,6 @@
<version>2.3.3</version> <version>2.3.3</version>
</dependency> </dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.8</version>
<scope>provided</scope>
</dependency>
<dependency> <dependency>
<groupId>org.apache.commons</groupId> <groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId> <artifactId>commons-lang3</artifactId>

View File

@ -1,15 +1,29 @@
package com.mindskip.xzs.base; package com.mindskip.xzs.base;
import lombok.Data;
/** /**
* @author 武汉思维跳跃科技有限公司 * @author 武汉思维跳跃科技有限公司
*/ */
@Data
public class BasePage { public class BasePage {
private Integer pageIndex; private Integer pageIndex;
private Integer pageSize; private Integer pageSize;
public Integer getPageIndex() {
return pageIndex;
}
public void setPageIndex(Integer pageIndex) {
this.pageIndex = pageIndex;
}
public Integer getPageSize() {
return pageSize;
}
public void setPageSize(Integer pageSize) {
this.pageSize = pageSize;
}
} }

View File

@ -3,7 +3,7 @@ package com.mindskip.xzs.configuration.property;
public class CookieConfig { public class CookieConfig {
public static String getName() { public static String getName() {
return "exam"; return "xzs";
} }
public static Integer getInterval() { public static Integer getInterval() {

View File

@ -1,9 +1,25 @@
package com.mindskip.xzs.configuration.property; package com.mindskip.xzs.configuration.property;
import lombok.Data;
@Data
public class PasswordKeyConfig { public class PasswordKeyConfig {
private String publicKey; private String publicKey;
private String privateKey; private String privateKey;
public String getPublicKey() {
return publicKey;
}
public void setPublicKey(String publicKey) {
this.publicKey = publicKey;
}
public String getPrivateKey() {
return privateKey;
}
public void setPrivateKey(String privateKey) {
this.privateKey = privateKey;
}
} }

View File

@ -1,14 +1,46 @@
package com.mindskip.xzs.configuration.property; package com.mindskip.xzs.configuration.property;
import lombok.Data;
import java.time.Duration; import java.time.Duration;
import java.util.List; import java.util.List;
@Data
public class QnConfig { public class QnConfig {
private String url; private String url;
private String bucket; private String bucket;
private String accessKey; private String accessKey;
private String secretKey; private String secretKey;
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getBucket() {
return bucket;
}
public void setBucket(String bucket) {
this.bucket = bucket;
}
public String getAccessKey() {
return accessKey;
}
public void setAccessKey(String accessKey) {
this.accessKey = accessKey;
}
public String getSecretKey() {
return secretKey;
}
public void setSecretKey(String secretKey) {
this.secretKey = secretKey;
}
} }

View File

@ -1,6 +1,5 @@
package com.mindskip.xzs.configuration.property; package com.mindskip.xzs.configuration.property;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.ConfigurationProperties;
import java.util.List; import java.util.List;
@ -10,10 +9,43 @@ import java.util.List;
* @author 武汉思维跳跃科技有限公司 * @author 武汉思维跳跃科技有限公司
*/ */
@ConfigurationProperties(prefix = "system") @ConfigurationProperties(prefix = "system")
@Data
public class SystemConfig { public class SystemConfig {
private PasswordKeyConfig pwdKey; private PasswordKeyConfig pwdKey;
private List<String> securityIgnoreUrls; private List<String> securityIgnoreUrls;
private WxConfig wx; private WxConfig wx;
private QnConfig qn; private QnConfig qn;
public PasswordKeyConfig getPwdKey() {
return pwdKey;
}
public void setPwdKey(PasswordKeyConfig pwdKey) {
this.pwdKey = pwdKey;
}
public List<String> getSecurityIgnoreUrls() {
return securityIgnoreUrls;
}
public void setSecurityIgnoreUrls(List<String> securityIgnoreUrls) {
this.securityIgnoreUrls = securityIgnoreUrls;
}
public WxConfig getWx() {
return wx;
}
public void setWx(WxConfig wx) {
this.wx = wx;
}
public QnConfig getQn() {
return qn;
}
public void setQn(QnConfig qn) {
this.qn = qn;
}
} }

View File

@ -1,14 +1,47 @@
package com.mindskip.xzs.configuration.property; package com.mindskip.xzs.configuration.property;
import lombok.Data;
import java.time.Duration; import java.time.Duration;
import java.util.List; import java.util.List;
@Data
public class WxConfig { public class WxConfig {
private String appid; private String appid;
private String secret; private String secret;
private Duration tokenToLive; private Duration tokenToLive;
private List<String> securityIgnoreUrls; private List<String> securityIgnoreUrls;
public String getAppid() {
return appid;
}
public void setAppid(String appid) {
this.appid = appid;
}
public String getSecret() {
return secret;
}
public void setSecret(String secret) {
this.secret = secret;
}
public Duration getTokenToLive() {
return tokenToLive;
}
public void setTokenToLive(Duration tokenToLive) {
this.tokenToLive = tokenToLive;
}
public List<String> getSecurityIgnoreUrls() {
return securityIgnoreUrls;
}
public void setSecurityIgnoreUrls(List<String> securityIgnoreUrls) {
this.securityIgnoreUrls = securityIgnoreUrls;
}
} }

View File

@ -29,26 +29,6 @@ import java.time.Duration;
@EnableCaching @EnableCaching
public class CacheConfig extends CachingConfigurerSupport { public class CacheConfig extends CachingConfigurerSupport {
/* @Autowired
private CacheProperties cacheProperties;*/
/**
* redis序列化修改为ObjectMapper
*
* @return RedisCacheConfiguration
*/
/* @Bean
public RedisCacheConfiguration redisCacheConfiguration() {
Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<Object>(Object.class);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
serializer.setObjectMapper(objectMapper);
return RedisCacheConfiguration.defaultCacheConfig().entryTtl(cacheProperties.getRedis().getTimeToLive())
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(serializer));
}*/
/** /**
* spring boot redis默认序列化方式 * spring boot redis默认序列化方式
* *

View File

@ -2,7 +2,7 @@ package com.mindskip.xzs.configuration.spring.mvc;
import com.mindskip.xzs.configuration.property.SystemConfig; import com.mindskip.xzs.configuration.property.SystemConfig;
import com.mindskip.xzs.configuration.spring.wx.TokenHandlerInterceptor; import com.mindskip.xzs.configuration.spring.wx.TokenHandlerInterceptor;
import lombok.AllArgsConstructor; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.*; import org.springframework.web.servlet.config.annotation.*;
@ -14,12 +14,17 @@ import java.util.List;
*/ */
@Configuration @Configuration
@AllArgsConstructor
public class WebMvcConfiguration extends WebMvcConfigurationSupport { public class WebMvcConfiguration extends WebMvcConfigurationSupport {
private final TokenHandlerInterceptor tokenHandlerInterceptor; private final TokenHandlerInterceptor tokenHandlerInterceptor;
private final SystemConfig systemConfig; private final SystemConfig systemConfig;
@Autowired
public WebMvcConfiguration(TokenHandlerInterceptor tokenHandlerInterceptor, SystemConfig systemConfig) {
this.tokenHandlerInterceptor = tokenHandlerInterceptor;
this.systemConfig = systemConfig;
}
@Override @Override
public void addViewControllers(ViewControllerRegistry registry) { public void addViewControllers(ViewControllerRegistry registry) {
registry.addRedirectViewController("/", "/student/index.html"); registry.addRedirectViewController("/", "/student/index.html");

View File

@ -1,14 +1,37 @@
package com.mindskip.xzs.configuration.spring.security; package com.mindskip.xzs.configuration.spring.security;
import lombok.Data;
/** /**
* @author 武汉思维跳跃科技有限公司 * @author 武汉思维跳跃科技有限公司
*/ */
@Data
public class AuthenticationBean { public class AuthenticationBean {
private String userName; private String userName;
private String password; private String password;
private boolean remember; private boolean remember;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public boolean isRemember() {
return remember;
}
public void setRemember(boolean remember) {
this.remember = remember;
}
} }

View File

@ -4,7 +4,7 @@ import com.mindskip.xzs.base.SystemCode;
import com.mindskip.xzs.domain.UserEventLog; import com.mindskip.xzs.domain.UserEventLog;
import com.mindskip.xzs.event.UserEvent; import com.mindskip.xzs.event.UserEvent;
import com.mindskip.xzs.service.UserService; import com.mindskip.xzs.service.UserService;
import lombok.AllArgsConstructor; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.ApplicationEventPublisher;
import org.springframework.security.core.Authentication; import org.springframework.security.core.Authentication;
import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.User;
@ -23,12 +23,17 @@ import java.util.Date;
* @author 武汉思维跳跃科技有限公司 * @author 武汉思维跳跃科技有限公司
*/ */
@Component @Component
@AllArgsConstructor
public class RestAuthenticationSuccessHandler extends SimpleUrlAuthenticationSuccessHandler { public class RestAuthenticationSuccessHandler extends SimpleUrlAuthenticationSuccessHandler {
private final ApplicationEventPublisher eventPublisher; private final ApplicationEventPublisher eventPublisher;
private final UserService userService; private final UserService userService;
@Autowired
public RestAuthenticationSuccessHandler(ApplicationEventPublisher eventPublisher, UserService userService) {
this.eventPublisher = eventPublisher;
this.userService = userService;
}
@Override @Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException { public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
User springUser = (User) authentication.getPrincipal(); User springUser = (User) authentication.getPrincipal();

View File

@ -5,7 +5,7 @@ import com.mindskip.xzs.domain.User;
import com.mindskip.xzs.domain.UserEventLog; import com.mindskip.xzs.domain.UserEventLog;
import com.mindskip.xzs.event.UserEvent; import com.mindskip.xzs.event.UserEvent;
import com.mindskip.xzs.service.UserService; import com.mindskip.xzs.service.UserService;
import lombok.AllArgsConstructor; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.ApplicationEventPublisher;
import org.springframework.security.core.Authentication; import org.springframework.security.core.Authentication;
import org.springframework.security.web.authentication.logout.SimpleUrlLogoutSuccessHandler; import org.springframework.security.web.authentication.logout.SimpleUrlLogoutSuccessHandler;
@ -21,12 +21,17 @@ import java.util.Date;
* @author 武汉思维跳跃科技有限公司 * @author 武汉思维跳跃科技有限公司
*/ */
@Component @Component
@AllArgsConstructor
public class RestLogoutSuccessHandler extends SimpleUrlLogoutSuccessHandler { public class RestLogoutSuccessHandler extends SimpleUrlLogoutSuccessHandler {
private final ApplicationEventPublisher eventPublisher; private final ApplicationEventPublisher eventPublisher;
private final UserService userService; private final UserService userService;
@Autowired
public RestLogoutSuccessHandler(ApplicationEventPublisher eventPublisher, UserService userService) {
this.eventPublisher = eventPublisher;
this.userService = userService;
}
@Override @Override
public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) { public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) {
org.springframework.security.core.userdetails.User springUser = (org.springframework.security.core.userdetails.User) authentication.getPrincipal(); org.springframework.security.core.userdetails.User springUser = (org.springframework.security.core.userdetails.User) authentication.getPrincipal();

View File

@ -3,7 +3,7 @@ package com.mindskip.xzs.configuration.spring.security;
import com.mindskip.xzs.configuration.property.CookieConfig; import com.mindskip.xzs.configuration.property.CookieConfig;
import com.mindskip.xzs.configuration.property.SystemConfig; import com.mindskip.xzs.configuration.property.SystemConfig;
import com.mindskip.xzs.domain.enums.RoleEnum; import com.mindskip.xzs.domain.enums.RoleEnum;
import lombok.AllArgsConstructor; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.builders.HttpSecurity;
@ -27,7 +27,6 @@ import java.util.List;
public class SecurityConfigurer { public class SecurityConfigurer {
@Configuration @Configuration
@AllArgsConstructor
public static class FormLoginWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter { public static class FormLoginWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {
private final SystemConfig systemConfig; private final SystemConfig systemConfig;
@ -39,6 +38,18 @@ public class SecurityConfigurer {
private final RestLogoutSuccessHandler restLogoutSuccessHandler; private final RestLogoutSuccessHandler restLogoutSuccessHandler;
private final RestAccessDeniedHandler restAccessDeniedHandler; private final RestAccessDeniedHandler restAccessDeniedHandler;
@Autowired
public FormLoginWebSecurityConfigurerAdapter(SystemConfig systemConfig, LoginAuthenticationEntryPoint restAuthenticationEntryPoint, RestAuthenticationProvider restAuthenticationProvider, RestDetailsServiceImpl formDetailsService, RestAuthenticationSuccessHandler restAuthenticationSuccessHandler, RestAuthenticationFailureHandler restAuthenticationFailureHandler, RestLogoutSuccessHandler restLogoutSuccessHandler, RestAccessDeniedHandler restAccessDeniedHandler) {
this.systemConfig = systemConfig;
this.restAuthenticationEntryPoint = restAuthenticationEntryPoint;
this.restAuthenticationProvider = restAuthenticationProvider;
this.formDetailsService = formDetailsService;
this.restAuthenticationSuccessHandler = restAuthenticationSuccessHandler;
this.restAuthenticationFailureHandler = restAuthenticationFailureHandler;
this.restLogoutSuccessHandler = restLogoutSuccessHandler;
this.restAccessDeniedHandler = restAccessDeniedHandler;
}
/** /**
* @param http http * @param http http
* @throws Exception exception * @throws Exception exception
@ -57,6 +68,8 @@ public class SecurityConfigurer {
.authorizeRequests() .authorizeRequests()
.antMatchers(securityIgnoreUrls.toArray(ignores)).permitAll() .antMatchers(securityIgnoreUrls.toArray(ignores)).permitAll()
.antMatchers("/api/admin/**").hasRole(RoleEnum.ADMIN.getName()) .antMatchers("/api/admin/**").hasRole(RoleEnum.ADMIN.getName())
.antMatchers("/api/student/exampaper/answer/read/*").hasAnyRole(RoleEnum.ADMIN.getName(),RoleEnum.STUDENT.getName())
.antMatchers("/api/student/exampaper/answer/edit").hasAnyRole(RoleEnum.ADMIN.getName())
.antMatchers("/api/student/**").hasRole(RoleEnum.STUDENT.getName()) .antMatchers("/api/student/**").hasRole(RoleEnum.STUDENT.getName())
.anyRequest().permitAll() .anyRequest().permitAll()
.and().exceptionHandling().accessDeniedHandler(restAccessDeniedHandler) .and().exceptionHandling().accessDeniedHandler(restAccessDeniedHandler)

View File

@ -2,18 +2,22 @@ package com.mindskip.xzs.context;
import com.mindskip.xzs.domain.User; import com.mindskip.xzs.domain.User;
import com.mindskip.xzs.service.UserService; import com.mindskip.xzs.service.UserService;
import lombok.AllArgsConstructor; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestAttributes; import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.RequestContextHolder;
@Component @Component
@AllArgsConstructor
public class WebContext { public class WebContext {
private static final String USER_ATTRIBUTES = "USER_ATTRIBUTES"; private static final String USER_ATTRIBUTES = "USER_ATTRIBUTES";
private final UserService userService; private final UserService userService;
@Autowired
public WebContext(UserService userService) {
this.userService = userService;
}
public void setCurrentUser(User user) { public void setCurrentUser(User user) {
RequestContextHolder.currentRequestAttributes().setAttribute(USER_ATTRIBUTES, user, RequestAttributes.SCOPE_REQUEST); RequestContextHolder.currentRequestAttributes().setAttribute(USER_ATTRIBUTES, user, RequestAttributes.SCOPE_REQUEST);

View File

@ -5,8 +5,7 @@ import com.mindskip.xzs.base.RestResponse;
import com.mindskip.xzs.service.*; import com.mindskip.xzs.service.*;
import com.mindskip.xzs.utility.DateTimeUtil; import com.mindskip.xzs.utility.DateTimeUtil;
import com.mindskip.xzs.viewmodel.admin.dashboard.IndexVM; import com.mindskip.xzs.viewmodel.admin.dashboard.IndexVM;
import com.mindskip.xzs.service.*; import org.springframework.beans.factory.annotation.Autowired;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
@ -15,16 +14,23 @@ import java.util.List;
@RestController("AdminDashboardController") @RestController("AdminDashboardController")
@RequestMapping(value = "/api/admin/dashboard") @RequestMapping(value = "/api/admin/dashboard")
@AllArgsConstructor
public class DashboardController extends BaseApiController { public class DashboardController extends BaseApiController {
private final ExamPaperService examPaperService; private final ExamPaperService examPaperService;
private final QuestionService questionService; private final QuestionService questionService;
private final ExamPaperAnswerService examPaperAnswerService; private final ExamPaperAnswerService examPaperAnswerService;
private final ExamPaperQuestionCustomerAnswerService examPaperQuestionCustomerAnswerService; private final ExamPaperQuestionCustomerAnswerService examPaperQuestionCustomerAnswerService;
private final UserEventLogService userEventLogService; private final UserEventLogService userEventLogService;
@Autowired
public DashboardController(ExamPaperService examPaperService, QuestionService questionService, ExamPaperAnswerService examPaperAnswerService, ExamPaperQuestionCustomerAnswerService examPaperQuestionCustomerAnswerService, UserEventLogService userEventLogService) {
this.examPaperService = examPaperService;
this.questionService = questionService;
this.examPaperAnswerService = examPaperAnswerService;
this.examPaperQuestionCustomerAnswerService = examPaperQuestionCustomerAnswerService;
this.userEventLogService = userEventLogService;
}
@RequestMapping(value = "/index", method = RequestMethod.POST) @RequestMapping(value = "/index", method = RequestMethod.POST)
public RestResponse<IndexVM> Index() { public RestResponse<IndexVM> Index() {
IndexVM vm = new IndexVM(); IndexVM vm = new IndexVM();

View File

@ -10,7 +10,7 @@ import com.mindskip.xzs.viewmodel.admin.education.SubjectEditRequestVM;
import com.mindskip.xzs.viewmodel.admin.education.SubjectPageRequestVM; import com.mindskip.xzs.viewmodel.admin.education.SubjectPageRequestVM;
import com.mindskip.xzs.viewmodel.admin.education.SubjectResponseVM; import com.mindskip.xzs.viewmodel.admin.education.SubjectResponseVM;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import lombok.AllArgsConstructor; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.validation.Valid; import javax.validation.Valid;
@ -18,11 +18,15 @@ import java.util.List;
@RestController("AdminEducationController") @RestController("AdminEducationController")
@RequestMapping(value = "/api/admin/education") @RequestMapping(value = "/api/admin/education")
@AllArgsConstructor
public class EducationController extends BaseApiController { public class EducationController extends BaseApiController {
private final SubjectService subjectService; private final SubjectService subjectService;
@Autowired
public EducationController(SubjectService subjectService) {
this.subjectService = subjectService;
}
@RequestMapping(value = "/subject/list", method = RequestMethod.POST) @RequestMapping(value = "/subject/list", method = RequestMethod.POST)
public RestResponse<List<Subject>> list() { public RestResponse<List<Subject>> list() {
List<Subject> subjects = subjectService.allSubject(); List<Subject> subjects = subjectService.allSubject();

View File

@ -0,0 +1,54 @@
package com.mindskip.xzs.controller.admin;
import com.mindskip.xzs.base.BaseApiController;
import com.mindskip.xzs.base.RestResponse;
import com.mindskip.xzs.domain.ExamPaperAnswer;
import com.mindskip.xzs.domain.Subject;
import com.mindskip.xzs.domain.User;
import com.mindskip.xzs.service.*;
import com.mindskip.xzs.utility.DateTimeUtil;
import com.mindskip.xzs.utility.ExamUtil;
import com.mindskip.xzs.utility.PageInfoHelper;
import com.mindskip.xzs.viewmodel.student.exampaper.ExamPaperAnswerPageResponseVM;
import com.mindskip.xzs.viewmodel.admin.paper.ExamPaperAnswerPageRequestVM;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController("AdminExamPaperAnswerController")
@RequestMapping(value = "/api/admin/examPaperAnswer")
public class ExamPaperAnswerController extends BaseApiController {
private final ExamPaperAnswerService examPaperAnswerService;
private final SubjectService subjectService;
private final UserService userService;
@Autowired
public ExamPaperAnswerController(ExamPaperAnswerService examPaperAnswerService, SubjectService subjectService, UserService userService) {
this.examPaperAnswerService = examPaperAnswerService;
this.subjectService = subjectService;
this.userService = userService;
}
@RequestMapping(value = "/page", method = RequestMethod.POST)
public RestResponse<PageInfo<ExamPaperAnswerPageResponseVM>> pageJudgeList(@RequestBody ExamPaperAnswerPageRequestVM model) {
PageInfo<ExamPaperAnswer> pageInfo = examPaperAnswerService.adminPage(model);
PageInfo<ExamPaperAnswerPageResponseVM> page = PageInfoHelper.copyMap(pageInfo, e -> {
ExamPaperAnswerPageResponseVM vm = modelMapper.map(e, ExamPaperAnswerPageResponseVM.class);
Subject subject = subjectService.selectById(vm.getSubjectId());
vm.setDoTime(ExamUtil.secondToVM(e.getDoTime()));
vm.setSystemScore(ExamUtil.scoreToVM(e.getSystemScore()));
vm.setUserScore(ExamUtil.scoreToVM(e.getUserScore()));
vm.setPaperScore(ExamUtil.scoreToVM(e.getPaperScore()));
vm.setSubjectName(subject.getName());
vm.setCreateTime(DateTimeUtil.dateFormat(e.getCreateTime()));
User user = userService.selectById(e.getCreateUser());
vm.setUserName(user.getRealName());
return vm;
});
return RestResponse.ok(page);
}
}

View File

@ -10,18 +10,22 @@ import com.mindskip.xzs.viewmodel.admin.exam.ExamPaperPageRequestVM;
import com.mindskip.xzs.viewmodel.admin.exam.ExamPaperEditRequestVM; import com.mindskip.xzs.viewmodel.admin.exam.ExamPaperEditRequestVM;
import com.mindskip.xzs.viewmodel.admin.exam.ExamResponseVM; import com.mindskip.xzs.viewmodel.admin.exam.ExamResponseVM;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import lombok.AllArgsConstructor; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.validation.Valid; import javax.validation.Valid;
@RestController("AdminExamPaperController") @RestController("AdminExamPaperController")
@RequestMapping(value = "/api/admin/exam/paper") @RequestMapping(value = "/api/admin/exam/paper")
@AllArgsConstructor
public class ExamPaperController extends BaseApiController { public class ExamPaperController extends BaseApiController {
private final ExamPaperService examPaperService; private final ExamPaperService examPaperService;
@Autowired
public ExamPaperController(ExamPaperService examPaperService) {
this.examPaperService = examPaperService;
}
@RequestMapping(value = "/page", method = RequestMethod.POST) @RequestMapping(value = "/page", method = RequestMethod.POST)
public RestResponse<PageInfo<ExamResponseVM>> pageList(@RequestBody ExamPaperPageRequestVM model) { public RestResponse<PageInfo<ExamResponseVM>> pageList(@RequestBody ExamPaperPageRequestVM model) {
PageInfo<ExamPaper> pageInfo = examPaperService.page(model); PageInfo<ExamPaper> pageInfo = examPaperService.page(model);

View File

@ -14,7 +14,7 @@ import com.mindskip.xzs.viewmodel.admin.message.MessagePageRequestVM;
import com.mindskip.xzs.viewmodel.admin.message.MessageResponseVM; import com.mindskip.xzs.viewmodel.admin.message.MessageResponseVM;
import com.mindskip.xzs.viewmodel.admin.message.MessageSendVM; import com.mindskip.xzs.viewmodel.admin.message.MessageSendVM;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import lombok.AllArgsConstructor; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestMethod;
@ -27,12 +27,17 @@ import java.util.stream.Collectors;
@RestController("AdminMessageController") @RestController("AdminMessageController")
@RequestMapping(value = "/api/admin/message") @RequestMapping(value = "/api/admin/message")
@AllArgsConstructor
public class MessageController extends BaseApiController { public class MessageController extends BaseApiController {
private final MessageService messageService; private final MessageService messageService;
private final UserService userService; private final UserService userService;
@Autowired
public MessageController(MessageService messageService, UserService userService) {
this.messageService = messageService;
this.userService = userService;
}
@RequestMapping(value = "/page", method = RequestMethod.POST) @RequestMapping(value = "/page", method = RequestMethod.POST)
public RestResponse<PageInfo<MessageResponseVM>> pageList(@RequestBody MessagePageRequestVM model) { public RestResponse<PageInfo<MessageResponseVM>> pageList(@RequestBody MessagePageRequestVM model) {
PageInfo<Message> pageInfo = messageService.page(model); PageInfo<Message> pageInfo = messageService.page(model);

View File

@ -14,21 +14,25 @@ import com.mindskip.xzs.viewmodel.admin.question.QuestionEditRequestVM;
import com.mindskip.xzs.viewmodel.admin.question.QuestionPageRequestVM; import com.mindskip.xzs.viewmodel.admin.question.QuestionPageRequestVM;
import com.mindskip.xzs.viewmodel.admin.question.QuestionResponseVM; import com.mindskip.xzs.viewmodel.admin.question.QuestionResponseVM;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import com.mindskip.xzs.utility.*;
import lombok.AllArgsConstructor;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.validation.Valid; import javax.validation.Valid;
@RestController("AdminQuestionController") @RestController("AdminQuestionController")
@RequestMapping(value = "/api/admin/question") @RequestMapping(value = "/api/admin/question")
@AllArgsConstructor
public class QuestionController extends BaseApiController { public class QuestionController extends BaseApiController {
private final QuestionService questionService; private final QuestionService questionService;
private final TextContentService textContentService; private final TextContentService textContentService;
@Autowired
public QuestionController(QuestionService questionService, TextContentService textContentService) {
this.questionService = questionService;
this.textContentService = textContentService;
}
@RequestMapping(value = "/page", method = RequestMethod.POST) @RequestMapping(value = "/page", method = RequestMethod.POST)
public RestResponse<PageInfo<QuestionResponseVM>> pageList(@RequestBody QuestionPageRequestVM model) { public RestResponse<PageInfo<QuestionResponseVM>> pageList(@RequestBody QuestionPageRequestVM model) {
PageInfo<Question> pageInfo = questionService.page(model); PageInfo<Question> pageInfo = questionService.page(model);

View File

@ -11,18 +11,22 @@ import com.mindskip.xzs.viewmodel.admin.task.TaskPageRequestVM;
import com.mindskip.xzs.viewmodel.admin.task.TaskPageResponseVM; import com.mindskip.xzs.viewmodel.admin.task.TaskPageResponseVM;
import com.mindskip.xzs.viewmodel.admin.task.TaskRequestVM; import com.mindskip.xzs.viewmodel.admin.task.TaskRequestVM;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import lombok.AllArgsConstructor; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.validation.Valid; import javax.validation.Valid;
@RestController("AdminTaskController") @RestController("AdminTaskController")
@RequestMapping(value = "/api/admin/task") @RequestMapping(value = "/api/admin/task")
@AllArgsConstructor
public class TaskController extends BaseApiController { public class TaskController extends BaseApiController {
private final TaskExamService taskExamService; private final TaskExamService taskExamService;
@Autowired
public TaskController(TaskExamService taskExamService) {
this.taskExamService = taskExamService;
}
@RequestMapping(value = "/page", method = RequestMethod.POST) @RequestMapping(value = "/page", method = RequestMethod.POST)
public RestResponse<PageInfo<TaskPageResponseVM>> pageList(@RequestBody TaskPageRequestVM model) { public RestResponse<PageInfo<TaskPageResponseVM>> pageList(@RequestBody TaskPageRequestVM model) {
PageInfo<TaskExam> pageInfo = taskExamService.page(model); PageInfo<TaskExam> pageInfo = taskExamService.page(model);

View File

@ -8,10 +8,9 @@ import com.mindskip.xzs.service.FileUpload;
import com.mindskip.xzs.service.UserService; import com.mindskip.xzs.service.UserService;
import com.mindskip.xzs.viewmodel.admin.file.UeditorConfigVM; import com.mindskip.xzs.viewmodel.admin.file.UeditorConfigVM;
import com.mindskip.xzs.viewmodel.admin.file.UploadResultVM; import com.mindskip.xzs.viewmodel.admin.file.UploadResultVM;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest; import org.springframework.web.multipart.MultipartHttpServletRequest;
@ -23,8 +22,6 @@ import java.io.InputStream;
import java.util.Arrays; import java.util.Arrays;
@Slf4j
@AllArgsConstructor
@RequestMapping("/api/admin/upload") @RequestMapping("/api/admin/upload")
@RestController("AdminUploadController") @RestController("AdminUploadController")
public class UploadController extends BaseApiController { public class UploadController extends BaseApiController {
@ -36,6 +33,13 @@ public class UploadController extends BaseApiController {
private static final String IMAGE_UPLOAD_FILE = "upFile"; private static final String IMAGE_UPLOAD_FILE = "upFile";
private final UserService userService; private final UserService userService;
@Autowired
public UploadController(FileUpload fileUpload, SystemConfig systemConfig, UserService userService) {
this.fileUpload = fileUpload;
this.systemConfig = systemConfig;
this.userService = userService;
}
@ResponseBody @ResponseBody
@RequestMapping("/configAndUpload") @RequestMapping("/configAndUpload")
public Object upload(HttpServletRequest request, HttpServletResponse response) { public Object upload(HttpServletRequest request, HttpServletResponse response) {

View File

@ -13,10 +13,9 @@ import com.mindskip.xzs.utility.DateTimeUtil;
import com.mindskip.xzs.viewmodel.admin.user.*; import com.mindskip.xzs.viewmodel.admin.user.*;
import com.mindskip.xzs.utility.PageInfoHelper; import com.mindskip.xzs.utility.PageInfoHelper;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import com.mindskip.xzs.viewmodel.admin.user.*;
import lombok.AllArgsConstructor;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.validation.Valid; import javax.validation.Valid;
@ -30,13 +29,19 @@ import java.util.UUID;
*/ */
@RestController("AdminUserController") @RestController("AdminUserController")
@RequestMapping(value = "/api/admin/user") @RequestMapping(value = "/api/admin/user")
@AllArgsConstructor
public class UserController extends BaseApiController { public class UserController extends BaseApiController {
private final UserService userService; private final UserService userService;
private final UserEventLogService userEventLogService; private final UserEventLogService userEventLogService;
private final AuthenticationService authenticationService; private final AuthenticationService authenticationService;
@Autowired
public UserController(UserService userService, UserEventLogService userEventLogService, AuthenticationService authenticationService) {
this.userService = userService;
this.userEventLogService = userEventLogService;
this.authenticationService = authenticationService;
}
@RequestMapping(value = "/page/list", method = RequestMethod.POST) @RequestMapping(value = "/page/list", method = RequestMethod.POST)
public RestResponse<PageInfo<UserResponseVM>> pageList(@RequestBody UserPageRequestVM model) { public RestResponse<PageInfo<UserResponseVM>> pageList(@RequestBody UserPageRequestVM model) {

View File

@ -13,9 +13,7 @@ import com.mindskip.xzs.service.*;
import com.mindskip.xzs.utility.DateTimeUtil; import com.mindskip.xzs.utility.DateTimeUtil;
import com.mindskip.xzs.utility.JsonUtil; import com.mindskip.xzs.utility.JsonUtil;
import com.mindskip.xzs.viewmodel.student.dashboard.*; import com.mindskip.xzs.viewmodel.student.dashboard.*;
import com.mindskip.xzs.service.*; import org.springframework.beans.factory.annotation.Autowired;
import com.mindskip.xzs.viewmodel.student.dashboard.*;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
@ -27,7 +25,6 @@ import java.util.stream.Collectors;
@RestController("StudentDashboardController") @RestController("StudentDashboardController")
@RequestMapping(value = "/api/student/dashboard") @RequestMapping(value = "/api/student/dashboard")
@AllArgsConstructor
public class DashboardController extends BaseApiController { public class DashboardController extends BaseApiController {
private final UserService userService; private final UserService userService;
@ -37,6 +34,16 @@ public class DashboardController extends BaseApiController {
private final TaskExamCustomerAnswerService taskExamCustomerAnswerService; private final TaskExamCustomerAnswerService taskExamCustomerAnswerService;
private final TextContentService textContentService; private final TextContentService textContentService;
@Autowired
public DashboardController(UserService userService, ExamPaperService examPaperService, QuestionService questionService, TaskExamService taskExamService, TaskExamCustomerAnswerService taskExamCustomerAnswerService, TextContentService textContentService) {
this.userService = userService;
this.examPaperService = examPaperService;
this.questionService = questionService;
this.taskExamService = taskExamService;
this.taskExamCustomerAnswerService = taskExamCustomerAnswerService;
this.textContentService = textContentService;
}
@RequestMapping(value = "/index", method = RequestMethod.POST) @RequestMapping(value = "/index", method = RequestMethod.POST)
public RestResponse<IndexVM> index() { public RestResponse<IndexVM> index() {
IndexVM indexVM = new IndexVM(); IndexVM indexVM = new IndexVM();

View File

@ -8,7 +8,7 @@ import com.mindskip.xzs.domain.User;
import com.mindskip.xzs.service.SubjectService; import com.mindskip.xzs.service.SubjectService;
import com.mindskip.xzs.viewmodel.student.education.SubjectEditRequestVM; import com.mindskip.xzs.viewmodel.student.education.SubjectEditRequestVM;
import com.mindskip.xzs.viewmodel.student.education.SubjectVM; import com.mindskip.xzs.viewmodel.student.education.SubjectVM;
import lombok.AllArgsConstructor; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import java.util.List; import java.util.List;
@ -16,11 +16,15 @@ import java.util.stream.Collectors;
@RestController("StudentEducationController") @RestController("StudentEducationController")
@RequestMapping(value = "/api/student/education") @RequestMapping(value = "/api/student/education")
@AllArgsConstructor
public class EducationController extends BaseApiController { public class EducationController extends BaseApiController {
private final SubjectService subjectService; private final SubjectService subjectService;
@Autowired
public EducationController(SubjectService subjectService) {
this.subjectService = subjectService;
}
@RequestMapping(value = "/subject/list", method = RequestMethod.POST) @RequestMapping(value = "/subject/list", method = RequestMethod.POST)
public RestResponse<List<SubjectVM>> list() { public RestResponse<List<SubjectVM>> list() {
User user = getCurrentUser(); User user = getCurrentUser();

View File

@ -18,8 +18,7 @@ import com.mindskip.xzs.viewmodel.student.exam.ExamPaperSubmitVM;
import com.mindskip.xzs.viewmodel.student.exampaper.ExamPaperAnswerPageResponseVM; import com.mindskip.xzs.viewmodel.student.exampaper.ExamPaperAnswerPageResponseVM;
import com.mindskip.xzs.viewmodel.student.exampaper.ExamPaperAnswerPageVM; import com.mindskip.xzs.viewmodel.student.exampaper.ExamPaperAnswerPageVM;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import com.mindskip.xzs.domain.*; import org.springframework.beans.factory.annotation.Autowired;
import lombok.AllArgsConstructor;
import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.ApplicationEventPublisher;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
@ -28,7 +27,6 @@ import java.util.Date;
@RestController("StudentExamPaperAnswerController") @RestController("StudentExamPaperAnswerController")
@RequestMapping(value = "/api/student/exampaper/answer") @RequestMapping(value = "/api/student/exampaper/answer")
@AllArgsConstructor
public class ExamPaperAnswerController extends BaseApiController { public class ExamPaperAnswerController extends BaseApiController {
private final ExamPaperAnswerService examPaperAnswerService; private final ExamPaperAnswerService examPaperAnswerService;
@ -36,6 +34,14 @@ public class ExamPaperAnswerController extends BaseApiController {
private final SubjectService subjectService; private final SubjectService subjectService;
private final ApplicationEventPublisher eventPublisher; private final ApplicationEventPublisher eventPublisher;
@Autowired
public ExamPaperAnswerController(ExamPaperAnswerService examPaperAnswerService, ExamPaperService examPaperService, SubjectService subjectService, ApplicationEventPublisher eventPublisher) {
this.examPaperAnswerService = examPaperAnswerService;
this.examPaperService = examPaperService;
this.subjectService = subjectService;
this.eventPublisher = eventPublisher;
}
@RequestMapping(value = "/pageList", method = RequestMethod.POST) @RequestMapping(value = "/pageList", method = RequestMethod.POST)
public RestResponse<PageInfo<ExamPaperAnswerPageResponseVM>> pageList(@RequestBody @Valid ExamPaperAnswerPageVM model) { public RestResponse<PageInfo<ExamPaperAnswerPageResponseVM>> pageList(@RequestBody @Valid ExamPaperAnswerPageVM model) {

View File

@ -11,7 +11,7 @@ import com.mindskip.xzs.viewmodel.admin.exam.ExamPaperEditRequestVM;
import com.mindskip.xzs.viewmodel.student.exam.ExamPaperPageResponseVM; import com.mindskip.xzs.viewmodel.student.exam.ExamPaperPageResponseVM;
import com.mindskip.xzs.viewmodel.student.exam.ExamPaperPageVM; import com.mindskip.xzs.viewmodel.student.exam.ExamPaperPageVM;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import lombok.AllArgsConstructor; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.ApplicationEventPublisher;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
@ -19,13 +19,19 @@ import javax.validation.Valid;
@RestController("StudentExamPaperController") @RestController("StudentExamPaperController")
@RequestMapping(value = "/api/student/exam/paper") @RequestMapping(value = "/api/student/exam/paper")
@AllArgsConstructor
public class ExamPaperController extends BaseApiController { public class ExamPaperController extends BaseApiController {
private final ExamPaperService examPaperService; private final ExamPaperService examPaperService;
private final ExamPaperAnswerService examPaperAnswerService; private final ExamPaperAnswerService examPaperAnswerService;
private final ApplicationEventPublisher eventPublisher; private final ApplicationEventPublisher eventPublisher;
@Autowired
public ExamPaperController(ExamPaperService examPaperService, ExamPaperAnswerService examPaperAnswerService, ApplicationEventPublisher eventPublisher) {
this.examPaperService = examPaperService;
this.examPaperAnswerService = examPaperAnswerService;
this.eventPublisher = eventPublisher;
}
@RequestMapping(value = "/select/{id}", method = RequestMethod.POST) @RequestMapping(value = "/select/{id}", method = RequestMethod.POST)
public RestResponse<ExamPaperEditRequestVM> select(@PathVariable Integer id) { public RestResponse<ExamPaperEditRequestVM> select(@PathVariable Integer id) {

View File

@ -20,12 +20,11 @@ import com.mindskip.xzs.viewmodel.student.question.answer.QuestionAnswerVM;
import com.mindskip.xzs.viewmodel.student.question.answer.QuestionPageStudentRequestVM; import com.mindskip.xzs.viewmodel.student.question.answer.QuestionPageStudentRequestVM;
import com.mindskip.xzs.viewmodel.student.question.answer.QuestionPageStudentResponseVM; import com.mindskip.xzs.viewmodel.student.question.answer.QuestionPageStudentResponseVM;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import lombok.AllArgsConstructor; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
@RestController("StudentQuestionAnswerController") @RestController("StudentQuestionAnswerController")
@RequestMapping(value = "/api/student/question/answer") @RequestMapping(value = "/api/student/question/answer")
@AllArgsConstructor
public class QuestionAnswerController extends BaseApiController { public class QuestionAnswerController extends BaseApiController {
private final ExamPaperQuestionCustomerAnswerService examPaperQuestionCustomerAnswerService; private final ExamPaperQuestionCustomerAnswerService examPaperQuestionCustomerAnswerService;
@ -33,6 +32,14 @@ public class QuestionAnswerController extends BaseApiController {
private final TextContentService textContentService; private final TextContentService textContentService;
private final SubjectService subjectService; private final SubjectService subjectService;
@Autowired
public QuestionAnswerController(ExamPaperQuestionCustomerAnswerService examPaperQuestionCustomerAnswerService, QuestionService questionService, TextContentService textContentService, SubjectService subjectService) {
this.examPaperQuestionCustomerAnswerService = examPaperQuestionCustomerAnswerService;
this.questionService = questionService;
this.textContentService = textContentService;
this.subjectService = subjectService;
}
@RequestMapping(value = "/page", method = RequestMethod.POST) @RequestMapping(value = "/page", method = RequestMethod.POST)
public RestResponse<PageInfo<QuestionPageStudentResponseVM>> pageList(@RequestBody QuestionPageStudentRequestVM model) { public RestResponse<PageInfo<QuestionPageStudentResponseVM>> pageList(@RequestBody QuestionPageStudentRequestVM model) {
model.setCreateUser(getCurrentUser().getId()); model.setCreateUser(getCurrentUser().getId());

View File

@ -2,15 +2,17 @@ package com.mindskip.xzs.controller.student;
import com.mindskip.xzs.base.BaseApiController; import com.mindskip.xzs.base.BaseApiController;
import com.mindskip.xzs.service.QuestionService; import com.mindskip.xzs.service.QuestionService;
import lombok.AllArgsConstructor; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
@RestController("StudentQuestionController") @RestController("StudentQuestionController")
@RequestMapping(value = "/api/student/question") @RequestMapping(value = "/api/student/question")
@AllArgsConstructor
public class QuestionController extends BaseApiController { public class QuestionController extends BaseApiController {
private final QuestionService questionService; private final QuestionService questionService;
@Autowired
public QuestionController(QuestionService questionService) {
this.questionService = questionService;
}
} }

View File

@ -5,8 +5,7 @@ import com.mindskip.xzs.base.BaseApiController;
import com.mindskip.xzs.base.RestResponse; import com.mindskip.xzs.base.RestResponse;
import com.mindskip.xzs.service.FileUpload; import com.mindskip.xzs.service.FileUpload;
import com.mindskip.xzs.service.UserService; import com.mindskip.xzs.service.UserService;
import lombok.AllArgsConstructor; import org.springframework.beans.factory.annotation.Autowired;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
@ -18,8 +17,6 @@ import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
@Slf4j
@AllArgsConstructor
@RequestMapping("/api/student/upload") @RequestMapping("/api/student/upload")
@RestController("StudentUploadController") @RestController("StudentUploadController")
public class UploadController extends BaseApiController { public class UploadController extends BaseApiController {
@ -27,6 +24,12 @@ public class UploadController extends BaseApiController {
private final FileUpload fileUpload; private final FileUpload fileUpload;
private final UserService userService; private final UserService userService;
@Autowired
public UploadController(FileUpload fileUpload, UserService userService) {
this.fileUpload = fileUpload;
this.userService = userService;
}
@RequestMapping("/image") @RequestMapping("/image")
@ResponseBody @ResponseBody

View File

@ -17,9 +17,8 @@ import com.mindskip.xzs.utility.DateTimeUtil;
import com.mindskip.xzs.utility.PageInfoHelper; import com.mindskip.xzs.utility.PageInfoHelper;
import com.mindskip.xzs.viewmodel.student.user.*; import com.mindskip.xzs.viewmodel.student.user.*;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import com.mindskip.xzs.viewmodel.student.user.*;
import lombok.AllArgsConstructor;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.ApplicationEventPublisher;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
@ -35,7 +34,6 @@ import java.util.stream.Collectors;
*/ */
@RestController("StudentUserController") @RestController("StudentUserController")
@RequestMapping(value = "/api/student/user") @RequestMapping(value = "/api/student/user")
@AllArgsConstructor
public class UserController extends BaseApiController { public class UserController extends BaseApiController {
private final UserService userService; private final UserService userService;
@ -44,6 +42,15 @@ public class UserController extends BaseApiController {
private final AuthenticationService authenticationService; private final AuthenticationService authenticationService;
private final ApplicationEventPublisher eventPublisher; private final ApplicationEventPublisher eventPublisher;
@Autowired
public UserController(UserService userService, UserEventLogService userEventLogService, MessageService messageService, AuthenticationService authenticationService, ApplicationEventPublisher eventPublisher) {
this.userService = userService;
this.userEventLogService = userEventLogService;
this.messageService = messageService;
this.authenticationService = authenticationService;
this.eventPublisher = eventPublisher;
}
@RequestMapping(value = "/current", method = RequestMethod.POST) @RequestMapping(value = "/current", method = RequestMethod.POST)
public RestResponse<UserResponseVM> current() { public RestResponse<UserResponseVM> current() {
User user = getCurrentUser(); User user = getCurrentUser();

View File

@ -11,7 +11,7 @@ import com.mindskip.xzs.service.UserTokenService;
import com.mindskip.xzs.utility.WxUtil; import com.mindskip.xzs.utility.WxUtil;
import com.mindskip.xzs.viewmodel.wx.student.user.BindInfo; import com.mindskip.xzs.viewmodel.wx.student.user.BindInfo;
import com.mindskip.xzs.domain.User; import com.mindskip.xzs.domain.User;
import lombok.AllArgsConstructor; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
@ -21,7 +21,6 @@ import javax.validation.constraints.NotBlank;
@Controller("WXStudentAuthController") @Controller("WXStudentAuthController")
@RequestMapping(value = "/api/wx/student/auth") @RequestMapping(value = "/api/wx/student/auth")
@AllArgsConstructor
@ResponseBody @ResponseBody
public class AuthController extends BaseWXApiController { public class AuthController extends BaseWXApiController {
@ -30,6 +29,14 @@ public class AuthController extends BaseWXApiController {
private final UserService userService; private final UserService userService;
private final UserTokenService userTokenService; private final UserTokenService userTokenService;
@Autowired
public AuthController(SystemConfig systemConfig, AuthenticationService authenticationService, UserService userService, UserTokenService userTokenService) {
this.systemConfig = systemConfig;
this.authenticationService = authenticationService;
this.userService = userService;
this.userTokenService = userTokenService;
}
@RequestMapping(value = "/bind", method = RequestMethod.POST) @RequestMapping(value = "/bind", method = RequestMethod.POST)
public RestResponse bind(@Valid BindInfo model) { public RestResponse bind(@Valid BindInfo model) {
User user = userService.getUserByUserName(model.getUserName()); User user = userService.getUserByUserName(model.getUserName());

View File

@ -16,8 +16,7 @@ import com.mindskip.xzs.service.TextContentService;
import com.mindskip.xzs.utility.DateTimeUtil; import com.mindskip.xzs.utility.DateTimeUtil;
import com.mindskip.xzs.utility.JsonUtil; import com.mindskip.xzs.utility.JsonUtil;
import com.mindskip.xzs.viewmodel.student.dashboard.*; import com.mindskip.xzs.viewmodel.student.dashboard.*;
import com.mindskip.xzs.viewmodel.student.dashboard.*; import org.springframework.beans.factory.annotation.Autowired;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestMethod;
@ -31,7 +30,6 @@ import java.util.stream.Collectors;
@Controller("WXStudentDashboardController") @Controller("WXStudentDashboardController")
@RequestMapping(value = "/api/wx/student/dashboard") @RequestMapping(value = "/api/wx/student/dashboard")
@AllArgsConstructor
@ResponseBody @ResponseBody
public class DashboardController extends BaseWXApiController { public class DashboardController extends BaseWXApiController {
@ -40,6 +38,14 @@ public class DashboardController extends BaseWXApiController {
private final TaskExamService taskExamService; private final TaskExamService taskExamService;
private final TaskExamCustomerAnswerService taskExamCustomerAnswerService; private final TaskExamCustomerAnswerService taskExamCustomerAnswerService;
@Autowired
public DashboardController(ExamPaperService examPaperService, TextContentService textContentService, TaskExamService taskExamService, TaskExamCustomerAnswerService taskExamCustomerAnswerService) {
this.examPaperService = examPaperService;
this.textContentService = textContentService;
this.taskExamService = taskExamService;
this.taskExamCustomerAnswerService = taskExamCustomerAnswerService;
}
@RequestMapping(value = "/index", method = RequestMethod.POST) @RequestMapping(value = "/index", method = RequestMethod.POST)
public RestResponse<IndexVM> index() { public RestResponse<IndexVM> index() {
IndexVM indexVM = new IndexVM(); IndexVM indexVM = new IndexVM();

View File

@ -13,15 +13,13 @@ import com.mindskip.xzs.utility.DateTimeUtil;
import com.mindskip.xzs.utility.ExamUtil; import com.mindskip.xzs.utility.ExamUtil;
import com.mindskip.xzs.utility.PageInfoHelper; import com.mindskip.xzs.utility.PageInfoHelper;
import com.mindskip.xzs.viewmodel.admin.exam.ExamPaperEditRequestVM; import com.mindskip.xzs.viewmodel.admin.exam.ExamPaperEditRequestVM;
import com.mindskip.xzs.viewmodel.student.exam.*;
import com.mindskip.xzs.viewmodel.student.exampaper.ExamPaperAnswerPageResponseVM; import com.mindskip.xzs.viewmodel.student.exampaper.ExamPaperAnswerPageResponseVM;
import com.mindskip.xzs.viewmodel.student.exampaper.ExamPaperAnswerPageVM; import com.mindskip.xzs.viewmodel.student.exampaper.ExamPaperAnswerPageVM;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import com.mindskip.xzs.domain.*;
import com.mindskip.xzs.viewmodel.student.exam.ExamPaperReadVM; import com.mindskip.xzs.viewmodel.student.exam.ExamPaperReadVM;
import com.mindskip.xzs.viewmodel.student.exam.ExamPaperSubmitItemVM; import com.mindskip.xzs.viewmodel.student.exam.ExamPaperSubmitItemVM;
import com.mindskip.xzs.viewmodel.student.exam.ExamPaperSubmitVM; import com.mindskip.xzs.viewmodel.student.exam.ExamPaperSubmitVM;
import lombok.AllArgsConstructor; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
@ -34,7 +32,6 @@ import java.util.stream.Collectors;
@Controller("WXStudentExamPaperAnswerController") @Controller("WXStudentExamPaperAnswerController")
@RequestMapping(value = "/api/wx/student/exampaper/answer") @RequestMapping(value = "/api/wx/student/exampaper/answer")
@AllArgsConstructor
@ResponseBody @ResponseBody
public class ExamPaperAnswerController extends BaseWXApiController { public class ExamPaperAnswerController extends BaseWXApiController {
@ -43,6 +40,14 @@ public class ExamPaperAnswerController extends BaseWXApiController {
private final ApplicationEventPublisher eventPublisher; private final ApplicationEventPublisher eventPublisher;
private final ExamPaperService examPaperService; private final ExamPaperService examPaperService;
@Autowired
public ExamPaperAnswerController(ExamPaperAnswerService examPaperAnswerService, SubjectService subjectService, ApplicationEventPublisher eventPublisher, ExamPaperService examPaperService) {
this.examPaperAnswerService = examPaperAnswerService;
this.subjectService = subjectService;
this.eventPublisher = eventPublisher;
this.examPaperService = examPaperService;
}
@RequestMapping(value = "/pageList", method = RequestMethod.POST) @RequestMapping(value = "/pageList", method = RequestMethod.POST)
public RestResponse<PageInfo<ExamPaperAnswerPageResponseVM>> pageList(@Valid ExamPaperAnswerPageVM model) { public RestResponse<PageInfo<ExamPaperAnswerPageResponseVM>> pageList(@Valid ExamPaperAnswerPageVM model) {
model.setCreateUser(getCurrentUser().getId()); model.setCreateUser(getCurrentUser().getId());

View File

@ -12,7 +12,7 @@ import com.mindskip.xzs.viewmodel.admin.exam.ExamPaperEditRequestVM;
import com.mindskip.xzs.viewmodel.student.exam.ExamPaperPageResponseVM; import com.mindskip.xzs.viewmodel.student.exam.ExamPaperPageResponseVM;
import com.mindskip.xzs.viewmodel.student.exam.ExamPaperPageVM; import com.mindskip.xzs.viewmodel.student.exam.ExamPaperPageVM;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import lombok.AllArgsConstructor; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
@ -21,13 +21,18 @@ import javax.validation.Valid;
@Controller("WXStudentExamController") @Controller("WXStudentExamController")
@RequestMapping(value = "/api/wx/student/exampaper") @RequestMapping(value = "/api/wx/student/exampaper")
@AllArgsConstructor
@ResponseBody @ResponseBody
public class ExamPaperController extends BaseWXApiController { public class ExamPaperController extends BaseWXApiController {
private final ExamPaperService examPaperService; private final ExamPaperService examPaperService;
private final SubjectService subjectService; private final SubjectService subjectService;
@Autowired
public ExamPaperController(ExamPaperService examPaperService, SubjectService subjectService) {
this.examPaperService = examPaperService;
this.subjectService = subjectService;
}
@RequestMapping(value = "/select/{id}", method = RequestMethod.POST) @RequestMapping(value = "/select/{id}", method = RequestMethod.POST)
public RestResponse<ExamPaperEditRequestVM> select(@PathVariable Integer id) { public RestResponse<ExamPaperEditRequestVM> select(@PathVariable Integer id) {

View File

@ -17,9 +17,8 @@ import com.mindskip.xzs.utility.DateTimeUtil;
import com.mindskip.xzs.utility.PageInfoHelper; import com.mindskip.xzs.utility.PageInfoHelper;
import com.mindskip.xzs.viewmodel.student.user.*; import com.mindskip.xzs.viewmodel.student.user.*;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import com.mindskip.xzs.viewmodel.student.user.*;
import lombok.AllArgsConstructor;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
@ -36,7 +35,6 @@ import java.util.stream.Collectors;
*/ */
@Controller("WXStudentUserController") @Controller("WXStudentUserController")
@RequestMapping(value = "/api/wx/student/user") @RequestMapping(value = "/api/wx/student/user")
@AllArgsConstructor
@ResponseBody @ResponseBody
public class UserController extends BaseWXApiController { public class UserController extends BaseWXApiController {
@ -46,6 +44,15 @@ public class UserController extends BaseWXApiController {
private final AuthenticationService authenticationService; private final AuthenticationService authenticationService;
private final ApplicationEventPublisher eventPublisher; private final ApplicationEventPublisher eventPublisher;
@Autowired
public UserController(UserService userService, UserEventLogService userEventLogService, MessageService messageService, AuthenticationService authenticationService, ApplicationEventPublisher eventPublisher) {
this.userService = userService;
this.userEventLogService = userEventLogService;
this.messageService = messageService;
this.authenticationService = authenticationService;
this.eventPublisher = eventPublisher;
}
@RequestMapping(value = "/current", method = RequestMethod.POST) @RequestMapping(value = "/current", method = RequestMethod.POST)
public RestResponse<UserResponseVM> current() { public RestResponse<UserResponseVM> current() {
User user = getCurrentUser(); User user = getCurrentUser();

View File

@ -1,12 +1,34 @@
package com.mindskip.xzs.domain; package com.mindskip.xzs.domain;
import lombok.Data;
import java.util.List; import java.util.List;
@Data
public class ExamPaperAnswerInfo { public class ExamPaperAnswerInfo {
public ExamPaper examPaper; public ExamPaper examPaper;
public ExamPaperAnswer examPaperAnswer; public ExamPaperAnswer examPaperAnswer;
public List<ExamPaperQuestionCustomerAnswer> examPaperQuestionCustomerAnswers; public List<ExamPaperQuestionCustomerAnswer> examPaperQuestionCustomerAnswers;
public ExamPaper getExamPaper() {
return examPaper;
}
public void setExamPaper(ExamPaper examPaper) {
this.examPaper = examPaper;
}
public ExamPaperAnswer getExamPaperAnswer() {
return examPaperAnswer;
}
public void setExamPaperAnswer(ExamPaperAnswer examPaperAnswer) {
this.examPaperAnswer = examPaperAnswer;
}
public List<ExamPaperQuestionCustomerAnswer> getExamPaperQuestionCustomerAnswers() {
return examPaperQuestionCustomerAnswers;
}
public void setExamPaperQuestionCustomerAnswers(List<ExamPaperQuestionCustomerAnswer> examPaperQuestionCustomerAnswers) {
this.examPaperQuestionCustomerAnswers = examPaperQuestionCustomerAnswers;
}
} }

View File

@ -7,7 +7,6 @@ import java.util.Map;
public enum RoleEnum { public enum RoleEnum {
STUDENT(1, "STUDENT"), STUDENT(1, "STUDENT"),
TEACHER(2, "TEACHER"),
ADMIN(3, "ADMIN"); ADMIN(3, "ADMIN");
int code; int code;

View File

@ -1,9 +1,22 @@
package com.mindskip.xzs.domain.exam; package com.mindskip.xzs.domain.exam;
import lombok.Data;
@Data
public class ExamPaperQuestionItemObject { public class ExamPaperQuestionItemObject {
private Integer id; private Integer id;
private Integer itemOrder; private Integer itemOrder;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getItemOrder() {
return itemOrder;
}
public void setItemOrder(Integer itemOrder) {
this.itemOrder = itemOrder;
}
} }

View File

@ -1,13 +1,27 @@
package com.mindskip.xzs.domain.exam; package com.mindskip.xzs.domain.exam;
import lombok.Data;
import java.util.List; import java.util.List;
@Data
public class ExamPaperTitleItemObject { public class ExamPaperTitleItemObject {
private String name; private String name;
private List<ExamPaperQuestionItemObject> questionItems; private List<ExamPaperQuestionItemObject> questionItems;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<ExamPaperQuestionItemObject> getQuestionItems() {
return questionItems;
}
public void setQuestionItems(List<ExamPaperQuestionItemObject> questionItems) {
this.questionItems = questionItems;
}
} }

View File

@ -1,10 +1,32 @@
package com.mindskip.xzs.domain.other; package com.mindskip.xzs.domain.other;
import lombok.Data;
@Data
public class ExamPaperAnswerUpdate { public class ExamPaperAnswerUpdate {
private Integer id; private Integer id;
private Integer customerScore; private Integer customerScore;
private Boolean doRight; private Boolean doRight;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getCustomerScore() {
return customerScore;
}
public void setCustomerScore(Integer customerScore) {
this.customerScore = customerScore;
}
public Boolean getDoRight() {
return doRight;
}
public void setDoRight(Boolean doRight) {
this.doRight = doRight;
}
} }

View File

@ -1,11 +1,24 @@
package com.mindskip.xzs.domain.other; package com.mindskip.xzs.domain.other;
import lombok.Data;
@Data
public class KeyValue { public class KeyValue {
private String name; private String name;
private Integer value; private Integer value;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getValue() {
return value;
}
public void setValue(Integer value) {
this.value = value;
}
} }

View File

@ -1,8 +1,6 @@
package com.mindskip.xzs.domain.question; package com.mindskip.xzs.domain.question;
import lombok.Data;
@Data
public class QuestionItemObject { public class QuestionItemObject {
private String prefix; private String prefix;
@ -10,4 +8,28 @@ public class QuestionItemObject {
private String content; private String content;
private Integer score; private Integer score;
public String getPrefix() {
return prefix;
}
public void setPrefix(String prefix) {
this.prefix = prefix;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public Integer getScore() {
return score;
}
public void setScore(Integer score) {
this.score = score;
}
} }

View File

@ -1,11 +1,9 @@
package com.mindskip.xzs.domain.question; package com.mindskip.xzs.domain.question;
import lombok.Data;
import java.util.List; import java.util.List;
@Data
public class QuestionObject { public class QuestionObject {
private String titleContent; private String titleContent;
@ -15,4 +13,36 @@ public class QuestionObject {
private List<QuestionItemObject> questionItemObjects; private List<QuestionItemObject> questionItemObjects;
private String correct; private String correct;
public String getTitleContent() {
return titleContent;
}
public void setTitleContent(String titleContent) {
this.titleContent = titleContent;
}
public String getAnalyze() {
return analyze;
}
public void setAnalyze(String analyze) {
this.analyze = analyze;
}
public List<QuestionItemObject> getQuestionItemObjects() {
return questionItemObjects;
}
public void setQuestionItemObjects(List<QuestionItemObject> questionItemObjects) {
this.questionItemObjects = questionItemObjects;
}
public String getCorrect() {
return correct;
}
public void setCorrect(String correct) {
this.correct = correct;
}
} }

Some files were not shown because too many files have changed in this diff Show More