Просмотр исходного кода

feat:修改上传组件,完善信息页面。

ljc 2 месяцев назад
Родитель
Сommit
cbdb1c3815

+ 31 - 4
components/cwg-file-picker.vue

@@ -2,9 +2,22 @@
     <view class="common-file-uploader" :class="customClass">
     <view class="common-file-uploader" :class="customClass">
         <!-- 编辑状态:显示可上传的文件选择器 -->
         <!-- 编辑状态:显示可上传的文件选择器 -->
         <view v-if="editable" class="upload-wrapper">
         <view v-if="editable" class="upload-wrapper">
-            <uni-file-picker :limit="multiple ? limit : 1" :title="title" :file-mediatype="fileMediatype" :mode="mode"
-                :auto-upload="false" :value="fileList" :disabled="disabled" :readonly="readonly"
-                :image-styles="imageStyles" :list-styles="listStyles"  :del-icon="showPreviewDelete"             @select="handleSelect" @delete=" handleDelete">
+            <uni-file-picker
+              :limit="multiple ? limit : 1"
+              :title="title"
+              :file-mediatype="fileMediatype"
+              :mode="mode"
+              :auto-upload="false"
+              :value="fileList"
+              :disabled="disabled"
+              :readonly="readonly"
+              :image-styles="imageStyles"
+              :list-styles="listStyles"
+              :del-icon="showPreviewDelete"
+              :disablePreview="disablePreview"
+              :canChoose="canChoose"
+              @select="handleSelect"
+              @delete="handleDelete">
                 <!-- 自定义上传按钮(单张图片且已有图片时显示替换) -->
                 <!-- 自定义上传按钮(单张图片且已有图片时显示替换) -->
                 <template v-if="$slots.default || showCustomButton">
                 <template v-if="$slots.default || showCustomButton">
                     <slot name="default">
                     <slot name="default">
@@ -31,7 +44,7 @@
             </view>
             </view>
 
 
             <!-- 上传错误提示 -->
             <!-- 上传错误提示 -->
-            <view v-if="uploadError" class="upload-error">
+            <view v-if="uploadError && showError" class="upload-error">
                 <text class="error-text">{{ uploadError }}</text>
                 <text class="error-text">{{ uploadError }}</text>
             </view>
             </view>
         </view>
         </view>
@@ -117,6 +130,14 @@ const props = defineProps({
         type: Boolean,
         type: Boolean,
         default: false
         default: false
     },
     },
+    disablePreview: {
+        type: Boolean,
+        default: false
+    },
+    canChoose: {
+        type: Boolean,
+        default: false
+    },
     readonly: {
     readonly: {
         type: Boolean,
         type: Boolean,
         default: false
         default: false
@@ -266,6 +287,12 @@ const props = defineProps({
     customStyles: {
     customStyles: {
         type: Object,
         type: Object,
         default: () => ({})
         default: () => ({})
+    },
+
+    // 展示错误信息
+    showError: {
+        type: Object,
+        default: true
     }
     }
 })
 })
 
 

+ 2 - 2
config/index.ts

@@ -11,11 +11,11 @@ let ho = '44a5c8109e4'; // 默认主域名或可根据实际APP环境配置
 const config = {
 const config = {
 
 
   HostWs: "wss://ws." + ho + ".com",
   HostWs: "wss://ws." + ho + ".com",
-  // Host80: ht + "//secure." + ho + ".com",
+  Host80: ht + "//secure." + ho + ".com",
   // Host00: ht + "//ucard." + ho + ".com",
   // Host00: ht + "//ucard." + ho + ".com",
   // Host85: ht + "//ucard." + ho + ".com",
   // Host85: ht + "//ucard." + ho + ".com",
   // Host04: ht + "//pay." + ho + ".com",
   // Host04: ht + "//pay." + ho + ".com",
-  Host80: 'http://192.168.0.21:8000',
+  // Host80: 'http://192.168.0.21:8000',
   Host00: 'http://192.168.0.21:8000',
   Host00: 'http://192.168.0.21:8000',
   Host85: 'http://192.168.0.21:8000',
   Host85: 'http://192.168.0.21:8000',
   Host04: 'http://192.168.0.21:8004',
   Host04: 'http://192.168.0.21:8004',

+ 455 - 58
pages/mine/improveImmediately.vue

@@ -87,10 +87,15 @@
             <uni-col :span="24">
             <uni-col :span="24">
               <view class="crm-title-box">
               <view class="crm-title-box">
                 <text class="tit">{{ t('ImproveImmediately.Title.AddressInformation') }}</text>
                 <text class="tit">{{ t('ImproveImmediately.Title.AddressInformation') }}</text>
-                <uni-popup ref="addressTipPopup" type="center">
-                  <view class="popup-content">{{ t('ImproveImmediately.Title.AddressTip') }}</view>
-                </uni-popup>
-                <text class="icon-tip" @click="openAddressTip">ⓘ</text>
+                <uni-tooltip placement="top">
+                  <text class="icon-tip">ⓘ</text>
+                  <template v-slot:content>
+                    <view class="address-tip">
+                      {{ t('ImproveImmediately.Title.AddressTip') }}
+                    </view>
+                  </template>
+                </uni-tooltip>
+
               </view>
               </view>
             </uni-col>
             </uni-col>
 
 
@@ -218,9 +223,21 @@
         </view>
         </view>
         <!-- 第三步:身份证明 -->
         <!-- 第三步:身份证明 -->
         <view v-show="currentStep === 3" class="form-section">
         <view v-show="currentStep === 3" class="form-section">
-          <h3 class="section-title">{{ t('ImproveImmediately.Title.ProofIdentityUpdate') }}</h3>
+
           <uni-row class="demo-uni-row uni-row1">
           <uni-row class="demo-uni-row uni-row1">
             <uni-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
             <uni-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
+              <view class="crm-title-box">
+                <text class="tit">{{ t('ImproveImmediately.Title.ProofIdentityUpdate') }}</text>
+                <uni-tooltip placement="bottom">
+                  <text class="icon-tip">ⓘ</text>
+                  <template v-slot:content>
+                    <view class="address-tip">
+                      {{ t('ImproveImmediately.Content.popover1') }}
+                    </view>
+                  </template>
+                </uni-tooltip>
+
+              </view>
               <uni-forms-item name="cardType" :label="t('ImproveImmediately.Label.CardType')">
               <uni-forms-item name="cardType" :label="t('ImproveImmediately.Label.CardType')">
                 <cwg-combox :clearable="false" v-model:value="formData.cardType"
                 <cwg-combox :clearable="false" v-model:value="formData.cardType"
                             :options="cardTypeOptions" :placeholder="t('placeholder.choose')" />
                             :options="cardTypeOptions" :placeholder="t('placeholder.choose')" />
@@ -293,13 +310,45 @@
                   </view>
                   </view>
                 </uni-col>
                 </uni-col>
                 <uni-col :xs="24" :sm="24" :md="4" :lg="4" :xl="4">
                 <uni-col :xs="24" :sm="24" :md="4" :lg="4" :xl="4">
-                  <view class="refresh-icon">
-                    <image style="width: 28px;" :src="icon_refresh" />
+                  <view class="refresh">
+                    <image :src="icon_refresh" @click="getCustomFileList" />
                   </view>
                   </view>
                 </uni-col>
                 </uni-col>
               </uni-row>
               </uni-row>
             </uni-col>
             </uni-col>
-            <uni-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
+            <uni-col v-if="isPC" :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
+              <view class="crm-title-box">
+                <text class="tit">{{ t('ImproveImmediately.Title.MobileDeviceUpload') }}</text>
+                <uni-tooltip placement="bottom">
+                  <text class="icon-tip">ⓘ</text>
+                  <template v-slot:content>
+                    <view class="address-tip">
+                      {{ t('ImproveImmediately.Content.popover2') }}
+                    </view>
+                  </template>
+                </uni-tooltip>
+              </view>
+              <view class="con-box">
+                <view class="box">
+                  <image class="mobile" :src="icon_mobile" />
+                  <image class="arrow" :src="icon_arrowR" />
+                  <image
+                    class="img_mobile"
+                    style="
+                      display: inline-block;
+                      width: 120px;
+                      height: 120px;
+                      border: 8px solid var(--color-gray);
+                    "
+                    :src="mobile"
+                  >
+                    <div slot="error" class="image-slot">
+                      <i class="el-icon-picture-outline"></i>
+                    </div>
+                  </image>
+                  <image class="icon_refresh" :src="icon_refresh" @click="getMobileInfo" />
+                </view>
+              </view>
 
 
             </uni-col>
             </uni-col>
           </uni-row>
           </uni-row>
@@ -344,49 +393,183 @@
         </view>
         </view>
         <!-- 第四步:地址证明 -->
         <!-- 第四步:地址证明 -->
         <view v-show="currentStep === 4" class="form-section">
         <view v-show="currentStep === 4" class="form-section">
-          <h3 class="section-title">{{ t('ImproveImmediately.Title.ProofAddress') }}</h3>
           <uni-row class="demo-uni-row uni-row1">
           <uni-row class="demo-uni-row uni-row1">
-            <uni-col :xs="24" :sm="24" :md="24" :lg="16" :xl="16">
-              <uni-forms-item name="addressProofUrl" :label="t('ImproveImmediately.Label.AddressProof')">
-                <cwg-input
-                  v-model:value="formData.addressProofUrl"
-                  :required="true"
-                  type="upload"
-                  fkey="addressProofUrl"
-                  rulesKey="addressProofUrl"
-                  :is-upload-d="true"
-                  accept="image/png, image/jpeg, image/jpg"
-                  @change="handleChange">
-                  <view class="cwg-upload">
-                    <cwg-icon name="back-top" />
-                    <view class="name">
-                      {{ t('Btn.Upload') }}
+            <uni-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
+              <view class="crm-title-box">
+                <text class="tit">{{ t('ImproveImmediately.Title.ProofAddress') }}</text>
+                <uni-tooltip placement="bottom">
+                  <text class="icon-tip">ⓘ</text>
+                  <template v-slot:content>
+                    <view class="address-tip">
+                      {{ t('ImproveImmediately.Content.ProofAddress5') }}
+                    </view>
+                  </template>
+                </uni-tooltip>
+
+              </view>
+              <uni-row class="demo-uni-row uni-row1">
+                <uni-col :xs="24" :sm="24" :md="16" :lg="16" :xl="16">
+                  <cwg-file-picker
+                    v-if="!fileListAdd1.path"
+                    v-model="fileListAdd1.path"
+                    :editable="fileListAdd1.status != 2"
+                    :limit="1"
+                    :fileMediatype="'all'"
+                    uploadUrl="/custom/file/upload/3"
+                    :baseUrl="updateUrl"
+                    :imageWidth="150"
+                    :imageHeight="150"
+                    :showPreviewDelete="false"
+                    :canDelete="false"
+                    :uploadError="false"
+                    :showProgress="false"
+                    :image-styles="imageStyle"
+                    @update:modelValue="(val) => handleFileUpdate(val, '1')"
+                    customClass="avatar-uploader"
+                  />
+                  <view v-else>
+                    <view class="file-item">
+                      <image
+                        v-if="!isPdf(fileListAdd1.path)"
+                        class="avatar"
+                        :src="updateUrl + fileListAdd1.path"
+                      ></image>
+                      <view v-else>
+                        <image class="icon" :src="icon_doc" />
+                      </view>
                     </view>
                     </view>
-                    <view class="back">{{ t('ImproveImmediately.Content.ProofAddress1') }}</view>
                   </view>
                   </view>
-                </cwg-input>
-              </uni-forms-item>
+                </uni-col>
+                <uni-col :xs="24" :sm="24" :md="4" :lg="4" :xl="4">
+                  <view class="refresh">
+                    <image :src="icon_refresh" @click="getCustomFileList" />
+                  </view>
+                </uni-col>
+              </uni-row>
             </uni-col>
             </uni-col>
-            <uni-col :xs="24" :sm="24" :md="24" :lg="16" :xl="16">
-              <uni-forms-item name="otherFiles" :label="t('PersonalManagement.Title.AttachedFile')">
-                <cwg-input
-                  v-model:value="formData.otherFiles"
-                  type="upload"
-                  multiple
-                  fkey="otherFiles"
-                  rulesKey="otherFiles"
-                  :is-upload-d="true"
-                  accept="image/png, image/jpeg, image/jpg, application/pdf"
-                  @change="handleChange">
-                  <view class="cwg-upload">
-                    <cwg-icon name="back-top" />
-                    <view class="name">
-                      {{ t('Btn.Upload') }}
+            <uni-col v-if="isPC" :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
+              <view class="crm-title-box">
+                <text class="tit">{{ t('ImproveImmediately.Title.MobileDeviceUpload') }}</text>
+                <uni-tooltip placement="bottom">
+                  <text class="icon-tip">ⓘ</text>
+                  <template v-slot:content>
+                    <view class="address-tip">
+                      {{ t('ImproveImmediately.Content.popover2') }}
+                    </view>
+                  </template>
+                </uni-tooltip>
+              </view>
+              <view class="con-box">
+                <view class="box">
+                  <image class="mobile" :src="icon_mobile" />
+                  <image class="arrow" :src="icon_arrowR" />
+                  <image
+                    class="img_mobile"
+                    style="
+                      display: inline-block;
+                      width: 120px;
+                      height: 120px;
+                      border: 8px solid var(--color-gray);
+                    "
+                    :src="mobile"
+                  >
+                    <div slot="error" class="image-slot">
+                      <i class="el-icon-picture-outline"></i>
+                    </div>
+                  </image>
+                  <image class="icon_refresh" :src="icon_refresh" @click="getMobileInfo" />
+                </view>
+              </view>
+
+            </uni-col>
+          </uni-row>
+          <uni-row class="demo-uni-row uni-row1">
+            <uni-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+              <view class="crm-title-box">
+                <text class="tit">{{ t('PersonalManagement.Title.AttachedFile') }}</text>
+              </view>
+              <uni-row class="demo-uni-row uni-row1">
+                <uni-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+                  <cwg-file-picker
+                    :limit="9"
+                    :multiple="true"
+                    :editable="true"
+                    :fileMediatype="'all'"
+                    uploadUrl="/custom/file/upload/10"
+                    :baseUrl="updateUrl"
+                    :imageWidth="100"
+                    :imageHeight="60"
+                    :showPreviewDelete="false"
+                    :canDelete="false"
+                    :uploadError="false"
+                    :showProgress="false"
+                    :image-styles="imageStyle"
+                    @update:modelValue="(val) => handleFileUpdate(val, '1')"
+                    custom-class="fileOther"
+                    :showError="false"
+                  >
+                    <button type="primary">{{ t('Btn.Upload') }}</button>
+                  </cwg-file-picker>
+                  <view class="fileList">
+                    <view id="files" v-for="(item,index) in fileListOthers" :key="index">
+
+                      <cwg-file-picker
+                        customClass="list_upload"
+                        v-model="item.path"
+                        :editable="item.status != 2"
+                        :limit="1"
+                        :fileMediatype="'all'"
+                        :uploadUrl="'/custom/file/upload/10/'+item.id"
+                        :baseUrl="updateUrl"
+                        :uploadError="false"
+                        :showProgress="false"
+                        :imageWidth="100"
+                        :imageHeight="60"
+                        :showPreviewDelete="true"
+                        :disablePreview="true"
+                        :image-styles="imageStyle"
+                        :canChoose="true"
+                        @update:modelValue="(val) => handleFileUpdate(val, '1')"
+                      >
+                        <view class="file-item">
+                          <image
+                            v-if="!isPdf(item.path) || !isPdf(item.againPath)"
+                            class="avatar"
+                            :src="updateUrl + (item.againPath || item.path)"
+                          ></image>
+                          <view v-else>
+                            <image class="icon" :src="icon_doc" />
+                          </view>
+                        </view>
+                      </cwg-file-picker>
+                      <view class="options">
+                        <u-button
+                          style="margin-right: 20px;"
+                          :disabled="item.status == 2"
+                        >
+                          <a
+                            :href="updateUrl + (item.againPath || item.path)"
+                            target="_blank"
+                          >
+                            {{ t('Btn.item12') }}
+                          </a>
+                        </u-button>
+                        <u-button
+                          :disabled="item.status == 2"
+                          @click="fileOtherDelete(item.id)"
+                        >
+                          {{ t('Btn.Delete') }}
+                        </u-button>
+                      </view>
                     </view>
                     </view>
-                    <view class="back">{{ t('ImproveImmediately.Content.ProofAddress6') }}</view>
                   </view>
                   </view>
-                </cwg-input>
-              </uni-forms-item>
+                </uni-col>
+                <uni-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+                  <view class="refresh">
+                    <image :src="icon_refresh" @click="getCustomFileList" />
+                  </view>
+                </uni-col>
+              </uni-row>
             </uni-col>
             </uni-col>
           </uni-row>
           </uni-row>
           <view class="descending">
           <view class="descending">
@@ -429,6 +612,9 @@
           <template v-if="currentStep === 4">
           <template v-if="currentStep === 4">
             <view class="btns">
             <view class="btns">
               <view class="cwg-button two-btn">
               <view class="cwg-button two-btn">
+                <u-button class="btn-primary" type="primary" block @click="cancle">
+                  {{ t('Btn.Cancel') }}
+                </u-button>
                 <u-button plain block class="prev-btn btn-primary" @click="goStep(3)">
                 <u-button plain block class="prev-btn btn-primary" @click="goStep(3)">
                   {{ t('Btn.Last') }}
                   {{ t('Btn.Last') }}
                 </u-button>
                 </u-button>
@@ -441,6 +627,9 @@
           <template v-else-if="currentStep === 3">
           <template v-else-if="currentStep === 3">
             <view class="btns">
             <view class="btns">
               <view class="cwg-button two-btn">
               <view class="cwg-button two-btn">
+                <u-button class="btn-primary" type="primary" block @click="cancle">
+                  {{ t('Btn.Cancel') }}
+                </u-button>
                 <u-button plain block class="prev-btn btn-primary" @click="goStep(2)">
                 <u-button plain block class="prev-btn btn-primary" @click="goStep(2)">
                   {{ t('Btn.Last') }}
                   {{ t('Btn.Last') }}
                 </u-button>
                 </u-button>
@@ -453,6 +642,9 @@
           <template v-else-if="currentStep === 2">
           <template v-else-if="currentStep === 2">
             <view class="btns">
             <view class="btns">
               <view class="cwg-button two-btn">
               <view class="cwg-button two-btn">
+                <u-button class="btn-primary" type="primary" block @click="cancle">
+                  {{ t('Btn.Cancel') }}
+                </u-button>
                 <u-button plain block class="prev-btn btn-primary" @click="goStep(1)">
                 <u-button plain block class="prev-btn btn-primary" @click="goStep(1)">
                   {{ t('Btn.Last') }}
                   {{ t('Btn.Last') }}
                 </u-button>
                 </u-button>
@@ -464,7 +656,10 @@
           </template>
           </template>
           <template v-else-if="currentStep === 1">
           <template v-else-if="currentStep === 1">
             <view class="btns">
             <view class="btns">
-              <view class="cwg-button">
+              <view class="cwg-button two-btn">
+                <u-button class="btn-primary" type="primary" block @click="cancle">
+                  {{ t('Btn.Cancel') }}
+                </u-button>
                 <u-button class="btn-primary" type="primary" block :loading="loadingStates.next" @click="goStep(2)">
                 <u-button class="btn-primary" type="primary" block :loading="loadingStates.next" @click="goStep(2)">
                   {{ t('Btn.Next') }}
                   {{ t('Btn.Next') }}
                 </u-button>
                 </u-button>
@@ -477,7 +672,7 @@
     <view class="form-tab"></view>
     <view class="form-tab"></view>
   </cwg-page-wrapper>
   </cwg-page-wrapper>
   <!--离开弹出框-->
   <!--离开弹出框-->
-  <uni-popup ref="dialogCheck" type="center" :show="dialogCheck">
+  <uni-popup ref="dialogCheck" type="center" background-color="#fff">
     <view class="dia-content" v-if="dialogCheck1">
     <view class="dia-content" v-if="dialogCheck1">
       <view class="icon">
       <view class="icon">
         <i class="iconfont iconjingshi"></i>
         <i class="iconfont iconjingshi"></i>
@@ -517,6 +712,8 @@
   import config from '@/config/index'
   import config from '@/config/index'
   import icon_doc from '@/static/icons/crm-document.svg'
   import icon_doc from '@/static/icons/crm-document.svg'
   import icon_refresh from '@/static/icons/crm-refresh.svg'
   import icon_refresh from '@/static/icons/crm-refresh.svg'
+  import icon_mobile from '@/static/icons/icon_mobile.svg'
+  import icon_arrowR from '@/static/icons/icon_arrowR.svg'
 
 
   const router = useRouter()
   const router = useRouter()
   const { t } = useI18n()
   const { t } = useI18n()
@@ -555,6 +752,45 @@
   const countries = ref([])
   const countries = ref([])
   const uploadImage = ref(0)
   const uploadImage = ref(0)
   const updateUrl = config.Host80
   const updateUrl = config.Host80
+  const mobile = ref('')
+  const notCountry = [
+    'AF',
+    'AI',
+    'AG',
+    'BS',
+    'BY',
+    'BZ',
+    'BA',
+    'BI',
+    'CF',
+    'CD',
+    'CU',
+    'ET',
+    'FJ',
+    'PS',
+    'GN',
+    'GW',
+    'HT',
+    'IR',
+    'IQ',
+    'LB',
+    'LY',
+    'ML',
+    'MM',
+    'NI',
+    'KP',
+    'PW',
+    'RU',
+    'SO',
+    'SS',
+    'SD',
+    'SY',
+    'UA',
+    'US',
+    'VE',
+    'YE',
+    'ZW',
+  ]
 
 
   const imageStyle = ref({
   const imageStyle = ref({
     width: 200,
     width: 200,
@@ -662,7 +898,7 @@
   }
   }
 
 
   onLoad((options) => {
   onLoad((options) => {
-    currentStep.value = parseInt(options?.currentStep || '3', 10)
+    currentStep.value = parseInt(options?.currentStep || '4', 10)
   })
   })
 
 
   function goStep(step: number) {
   function goStep(step: number) {
@@ -841,10 +1077,36 @@
     getStateList(item.id)
     getStateList(item.id)
   }
   }
 
 
+
   function handleFileUpdate(value, type) {
   function handleFileUpdate(value, type) {
     console.log(value, type, 'uplaod')
     console.log(value, type, 'uplaod')
   }
   }
 
 
+  async function fileOtherDelete(id) {
+    uni.showModal({
+      title: t('Msg.SystemPrompt'),
+      content: t('Msg.Delete'),
+      cancelText: t('Btn.Cancel'),
+      confirmText: t('Btn.Confirm'),
+      success: async (res) => {
+        if (res.confirm) {
+          // 确认删除
+          let data = await personalApi.customFileDelete({ ids: [id] })
+          if (data.code == 200) {
+            uni.showToast(t('Msg.DeleteSuccess'))
+            getCustomFileList()
+          } else {
+            uni.showToast(res.msg)
+          }
+        }
+      },
+      fail: () => {
+
+      },
+    })
+  }
+
+
   function changeState(val) {
   function changeState(val) {
     formData.value.city = ''
     formData.value.city = ''
     cityOptions.value = []
     cityOptions.value = []
@@ -895,7 +1157,7 @@
 
 
   function cancle() {
   function cancle() {
     if (!isApprove.value) {
     if (!isApprove.value) {
-      dialogCheck.value = true
+      dialogCheck.value.open()
       dialogCheck1.value = true
       dialogCheck1.value = true
     } else {
     } else {
       router.push({ path: '/customer/index' })
       router.push({ path: '/customer/index' })
@@ -938,7 +1200,7 @@
         await getCustomFileList()
         await getCustomFileList()
         await customApply()
         await customApply()
       } else {
       } else {
-        uni.showToast({ title: res.msg, icon: 'none' })
+        uni.showToast(res.msg)
       }
       }
     } catch (error: any) {
     } catch (error: any) {
       uni.showToast({ title: error.message || t('Msg.SystemError'), icon: 'none' })
       uni.showToast({ title: error.message || t('Msg.SystemError'), icon: 'none' })
@@ -998,6 +1260,7 @@
         countryOptions.value = res.data.map((item: any) => ({
         countryOptions.value = res.data.map((item: any) => ({
           text: item.enName,
           text: item.enName,
           value: item.code,
           value: item.code,
+          disabled: notCountry.indexOf(item.code) !== -1,
         }))
         }))
         countries.value = res.data
         countries.value = res.data
         const country = formData.value.country
         const country = formData.value.country
@@ -1081,7 +1344,7 @@
         responseType: 'arraybuffer',
         responseType: 'arraybuffer',
       })
       })
       // console.log(res);
       // console.log(res);
-      const mobile = 'data:image/png;base64,' + Buffer.from(res).toString('base64')
+      mobile.value = 'data:image/png;base64,' + Buffer.from(res).toString('base64')
     } catch (error: any) {
     } catch (error: any) {
       uni.showToast({ title: error.message || t('Msg.SystemError'), icon: 'none' })
       uni.showToast({ title: error.message || t('Msg.SystemError'), icon: 'none' })
     }
     }
@@ -1245,10 +1508,8 @@
     () => formData.value.lastName,
     () => formData.value.lastName,
     () => {
     () => {
       if (localStorage.getItem('lang') == 'cn' && formData.value.firstName && formData.value.lastName) {
       if (localStorage.getItem('lang') == 'cn' && formData.value.firstName && formData.value.lastName) {
-        formData.value.nameEn = pinyin(`${formData.value.firstName} ${formData.value.lastName}`, {
-          style: 'first',
-          separator: ' ',
-        }).toUpperCase()
+        formData.value.nameEn = pinyin(`${formData.value.firstName} ${formData.value.lastName}`
+        )
       }
       }
     },
     },
   )
   )
@@ -1347,6 +1608,137 @@
     }
     }
   }
   }
 
 
+  .refresh {
+    width: 100%;
+    height: px2rpx(150);
+    display: flex;
+    justify-content: center;
+    align-items: center;
+
+    image {
+      width: px2rpx(28);
+      height: px2rpx(28);
+    }
+  }
+
+  .fileOther {
+
+    :deep(.upload-wrapper .uni-file-picker) {
+      display: flex;
+      align-items: center;
+      justify-content: center;
+    }
+
+    :deep(.uni-file-picker__lists) {
+      display: none !important;
+    }
+  }
+
+  .fileList {
+    width: 100%;
+    box-sizing: border-box;
+    display: flex;
+    flex-direction: column;
+    justify-content: center;
+    align-items: center;
+  }
+
+  #files {
+    :deep(.uni-file-picker__lists) {
+      display: none !important;
+    }
+
+    :deep(.upload-wrapper .uni-file-picker) {
+      display: flex;
+      align-items: center;
+      justify-content: center;
+    }
+
+    .list_upload {
+      width: px2rpx(150);
+      height: px2rpx(60);
+    }
+
+    .file-item {
+      //border: none;
+      box-sizing: border-box;
+      width: px2rpx(150);
+      height: px2rpx(60);
+      border-radius: 0;
+    }
+
+    margin-top: px2rpx(20);
+    max-width: px2rpx(600);
+    border: 1px dashed;
+    display: flex;
+
+    .options {
+      flex: 1;
+      padding: 8px;
+      box-sizing: border-box;
+      display: flex;
+      justify-content: center;
+      align-content: center;
+      align-items: center;
+
+      uni-button {
+        min-width: px2rpx(100);
+        max-height: px2rpx(30);
+        padding: 0;
+        line-height: px2rpx(30);
+
+        span,
+        a {
+          display: inline-block;
+          height: 100%;
+          width: 100%;
+          color: var(--color-black);
+        }
+      }
+    }
+  }
+
+  .con-box {
+    background-color: var(--color-white);
+    border-radius: 2px;
+    padding: 20px;
+
+    .box {
+      width: 100%;
+      // height: 190px;
+      box-sizing: border-box;
+      display: flex;
+      justify-content: center;
+      align-items: center;
+
+      .mobile {
+        width: px2rpx(50);
+        height: px2rpx(50);
+        margin-right: px2rpx(10);
+      }
+
+      .arrow {
+        width: px2rpx(30);
+        height: px2rpx(30);
+        margin-right: px2rpx(10);
+      }
+
+      .img_mobile {
+        width: 120px;
+        height: 120px;
+        margin: 10px;
+        border: 5px solid;
+        background-color: var(--color-gray);
+      }
+
+      .icon_refresh {
+        width: px2rpx(30);
+        height: px2rpx(30);
+        margin-right: px2rpx(10);
+      }
+    }
+  }
+
   .experience {
   .experience {
     display: flex;
     display: flex;
     margin: px2rpx(10) 0;
     margin: px2rpx(10) 0;
@@ -1428,6 +1820,11 @@
     color: #4a6cf7;
     color: #4a6cf7;
   }
   }
 
 
+  .address-tip {
+    width: px2rpx(120);
+    font-size: px2rpx(14);
+  }
+
   .crm-title-box {
   .crm-title-box {
     display: flex;
     display: flex;
     align-items: center;
     align-items: center;
@@ -1436,13 +1833,13 @@
     .tit {
     .tit {
       font-size: px2rpx(18);
       font-size: px2rpx(18);
       font-weight: 500;
       font-weight: 500;
-      color: #1a1a1a;
+      color: var(--color-white);
     }
     }
 
 
     .icon-tip {
     .icon-tip {
       margin-left: px2rpx(10);
       margin-left: px2rpx(10);
       font-size: px2rpx(16);
       font-size: px2rpx(16);
-      color: #4a6cf7;
+      color: var(--color-white);
       cursor: pointer;
       cursor: pointer;
     }
     }
   }
   }
@@ -1482,7 +1879,7 @@
       justify-content: space-between;
       justify-content: space-between;
       margin-top: px2rpx(30);
       margin-top: px2rpx(30);
 
 
-      u-button {
+      uni-button {
         flex: 1;
         flex: 1;
         margin: 0 px2rpx(10);
         margin: 0 px2rpx(10);
 
 

+ 1 - 0
static/icons/icon_arrowR.svg

@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 640"><!--!Font Awesome Free 7.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2026 Fonticons, Inc.--><path d="M566.6 342.6C579.1 330.1 579.1 309.8 566.6 297.3L406.6 137.3C394.1 124.8 373.8 124.8 361.3 137.3C348.8 149.8 348.8 170.1 361.3 182.6L466.7 288L96 288C78.3 288 64 302.3 64 320C64 337.7 78.3 352 96 352L466.7 352L361.3 457.4C348.8 469.9 348.8 490.2 361.3 502.7C373.8 515.2 394.1 515.2 406.6 502.7L566.6 342.7z"/></svg>

+ 1 - 0
static/icons/icon_mobile.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1774435430334" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4085" width="48" height="48" xmlns:xlink="http://www.w3.org/1999/xlink"><path d="M728.118989 1010.749509 294.99432 1010.749509c-47.854537 0-86.634178-38.779641-86.634178-86.637827L208.360142 101.096115c0-47.854537 38.779641-86.634178 86.634178-86.634178l433.181836 0c47.859402 0 86.634178 38.779641 86.634178 86.634178l0 823.014351C814.753167 971.969868 775.973526 1010.749509 728.118989 1010.749509L728.118989 1010.749509zM771.464662 101.096115c0-23.899293-19.389212-43.288506-43.288506-43.288506L294.99432 57.807609c-23.899293 0-43.288506 19.389212-43.288506 43.288506l0 64.963166 519.816014 0 0-64.963166L771.464662 101.096115zM771.464662 209.409818 251.648648 209.409818l0 498.140137 519.816014 0L771.464662 209.409818 771.464662 209.409818zM771.464662 750.838461 251.648648 750.838461l0 173.272005c0 23.898077 19.389212 43.288506 43.288506 43.288506l433.181836 0c23.898077 0 43.288506-19.389212 43.288506-43.288506L771.407495 750.838461 771.464662 750.838461zM511.558479 924.110466c-35.909147 0-64.963166-29.111186-64.963166-64.963166 0-35.905498 29.111186-64.963166 64.963166-64.963166 35.848332 0 64.959517 29.116051 64.959517 64.963166C576.517996 895.000497 547.463977 924.110466 511.558479 924.110466L511.558479 924.110466zM511.558479 924.110466" fill="#272636" p-id="4086"></path></svg>

+ 19 - 0
static/scss/global/global.scss

@@ -46,6 +46,8 @@
     --color-gray-200: oklch(92.8% .006 264.531);
     --color-gray-200: oklch(92.8% .006 264.531);
     --color-zinc-100: oklch(96.7% .001 286.375);
     --color-zinc-100: oklch(96.7% .001 286.375);
     --color-black: #000;
     --color-black: #000;
+    --color-gray: #F2F2F2;
+    --color-gray-second: #6B7188;
     --color-white: #fff;
     --color-white: #fff;
     --font-size-10: px2rpx(10);
     --font-size-10: px2rpx(10);
     --font-size-12: px2rpx(12);
     --font-size-12: px2rpx(12);
@@ -239,6 +241,7 @@
     --color-warning-focus: #e68200;
     --color-warning-focus: #e68200;
     --color-error: #e32326;
     --color-error: #e32326;
     --color-error-focus: #f03000;
     --color-error-focus: #f03000;
+    --color-gray-second: #6B7188;
     --text-tiny: .625rem;
     --text-tiny: .625rem;
     --text-tiny--line-height: .8125rem;
     --text-tiny--line-height: .8125rem;
     --text-tiny-plus: .6875rem;
     --text-tiny-plus: .6875rem;
@@ -1022,6 +1025,22 @@ uni-content {
     border: 1px solid rgba(108, 133, 149, 0.12);
     border: 1px solid rgba(108, 133, 149, 0.12);
     border-radius: px2rpx(8);
     border-radius: px2rpx(8);
 }
 }
+.crm-title-box{
+  background-color: var(--color-gray-second);
+  color: var(--color-white);
+  height: 40px;
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  margin-bottom: 10px;
+  border-radius: 2px;
+  padding: 0 20px;
+  .tit {
+    font-size: 14px;
+    font-weight: bold;
+    color: var(--color-white);
+  }
+}
 
 
 @media screen and (max-width: 991px) {
 @media screen and (max-width: 991px) {
     .info-card {
     .info-card {

+ 7 - 2
uni_modules/uni-file-picker/components/uni-file-picker/uni-file-picker.vue

@@ -138,6 +138,10 @@
 				type: String,
 				type: String,
 				default: ''
 				default: ''
 			},
 			},
+      canChoose: {
+				type: Boolean,
+				default: false
+			},
 			listStyles: {
 			listStyles: {
 				type: Object,
 				type: Object,
 				default () {
 				default () {
@@ -331,8 +335,9 @@
 			 */
 			 */
 			choose() {
 			choose() {
 				if (this.disabled) return
 				if (this.disabled) return
+        // canchoose 为 false 时,走正常逻辑,否则可以重新选择文件
 				if (this.files.length >= Number(this.limitLength) && this.showType !== 'grid' && this.returnType ===
 				if (this.files.length >= Number(this.limitLength) && this.showType !== 'grid' && this.returnType ===
-					'array') {
+					'array' && !this.canChoose) {
 					uni.showToast({
 					uni.showToast({
 						title: `您最多选择 ${this.limitLength} 个文件`,
 						title: `您最多选择 ${this.limitLength} 个文件`,
 						icon: 'none'
 						icon: 'none'
@@ -677,4 +682,4 @@
 		position: absolute;
 		position: absolute;
 		transform: rotate(90deg);
 		transform: rotate(90deg);
 	}
 	}
-</style>
+</style>