info.vue 6.7 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"
  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. const L = getCurLanguage();
  117. const filtersStore = useFiltersStore();
  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 = res.data.memberName;
  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>