feat: 用户列表模块开发

develop
JINGYJ 1 year ago
parent 2aa5920b46
commit 4776df67e9

@ -1,4 +1,4 @@
# General-AI-Platform-Web
# Uighur-Recognition-Web
重点人群识别前端仓库 develop
### 生成代码调整

@ -1,11 +1,3 @@
/*
* @Author: zhoux zhouxia@supervision.ltd
* @Date: 2023-11-01 13:56:33
* @LastEditors: zhoux zhouxia@supervision.ltd
* @LastEditTime: 2023-11-30 17:10:05
* @FilePath: \general-ai-platform-web\config\defaultSettings.ts
* @Description: ,`customMade`, koroFileHeader : https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
import { ProLayoutProps } from '@ant-design/pro-components';
/**

@ -357,5 +357,11 @@ export default [
name: 'interfaceManage',
path: '/interfaceManage',
component: 'Setting/interfaceManage',
}
},
{
name: 'userList',
path: '/userList',
component: 'System/UserList',
access: 'canReadMenu',
},
];

@ -45,6 +45,16 @@ const getMenus = (req: Request, res: Response) => {
"component": "Hidden",
"title": "接口管理",
"routes": []
},
{
"path": "userList",
"key": "",
"name": "userList",
"icon": "UserOutlined",
"access": "",
"component": "Hidden",
"title": "用户列表",
"routes": []
}
]
},

@ -90,6 +90,16 @@ export async function getInitialState(): Promise<{
"component": "Hidden",
"title": "接口管理",
"routes": []
},
{
"path": "userList",
"key": "",
"name": "userList",
"icon": "UserOutlined",
"access": "",
"component": "Hidden",
"title": "用户列表",
"routes": []
}
]
},

@ -94,7 +94,9 @@ export const user: { [key: string]: string } = {
'system.user.table.list.deptId': '部门',
'system.user.table.list.enable': '是否启用',
'system.user.table.list.remark': '备注',
'system.user.table.list.createTime': '创建时间',
'system.user.table.list.create': '新建用户',
'system.user.table.list.editor': '编辑用户',
'system.user.table.list.update': '更新用户',
'system.user.table.rule.required.userName': '用户名为必填项',
'system.user.table.rule.required.nickName': '昵称为必填项',

@ -1,45 +1,40 @@
import {
ModalForm,
ProForm,
ProFormSwitch,
ProFormTreeSelect,
ProFormUploadButton
} from '@ant-design/pro-components';
import {ProFormText} from '@ant-design/pro-components';
import {ProFormSelect, ProFormDependency} from '@ant-design/pro-components';
import {FormattedMessage, useIntl} from '@umijs/max';
/**
*
*
*/
import { postBusinessImageCreateBusinessImage } from '@/services/resource/BusinessImage';
import { ModalForm, ProForm, ProFormText, ProFormTextArea } from '@ant-design/pro-components';
import { FormattedMessage, useIntl } from '@umijs/max';
import { Button, Form, message } from 'antd';
import { postUserList } from '@/services/system/User';
import { proFormSmallItemStyleProps, proFormSmallModelWidth } from '../../../../../config/defaultForm';
import React from 'react';
import {postUserAdminRegister} from '@/services/system/User';
import {postRoleGetRoleFkSelect} from "@/services/system/Role";
import {postDepartmentGetDepartmentFkSelect} from "@/services/system/Department";
import {postPostGetPostFkSelect} from "@/services/system/Post";
import {Form, message} from 'antd';
import {beforeUploadImage, handleOneFile} from "@/utils/common";
// @ts-ignore
import cookie from 'react-cookies';
// 表单宽度 804 两列
import { proFormItemStyleProps, proFormModelWidth } from '../../../../../config/defaultForm';
export type FormValueType = {
target?: string;
template?: string;
type?: string;
time?: string;
frequency?: string;
} & Partial<API.UserList>;
export type CreateFormProps = {
createModalOpen: boolean;
handleModal: () => void;
values: Partial<API.Register>;
values: Partial<API.UserList>;
reload: any;
};
const CreateForm: React.FC<CreateFormProps> = (props) => {
const intl = useIntl();
const [form] = Form.useForm<API.Register>();
const [form] = Form.useForm<API.UserList>();
return (
<ModalForm<API.Register>
width={proFormModelWidth}
<ModalForm<API.UserList>
width={proFormSmallModelWidth}
title={intl.formatMessage({
id: 'system.user.table.list.create',
defaultMessage: '$$$',
})}
open={props.createModalOpen}
name={'createUserForm'}
form={form}
autoFocusFirstInput
modalProps={{
@ -47,220 +42,90 @@ const CreateForm: React.FC<CreateFormProps> = (props) => {
onCancel: () => props.handleModal(),
}}
submitTimeout={2000}
onFinish={async (values: any) => {
console.log(values)
if ((values?.roleIds || []).length) {
values.roleId = values.roleIds[0]
values.roleIds = values.roleIds.join(',')
}
if ((values?.postIds || []).length) {
values.postId = values.postIds[0]
values.postIds = values.postIds.join(',')
}
handleOneFile(values, 'avatarId')
console.log(values)
postUserAdminRegister(values).then(() => {
message.success(intl.formatMessage({id: 'common.success', defaultMessage: '$$$'}))
props.reload()
}).catch(() => {
message.error(intl.formatMessage({id: 'common.error', defaultMessage: '$$$'}))
})
onFinish={async (values) => {
console.log(values);
postUserList(values)
.then(() => {
message.success(intl.formatMessage({ id: 'common.success', defaultMessage: '$$$' }));
props.reload();
})
.catch(() => {
message.error(intl.formatMessage({ id: 'common.failure', defaultMessage: '$$$' }));
});
props.handleModal();
return true;
}}
>
<ProForm.Group>
<ProFormText width={proFormItemStyleProps.column2Width} name="userName"
label={<FormattedMessage id="system.user.table.list.userName" defaultMessage="$$$"/>}
placeholder={`${intl.formatMessage({
id: 'common.please_input',
defaultMessage: '$$$'
})}${intl.formatMessage({id: 'system.user.table.list.userName', defaultMessage: '$$$'})}`}
required={true}
rules={[
{
required: true,
message: (
<FormattedMessage
id="system.user.table.rule.required.name"
defaultMessage="name is required"
/>
),
},
]}
/>
<ProFormText width={proFormItemStyleProps.column2Width} name="nickName"
label={<FormattedMessage id="system.user.table.list.nickName" defaultMessage="$$$"/>}
placeholder={`${intl.formatMessage({
id: 'common.please_input',
defaultMessage: '$$$'
})}${intl.formatMessage({id: 'system.user.table.list.nickName', defaultMessage: '$$$'})}`}
required={true}
rules={[
{
required: true,
message: (
<FormattedMessage
id="system.department.table.rule.required.nickName"
defaultMessage="nickName is required"
/>
),
},
]}
/>
<ProFormText.Password width={proFormItemStyleProps.column2Width} name="password"
label={<FormattedMessage id="system.user.table.list.password" defaultMessage="$$$"/>}
placeholder={`${intl.formatMessage({
id: 'common.please_input',
defaultMessage: '$$$'
})}${intl.formatMessage({id: 'system.user.table.list.password', defaultMessage: '$$$'})}`}
required={true}
rules={[
{
required: true,
message: (
<FormattedMessage
id="user.user.table.rule.required.password"
defaultMessage="password is required"
/>
),
},
]}
<ProFormText
width={proFormSmallItemStyleProps.width}
name="username"
label={
<FormattedMessage id="system.user.table.list.userName" defaultMessage="$$$" />
}
placeholder={`${intl.formatMessage({
id: 'common.please_input',
defaultMessage: '$$$',
})}${intl.formatMessage({
id: 'system.user.table.list.userName',
defaultMessage: '$$$',
})}`}
required={true}
rules={[
{
required: true,
message: (
<FormattedMessage
id="system.user.table.rule.required.userName"
defaultMessage="name is required"
/>
),
},
]}
/>
<ProFormDependency name={['password']}>
{
(record) => {
return (
<ProFormText.Password width={proFormItemStyleProps.column2Width} name="password_re"
label={<FormattedMessage id="system.user.table.list.password_re"
defaultMessage="$$$"/>}
placeholder={`${intl.formatMessage({
id: 'common.please_input',
defaultMessage: '$$$'
})}${intl.formatMessage({
id: 'system.user.table.list.password_re',
defaultMessage: '$$$'
})}`}
required={true}
rules={[
{
required: true,
message: (
<FormattedMessage
id="user.user.table.rule.required.password"
defaultMessage="password is required"
/>
),
},
() => ({
validator(rule, value) {
if (!value || record.password === value) {
return Promise.resolve()
}
return Promise.reject(intl.formatMessage({id: 'system.user.table.rule.password.not_same', defaultMessage: '$$$'}))
}
})
]}
<ProFormText
width={proFormSmallItemStyleProps.width}
name="password"
label={
<FormattedMessage id="system.user.table.list.password" defaultMessage="$$$" />
}
placeholder={`${intl.formatMessage({
id: 'common.please_input',
defaultMessage: '$$$',
})}${intl.formatMessage({
id: 'system.user.table.list.password',
defaultMessage: '$$$',
})}`}
required={true}
rules={[
{
required: true,
message: (
<FormattedMessage
id="system.user.table.rule.required.password"
defaultMessage="name is required"
/>
)
}
),
},
]}
/>
<ProFormText
width={proFormSmallItemStyleProps.width}
name="note"
label={
<FormattedMessage id="system.user.table.list.remark" defaultMessage="$$$" />
}
</ProFormDependency>
</ProForm.Group>
<ProForm.Group>
<ProFormSelect width={proFormItemStyleProps.column2Width} name="roleIds" showSearch
fieldProps={{
mode: 'multiple',
}}
label={<FormattedMessage id="system.user.table.list.roleIds" defaultMessage="$$$"/>}
placeholder={`${intl.formatMessage({
id: 'common.please_select',
defaultMessage: '$$$'
})}${intl.formatMessage({id: 'system.user.table.list.roleId', defaultMessage: '$$$'})}`}
required={false}
request={
async (keyWord) => {
let resp = await postRoleGetRoleFkSelect({keyword: keyWord.keyWords})
return resp.data.list.map((v: any)=>{
return {
label: v.name,
value: v.id
}
})
}
}
>
</ProFormSelect>
<ProFormSelect width={proFormItemStyleProps.column2Width} name="postIds" showSearch
fieldProps={{
mode: 'multiple',
}}
label={<FormattedMessage id="system.user.table.list.postIds" defaultMessage="$$$"/>}
placeholder={`${intl.formatMessage({
id: 'common.please_select',
defaultMessage: '$$$'
})}${intl.formatMessage({id: 'system.user.table.list.postId', defaultMessage: '$$$'})}`}
required={false}
request={
async (keyWord) => {
let resp = await postPostGetPostFkSelect({keyword: keyWord.keyWords})
return resp.data.list.map((v: any)=>{
return {
label: v.name,
value: v.id
}
})
}
}
>
</ProFormSelect>
<ProFormTreeSelect width={proFormItemStyleProps.column2Width} name="deptId"
label={<FormattedMessage id="system.user.table.list.deptId" defaultMessage="$$$"/>}
placeholder={`${intl.formatMessage({
id: 'common.please_select',
defaultMessage: '$$$'
})}${intl.formatMessage({id: 'system.user.table.list.deptId', defaultMessage: '$$$'})}`}
required={false}
request={async () => {
let resp = await postDepartmentGetDepartmentFkSelect()
return resp.data.list
}}
>
</ProFormTreeSelect>
</ProForm.Group>
<ProForm.Group>
<ProFormUploadButton width={proFormItemStyleProps.column2Width} max={1}
action="/api/v1/file/uploadImage"
name="avatarId"
label={<FormattedMessage id="system.user.table.list.avatarId" defaultMessage="$$$"/>}
fieldProps={{
name: 'file',
listType: 'picture-card',
beforeUpload: beforeUploadImage,
data: {path: 'user/avatar'},
headers: { 'X-CSRFToken': cookie.load('csrftoken') , 'X-Token': `${localStorage.getItem('access') || ''}`},}}/>
</ProForm.Group>
<ProForm.Group>
<ProFormText width={proFormItemStyleProps.column2Width} name="remark"
label={<FormattedMessage id="system.user.table.list.remark" defaultMessage="$$$"/>}
placeholder={`${intl.formatMessage({
id: 'common.please_input',
defaultMessage: '$$$'
})}${intl.formatMessage({id: 'system.user.table.list.remark', defaultMessage: '$$$'})}`}
required={false}/>
<ProFormSwitch width={proFormItemStyleProps.column2Width} name="enable" initialValue={true}
label={<FormattedMessage id="system.user.table.list.enable" defaultMessage="$$$"/>}
required={false}>
</ProFormSwitch>
placeholder={`${intl.formatMessage({
id: 'common.please_input',
defaultMessage: '$$$',
})}${intl.formatMessage({
id: 'system.user.table.list.remark',
defaultMessage: '$$$',
})}`}
required={false}
/>
</ProForm.Group>
</ModalForm>)
}
</ModalForm>
);
};
export default CreateForm;

@ -1,45 +1,46 @@
import {
ModalForm,
ProForm,
ProFormDependency,
ProFormDigit,
ProFormSwitch, ProFormTreeSelect,
ProFormUploadButton
} from '@ant-design/pro-components';
import {ProFormText} from '@ant-design/pro-components';
import {ProFormSelect} from '@ant-design/pro-components';
import {FormattedMessage, useIntl} from '@umijs/max';
/*
* @Author: zhoux zhouxia@supervision.ltd
* @Date: 2023-11-01 13:56:33
* @LastEditors: zhoux zhouxia@supervision.ltd
* @LastEditTime: 2023-12-26 15:01:08
* @FilePath: \general-ai-platform-web\src\pages\Device\DeviceCategoryList\components\UpdateForm.tsx
* @Description: ,`customMade`, koroFileHeader : https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
import { putDeviceCategoryUpdateDeviceCategory } from '@/services/device/DeviceCategory';
import { postDeviceGroupGetDeviceGroupFkSelect } from '@/services/device/DeviceGroup';
import { postUserList } from '@/services/system/User';
import { ModalForm, ProForm, ProFormFieldSet, ProFormSelect, ProFormSwitch, ProFormText, ProFormTextArea } from '@ant-design/pro-components';
import { FormattedMessage, useIntl } from '@umijs/max';
import { Form, message } from 'antd';
import React from 'react';
import {Form, message} from 'antd';
import {putUserSetUserInfo} from "@/services/system/User";
import {beforeUploadImage, handleOneFile, imageInit, parseIds} from "@/utils/common";
// @ts-ignore
import cookie from 'react-cookies';
import {postRoleGetRoleFkSelect} from "@/services/system/Role";
import {postPostGetPostFkSelect} from "@/services/system/Post";
import {postDepartmentGetDepartmentFkSelect} from "@/services/system/Department";
// 表单宽度 804 两列
import { proFormItemStyleProps, proFormModelWidth } from '../../../../../config/defaultForm';
import {
proFormSmallItemStyleProps,
proFormSmallModelWidth,
} from '../../../../../config/defaultForm';
export type FormValueType = {
target?: string;
template?: string;
type?: string;
time?: string;
frequency?: string;
} & Partial<API.UserList>;
export type UpdateFormProps = {
updateModalOpen: boolean;
handleModal: () => void;
values: Partial<API.UserView>;
values: Partial<API.UserList>;
reload: any;
};
const UpdateForm: React.FC<UpdateFormProps> = (props) => {
const intl = useIntl();
const [form] = Form.useForm<API.User>();
const [form] = Form.useForm<API.UserList>();
return (
<ModalForm<API.User>
width={proFormModelWidth}
<ModalForm<any>
width={proFormSmallModelWidth}
title={intl.formatMessage({
id: 'system.user.table.list.update',
defaultMessage: '$$$',
id: 'system.user.table.list.editor',
defaultMessage: `$$$`,
})}
open={props.updateModalOpen}
form={form}
@ -49,182 +50,136 @@ const UpdateForm: React.FC<UpdateFormProps> = (props) => {
onCancel: () => props.handleModal(),
}}
submitTimeout={2000}
onFinish={async (values: any) => {
if ('roleIds' in values) {
if ((values?.roleIds || []).length) {
values.roleId = values.roleIds[0]
values.roleIds = values.roleIds.join(',')
} else {
values.roleId = undefined
values.roleIds = ''
}
}
if ('postIds' in values) {
if ((values?.postIds || []).length) {
values.postId = values.postIds[0]
values.postIds = values.postIds.join(',')
} else {
values.postIds = ''
values.postId = undefined
}
}
handleOneFile(values, 'avatarId')
console.log(values)
console.log(props.values)
putUserSetUserInfo(values).then(() => {
message.success(intl.formatMessage({id: 'common.success', defaultMessage: '$$$'}))
props.reload()
}).catch(() => {
message.error(intl.formatMessage({id: 'common.failure', defaultMessage: '$$$'}))
})
onFinish={async (values) => {
console.log(values);
values.id = props.values.id
postUserList(values)
.then(() => {
message.success(intl.formatMessage({ id: 'common.success', defaultMessage: '$$$' }));
props.reload();
})
.catch(() => {
message.error(intl.formatMessage({ id: 'common.failure', defaultMessage: '$$$' }));
});
props.handleModal();
return true;
}}
>
<ProForm.Group>
<ProFormText width={proFormItemStyleProps.column2Width} name="id" label="id" disabled={true} initialValue={props.values.id}/>
<ProFormText width={proFormItemStyleProps.column2Width} name="userName"
label={<FormattedMessage id="system.user.table.list.userName" defaultMessage="$$$"/>}
placeholder={`${intl.formatMessage({
id: 'common.please_input',
defaultMessage: '$$$'
})}${intl.formatMessage({id: 'system.user.table.list.userName', defaultMessage: '$$$'})}`}
initialValue={props.values.userName}
required={true}
rules={[
{
required: true,
message: (
<FormattedMessage
id="system.user.table.rule.required.name"
defaultMessage="name is required"
/>
),
},
]}
<ProFormText
width={proFormSmallItemStyleProps.width}
name="username"
label={
<FormattedMessage id="system.user.table.list.userName" defaultMessage="$$$" />
}
placeholder={`${intl.formatMessage({
id: 'common.please_input',
defaultMessage: '$$$',
})}${intl.formatMessage({
id: 'system.user.table.list.userName',
defaultMessage: '$$$',
})}`}
required={true}
initialValue={props.values.username}
rules={[
{
required: true,
message: (
<FormattedMessage
id="system.user.table.rule.required.userName"
defaultMessage="name is required"
/>
),
},
]}
/>
<ProFormText width={proFormItemStyleProps.column2Width} name="nickName"
label={<FormattedMessage id="system.user.table.list.nickName" defaultMessage="$$$"/>}
placeholder={`${intl.formatMessage({
id: 'common.please_input',
defaultMessage: '$$$'
})}${intl.formatMessage({id: 'system.user.table.list.nickName', defaultMessage: '$$$'})}`}
initialValue={props.values.nickName}
required={true}
rules={[
{
required: true,
message: (
<FormattedMessage
id="system.department.table.rule.required.nickName"
defaultMessage="nickName is required"
/>
),
},
]}
<ProFormText
width={proFormSmallItemStyleProps.width}
name="password"
label={<FormattedMessage id="system.user.table.list.password" defaultMessage="$$$" />}
placeholder={`${intl.formatMessage({
id: 'common.please_input',
defaultMessage: '$$$',
})}${intl.formatMessage({
id: 'system.user.table.list.password',
defaultMessage: '$$$',
})}`}
required={true}
initialValue={props.values.password}
disabled={false}
rules={[
{
required: true,
message: (
<FormattedMessage
id="system.user.table.rule.required.password"
defaultMessage="name is required"
/>
),
},
]}
/>
</ProForm.Group>
<ProForm.Group>
<ProFormSelect width={proFormItemStyleProps.column2Width} name="roleIds" showSearch
fieldProps={{
mode: 'multiple',
}}
label={<FormattedMessage id="system.user.table.list.roleIds" defaultMessage="$$$"/>}
placeholder={`${intl.formatMessage({
id: 'common.please_select',
defaultMessage: '$$$'
})}${intl.formatMessage({id: 'system.user.table.list.roleId', defaultMessage: '$$$'})}`}
required={false}
initialValue={parseIds(props.values.roleIds)}
request={
async (keyWord) => {
let resp = await postRoleGetRoleFkSelect({keyword: keyWord.keyWords})
return resp.data.list.map((v: any)=>{
return {
label: v.name,
value: v.id
}
})
}
}
>
</ProFormSelect>
<ProFormSelect width={proFormItemStyleProps.column2Width} name="postIds" showSearch
fieldProps={{
mode: 'multiple',
}}
label={<FormattedMessage id="system.user.table.list.postIds" defaultMessage="$$$"/>}
placeholder={`${intl.formatMessage({
id: 'common.please_select',
defaultMessage: '$$$'
})}${intl.formatMessage({id: 'system.user.table.list.postId', defaultMessage: '$$$'})}`}
required={false}
initialValue={parseIds(props.values.postIds)}
request={
async (keyWord) => {
let resp = await postPostGetPostFkSelect({keyword: keyWord.keyWords})
return resp.data.list.map((v: any)=>{
return {
label: v.name,
value: v.id
}
})
}
}
>
</ProFormSelect>
<ProFormTreeSelect width={proFormItemStyleProps.column2Width} name="deptId"
label={<FormattedMessage id="system.user.table.list.deptId" defaultMessage="$$$"/>}
placeholder={`${intl.formatMessage({
id: 'common.please_select',
defaultMessage: '$$$'
})}${intl.formatMessage({id: 'system.user.table.list.deptId', defaultMessage: '$$$'})}`}
required={false}
initialValue={props.values.deptId}
request={async () => {
let resp = await postDepartmentGetDepartmentFkSelect()
return resp.data.list
}}
>
</ProFormTreeSelect>
</ProForm.Group>
<ProForm.Group>
<ProFormUploadButton width={proFormItemStyleProps.column2Width} max={1}
action="/api/v1/file/uploadImage"
name="avatarId"
label={<FormattedMessage id="system.user.table.list.avatarId" defaultMessage="$$$"/>}
initialValue={imageInit(SERVER_HOST,props.values.avatarUrl)}
fieldProps={{
name: 'file',
listType: 'picture-card',
beforeUpload: beforeUploadImage,
data: {path: 'user/avatar'},
headers: { 'X-CSRFToken': cookie.load('csrftoken') , 'X-Token': `${localStorage.getItem('access') || ''}`},}}/>
</ProForm.Group>
<ProForm.Group>
<ProFormText width={proFormItemStyleProps.column2Width} name="remark"
label={<FormattedMessage id="system.user.table.list.remark" defaultMessage="$$$"/>}
placeholder={`${intl.formatMessage({
id: 'common.please_input',
defaultMessage: '$$$'
})}${intl.formatMessage({id: 'system.user.table.list.remark', defaultMessage: '$$$'})}`}
initialValue={props.values.remark}
required={false}/>
<ProFormSwitch width={proFormItemStyleProps.column2Width} name="enable" initialValue={props.values.enable}
label={<FormattedMessage id="system.user.table.list.enable" defaultMessage="$$$"/>}
required={false}>
</ProFormSwitch>
<ProFormText
width={proFormSmallItemStyleProps.width}
name="note"
label={
<FormattedMessage id="system.user.table.list.remark" defaultMessage="$$$" />
}
placeholder={`${intl.formatMessage({
id: 'common.please_input',
defaultMessage: '$$$',
})}${intl.formatMessage({
id: 'system.user.table.list.remark',
defaultMessage: '$$$',
})}`}
initialValue={props.values.note}
required={false}
/>
{/* <ProFormSelect
width={proFormSmallItemStyleProps.width}
name="level"
label={<FormattedMessage id="alarm.setting.table.list.level" defaultMessage="$$$" />}
placeholder={`${intl.formatMessage({
id: 'common.please_select',
defaultMessage: '$$$',
})}${intl.formatMessage({
id: 'alarm.setting.table.list.level',
defaultMessage: '$$$',
})}`}
required={false}
// TODO 在types中增加类型注释
initialValue={props.values?.level}
debounceTime={1000}
request={async () => {
// TODO 此处需要使用告警级别接口联调
const resp = await postDeviceGroupGetDeviceGroupFkSelect({});
return resp.data.list.map((v: any) => {
return {
label: v.name,
value: v.id,
};
});
}}
/> */}
{/* <ProFormText
width={proFormSmallItemStyleProps.width}
name="triggerConditions"
label={<FormattedMessage id="alarm_rules.page.form.triggerConditions" defaultMessage="$$$" />}
placeholder={`${intl.formatMessage({
id: 'common.please_input',
defaultMessage: '$$$',
})}${intl.formatMessage({
id: 'alarm_rules.page.form.triggerConditions',
defaultMessage: '$$$',
})}`}
required={false}
initialValue={props.values.triggerConditions}
disabled={false}
/> */}
</ProForm.Group>
</ModalForm>)
}
</ModalForm>
);
};
export default UpdateForm;

@ -1,68 +1,48 @@
import { deleteUserDeleteUser, postUserGetUserList } from '@/services/system/User';
import { PlusOutlined } from '@ant-design/icons';
import TableActionCard from '@/components/TableActionCard';
import IsDelete from '@/components/TableActionCard/isDelete';
import {
deleteDeviceCategoryDeleteDeviceCategory,
postDeviceCategoryGetDeviceCategoryList,
} from '@/services/device/DeviceCategory';
import { getInterfaces, postInterfaces } from '@/services/alarm/Interfaces'
import { getUserList } from '@/services/system/User'
import type { ActionType, ProColumns } from '@ant-design/pro-components';
import { PageContainer, ProTable } from '@ant-design/pro-components';
import { Access, FormattedMessage, history, useAccess, useIntl } from '@umijs/max';
import { Button, message } from 'antd';
import React, { useEffect, useRef, useState } from 'react';
import { ColumnDrawer } from './components/ColumnDrawer';
import { FormattedMessage, useIntl } from '@umijs/max';
import { Button, Space, Tag, message } from 'antd';
import React, { useRef, useState } from 'react';
import { proTablePaginationOptions } from '../../../../config/defaultTable';
import { proIconForTableActionStyle } from '../../../../config/defaultIcon';
import { EditOutlined } from '@ant-design/icons';
import CreateForm from './components/CreateForm';
import UpdateForm from './components/UpdateForm';
import { postDepartmentGetDepartmentTree } from '@/services/system/Department';
import { RedoOutlined } from '@ant-design/icons';
import { Tree } from 'antd';
import type { DataNode } from 'antd/es/tree';
// 列表操作栏组件
import TableActionCard from '@/components/TableActionCard';
import IsDelete from '@/components/TableActionCard/isDelete';
// 批量删除
import IsBatchDelete from '@/components/BatchOperation/isBatchDelete';
import TreeAndTableList, { ProCardTypeProps } from '@/layouts/treeAndTableList';
const UserList: React.FC = () => {
/**
* @en-US Pop-up window of new window
* @zh-CN
* */
const [createModalOpen, setCreateModalOpen] = useState<boolean>(false);
/**
* @en-US The pop-up window of the distribution update window
* @zh-CN
* */
const [updateModalOpen, setUpdateModalOpen] = useState<boolean>(false);
const [showDetail, setShowDetail] = useState<boolean>(false);
/**
* @en-US International configuration
* @zh-CN
* */
const access = useAccess();
const intl = useIntl();
const actionRef = useRef<ActionType>();
const [currentRow, setCurrentRow] = useState<API.User>();
const [selectedRowsState, setSelectedRows] = useState<API.User[]>([]);
const [deptTreeData, setDeptTreeData] = React.useState<DataNode[]>([]);
const [selectDepts, setSelectDepts] = React.useState<any[]>([]);
const [hasInit, setHasInit] = useState<boolean>(false);
// 动态设置每页数量
const [currentPageSize, setCurrentPageSize] = useState<number>(10);
useEffect(() => {
postDepartmentGetDepartmentTree()
.then((resp) => {
setDeptTreeData(resp.data.tree);
setHasInit(true);
const handleDestroy = async (selectedRow: API.UserList) => {
postInterfaces({ id: selectedRow.id, device_status: '3' } )
.then(() => {
message.success(intl.formatMessage({ id: 'common.success', defaultMessage: '$$$' }));
actionRef.current?.reload();
})
.catch(() => {
message.error(intl.formatMessage({ id: 'common.failure', defaultMessage: '$$$' }));
});
}, []);
const handleUpdateModal = () => {
if (updateModalOpen) {
setUpdateModalOpen(false);
setCurrentRow(undefined);
} else {
setUpdateModalOpen(true);
}
};
const [currentRow, setCurrentRow] = useState<API.UserList>();
/**
* @en-US Pop-up window of new window
* @zh-CN
* */
const [createModalOpen, setCreateModalOpen] = useState<boolean>(false);
const handleCreateModal = () => {
if (createModalOpen) {
setCreateModalOpen(false);
@ -71,89 +51,36 @@ const UserList: React.FC = () => {
setCreateModalOpen(true);
}
};
const handleColumnDrawer = () => {
if (showDetail) {
setShowDetail(false);
// 编辑弹框
const [updateModalOpen, setUpdateModalOpen] = useState<boolean>(false);
const handleUpdateModal = () => {
if (updateModalOpen) {
setUpdateModalOpen(false);
setCurrentRow(undefined);
} else {
setShowDetail(true);
setUpdateModalOpen(true);
}
};
const handleDestroy = async (selectedRow: API.User) => {
deleteUserDeleteUser(selectedRow)
.then(() => {
message.success(intl.formatMessage({ id: 'common.success', defaultMessage: '$$$' }));
actionRef.current?.reload();
})
.catch(() => {
message.error(intl.formatMessage({ id: 'common.failure', defaultMessage: '$$$' }));
});
};
const columns: ProColumns<API.User>[] = [
{
title: <FormattedMessage id="system.user.table.list.id" defaultMessage="id" />,
dataIndex: 'id',
sorter: true,
// valueType: "digit",
filters: true,
onFilter: true,
render: (dom, entity) => {
return (
<a
style={{ color: '#155BD4' }}
onClick={() => {
setCurrentRow(entity);
setShowDetail(true);
}}
>
{dom}
</a>
);
},
},
const columns: ProColumns<API.UserList>[] = [
{
sorter: true,
title: <FormattedMessage id="system.user.table.list.userName" defaultMessage="$$$" />,
dataIndex: 'userName',
dataIndex: 'username',
hideInSearch: true,
},
{
title: <FormattedMessage id="system.user.table.list.nickName" defaultMessage="$$$" />,
dataIndex: 'nickName',
title: <FormattedMessage id="system.user.table.list.remark" defaultMessage="$$$" />,
dataIndex: 'note',
hideInSearch: true,
},
{
title: <FormattedMessage id="system.user.table.list.avatarId" defaultMessage="$$$" />,
dataIndex: 'avatarUrl',
title: <FormattedMessage id="system.user.table.list.createTime" defaultMessage="$$$" />,
dataIndex: 'date_joined',
sorter: true,
hideInSearch: true,
renderText: (v) => {
if (v) {
return SERVER_HOST + v.replace(/\\/g, '/');
} else {
return '';
}
},
// hideInTable: true,
valueType: 'image',
},
{
title: <FormattedMessage id="system.user.table.list.enable" defaultMessage="$$$" />,
dataIndex: 'enable',
valueEnum: {
true: {
text: <FormattedMessage id="common.open" defaultMessage="$$" />,
status: 'Success',
},
false: {
text: <FormattedMessage id="common.close" defaultMessage="$$" />,
status: 'Error',
},
},
filters: true,
onFilter: true,
valueType: 'dateTime',
},
{
@ -166,21 +93,28 @@ const UserList: React.FC = () => {
key="TableActionCardRef"
renderActions={[
{
key: 'update',
renderDom: (
<Button
key="update"
type="link"
size="small"
onClick={() => {
setUpdateModalOpen(true);
setCurrentRow(record);
}}
>
<FormattedMessage id="pages.searchTable.update" defaultMessage="Update" />
</Button>
),
},
key: 'update',
renderDom: (
<Button
key="update"
type="link"
size="small"
style={{
color:"#081FA8",
}}
icon={<EditOutlined style={{
marginRight: 3
}} />}
onClick={() => {
setUpdateModalOpen(true);
setCurrentRow(record);
}}
>
<FormattedMessage id="common.edit" defaultMessage="Update" />
</Button>
),
},
{
key: 'destroy',
renderDom: (
@ -193,166 +127,81 @@ const UserList: React.FC = () => {
},
]}
></TableActionCard>,
// <Access accessible={access.canUpdate(history.location.pathname)} key={`${history.location.pathname}-add`}>
// <a
// key="update"
// onClick={() => {
// setUpdateModalOpen(true);
// setCurrentRow(record);
// }}
// >
// <FormattedMessage id="pages.searchTable.update" defaultMessage="Update"/>
// </a>
// <Popconfirm
// placement="topLeft"
// title={intl.formatMessage({ id: 'common.tip.title', defaultMessage: '$$$' })}
// description={intl.formatMessage({
// id: 'common.modal.table.delete.content',
// defaultMessage: '$$$',
// })}
// okText={intl.formatMessage({ id: 'common.yes', defaultMessage: '$$$' })}
// cancelText={intl.formatMessage({ id: 'common.no', defaultMessage: '$$$' })}
// onConfirm={() => {
// handleDestroy(record).then(() => {});
// }}
// >
// <Button key="destroy" type="link" size="small" danger>
// <FormattedMessage id="pages.searchTable.destroy" defaultMessage="Destroy" />
// </Button>
// </Popconfirm>
// </Access>
],
},
];
return (
<PageContainer>
<TreeAndTableList
leftCard={
{
title: '部门选择',
extra: (
<>
<Button
icon={<RedoOutlined />}
onClick={() => {
setSelectDepts([]);
actionRef.current?.reload();
}}
>
</Button>
</>
),
} as ProCardTypeProps
}
leftDom={
hasInit && (
<Tree
checkable={false}
defaultExpandAll={true}
selectedKeys={selectDepts}
treeData={deptTreeData}
onSelect={(selectKeys) => {
setSelectDepts(selectKeys);
actionRef.current?.reload();
}}
/>
)
}
rightDom={
<ProTable<API.User>
headerTitle={intl.formatMessage({
id: 'pages.searchTable.title',
defaultMessage: '$$$',
})}
options={{ fullScreen: true, setting: true, density: true, reload: true }}
actionRef={actionRef}
rowKey="id"
search={{
labelWidth: 'auto',
}}
pagination={{
showSizeChanger: true,
pageSize: 10,
}}
columnsState={{
persistenceKey: 'api_list',
persistenceType: 'localStorage',
}}
toolBarRender={() => [
<Access
accessible={access.canUpdate(history.location.pathname)}
key={`${history.location.pathname}-add`}
>
<Button
type="primary"
key="primary"
onClick={() => {
setCreateModalOpen(true);
}}
>
<PlusOutlined />{' '}
<FormattedMessage id="pages.searchTable.new" defaultMessage="New" />
</Button>
</Access>,
]}
request={async (params = {}, sort) => {
const { current, ...rest } = params;
const reqParams: any = {
page: current,
desc: false,
orderKey: '',
...rest,
};
if (selectDepts.length) {
reqParams.deptId = selectDepts[0];
}
if (sort && Object.keys(sort).length) {
reqParams.orderKey = Object.keys(sort)[0];
let sort_select = sort[reqParams.orderKey];
reqParams.desc = sort_select === 'descend';
}
let resp = await postUserGetUserList({ ...reqParams });
console.log(resp);
return {
data: resp.data.list,
success: resp.success,
total: resp.data.total,
current: resp.data.page,
pageSize: resp.data.pageSize,
};
}}
columns={columns}
rowSelection={{
onChange: (_, selectedRows) => {
setSelectedRows(selectedRows);
},
}}
tableAlertOptionRender={() => {
return (
<>
{selectedRowsState?.length > 0 && (
<IsBatchDelete
deleteApi={() => {
const ids = selectedRowsState.map((v: API.User) => {
return v.id;
});
// deleteUserDeleteUsersByIds({ids: ids as number[]}).then(() => {
// actionRef.current?.reloadAndRest?.();
// })
}}
/>
)}
</>
);
<PageContainer
title={false}
content={
<div style={{
display: 'flex',
justifyContent: 'space-between'
}}>
<div style={{
fontWeight: 600,
fontSize: 20,
color: '#333'
}}></div>
<Button type="primary"
onClick={() => {
setCreateModalOpen(true);
}}
/>
>
<FormattedMessage id="system.user.table.list.create" defaultMessage="add" />
</Button>
</div>
}
></TreeAndTableList>
>
<ProTable<API.UserList>
cardProps={{
bodyStyle: {
padding: 20
}
}}
options={{ fullScreen: false, setting: false, density: false, reload: false }}
actionRef={actionRef}
rowKey="key"
search={false}
pagination={{
...proTablePaginationOptions,
pageSize: currentPageSize,
onChange: (page, pageSize) => setCurrentPageSize(pageSize),
}}
columnsState={{
persistenceKey: 'device_category_list',
persistenceType: 'localStorage',
}}
request={async (params = {}, sort) => {
const { current, ...rest } = params;
const reqParams = {
page: current,
desc: false,
orderKey: '',
...rest,
};
if (sort && Object.keys(sort).length) {
reqParams.orderKey = Object.keys(sort)[0];
let sort_select = sort[reqParams.orderKey];
reqParams.desc = sort_select === 'descend';
}
// let resp = await postDeviceCategoryGetDeviceCategoryList({ ...reqParams });
let resp = await getUserList({ ...reqParams });
return {
data: resp.data.results.map((v: API.UserList) => {
return { ...v, key: v.id };
}),
success: resp.success,
total: resp.data.count,
current: resp.data.page,
pageSize: resp.data.pageSize,
};
}}
columns={columns}
/>
<CreateForm
createModalOpen={createModalOpen}
values={(currentRow as API.Register) || {}}
values={currentRow || {}}
handleModal={handleCreateModal}
reload={actionRef.current?.reload}
/>
@ -362,13 +211,6 @@ const UserList: React.FC = () => {
handleModal={handleUpdateModal}
reload={actionRef.current?.reload}
/>
<ColumnDrawer
handleDrawer={handleColumnDrawer}
isShowDetail={showDetail}
columns={columns}
currentRow={currentRow}
/>
</PageContainer>
);
};

@ -174,6 +174,16 @@ const Login: React.FC = () => {
"component": "Hidden",
"title": "接口管理",
"routes": []
},
{
"path": "userList",
"key": "",
"name": "userList",
"icon": "UserOutlined",
"access": "",
"component": "Hidden",
"title": "用户列表",
"routes": []
}
]
},

@ -4,7 +4,7 @@ import { request } from '@umijs/max';
/** 接口列表 */
export async function getInterfaces(
params: API.SearchAlarmRulesParams,
params: API.SearchAlarmRulesParams | any,
options?: { [key: string]: any },
) {
return request<API.Response & { data?: API.PageResult; msg?: string }>(

@ -60,9 +60,45 @@ export async function getUserGetUserInfo(options?: { [key: string]: any }) {
}
/** 分页获取用户列表 POST /user/getUserList */
export async function postUserGetUserList(body: API.PageInfo, options?: { [key: string]: any }) {
// export async function postUserGetUserList(body: API.PageInfo, options?: { [key: string]: any }) {
// return request<API.Response & { data?: API.PageResult; msg?: string }>(
// `/api/v1/user/getUserList`,
// {
// method: 'POST',
// headers: {
// 'Content-Type': 'application/json',
// },
// data: body,
// ...(options || {}),
// },
// );
// }
export async function getUserList(
params: API.SearchAlarmRulesParams | any,
options?: { [key: string]: any },
) {
return request<API.Response & { data?: API.PageResult; msg?: string }>(
`/api/user/`,
{
method: 'GET',
headers: {
'Content-Type': 'application/json',
},
params: {
...params,
},
...(options || {}),
},
);
}
/** 更新用户列表 */
export async function postUserList(
body: API.UserList,
options?: { [key: string]: any },
) {
return request<API.Response & { data?: API.PageResult; msg?: string }>(
`/api/v1/user/getUserList`,
`/api/user/`,
{
method: 'POST',
headers: {

@ -1011,6 +1011,18 @@ declare namespace API {
userName?: string;
};
type UserList = {
username?: string; // 用户名
is_superuser?: boolean; //
gender?: number; // 性别
date_joined?: string; // 创建时间
note?: string; // 备注
phone_number?: string; // 电话
status?: string; // 状态
password?: string; // 密码
id?: string;
}
type Zap = {
/** 日志文件夹 */
director?: string;

Loading…
Cancel
Save