From 32b097c5b7e54a7afe55b2952ee6b6cc5c90122b Mon Sep 17 00:00:00 2001 From: Jimmy Liow Date: Wed, 19 Jun 2024 15:38:11 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E8=A7=92=E8=89=B2?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E7=95=8C=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/价格管理平台.bmpr | Bin 272384 -> 272384 bytes src/main.jsx | 4 +- src/stores/Account.js | 16 ++ src/views/App.jsx | 3 +- src/views/account/Management.jsx | 111 +++--------- src/views/account/RoleList.jsx | 286 +++++++++++++++++++++++++++++++ 6 files changed, 327 insertions(+), 93 deletions(-) create mode 100644 src/views/account/RoleList.jsx diff --git a/doc/价格管理平台.bmpr b/doc/价格管理平台.bmpr index a33839a8211b67d4c152a12ac5c7b00e9d030095..e1065f737e4b4c4b23473125fbab526ac344148e 100644 GIT binary patch delta 30669 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 q3;ic&KKgKx|KyC^z6<>)XNLYg`t73r$=NOD?M{ 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, { path: "account/profile", element: }, { path: "account/management", element: }, + { path: "account/role-list", element: }, { path: "reservation/newest", element: }, { path: "reservation/:reservationId", element: }, { path: "feedback", element: }, diff --git a/src/stores/Account.js b/src/stores/Account.js index 6ab625f..a2391be 100644 --- a/src/stores/Account.js +++ b/src/stores/Account.js @@ -24,6 +24,13 @@ export const postAccountForm = async (formData) => { return errcode !== 0 ? {} : result } +export const postRoleForm = async (formData) => { + + const { errcode, result } = await postForm( + `${HT_HOST}/service-CooperateSOA/new_or_update_role`, formData) + return errcode !== 0 ? {} : result +} + export const fetchRoleList = async () => { const { errcode, result } = await fetchJSON( @@ -54,6 +61,15 @@ const useAccountStore = create((set, get) => ({ console.info(result) }, + saveOrUpdateRole: async (formValues) => { + const formData = new FormData() + formData.append('role_id', formValues.role_id) + formData.append('role_name', formValues.role_name) + formData.append('res_ids', '2,3') + + return postRoleForm(formData) + }, + saveOrUpdateAccount: async (formValues) => { const { selectedAccount } = get() const { userId } = usingStorage() diff --git a/src/views/App.jsx b/src/views/App.jsx index dd2dec6..779993c 100644 --- a/src/views/App.jsx +++ b/src/views/App.jsx @@ -149,8 +149,9 @@ function App() { { label: {t('ChangePassword')}, key: '0' }, { label: {t('Profile')}, key: '1' }, { label: {t('account:management.tile')}, key: '3' }, + { label: {t('account:management.roleList')}, key: '4' }, { type: 'divider' }, - { label: {t('Logout')}, key: '4' }, + { label: {t('Logout')}, key: '99' }, ], { type: 'divider' }, { label: <>v{BUILD_VERSION}, key: 'BUILD_VERSION' }, diff --git a/src/views/account/Management.jsx b/src/views/account/Management.jsx index e05eaa1..f0e7b9f 100644 --- a/src/views/account/Management.jsx +++ b/src/views/account/Management.jsx @@ -161,48 +161,32 @@ function Management() { setPermissionValue(newValue) } - const onAccountSeleted = async (account) => { - selectAccount(account) - console.info(account) - const roleList = await fetchRoleList() - setRoleAllList(roleList.map(r => { - return { - value: r.role_id, - label: r.role_name, - disabled: r.role_id === 1 - } - })) - setAccountModalOpen(true) - } - const [permissionValue, setPermissionValue] = useState(['0-0-0']) const [isAccountModalOpen, setAccountModalOpen] = useState(false) const [isRoleModalOpen, setRoleModalOpen] = useState(false) const [dataLoading, setDataLoading] = useState(false) const [roleAllList, setRoleAllList] = useState([]) - const [editAccountForm, editRoleForm] = Form.useForm() + const [accountForm] = Form.useForm() const [searchAccountByCriteria, accountList, disableAccount, selectedAccount, saveOrUpdateAccount, selectAccount] = useAccountStore((state) => [state.searchAccountByCriteria, state.accountList, state.disableAccount, state.selectedAccount, state.saveOrUpdateAccount, state.selectAccount]) const { notification, modal } = App.useApp() - const handleAccountOk = () => { - console.info('handleAccountOk') - console.info(editAccountForm) - } - - const handleAccountCancel = () => { - setAccountModalOpen(false) - } - - const handleRoleOk = () => { - console.info('handleRoleOk') - } - - const handleRoleCancel = () => { - setRoleModalOpen(false) + const onAccountSeleted = async (account) => { + accountForm.setFieldsValue(account) + selectAccount(account) + console.info(account) + const roleList = await fetchRoleList() + setRoleAllList(roleList.map(r => { + return { + value: r.role_id, + label: r.role_name, + disabled: r.role_id === 1 + } + })) + setAccountModalOpen(true) } const onAccountFinish = (values) => { @@ -219,7 +203,7 @@ function Management() { }) } - const onAccountFinishFailed = (error) => { + const onAccountFailed = (error) => { console.log('Failed:', error) // form.resetFields() } @@ -259,20 +243,20 @@ function Management() { htmlType: 'submit', }} title={t('account:management.newAccount')} - open={isAccountModalOpen} onOk={handleAccountOk} onCancel={handleAccountCancel} - destroyOnClose + open={isAccountModalOpen} onOk={() => setAccountModalOpen(false)} onCancel={() => setAccountModalOpen(false)} + destroyOnClose={true} + clearOnDestroy={true} modalRender={(dom) => (
{dom} @@ -341,58 +325,6 @@ function Management() { - {/* Role Edit */} - - - {t('account:management.newRole')} - - - - - - - -
{t('account:management.tile')} - - - diff --git a/src/views/account/RoleList.jsx b/src/views/account/RoleList.jsx new file mode 100644 index 0000000..923d43e --- /dev/null +++ b/src/views/account/RoleList.jsx @@ -0,0 +1,286 @@ +import { useState, useEffect } from 'react' +import { Row, Col, Space, Button, Table, Select, TreeSelect, Typography, Modal, App, Form, Input } from 'antd' +import { ExclamationCircleFilled } from '@ant-design/icons' +import { useTranslation } from 'react-i18next' +import useFormStore from '@/stores/Form' +import useAuthStore from '@/stores/Auth' +import useAccountStore from '@/stores/Account' +import { fetchRoleList } from '@/stores/Account' +import SearchForm from '@/components/SearchForm' +import RequireAuth from '@/components/RequireAuth' +import { PERM_ROLE_NEW } from '@/config' + +const { Title } = Typography + +const permissionData = [ + { + title: '海外供应商', + value: 'oversea-0', + key: 'oversea-0', + children: [ + { + title: '所有海外功能', + value: 'oversea-0-0', + key: 'oversea-0-0', + }, + ], + }, + { + title: '机票管理', + value: '0-0', + key: '0-0', + children: [ + { + title: '录入机票价格', + value: '0-0-0', + key: '0-0-0', + }, + ], + }, + { + title: '产品管理', + value: '0-1', + key: '0-1', + children: [ + { + title: '搜索供应商产品', + value: 'B-1-0', + key: 'B-1-0', + }, + { + title: '录入产品价格', + value: '0-1-0', + key: '0-1-0', + }, + { + title: '新增产品描述', + value: '0-1-1', + key: '0-1-1', + }, + { + title: '复制供应商产品信息', + value: '0-1-2', + key: '0-1-2', + }, + ], + }, + { + title: '账号管理', + value: '2-1', + key: '2-1', + children: [ + { + title: '搜索账号', + value: '2-1-01', + key: '2-1-01', + }, + { + title: '新增账号', + value: '2-1-11', + key: '2-1-11', + }, + { + title: '禁用账号', + value: '2-1-21', + key: '2-1-21', + }, + { + title: '重置账号密码', + value: '2-1-31', + key: '2-1-31', + }, + { + title: '新增角色', + value: '2-1-41', + key: '2-1-41', + }, + ], + }, +] + +function RoleList() { + const { t } = useTranslation() + + const roleListColumns = [ + { + title: t('account:rolename'), + dataIndex: 'role_name', + render: roleRender + }, + { + title: t('account:createdOn'), + dataIndex: 'created_on', + }, + { + title: t('account:action'), + dataIndex: 'account:action', + render: actionRender + }, + ] + + function roleRender(text, role) { + return ( + + ) + } + + function actionRender(text, account) { + return ( + + + + + ) + } + + const onPermissionChange = (newValue) => { + console.log('onChange ', newValue) + setPermissionValue(newValue) + } + + useEffect (() => { + fetchRoleList() + .then(r => { + setRoleAllList(r) + }) + }, []) + + const [permissionValue, setPermissionValue] = useState(['0-0-0']) + const [isRoleModalOpen, setRoleModalOpen] = useState(false) + const [dataLoading, setDataLoading] = useState(false) + const [roleAllList, setRoleAllList] = useState([]) + + const [roleForm] = Form.useForm() + const [saveOrUpdateRole] = + useAccountStore((state) => + [state.saveOrUpdateRole]) + + const { notification, modal } = App.useApp() + + const onRoleSeleted = async (role) => { + roleForm.setFieldsValue(role) + // selectAccount(account) + // console.info(account) + setRoleModalOpen(true) + } + + const onRoleFinish = (values) => { + console.log(values) + saveOrUpdateRole(values) + .catch(ex => { + console.info(ex.message) + notification.error({ + message: 'Notification', + description: ex.message, + placement: 'top', + duration: 4, + }) + }) + } + + const onRoleFailed = (error) => { + console.log('Failed:', error) + // form.resetFields() + } + + return ( + <> + setRoleModalOpen(false)} onCancel={() => setRoleModalOpen(false)} + destroyOnClose={true} + clearOnDestroy={true} + modalRender={(dom) => ( +
+ {dom} +
+ )} + > + + + + + + + + + +
+ + {t('account:management.roleList')} + + + + + + + + + + + + { return t('Total') + `:${total}` } + }} + onChange={(pagination) => { onSearchClick(pagination.current) }} + columns={roleListColumns} dataSource={roleAllList} + /> + + + + + ) +} + +export default RoleList