From a00b9e40484894970796568e031f4786149ad31d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BA=90=E6=96=87=E9=9B=A8?= <41315874+fumiama@users.noreply.github.com> Date: Sat, 18 Mar 2023 15:38:28 +0800 Subject: [PATCH] add /api/getUsersCount --- backend/api/main.go | 94 +++++++++++-------- backend/api/user.go | 8 ++ backend/global/user.go | 9 +- frontend/vben/src/api/sys/user.ts | 16 +++- frontend/vben/src/enums/pageEnum.ts | 2 + .../src/locales/lang/zh-CN/routes/settings.ts | 1 + .../src/router/routes/modules/settings.ts | 10 ++ frontend/vben/src/store/modules/permission.ts | 6 +- .../workbench/components/WorkbenchHeader.vue | 11 ++- .../src/views/page/settings/SecureSetting.vue | 13 ++- .../src/views/page/settings/contact/index.vue | 45 +++++++++ .../views/page/settings/contact/pwd.data.ts | 46 +++++++++ .../views/page/settings/password/index.vue | 45 +++++++++ .../views/page/settings/password/pwd.data.ts | 46 +++++++++ 14 files changed, 299 insertions(+), 53 deletions(-) create mode 100644 frontend/vben/src/views/page/settings/contact/index.vue create mode 100644 frontend/vben/src/views/page/settings/contact/pwd.data.ts create mode 100644 frontend/vben/src/views/page/settings/password/index.vue create mode 100644 frontend/vben/src/views/page/settings/password/pwd.data.ts diff --git a/backend/api/main.go b/backend/api/main.go index 3333c1b..ecc50b7 100644 --- a/backend/api/main.go +++ b/backend/api/main.go @@ -7,15 +7,22 @@ import ( "github.com/fumiama/paper-manager/backend/utils" ) -// Handler serves all backend /api call -func Handler(w http.ResponseWriter, r *http.Request) { - if r.URL.Path[0] != '/' { - r.URL.Path = "/" + r.URL.Path +type apihandler struct { + md string + do func(w http.ResponseWriter, r *http.Request) +} + +func (h *apihandler) handle(w http.ResponseWriter, r *http.Request) { + if !utils.IsMethod(h.md, w, r) { + return } - if r.URL.Path == "/api/getLoginSalt" { - if !utils.IsMethod("GET", w, r) { - return - } + h.do(w, r) +} + +var apimap = make(map[string]*apihandler, 512) + +func init() { + apimap["/api/getLoginSalt"] = &apihandler{"GET", func(w http.ResponseWriter, r *http.Request) { username := r.URL.Query().Get("username") if username == "" { writeresult(w, codeError, nil, "empty username", typeError) @@ -27,59 +34,68 @@ func Handler(w http.ResponseWriter, r *http.Request) { return } writeresult(w, codeSuccess, salt, messageOk, typeSuccess) - return - } - if r.URL.Path == "/api/login" { - if !utils.IsMethod("POST", w, r) { - return + }} + + apimap["/api/login"] = &apihandler{"POST", func(w http.ResponseWriter, r *http.Request) { + type loginbody struct { + Username string `json:"username"` + Password string `json:"password"` } - defer r.Body.Close() var body loginbody + defer r.Body.Close() err := json.NewDecoder(r.Body).Decode(&body) if err != nil { writeresult(w, codeError, nil, err.Error(), typeError) return } - r, err := login(body.Username, body.Password) + ret, err := login(body.Username, body.Password) if err != nil { writeresult(w, codeError, nil, err.Error(), typeError) return } - writeresult(w, codeSuccess, r, messageOk, typeSuccess) - return - } - if r.URL.Path == "/api/getUserInfo" { - if !utils.IsMethod("GET", w, r) { - return - } + writeresult(w, codeSuccess, ret, messageOk, typeSuccess) + }} + + apimap["/api/getUserInfo"] = &apihandler{"GET", func(w http.ResponseWriter, r *http.Request) { token := r.Header.Get("Authorization") - r, err := getUserInfo(token) + ret, err := getUserInfo(token) if err != nil { writeresult(w, codeError, nil, err.Error(), typeError) return } - writeresult(w, codeSuccess, r, messageOk, typeSuccess) - return - } - if r.URL.Path == "/api/logout" { - if !utils.IsMethod("GET", w, r) { - return - } + writeresult(w, codeSuccess, ret, messageOk, typeSuccess) + }} + + apimap["/api/logout"] = &apihandler{"GET", func(w http.ResponseWriter, r *http.Request) { err := logout(r.Header.Get("Authorization")) if err != nil { writeresult(w, codeError, nil, err.Error(), typeError) return } writeresult(w, codeSuccess, nil, messageOk, typeSuccess) - return - } - if !utils.IsMethod("GET", w, r) { - return - } - http.Error(w, "404 Not Found", http.StatusNotFound) + }} + + apimap["/api/getUsersCount"] = &apihandler{"GET", func(w http.ResponseWriter, r *http.Request) { + token := r.Header.Get("Authorization") + n, err := getUsersCount(token) + if err != nil { + writeresult(w, codeError, nil, err.Error(), typeError) + return + } + writeresult(w, codeSuccess, n, messageOk, typeSuccess) + }} } -type loginbody struct { - Username string `json:"username"` - Password string `json:"password"` +// Handler serves all backend /api call +func Handler(w http.ResponseWriter, r *http.Request) { + if r.URL.Path[0] != '/' { + r.URL.Path = "/" + r.URL.Path + } + + if h, ok := apimap[r.URL.Path]; ok { + h.handle(w, r) + return + } + + http.Error(w, "404 Not Found", http.StatusNotFound) } diff --git a/backend/api/user.go b/backend/api/user.go index 1b798e9..e57fd31 100644 --- a/backend/api/user.go +++ b/backend/api/user.go @@ -72,3 +72,11 @@ func logout(token string) error { usertokens.Delete(token) return nil } + +func getUsersCount(token string) (int, error) { + user := usertokens.Get(token) + if user == nil { + return 0, errInvalidToken + } + return global.UserDB.GetUsersCount() +} diff --git a/backend/global/user.go b/backend/global/user.go index 5a64ac7..f0bdd67 100644 --- a/backend/global/user.go +++ b/backend/global/user.go @@ -87,7 +87,7 @@ func init() { Nick: "源文雨", Avtr: "https://q1.qlogo.cn/g?b=qq&nk=1332524221&s=640", Cont: "028-61830156", - Desc: "日は山の端にかかりぬ", + Desc: "天何所沓,十二焉分。日月安属,列星安陈。", }, "系统") logrus.Warn("[user] 初次启动, 创建初始账户 fumiama 密码 123456") } @@ -270,6 +270,13 @@ func (u *UserDatabase) GetUsers() (users []User, err error) { return } +// GetUsersCount ... +func (u *UserDatabase) GetUsersCount() (int, error) { + u.mu.RLock() + defer u.mu.RUnlock() + return u.db.Count(UserTableUser) +} + func (u *UserDatabase) GetSuperIDs() (ids []int, err error) { var user User ids = make([]int, 0, 16) diff --git a/frontend/vben/src/api/sys/user.ts b/frontend/vben/src/api/sys/user.ts index 2e6c0cf..d266f79 100644 --- a/frontend/vben/src/api/sys/user.ts +++ b/frontend/vben/src/api/sys/user.ts @@ -19,6 +19,7 @@ enum Api { ResetPassword = '/resetPassword', Register = '/register', GetUserInfo = '/getUserInfo', + GetUsersCount = '/getUsersCount', GetPermCode = '/getPermCode', TestRetry = '/testRetry', } @@ -82,15 +83,22 @@ export function getUserInfo() { return defHttp.get({ url: Api.GetUserInfo }, { errorMessageMode: 'none' }) } -export function getPermCode() { - return defHttp.get({ url: Api.GetPermCode }) +/** + * @description: getUsersCount + */ +export function getUsersCount() { + return defHttp.get({ url: Api.GetUsersCount }, { errorMessageMode: 'none' }) } +/*export function getPermCode() { + return defHttp.get({ url: Api.GetPermCode }) +}*/ + export function doLogout() { return defHttp.get({ url: Api.Logout }) } -export function testRetry() { +/*export function testRetry() { return defHttp.get( { url: Api.TestRetry }, { @@ -101,4 +109,4 @@ export function testRetry() { }, }, ) -} +}*/ diff --git a/frontend/vben/src/enums/pageEnum.ts b/frontend/vben/src/enums/pageEnum.ts index f8ce445..49470de 100644 --- a/frontend/vben/src/enums/pageEnum.ts +++ b/frontend/vben/src/enums/pageEnum.ts @@ -7,6 +7,8 @@ export enum PageEnum { PAGE_FILELIST = '/filelist', // personal settings path PAGE_SETTINGS = '/settings', + // password settings path + PAGE_PASSWORD_SETTINGS = '/settings/password', // error page path ERROR_PAGE = '/exception', // error log page path diff --git a/frontend/vben/src/locales/lang/zh-CN/routes/settings.ts b/frontend/vben/src/locales/lang/zh-CN/routes/settings.ts index bdf63e6..432cd08 100644 --- a/frontend/vben/src/locales/lang/zh-CN/routes/settings.ts +++ b/frontend/vben/src/locales/lang/zh-CN/routes/settings.ts @@ -1,3 +1,4 @@ export default { name: '个人设置', + password: '修改密码', } diff --git a/frontend/vben/src/router/routes/modules/settings.ts b/frontend/vben/src/router/routes/modules/settings.ts index e9d3556..f4e5dba 100644 --- a/frontend/vben/src/router/routes/modules/settings.ts +++ b/frontend/vben/src/router/routes/modules/settings.ts @@ -25,6 +25,16 @@ const settings: AppRouteModule = { hideMenu: true, }, }, + { + path: 'password', + name: 'PasswordSettingsPage', + component: () => import('/@/views/page/settings/password/index.vue'), + meta: { + title: t('routes.settings.password'), + icon: 'ion:settings-outline', + hideMenu: true, + }, + }, ], } diff --git a/frontend/vben/src/store/modules/permission.ts b/frontend/vben/src/store/modules/permission.ts index 9542522..0d7517f 100644 --- a/frontend/vben/src/store/modules/permission.ts +++ b/frontend/vben/src/store/modules/permission.ts @@ -19,7 +19,7 @@ import { PAGE_NOT_FOUND_ROUTE } from '/@/router/routes/basic' import { filter } from '/@/utils/helper/treeHelper' import { getMenuList } from '/@/api/sys/menu' -import { getPermCode } from '/@/api/sys/user' +// import { getPermCode } from '/@/api/sys/user' import { useMessage } from '/@/hooks/web/useMessage' import { PageEnum } from '/@/enums/pageEnum' @@ -104,8 +104,8 @@ export const usePermissionStore = defineStore({ this.lastBuildMenuTime = 0 }, async changePermissionCode() { - const codeList = await getPermCode() - this.setPermCodeList(codeList) + // const codeList = await getPermCode() + // this.setPermCodeList(codeList) }, // 构建路由 diff --git a/frontend/vben/src/views/dashboard/workbench/components/WorkbenchHeader.vue b/frontend/vben/src/views/dashboard/workbench/components/WorkbenchHeader.vue index 6c7caa2..5854550 100644 --- a/frontend/vben/src/views/dashboard/workbench/components/WorkbenchHeader.vue +++ b/frontend/vben/src/views/dashboard/workbench/components/WorkbenchHeader.vue @@ -12,22 +12,27 @@ })() }}安, {{ userinfo.realName }}, 要注意劳逸结合哦! - 今日共有1人上线 + {{ userinfo.desc }}
课程组人数 - 300 + {{ userscount }}
diff --git a/frontend/vben/src/views/page/settings/SecureSetting.vue b/frontend/vben/src/views/page/settings/SecureSetting.vue index fba20dd..5176f4f 100644 --- a/frontend/vben/src/views/page/settings/SecureSetting.vue +++ b/frontend/vben/src/views/page/settings/SecureSetting.vue @@ -6,7 +6,7 @@ @@ -24,12 +24,16 @@ import { defineComponent } from 'vue' import { CollapseContainer } from '/@/components/Container/index' import { useUserStore } from '/@/store/modules/user' + import { PageEnum } from '/@/enums/pageEnum' + import { useGo } from '/@/hooks/web/usePage' export default defineComponent({ components: { CollapseContainer, List, ListItem: List.Item, ListItemMeta: List.Item.Meta }, setup() { const userStore = useUserStore() const { last, contact } = userStore.getUserInfo + const go = useGo() + return { list: [ { @@ -37,11 +41,14 @@ title: '账户密码', description: '上次修改密码: ' + last, extra: '修改', + click: () => { + go(PageEnum.PAGE_PASSWORD_SETTINGS) + }, }, { key: '2', - title: '我的手机', - description: '已绑定手机: ' + contact, + title: '联系方式', + description: '已记录的联系方式: ' + contact, extra: '修改', }, ], diff --git a/frontend/vben/src/views/page/settings/contact/index.vue b/frontend/vben/src/views/page/settings/contact/index.vue new file mode 100644 index 0000000..301c8ad --- /dev/null +++ b/frontend/vben/src/views/page/settings/contact/index.vue @@ -0,0 +1,45 @@ + + diff --git a/frontend/vben/src/views/page/settings/contact/pwd.data.ts b/frontend/vben/src/views/page/settings/contact/pwd.data.ts new file mode 100644 index 0000000..fba4f44 --- /dev/null +++ b/frontend/vben/src/views/page/settings/contact/pwd.data.ts @@ -0,0 +1,46 @@ +import { FormSchema } from '/@/components/Form' + +export const formSchema: FormSchema[] = [ + { + field: 'passwordOld', + label: '当前密码', + component: 'InputPassword', + required: true, + }, + { + field: 'passwordNew', + label: '新密码', + component: 'StrengthMeter', + componentProps: { + placeholder: '新密码', + }, + rules: [ + { + required: true, + message: '请输入新密码', + }, + ], + }, + { + field: 'confirmPassword', + label: '确认密码', + component: 'InputPassword', + + dynamicRules: ({ values }) => { + return [ + { + required: true, + validator: (_, value) => { + if (!value) { + return Promise.reject('密码不能为空') + } + if (value !== values.passwordNew) { + return Promise.reject('两次输入的密码不一致!') + } + return Promise.resolve() + }, + }, + ] + }, + }, +] diff --git a/frontend/vben/src/views/page/settings/password/index.vue b/frontend/vben/src/views/page/settings/password/index.vue new file mode 100644 index 0000000..7103591 --- /dev/null +++ b/frontend/vben/src/views/page/settings/password/index.vue @@ -0,0 +1,45 @@ + + diff --git a/frontend/vben/src/views/page/settings/password/pwd.data.ts b/frontend/vben/src/views/page/settings/password/pwd.data.ts new file mode 100644 index 0000000..fba4f44 --- /dev/null +++ b/frontend/vben/src/views/page/settings/password/pwd.data.ts @@ -0,0 +1,46 @@ +import { FormSchema } from '/@/components/Form' + +export const formSchema: FormSchema[] = [ + { + field: 'passwordOld', + label: '当前密码', + component: 'InputPassword', + required: true, + }, + { + field: 'passwordNew', + label: '新密码', + component: 'StrengthMeter', + componentProps: { + placeholder: '新密码', + }, + rules: [ + { + required: true, + message: '请输入新密码', + }, + ], + }, + { + field: 'confirmPassword', + label: '确认密码', + component: 'InputPassword', + + dynamicRules: ({ values }) => { + return [ + { + required: true, + validator: (_, value) => { + if (!value) { + return Promise.reject('密码不能为空') + } + if (value !== values.passwordNew) { + return Promise.reject('两次输入的密码不一致!') + } + return Promise.resolve() + }, + }, + ] + }, + }, +]