info.vue 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. <template>
  2. <div class="member_info_container">
  3. <MemberTitle :memberTitle="L['会员信息']"></MemberTitle>
  4. <div class="member_info" v-loading="loading">
  5. <table class="form_item">
  6. <tbody>
  7. <tr>
  8. <td>
  9. <span class="tag_name">{{ L["用户头像"] }}:</span>
  10. </td>
  11. <td>
  12. <form action="" enctype="multipart/form-data">
  13. <label for="file" class="chooseBtn"><img :src="tempSrc" id="show"/></label>
  14. <input
  15. id="file"
  16. class="filepath"
  17. @change="changepic"
  18. type="file"
  19. name="image"
  20. size="1"
  21. accept="image/gif,image/jpeg,image/jpg,image/png,image/bmp"
  22. />
  23. </form>
  24. </td>
  25. </tr>
  26. <tr>
  27. <td></td>
  28. <td>
  29. {{
  30. L["仅支持JPG、GIF、PNG、JPEG、BMP格式;文件大小请在4.0MB之内。"]
  31. }}
  32. </td>
  33. </tr>
  34. <tr>
  35. <td>
  36. <span class="tag_name">{{ L["会员名:"] }}</span>
  37. </td>
  38. <td>
  39. <el-input
  40. id="memberName"
  41. v-model="memberNameInput"
  42. :disabled="true"
  43. ></el-input>
  44. </td>
  45. </tr>
  46. <tr>
  47. <td>
  48. <span class="tag_name">{{ L["真实姓名"] }}:</span>
  49. </td>
  50. <td>
  51. <el-input
  52. id="memberTrueName"
  53. v-model="memberTrueName"
  54. maxlength="10"
  55. show-word-limit
  56. >
  57. </el-input>
  58. </td>
  59. </tr>
  60. <tr>
  61. <td>
  62. <span class="tag_name">{{ L["昵称:"] }}</span>
  63. </td>
  64. <td>
  65. <el-input
  66. type="text"
  67. id="memberNickName"
  68. v-model="memberNickNameInput"
  69. maxlength="15"
  70. show-word-limit
  71. ></el-input>
  72. </td>
  73. </tr>
  74. <tr>
  75. <td>
  76. <span class="tag_name">{{ L["公司名称:"] }}</span>
  77. </td>
  78. <td>
  79. <el-input
  80. type="text"
  81. v-model="member_company"
  82. maxlength="100"
  83. show-word-limit
  84. ></el-input>
  85. </td>
  86. </tr>
  87. <tr>
  88. <td>
  89. <span class="tag_name">{{ L["主营产品:"] }}</span>
  90. </td>
  91. <td>
  92. <el-input
  93. type="textarea"
  94. v-model="member_main_product"
  95. maxlength="200"
  96. show-word-limit
  97. ></el-input>
  98. </td>
  99. </tr>
  100. </tbody>
  101. </table>
  102. <div class="memInfo_save">
  103. <el-button @click="memberInfoSave">{{ L["保存"] }}</el-button>
  104. </div>
  105. </div>
  106. </div>
  107. </template>
  108. <script setup>
  109. import { getCurrentInstance, ref, onMounted, watch } from 'vue';
  110. import { ElInput, ElButton, ElMessage,ElRadioGroup,ElRadio } from "element-plus";
  111. import axios from "axios";
  112. import { getCurLanguage } from '@/composables/common.js';
  113. import { useFiltersStore } from "@/store/filter.js";
  114. import { getContactType } from "@/utils/common";
  115. const L = getCurLanguage();
  116. const filtersStore = useFiltersStore();
  117. const contactType = getContactType();
  118. definePageMeta({
  119. layout: "member",
  120. middleware: ["auth"],
  121. });
  122. const { proxy } = getCurrentInstance();
  123. const memberNameInput = ref(""); //会员名
  124. const memberNickNameInput = ref(""); //会员名称
  125. const member_company = ref("")//公司名称
  126. const member_main_product = ref("")//主营产品
  127. const memberTrueName = ref(""); //会员姓名
  128. const avatar = ref(""); //用户头像
  129. const tempSrc = ref("");
  130. const sex = ref(0); //性别
  131. const loading = ref(false);
  132. const changepic = (e) => {
  133. //上传头像
  134. let newsrc = getObjectURL(e.target.files[0]);
  135. let data = new FormData();
  136. data.append("file", e.target.files[0]);
  137. data.append("source", "headImg");
  138. let config = {
  139. headers: { "Content-Type": "multipart/form-data" },
  140. };
  141. let url = apiUrl + "v3/oss/common/upload";
  142. if (e.target.files[0].size < Math.pow(1024, 2) * 4) {
  143. tempSrc.value = newsrc;
  144. axios.post(url, data, config).then((res) => {
  145. if (res.status === 200) {
  146. ElMessage.success(L["上传图片成功"]);
  147. tempSrc.value = res.data.data.url;
  148. avatar.value = res.data.data.path;
  149. } else {
  150. ElMessage.warning(L["上传图片失败"]);
  151. }
  152. });
  153. } else {
  154. ElMessage.warning(L["图像应小于4MB"]);
  155. tempSrc.value = avatar.value;
  156. }
  157. };
  158. const getObjectURL = (file) => {
  159. //createObjectURL在前端显示更换后的头像
  160. var url = null;
  161. if (window.createObjectURL != undefined) {
  162. // basic
  163. url = window.createObjectURL(file);
  164. } else if (window.URL != undefined) {
  165. // mozilla(firefox)
  166. url = window.URL.createObjectURL(file);
  167. } else if (window.webkitURL != undefined) {
  168. // webkit or chrome
  169. url = window.webkitURL.createObjectURL(file);
  170. }
  171. return url;
  172. };
  173. const getInitData = () => {
  174. //初始化数据
  175. loading.value = true;
  176. get("v3/member/front/member/memberInfo").then((res) => {
  177. if (res.state == 200) {
  178. memberNameInput.value = contactType === 'email' ? res.data.memberName : res.data.memberMobile;
  179. memberNickNameInput.value = res.data.memberNickName;
  180. tempSrc.value = res.data.memberAvatar;
  181. memberTrueName.value = res.data.memberTrueName;
  182. member_company.value = res.data.memberCompany;
  183. member_main_product.value = res.data.memberMainProduct;
  184. }
  185. }).finally(() => {
  186. loading.value = false;
  187. })
  188. };
  189. const memberInfoSave = () => {
  190. //保存
  191. if (!avatar.value) {
  192. avatar.value = tempSrc.value;
  193. }
  194. let reg =
  195. /[`~!@#$%^&*()_\-+=<>?:"{}|,.\/;'\\[\]·~!@#¥%……&*()——\-+={}|《》?:“”【】、;‘’,。、]/im;
  196. if (memberTrueName.value && reg.test(memberTrueName.value)) {
  197. ElMessage.warning("真实姓名包含特殊字符,请重新输入");
  198. return;
  199. }
  200. let params = {
  201. memberAvatar: avatar.value,
  202. memberName: memberNameInput.value,
  203. memberTrueName:memberTrueName.value ? memberTrueName.value.toString().trim() : '',
  204. memberNickName:memberNickNameInput.value ? memberNickNameInput.value.toString().trim() : '',
  205. memberCompany:member_company.value,
  206. memberMainProduct:member_main_product.value
  207. };
  208. post("v3/member/front/member/updateInfo", params).then((res) => {
  209. if (res.state == 200) {
  210. ElMessage.success(res.msg);
  211. Object.assign(filtersStore.getMemberInfo,params)
  212. getInitData();
  213. } else {
  214. ElMessage.warning(res.msg);
  215. }
  216. });
  217. };
  218. onMounted(() => {
  219. getInitData();
  220. });
  221. </script>
  222. <style lang="scss">
  223. @import "@/assets/style/member/info.scss";
  224. </style>