Browse Source

修改组件名称

ZaiZai 11 months ago
parent
commit
a1c512a2d5
5 changed files with 319 additions and 27 deletions
  1. 1 1
      package.json
  2. 99 16
      src/api/modules/system/user.js
  3. 1 1
      src/views/system/menu.vue
  4. 214 5
      src/views/user/index.vue
  5. 4 4
      yarn.lock

+ 1 - 1
package.json

@@ -21,7 +21,7 @@
         "dayjs": "^1.11.10",
         "echarts": "^5.5.0",
         "element-plus": "2.6.1",
-        "hc-vue3-ui": "^3.5.3",
+        "hc-vue3-ui": "^3.5.6",
         "js-base64": "^3.7.7",
         "js-fast-way": "^0.4.7",
         "js-md5": "^0.8.3",

+ 99 - 16
src/api/modules/system/user.js

@@ -3,35 +3,118 @@ import { HcApi } from '../../request/index'
 export default {
     async page(form) {
         return HcApi({
-            url: '/api/blade-system/param/list',
+            url: '/api/blade-user/page',
             method: 'get',
             params: form,
-        }, false)
+        })
     },
-    //菜单详情
+    //详情
     async detail(id) {
         return HcApi({
-            url: '/api/blade-system/param/detail',
+            url: '/api/blade-user/detail',
             method: 'get',
-            params: {
-                id,
-            },
-        }, false)
+            params: { id },
+        })
     },
-    async submit(form) {
+    async add(form) {
         return HcApi({
-            url: '/api/blade-system/param/submit',
+            url: '/api/blade-user/submit2',
             method: 'post',
             data: form,
-        }, false)
+        })
+    },
+    async up(form) {
+        return HcApi({
+            url: '/api/blade-user/update2',
+            method: 'post',
+            data: form,
+        })
     },
     async del(ids) {
         return HcApi({
-            url: '/api/blade-system/param/remove',
+            url: '/api/blade-user/remove',
+            method: 'post',
+            params: { ids },
+        })
+    },
+    //userId, userType, userExt
+    async updatePlatform(form) {
+        return HcApi({
+            url: '/api/blade-user/update-platform',
+            method: 'post',
+            params: form,
+        })
+    },
+    async getUserPlatform(id) {
+        return HcApi({
+            url: '/api/blade-user/platform-detail',
+            method: 'get',
+            params: { id },
+        })
+    },
+    async getUserInfo() {
+        return HcApi({
+            url: '/api/blade-user/info',
+            method: 'get',
+            params: {},
+        })
+    },
+    async resetPassword(ids) {
+        return HcApi({
+            url: '/api/blade-user/reset-password',
             method: 'post',
-            params: {
-                ids,
-            },
-        }, false)
+            params: { userIds: ids },
+        })
+    },
+    //oldPassword, newPassword, newPassword1, plaintextPassword
+    async updatePassword(form) {
+        return HcApi({
+            url: '/api/blade-user/update-password',
+            method: 'post',
+            params: form,
+        })
+    },
+    async updateInfo(form) {
+        return HcApi({
+            url: '/api/blade-user/update-info',
+            method: 'post',
+            data: form,
+        })
+    },
+    //userIds, roleIds
+    async grant(form) {
+        return HcApi({
+            url: '/api/blade-user/grant',
+            method: 'post',
+            params: form,
+        })
+    },
+    async unlock(ids) {
+        return HcApi({
+            url: '/api/blade-user/unlock',
+            method: 'post',
+            params: { userIds: ids },
+        })
+    },
+    async lock(ids) {
+        return HcApi({
+            url: '/api/blade-user/lock',
+            method: 'post',
+            params: { userIds: ids },
+        })
+    },
+    async getUserList(form) {
+        return HcApi({
+            url: '/api/blade-user/user-list',
+            method: 'get',
+            params: form,
+        })
+    },
+    async removeUserProjectInfoAndRoleById(form) {
+        return HcApi({
+            url: '/api/blade-manager/contractInfo/remove-userProjectInfo-role-byId',
+            method: 'post',
+            params: form,
+        })
     },
 }

+ 1 - 1
src/views/system/menu.vue

@@ -16,7 +16,7 @@
         </template>
         <hc-table
             ref="tableRef" :column="tableColumn" :datas="tableData" :loading="tableLoading"
-            :is-index="false"  is-check :check-style="{ width: 29 }" lazy :load="tableLoad"
+            :is-index="false" is-check :check-style="{ width: 29 }" lazy :load="tableLoad"
             @selection-change="tableCheckChange"
         >
             <template #sysId="{ row }">

+ 214 - 5
src/views/user/index.vue

@@ -1,15 +1,224 @@
 <template>
-    <hc-card>
-        1
+    <hc-card is-action-btn>
+        <el-tabs tab-position="left" class="hc-h-full">
+            <el-tab-pane label="个人信息">
+                <div class="relative w-[460px] p-4">
+                    <el-form ref="formUserRef" :model="formUserModel" :rules="formUserRules" label-position="top">
+                        <el-form-item label="头像图片:" prop="avatar">
+                            <hc-form-upload type="preview" :src="formUserModel.avatar" :num="1" @upload="avatarUpload" />
+                        </el-form-item>
+                        <el-form-item label="姓名:" prop="name">
+                            <el-input v-model="formUserModel.name" />
+                        </el-form-item>
+                        <el-form-item label="用户名:" prop="realName">
+                            <el-input v-model="formUserModel.realName" />
+                        </el-form-item>
+                        <el-form-item label="手机号码:" prop="phone">
+                            <el-input v-model="formUserModel.phone" />
+                        </el-form-item>
+                        <el-form-item label="电子邮箱:">
+                            <el-input v-model="formUserModel.email" />
+                        </el-form-item>
+                    </el-form>
+                </div>
+            </el-tab-pane>
+            <el-tab-pane label="修改密码">
+                <div class="relative w-[460px] p-4">
+                    <el-form ref="formPasswordRef" :model="formPasswordModel" :rules="formPasswordRules" label-position="top">
+                        <el-form-item label="原密码:" prop="oldPassword">
+                            <el-input v-model="formPasswordModel.oldPassword" />
+                        </el-form-item>
+                        <el-form-item label="新密码:" prop="newPassword">
+                            <el-input v-model="formPasswordModel.newPassword" />
+                        </el-form-item>
+                        <el-form-item label="确认密码:" prop="newPassword1">
+                            <el-input v-model="formPasswordModel.newPassword1" />
+                        </el-form-item>
+                    </el-form>
+                </div>
+            </el-tab-pane>
+        </el-tabs>
+
+        <!-- 上传文件 -->
+        <hc-upload-file ref="uploadRef" :options="uploadOptions" @success="uploadSuccess" />
+
+        <template #action>
+            <el-button hc-btn @click="resetClick">重置</el-button>
+            <el-button hc-btn type="primary" :loading="submitLoading" @click="submitClick">提交</el-button>
+        </template>
     </hc-card>
 </template>
 
 <script setup>
+import { onActivated, ref } from 'vue'
+import { getHeader } from 'hc-vue3-ui'
+import { deepClone, formValidate, getObjValue, isPhone } from 'js-fast-way'
+import mainApi from '~api/system/user'
+import { reloadPage } from '~uti/tools.js'
+
 defineOptions({
     name: 'UserInfo',
 })
-</script>
 
-<style scoped lang="scss">
+onActivated(() => {
+    getUserInfoApi()
+})
+
+//获取用户信息
+const oldUserInfo = ref({})
+const getUserInfoApi = async () => {
+    const { data } = await mainApi.getUserInfo()
+    const res = getObjValue(data)
+    oldUserInfo.value = res
+    formUserModel.value = deepClone(res)
+}
+
+//个人信息表单
+const formUserRef = ref(null)
+const formUserModel = ref({})
+const formUserRules = {
+    avatar: {
+        required: true,
+        trigger: 'blur',
+        message: '请上传头像图片',
+    },
+    name: {
+        required: true,
+        trigger: 'blur',
+        message: '请输入姓名',
+    },
+    realName: {
+        required: true,
+        trigger: 'blur',
+        message: '请输入用户名',
+    },
+    phone: {
+        required: true,
+        validator: (rule, value, callback) => {
+            if (!value) {
+                callback(new Error('请输入手机号'))
+            } else if (!isPhone(value)) {
+                callback(new Error('手机号码格式错误'))
+            } else {
+                callback()
+            }
+        },
+        trigger: 'blur',
+    },
+}
+
+//密码表单
+const formPasswordRef = ref(null)
+const formPasswordModel = ref({})
+const formPasswordRules = {
+    oldPassword: {
+        required: true,
+        trigger: 'blur',
+        message: '请上传头像图片',
+    },
+    newPassword: {
+        required: true,
+        validator: (rule, value, callback) => {
+            const { newPassword1 } = formPasswordModel.value
+            if (!value) {
+                callback(new Error('请输入新的密码'))
+            } else if (newPassword1 && value !== newPassword1) {
+                callback(new Error('新的密码和确认新密码不一致'))
+            } else {
+                callback()
+            }
+        },
+        trigger: 'blur',
+    },
+    newPassword1: {
+        required: true,
+        validator: (rule, value, callback) => {
+            const { newPassword } = formPasswordModel.value
+            if (!value) {
+                callback(new Error('请输入确认新密码'))
+            } else if (newPassword && value !== newPassword) {
+                callback(new Error('新的密码和确认新密码不一致'))
+            } else {
+                callback()
+            }
+        },
+        trigger: 'blur',
+    },
+}
+
 
-</style>
+//上传文件
+const uploadRef = ref(null)
+const uploadOptions = ref({
+    url: '/api/blade-resource/oss/endpoint/put-file2',
+    headers: getHeader(),
+    multiple: false,
+    accept: '.png,.jpg,.jpeg,.gif,.awebp,.webp',
+    accept_tip: '只能上传png/jpg/jpeg/gif/awebp/webp格式的图片文件',
+    size: 30,
+})
+
+//上传头像
+const avatarUpload = () => {
+    uploadRef.value?.selectFile()
+}
+
+// 文件上传成功的回调
+const uploadSuccess = ({ resData }) => {
+    formUserModel.value.avatar = resData
+    uploadRef.value?.setModalShow(false)
+}
+
+//重置
+const resetClick = () => {
+    formUserModel.value = deepClone(oldUserInfo.value)
+}
+
+//提交
+const submitLoading = ref(false)
+const submitClick = async () => {
+    submitLoading.value = true
+    //修改用户信息
+    const isUserRes = await updateUserInfo()
+    //修改密码
+    const isPasswordRes = await updatePasswordInfo()
+    submitLoading.value = false
+    //状态提示
+    if (isUserRes || isPasswordRes) {
+        window?.$message?.success('保存成功')
+        reloadPage()
+    }
+}
+
+//修改用户信息
+const updateUserInfo = async () => {
+    const formRes = await formValidate(formUserRef.value)
+    if (!formRes) return false
+    const { id, avatar, name, realName, phone, email } = formUserModel.value
+    const { error, code, msg } = await mainApi.updateInfo({
+        id, avatar, name, realName, phone, email,
+    })
+    if (!error && code === 200) {
+        return true
+    } else {
+        window?.$message?.error(msg ?? '操作失败')
+        return false
+    }
+}
+
+//修改密码
+const updatePasswordInfo = async () => {
+    const formRes = await formValidate(formPasswordRef.value)
+    if (!formRes) return false
+    const { oldPassword, newPassword, newPassword1 } = formPasswordModel.value
+    const { error, code, msg } = await mainApi.updatePassword({
+        oldPassword, newPassword, newPassword1, plaintextPassword: newPassword,
+    })
+    if (!error && code === 200) {
+        return true
+    } else {
+        window?.$message?.error(msg ?? '操作失败')
+        return false
+    }
+}
+</script>

+ 4 - 4
yarn.lock

@@ -2054,10 +2054,10 @@ has-flag@^4.0.0:
   resolved "http://39.108.216.210:9000/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
   integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
 
-hc-vue3-ui@^3.5.3:
-  version "3.5.3"
-  resolved "http://39.108.216.210:9000/hc-vue3-ui/-/hc-vue3-ui-3.5.3.tgz#d86e6d41b949a86a41894de00a68cb77e96fec74"
-  integrity sha512-k67JhL0TD6mIZ/VbkxA2MISNXq9KeD7niS4fmoAXaMScftD+AkbWYUVEoEXbQGn0pmT//h0FmwxuKpL5lWDhmg==
+hc-vue3-ui@^3.5.6:
+  version "3.5.6"
+  resolved "http://39.108.216.210:9000/hc-vue3-ui/-/hc-vue3-ui-3.5.6.tgz#7c4ffc9f7a4a6b6a22faa62df6a87c03a80ef0cb"
+  integrity sha512-6ZMkugoQum5WNOfltKTKHBSPLghAkd7EBbwrKlIEuSyivMm4l1zydllgLgLfEVxOXBg2avIshPJB/6DbA8+97A==
   dependencies:
     axios "^1.6.7"
     dayjs "^1.11.10"