Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
代码敲不队
YoubiliProject
提交
2ac385be
Y
YoubiliProject
项目概览
代码敲不队
/
YoubiliProject
通知
7
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
Y
YoubiliProject
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
2ac385be
编写于
6月 10, 2023
作者:
喷火的神灵
🎱
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
2023年6月10日18:01:19
上级
443f4713
变更
16
显示空白变更内容
内联
并排
Showing
16 changed file
with
384 addition
and
66 deletion
+384
-66
YouBili_front/package-lock.json
YouBili_front/package-lock.json
+103
-14
YouBili_front/package.json
YouBili_front/package.json
+1
-0
YouBili_front/src/assets/用户.jpg
YouBili_front/src/assets/用户.jpg
+0
-0
YouBili_front/src/components/login.vue
YouBili_front/src/components/login.vue
+33
-28
YouBili_front/src/utils/option.js
YouBili_front/src/utils/option.js
+34
-0
YouBili_front/src/utils/request.js
YouBili_front/src/utils/request.js
+101
-0
youbili-project-backend/src/main/java/cn/tedu/youbiliprojectbackend/controller/AuthorizeController.java
...youbiliprojectbackend/controller/AuthorizeController.java
+13
-8
youbili-project-backend/src/main/java/cn/tedu/youbiliprojectbackend/controller/UserController.java
...tedu/youbiliprojectbackend/controller/UserController.java
+9
-1
youbili-project-backend/src/main/java/cn/tedu/youbiliprojectbackend/mapper/UserMapper.java
...java/cn/tedu/youbiliprojectbackend/mapper/UserMapper.java
+6
-2
youbili-project-backend/src/main/java/cn/tedu/youbiliprojectbackend/pojo/vo/AccountUserVO.java
.../cn/tedu/youbiliprojectbackend/pojo/vo/AccountUserVO.java
+12
-0
youbili-project-backend/src/main/java/cn/tedu/youbiliprojectbackend/response/RestBean.java
...java/cn/tedu/youbiliprojectbackend/response/RestBean.java
+1
-12
youbili-project-backend/src/main/java/cn/tedu/youbiliprojectbackend/securityConfig/AuthorizeInterceptor.java
...liprojectbackend/securityConfig/AuthorizeInterceptor.java
+31
-0
youbili-project-backend/src/main/java/cn/tedu/youbiliprojectbackend/securityConfig/WebConfiguration.java
...oubiliprojectbackend/securityConfig/WebConfiguration.java
+23
-0
youbili-project-backend/src/main/java/cn/tedu/youbiliprojectbackend/service/impl/AuthorizeServiceImpl.java
...biliprojectbackend/service/impl/AuthorizeServiceImpl.java
+1
-1
youbili-project-backend/src/main/resources/mapper/UserMapper.xml
...-project-backend/src/main/resources/mapper/UserMapper.xml
+5
-0
youbili-project-backend/src/test/java/cn/tedu/youbiliprojectbackend/YoubiliProjectBackendApplicationTests.java
...projectbackend/YoubiliProjectBackendApplicationTests.java
+11
-0
未找到文件。
YouBili_front/package-lock.json
浏览文件 @
2ac385be
...
@@ -9,6 +9,7 @@
...
@@ -9,6 +9,7 @@
"version": "0.1.0",
"version": "0.1.0",
"dependencies": {
"dependencies": {
"axios": "^1.4.0",
"axios": "^1.4.0",
"cookie-session": "^2.0.0",
"core-js": "^3.8.3",
"core-js": "^3.8.3",
"dplayer": "^1.27.1",
"dplayer": "^1.27.1",
"element-ui": "^2.15.13",
"element-ui": "^2.15.13",
...
@@ -4116,12 +4117,46 @@
...
@@ -4116,12 +4117,46 @@
"node": ">= 0.6"
"node": ">= 0.6"
}
}
},
},
"node_modules/cookie-session": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/cookie-session/-/cookie-session-2.0.0.tgz",
"integrity": "sha512-hKvgoThbw00zQOleSlUr2qpvuNweoqBtxrmx0UFosx6AGi9lYtLoA+RbsvknrEX8Pr6MDbdWAb2j6SnMn+lPsg==",
"dependencies": {
"cookies": "0.8.0",
"debug": "3.2.7",
"on-headers": "~1.0.2",
"safe-buffer": "5.2.1"
},
"engines": {
"node": ">= 0.10"
}
},
"node_modules/cookie-session/node_modules/debug": {
"version": "3.2.7",
"resolved": "https://registry.npmmirror.com/debug/-/debug-3.2.7.tgz",
"integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
"dependencies": {
"ms": "^2.1.1"
}
},
"node_modules/cookie-signature": {
"node_modules/cookie-signature": {
"version": "1.0.6",
"version": "1.0.6",
"resolved": "https://registry.npmmirror.com/cookie-signature/-/cookie-signature-1.0.6.tgz",
"resolved": "https://registry.npmmirror.com/cookie-signature/-/cookie-signature-1.0.6.tgz",
"integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==",
"integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==",
"dev": true
"dev": true
},
},
"node_modules/cookies": {
"version": "0.8.0",
"resolved": "https://registry.npmmirror.com/cookies/-/cookies-0.8.0.tgz",
"integrity": "sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==",
"dependencies": {
"depd": "~2.0.0",
"keygrip": "~1.1.0"
},
"engines": {
"node": ">= 0.8"
}
},
"node_modules/copy-webpack-plugin": {
"node_modules/copy-webpack-plugin": {
"version": "9.1.0",
"version": "9.1.0",
"resolved": "https://registry.npmmirror.com/copy-webpack-plugin/-/copy-webpack-plugin-9.1.0.tgz",
"resolved": "https://registry.npmmirror.com/copy-webpack-plugin/-/copy-webpack-plugin-9.1.0.tgz",
...
@@ -4706,7 +4741,6 @@
...
@@ -4706,7 +4741,6 @@
"version": "2.0.0",
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/depd/-/depd-2.0.0.tgz",
"resolved": "https://registry.npmmirror.com/depd/-/depd-2.0.0.tgz",
"integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
"integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
"dev": true,
"engines": {
"engines": {
"node": ">= 0.8"
"node": ">= 0.8"
}
}
...
@@ -6811,6 +6845,17 @@
...
@@ -6811,6 +6845,17 @@
"graceful-fs": "^4.1.6"
"graceful-fs": "^4.1.6"
}
}
},
},
"node_modules/keygrip": {
"version": "1.1.0",
"resolved": "https://registry.npmmirror.com/keygrip/-/keygrip-1.1.0.tgz",
"integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==",
"dependencies": {
"tsscmp": "1.0.6"
},
"engines": {
"node": ">= 0.6"
}
},
"node_modules/kind-of": {
"node_modules/kind-of": {
"version": "6.0.3",
"version": "6.0.3",
"resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-6.0.3.tgz",
"resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-6.0.3.tgz",
...
@@ -7456,8 +7501,7 @@
...
@@ -7456,8 +7501,7 @@
"node_modules/ms": {
"node_modules/ms": {
"version": "2.1.2",
"version": "2.1.2",
"resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz",
"resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
"dev": true
},
},
"node_modules/multicast-dns": {
"node_modules/multicast-dns": {
"version": "7.2.5",
"version": "7.2.5",
...
@@ -7701,7 +7745,6 @@
...
@@ -7701,7 +7745,6 @@
"version": "1.0.2",
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/on-headers/-/on-headers-1.0.2.tgz",
"resolved": "https://registry.npmmirror.com/on-headers/-/on-headers-1.0.2.tgz",
"integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==",
"integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==",
"dev": true,
"engines": {
"engines": {
"node": ">= 0.8"
"node": ">= 0.8"
}
}
...
@@ -9099,8 +9142,7 @@
...
@@ -9099,8 +9142,7 @@
"node_modules/safe-buffer": {
"node_modules/safe-buffer": {
"version": "5.2.1",
"version": "5.2.1",
"resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz",
"resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz",
"integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
"integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
"dev": true
},
},
"node_modules/safer-buffer": {
"node_modules/safer-buffer": {
"version": "2.1.2",
"version": "2.1.2",
...
@@ -9958,6 +10000,14 @@
...
@@ -9958,6 +10000,14 @@
"integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
"integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
"dev": true
"dev": true
},
},
"node_modules/tsscmp": {
"version": "1.0.6",
"resolved": "https://registry.npmmirror.com/tsscmp/-/tsscmp-1.0.6.tgz",
"integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==",
"engines": {
"node": ">=0.6.x"
}
},
"node_modules/type-check": {
"node_modules/type-check": {
"version": "0.4.0",
"version": "0.4.0",
"resolved": "https://registry.npmmirror.com/type-check/-/type-check-0.4.0.tgz",
"resolved": "https://registry.npmmirror.com/type-check/-/type-check-0.4.0.tgz",
...
@@ -14260,12 +14310,42 @@
...
@@ -14260,12 +14310,42 @@
"integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==",
"integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==",
"dev": true
"dev": true
},
},
"cookie-session": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/cookie-session/-/cookie-session-2.0.0.tgz",
"integrity": "sha512-hKvgoThbw00zQOleSlUr2qpvuNweoqBtxrmx0UFosx6AGi9lYtLoA+RbsvknrEX8Pr6MDbdWAb2j6SnMn+lPsg==",
"requires": {
"cookies": "0.8.0",
"debug": "3.2.7",
"on-headers": "~1.0.2",
"safe-buffer": "5.2.1"
},
"dependencies": {
"debug": {
"version": "3.2.7",
"resolved": "https://registry.npmmirror.com/debug/-/debug-3.2.7.tgz",
"integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
"requires": {
"ms": "^2.1.1"
}
}
}
},
"cookie-signature": {
"cookie-signature": {
"version": "1.0.6",
"version": "1.0.6",
"resolved": "https://registry.npmmirror.com/cookie-signature/-/cookie-signature-1.0.6.tgz",
"resolved": "https://registry.npmmirror.com/cookie-signature/-/cookie-signature-1.0.6.tgz",
"integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==",
"integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==",
"dev": true
"dev": true
},
},
"cookies": {
"version": "0.8.0",
"resolved": "https://registry.npmmirror.com/cookies/-/cookies-0.8.0.tgz",
"integrity": "sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==",
"requires": {
"depd": "~2.0.0",
"keygrip": "~1.1.0"
}
},
"copy-webpack-plugin": {
"copy-webpack-plugin": {
"version": "9.1.0",
"version": "9.1.0",
"resolved": "https://registry.npmmirror.com/copy-webpack-plugin/-/copy-webpack-plugin-9.1.0.tgz",
"resolved": "https://registry.npmmirror.com/copy-webpack-plugin/-/copy-webpack-plugin-9.1.0.tgz",
...
@@ -14709,8 +14789,7 @@
...
@@ -14709,8 +14789,7 @@
"depd": {
"depd": {
"version": "2.0.0",
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/depd/-/depd-2.0.0.tgz",
"resolved": "https://registry.npmmirror.com/depd/-/depd-2.0.0.tgz",
"integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
"integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
"dev": true
},
},
"destroy": {
"destroy": {
"version": "1.2.0",
"version": "1.2.0",
...
@@ -16394,6 +16473,14 @@
...
@@ -16394,6 +16473,14 @@
"universalify": "^2.0.0"
"universalify": "^2.0.0"
}
}
},
},
"keygrip": {
"version": "1.1.0",
"resolved": "https://registry.npmmirror.com/keygrip/-/keygrip-1.1.0.tgz",
"integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==",
"requires": {
"tsscmp": "1.0.6"
}
},
"kind-of": {
"kind-of": {
"version": "6.0.3",
"version": "6.0.3",
"resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-6.0.3.tgz",
"resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-6.0.3.tgz",
...
@@ -16920,8 +17007,7 @@
...
@@ -16920,8 +17007,7 @@
"ms": {
"ms": {
"version": "2.1.2",
"version": "2.1.2",
"resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz",
"resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
"dev": true
},
},
"multicast-dns": {
"multicast-dns": {
"version": "7.2.5",
"version": "7.2.5",
...
@@ -17113,8 +17199,7 @@
...
@@ -17113,8 +17199,7 @@
"on-headers": {
"on-headers": {
"version": "1.0.2",
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/on-headers/-/on-headers-1.0.2.tgz",
"resolved": "https://registry.npmmirror.com/on-headers/-/on-headers-1.0.2.tgz",
"integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==",
"integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA=="
"dev": true
},
},
"once": {
"once": {
"version": "1.4.0",
"version": "1.4.0",
...
@@ -18154,8 +18239,7 @@
...
@@ -18154,8 +18239,7 @@
"safe-buffer": {
"safe-buffer": {
"version": "5.2.1",
"version": "5.2.1",
"resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz",
"resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz",
"integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
"integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
"dev": true
},
},
"safer-buffer": {
"safer-buffer": {
"version": "2.1.2",
"version": "2.1.2",
...
@@ -18863,6 +18947,11 @@
...
@@ -18863,6 +18947,11 @@
"integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
"integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
"dev": true
"dev": true
},
},
"tsscmp": {
"version": "1.0.6",
"resolved": "https://registry.npmmirror.com/tsscmp/-/tsscmp-1.0.6.tgz",
"integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA=="
},
"type-check": {
"type-check": {
"version": "0.4.0",
"version": "0.4.0",
"resolved": "https://registry.npmmirror.com/type-check/-/type-check-0.4.0.tgz",
"resolved": "https://registry.npmmirror.com/type-check/-/type-check-0.4.0.tgz",
...
...
YouBili_front/package.json
浏览文件 @
2ac385be
...
@@ -9,6 +9,7 @@
...
@@ -9,6 +9,7 @@
},
},
"dependencies"
:
{
"dependencies"
:
{
"axios"
:
"^1.4.0"
,
"axios"
:
"^1.4.0"
,
"cookie-session"
:
"^2.0.0"
,
"core-js"
:
"^3.8.3"
,
"core-js"
:
"^3.8.3"
,
"dplayer"
:
"^1.27.1"
,
"dplayer"
:
"^1.27.1"
,
"element-ui"
:
"^2.15.13"
,
"element-ui"
:
"^2.15.13"
,
...
...
YouBili_front/src/assets/用户.jpg
0 → 100644
浏览文件 @
2ac385be
6.7 KB
YouBili_front/src/components/login.vue
浏览文件 @
2ac385be
...
@@ -68,6 +68,12 @@
...
@@ -68,6 +68,12 @@
</
template
>
</
template
>
<
script
>
<
script
>
import
{
login
,
// 登录
vaildEmail
,
// 发送验证码
register
,
// 注册
}
from
"
@/utils/option
"
;
export
default
{
export
default
{
name
:
"
login
"
,
name
:
"
login
"
,
props
:
{
props
:
{
...
@@ -109,7 +115,7 @@ export default {
...
@@ -109,7 +115,7 @@ export default {
code
:
''
,
// 验证码
code
:
''
,
// 验证码
email
:
''
,
// 邮箱
email
:
''
,
// 邮箱
},
},
sessionId
:
""
,
message
:
""
,
// 验证规则
// 验证规则
loginRules
:
{
loginRules
:
{
username
:
[
username
:
[
...
@@ -149,15 +155,16 @@ export default {
...
@@ -149,15 +155,16 @@ export default {
submitForm
(
formName
)
{
submitForm
(
formName
)
{
this
.
$refs
[
formName
].
validate
((
valid
)
=>
{
this
.
$refs
[
formName
].
validate
((
valid
)
=>
{
if
(
valid
)
{
if
(
valid
)
{
// alert('submit!');
// 注册
this
.
axios
.
post
(
"
/api/auth/register
"
,
{...
this
.
ruleForm
,
sessionId
:
this
.
sessionId
},
{
headers
:
{
register
({...
this
.
ruleForm
,
sessionId
:
this
.
message
}).
then
(
res
=>
{
'
Content-Type
'
:
'
application/x-www-form-urlencoded
'
if
(
res
.
status
==
200
)
{
}}).
then
(
res
=>
{
this
.
$message
.
success
(
res
.
message
)
if
(
res
.
data
.
status
==
200
)
{
this
.
$message
.
success
(
res
.
data
.
message
)
this
.
$emit
(
'
close
'
);
this
.
$emit
(
'
close
'
);
}
else
{
this
.
$message
.
error
(
res
.
message
)
}
}
})
})
}
else
{
}
else
{
console
.
log
(
'
error submit!!
'
);
console
.
log
(
'
error submit!!
'
);
return
false
;
return
false
;
...
@@ -168,23 +175,23 @@ export default {
...
@@ -168,23 +175,23 @@ export default {
resetForm
(
formName
)
{
resetForm
(
formName
)
{
this
.
$refs
[
formName
].
resetFields
();
this
.
$refs
[
formName
].
resetFields
();
},
},
//
提交
按钮
//
登录
按钮
loginForm
(
formName
)
{
loginForm
(
formName
)
{
this
.
$refs
[
formName
].
validate
((
valid
)
=>
{
this
.
$refs
[
formName
].
validate
((
valid
)
=>
{
if
(
valid
)
{
if
(
valid
)
{
alert
(
'
login!
'
);
// 登录成功之后给弹窗隐藏
// 登录成功之后给弹窗隐藏
this
.
axios
.
post
(
"
/api/auth/login
"
,
this
.
login
,
{
headers
:
{
login
(
this
.
login
).
then
(
res
=>
{
'
Content-Type
'
:
'
application/x-www-form-urlencoded
'
if
(
res
.
status
==
200
)
{
}}).
then
(
res
=>
{
this
.
$message
.
success
(
res
.
message
)
if
(
res
.
data
.
status
==
200
)
{
this
.
$message
.
success
(
res
.
data
.
message
)
this
.
$emit
(
'
close
'
);
this
.
$emit
(
'
close
'
);
}
}
})
})
}
else
if
(
res
.
data
.
status
==
401
){
this
.
$message
.
error
(
res
.
data
.
message
);
}
else
{
}
else
{
console
.
log
(
'
error login!!
'
);
this
.
$message
.
error
(
res
.
data
.
message
)
;
return
false
;
}
}
});
});
},
},
...
@@ -204,15 +211,13 @@ export default {
...
@@ -204,15 +211,13 @@ export default {
setTimeout
(()
=>
{
setTimeout
(()
=>
{
this
.
doLoop
(
60
);
this
.
doLoop
(
60
);
},
500
);
},
500
);
// 发送验证码请求
this
.
axios
.
post
(
"
/api/auth/vaild-email
"
,{
email
:
this
.
ruleForm
.
email
},
{
headers
:
{
vaildEmail
({
email
:
this
.
ruleForm
.
email
}).
then
(
res
=>
{
'
Content-Type
'
:
'
application/x-www-form-urlencoded
'
if
(
res
.
status
==
200
)
{
}}).
then
(
res
=>
{
this
.
$message
.
success
(
"
邮件已发送
"
);
if
(
res
.
data
.
status
==
200
)
{
this
.
message
=
res
.
message
;
// console.log(res.data.data);
}
else
{
this
.
sessionId
=
res
.
data
.
sessionId
;
this
.
$message
.
error
(
res
.
message
);
console
.
log
(
this
.
sessionId
)
this
.
$message
.
success
(
"
邮件已发送
"
)
}
}
})
})
}
else
{
}
else
{
...
@@ -220,7 +225,7 @@ export default {
...
@@ -220,7 +225,7 @@ export default {
}
}
});
});
},
},
//
邮箱
验证码的倒计时
//
手机
验证码的倒计时
doLoop
:
function
(
seconds
)
{
doLoop
:
function
(
seconds
)
{
seconds
=
seconds
?
seconds
:
60
;
seconds
=
seconds
?
seconds
:
60
;
this
.
btnText
=
seconds
+
"
s后获取
"
;
this
.
btnText
=
seconds
+
"
s后获取
"
;
...
...
YouBili_front/src/utils/option.js
0 → 100644
浏览文件 @
2ac385be
import
request
from
'
@/utils/request
'
/**
*
* @param {*} method 请求方法
* @param {*} url 请求地址
* @param {*} data post、put 请求的参数
* @param {*} params get、delete 请求的参数
* @param {*} config 请求配置,如headers等
*/
// 登录
export
function
login
(
params
)
{
return
request
({
method
:
'
post
'
,
url
:
'
/api/auth/login
'
,
data
:
params
})
}
// 发送验证码
export
function
vaildEmail
(
params
)
{
return
request
({
method
:
'
post
'
,
url
:
'
/api/auth/vaild-email
'
,
data
:
params
})
}
// 注册请求
export
function
register
(
params
)
{
return
request
({
method
:
'
post
'
,
url
:
'
/api/auth/register
'
,
data
:
params
})
}
\ No newline at end of file
YouBili_front/src/utils/request.js
0 → 100644
浏览文件 @
2ac385be
import
axios
from
'
axios
'
const
instance
=
axios
.
create
({
// API接口的base_url
baseURL
:
'
http://192.168.43.35:8089
'
,
// 超时时间
timeout
:
20000
,
// headers配置
headers
:
{
// 'Content-Type': 'application/json;charset=utf-8',
'
Content-Type
'
:
'
application/x-www-form-urlencoded
'
,
// 'X-Requested-With': 'XMLHttpRequest'
}
})
instance
.
interceptors
.
request
.
use
(
config
=>
{
// 可以在发送请求前做一些对config的处理,例如给headers添加token
const
token
=
sessionStorage
.
getItem
(
'
token
'
)
if
(
token
)
{
config
.
headers
[
'
Authorization
'
]
=
token
}
return
config
},
error
=>
{
// 发送请求错误时做一些处理,例如抛出错误
return
Promise
.
reject
(
error
)
}
)
instance
.
interceptors
.
response
.
use
(
response
=>
{
// 对响应数据做些处理,例如验证token是否过期等
return
response
.
data
},
error
=>
{
// 对响应Error做些处理,例如判断响应状态码返回对应错误信息
// if (error.response) {
// switch (error.response.status) {
// case 400:
// error.message = '请求错误(400)'
// break
// case 401:
// error.message = '未授权,请重新登录(401)'
// break
// case 403:
// error.message = '拒绝访问(403)'
// break
// case 404:
// error.message = '请求出错(404)'
// break
// case 408:
// error.message = '请求超时(408)'
// break
// case 500:
// error.message = '服务器错误(500)'
// break
// case 501:
// error.message = '服务未实现(501)'
// break
// case 502:
// error.message = '网络错误(502)'
// break
// case 503:
// error.message = '服务不可用(503)'
// break
// case 504:
// error.message = '网络超时(504)'
// break
// case 505:
// error.message = 'HTTP版本不受支持(505)'
// break
// default:
// error.message = `连接出错(${error.response.status})!`
// }
// } else {
// error.message = '连接服务器失败!'
// }
return
Promise
.
reject
(
error
)
}
)
/**
*
* @param {*} method 请求方法
* @param {*} url 请求地址
* @param {*} data post、put 请求的参数
* @param {*} params get、delete 请求的参数
* @param {*} config 请求配置,如headers等
*/
function
request
({
method
,
url
,
data
=
{},
params
=
{},
headers
=
{}
})
{
return
instance
({
method
,
url
,
data
,
params
,
headers
})
}
export
default
request
youbili-project-backend/src/main/java/cn/tedu/youbiliprojectbackend/controller/AuthorizeController.java
浏览文件 @
2ac385be
...
@@ -6,12 +6,15 @@ import jakarta.servlet.http.HttpSession;
...
@@ -6,12 +6,15 @@ import jakarta.servlet.http.HttpSession;
import
jakarta.validation.constraints.Pattern
;
import
jakarta.validation.constraints.Pattern
;
import
org.hibernate.validator.constraints.Length
;
import
org.hibernate.validator.constraints.Length
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.security.web.context.HttpSessionSecurityContextRepository
;
import
org.springframework.stereotype.Service
;
import
org.springframework.validation.annotation.Validated
;
import
org.springframework.validation.annotation.Validated
;
import
org.springframework.web.bind.annotation.PostMapping
;
import
org.springframework.web.bind.annotation.PostMapping
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RequestParam
;
import
org.springframework.web.bind.annotation.RequestParam
;
import
org.springframework.web.bind.annotation.RestController
;
import
org.springframework.web.bind.annotation.RestController
;
/**
/**
* 邮箱验证注册功能
* 邮箱验证注册功能
*
*
...
@@ -28,6 +31,9 @@ public class AuthorizeController {
...
@@ -28,6 +31,9 @@ public class AuthorizeController {
@Autowired
@Autowired
AuthorizeService
service
;
AuthorizeService
service
;
/**
/**
* 发送验证邮件
* 发送验证邮件
* 验证email是否符合正则表达式,若不符合则报错
* 验证email是否符合正则表达式,若不符合则报错
...
@@ -38,14 +44,14 @@ public class AuthorizeController {
...
@@ -38,14 +44,14 @@ public class AuthorizeController {
@PostMapping
(
"/vaild-email"
)
@PostMapping
(
"/vaild-email"
)
public
RestBean
<
String
>
vaildateEmail
(
@Pattern
(
regexp
=
EMAIL_REGEX
)
@RequestParam
(
"email"
)
String
email
,
public
RestBean
<
String
>
vaildateEmail
(
@Pattern
(
regexp
=
EMAIL_REGEX
)
@RequestParam
(
"email"
)
String
email
,
HttpSession
session
)
{
HttpSession
session
)
{
String
sessionId
=
session
.
getId
();
//String.valueOf(session);
String
sessionId
=
session
.
getId
();
System
.
out
.
println
(
"
vaild
"
+
sessionId
);
System
.
out
.
println
(
"
sessionId=
"
+
sessionId
);
String
s
=
service
.
sendVaildateEmail
(
email
,
sessionId
);
String
s
=
service
.
sendVaildateEmail
(
email
,
sessionId
);
System
.
err
.
println
(
s
);
//打印返回的数值,便于观察错误
System
.
err
.
println
(
"s="
+
s
);
//打印返回的数值,便于观察错误
if
(
s
==
null
)
{
if
(
s
==
null
)
{
return
RestBean
.
success
(
"邮件已发送"
,
sessionId
);
return
RestBean
.
success
(
sessionId
);
}
else
{
}
else
{
return
RestBean
.
failure
(
400
,
"邮件发送错误"
);
return
RestBean
.
failure
(
400
,
s
);
}
}
}
}
...
@@ -57,8 +63,7 @@ public class AuthorizeController {
...
@@ -57,8 +63,7 @@ public class AuthorizeController {
@Pattern
(
regexp
=
EMAIL_REGEX
)
@RequestParam
(
"email"
)
String
email
,
@Pattern
(
regexp
=
EMAIL_REGEX
)
@RequestParam
(
"email"
)
String
email
,
@Length
(
min
=
1
,
max
=
10
)
@RequestParam
(
"nickname"
)
String
nickname
,
@Length
(
min
=
1
,
max
=
10
)
@RequestParam
(
"nickname"
)
String
nickname
,
@Length
(
min
=
6
,
max
=
6
)
@RequestParam
(
"code"
)
String
code
,
@Length
(
min
=
6
,
max
=
6
)
@RequestParam
(
"code"
)
String
code
,
HttpSession
session
)
{
String
sessionId
)
{
String
sessionId
=
session
.
getId
();
String
s
=
service
.
validateAndRegister
(
username
,
password
,
email
,
nickname
,
code
,
sessionId
);
String
s
=
service
.
validateAndRegister
(
username
,
password
,
email
,
nickname
,
code
,
sessionId
);
System
.
out
.
println
(
"Reg :"
+
sessionId
);
System
.
out
.
println
(
"Reg :"
+
sessionId
);
System
.
err
.
println
(
s
);
//打印返回的数值,便于观察错误
System
.
err
.
println
(
s
);
//打印返回的数值,便于观察错误
...
@@ -66,6 +71,6 @@ public class AuthorizeController {
...
@@ -66,6 +71,6 @@ public class AuthorizeController {
return
RestBean
.
success
(
"注册成功"
);
return
RestBean
.
success
(
"注册成功"
);
}
}
return
RestBean
.
failure
(
400
,
"注册失败"
);
return
RestBean
.
failure
(
400
,
s
);
}
}
}
}
youbili-project-backend/src/main/java/cn/tedu/youbiliprojectbackend/controller/UserController.java
浏览文件 @
2ac385be
package
cn.tedu.youbiliprojectbackend.controller
;
package
cn.tedu.youbiliprojectbackend.controller
;
import
cn.tedu.youbiliprojectbackend.pojo.vo.AccountUserVO
;
import
cn.tedu.youbiliprojectbackend.response.RestBean
;
import
org.springframework.web.bind.annotation.GetMapping
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RestController
;
import
org.springframework.web.bind.annotation.RestController
;
import
org.springframework.web.bind.annotation.SessionAttribute
;
@RestController
@RestController
@RequestMapping
@RequestMapping
(
"/api/user"
)
public
class
UserController
{
public
class
UserController
{
@GetMapping
(
"/me"
)
public
RestBean
<
AccountUserVO
>
me
(
@SessionAttribute
(
"account"
)
AccountUserVO
user
){
return
RestBean
.
success
(
user
);
}
}
}
youbili-project-backend/src/main/java/cn/tedu/youbiliprojectbackend/mapper/UserMapper.java
浏览文件 @
2ac385be
package
cn.tedu.youbiliprojectbackend.mapper
;
package
cn.tedu.youbiliprojectbackend.mapper
;
import
cn.tedu.youbiliprojectbackend.pojo.entity.Account
;
import
cn.tedu.youbiliprojectbackend.pojo.entity.Account
;
import
cn.tedu.youbiliprojectbackend.pojo.vo.AccountUserVO
;
import
org.springframework.stereotype.Repository
;
import
org.springframework.stereotype.Repository
;
import
java.util.Date
;
@Repository
@Repository
public
interface
UserMapper
{
public
interface
UserMapper
{
...
@@ -14,5 +13,10 @@ public interface UserMapper {
...
@@ -14,5 +13,10 @@ public interface UserMapper {
//登录时更新最后登录时间
//登录时更新最后登录时间
int
updateLastLoginDate
(
String
username
);
int
updateLastLoginDate
(
String
username
);
//注册
int
insertUser
(
String
username
,
String
password
,
String
Email
,
String
nickname
);
int
insertUser
(
String
username
,
String
password
,
String
Email
,
String
nickname
);
//给前端用户数据
AccountUserVO
selectUserByuserNameOrEmail
(
String
text
);
}
}
youbili-project-backend/src/main/java/cn/tedu/youbiliprojectbackend/pojo/vo/AccountUserVO.java
0 → 100644
浏览文件 @
2ac385be
package
cn.tedu.youbiliprojectbackend.pojo.vo
;
import
lombok.Data
;
@Data
public
class
AccountUserVO
{
private
int
UserID
;
private
String
username
;
private
String
email
;
private
String
Nickname
;
}
\ No newline at end of file
youbili-project-backend/src/main/java/cn/tedu/youbiliprojectbackend/response/RestBean.java
浏览文件 @
2ac385be
...
@@ -16,20 +16,13 @@ public class RestBean<T> {
...
@@ -16,20 +16,13 @@ public class RestBean<T> {
private
int
status
;
private
int
status
;
private
boolean
success
;
private
boolean
success
;
private
T
message
;
private
T
message
;
private
T
sessionId
;
private
RestBean
(
int
status
,
boolean
success
,
T
message
)
{
private
RestBean
(
int
status
,
boolean
success
,
T
message
)
{
this
.
status
=
status
;
this
.
status
=
status
;
this
.
success
=
success
;
this
.
success
=
success
;
this
.
message
=
message
;
this
.
message
=
message
;
}
}
//返回session
private
RestBean
(
int
status
,
boolean
success
,
T
message
,
T
session
){
this
.
status
=
status
;
this
.
success
=
success
;
this
.
message
=
message
;
this
.
sessionId
=
session
;
}
public
static
<
T
>
RestBean
<
T
>
success
()
{
public
static
<
T
>
RestBean
<
T
>
success
()
{
return
new
RestBean
<>(
200
,
true
,
null
);
return
new
RestBean
<>(
200
,
true
,
null
);
...
@@ -39,10 +32,6 @@ public class RestBean<T> {
...
@@ -39,10 +32,6 @@ public class RestBean<T> {
return
new
RestBean
<>(
200
,
true
,
data
);
return
new
RestBean
<>(
200
,
true
,
data
);
}
}
public
static
<
T
>
RestBean
<
T
>
success
(
T
data
,
T
session
)
{
return
new
RestBean
<>(
200
,
true
,
data
,
session
);
}
public
static
<
T
>
RestBean
<
T
>
failure
(
int
status
)
{
public
static
<
T
>
RestBean
<
T
>
failure
(
int
status
)
{
return
new
RestBean
<>(
status
,
false
,
null
);
return
new
RestBean
<>(
status
,
false
,
null
);
}
}
...
...
youbili-project-backend/src/main/java/cn/tedu/youbiliprojectbackend/securityConfig/AuthorizeInterceptor.java
0 → 100644
浏览文件 @
2ac385be
package
cn.tedu.youbiliprojectbackend.securityConfig
;
import
cn.tedu.youbiliprojectbackend.mapper.UserMapper
;
import
cn.tedu.youbiliprojectbackend.pojo.vo.AccountUserVO
;
import
jakarta.servlet.http.HttpServletRequest
;
import
jakarta.servlet.http.HttpServletResponse
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.security.core.Authentication
;
import
org.springframework.security.core.context.SecurityContext
;
import
org.springframework.security.core.context.SecurityContextHolder
;
import
org.springframework.security.core.userdetails.User
;
import
org.springframework.stereotype.Component
;
import
org.springframework.web.servlet.HandlerInterceptor
;
@Component
public
class
AuthorizeInterceptor
implements
HandlerInterceptor
{
@Autowired
UserMapper
mapper
;
@Override
public
boolean
preHandle
(
HttpServletRequest
request
,
HttpServletResponse
response
,
Object
handler
)
throws
Exception
{
SecurityContext
context
=
SecurityContextHolder
.
getContext
();
Authentication
authentication
=
context
.
getAuthentication
();
User
user
=
(
User
)
authentication
.
getPrincipal
();
String
username
=
user
.
getUsername
();
AccountUserVO
account
=
mapper
.
selectUserByuserNameOrEmail
(
username
);
request
.
getSession
().
setAttribute
(
"account"
,
account
);
return
true
;
}
}
youbili-project-backend/src/main/java/cn/tedu/youbiliprojectbackend/securityConfig/WebConfiguration.java
0 → 100644
浏览文件 @
2ac385be
package
cn.tedu.youbiliprojectbackend.securityConfig
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.context.annotation.Configuration
;
import
org.springframework.web.servlet.config.annotation.InterceptorRegistry
;
import
org.springframework.web.servlet.config.annotation.WebMvcConfigurer
;
@Configuration
public
class
WebConfiguration
implements
WebMvcConfigurer
{
@Autowired
AuthorizeInterceptor
interceptor
;
@Override
public
void
addInterceptors
(
InterceptorRegistry
registry
)
{
registry
.
addInterceptor
(
interceptor
)
.
addPathPatterns
(
"/**"
)
.
excludePathPatterns
(
"/api/auth/**"
);
}
}
youbili-project-backend/src/main/java/cn/tedu/youbiliprojectbackend/service/impl/AuthorizeServiceImpl.java
浏览文件 @
2ac385be
...
@@ -83,7 +83,6 @@ public class AuthorizeServiceImpl implements AuthorizeService {
...
@@ -83,7 +83,6 @@ public class AuthorizeServiceImpl implements AuthorizeService {
return
User
return
User
.
withUsername
(
account
.
getUserName
())
.
withUsername
(
account
.
getUserName
())
.
password
(
account
.
getPassword
())
.
password
(
account
.
getPassword
())
.
authorities
(
String
.
valueOf
(
account
.
getUserID
()))
.
roles
(
"user"
)
.
roles
(
"user"
)
.
build
();
.
build
();
...
@@ -118,6 +117,7 @@ public class AuthorizeServiceImpl implements AuthorizeService {
...
@@ -118,6 +117,7 @@ public class AuthorizeServiceImpl implements AuthorizeService {
System
.
err
.
println
(
"sendVaildateEmail : "
+
key
);
System
.
err
.
println
(
"sendVaildateEmail : "
+
key
);
System
.
err
.
println
(
"email = "
+
email
+
", sessionId = "
+
sessionId
);
System
.
err
.
println
(
"email = "
+
email
+
", sessionId = "
+
sessionId
);
if
(
Boolean
.
TRUE
.
equals
(
template
.
hasKey
(
key
)))
{
//判断这个hasKey是否存在
if
(
Boolean
.
TRUE
.
equals
(
template
.
hasKey
(
key
)))
{
//判断这个hasKey是否存在
Long
expire
=
Optional
.
ofNullable
(
template
.
getExpire
(
key
,
TimeUnit
.
SECONDS
)).
orElse
(
0L
);
//获取key的过期时间,单位是秒,如果没有过期时间,返回0
Long
expire
=
Optional
.
ofNullable
(
template
.
getExpire
(
key
,
TimeUnit
.
SECONDS
)).
orElse
(
0L
);
//获取key的过期时间,单位是秒,如果没有过期时间,返回0
System
.
out
.
println
(
expire
);
System
.
out
.
println
(
expire
);
...
...
youbili-project-backend/src/main/resources/mapper/UserMapper.xml
浏览文件 @
2ac385be
...
@@ -28,4 +28,9 @@
...
@@ -28,4 +28,9 @@
WHERE Username = #{text}
WHERE Username = #{text}
OR Email = #{text}
OR Email = #{text}
</select>
</select>
<select
id=
"selectUserByuserNameOrEmail"
resultType=
"cn.tedu.youbiliprojectbackend.pojo.vo.AccountUserVO"
>
SELECT UserID, Username, Nickname,Email,AccountLevel,Fans,Follows,VideoCount,TotalLikes
FROM users
WHERE Username=#{text} OR Email=#{text}
</select>
</mapper>
</mapper>
\ No newline at end of file
youbili-project-backend/src/test/java/cn/tedu/youbiliprojectbackend/YoubiliProjectBackendApplicationTests.java
浏览文件 @
2ac385be
package
cn.tedu.youbiliprojectbackend
;
package
cn.tedu.youbiliprojectbackend
;
import
cn.tedu.youbiliprojectbackend.mapper.UserMapper
;
import
org.junit.jupiter.api.Test
;
import
org.junit.jupiter.api.Test
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.boot.test.context.SpringBootTest
;
import
org.springframework.boot.test.context.SpringBootTest
;
import
org.springframework.security.core.annotation.AuthenticationPrincipal
;
import
org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder
;
import
org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder
;
@SpringBootTest
@SpringBootTest
...
@@ -13,4 +16,12 @@ class YoubiliProjectBackendApplicationTests {
...
@@ -13,4 +16,12 @@ class YoubiliProjectBackendApplicationTests {
System
.
out
.
println
(
encoder
.
encode
(
"1234567"
));
System
.
out
.
println
(
encoder
.
encode
(
"1234567"
));
}
}
@Autowired
UserMapper
mapper
;
@Test
void
TestMapper
(){
System
.
out
.
println
(
mapper
.
selectUserByuserNameOrEmail
(
"张三"
));
}
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录