diff --git a/src/utils/regular-utils.ts b/src/utils/regular-utils.ts index 44f388ef..b006be79 100644 --- a/src/utils/regular-utils.ts +++ b/src/utils/regular-utils.ts @@ -28,7 +28,8 @@ export const regExpUserName = /^[a-zA-Z][a-z0-9A-Z]{4,}$/; * * 密码至少包含大小写字母、数字、特殊符号,且不少于6位 */ -export const regExpPasswd = /^(?![A-Za-z0-9]+$)(?![a-z0-9\W]+$)(?![A-Za-z\W]+$)(?![A-Z0-9\W]+$)[a-zA-Z0-9\W]{6,}$/; +export const regExpPasswd = + /^(?![A-Za-z0-9]+$)(?![a-z0-9\W]+$)(?![A-Za-z\W]+$)(?![A-Z0-9\W]+$)[a-zA-Z0-9\W]{6,}$/; /** * 有效手机号格式 @@ -63,6 +64,44 @@ export function validHttp(link: string): boolean { return regExpHttp.test(link); } +/** + * 判断是否有效URL地址 + * @param str 网络链接 + * @returns true | false + */ +export function validURL(str: string) { + if ( + str === '' || + str.length >= 2083 || + str.length <= 3 || + str.startsWith('.') + ) { + return false; + } + let strTemp = str; + if (str.includes(':') && !str.includes('://')) { + // support no indicated urlscheme but with colon for port number + // http:// is appended so url.Parse will succeed, strTemp used so it does not impact rxURL.MatchString + strTemp = 'http://' + str; + } + debugger; + try { + new URL(strTemp); + } catch (error) { + return false; + } + const u = new URL(strTemp); + if (u.host.startsWith('.')) { + return false; + } + if (u.host === '' && u.pathname !== '' && !u.pathname.includes('.')) { + return false; + } + + // 正则表达式模式(rxURL)未提供,无法进行具体判断 + return true; +} + /** * 判断是否为有效手机号格式 * @param mobile 手机号字符串 diff --git a/src/views/configManage/configParamTreeTable/index.vue b/src/views/configManage/configParamTreeTable/index.vue index dafb3756..76f9109c 100644 --- a/src/views/configManage/configParamTreeTable/index.vue +++ b/src/views/configManage/configParamTreeTable/index.vue @@ -13,7 +13,7 @@ import { addParamConfigInfo, } from '@/api/configManage/configParam'; import useNeInfoStore from '@/store/modules/neinfo'; -import { regExpIPv4, regExpIPv6 } from '@/utils/regular-utils'; +import { regExpIPv4, regExpIPv6, validURL } from '@/utils/regular-utils'; import { SizeType } from 'ant-design-vue/lib/config-provider'; import { DataNode } from 'ant-design-vue/lib/tree'; const neInfoStore = useNeInfoStore(); @@ -933,7 +933,6 @@ function ruleVerification(row: Record): (string | boolean)[] { if (row.optional === 'true' && !value) { return result; } - switch (type) { case 'int': if (filter && filter.indexOf('~') !== -1) { @@ -1003,6 +1002,7 @@ function ruleVerification(row: Record): (string | boolean)[] { } break; case 'string': + // 字符串长度判断 if (filter && filter.indexOf('~') !== -1) { try { const filterArr = filter.split('~'); @@ -1021,12 +1021,28 @@ function ruleVerification(row: Record): (string | boolean)[] { console.error(error); } } + // 字符串http判断 + if (value.startsWith('http')) { + try { + if (!validURL(value)) { + return [ + false, + t('views.configManage.configParamForm.requireString', { + display, + }), + ]; + } + } catch (error) { + console.error(error); + } + } break; case 'regex': if (filter) { try { let regex = new RegExp(filter); + console.log(regex, regex.test(value)); if (!regex.test(value)) { return [ false,