diff --git a/mock/role/index.mock.ts b/mock/role/index.mock.ts index 89f99ddea..1e33d93ae 100644 --- a/mock/role/index.mock.ts +++ b/mock/role/index.mock.ts @@ -332,6 +332,14 @@ const adminList = [ meta: { title: 'router.avatars' } + }, + { + path: 'i-agree', + component: 'views/Components/IAgree', + name: 'IAgree', + meta: { + title: 'router.iAgree' + } } ] }, @@ -695,6 +703,7 @@ const testList: string[] = [ '/components/image-cropping', '/components/video-player', '/components/avatars', + '/components/i-agree', 'function', '/function/multiple-tabs', '/function/multiple-tabs-demo/:id', diff --git a/src/components/Form/src/helper/componentMap.ts b/src/components/Form/src/helper/componentMap.ts index ec912ea26..df2714f77 100644 --- a/src/components/Form/src/helper/componentMap.ts +++ b/src/components/Form/src/helper/componentMap.ts @@ -24,6 +24,7 @@ import { InputPassword } from '@/components/InputPassword' import { Editor } from '@/components/Editor' import { JsonEditor } from '@/components/JsonEditor' import { IconPicker } from '@/components/IconPicker' +import { IAgree } from '@/components/IAgree' import { ComponentName } from '../types' const componentMap: Recordable = { @@ -51,7 +52,8 @@ const componentMap: Recordable = { TreeSelect: ElTreeSelect, Upload: ElUpload, JsonEditor: JsonEditor, - IconPicker: IconPicker + IconPicker: IconPicker, + IAgree: IAgree } export { componentMap } diff --git a/src/components/Form/src/types/index.ts b/src/components/Form/src/types/index.ts index 4261081e2..157b10061 100644 --- a/src/components/Form/src/types/index.ts +++ b/src/components/Form/src/types/index.ts @@ -22,6 +22,7 @@ import { } from 'element-plus' import { IEditorConfig } from '@wangeditor/editor' import { JsonEditorProps } from '@/components/JsonEditor' +import { IAgreeProps } from '@/components/IAgree' import { CSSProperties } from 'vue' export interface PlaceholderModel { @@ -56,7 +57,8 @@ export enum ComponentNameEnum { TREE_SELECT = 'TreeSelect', UPLOAD = 'Upload', JSON_EDITOR = 'JsonEditor', - ICON_PICKER = 'IconPicker' + ICON_PICKER = 'IconPicker', + I_AGREE = 'IAgree' } type CamelCaseComponentName = keyof typeof ComponentNameEnum extends infer K @@ -624,6 +626,7 @@ export interface FormSchema { | TreeSelectComponentProps | UploadComponentProps | JsonEditorProps + | IAgreeProps | any /** diff --git a/src/components/IAgree/index.ts b/src/components/IAgree/index.ts new file mode 100644 index 000000000..8c3112580 --- /dev/null +++ b/src/components/IAgree/index.ts @@ -0,0 +1,4 @@ +import IAgree from './src/IAgree.vue' + +export type { LinkItem, IAgreeProps } from './src/types' +export { IAgree } diff --git a/src/components/IAgree/src/IAgree.vue b/src/components/IAgree/src/IAgree.vue new file mode 100644 index 000000000..6a36e23a9 --- /dev/null +++ b/src/components/IAgree/src/IAgree.vue @@ -0,0 +1,41 @@ + + + diff --git a/src/components/IAgree/src/types/index.ts b/src/components/IAgree/src/types/index.ts new file mode 100644 index 000000000..9ddef757e --- /dev/null +++ b/src/components/IAgree/src/types/index.ts @@ -0,0 +1,10 @@ +export interface LinkItem { + text: string + url?: string + onClick?: () => void +} + +export interface IAgreeProps { + text: string + link: LinkItem[] +} diff --git a/src/hooks/web/useValidator.ts b/src/hooks/web/useValidator.ts index 55d227494..00586bdce 100644 --- a/src/hooks/web/useValidator.ts +++ b/src/hooks/web/useValidator.ts @@ -84,6 +84,18 @@ export const useValidator = () => { } } + const check = (message?: string): FormItemRule => { + return { + validator: (_, val, callback) => { + if (!val) { + callback(new Error(message || t('common.required'))) + } else { + callback() + } + } + } + } + return { required, lengthRange, @@ -91,6 +103,7 @@ export const useValidator = () => { notSpecialCharacters, phone, email, - maxlength + maxlength, + check } } diff --git a/src/locales/en.ts b/src/locales/en.ts index 2dcf0983e..c68a9d878 100644 --- a/src/locales/en.ts +++ b/src/locales/en.ts @@ -121,7 +121,8 @@ export default { usernamePlaceholder: 'Please input username', passwordPlaceholder: 'Please input password', code: 'Verification code', - codePlaceholder: 'Please input verification code' + codePlaceholder: 'Please input verification code', + getCode: 'Get code' }, router: { login: 'Login', @@ -187,7 +188,8 @@ export default { cardTable: 'Card table', personalCenter: 'Personal center', personal: 'Personal', - avatars: 'Avatars' + avatars: 'Avatars', + iAgree: 'I agree' }, permission: { hasPermission: 'Please set the operation permission value' @@ -334,7 +336,8 @@ export default { upload: 'Upload', // 用户头像 userAvatar: 'User avatar', - iconPicker: 'Icon picker' + iconPicker: 'Icon picker', + iAgree: 'I agree' }, guideDemo: { guide: 'Guide', diff --git a/src/locales/zh-CN.ts b/src/locales/zh-CN.ts index a78185d80..7d4cf7260 100644 --- a/src/locales/zh-CN.ts +++ b/src/locales/zh-CN.ts @@ -119,7 +119,8 @@ export default { usernamePlaceholder: '请输入用户名', passwordPlaceholder: '请输入密码', code: '验证码', - codePlaceholder: '请输入验证码' + codePlaceholder: '请输入验证码', + getCode: '获取验证码' }, router: { login: '登录', @@ -183,7 +184,8 @@ export default { cardTable: '卡片表格', personalCenter: '个人中心', personal: '个人', - avatars: '头像列表' + avatars: '头像列表', + iAgree: '我同意' }, permission: { hasPermission: '请设置操作权限值' @@ -327,7 +329,8 @@ export default { lazyLoad: '懒加载', upload: '上传', userAvatar: '用户头像', - iconPicker: '图标选择器' + iconPicker: '图标选择器', + iAgree: '我同意' }, guideDemo: { guide: '引导页', diff --git a/src/router/index.ts b/src/router/index.ts index 6440cd08b..51677789f 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -398,6 +398,14 @@ export const asyncRouterMap: AppRouteRecordRaw[] = [ meta: { title: t('router.avatars') } + }, + { + path: 'i-agree', + component: () => import('@/views/Components/IAgree.vue'), + name: 'IAgree', + meta: { + title: t('router.iAgree') + } } ] }, diff --git a/src/views/Components/Form/DefaultForm.vue b/src/views/Components/Form/DefaultForm.vue index 788c6f236..77428fd59 100644 --- a/src/views/Components/Form/DefaultForm.vue +++ b/src/views/Components/Form/DefaultForm.vue @@ -1785,6 +1785,25 @@ const schema = reactive([ component: 'IconPicker', label: t('formDemo.default'), value: 'tdesign:archway' + }, + { + field: 'field89', + component: 'Divider', + label: t('formDemo.iAgree') + }, + { + field: 'field90', + component: 'IAgree', + label: t('formDemo.default'), + componentProps: { + text: '我同意《用户协议》', + link: [ + { + text: '《用户协议》', + url: 'https://element-plus.org/' + } + ] + } } ]) diff --git a/src/views/Components/IAgree.vue b/src/views/Components/IAgree.vue new file mode 100644 index 000000000..947226bc9 --- /dev/null +++ b/src/views/Components/IAgree.vue @@ -0,0 +1,21 @@ + + + diff --git a/src/views/Login/components/RegisterForm.vue b/src/views/Login/components/RegisterForm.vue index 7278fc419..1f3d25183 100644 --- a/src/views/Login/components/RegisterForm.vue +++ b/src/views/Login/components/RegisterForm.vue @@ -1,11 +1,12 @@