refactor(validation): 应用统一验证规则到菜单/字典/配置/通知页面
菜单名称添加长度校验,排序使用 VALIDATION 常量; 字典名称/类型添加长度校验,字典标签/值添加长度校验; 配置名称/键/值添加长度校验; 通知标题添加长度校验,内容添加长度校验。
This commit is contained in:
@@ -5,6 +5,7 @@ import type { ColumnsType } from 'antd/es/table'
|
|||||||
import { configApi } from '@/api/config'
|
import { configApi } from '@/api/config'
|
||||||
import type { ConfigItem, CreateConfigRequest, UpdateConfigRequest, ConfigPageRequest } from '@/api/config'
|
import type { ConfigItem, CreateConfigRequest, UpdateConfigRequest, ConfigPageRequest } from '@/api/config'
|
||||||
import type { PageResponse } from '@/api/user.api'
|
import type { PageResponse } from '@/api/user.api'
|
||||||
|
import { VALIDATION } from '@/constants/validation-rules'
|
||||||
import PermissionGuard from '@/components/PermissionGuard'
|
import PermissionGuard from '@/components/PermissionGuard'
|
||||||
|
|
||||||
export default function ConfigManagement() {
|
export default function ConfigManagement() {
|
||||||
@@ -74,9 +75,9 @@ export default function ConfigManagement() {
|
|||||||
pagination={{ ...pagination, showSizeChanger: true, showTotal: (t) => `共 ${t} 条`, onChange: (p, ps) => { setPagination((prev) => ({ ...prev, current: p, pageSize: ps })); setTimeout(loadConfigs, 0) } }} />
|
pagination={{ ...pagination, showSizeChanger: true, showTotal: (t) => `共 ${t} 条`, onChange: (p, ps) => { setPagination((prev) => ({ ...prev, current: p, pageSize: ps })); setTimeout(loadConfigs, 0) } }} />
|
||||||
<Modal title={editingConfig ? '编辑配置' : '新增配置'} open={modalOpen} onOk={handleSubmit} onCancel={() => setModalOpen(false)} destroyOnHidden>
|
<Modal title={editingConfig ? '编辑配置' : '新增配置'} open={modalOpen} onOk={handleSubmit} onCancel={() => setModalOpen(false)} destroyOnHidden>
|
||||||
<Form form={form} layout="vertical">
|
<Form form={form} layout="vertical">
|
||||||
<Form.Item name="configName" label="配置名称" rules={[{ required: true, message: '请输入配置名称' }]}><Input /></Form.Item>
|
<Form.Item name="configName" label="配置名称" rules={VALIDATION.configName.rules}><Input /></Form.Item>
|
||||||
<Form.Item name="configKey" label="配置键" rules={[{ required: true, message: '请输入配置键' }]}><Input /></Form.Item>
|
<Form.Item name="configKey" label="配置键" rules={VALIDATION.configKey.rules}><Input /></Form.Item>
|
||||||
<Form.Item name="configValue" label="配置值" rules={[{ required: true, message: '请输入配置值' }]}><Input /></Form.Item>
|
<Form.Item name="configValue" label="配置值" rules={VALIDATION.configValue.rules}><Input /></Form.Item>
|
||||||
<Form.Item name="configType" label="类型"><Input /></Form.Item>
|
<Form.Item name="configType" label="类型"><Input /></Form.Item>
|
||||||
<Form.Item name="remark" label="备注"><Input.TextArea rows={3} /></Form.Item>
|
<Form.Item name="remark" label="备注"><Input.TextArea rows={3} /></Form.Item>
|
||||||
</Form>
|
</Form>
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import { PlusOutlined, EditOutlined, DeleteOutlined } from '@ant-design/icons'
|
|||||||
import type { ColumnsType } from 'antd/es/table'
|
import type { ColumnsType } from 'antd/es/table'
|
||||||
import { dictApi } from '@/api/dict'
|
import { dictApi } from '@/api/dict'
|
||||||
import type { DictType, DictData, CreateDictTypeRequest, CreateDictDataRequest, UpdateDictTypeRequest, UpdateDictDataRequest } from '@/api/dict'
|
import type { DictType, DictData, CreateDictTypeRequest, CreateDictDataRequest, UpdateDictTypeRequest, UpdateDictDataRequest } from '@/api/dict'
|
||||||
|
import { VALIDATION } from '@/constants/validation-rules'
|
||||||
|
|
||||||
export default function DictManagement() {
|
export default function DictManagement() {
|
||||||
const [dictTypes, setDictTypes] = useState<DictType[]>([])
|
const [dictTypes, setDictTypes] = useState<DictType[]>([])
|
||||||
@@ -88,16 +89,16 @@ export default function DictManagement() {
|
|||||||
|
|
||||||
<Modal title={editingType ? '编辑字典类型' : '新增字典类型'} open={typeModalOpen} onOk={handleTypeSubmit} onCancel={() => setTypeModalOpen(false)} destroyOnHidden>
|
<Modal title={editingType ? '编辑字典类型' : '新增字典类型'} open={typeModalOpen} onOk={handleTypeSubmit} onCancel={() => setTypeModalOpen(false)} destroyOnHidden>
|
||||||
<Form form={typeForm} layout="vertical">
|
<Form form={typeForm} layout="vertical">
|
||||||
<Form.Item name="dictName" label="字典名称" rules={[{ required: true }]}><Input /></Form.Item>
|
<Form.Item name="dictName" label="字典名称" rules={VALIDATION.dictName.rules}><Input /></Form.Item>
|
||||||
<Form.Item name="dictType" label="字典类型" rules={[{ required: true }]}><Input /></Form.Item>
|
<Form.Item name="dictType" label="字典类型" rules={VALIDATION.dictType.rules}><Input /></Form.Item>
|
||||||
<Form.Item name="status" label="状态" initialValue={1}><Select options={[{ label: '正常', value: 1 }, { label: '停用', value: 0 }]} /></Form.Item>
|
<Form.Item name="status" label="状态" initialValue={1}><Select options={[{ label: '正常', value: 1 }, { label: '停用', value: 0 }]} /></Form.Item>
|
||||||
<Form.Item name="remark" label="备注"><Input.TextArea /></Form.Item>
|
<Form.Item name="remark" label="备注"><Input.TextArea /></Form.Item>
|
||||||
</Form>
|
</Form>
|
||||||
</Modal>
|
</Modal>
|
||||||
<Modal title={editingData ? '编辑字典数据' : '新增字典数据'} open={dataModalOpen} onOk={handleDataSubmit} onCancel={() => setDataModalOpen(false)} destroyOnHidden>
|
<Modal title={editingData ? '编辑字典数据' : '新增字典数据'} open={dataModalOpen} onOk={handleDataSubmit} onCancel={() => setDataModalOpen(false)} destroyOnHidden>
|
||||||
<Form form={dataForm} layout="vertical">
|
<Form form={dataForm} layout="vertical">
|
||||||
<Form.Item name="dictLabel" label="字典标签" rules={[{ required: true }]}><Input /></Form.Item>
|
<Form.Item name="dictLabel" label="字典标签" rules={VALIDATION.dictLabel.rules}><Input /></Form.Item>
|
||||||
<Form.Item name="dictValue" label="字典值" rules={[{ required: true }]}><Input /></Form.Item>
|
<Form.Item name="dictValue" label="字典值" rules={VALIDATION.dictValue.rules}><Input /></Form.Item>
|
||||||
<Form.Item name="sort" label="排序" initialValue={0}><InputNumber min={0} style={{ width: '100%' }} /></Form.Item>
|
<Form.Item name="sort" label="排序" initialValue={0}><InputNumber min={0} style={{ width: '100%' }} /></Form.Item>
|
||||||
<Form.Item name="status" label="状态" initialValue={1}><Select options={[{ label: '正常', value: 1 }, { label: '停用', value: 0 }]} /></Form.Item>
|
<Form.Item name="status" label="状态" initialValue={1}><Select options={[{ label: '正常', value: 1 }, { label: '停用', value: 0 }]} /></Form.Item>
|
||||||
<Form.Item name="remark" label="备注"><Input.TextArea /></Form.Item>
|
<Form.Item name="remark" label="备注"><Input.TextArea /></Form.Item>
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import { noticeApi } from '@/api/loginLog'
|
|||||||
import type { Notice, NoticePageRequest } from '@/api/loginLog'
|
import type { Notice, NoticePageRequest } from '@/api/loginLog'
|
||||||
import type { PageResponse } from '@/api/user.api'
|
import type { PageResponse } from '@/api/user.api'
|
||||||
import { NoticeStatus, noticeStatusMap } from '@/constants/status'
|
import { NoticeStatus, noticeStatusMap } from '@/constants/status'
|
||||||
|
import { VALIDATION } from '@/constants/validation-rules'
|
||||||
import PermissionGuard from '@/components/PermissionGuard'
|
import PermissionGuard from '@/components/PermissionGuard'
|
||||||
|
|
||||||
export default function NoticeManagement() {
|
export default function NoticeManagement() {
|
||||||
@@ -75,9 +76,9 @@ export default function NoticeManagement() {
|
|||||||
pagination={{ ...pagination, showSizeChanger: true, showTotal: (t) => `共 ${t} 条`, onChange: (p, ps) => { setPagination((prev) => ({ ...prev, current: p, pageSize: ps })); setTimeout(loadNotices, 0) } }} />
|
pagination={{ ...pagination, showSizeChanger: true, showTotal: (t) => `共 ${t} 条`, onChange: (p, ps) => { setPagination((prev) => ({ ...prev, current: p, pageSize: ps })); setTimeout(loadNotices, 0) } }} />
|
||||||
<Modal title={editingNotice ? '编辑通知' : '新增通知'} open={modalOpen} onOk={handleSubmit} onCancel={() => setModalOpen(false)} destroyOnHidden width={640}>
|
<Modal title={editingNotice ? '编辑通知' : '新增通知'} open={modalOpen} onOk={handleSubmit} onCancel={() => setModalOpen(false)} destroyOnHidden width={640}>
|
||||||
<Form form={form} layout="vertical">
|
<Form form={form} layout="vertical">
|
||||||
<Form.Item name="noticeTitle" label="标题" rules={[{ required: true, message: '请输入标题' }]}><Input /></Form.Item>
|
<Form.Item name="noticeTitle" label="标题" rules={VALIDATION.noticeTitle.rules}><Input /></Form.Item>
|
||||||
<Form.Item name="noticeType" label="类型"><Select options={[{ label: '通知', value: '1' }, { label: '公告', value: '2' }]} /></Form.Item>
|
<Form.Item name="noticeType" label="类型"><Select options={[{ label: '通知', value: '1' }, { label: '公告', value: '2' }]} /></Form.Item>
|
||||||
<Form.Item name="noticeContent" label="内容" rules={[{ required: true, message: '请输入内容' }]}><Input.TextArea rows={6} /></Form.Item>
|
<Form.Item name="noticeContent" label="内容" rules={VALIDATION.noticeContent.rules}><Input.TextArea rows={6} /></Form.Item>
|
||||||
<Form.Item name="status" label="状态" initialValue={NoticeStatus.ACTIVE}><Select options={Object.entries(noticeStatusMap).map(([v, info]) => ({ label: info.label, value: v }))} /></Form.Item>
|
<Form.Item name="status" label="状态" initialValue={NoticeStatus.ACTIVE}><Select options={Object.entries(noticeStatusMap).map(([v, info]) => ({ label: info.label, value: v }))} /></Form.Item>
|
||||||
</Form>
|
</Form>
|
||||||
</Modal>
|
</Modal>
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import type { ColumnsType } from 'antd/es/table'
|
|||||||
import { menuApi } from '@/api/menu'
|
import { menuApi } from '@/api/menu'
|
||||||
import type { MenuItem, CreateMenuRequest, UpdateMenuRequest } from '@/api/menu'
|
import type { MenuItem, CreateMenuRequest, UpdateMenuRequest } from '@/api/menu'
|
||||||
import { MenuStatus, menuStatusMap } from '@/constants/status'
|
import { MenuStatus, menuStatusMap } from '@/constants/status'
|
||||||
|
import { VALIDATION } from '@/constants/validation-rules'
|
||||||
import PermissionGuard from '@/components/PermissionGuard'
|
import PermissionGuard from '@/components/PermissionGuard'
|
||||||
|
|
||||||
export default function MenuManagement() {
|
export default function MenuManagement() {
|
||||||
@@ -160,7 +161,7 @@ export default function MenuManagement() {
|
|||||||
<Form.Item name="parentId" label="上级菜单" initialValue={0}>
|
<Form.Item name="parentId" label="上级菜单" initialValue={0}>
|
||||||
<InputNumber style={{ width: '100%' }} />
|
<InputNumber style={{ width: '100%' }} />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
<Form.Item name="name" label="菜单名称" rules={[{ required: true, message: '请输入菜单名称' }]}>
|
<Form.Item name="name" label="菜单名称" rules={VALIDATION.menuName.rules}>
|
||||||
<Input />
|
<Input />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
<Form.Item name="type" label="类型" initialValue="menu">
|
<Form.Item name="type" label="类型" initialValue="menu">
|
||||||
@@ -182,7 +183,7 @@ export default function MenuManagement() {
|
|||||||
<Form.Item name="permission" label="权限标识">
|
<Form.Item name="permission" label="权限标识">
|
||||||
<Input />
|
<Input />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
<Form.Item name="sort" label="排序" initialValue={0}>
|
<Form.Item name="sort" label="排序" initialValue={VALIDATION.menuSort.initialValue} rules={VALIDATION.menuSort.rules}>
|
||||||
<InputNumber min={0} style={{ width: '100%' }} />
|
<InputNumber min={0} style={{ width: '100%' }} />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
<Form.Item name="status" label="状态" initialValue={MenuStatus.ACTIVE}>
|
<Form.Item name="status" label="状态" initialValue={MenuStatus.ACTIVE}>
|
||||||
|
|||||||
Reference in New Issue
Block a user