Procházet zdrojové kódy

feat: 新增必填验证

lixuan před 3 týdny
rodič
revize
6820362cae

+ 117 - 33
apps/web-velofex/src/views/dashboard/application-management/application-modal.vue

@@ -339,6 +339,79 @@ function handleLogoUpload(info: any) {
 }
 
 async function handleSave() {
+  if (!formData.value.fileId) {
+    message.error($t('applicationManagement.modal.uploadLogo'));
+    return;
+  }
+
+  if (!formData.value.partner) {
+    message.error($t('applicationManagement.modal.selectPartner'));
+    return;
+  }
+
+  if (!formData.value.projectCode) {
+    message.error($t('applicationManagement.modal.enterProjectCode'));
+    return;
+  }
+
+  if (!formData.value.nameCn) {
+    message.error($t('applicationManagement.modal.enterProjectName'));
+    return;
+  }
+
+  if (!formData.value.nameEn) {
+    message.error($t('applicationManagement.modal.enterProjectName'));
+    return;
+  }
+
+  if (
+    formData.value.processCount === undefined ||
+    formData.value.processCount === null
+  ) {
+    message.error($t('applicationManagement.modal.processCount'));
+    return;
+  }
+
+  if (
+    formData.value.pageCount === undefined ||
+    formData.value.pageCount === null
+  ) {
+    message.error($t('applicationManagement.modal.pageCount'));
+    return;
+  }
+
+  if (
+    formData.value.tableCount === undefined ||
+    formData.value.tableCount === null
+  ) {
+    message.error($t('applicationManagement.modal.tableCount'));
+    return;
+  }
+
+  if (
+    formData.value.designerCount === undefined ||
+    formData.value.designerCount === null
+  ) {
+    message.error($t('applicationManagement.modal.designerCount'));
+    return;
+  }
+
+  if (
+    formData.value.scenarioCount === undefined ||
+    formData.value.scenarioCount === null
+  ) {
+    message.error($t('applicationManagement.modal.scenarioCount'));
+    return;
+  }
+
+  if (
+    formData.value.userCount === undefined ||
+    formData.value.userCount === null
+  ) {
+    message.error($t('applicationManagement.modal.userCount'));
+    return;
+  }
+
   const data = {
     id: formData.value.id,
     langNameList: [
@@ -553,9 +626,10 @@ function resetFormData() {
         <div v-show="activeMenu === 'basic'" class="space-y-4">
           <div class="flex items-center gap-4">
             <div class="flex flex-col gap-2">
-              <label class="text-sm font-medium">{{
-                $t('applicationManagement.modal.enterpriseLogo')
-              }}</label>
+              <label class="text-sm font-medium">
+                {{ $t('applicationManagement.modal.enterpriseLogo') }}
+                <span class="text-red-500">*</span>
+              </label>
               <Upload
                 v-model:file-list="formData.fileList"
                 :action="`/fileApi/File/UploadFiles?Authorization=${token}`"
@@ -580,9 +654,10 @@ function resetFormData() {
 
           <div class="grid grid-cols-2 gap-4">
             <div class="flex flex-col gap-2">
-              <label class="text-sm font-medium">{{
-                $t('applicationManagement.modal.partner')
-              }}</label>
+              <label class="text-sm font-medium">
+                {{ $t('applicationManagement.modal.partner') }}
+                <span class="text-red-500">*</span>
+              </label>
               <Select
                 v-model:value="formData.partner"
                 :disabled="props.mode === 'edit'"
@@ -592,9 +667,10 @@ function resetFormData() {
               />
             </div>
             <div class="flex flex-col gap-2">
-              <label class="text-sm font-medium">{{
-                $t('applicationManagement.modal.projectCode')
-              }}</label>
+              <label class="text-sm font-medium">
+                {{ $t('applicationManagement.modal.projectCode') }}
+                <span class="text-red-500">*</span>
+              </label>
               <Input
                 v-model:value="formData.projectCode"
                 :disabled="props.mode === 'edit'"
@@ -618,9 +694,10 @@ function resetFormData() {
               />
             </div>
             <div class="flex flex-col gap-2">
-              <label class="text-sm font-medium">{{
-                $t('applicationManagement.modal.projectNameCn')
-              }}</label>
+              <label class="text-sm font-medium">
+                {{ $t('applicationManagement.modal.projectNameCn') }}
+                <span class="text-red-500">*</span>
+              </label>
               <Input
                 v-model:value="formData.nameCn"
                 :placeholder="
@@ -629,9 +706,10 @@ function resetFormData() {
               />
             </div>
             <div class="flex flex-col gap-2">
-              <label class="text-sm font-medium">{{
-                $t('applicationManagement.modal.projectNameEn')
-              }}</label>
+              <label class="text-sm font-medium">
+                {{ $t('applicationManagement.modal.projectNameEn') }}
+                <span class="text-red-500">*</span>
+              </label>
               <Input
                 v-model:value="formData.nameEn"
                 :placeholder="
@@ -718,39 +796,45 @@ function resetFormData() {
               />
             </div>
             <div class="flex flex-col gap-2">
-              <label class="text-sm font-medium">{{
-                $t('applicationManagement.modal.processCount')
-              }}</label>
+              <label class="text-sm font-medium">
+                {{ $t('applicationManagement.modal.processCount') }}
+                <span class="text-red-500">*</span>
+              </label>
               <Input v-model:value="formData.processCount" type="number" />
             </div>
             <div class="flex flex-col gap-2">
-              <label class="text-sm font-medium">{{
-                $t('applicationManagement.modal.pageCount')
-              }}</label>
+              <label class="text-sm font-medium">
+                {{ $t('applicationManagement.modal.pageCount') }}
+                <span class="text-red-500">*</span>
+              </label>
               <Input v-model:value="formData.pageCount" type="number" />
             </div>
             <div class="flex flex-col gap-2">
-              <label class="text-sm font-medium">{{
-                $t('applicationManagement.modal.tableCount')
-              }}</label>
+              <label class="text-sm font-medium">
+                {{ $t('applicationManagement.modal.tableCount') }}
+                <span class="text-red-500">*</span>
+              </label>
               <Input v-model:value="formData.tableCount" type="number" />
             </div>
             <div class="flex flex-col gap-2">
-              <label class="text-sm font-medium">{{
-                $t('applicationManagement.modal.designerCount')
-              }}</label>
+              <label class="text-sm font-medium">
+                {{ $t('applicationManagement.modal.designerCount') }}
+                <span class="text-red-500">*</span>
+              </label>
               <Input v-model:value="formData.designerCount" type="number" />
             </div>
             <div class="flex flex-col gap-2">
-              <label class="text-sm font-medium">{{
-                $t('applicationManagement.modal.scenarioCount')
-              }}</label>
+              <label class="text-sm font-medium">
+                {{ $t('applicationManagement.modal.scenarioCount') }}
+                <span class="text-red-500">*</span>
+              </label>
               <Input v-model:value="formData.scenarioCount" type="number" />
             </div>
             <div class="flex flex-col gap-2">
-              <label class="text-sm font-medium">{{
-                $t('applicationManagement.modal.userCount')
-              }}</label>
+              <label class="text-sm font-medium">
+                {{ $t('applicationManagement.modal.userCount') }}
+                <span class="text-red-500">*</span>
+              </label>
               <Input v-model:value="formData.userCount" type="number" />
             </div>
           </div>

+ 79 - 31
apps/web-velofex/src/views/dashboard/delivery-partners/delivery-partners-modal.vue

@@ -173,6 +173,46 @@ function handleMenuClick({
 }
 
 async function handleSave() {
+  if (!formData.value.chineseName) {
+    message.error($t('deliveryPartners.modal.enterChineseName'));
+    return;
+  }
+
+  if (!formData.value.englishName) {
+    message.error($t('deliveryPartners.modal.enterEnglishName'));
+    return;
+  }
+
+  if (!formData.value.account) {
+    message.error($t('deliveryPartners.modal.enterAccount'));
+    return;
+  }
+
+  if (!formData.value.cellPhone) {
+    message.error($t('deliveryPartners.modal.enterCellPhone'));
+    return;
+  }
+
+  if (!formData.value.emailAddress) {
+    message.error($t('deliveryPartners.modal.enterEmailAddress'));
+    return;
+  }
+
+  if (!formData.value.gogs_email) {
+    message.error($t('deliveryPartners.modal.enterGogsEmail'));
+    return;
+  }
+
+  if (!formData.value.expiredTime) {
+    message.error($t('deliveryPartners.modal.selectExpiredTime'));
+    return;
+  }
+
+  if (props.mode === 'add' && !formData.value.password) {
+    message.error($t('deliveryPartners.modal.enterPassword'));
+    return;
+  }
+
   const data = {
     id: formData.value.id,
     langNameList: [
@@ -323,64 +363,82 @@ function resetFormData() {
         <div v-show="activeMenu === 'basic'" class="space-y-4">
           <div class="grid grid-cols-2 gap-4">
             <div class="flex flex-col gap-2">
-              <label class="text-sm font-medium">{{
-                $t('deliveryPartners.modal.chineseName')
-              }}</label>
+              <label class="text-sm font-medium">
+                {{ $t('deliveryPartners.modal.chineseName') }}
+                <span class="text-red-500">*</span>
+              </label>
               <Input
                 v-model:value="formData.chineseName"
                 :placeholder="$t('deliveryPartners.modal.enterChineseName')"
               />
             </div>
             <div class="flex flex-col gap-2">
-              <label class="text-sm font-medium">{{
-                $t('deliveryPartners.modal.englishName')
-              }}</label>
+              <label class="text-sm font-medium">
+                {{ $t('deliveryPartners.modal.englishName') }}
+                <span class="text-red-500">*</span>
+              </label>
               <Input
                 v-model:value="formData.englishName"
                 :placeholder="$t('deliveryPartners.modal.enterEnglishName')"
               />
             </div>
             <div class="flex flex-col gap-2">
-              <label class="text-sm font-medium">{{
-                $t('deliveryPartners.modal.account')
-              }}</label>
+              <label class="text-sm font-medium">
+                {{ $t('deliveryPartners.modal.account') }}
+                <span class="text-red-500">*</span>
+              </label>
               <Input
                 v-model:value="formData.account"
                 :disabled="props.mode === 'edit'"
                 :placeholder="$t('deliveryPartners.modal.enterAccount')"
               />
             </div>
+            <div v-if="props.mode === 'add'" class="flex flex-col gap-2">
+              <label class="text-sm font-medium">
+                {{ $t('deliveryPartners.modal.password') }}
+                <span class="text-red-500">*</span>
+              </label>
+              <Input
+                v-model:value="formData.password"
+                :placeholder="$t('deliveryPartners.modal.enterPassword')"
+                type="password"
+              />
+            </div>
             <div class="flex flex-col gap-2">
-              <label class="text-sm font-medium">{{
-                $t('deliveryPartners.modal.cellPhone')
-              }}</label>
+              <label class="text-sm font-medium">
+                {{ $t('deliveryPartners.modal.cellPhone') }}
+                <span class="text-red-500">*</span>
+              </label>
               <Input
                 v-model:value="formData.cellPhone"
                 :placeholder="$t('deliveryPartners.modal.enterCellPhone')"
               />
             </div>
             <div class="flex flex-col gap-2">
-              <label class="text-sm font-medium">{{
-                $t('deliveryPartners.modal.emailAddress')
-              }}</label>
+              <label class="text-sm font-medium">
+                {{ $t('deliveryPartners.modal.emailAddress') }}
+                <span class="text-red-500">*</span>
+              </label>
               <Input
                 v-model:value="formData.emailAddress"
                 :placeholder="$t('deliveryPartners.modal.enterEmailAddress')"
               />
             </div>
             <div class="flex flex-col gap-2">
-              <label class="text-sm font-medium">{{
-                $t('deliveryPartners.modal.gogsEmail')
-              }}</label>
+              <label class="text-sm font-medium">
+                {{ $t('deliveryPartners.modal.gogsEmail') }}
+                <span class="text-red-500">*</span>
+              </label>
               <Input
                 v-model:value="formData.gogs_email"
                 :placeholder="$t('deliveryPartners.modal.enterGogsEmail')"
               />
             </div>
             <div class="flex flex-col gap-2">
-              <label class="text-sm font-medium">{{
-                $t('deliveryPartners.modal.expiredTime')
-              }}</label>
+              <label class="text-sm font-medium">
+                {{ $t('deliveryPartners.modal.expiredTime') }}
+                <span class="text-red-500">*</span>
+              </label>
               <DatePicker
                 v-model:value="formData.expiredTime"
                 :placeholder="$t('deliveryPartners.modal.selectExpiredTime')"
@@ -394,16 +452,6 @@ function resetFormData() {
               }}</label>
               <Switch v-model:checked="formData.isActive" class="w-[40px]" />
             </div>
-            <div v-if="props.mode === 'add'" class="flex flex-col gap-2">
-              <label class="text-sm font-medium">{{
-                $t('deliveryPartners.modal.password')
-              }}</label>
-              <Input
-                v-model:value="formData.password"
-                :placeholder="$t('deliveryPartners.modal.enterPassword')"
-                type="password"
-              />
-            </div>
           </div>
         </div>
 

+ 27 - 9
apps/web-velofex/src/views/dashboard/enterprise-customers/enterprise-customers-modal.vue

@@ -82,6 +82,21 @@ function handleLogoUpload(info: any) {
 }
 
 async function handleSave() {
+  if (!formData.value.fileId) {
+    message.error($t('enterpriseCustomers.modal.uploadLogo'));
+    return;
+  }
+
+  if (!formData.value.code) {
+    message.error($t('enterpriseCustomers.modal.enterCustomerCode'));
+    return;
+  }
+
+  if (!formData.value.name) {
+    message.error($t('enterpriseCustomers.modal.enterCustomerName'));
+    return;
+  }
+
   const data = {
     id: formData.value.id,
     fileId: formData.value.fileId,
@@ -145,9 +160,10 @@ function resetFormData() {
       <div class="space-y-6">
         <div class="flex items-center gap-4">
           <div class="flex flex-col gap-2">
-            <label class="text-sm font-medium">{{
-              $t('enterpriseCustomers.modal.enterpriseLogo')
-            }}</label>
+            <label class="text-sm font-medium">
+              {{ $t('enterpriseCustomers.modal.enterpriseLogo') }}
+              <span class="text-red-500">*</span>
+            </label>
             <Upload
               v-model:file-list="formData.fileList"
               :action="`/fileApi/File/UploadFiles?Authorization=${token}`"
@@ -172,9 +188,10 @@ function resetFormData() {
 
         <div class="grid grid-cols-2 gap-6">
           <div class="flex flex-col gap-2">
-            <label class="text-sm font-medium">{{
-              $t('enterpriseCustomers.modal.customerCode')
-            }}</label>
+            <label class="text-sm font-medium">
+              {{ $t('enterpriseCustomers.modal.customerCode') }}
+              <span class="text-red-500">*</span>
+            </label>
             <Input
               v-model:value="formData.code"
               :disabled="props.mode === 'edit'"
@@ -182,9 +199,10 @@ function resetFormData() {
             />
           </div>
           <div class="flex flex-col gap-2">
-            <label class="text-sm font-medium">{{
-              $t('enterpriseCustomers.modal.customerName')
-            }}</label>
+            <label class="text-sm font-medium">
+              {{ $t('enterpriseCustomers.modal.customerName') }}
+              <span class="text-red-500">*</span>
+            </label>
             <Input
               v-model:value="formData.name"
               :placeholder="$t('enterpriseCustomers.modal.enterCustomerName')"

+ 138 - 39
apps/web-velofex/src/views/dashboard/sales-partners/sales-partners-modal.vue

@@ -160,6 +160,92 @@ function handleLogoUpload(info: any) {
 }
 
 async function handleSave() {
+  if (!formData.value.fileId) {
+    message.error($t('salesPartners.modal.uploadLogo'));
+    return;
+  }
+
+  if (!formData.value.account) {
+    message.error($t('salesPartners.modal.enterAccount'));
+    return;
+  }
+
+  if (props.mode === 'add' && !formData.value.password) {
+    message.error($t('salesPartners.modal.enterPassword'));
+    return;
+  }
+
+  if (!formData.value.nameCn) {
+    message.error($t('salesPartners.modal.enterName'));
+    return;
+  }
+
+  if (!formData.value.nameEn) {
+    message.error($t('salesPartners.modal.enterName'));
+    return;
+  }
+
+  if (!formData.value.expiredTime) {
+    message.error($t('salesPartners.modal.selectExpiredTime'));
+    return;
+  }
+
+  if (
+    formData.value.number0fEnterprise === undefined ||
+    formData.value.number0fEnterprise === null
+  ) {
+    message.error($t('salesPartners.modal.number0fEnterprise'));
+    return;
+  }
+
+  if (
+    formData.value.number0fWorkFlow === undefined ||
+    formData.value.number0fWorkFlow === null
+  ) {
+    message.error($t('salesPartners.modal.number0fWorkFlow'));
+    return;
+  }
+
+  if (
+    formData.value.number0fPages === undefined ||
+    formData.value.number0fPages === null
+  ) {
+    message.error($t('salesPartners.modal.number0fPages'));
+    return;
+  }
+
+  if (
+    formData.value.number0fTables === undefined ||
+    formData.value.number0fTables === null
+  ) {
+    message.error($t('salesPartners.modal.number0fTables'));
+    return;
+  }
+
+  if (
+    formData.value.number0fDesigners === undefined ||
+    formData.value.number0fDesigners === null
+  ) {
+    message.error($t('salesPartners.modal.number0fDesigners'));
+    return;
+  }
+
+  if (
+    formData.value.number0fBusinessScenarios === undefined ||
+    formData.value.number0fBusinessScenarios === null
+  ) {
+    message.error($t('salesPartners.modal.number0fBusinessScenarios'));
+    return;
+  }
+
+  if (
+    formData.value.number0fCSiteMaxUser === undefined ||
+    formData.value.number0fCSiteMaxUser === null
+  ) {
+    message.error($t('salesPartners.modal.number0fCSiteMaxUser'));
+    return;
+  }
+
   const data = {
     id: formData.value.id,
     langNameList: [
@@ -230,9 +316,10 @@ function handleCancel() {
         <div class="space-y-4">
           <div class="flex items-center gap-4">
             <div class="flex flex-col gap-2">
-              <label class="text-sm font-medium">{{
-                $t('salesPartners.modal.enterpriseLogo')
-              }}</label>
+              <label class="text-sm font-medium">
+                {{ $t('salesPartners.modal.enterpriseLogo') }}
+                <span class="text-red-500">*</span>
+              </label>
               <Upload
                 v-model:file-list="formData.fileList"
                 :action="`/fileApi/File/UploadFiles?Authorization=${token}`"
@@ -257,45 +344,50 @@ function handleCancel() {
 
           <div class="grid grid-cols-2 gap-4">
             <div class="flex flex-col gap-2">
-              <label class="text-sm font-medium">{{
-                $t('salesPartners.modal.account')
-              }}</label>
+              <label class="text-sm font-medium">
+                {{ $t('salesPartners.modal.account') }}
+                <span class="text-red-500">*</span>
+              </label>
               <Input
                 v-model:value="formData.account"
                 :placeholder="$t('salesPartners.modal.enterAccount')"
               />
             </div>
             <div v-if="mode === 'add'" class="flex flex-col gap-2">
-              <label class="text-sm font-medium">{{
-                $t('salesPartners.modal.password')
-              }}</label>
+              <label class="text-sm font-medium">
+                {{ $t('salesPartners.modal.password') }}
+                <span class="text-red-500">*</span>
+              </label>
               <Input
                 v-model:value="formData.password"
                 :placeholder="$t('salesPartners.modal.enterPassword')"
               />
             </div>
             <div class="flex flex-col gap-2">
-              <label class="text-sm font-medium">{{
-                $t('salesPartners.modal.nameCn')
-              }}</label>
+              <label class="text-sm font-medium">
+                {{ $t('salesPartners.modal.nameCn') }}
+                <span class="text-red-500">*</span>
+              </label>
               <Input
                 v-model:value="formData.nameCn"
                 :placeholder="$t('salesPartners.modal.enterName')"
               />
             </div>
             <div class="flex flex-col gap-2">
-              <label class="text-sm font-medium">{{
-                $t('salesPartners.modal.nameEn')
-              }}</label>
+              <label class="text-sm font-medium">
+                {{ $t('salesPartners.modal.nameEn') }}
+                <span class="text-red-500">*</span>
+              </label>
               <Input
                 v-model:value="formData.nameEn"
                 :placeholder="$t('salesPartners.modal.enterName')"
               />
             </div>
             <div class="flex flex-col gap-2">
-              <label class="text-sm font-medium">{{
-                $t('salesPartners.modal.expiredTime')
-              }}</label>
+              <label class="text-sm font-medium">
+                {{ $t('salesPartners.modal.expiredTime') }}
+                <span class="text-red-500">*</span>
+              </label>
               <DatePicker
                 v-model:value="formData.expiredTime"
                 :placeholder="$t('salesPartners.modal.selectExpiredTime')"
@@ -310,51 +402,58 @@ function handleCancel() {
               <Switch v-model:checked="formData.isEnabled" class="w-[40px]" />
             </div>
             <div class="flex flex-col gap-2">
-              <label class="text-sm font-medium">{{
-                $t('salesPartners.modal.number0fEnterprise')
-              }}</label>
+              <label class="text-sm font-medium">
+                {{ $t('salesPartners.modal.number0fEnterprise') }}
+                <span class="text-red-500">*</span>
+              </label>
               <Input
                 v-model:value="formData.number0fEnterprise"
                 type="number"
               />
             </div>
             <div class="flex flex-col gap-2">
-              <label class="text-sm font-medium">{{
-                $t('salesPartners.modal.number0fWorkFlow')
-              }}</label>
+              <label class="text-sm font-medium">
+                {{ $t('salesPartners.modal.number0fWorkFlow') }}
+                <span class="text-red-500">*</span>
+              </label>
               <Input v-model:value="formData.number0fWorkFlow" type="number" />
             </div>
             <div class="flex flex-col gap-2">
-              <label class="text-sm font-medium">{{
-                $t('salesPartners.modal.number0fPages')
-              }}</label>
+              <label class="text-sm font-medium">
+                {{ $t('salesPartners.modal.number0fPages') }}
+                <span class="text-red-500">*</span>
+              </label>
               <Input v-model:value="formData.number0fPages" type="number" />
             </div>
             <div class="flex flex-col gap-2">
-              <label class="text-sm font-medium">{{
-                $t('salesPartners.modal.number0fTables')
-              }}</label>
+              <label class="text-sm font-medium">
+                {{ $t('salesPartners.modal.number0fTables') }}
+                <span class="text-red-500">*</span>
+              </label>
               <Input v-model:value="formData.number0fTables" type="number" />
             </div>
             <div class="flex flex-col gap-2">
-              <label class="text-sm font-medium">{{
-                $t('salesPartners.modal.number0fDesigners')
-              }}</label>
+              <label class="text-sm font-medium">
+                {{ $t('salesPartners.modal.number0fDesigners') }}
+                <span class="text-red-500">*</span>
+              </label>
               <Input v-model:value="formData.number0fDesigners" type="number" />
             </div>
             <div class="flex flex-col gap-2">
-              <label class="text-sm font-medium">{{
-                $t('salesPartners.modal.number0fBusinessScenarios')
-              }}</label>
+              <label class="text-sm font-medium">
+                {{ $t('salesPartners.modal.number0fBusinessScenarios') }}
+                <span class="text-red-500">*</span>
+              </label>
               <Input
                 v-model:value="formData.number0fBusinessScenarios"
                 type="number"
               />
             </div>
             <div class="flex flex-col gap-2">
-              <label class="text-sm font-medium">{{
-                $t('salesPartners.modal.number0fCSiteMaxUser')
-              }}</label>
+              <label class="text-sm font-medium">
+                {{ $t('salesPartners.modal.number0fCSiteMaxUser') }}
+                <span class="text-red-500">*</span>
+              </label>
               <Input
                 v-model:value="formData.number0fCSiteMaxUser"
                 type="number"