-
-
@@ -24,7 +21,7 @@
- 这只是个占位符文本,不知道为什么没有这段话整个布局就会乱成一坨,我还在研究怎么让它表现得正常一点,这个组件库的文档太抽象了,看不懂,唉。
+ 新注册的账号默认是学生身份,老师请联系管理员提权。
@@ -87,7 +84,7 @@ const register = async (userId: string, password: string) => {
let ex = e as AxiosError;
if (ex.response?.data) {
return ex.response?.data as RegisterResponse;
- } {
+ } else {
return { error: ex.message };
}
}
diff --git a/ui/src/components/users/Repasswd2Dialog.vue b/ui/src/components/users/Repasswd2Dialog.vue
index 7d5689c..0a407bd 100644
--- a/ui/src/components/users/Repasswd2Dialog.vue
+++ b/ui/src/components/users/Repasswd2Dialog.vue
@@ -72,7 +72,7 @@ const requestRepasswd = async () => {
let ex = e as AxiosError;
if (ex.response?.data) {
return ex.response?.data as RepasswdResponse;
- } {
+ } else {
return { error: ex.message };
}
}
diff --git a/ui/src/components/users/RepasswdDialog.vue b/ui/src/components/users/RepasswdDialog.vue
index 89fed57..7906c1f 100644
--- a/ui/src/components/users/RepasswdDialog.vue
+++ b/ui/src/components/users/RepasswdDialog.vue
@@ -78,7 +78,7 @@ const requestRepasswd = async () => {
let ex = e as AxiosError;
if (ex.response?.data) {
return ex.response?.data as RepasswdResponse;
- } {
+ } else {
return { error: ex.message };
}
}
diff --git a/ui/src/components/users/UserPanel.vue b/ui/src/components/users/UserPanel.vue
index ac66a93..73a00fe 100644
--- a/ui/src/components/users/UserPanel.vue
+++ b/ui/src/components/users/UserPanel.vue
@@ -1,5 +1,5 @@
-
+
@@ -21,11 +21,10 @@
删除账号
-
-
-
-
-
+
+
+ 修改学生账号的密码
+
@@ -36,6 +35,7 @@
+
@@ -46,6 +46,7 @@ import { jwtDecode, type JwtPayload } from 'jwt-decode';
import axios, { AxiosError } from 'axios';
import DeleteAccountDialog from './DeleteAccountDialog.vue';
import RepasswdDialog from './RepasswdDialog.vue';
+import Repasswd2Dialog from './Repasswd2Dialog.vue';
const dialogShow = ref(false);
const dialogTitle = ref('');
@@ -55,6 +56,7 @@ const dialogClose = ref(() => { });
const dialogDeleteAccountShow = ref(false);
const dialogRepasswdShow = ref(false);
+const dialogRepasswd2Show = ref(false);
const dialog = (title: string, text: string) => {
dialogTitle.value = title;
diff --git a/ui/src/router/index.ts b/ui/src/router/index.ts
index 382d6d0..9664531 100644
--- a/ui/src/router/index.ts
+++ b/ui/src/router/index.ts
@@ -5,22 +5,50 @@
*/
// Composables
+import Admin from '@/components/Admin.vue'
import Auth from '@/components/Auth.vue'
-import HelloWorld from '@/components/HelloWorld.vue'
-import HelloWorld2 from '@/components/HelloWorld2.vue'
-import Login from '@/components/RegisterForm.vue'
+import Study from '@/components/Study.vue'
+import Homepage from '@/components/Homepage.vue'
import { createRouter, createWebHistory } from 'vue-router'
+import RecordList from '@/components/RecordList.vue'
+import ProblemList from '@/components/study/ProblemList.vue'
+import SetList from '@/components/study/SetList.vue'
const routes = [
{
path: '/',
name: 'home',
- component: HelloWorld
+ component: Homepage
},
{
path: '/auth',
- name: 'home2',
+ name: 'auth',
component: Auth
+ },
+ {
+ path: '/admin',
+ name: 'admin',
+ component: Admin
+ },
+ {
+ path: '/study',
+ name: 'study',
+ component: Study
+ },
+ {
+ path: '/problems',
+ name: 'problems',
+ component: ProblemList
+ },
+ {
+ path: '/sets',
+ name: 'sets',
+ component: SetList
+ },
+ {
+ path: '/records',
+ name: 'sub',
+ component: RecordList
}
]
diff --git a/ui/src/store/auth.ts b/ui/src/store/auth.ts
index 5e4e3c4..a1d5e23 100644
--- a/ui/src/store/auth.ts
+++ b/ui/src/store/auth.ts
@@ -1,20 +1,37 @@
+import axios from "axios";
import { defineStore } from "pinia";
export const useAuthStore = defineStore("auth", {
state: () => ({
token: localStorage.getItem('token') || '',
+ adminToken: sessionStorage.getItem('adminToken') || ''
}),
actions: {
setToken(token: string) {
this.token = token;
localStorage.setItem('token', token);
},
- clearToken() {
+ async clearToken() {
+ try {
+ const formData = new FormData;
+ formData.append("token", this.token);
+ await axios.post('/api/auth/logout', formData);
+ } catch (e) {
+ }
this.token = '';
localStorage.removeItem('token');
},
+ setAdminToken(token: string) {
+ this.adminToken = token;
+ sessionStorage.setItem('adminToken', token);
+ },
+ clearAdminToken() {
+ this.adminToken = '';
+ sessionStorage.removeItem('adminToken');
+ }
},
getters: {
isAuthenticated: (state) => !!state.token,
+ isAdmin: (state) => !!state.adminToken,
},
});
diff --git a/ui/vite.config.mts b/ui/vite.config.mts
index 59424d7..19cbef7 100644
--- a/ui/vite.config.mts
+++ b/ui/vite.config.mts
@@ -50,6 +50,12 @@ export default defineConfig({
},
server: {
port: 3000,
+ proxy: {
+ '/api': {
+ target: 'http://localhost:8081',
+ changeOrigin: true
+ }
+ }
},
css: {
preprocessorOptions: {
diff --git a/xmake.lua b/xmake.lua
index b0df0f7..c6c12b6 100644
--- a/xmake.lua
+++ b/xmake.lua
@@ -4,7 +4,7 @@ add_rules("plugin.compile_commands.autoupdate")
set_warnings("all")
set_warnings("error")
-add_requires("civetweb", "cjson", "leveldb", "jwt-cpp", "cryptopp")
+add_requires("civetweb", "cjson", "leveldb", "jwt-cpp", "cryptopp", "nlohmann_json")
local npm = "npm"
if is_host("windows") then
@@ -28,7 +28,7 @@ target("hash")
target("db")
set_languages("c++23")
set_kind("static")
- add_packages("leveldb")
+ add_packages("leveldb", "nlohmann_json")
add_deps("hash")
add_includedirs("include/db", "include")
add_files("src/db/**.cpp")