wip: Form升级中

This commit is contained in:
kailong321200875 2023-04-26 17:49:30 +08:00
parent 09fe3467f6
commit 28d1654b20
6 changed files with 779 additions and 694 deletions

View File

@ -72,10 +72,8 @@ export const setGridProp = (col: ColProps = {}): ColProps => {
* @returns clearable * @returns clearable
*/ */
export const setComponentProps = (item: FormSchema): Recordable => { export const setComponentProps = (item: FormSchema): Recordable => {
const notNeedClearable = ['ColorPicker'] // const notNeedClearable = ['ColorPicker']
const componentProps: Recordable = notNeedClearable.includes(item.component as string) const componentProps = {
? { ...item.componentProps }
: {
clearable: true, clearable: true,
...item.componentProps ...item.componentProps
} }

View File

@ -26,7 +26,7 @@ const whiteList = ['/login'] // 不重定向白名单
router.beforeEach(async (to, from, next) => { router.beforeEach(async (to, from, next) => {
start() start()
loadStart() loadStart()
if (wsCache.get(appStore.getUserInfo)) { if (!wsCache.get(appStore.getUserInfo)) {
if (to.path === '/login') { if (to.path === '/login') {
next({ path: '/' }) next({ path: '/' })
} else { } else {

View File

@ -1,27 +1,85 @@
export type ComponentName = import { CSSProperties } from 'vue'
| 'Radio' import { InputProps } from 'element-plus'
| 'RadioButton'
| 'Checkbox'
| 'CheckboxButton'
| 'Input'
| 'Autocomplete'
| 'InputNumber'
| 'Select'
| 'Cascader'
| 'Switch'
| 'Slider'
| 'TimePicker'
| 'DatePicker'
| 'Rate'
| 'ColorPicker'
| 'Transfer'
| 'Divider'
| 'TimeSelect'
| 'SelectV2'
| 'InputPassword'
| 'Editor'
export type ColProps = { export enum ComponentNameEnum {
RADIO = 'Radio',
RADIO_BUTTON = 'RadioButton',
CHECKBOX = 'Checkbox',
CHECKBOX_BUTTON = 'CheckboxButton',
INPUT = 'Input',
AUTOCOMPLETE = 'Autocomplete',
INPUT_NUMBER = 'InputNumber',
SELECT = 'Select',
CASCADER = 'Cascader',
SWITCH = 'Switch',
SLIDER = 'Slider',
TIME_PICKER = 'TimePicker',
DATE_PICKER = 'DatePicker',
RATE = 'Rate',
COLOR_PICKER = 'ColorPicker',
TRANSFER = 'Transfer',
DIVIDER = 'Divider',
TIME_SELECT = 'TimeSelect',
SELECT_V2 = 'SelectV2',
INPUT_PASSWORD = 'InputPassword',
EDITOR = 'Editor'
}
export interface InputComponentProps {
value?: string | number
maxlength?: number | string
minlength?: number | string
showWordLimit?: boolean
placeholder?: string
clearable?: boolean
formatter?: (value: string | number) => string
parser?: (value: string) => string
showPassword?: boolean
disabled?: boolean
size?: InputProps['size']
prefixIcon?: string | JSX.Element | (<T>(data: T | any) => string | JSX.Element)
suffixIcon?: string | JSX.Element | (<T>(data: T | any) => string | JSX.Element)
rows?: number
autosize?: boolean | { Pows?: numer; maxRows?: number }
autocomplete?: string
name?: string
readonly?: boolean
max?: number | string
min?: number | string
step?: number | string
resize?: InputProps['resize']
autofocus?: boolean
form?: string
label?: string
tabindex?: string | number
validateEvent?: boolean
inputStyle?: string | CSSProperties | CSSProperties[] | string[]
on?: {
blur?: (event: FocusEvent) => void
focus?: (event: FocusEvent) => void
change?: (value: string | number) => void
clear?: () => void
input?: (value: string | number) => void
}
slots?: {
prefix?: JSX.Element | (<T>(data: T | any) => JSX.Element)
suffix?: JSX.Element | (<T>(data: T | any) => JSX.Element)
prepend?: JSX.Element | (<T>(data: T | any) => JSX.Element)
append?: JSX.Element | (<T>(data: T | any) => JSX.Element)
}
}
type CamelCaseComponentName = keyof typeof ComponentNameEnum extends infer K
? K extends string
? K extends `${infer A}_${infer B}`
? `${Capitalize<Lowercase<A>>}${Capitalize<Lowercase<B>>}`
: Capitalize<Lowercase<K>>
: never
: never
export type ComponentName = CamelCaseComponentName
export interface ColProps {
span?: number span?: number
xs?: number xs?: number
sm?: number sm?: number
@ -31,22 +89,22 @@ export type ColProps = {
tag?: string tag?: string
} }
export type ComponentOptions = { export interface ComponentOptions extends Recordable {
label?: string label?: string
value?: FormValueType value?: FormValueType
disabled?: boolean disabled?: boolean
key?: string | number key?: string | number
children?: ComponentOptions[] children?: ComponentOptions[]
options?: ComponentOptions[] options?: ComponentOptions[]
} & Recordable }
export type ComponentOptionsAlias = { export interface ComponentOptionsAlias {
labelField?: string labelField?: string
valueField?: string valueField?: string
} }
export type ComponentProps = { export interface ComponentProps extends Recordable {
optionsAlias?: ComponentOptionsAlias optionsAlias?: ComponentOptionsAlias
options?: ComponentOptions[] options?: ComponentOptions[]
optionsSlot?: boolean optionsSlot?: boolean
} & Recordable }

17
src/types/form.d.ts vendored
View File

@ -1,5 +1,11 @@
import type { CSSProperties } from 'vue' import type { CSSProperties } from 'vue'
import { ColProps, ComponentProps, ComponentName } from '@/types/components' import {
ColProps,
ComponentProps,
ComponentName,
ComponentNameEnum,
InputComponentProps
} from '@/types/components'
import { FormValueType, FormValueType } from '@/types/form' import { FormValueType, FormValueType } from '@/types/form'
import type { AxiosPromise } from 'axios' import type { AxiosPromise } from 'axios'
@ -21,7 +27,7 @@ export type FormItemProps = {
style?: CSSProperties style?: CSSProperties
} }
export type FormSchema = { export interface FormSchema {
// 唯一值 // 唯一值
field: string field: string
// 标题 // 标题
@ -31,7 +37,12 @@ export type FormSchema = {
// col组件属性 // col组件属性
colProps?: ColProps colProps?: ColProps
// 表单组件属性slots对应的是表单组件的插槽规则${field}-xxx具体可以查看element-plus文档 // 表单组件属性slots对应的是表单组件的插槽规则${field}-xxx具体可以查看element-plus文档
componentProps?: { slots?: Recordable } & ComponentProps // componentProps?: { slots?: Recordable } & ComponentProps
/**
* slots对应的是表单组件的插槽${field}-xxxelement-plus文档
*/
componentProps?: InputComponentProps
// formItem组件属性 // formItem组件属性
formItemProps?: FormItemProps formItemProps?: FormItemProps
// 渲染的组件 // 渲染的组件

File diff suppressed because it is too large Load Diff

View File

@ -119,6 +119,13 @@ watch(
// //
const signIn = async () => { const signIn = async () => {
await permissionStore.generateRoutes('none').catch(() => {})
permissionStore.getAddRouters.forEach((route) => {
addRoute(route as RouteRecordRaw) // 访
})
permissionStore.setIsAddRouters(true)
push({ path: redirect.value || permissionStore.addRouters[0].path })
const formRef = unref(elFormRef) const formRef = unref(elFormRef)
await formRef?.validate(async (isValid) => { await formRef?.validate(async (isValid) => {
if (isValid) { if (isValid) {