浏览代码

feat: 国内分销商注册登录改造

周玉环 4 天之前
父节点
当前提交
2191cfcbb5

+ 6 - 0
xinkeaboard-web/assets/language/en.js

@@ -494,9 +494,13 @@ export const lang_en = {
     '我的优惠券': 'my discount coupon',
     '安全性高的密码可以保障您的账号安全,建议密码为6~20位,由英文、数字或符号的组合': 'The password with high security can ensure the security of your account. It is recommended that the password should be 6 to 20 characters, which is composed of English, numbers or symbols',
     '绑定邮箱': 'Bind mail',
+    '绑定手机号': 'Bind Phone',
     '修改邮箱': 'Modify Email',
+    '修改手机号': 'Modify Phone',
     '尚未绑定邮箱': 'Mail has not been bound',
+    '尚未绑定手机号': 'Phone has not been bound',
     '若邮箱已停用,请及时更换': 'If the mail has been disabled, please replace it in time',
+    '若手机已停用,请及时更换': 'If the phone has been disabled, please replace it in time',
     '修改密码': 'Modify Password',
     '请输入一致的新密码': 'Please enter a consistent new password',
     '修改电子邮箱':'Modify Email',
@@ -516,6 +520,7 @@ export const lang_en = {
     '序号': 'Index',
     '姓名': 'User Name',
     '邮箱': 'Email Address',
+    '手机号': 'Phone Number',
     '电话': 'Phone Number',
     '询盘列表':'Enquiry List',
     '公司名称': 'Company Name',
@@ -847,6 +852,7 @@ export const lang_en = {
     loginDialog: {
         '登录': 'Login',
         '邮箱': 'Email',
+        '手机': 'Phone',
         '密码': 'Password',
         '登录成功': 'Login successful'
     }

+ 7 - 0
xinkeaboard-web/assets/language/zh.js

@@ -90,6 +90,7 @@ export const lang_zn = {
     '序号': '序号',
     '姓名': '姓名',
     '邮箱': '邮箱',
+    '手机号': '手机号',
     '电话': '电话',
     '询盘列表':'询盘列表',
     '公司名称': '公司',
@@ -547,8 +548,11 @@ export const lang_zn = {
     '安全性高的密码可以保障您的账号安全,建议密码为6~20位,由英文、数字或符号的组合': '安全性高的密码可以保障您的账号安全,建议密码为6~20位,由英文、数字或符号的组合',
     '绑定邮箱': '绑定邮箱',
     '修改邮箱': '修改邮箱',
+    '修改手机号': '修改手机号',
     '尚未绑定邮箱': '尚未绑定邮箱',
+    '尚未绑定手机号': '尚未绑定手机号',
     '若邮箱已停用,请及时更换': '若邮箱已停用,请及时更换',
+    '若手机已停用,请及时更换': '若手机已停用,请及时更换',
     '请输入新邮箱':'请输入新邮箱',
     '确定提交':'确定',
     '请先绑定邮箱,再进行登陆密码操作!':'请先绑定邮箱,再进行登陆密码操作!',
@@ -662,6 +666,8 @@ export const lang_zn = {
     '男': '男',
     '女': '女',
     '昵称:': '昵称:',
+    '公司名称:': '公司名称:',
+    '主营产品:': '主营产品:',
     '生日:': '生日:',
     '年': '年',
     '月': '月',
@@ -874,6 +880,7 @@ export const lang_zn = {
     loginDialog: {
         '登录': '登录',
         '邮箱': '邮箱',
+        '手机': '手机',
         '密码': '密码',
         '登录成功': '登录成功'
     }

+ 22 - 2
xinkeaboard-web/components/Home/sourcingForm.vue

@@ -4,9 +4,12 @@
       <el-form-item prop="name">
         <el-input v-model="form.name" :placeholder="L['请输入姓名']" />
       </el-form-item>
-      <el-form-item prop="email">
+      <el-form-item v-if="contactType === 'email'" prop="email">
         <el-input v-model="form.email" :placeholder="L['请输入邮箱']" />
       </el-form-item>
+      <el-form-item v-if="contactType === 'mobile'" prop="mobile">
+        <el-input v-model="form.mobile" :placeholder="L['请输入手机号']" />
+      </el-form-item>
       <el-form-item prop="quantity">
         <el-input-number
           v-model="form.quantity"
@@ -53,6 +56,7 @@ import {
 } from "element-plus";
 import { useFiltersStore } from "@/store/filter.js";
 import { useRouter } from "vue-router";
+import { getContactType } from "../../utils/common";
 
 const router = useRouter();
 
@@ -61,20 +65,23 @@ const L = getCurLanguage();
 const loading = ref(false);
 const ruleFormRef = ref(null);
 
+const contactType = getContactType();
+
 // do not use same name with ref
 const form = reactive({
   name: "",
   message: "",
   email: "",
+  mobile: '',
   quantity: undefined,
 });
-
 const email = computed(() => filtersStore.getMemberInfo.memberEmail ?? "");
 const name = computed(
   () =>
     filtersStore.getMemberInfo.memberNickName ||
     filtersStore.getMemberInfo.memberName
 );
+const mobile = computed(() => filtersStore.getMemberInfo.memberMobile ?? "")
 
 const checkEmailFun = (rule, value, callback) => {
   if (checkEmail(value) !== true) {
@@ -83,6 +90,13 @@ const checkEmailFun = (rule, value, callback) => {
   callback();
 };
 
+const checkMobileFun = (rule, value, callback) => {
+  if (checkPhone(value) !== true) {
+    callback(new Error(checkPhone(value)));
+  }
+  callback();
+};
+
 const rules = reactive({
   name: [{ required: true, message: L["请输入姓名"], trigger: "blur" }],
   quantity: [
@@ -92,6 +106,10 @@ const rules = reactive({
     { required: true, message: L["请输入邮箱"], trigger: "blur" },
     { validator: checkEmailFun, trigger: "blur" },
   ],
+  mobile: [
+    { required: true, message: L["请输入手机号"], trigger: "blur" },
+    { validator: checkMobileFun, trigger: "blur" },
+  ],
   message: [
     {
       required: true,
@@ -168,7 +186,9 @@ onMounted(() => {
     form.name = data.name;
     form.message = data.message;
     form.quantity = data.quantity;
+    form.mobile = data.mobile;
   } else {
+    form.mobile = mobile.value;
     form.email = email.value;
     form.name = name.value;
   }

+ 27 - 7
xinkeaboard-web/components/LoginDialog.vue

@@ -14,9 +14,14 @@
         :rules="rules"
         label-position="top"
       >
-        <el-form-item class="login-email" :label="L['loginDialog']['邮箱']" prop="email">
+        <el-form-item class="login-contact" :label="L['loginDialog']['邮箱']" prop="email" v-if="contactType==='email'">
           <el-input v-model="ruleForm.email" clearable />
-          <div v-if="emailExistMsg" class="login-email-error">{{ emailExistMsg }}</div>
+          <div v-if="contactExistMsg" class="login-contact-error">{{ contactExistMsg }}</div>
+        </el-form-item>
+
+        <el-form-item class="login-contact" :label="L['loginDialog']['手机']" prop="mobile" v-if="contactType==='mobile'">
+          <el-input v-model="ruleForm.mobile" clearable />
+          <div v-if="contactExistMsg" class="login-contact-error">{{ contactExistMsg }}</div>
         </el-form-item>
 
         <el-form-item
@@ -56,21 +61,25 @@
 import { ref, reactive, defineExpose } from "vue";
 import { getCurLanguage, checkEmail } from "@/composables/common.js";
 import { useFiltersStore } from "@/store/filter.js";
+import { getContactType } from "../utils/common";
 
 const filtersStore = useFiltersStore();
 
+const contactType = getContactType();
+
 const L = getCurLanguage();
 
 const emit = defineEmits(["login", "register", "forgot", "close"]);
 
 const visible = ref(false);
 const loginLoading = ref(false);
-const emailExistMsg = ref('')
+const contactExistMsg = ref('')
 
 const ruleFormRef = ref();
 
 const ruleForm = reactive({
   email: "",
+  mobile: "",
   password: "",
 });
 
@@ -81,11 +90,22 @@ const checkEmailFun = (rule, value, callback) => {
   callback();
 };
 
+const checkMobileFun = (rule, value, callback) => {
+  if (checkPhone(value) !== true) {
+    callback(new Error(checkPhone(value)));
+  }
+  callback();
+};
+
 const rules = reactive({
   email: [
     { required: true, message: L["请输入邮箱"], trigger: "blur" },
     { validator: checkEmailFun, trigger: "blur" },
   ],
+  mobile: [
+    { required: true, message: L["请输入手机号"], trigger: "blur" },
+    { validator: checkMobileFun, trigger: "blur" },
+  ],
   password: [
     {
       required: true,
@@ -112,7 +132,7 @@ const handleClose = () => {
 const login = () => {
   loginLoading.value = true;
   post("v3/frontLogin/oauth/token", {
-    username: ruleForm.email,
+    username: contactType === 'email' ? ruleForm.email : ruleForm.mobile,
     password: ruleForm.password,
     loginType: 1,
   })
@@ -124,10 +144,10 @@ const login = () => {
         filtersStore.setRefreshToken(res.data.refresh_token);
         filtersStore.setTime(new Date().getTime().toString()); //存储refresh_token更新时间
         //获取用户信息,并同步信息到pinia
-        emailExistMsg.value = ''
+        contactExistMsg.value = ''
         return res;
       }
-      emailExistMsg.value = res.msg;
+      contactExistMsg.value = res.msg;
       return Promise.reject();
     })
     .then(() => {
@@ -211,7 +231,7 @@ defineExpose({ open });
     }
   }
 
-  .login-email {
+  .login-contact {
     position: relative;
     margin-bottom: 25px;
     &-error {

+ 12 - 11
xinkeaboard-web/components/articleLeft.vue

@@ -136,17 +136,17 @@ getList();
 //滚动事件
 const leftFixed = ref(false)
 if (process.client) {
-  const handleScrollLeft = () => {
-    var height = 600;
-    var scrollTop =
-      window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop;
-    if (scrollTop > height) {
-      leftFixed.value = true;
-    } else {
-      leftFixed.value = false;
-    }
-  };
-  window.addEventListener("scroll", handleScrollLeft);
+  // const handleScrollLeft = () => {
+  //   var height = 600;
+  //   var scrollTop =
+  //     window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop;
+  //   if (scrollTop > height) {
+  //     leftFixed.value = true;
+  //   } else {
+  //     leftFixed.value = false;
+  //   }
+  // };
+  // window.addEventListener("scroll", handleScrollLeft);
 }
 
 
@@ -195,6 +195,7 @@ if (process.client) {
 
   .nch_module_style02 {
     border-top: solid 4px #ffa200;
+    overflow: auto;
   }
 
   .nch_sidebar_article_class {

+ 22 - 14
xinkeaboard-web/components/enquiryModal.vue

@@ -20,9 +20,12 @@
         <el-form-item :label="L['姓名']" prop="name">
           <el-input v-model="form.name" :placeholder="L['请输入姓名']" clearable />
         </el-form-item>
-        <el-form-item :label="L['邮箱']" prop="email">
+        <el-form-item v-if="contactType === 'email'" :label="L['邮箱']" prop="email">
           <el-input v-model="form.email" :placeholder="L['请输入邮箱']" />
         </el-form-item>
+        <el-form-item v-if="contactType === 'mobile'" :label="L['电话']" prop="phone">
+          <el-input v-model="form.phone" :placeholder="L['请输手机号']" />
+        </el-form-item>
         <el-form-item :label="L['电话代码']" prop="phoneCode">
           <el-select v-model="form.phoneCode" :placeholder="L['选择国家/地区']" filterable clearable allow-create   style="width: 100%">
             <el-option
@@ -35,7 +38,10 @@
             </el-option>
           </el-select>
         </el-form-item>
-        <el-form-item :label="L['电话']" prop="phone">
+        <el-form-item v-if="contactType === 'mobile'" :label="L['邮箱']" prop="email">
+          <el-input v-model="form.email" :placeholder="L['请输入邮箱']" />
+        </el-form-item>
+        <el-form-item v-if="contactType === 'email'" :label="L['电话']" prop="phone">
           <el-input v-model="form.phone" :placeholder="L['请输入电话']" />
         </el-form-item>
         <el-form-item :label="L['采购数量']" prop="quantity">
@@ -83,6 +89,7 @@ import {
   ElDialog,
 } from "element-plus";
 import { useFiltersStore } from "@/store/filter.js";
+import { getContactType } from "@/utils/common"
 const filtersStore = useFiltersStore();
 const countryPhone = ref([]);
 const emit = defineEmits(["closeLoingModal"]);
@@ -102,12 +109,13 @@ const form = reactive({
   message: "",
 });
 
-if(filtersStore.getMemberInfo.memberEmail){
-  form.email = filtersStore.getMemberInfo.memberEmail
-}
-if(filtersStore.getMemberInfo.memberNickName || filtersStore.getMemberInfo.memberName){
-  form.name = filtersStore.getMemberInfo.memberNickName || filtersStore.getMemberInfo.memberName
-}
+const { memberEmail, memberNickName, memberName, memberMobile, memberCompany} = filtersStore.getMemberInfo;
+form.email = memberEmail ?? "";
+form.name = memberNickName ?? memberName ?? "";
+form.phone = memberMobile ?? '';
+form.company = memberCompany ?? ""
+
+const contactType = getContactType();
 
 const checkEmailFun = (rule, value, callback) => {
   if (checkEmail(value) !== true) {
@@ -129,10 +137,10 @@ const rules = reactive({
   name: [
     { required: true, message: L["请输入姓名"], trigger: "blur" },
   ],
-  email: [
+  email: contactType === 'email' ?[
     { required: true, message: L["请输入邮箱"], trigger: "blur" },
     { validator: checkEmailFun, trigger: 'blur'}
-  ],
+  ] : [],
   phoneCode: [
     {
       required: true,
@@ -140,10 +148,10 @@ const rules = reactive({
       trigger: ['blur','change'],
     },
   ],
-  // phone: [
-  //   { required: true, message: L["请输入电话"], trigger: "blur" },
-  //   // { validator: checkPhoneFun, trigger: 'blur'}
-  // ],
+  phone: contactType === 'mobile' ? [
+    { required: true, message: L["请输入电话"], trigger: "blur" },
+    { validator: checkPhoneFun, trigger: 'blur'}
+  ] : [],
   company: [
     {
       required: true,

+ 0 - 1
xinkeaboard-web/components/login/Email.vue

@@ -131,7 +131,6 @@ const login = () => {
     }
   }
   errorMsg.value = "";
-  loginLoding.value = true;
   emits("login", param);
 };
 

+ 0 - 1
xinkeaboard-web/components/login/Phone.vue

@@ -134,7 +134,6 @@ const login = () => {
   }
   errorMsg.value = ''
 
-  loginLoding.value = true;
   emits("login", param);
 };
 

+ 2 - 2
xinkeaboard-web/components/register/RegisterAccount.vue

@@ -142,7 +142,7 @@ const props = defineProps({
     type: String,
     default: "",
   },
-  phone: {
+  mobile: {
     type: String,
     default: "",
   }
@@ -202,7 +202,7 @@ const joinForFree = () => {
     email: props.email,
     nickName: name.value,
     password: password.value,
-    phone: props.phone
+    mobile: props.mobile
   }
   const params = {}
   Object.keys(baseParams).forEach(key => {

+ 11 - 11
xinkeaboard-web/components/register/RegisterPhone.vue

@@ -10,7 +10,7 @@
       ></span>
       <input
         type="text"
-        v-model="phone"
+        v-model="mobile"
         :placeholder="L['请输入手机号']"
         class="input"
         autocomplete="off"
@@ -89,7 +89,7 @@ const emits = defineEmits(["success"]);
 const L = getCurLanguage();
 
 const phoneCalc = ref();
-const phone = ref(""); //手机号
+const mobile = ref(""); //手机号
 const phoneCode = ref(""); // 手机号验证码
 const phoneErrorMsg = ref(); //错误提示
 const phoneCodeErrorMsg = ref(); //验证码错误提示
@@ -115,7 +115,7 @@ const codeText = computed(() => {
 });
 
 // 注册手机号时按钮置灰状态
-const nextDisabled = computed(() => !phone.value || !phoneCode.value);
+const nextDisabled = computed(() => !mobile.value || !phoneCode.value);
 
 //开启人机校验
 const showHMVerify = () => {
@@ -128,7 +128,7 @@ const showHMVerify = () => {
 const getVerifyCode = () => {
   getVerifyCodeLoading.value = true;
   post("v3/member/front/active/verification/code", {
-    phone: phone.value,
+    mobile: mobile.value,
     source: 1,
     type: 1,
   })
@@ -170,12 +170,12 @@ const verifyFail = () => {
 // 校验手机号
 const validatePhone = () => {
   //手机号非空的验证
-  if (!phone.value) {
+  if (!mobile.value) {
     phoneErrorMsg.value = L["请输入手机号"];
     return false;
   }
   // 手机号格式验证
-  phoneCalc.value = checkPhone(phone.value);
+  phoneCalc.value = checkPhone(mobile.value);
   if (phoneCalc.value !== true) {
     phoneErrorMsg.value = phoneCalc.value;
     return false;
@@ -186,7 +186,7 @@ const validatePhone = () => {
 };
 
 // 手机号验证码验证
-const validatephoneCode = () => {
+const validatePhoneCode = () => {
   if (!phoneCode.value) {
     phoneCodeErrorMsg.value = L["register"]["请输入手机号验证码"];
     return false;
@@ -197,10 +197,10 @@ const validatephoneCode = () => {
 };
 
 const next = () => {
-  if (!validatephone() || !validatephoneCode()) return;
+  if (!validatePhone() || !validatePhoneCode()) return;
   nextActionLoading.value = true;
   post("v3/member/front/active/check/verification/code", {
-    phone: phone.value,
+    mobile: mobile.value,
     type: 1,
     verificationCode: phoneCode.value,
   })
@@ -211,7 +211,7 @@ const next = () => {
         //   type: "success",
         // });
         //成功提示,并返回到登录页面
-        emits("success", phone.value);
+        emits("success", mobile.value);
       } else {
         //提示错误
         showMessage({
@@ -227,7 +227,7 @@ const next = () => {
 
 //清空输入框内容
 const clearInputVal = (type) => {
-  phone.value = "";
+  mobile.value = "";
 };
 </script>
 <style lang="scss">

+ 3 - 5
xinkeaboard-web/composables/request.js

@@ -2,7 +2,7 @@ import axios from 'axios'
 import qs from "qs";
 import {ElMessage} from 'element-plus'
 import { useFiltersStore } from '@/store/filter.js'
-import { webSiteRelation } from "../utils/common";
+import { webSiteFlagRelation } from "../utils/common";
 
 const timeout = 10000
 
@@ -74,9 +74,7 @@ export const post = async (url, data = {}, timeout,type = 'urlencoded') => {
 const initRequestHeader = async (method, url, data = {}, type = 'urlencoded') => {
     let result = {};
     const config = useRuntimeConfig()
-    let headers = {
-        'Web-Site': webSiteRelation[config.public.appType]
-    };
+    let headers = {};
     const filtersStore = useFiltersStore()
     //用户登录状态下,每次更新refresh_token58分钟之后需要更新access_token
     if (filtersStore.getToken) {
@@ -126,6 +124,6 @@ const initRequestHeader = async (method, url, data = {}, type = 'urlencoded') =>
         headers.Authorization = 'Bearer ' + token;
     }
 
-    result = { url, data, headers };
+    result = { url, data, headers: {...headers, 'Web-Site': webSiteFlagRelation[config.public.appType]} };
     return result;
 }

+ 2 - 2
xinkeaboard-web/composables/useFetchRaw.ts

@@ -1,5 +1,5 @@
 import { useFetch as _useFetch } from '#app'
-import { webSiteRelation } from "../utils/common";
+import { webSiteFlagRelation } from "../utils/common";
 
 export async function useFetchRaw<T = any>(url: string, options?: any) {
   const config = useRuntimeConfig()
@@ -7,7 +7,7 @@ export async function useFetchRaw<T = any>(url: string, options?: any) {
     ...(options ?? {}),
     headers: {
       ...(options?.headers || {}),
-      'Web-Site': webSiteRelation[config.public.appType]
+      'Web-Site': webSiteFlagRelation[config.public.appType]
     },
   }
   const { data, error, pending, refresh, execute } = await _useFetch<T>(url, newOptions)

+ 221 - 181
xinkeaboard-web/pages/home/contact.vue

@@ -5,144 +5,180 @@
     <div class="bottom_line"></div>
     <div class="self_background">
       <div class="wrap clearfix">
-      <div class="s1">
-        <div class="sr-layout-block fl">
-          <div class="sr-txt-title">
-            <h2 class="sr-txt-h2">{{ L["取得联系"] }}</h2>
-          </div>
+        <div class="s1">
+          <div class="sr-layout-block fl">
+            <div class="sr-txt-title">
+              <h2 class="sr-txt-h2">{{ L["取得联系"] }}</h2>
+            </div>
 
             <div class="item">
               <img src="/contactUsPng3.png" />
               <p class="t1">{{ L["客服邮箱"] }}</p>
-              <p>{{siteEmail}}</p>
+              <p>{{ siteEmail }}</p>
             </div>
 
             <div class="item">
               <img src="/contactUsPng2.png" />
               <p class="t1">{{ L["联系人电话"] }}</p>
-              <p>{{sitePhone}}</p>
+              <p>{{ sitePhone }}</p>
             </div>
 
             <div class="item">
               <img src="/contactUsPng1.png" />
               <p class="t1">{{ L["公司地址"] }}</p>
-              <p>{{siteAddress}}</p>
+              <p>{{ siteAddress }}</p>
             </div>
-
-        </div>
-        <div class="sr-layout-block fr" v-if="ifMapReload">
-          <div class="sr-txt-title">
-            <h2 class="sr-txt-h2">{{ L["将您的消息发送到此供应商"] }}</h2>
           </div>
-          <el-form
-            ref="ruleFormRef"
-            :model="form"
-            label-position="top"
-            label-width="120px"
-            :rules="rules"
-            size="large"
-            status-icon
-          >
-            <el-row :gutter="20">
-              <el-col :span="12">
-                <el-form-item :label= "L['姓名']" prop="name">
-                  <el-input
-                    v-model="form.name"
-                    :placeholder="L['请输入姓名']"
-                    clearable
-                  />
-                </el-form-item>
-              </el-col>
-              <el-col :span="12">
-                <el-form-item :label="L['邮箱']" prop="email">
-                  <el-input
-                    v-model="form.email"
-                    :placeholder="L['请输入邮箱']"
-                  />
-                </el-form-item>
-              </el-col>
-              <el-col :span="12">
-                <el-form-item :label="L['电话代码']" prop="phoneCode">
-                  <el-select v-model="form.phoneCode" :placeholder="L['选择国家/地区']" filterable clearable allow-create style="width: 100%">
-                    <el-option
-                            v-for="item in countryPhone"
-                            :key="item.value"
-                            :label="item.label"
-                            :value="(item.label+'/'+item.value)">
-                      <span style="float: left">{{ item.label }}</span>
-                      <span style="float: right; color: #8492a6; font-size: 13px">{{ item.value }}</span>
-                    </el-option>
-                  </el-select>
-                </el-form-item>
-              </el-col>
-              <el-col :span="12">
-                <el-form-item :label="L['电话']" prop="phone">
-                  <el-input
-                    v-model="form.phone"
-                    :placeholder="L['请输入电话']"
-                  />
-                </el-form-item>
-              </el-col>
-              <el-col :span="24">
-                <el-form-item :label="L['公司名称']" prop="company">
-                  <el-input
-                    v-model="form.company"
-                    :placeholder="L['请输入公司名称']"
-                  />
-                </el-form-item>
-              </el-col>
-              <el-col :span="24">
-                <el-form-item :label="L['留言']" prop="message">
-                  <el-input
-                    v-model="form.message"
-                    type="textarea"
-                    :rows="8"
-                    :placeholder="L['请输入留言']"
-                  />
-                </el-form-item>
-              </el-col>
-              <el-col :span="24">
-                <el-form-item>
-                  <el-button
-                    type="primary"
-                    class="self-btn"
-                    @click="submitForm(ruleFormRef)"
-                    style="flex: 48% 0 0; margin: 10px 1% 0"
-                    :loading="loading"
-                    >{{ L["发送"]}}</el-button
+          <div class="sr-layout-block fr" v-if="ifMapReload">
+            <div class="sr-txt-title">
+              <h2 class="sr-txt-h2">{{ L["将您的消息发送到此供应商"] }}</h2>
+            </div>
+            <el-form
+              ref="ruleFormRef"
+              :model="form"
+              label-position="top"
+              label-width="120px"
+              :rules="rules"
+              size="large"
+              status-icon
+            >
+              <el-row :gutter="20">
+                <el-col :span="12">
+                  <el-form-item :label="L['姓名']" prop="name">
+                    <el-input
+                      v-model="form.name"
+                      :placeholder="L['请输入姓名']"
+                      clearable
+                    />
+                  </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                  <el-form-item
+                    v-if="contactType === 'email'"
+                    :label="L['邮箱']"
+                    prop="email"
+                  >
+                    <el-input
+                      v-model="form.email"
+                      :placeholder="L['请输入邮箱']"
+                    />
+                  </el-form-item>
+                  <el-form-item
+                    v-if="contactType === 'mobile'"
+                    :label="L['电话']"
+                    prop="phone"
                   >
-                  <el-button
-                    @click="closeModal(ruleFormRef)"
-                    style="flex: 48% 0 0; margin: 10px 1% 0"
-                    class="cancel-btn"
-                    >{{ L["重置"]}}</el-button
+                    <el-input
+                      v-model="form.phone"
+                      :placeholder="L['请输入手机号']"
+                    />
+                  </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                  <el-form-item :label="L['电话代码']" prop="phoneCode">
+                    <el-select
+                      v-model="form.phoneCode"
+                      :placeholder="L['选择国家/地区']"
+                      filterable
+                      clearable
+                      allow-create
+                      style="width: 100%"
+                    >
+                      <el-option
+                        v-for="item in countryPhone"
+                        :key="item.value"
+                        :label="item.label"
+                        :value="item.label + '/' + item.value"
+                      >
+                        <span style="float: left">{{ item.label }}</span>
+                        <span
+                          style="float: right; color: #8492a6; font-size: 13px"
+                          >{{ item.value }}</span
+                        >
+                      </el-option>
+                    </el-select>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                  <el-form-item
+                    v-if="contactType === 'mobile'"
+                    :label="L['邮箱']"
+                    prop="email"
                   >
-                </el-form-item>
-              </el-col>
-            </el-row>
-          </el-form>
+                    <el-input
+                      v-model="form.email"
+                      :placeholder="L['请输入邮箱']"
+                    />
+                  </el-form-item>
+                  <el-form-item
+                    v-if="contactType === 'email'"
+                    :label="L['电话']"
+                    prop="phone"
+                  >
+                    <el-input
+                      v-model="form.phone"
+                      :placeholder="L['请输入电话']"
+                    />
+                  </el-form-item>
+                </el-col>
+                <el-col :span="24">
+                  <el-form-item :label="L['公司名称']" prop="company">
+                    <el-input
+                      v-model="form.company"
+                      :placeholder="L['请输入公司名称']"
+                    />
+                  </el-form-item>
+                </el-col>
+                <el-col :span="24">
+                  <el-form-item :label="L['留言']" prop="message">
+                    <el-input
+                      v-model="form.message"
+                      type="textarea"
+                      :rows="8"
+                      :placeholder="L['请输入留言']"
+                    />
+                  </el-form-item>
+                </el-col>
+                <el-col :span="24">
+                  <el-form-item>
+                    <el-button
+                      type="primary"
+                      class="self-btn"
+                      @click="submitForm(ruleFormRef)"
+                      style="flex: 48% 0 0; margin: 10px 1% 0"
+                      :loading="loading"
+                      >{{ L["发送"] }}</el-button
+                    >
+                    <el-button
+                      @click="closeModal(ruleFormRef)"
+                      style="flex: 48% 0 0; margin: 10px 1% 0"
+                      class="cancel-btn"
+                      >{{ L["重置"] }}</el-button
+                    >
+                  </el-form-item>
+                </el-col>
+              </el-row>
+            </el-form>
+          </div>
         </div>
-      </div>
-      <div v-if="ifMapReload && center.lat != ''">
-        <GoogleMap
-          api-key="AIzaSyAvTVnnDLfxdaK2i-f0pRMJOrdwZvxUBjU"
-          style="width: 100%; height: 500px"
-          :center="center"
-          :zoom="3"
+        <div v-if="ifMapReload && center.lat != ''">
+          <GoogleMap
+            api-key="AIzaSyAvTVnnDLfxdaK2i-f0pRMJOrdwZvxUBjU"
+            style="width: 100%; height: 500px"
+            :center="center"
+            :zoom="3"
           >
-          <Marker :options="markerOptions" />
+            <Marker :options="markerOptions" />
           </GoogleMap>
-
+        </div>
       </div>
     </div>
-    </div>
- 
   </div>
 </template>
 
 <script setup>
 import {
-ElSelect,
+  ElSelect,
   ElOption,
   ElMessage,
   ElForm,
@@ -153,18 +189,20 @@ ElSelect,
   ElCol,
 } from "element-plus";
 import { useFiltersStore } from "@/store/filter.js";
-import { GoogleMap, Marker } from 'vue3-google-map'
-import { getCurLanguage } from '@/composables/common.js';
+import { GoogleMap, Marker } from "vue3-google-map";
+import { getCurLanguage } from "@/composables/common.js";
+import { getContactType } from "../../utils/common";
+
 const L = getCurLanguage();
-const center = { lat: '', lng:'' };
+const center = { lat: "", lng: "" };
 const route = useRoute();
-const router = useRouter()
+const router = useRouter();
 const vid = route.query.vid;
 const ruleFormRef = ref(null);
 const siteAddress = ref();
 const sitePhone = ref();
 const siteEmail = ref();
-const ifMapReload = ref(false)
+const ifMapReload = ref(false);
 const loading = ref(false);
 const form = reactive({
   name: "",
@@ -176,28 +214,27 @@ const form = reactive({
 });
 const filtersStore = useFiltersStore();
 const countryPhone = ref([]);
+const contactType = getContactType();
 
-if(filtersStore.getMemberInfo.memberEmail){
-  form.email = filtersStore.getMemberInfo.memberEmail
-}
-if(filtersStore.getMemberInfo.memberNickName || filtersStore.getMemberInfo.memberName){
-  form.name = filtersStore.getMemberInfo.memberNickName || filtersStore.getMemberInfo.memberName
-}
+const { memberEmail, memberNickName, memberName, memberMobile, memberCompany} = filtersStore.getMemberInfo;
+form.email = memberEmail ?? "";
+form.name = memberNickName ?? memberName ?? "";
+form.phone = memberMobile ?? '';
+form.company = memberCompany ?? ""
 
 useHead({
-    title: 'Contact Us',
-    meta: [
-      {
-        name: "description",
-        content:'Contact Us',
-      },
-      {
-        name: "keywords",
-        content: 'Contact Us',
-      },
-    ],
-  });
-
+  title: "Contact Us",
+  meta: [
+    {
+      name: "description",
+      content: "Contact Us",
+    },
+    {
+      name: "keywords",
+      content: "Contact Us",
+    },
+  ],
+});
 
 const checkEmailFun = (rule, value, callback) => {
   if (checkEmail(value) !== true) {
@@ -221,21 +258,21 @@ const closeModal = (formEl) => {
 
 const rules = reactive({
   name: [{ required: true, message: L["请输入姓名"], trigger: "blur" }],
-  email: [
-    { required: true, message: L["请输入邮箱"], trigger: "blur" },
-    { validator: checkEmailFun, trigger: "blur" },
-  ],
+  email: contactType === "email" ? [
+     { required: true, message: L["请输入邮箱"], trigger: "blur" },
+     { validator: checkEmailFun, trigger: "blur" },
+  ] : [],
   phoneCode: [
     {
       required: true,
       message: L["请选择国家/地区"],
-      trigger: ['blur','change'],
+      trigger: ["blur", "change"],
     },
   ],
-  // phone: [
-  //   { required: true, message: L["请输入电话"], trigger: "blur" },
-  //   // { validator: checkPhoneFun, trigger: "blur" },
-  // ],
+  phone: contactType === "mobile" ? [
+    { required: true, message: L["请输入电话"], trigger: "blur" },
+    { validator: checkPhoneFun, trigger: "blur" },
+  ] : [],
   company: [
     {
       required: true,
@@ -252,11 +289,8 @@ const rules = reactive({
   ],
 });
 
-
 const markerOptions = { position: center };
 
-
-
 //提交按钮
 const submitForm = async (formEl) => {
   if (!formEl) return;
@@ -279,26 +313,28 @@ const submitForm = async (formEl) => {
         });
       }
       loading.value = true;
-      let d = {}
-      d = Object.assign({},form) 
+      let d = {};
+      d = Object.assign({}, form);
       d.pageUrl = window.location.href;
       d.itemId = vid ? vid : "";
       d.itemType = vid ? "SHOP" : "MALL";
-      let a = d.phoneCode
-      d.phoneCode = a.split('/')[1] ?  a.split('/')[1] : ''
-      d.country = a.split('/')[0]
-      post(url, d).then((res) => {
-        loading.value = false;
-        if (res.state == 200) {
-          ElMessage.success(res.msg);
+      let a = d.phoneCode;
+      d.phoneCode = a.split("/")[1] ? a.split("/")[1] : "";
+      d.country = a.split("/")[0];
+      post(url, d)
+        .then((res) => {
+          loading.value = false;
+          if (res.state == 200) {
+            ElMessage.success(res.msg);
 
-          closeModal(formEl);
-        } else {
-          ElMessage.error(res.msg);
-        }
-      }).finally(()=>{
-        loading.value = false;
-      });
+            closeModal(formEl);
+          } else {
+            ElMessage.error(res.msg);
+          }
+        })
+        .finally(() => {
+          loading.value = false;
+        });
     } else {
       console.log("error submit!", fields);
     }
@@ -307,32 +343,36 @@ const submitForm = async (formEl) => {
 
 //获取经纬度
 const getMapInfo = () => {
-  get('v3/system/front/setting/getSettings?names=pt_map_parameter,pt_map_parameter_1,basic_site_address,basic_site_phone,basic_site_email').then(res=>{
-    center.lat = parseFloat(res.data[0])
-    center.lng = parseFloat(res.data[1])
-    siteAddress.value = res.data[2]
-    sitePhone.value = res.data[3]
-    siteEmail.value = res.data[4]
-    ifMapReload.value =true
-  })
-}
+  get(
+    "v3/system/front/setting/getSettings?names=pt_map_parameter,pt_map_parameter_1,basic_site_address,basic_site_phone,basic_site_email"
+  ).then((res) => {
+    center.lat = parseFloat(res.data[0]);
+    center.lng = parseFloat(res.data[1]);
+    siteAddress.value = res.data[2];
+    sitePhone.value = res.data[3];
+    siteEmail.value = res.data[4];
+    ifMapReload.value = true;
+  });
+};
 
 //获取国家电话code
 const getPhoneCode = () => {
-  get('v3/member/front/enquiry/phoneCode').then(res=>{
+  get("v3/member/front/enquiry/phoneCode").then((res) => {
     countryPhone.value = res.data;
-  })
-}
-
+  });
+};
 
 onMounted(() => {
   setTimeout(() => {
-      sldStatEvent({ behaviorType: 'pv',pageUrl: defaultUrl + router.currentRoute.value.path, referrerPageUrl: apiUrl  });
-    }, 3000)
-  getMapInfo()
-  getPhoneCode()
-})
-
+    sldStatEvent({
+      behaviorType: "pv",
+      pageUrl: defaultUrl + router.currentRoute.value.path,
+      referrerPageUrl: apiUrl,
+    });
+  }, 3000);
+  getMapInfo();
+  getPhoneCode();
+});
 </script>
 
 <style lang="scss" scoped>

+ 37 - 9
xinkeaboard-web/pages/member/account.vue

@@ -22,26 +22,52 @@
             }"
           ></i>
           <div class="item_info flex_row_start_center">
-            <span class="s1">{{ L["电子邮箱"] }}</span>
-            <span class="tips" v-if="memberInfo.data.memberEmail"
-              >{{L["绑定邮箱"]}}:{{
-                memberInfo.data.memberEmail
-              }},{{L["若邮箱已停用,请及时更换"]}}</span
-            >
-            <span class="no tips" v-else>{{L["尚未绑定邮箱"]}}</span>
-            <div class="s2">
+            <span class="s1">{{ L[contactType === 'email' ? "电子邮箱" : '手机号'] }}</span>
+            <span v-if="contactType === 'email'">
+              <span class="tips" v-if="memberInfo.data.memberEmail"
+                >{{L["绑定邮箱"]}}:{{
+                  memberInfo.data.memberEmail
+                }},{{L["若邮箱已停用,请及时更换"]}}</span
+              >
+              <span class="no tips" v-else>{{L['尚未绑定邮箱']}}</span>
+            </span>
+            <span v-else>
+              <span class="tips" v-if="memberInfo.data.memberMobile"
+                >{{L["绑定手机号"]}}:{{
+                  memberInfo.data.memberMobile
+                }},{{L["若手机已停用,请及时更换"]}}</span
+              >
+              <span class="no tips" v-else>{{L['尚未绑定手机号']}}</span>
+            </span>
+            <div class="s2" v-if="contactType === 'email'">
               <span
                 class="oprate pointer"
                 @click="toPage('/member/email', 'edit')"
                 v-if="memberInfo.data.memberEmail"
                 >{{L["修改邮箱"]}}</span
               >
+             
               <span
                 class="oprate pointer"
                 @click="toPage('/member/email', 'bind')"
-                v-else
+                v-if="!memberInfo.data.memberEmail"
                 >{{L["绑定邮箱"]}}</span
               >
+              
+            </div>
+            <div class="s2" v-if="contactType === 'mobile'">
+              <span
+                class="oprate pointer"
+                @click="toPage('/member/email', 'edit')"
+                v-if="memberInfo.data.memberMobile"
+                >{{L["修改手机号"]}}</span
+              >
+              <span
+                class="oprate pointer"
+                @click="toPage('/member/email', 'bind')"
+                v-if="!memberInfo.data.memberMobile"
+                >{{L["绑定手机号"]}}</span
+              >
             </div>
           </div>
         </div>
@@ -85,7 +111,9 @@ import { useRouter } from "vue-router";
 // import { lang_zn } from "@/assets/language/zh";
 import { getCurLanguage } from '@/composables/common.js';
 import { useFiltersStore } from "@/store/filter.js";
+import { getContactType } from "@/utils/common";
 const filtersStore = useFiltersStore();
+const contactType = getContactType();
 // const L = lang_zn;
 const L = getCurLanguage();
 definePageMeta({

+ 5 - 2
xinkeaboard-web/pages/member/index/home.vue

@@ -7,8 +7,9 @@
           <img :src="memberInfoFromData.info.memberAvatar" class="head_img" />
         </div>
         <div class="info">
-            <p>Name:  {{ memberInfoFromData.info.memberNickName }} ({{ memberInfoFromData.info.memberName }})</p>
-            <p>Email:  {{memberInfoFromData.info.memberEmail}}</p>
+            <p>{{ L['会员名:'] }}:  {{ memberInfoFromData.info.memberNickName }} ({{ contactType === 'email' ? memberInfoFromData.info.memberName : memberInfoFromData.info.memberMobile }})</p>
+            <p v-if="contactType === 'email'">Email:  {{memberInfoFromData.info.memberEmail}}</p>
+            <p v-if="contactType === 'mobile'">联系方式:  {{ memberInfoFromData.info.memberMobile }}</p>
         </div>
       </div>
     </div>
@@ -215,10 +216,12 @@ import { reactive, onMounted, getCurrentInstance, ref } from "vue";
 import { useRouter } from "vue-router";
 import { ElDialog,ElForm,ElFormItem } from "element-plus";
 import { getCurLanguage } from '@/composables/common.js';
+import { getContactType } from "@/utils/common"
 definePageMeta({
   layout: "member",
   middleware: ["auth"],
 });
+const contactType = getContactType();
 // const L = lang_zn;
 const L = getCurLanguage();
 const router = useRouter();

+ 3 - 1
xinkeaboard-web/pages/member/info.vue

@@ -117,8 +117,10 @@ import { ElInput, ElButton, ElMessage,ElRadioGroup,ElRadio } from "element-plus"
 import axios from "axios";
 import { getCurLanguage } from '@/composables/common.js';
 import { useFiltersStore } from "@/store/filter.js";
+import { getContactType } from "@/utils/common";
 const L = getCurLanguage();
 const filtersStore = useFiltersStore();
+const contactType = getContactType();
 definePageMeta({
   layout: "member",
   middleware: ["auth"],
@@ -180,7 +182,7 @@ const getInitData = () => {
   //初始化数据
   get("v3/member/front/member/memberInfo").then((res) => {
     if (res.state == 200) {
-      memberNameInput.value = res.data.memberName;
+      memberNameInput.value = contactType === 'email' ? res.data.memberName : res.data.memberMobile;
       memberNickNameInput.value = res.data.memberNickName;
       tempSrc.value = res.data.memberAvatar;
       memberTrueName.value = res.data.memberTrueName;

+ 3 - 3
xinkeaboard-web/pages/register.vue

@@ -35,9 +35,9 @@
           <div class="top">
             <div class="item1">{{ title }}</div>
           </div>
-          <RegisterPhone v-if="currentStep === 'first' && appType === 'distributor'" @success="(val) => { currentStep = 'second'; phone = val  }" />
+          <RegisterPhone v-if="currentStep === 'first' && appType === 'distributor'" @success="(val) => { currentStep = 'second'; mobile = val  }" />
           <RegisterMail v-if="currentStep === 'first' && appType === 'user'" @success="(val) => { currentStep = 'second'; email = val  }" />
-          <RegisterAccount v-if="currentStep === 'second'" :email="email" :phone="phone" @success="currentStep = 'finish'"/>
+          <RegisterAccount v-if="currentStep === 'second'" :email="email" :mobile="mobile" @success="currentStep = 'finish'"/>
           <RegisterSuccess v-if="currentStep === 'finish'"/>
           <div :class="{ bottom: true, flex_row_between_center: true, 'row-reverse': currentStep !== 'emai' }">
             <a href="javascript:void(0)" @click="goToPage('/login')">{{
@@ -75,7 +75,7 @@ const defaultBgImg = ref("/login_bg.png");
 const fromurl = ref("");
 const ImgBG = ref("");
 const email = ref('');
-const phone = ref('')
+const mobile = ref('')
 
 const config = useRuntimeConfig()
 const appType = config.public.appType;

+ 13 - 1
xinkeaboard-web/utils/common.ts

@@ -43,7 +43,19 @@ export function startCountdown(
   }, 1000);
 }
 
-export const webSiteRelation: Record<string, string> = {
+export const webSiteFlagRelation: Record<string, string> = {
     'user': '1', // 海外用户
     'distributor': '2' // 国内分销商
 }
+
+const webSiteContactRelation: Record<string, string> = {
+  'user': 'email', // 海外用户
+  'distributor': 'mobile' // 国内分销商
+}
+
+export const getContactType = () => {
+  const config = useRuntimeConfig()
+  const contactType = webSiteContactRelation[config.public.appType];
+
+  return contactType;
+}