contact.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382
  1. <template>
  2. <div>
  3. <SldHomeTopSearch />
  4. <NavTopBar />
  5. <NavCatHeader />
  6. <div class="bottom_line"></div>
  7. <div class="self_background">
  8. <div class="wrap clearfix">
  9. <div class="s1">
  10. <div class="sr-layout-block fl">
  11. <div class="sr-txt-title">
  12. <h2 class="sr-txt-h2">{{ L["取得联系"] }}</h2>
  13. </div>
  14. <div class="item">
  15. <img src="/contactUsPng3.png" />
  16. <p class="t1">{{ L["客服邮箱"] }}</p>
  17. <p>{{ siteEmail }}</p>
  18. </div>
  19. <div class="item">
  20. <img src="/contactUsPng2.png" />
  21. <p class="t1">{{ L["联系人电话"] }}</p>
  22. <p>{{ sitePhone }}</p>
  23. </div>
  24. <div class="item">
  25. <img src="/contactUsPng1.png" />
  26. <p class="t1">{{ L["公司地址"] }}</p>
  27. <p>{{ siteAddress }}</p>
  28. </div>
  29. </div>
  30. <div class="sr-layout-block fr" v-if="ifMapReload">
  31. <div class="sr-txt-title">
  32. <h2 class="sr-txt-h2">{{ L["将您的消息发送到此供应商"] }}</h2>
  33. </div>
  34. <el-form
  35. ref="ruleFormRef"
  36. :model="form"
  37. label-position="top"
  38. label-width="120px"
  39. :rules="rules"
  40. size="large"
  41. status-icon
  42. >
  43. <el-row :gutter="20">
  44. <el-col :span="12">
  45. <el-form-item :label="L['姓名']" prop="name">
  46. <el-input
  47. v-model="form.name"
  48. :placeholder="L['请输入姓名']"
  49. clearable
  50. />
  51. </el-form-item>
  52. </el-col>
  53. <el-col :span="12">
  54. <el-form-item
  55. v-if="contactType === 'email'"
  56. :label="L['邮箱']"
  57. prop="email"
  58. >
  59. <el-input
  60. v-model="form.email"
  61. :placeholder="L['请输入邮箱']"
  62. />
  63. </el-form-item>
  64. <el-form-item
  65. v-if="contactType === 'mobile'"
  66. :label="L['电话']"
  67. prop="phone"
  68. >
  69. <el-input
  70. v-model="form.phone"
  71. :placeholder="L['请输入手机号']"
  72. />
  73. </el-form-item>
  74. </el-col>
  75. <el-col :span="12">
  76. <el-form-item :label="L['电话代码']" prop="phoneCode">
  77. <el-select
  78. v-model="form.phoneCode"
  79. :placeholder="L['选择国家/地区']"
  80. filterable
  81. clearable
  82. allow-create
  83. style="width: 100%"
  84. >
  85. <el-option
  86. v-for="item in countryPhone"
  87. :key="item.value"
  88. :label="item.label"
  89. :value="item.label + '/' + item.value"
  90. >
  91. <span style="float: left">{{ item.label }}</span>
  92. <span
  93. style="float: right; color: #8492a6; font-size: 13px"
  94. >{{ item.value }}</span
  95. >
  96. </el-option>
  97. </el-select>
  98. </el-form-item>
  99. </el-col>
  100. <el-col :span="12">
  101. <el-form-item
  102. v-if="contactType === 'mobile'"
  103. :label="L['邮箱']"
  104. prop="email"
  105. >
  106. <el-input
  107. v-model="form.email"
  108. :placeholder="L['请输入邮箱']"
  109. />
  110. </el-form-item>
  111. <el-form-item
  112. v-if="contactType === 'email'"
  113. :label="L['电话']"
  114. prop="phone"
  115. >
  116. <el-input
  117. v-model="form.phone"
  118. :placeholder="L['请输入电话']"
  119. />
  120. </el-form-item>
  121. </el-col>
  122. <el-col :span="24">
  123. <el-form-item :label="L['公司名称']" prop="company">
  124. <el-input
  125. v-model="form.company"
  126. :placeholder="L['请输入公司名称']"
  127. />
  128. </el-form-item>
  129. </el-col>
  130. <el-col :span="24">
  131. <el-form-item :label="L['留言']" prop="message">
  132. <el-input
  133. v-model="form.message"
  134. type="textarea"
  135. :rows="8"
  136. :placeholder="L['请输入留言']"
  137. />
  138. </el-form-item>
  139. </el-col>
  140. <el-col :span="24">
  141. <el-form-item>
  142. <el-button
  143. type="primary"
  144. class="self-btn"
  145. @click="submitForm(ruleFormRef)"
  146. style="flex: 48% 0 0; margin: 10px 1% 0"
  147. :loading="loading"
  148. >{{ L["发送"] }}</el-button
  149. >
  150. <el-button
  151. @click="closeModal(ruleFormRef)"
  152. style="flex: 48% 0 0; margin: 10px 1% 0"
  153. class="cancel-btn"
  154. >{{ L["重置"] }}</el-button
  155. >
  156. </el-form-item>
  157. </el-col>
  158. </el-row>
  159. </el-form>
  160. </div>
  161. </div>
  162. <div v-if="ifMapReload && center.lat != ''">
  163. <GoogleMap
  164. api-key="AIzaSyAvTVnnDLfxdaK2i-f0pRMJOrdwZvxUBjU"
  165. style="width: 100%; height: 500px"
  166. :center="center"
  167. :zoom="3"
  168. >
  169. <Marker :options="markerOptions" />
  170. </GoogleMap>
  171. </div>
  172. </div>
  173. </div>
  174. </div>
  175. </template>
  176. <script setup>
  177. import {
  178. ElSelect,
  179. ElOption,
  180. ElMessage,
  181. ElForm,
  182. ElFormItem,
  183. ElButton,
  184. ElInput,
  185. ElRow,
  186. ElCol,
  187. } from "element-plus";
  188. import { useFiltersStore } from "@/store/filter.js";
  189. import { GoogleMap, Marker } from "vue3-google-map";
  190. import { getCurLanguage } from "@/composables/common.js";
  191. import { getContactType } from "../../utils/common";
  192. const L = getCurLanguage();
  193. const center = { lat: "", lng: "" };
  194. const route = useRoute();
  195. const router = useRouter();
  196. const vid = route.query.vid;
  197. const ruleFormRef = ref(null);
  198. const siteAddress = ref();
  199. const sitePhone = ref();
  200. const siteEmail = ref();
  201. const ifMapReload = ref(false);
  202. const loading = ref(false);
  203. const form = reactive({
  204. name: "",
  205. email: "",
  206. phoneCode: "",
  207. phone: "",
  208. company: "",
  209. message: "",
  210. });
  211. const filtersStore = useFiltersStore();
  212. const countryPhone = ref([]);
  213. const contactType = getContactType();
  214. const { memberEmail, memberNickName, memberName, memberMobile, memberCompany} = filtersStore.getMemberInfo;
  215. form.email = memberEmail ?? "";
  216. form.name = memberNickName ?? memberName ?? "";
  217. form.phone = memberMobile ?? '';
  218. form.company = memberCompany ?? ""
  219. useHead({
  220. title: "Contact Us",
  221. meta: [
  222. {
  223. name: "description",
  224. content: "Contact Us",
  225. },
  226. {
  227. name: "keywords",
  228. content: "Contact Us",
  229. },
  230. ],
  231. });
  232. const checkEmailFun = (rule, value, callback) => {
  233. if (checkEmail(value) !== true) {
  234. callback(new Error(checkEmail(value)));
  235. }
  236. callback();
  237. };
  238. const checkPhoneFun = (rule, value, callback) => {
  239. if (checkPhone(value) !== true) {
  240. callback(new Error(checkPhone(value)));
  241. }
  242. callback();
  243. };
  244. const closeModal = (formEl) => {
  245. if (!formEl) return;
  246. formEl.resetFields();
  247. loading.value = false;
  248. };
  249. const rules = reactive({
  250. name: [{ required: true, message: L["请输入姓名"], trigger: "blur" }],
  251. email: contactType === "email" ? [
  252. { required: true, message: L["请输入邮箱"], trigger: "blur" },
  253. { validator: checkEmailFun, trigger: "blur" },
  254. ] : [],
  255. phoneCode: [
  256. {
  257. required: true,
  258. message: L["请选择国家/地区"],
  259. trigger: ["blur", "change"],
  260. },
  261. ],
  262. phone: contactType === "mobile" ? [
  263. { required: true, message: L["请输入电话"], trigger: "blur" },
  264. { validator: checkPhoneFun, trigger: "blur" },
  265. ] : [],
  266. company: [
  267. {
  268. required: true,
  269. message: L["请输入公司名称"],
  270. trigger: "blur",
  271. },
  272. ],
  273. message: [
  274. {
  275. required: true,
  276. message: L["请输入留言"],
  277. trigger: "blur",
  278. },
  279. ],
  280. });
  281. const markerOptions = { position: center };
  282. //提交按钮
  283. const submitForm = async (formEl) => {
  284. if (!formEl) return;
  285. await formEl.validate((valid, fields) => {
  286. if (valid) {
  287. const url = "v3/member/front/enquiry/save";
  288. if (!filtersStore.getLoginFlag) {
  289. //未登录提示登录
  290. return openLoginDialog({
  291. onRegister: () => {
  292. router.push({
  293. path: "/register",
  294. });
  295. },
  296. onForgot: () => {
  297. router.push({
  298. path: "/member/login/forget",
  299. });
  300. },
  301. });
  302. }
  303. loading.value = true;
  304. let d = {};
  305. d = Object.assign({}, form);
  306. d.pageUrl = window.location.href;
  307. d.itemId = vid ? vid : "";
  308. d.itemType = vid ? "SHOP" : "MALL";
  309. let a = d.phoneCode;
  310. d.phoneCode = a.split("/")[1] ? a.split("/")[1] : "";
  311. d.country = a.split("/")[0];
  312. post(url, d)
  313. .then((res) => {
  314. loading.value = false;
  315. if (res.state == 200) {
  316. ElMessage.success(res.msg);
  317. closeModal(formEl);
  318. } else {
  319. ElMessage.error(res.msg);
  320. }
  321. })
  322. .finally(() => {
  323. loading.value = false;
  324. });
  325. } else {
  326. console.log("error submit!", fields);
  327. }
  328. });
  329. };
  330. //获取经纬度
  331. const getMapInfo = () => {
  332. get(
  333. "v3/system/front/setting/getSettings?names=pt_map_parameter,pt_map_parameter_1,basic_site_address,basic_site_phone,basic_site_email"
  334. ).then((res) => {
  335. center.lat = parseFloat(res.data[0]);
  336. center.lng = parseFloat(res.data[1]);
  337. siteAddress.value = res.data[2];
  338. sitePhone.value = res.data[3];
  339. siteEmail.value = res.data[4];
  340. ifMapReload.value = true;
  341. });
  342. };
  343. //获取国家电话code
  344. const getPhoneCode = () => {
  345. get("v3/member/front/enquiry/phoneCode").then((res) => {
  346. countryPhone.value = res.data;
  347. });
  348. };
  349. onMounted(() => {
  350. setTimeout(() => {
  351. sldStatEvent({
  352. behaviorType: "pv",
  353. pageUrl: defaultUrl + router.currentRoute.value.path,
  354. referrerPageUrl: apiUrl,
  355. });
  356. }, 3000);
  357. getMapInfo();
  358. getPhoneCode();
  359. });
  360. </script>
  361. <style lang="scss" scoped>
  362. @import "@/assets/style/store/contac-about.scss";
  363. @import "@/assets/style/contact.scss";
  364. </style>