Explorar el Código

feat: 添加文件上传限制
注册页面添加密码校验

carlos.pei hace 3 meses
padre
commit
d23d112131

+ 3 - 1
src/constants/pageConstants.ts

@@ -204,4 +204,6 @@ export enum HttpStatus {
   OK = 200,
   PARAM_ERROR = 400,
   INTERNAL_ERROR = 500,
-}
+}
+
+export const SUPPORT_FILE_UPLOAD_TYPE_MAX=".jpg,.jpeg,.png,.doc,.docx,.xls,.xlsx,.pptx,.pdf,.txt,.zip,.rar"

+ 9 - 0
src/models/common.ts

@@ -0,0 +1,9 @@
+export class RuleCheckResult {
+  isPassed: boolean
+  errorMsg?: string
+
+  constructor(isPassed: boolean, errorMsg?: string) {
+    this.isPassed = isPassed
+    this.errorMsg = errorMsg
+  }
+}

+ 19 - 0
src/utils/stringUtils.ts

@@ -0,0 +1,19 @@
+import { RuleCheckResult } from '/@/models/common'
+
+// 传入一段string 根据正则判断是否合法
+export const isPasswordValid = (value: string): RuleCheckResult => {
+  if (value == null || value == '') {
+    return new RuleCheckResult(
+      false,
+      '请填写密码',
+    )
+  }
+  if (/^[\w\S]{6,18}$/.test(value) && /[a-z]+/.test(value) && /[A-Z]+/.test(value) && /\d+/.test(value) && /[^a-zA-Z0-9]+/.test(value)) {
+    return new RuleCheckResult(true)
+  } else {
+    return new RuleCheckResult(
+      false,
+      '密码必须包含大小写字母、数字和特殊字符,长度在6~18之间',
+    )
+  }
+}

+ 7 - 1
src/view/animal/application/components/Application.vue

@@ -326,6 +326,7 @@
                 :action="uploadUrl"
                 :limit="1"
                 style="width: 100%"
+                :accept="state.SUPPORT_FILE_UPLOAD_TYPE_MAX"
                 :before-upload="beforeAvatarFileUpload"
                 :on-remove="() => handleRemove(UploadFileType.LICENSE_NUMBER)"
                 :on-success="(res: any, file: UploadFile) => handleSuccess(res, UploadFileType.LICENSE_NUMBER, file)"
@@ -358,6 +359,7 @@
                 :action="uploadUrl"
                 :limit="1"
                 style="width: 100%"
+                :accept="state.SUPPORT_FILE_UPLOAD_TYPE_MAX"
                 :before-upload="beforeAvatarFileUpload"
                 :on-remove="() => handleRemove(UploadFileType.ANIMAL_TEST_DATE)"
                 :on-success="(res: any, file: UploadFile) => handleSuccess(res, UploadFileType.ANIMAL_TEST_DATE, file)"
@@ -387,6 +389,7 @@
                 style="width: 100%"
                 :before-upload="beforeAvatarFileUpload"
                 :on-remove="() => handleRemove(UploadFileType.ENV_TEST_DATE)"
+                :accept="state.SUPPORT_FILE_UPLOAD_TYPE_MAX"
                 :on-success="(res: any, file: UploadFile) => handleSuccess(res, UploadFileType.ENV_TEST_DATE, file)"
               >
                 <el-button type="primary">点击上传</el-button>
@@ -487,6 +490,7 @@
                 style="width: 100%"
                 :before-upload="beforeAvatarFileUpload"
                 :on-remove="() => handleRemove(UploadFileType.ETHICS_CHECK_FILE)"
+                :accept="state.SUPPORT_FILE_UPLOAD_TYPE_MAX"
                 :on-success="(res: any, file: UploadFile) => handleSuccess(res, UploadFileType.ETHICS_CHECK_FILE, file)"
               >
                 <el-button type="primary">点击上传</el-button>
@@ -513,6 +517,7 @@
                 style="width: 100%"
                 :before-upload="beforeAvatarFileUpload"
                 :on-remove="() => handleRemove(UploadFileType.ETHICS_ADVICE_FILE)"
+                :accept="state.SUPPORT_FILE_UPLOAD_TYPE_MAX"
                 :on-success="(res: any, file: UploadFile) => handleSuccess(res, UploadFileType.ETHICS_ADVICE_FILE, file)"
               >
                 <el-button type="primary">点击上传</el-button>
@@ -562,7 +567,7 @@
   import dayjs from 'dayjs'
   import { storeToRefs } from 'pinia'
   import { usePlatAnimalCageApplicationApi } from '/@/api/platform/animal'
-  import { LeavelList } from '/@/constants/pageConstants'
+  import { LeavelList, SUPPORT_FILE_UPLOAD_TYPE_MAX } from '/@/constants/pageConstants'
   import { deepClone } from '/@/utils/other'
   import { useUserInfo } from '/@/stores/userInfo'
   import { ProcurementChannels, FeedingSpecial, UploadFileType } from '/@/constants/pageConstants'
@@ -606,6 +611,7 @@
   const safePromise = ref<boolean>(false)
   const animalTypeList = ref<any[]>([])
   const state = reactive({
+    SUPPORT_FILE_UPLOAD_TYPE_MAX,
     form: {
       projectGroupName: '',
       projectGroupId: null,

+ 6 - 3
src/view/entry/components/upload.vue

@@ -10,14 +10,15 @@
 				</div>
 				<h4 class="mb8 mt8">信息上传</h4>
 				<el-form-item label="缴费单" prop="billList">
-					<el-upload :action="uploadUrl" :on-success="billSuccess" :limit="1" clearable class="w100" v-model:file-list="state.form.billList">
+					<el-upload :accept="state.SUPPORT_FILE_UPLOAD_TYPE_MAX" :action="uploadUrl" :on-success="billSuccess" :limit="1" clearable class="w100" v-model:file-list="state.form.billList" >
 						<template #trigger>
 							<el-button type="primary">点击上传</el-button>
 						</template>
 					</el-upload>
 				</el-form-item>
 				<el-form-item label="其它附件" prop="group">
-					<el-upload :action="uploadUrl" :on-success="otherSuccess" clearable class="w100" v-model:file-list="state.form.fileList">
+					<el-upload
+            :accept="state.SUPPORT_FILE_UPLOAD_TYPE_MAX" :action="uploadUrl" :on-success="otherSuccess" clearable class="w100" v-model:file-list="state.form.fileList">
 						<template #trigger>
 							<el-button type="primary">点击上传</el-button>
 						</template>
@@ -45,6 +46,7 @@ import { deepClone } from '/@/utils/other';
 import { useUserInfo } from '/@/stores/userInfo';
 import { storeToRefs } from 'pinia';
 import { useDictApi } from '/@/api/base/system/dict';
+import { SUPPORT_FILE_UPLOAD_TYPE_MAX } from '/@/constants/pageConstants'
 
 const stores = useUserInfo();
 const { userInfos } = storeToRefs(stores);
@@ -69,7 +71,8 @@ const rules = {
 	billList: { required: true, message: '不能为空', trigger: 'change' },
 };
 const state = reactive({
-	form: {
+  SUPPORT_FILE_UPLOAD_TYPE_MAX,
+  form: {
 		id: 0,
 		appointId: 0,
     platformType: '',

+ 11 - 2
src/view/register/index.vue

@@ -49,14 +49,14 @@
             type="password"
             label="密码"
             placeholder="密码"
-            :rules="[{ required: true, message: '请填写密码' }]"
+            :rules="[{ required: true, validator: checkPassword, }]"
           />
           <van-field
             v-model="state.form.confirmPassword"
             type="password"
             label="确认密码"
             placeholder="确认密码"
-            :rules="[{ required: true, validator: checkPassword, message: '两次输入的密码不一致' }]"
+            :rules="[{ required: true, validator: confirmPasswordSame, message: '两次输入的密码不一致' }]"
           />
         </van-cell-group>
       </van-form>
@@ -427,6 +427,7 @@
   import { showNotify } from 'vant'
 
   import { UserTypeTooltip } from '/@/constants/pageConstants'
+  import { isPasswordValid } from '/@/utils/stringUtils'
 
   const sm3 = crypto.sm3
   const loginApi = useLoginApi()
@@ -579,7 +580,15 @@
       state.active++
     }
   }
+
   const checkPassword = (value: any) => {
+    let checkResult = isPasswordValid(value)
+    if(!checkResult.isPassed){
+      return checkResult.errorMsg
+    }
+  }
+
+  const confirmPasswordSame = (value: any) => {
     if (!value) {
       return false
     } else if (value !== state.form.password) {

+ 3 - 0
src/view/todo/component/approveTasks.vue

@@ -27,6 +27,7 @@
             </el-form-item>
             <el-form-item v-show="state.taskDetail.isFile && state.form.approveResult === 'pass'" label="附件" prop="fileList">
               <el-upload
+                :accept="state.SUPPORT_FILE_UPLOAD_TYPE_MAX"
                 ref="upload"
                 :file-list="state.form.fileList"
                 :action="uploadUrl"
@@ -61,6 +62,7 @@
   import type { UploadFile, UploadUserFile, UploadProps, UploadRawFile } from 'element-plus'
   import { genFileId } from 'element-plus'
   import { Session } from '/@/utils/storage'
+  import { SUPPORT_FILE_UPLOAD_TYPE_MAX } from '/@/constants/pageConstants'
 
   // 定义变量内容
   const uploadUrl = import.meta.env.VITE_UPLOAD
@@ -78,6 +80,7 @@
   })
   const idList = ref<number[]>([])
   const state = reactive<any>({
+    SUPPORT_FILE_UPLOAD_TYPE_MAX,
     taskDetail: {},
     detail: {},
     form: {