info.vue 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  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"><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 changepic = (e) => {
  132. //上传头像
  133. let newsrc = getObjectURL(e.target.files[0]);
  134. let data = new FormData();
  135. data.append("file", e.target.files[0]);
  136. data.append("source", "headImg");
  137. let config = {
  138. headers: { "Content-Type": "multipart/form-data" },
  139. };
  140. let url = apiUrl + "v3/oss/common/upload";
  141. if (e.target.files[0].size < Math.pow(1024, 2) * 4) {
  142. tempSrc.value = newsrc;
  143. axios.post(url, data, config).then((res) => {
  144. if (res.status === 200) {
  145. ElMessage.success(L["上传图片成功"]);
  146. tempSrc.value = res.data.data.url;
  147. avatar.value = res.data.data.path;
  148. } else {
  149. ElMessage.warning(L["上传图片失败"]);
  150. }
  151. });
  152. } else {
  153. ElMessage.warning(L["图像应小于4MB"]);
  154. tempSrc.value = avatar.value;
  155. }
  156. };
  157. const getObjectURL = (file) => {
  158. //createObjectURL在前端显示更换后的头像
  159. var url = null;
  160. if (window.createObjectURL != undefined) {
  161. // basic
  162. url = window.createObjectURL(file);
  163. } else if (window.URL != undefined) {
  164. // mozilla(firefox)
  165. url = window.URL.createObjectURL(file);
  166. } else if (window.webkitURL != undefined) {
  167. // webkit or chrome
  168. url = window.webkitURL.createObjectURL(file);
  169. }
  170. return url;
  171. };
  172. const getInitData = () => {
  173. //初始化数据
  174. get("v3/member/front/member/memberInfo").then((res) => {
  175. if (res.state == 200) {
  176. memberNameInput.value = contactType === 'email' ? res.data.memberName : res.data.memberMobile;
  177. memberNickNameInput.value = res.data.memberNickName;
  178. tempSrc.value = res.data.memberAvatar;
  179. memberTrueName.value = res.data.memberTrueName;
  180. member_company.value = res.data.memberCompany;
  181. member_main_product.value = res.data.memberMainProduct;
  182. }
  183. });
  184. };
  185. const memberInfoSave = () => {
  186. //保存
  187. if (!avatar.value) {
  188. avatar.value = tempSrc.value;
  189. }
  190. let reg =
  191. /[`~!@#$%^&*()_\-+=<>?:"{}|,.\/;'\\[\]·~!@#¥%……&*()——\-+={}|《》?:“”【】、;‘’,。、]/im;
  192. if (memberTrueName.value && reg.test(memberTrueName.value)) {
  193. ElMessage.warning("真实姓名包含特殊字符,请重新输入");
  194. return;
  195. }
  196. let params = {
  197. memberAvatar: avatar.value,
  198. memberName: memberNameInput.value,
  199. memberTrueName:memberTrueName.value ? memberTrueName.value.toString().trim() : '',
  200. memberNickName:memberNickNameInput.value ? memberNickNameInput.value.toString().trim() : '',
  201. memberCompany:member_company.value,
  202. memberMainProduct:member_main_product.value
  203. };
  204. post("v3/member/front/member/updateInfo", params).then((res) => {
  205. if (res.state == 200) {
  206. ElMessage.success(res.msg);
  207. Object.assign(filtersStore.getMemberInfo,params)
  208. getInitData();
  209. } else {
  210. ElMessage.warning(res.msg);
  211. }
  212. });
  213. };
  214. onMounted(() => {
  215. getInitData();
  216. });
  217. </script>
  218. <style lang="scss">
  219. @import "@/assets/style/member/info.scss";
  220. </style>