From 02d95633674f0f3d34d626bd73b3ddb37aa44367 Mon Sep 17 00:00:00 2001 From: vapao Date: Fri, 18 Feb 2022 15:37:52 +0800 Subject: [PATCH] =?UTF-8?q?A=20=E5=BE=AE=E4=BF=A1token=E6=99=AE=E9=80=9A?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E5=8F=AF=E4=BB=A5=E9=80=9A=E8=BF=87=E4=B8=AA?= =?UTF-8?q?=E4=BA=BA=E4=B8=AD=E5=BF=83=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- spug_api/apps/account/views.py | 19 ++++-- spug_api/libs/parser.py | 13 ++--- spug_web/src/pages/welcome/info/Basic.js | 48 ++++++++++----- spug_web/src/pages/welcome/info/Reset.js | 6 +- spug_web/src/pages/welcome/info/index.js | 58 ++++++++----------- .../src/pages/welcome/info/index.module.css | 2 +- spug_web/src/pages/welcome/info/store.js | 18 ++++++ 7 files changed, 100 insertions(+), 64 deletions(-) create mode 100644 spug_web/src/pages/welcome/info/store.js diff --git a/spug_api/apps/account/views.py b/spug_api/apps/account/views.py index 4d0515e..e32de5b 100644 --- a/spug_api/apps/account/views.py +++ b/spug_api/apps/account/views.py @@ -142,14 +142,20 @@ class RoleView(AdminView): class SelfView(View): + def get(self, request): + data = request.user.to_dict(selects=('nickname', 'wx_token')) + return json_response(data) + def patch(self, request): form, error = JsonParser( Argument('old_password', required=False), Argument('new_password', required=False), - Argument('nickname', required=False), - ).parse(request.body, True) + Argument('nickname', required=False, help='请输入昵称'), + Argument('wx_token', required=False), + ).parse(request.body) if error is None: - if form.get('old_password') and form.get('new_password'): + print(form) + if form.old_password and form.new_password: if request.user.type == 'ldap': return json_response(error='LDAP账户无法修改密码') if len(form.new_password) < 6: @@ -158,11 +164,14 @@ class SelfView(View): request.user.password_hash = User.make_password(form.new_password) request.user.token_expired = 0 request.user.save() + return json_response() else: return json_response(error='原密码错误,请重新输入') - if form.get('nickname'): + if form.nickname is not None: request.user.nickname = form.nickname - request.user.save() + if form.wx_token is not None: + request.user.wx_token = form.wx_token + request.user.save() return json_response(error=error) diff --git a/spug_api/libs/parser.py b/spug_api/libs/parser.py index 70b6c80..f7c0ad5 100644 --- a/spug_api/libs/parser.py +++ b/spug_api/libs/parser.py @@ -20,13 +20,11 @@ class Argument(object): :param bool required: is required """ - def __init__(self, name, default=None, handler=None, required=True, type=str, filter=None, help=None, - nullable=False): + def __init__(self, name, default=None, handler=None, required=True, type=str, filter=None, help=None): self.name = name self.default = default self.type = type self.required = required - self.nullable = nullable self.filter = filter self.help = help self.handler = handler @@ -45,11 +43,12 @@ class Argument(object): elif value in [u'', '', None]: if self.default is not None: return self.default - elif not self.nullable and self.required: - raise ParseError( - self.help or 'Value Error: %s must not be null' % self.name) + elif self.required: + raise ParseError(self.help or 'Value Error: %s must not be null' % self.name) + elif self.help: + raise ParseError(self.help) else: - return None + return value try: if self.type: if self.type in (list, dict) and isinstance(value, str): diff --git a/spug_web/src/pages/welcome/info/Basic.js b/spug_web/src/pages/welcome/info/Basic.js index f24009b..8fbfbda 100644 --- a/spug_web/src/pages/welcome/info/Basic.js +++ b/spug_web/src/pages/welcome/info/Basic.js @@ -3,37 +3,55 @@ * Copyright (c) * Released under the AGPL-3.0 License. */ -import React, { useState } from 'react'; -import { Button, Form, Input, message } from 'antd'; +import React, { useState, useEffect } from 'react'; +import { observer } from 'mobx-react'; +import { Button, Form, Input, Spin, message } from 'antd'; import styles from './index.module.css'; import { http } from 'libs'; +import store from './store'; -export default function Basic(props) { - const [nickname, setNickname] = useState(localStorage.getItem('nickname')); - const [loading, setLoading] = useState(false); +export default observer(function Basic(props) { + const [form] = Form.useForm() + const [fetching, setFetching] = useState(false) + const [loading, setLoading] = useState(false) + + useEffect(() => { + if (!store.user.nickname) { + setFetching(true) + store.fetchUser() + .then(() => form.setFieldsValue(store.user)) + .finally(() => setFetching(false)) + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []) function handleSubmit() { setLoading(true); - http.patch('/api/account/self/', {nickname}) + const formData = form.getFieldsValue(); + http.patch('/api/account/self/', formData) .then(() => { - message.success('设置成功,重新登录或刷新页面后生效'); - localStorage.setItem('nickname', nickname) + message.success('保存成功,昵称将在重新登录或刷新页面后生效'); + localStorage.setItem('nickname', formData.nickname); + store.fetchUser() }) - .finally(() =>setLoading(false)) + .finally(() => setLoading(false)) } return ( - +
基本设置
-
- - setNickname(e.target.value)}/> + + + + + 什么是微信Token?}> + -
+ ) -} +}) diff --git a/spug_web/src/pages/welcome/info/Reset.js b/spug_web/src/pages/welcome/info/Reset.js index 6325bad..2d66ded 100644 --- a/spug_web/src/pages/welcome/info/Reset.js +++ b/spug_web/src/pages/welcome/info/Reset.js @@ -38,13 +38,13 @@ export default function Reset(props) {
修改密码
- + setOldPassword(e.target.value)}/> - + setNewPassword(e.target.value)}/> - + setNew2Password(e.target.value)}/> diff --git a/spug_web/src/pages/welcome/info/index.js b/spug_web/src/pages/welcome/info/index.js index f6af9d4..a51fec7 100644 --- a/spug_web/src/pages/welcome/info/index.js +++ b/spug_web/src/pages/welcome/info/index.js @@ -3,48 +3,40 @@ * Copyright (c) * Released under the AGPL-3.0 License. */ -import React from 'react'; +import React, { useState } from 'react'; import { Menu } from 'antd'; import { Breadcrumb } from 'components'; import Basic from './Basic'; import Reset from './Reset'; import styles from './index.module.css'; -class Index extends React.Component { - constructor(props) { - super(props); - this.state = { - selectedKeys: ['basic'] - } - } +function Index() { + const [selectedKeys, setSelectedKeys] = useState(['basic']) - render() { - const {selectedKeys} = this.state; - return ( -
- - 首页 - 个人中心 - -
-
- this.setState({selectedKeys})}> - 基本设置 - 修改密码 - -
-
- {selectedKeys[0] === 'basic' && } - {selectedKeys[0] === 'reset' && } -
+ return ( +
+ + 首页 + 个人中心 + +
+
+ setSelectedKeys(selectedKeys)}> + 基本设置 + 修改密码 + +
+
+ {selectedKeys[0] === 'basic' && } + {selectedKeys[0] === 'reset' && }
- ) - } +
+ ) } export default Index diff --git a/spug_web/src/pages/welcome/info/index.module.css b/spug_web/src/pages/welcome/info/index.module.css index 0f0a127..b1403bb 100644 --- a/spug_web/src/pages/welcome/info/index.module.css +++ b/spug_web/src/pages/welcome/info/index.module.css @@ -13,7 +13,7 @@ } .title { - margin-bottom: 12px; + margin-bottom: 24px; color: rgba(0, 0, 0, .85); font-weight: 500; font-size: 20px; diff --git a/spug_web/src/pages/welcome/info/store.js b/spug_web/src/pages/welcome/info/store.js new file mode 100644 index 0000000..466a2e0 --- /dev/null +++ b/spug_web/src/pages/welcome/info/store.js @@ -0,0 +1,18 @@ +/** + * Copyright (c) OpenSpug Organization. https://github.com/openspug/spug + * Copyright (c) + * Released under the AGPL-3.0 License. + */ +import { observable } from 'mobx'; +import http from 'libs/http'; + +class Store { + @observable user = {}; + + fetchUser = () => { + return http.get('/api/account/self/') + .then(res => this.user = res) + } +} + +export default new Store()