info.vue 6.8 KB

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