diff --git a/build_ui/src/assets/images/avatars/admin.jpg b/build_ui/src/assets/images/avatars/admin.jpg new file mode 100644 index 000000000..305a91839 Binary files /dev/null and b/build_ui/src/assets/images/avatars/admin.jpg differ diff --git a/build_ui/src/assets/images/avatars/default.jpg b/build_ui/src/assets/images/avatars/default.jpg new file mode 100644 index 000000000..9b7d1834c Binary files /dev/null and b/build_ui/src/assets/images/avatars/default.jpg differ diff --git a/build_ui/src/assets/images/avatars/student.jpg b/build_ui/src/assets/images/avatars/student.jpg new file mode 100644 index 000000000..8e94a665c Binary files /dev/null and b/build_ui/src/assets/images/avatars/student.jpg differ diff --git a/build_ui/src/assets/images/avatars/teacher.jpg b/build_ui/src/assets/images/avatars/teacher.jpg new file mode 100644 index 000000000..b6dcf1fbd Binary files /dev/null and b/build_ui/src/assets/images/avatars/teacher.jpg differ diff --git a/build_ui/src/assets/images/avatars/train_admin.jpg b/build_ui/src/assets/images/avatars/train_admin.jpg new file mode 100644 index 000000000..40026a5de Binary files /dev/null and b/build_ui/src/assets/images/avatars/train_admin.jpg differ diff --git a/build_ui/src/assets/images/kg.png b/build_ui/src/assets/images/kg.png deleted file mode 100644 index ff2f70c4d..000000000 Binary files a/build_ui/src/assets/images/kg.png and /dev/null differ diff --git a/build_ui/src/assets/images/kg1.png b/build_ui/src/assets/images/kg1.png deleted file mode 100644 index a2dfb2c0f..000000000 Binary files a/build_ui/src/assets/images/kg1.png and /dev/null differ diff --git a/build_ui/src/assets/images/login-background.jpg b/build_ui/src/assets/images/login-background.jpg deleted file mode 100644 index 8a89eb829..000000000 Binary files a/build_ui/src/assets/images/login-background.jpg and /dev/null differ diff --git a/build_ui/src/assets/images/profile.jpg b/build_ui/src/assets/images/profile.jpg deleted file mode 100644 index b3a940b21..000000000 Binary files a/build_ui/src/assets/images/profile.jpg and /dev/null differ diff --git a/build_ui/src/assets/images/version.png b/build_ui/src/assets/images/version.png deleted file mode 100644 index 5020e2e53..000000000 Binary files a/build_ui/src/assets/images/version.png and /dev/null differ diff --git a/build_ui/src/layout/components/Navbar.vue b/build_ui/src/layout/components/Navbar.vue index a8ad43565..6cd2b538a 100644 --- a/build_ui/src/layout/components/Navbar.vue +++ b/build_ui/src/layout/components/Navbar.vue @@ -32,6 +32,7 @@ import { mapGetters } from 'vuex' import Breadcrumb from '@/components/Breadcrumb' import TopNav from '@/components/TopNav' import Hamburger from '@/components/Hamburger' +import { getRoleAvatar } from '@/utils/avatar' export default { components: { @@ -41,7 +42,6 @@ export default { }, data() { return { - defaultAvatar: require('@/assets/images/profile.jpg'), avatarLoadFailed: false } }, @@ -49,11 +49,12 @@ export default { ...mapGetters([ 'sidebar', 'avatar', - 'device' + 'device', + 'roles' ]), avatarSrc() { if (this.avatarLoadFailed || !this.avatar) { - return this.defaultAvatar + return getRoleAvatar(this.roles) } return this.avatar }, diff --git a/build_ui/src/store/modules/user.js b/build_ui/src/store/modules/user.js index e79a260a5..6464b1745 100644 --- a/build_ui/src/store/modules/user.js +++ b/build_ui/src/store/modules/user.js @@ -1,5 +1,6 @@ import { login, logout, getInfo } from '@/api/login' import { getToken, setToken, removeToken, setDpToken } from '@/utils/auth' +import { getRoleAvatar } from '@/utils/avatar' import axios from 'axios' import {setting} from "@/config"; @@ -85,7 +86,12 @@ const user = { return new Promise((resolve, reject) => { getInfo().then(res => { const user = res.user - const avatar = (user.avatar == "" || user.avatar == null) ? require("@/assets/images/profile.jpg") : process.env.VUE_APP_BASE_API + user.avatar; + const isBrokenAvatar = user.avatar && user.avatar.includes('899d3f8e438f427eac6aeec76e489b52') + const avatar = (user.avatar == "" || user.avatar == null || isBrokenAvatar) + ? getRoleAvatar(res.roles) + : (user.avatar.indexOf('http') === 0 || user.avatar.indexOf('data:') === 0 + ? user.avatar + : process.env.VUE_APP_BASE_API + user.avatar); // 先写入业务身份标志,保证角色就绪时自服务判定已同步到位;后端未返回时按无身份处理 commit('SET_SELF_SERVICE', res.selfService) if (res.roles && res.roles.length > 0) { // 验证返回的roles是否是一个非空数组 diff --git a/build_ui/src/utils/avatar.js b/build_ui/src/utils/avatar.js new file mode 100644 index 000000000..e04f7c690 --- /dev/null +++ b/build_ui/src/utils/avatar.js @@ -0,0 +1,66 @@ +import defaultAvatar from '@/assets/images/avatars/default.jpg' +import adminAvatar from '@/assets/images/avatars/admin.jpg' +import trainAdminAvatar from '@/assets/images/avatars/train_admin.jpg' +import teacherAvatar from '@/assets/images/avatars/teacher.jpg' +import studentAvatar from '@/assets/images/avatars/student.jpg' + +export { + defaultAvatar, + adminAvatar, + trainAdminAvatar, + teacherAvatar, + studentAvatar +} + +/** + * 根据用户角色判定合适的职业默认头像 + * @param {Array|string} roles 用户角色数组或角色key + * @returns {string} 头像资源路径 + */ +export function getRoleAvatar(roles) { + if (!roles) return defaultAvatar + const roleList = Array.isArray(roles) ? roles : [roles] + if (roleList.includes('admin')) { + return adminAvatar + } + if (roleList.includes('train_admin')) { + return trainAdminAvatar + } + if (roleList.includes('train_teacher')) { + return teacherAvatar + } + if (roleList.includes('train_student')) { + return studentAvatar + } + return defaultAvatar +} + +/** + * 获取教师头像 (空或404死链时返回专业讲师头像) + * @param {string} avatar 数据库中的头像路径 + * @returns {string} + */ +export function getTeacherAvatar(avatar) { + if (!avatar || avatar.trim() === '' || avatar.includes('899d3f8e438f427eac6aeec76e489b52')) { + return teacherAvatar + } + if (avatar.indexOf('http') === 0 || avatar.indexOf('data:') === 0) { + return avatar + } + return process.env.VUE_APP_BASE_API + avatar +} + +/** + * 获取学员头像 (空或404死链时返回专业学员工装头像) + * @param {string} avatar 数据库中的头像路径 + * @returns {string} + */ +export function getStudentAvatar(avatar) { + if (!avatar || avatar.trim() === '' || avatar.includes('899d3f8e438f427eac6aeec76e489b52')) { + return studentAvatar + } + if (avatar.indexOf('http') === 0 || avatar.indexOf('data:') === 0) { + return avatar + } + return process.env.VUE_APP_BASE_API + avatar +} diff --git a/build_ui/src/views/system/user/profile/userAvatar.vue b/build_ui/src/views/system/user/profile/userAvatar.vue index b429e6d07..75f74f25d 100644 --- a/build_ui/src/views/system/user/profile/userAvatar.vue +++ b/build_ui/src/views/system/user/profile/userAvatar.vue @@ -58,6 +58,7 @@ import store from '@/store' import { VueCropper } from 'vue-cropper' import { uploadAvatar } from '@/api/system/user' import { debounce } from '@/utils' +import { getRoleAvatar } from '@/utils/avatar' export default { components: { VueCropper }, @@ -75,7 +76,7 @@ export default { // 弹出层标题 title: '修改头像', options: { - img: store.getters.avatar, // 裁剪图片的地址 + img: store.getters.avatar || getRoleAvatar(store.getters.roles), // 裁剪图片的地址 autoCrop: true, // 是否默认生成截图框 autoCropWidth: 200, // 默认生成截图框宽度 autoCropHeight: 200, // 默认生成截图框高度 @@ -88,7 +89,7 @@ export default { }, methods: { handleAvatarError() { - this.options.img = require('@/assets/images/profile.jpg') + this.options.img = getRoleAvatar(store.getters.roles) }, // 编辑头像 editCropper() { diff --git a/build_ui/src/views/train/me/student/index.vue b/build_ui/src/views/train/me/student/index.vue index 2cfb5538f..6c827c6e6 100644 --- a/build_ui/src/views/train/me/student/index.vue +++ b/build_ui/src/views/train/me/student/index.vue @@ -35,7 +35,7 @@