index.vue 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. <template>
  2. <HcCard style="height:20%">
  3. <div class="top-box">
  4. <div class="user-avatar-box">
  5. <div class="user-avatar" v-loading="avatarLoading">
  6. <img :src="userInfo['avatar'] || avatarPng" alt="" crossOrigin="anonymous"/>
  7. <div class="user-avatar-upload">
  8. <el-upload class="upload-dom" :action="action" :accept="accept" :headers="getTokenHeader()" :data="upData" :show-file-list="false" :on-success="uploadFinish" :on-error="uploadError" :before-upload="beforeUpload">
  9. <HcIcon name="camera" fill/>
  10. </el-upload>
  11. </div>
  12. </div>
  13. <div class="user-name truncate">{{ userInfo['real_name'] || '游客' }}
  14. <div class="el-upload__tip" style="margin-top: 27px;">支持.jpg 、png格式</div>
  15. </div>
  16. </div>
  17. <div class="btn_box">
  18. <el-button type="primary" size="large" @click="updatePassword" v-if="!updatePasswordshow">
  19. <span>修改密码</span>
  20. </el-button>
  21. <el-button type="primary" size="large" @click="submit">
  22. <span>提交</span>
  23. </el-button>
  24. </div>
  25. </div>
  26. </HcCard>
  27. <HcCard style="height:77%;margin-top:1%">
  28. <div>
  29. <el-form ref="formUserRef" :model="formUserModel" :rules="formUserRules" size="large" label-position="left" v-if="!updatePasswordshow">
  30. <el-row :gutter="20">
  31. <el-col :span="12">
  32. <el-form-item label="用户姓名">
  33. <el-input v-model="formUserModel.real_name" />
  34. </el-form-item>
  35. </el-col>
  36. <el-col :span="12">
  37. <el-form-item label="身份证号">
  38. <el-input v-model="formUserModel.idNumber" placeholder="" />
  39. </el-form-item>
  40. </el-col>
  41. <el-col :span="12">
  42. <el-form-item label="手机号码" :prop="basicFormEdit?'phone':''">
  43. <el-input v-model="formUserModel.phone" placeholder="请输入绑定手机" />
  44. </el-form-item>
  45. </el-col>
  46. <el-col :span="12">
  47. <el-form-item label="所属岗位">
  48. <el-select v-model="formUserModel.phone" class="m-2" placeholder="Select" size="large">
  49. <el-option
  50. v-for="item in options"
  51. :key="item.value"
  52. :label="item.label"
  53. :value="item.value"
  54. />
  55. </el-select>
  56. </el-form-item>
  57. </el-col>
  58. <el-col :span="12">
  59. <el-form-item label="登录账号">
  60. <el-input v-model="formUserModel.account" placeholder="" />
  61. </el-form-item>
  62. </el-col>
  63. <el-col :span="12">
  64. <el-form-item label="密码">
  65. <el-input v-model="formUserModel.password" placeholder="" />
  66. </el-form-item>
  67. </el-col>
  68. </el-row>
  69. </el-form>
  70. <el-form ref="formUserRef" :model="formUserModel" :rules="formUserRules" label-position="left" v-else
  71. size="large" >
  72. <el-form-item label="原密码" prop="oldPassword" >
  73. <el-input v-model="formUserModel.newPassword" placeholder="请输入原密码" autocomplete="new-password"
  74. show-password type="password"/>
  75. </el-form-item>
  76. <el-form-item label="新的密码" prop="newPassword" >
  77. <el-input v-model="formUserModel.newPassword" placeholder="请输入新的密码" autocomplete="new-password"
  78. show-password type="password"/>
  79. </el-form-item>
  80. <el-form-item label="确认新密码" prop="newPassword1" >
  81. <el-input v-model="formUserModel.newPassword1" placeholder="请输入确认新密码" autocomplete="new-password"
  82. show-password type="password"/>
  83. </el-form-item>
  84. </el-form>
  85. </div>
  86. </HcCard>
  87. </template>
  88. <script setup>
  89. import {ref, watch} from "vue";
  90. import {useAppStore} from "~src/store";
  91. import avatarPng from '~src/assets/images/avatar.png';
  92. import {getTokenHeader} from '~src/api/request/header';
  93. const useAppState = useAppStore()
  94. //全局变量信息
  95. const userInfo = ref(useAppState.getUserInfo);
  96. //上传组件参数
  97. const action = '/api/blade-resource/oss/endpoint/put-file';
  98. const accept = 'image/png,image/jpg,image/jpeg';
  99. const upData = ref({})
  100. //上传前
  101. const avatarLoading = ref(false)
  102. const beforeUpload = () => {
  103. avatarLoading.value = true
  104. return true
  105. }
  106. //上传完成
  107. const uploadFinish = async (res) => {
  108. const link = res?.data?.link ?? '';
  109. const user_id = userInfo.value?.user_id ?? '';
  110. if (link) {
  111. const { error, code } = await userApi.updateUserInfo({avatar: link, id: user_id})
  112. if (!error && code === 200) {
  113. avatarLoading.value = false
  114. userInfo.value.avatar = link
  115. window?.$message?.success('更换头像成功')
  116. useAppState.setUserInfo(userInfo.value)
  117. } else {
  118. avatarLoading.value = false
  119. }
  120. } else {
  121. window?.$message?.warning('上传头像异常,请稍后再试')
  122. avatarLoading.value = false
  123. }
  124. }
  125. //上传失败
  126. const uploadError = () => {
  127. avatarLoading.value = false
  128. window?.$message?.warning('上传头像失败')
  129. }
  130. //基础信息表单
  131. const formUserRef = ref(null)
  132. const formUserModel = ref(userInfo.value)
  133. const formUserRules = {
  134. phone: {
  135. required: true,
  136. validator: (rule, value, callback) => {
  137. if (!value) {
  138. callback(new Error('请输入手机号'))
  139. } else if (!isPhone(value)) {
  140. callback(new Error('手机号码格式错误'))
  141. } else {
  142. callback()
  143. }
  144. },
  145. trigger: "blur"
  146. },
  147. }
  148. const updatePasswordshow=ref(false)
  149. const updatePassword=()=>{
  150. updatePasswordshow.value=true
  151. }
  152. const submit=()=>{
  153. updatePasswordshow.value=false
  154. }
  155. </script>
  156. <style lang="scss" scoped>
  157. .user-avatar-box {
  158. display: flex;
  159. position: relative;
  160. text-align: left;
  161. padding: 24px;
  162. .user-avatar {
  163. position: relative;
  164. height: 100px;
  165. width: 100px;
  166. border-radius: 50%;
  167. background: #d8d8d8;
  168. margin: 24px 0 0;
  169. border: 2px solid #ffffff;
  170. box-shadow: 7px 7px 8px 0 rgba(54,92,167,0.15), -7px -7px 8px 0 #ffffff, 4px 4px 8px 0 rgba(54,92,167,0.15), -4px -4px 8px 0 #ffffff;
  171. img {
  172. display: block;
  173. object-fit: cover;
  174. height: 100%;
  175. width: 100%;
  176. border-radius: 50%;
  177. }
  178. .user-avatar-upload {
  179. position: absolute;
  180. right: 0;
  181. bottom: 0;
  182. width: 24px;
  183. height: 24px;
  184. display: flex;
  185. align-items: center;
  186. justify-content: center;
  187. background: #f1f5f8;
  188. border-radius: 50%;
  189. color: #838791;
  190. cursor: pointer;
  191. box-shadow: 4px 4px 8px 0 rgba(54,92,167,0.15);
  192. transition: color 0.2s;
  193. &:hover {
  194. color: var(--el-color-primary);
  195. }
  196. }
  197. }
  198. .user-name {
  199. position: relative;
  200. margin-top: 38px;
  201. font-weight: bold;
  202. color: #1a1a1a;
  203. font-size: 28px;
  204. margin-left: 20px;
  205. }
  206. }
  207. .top-box{
  208. display: flex;
  209. position: relative;
  210. .btn_box{
  211. position: absolute;
  212. right: 0;
  213. bottom: 0;
  214. }
  215. }
  216. </style>
  217. <style lang="scss">
  218. </style>