loganInfo.tsx 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409
  1. import {
  2. defineComponent,
  3. toRefs,
  4. reactive,
  5. onMounted,
  6. ref,
  7. nextTick,
  8. computed
  9. } from 'vue'
  10. import {
  11. ElTag,
  12. ElDropdown,
  13. ElDropdownItem,
  14. ElDropdownMenu,
  15. ElMessageBox,
  16. ElMessage
  17. } from 'element-plus'
  18. import classes from './index.module.less'
  19. import teacherHeader from '@/common/images/icon_teacher.png'
  20. import { state } from '@/state'
  21. import userBanner from '../images/userBanner.png'
  22. import changeIcon from '../images/changeIcon.png'
  23. import backIcon from '../images/backIcon.png'
  24. import peopleIcon from '../images/peopleIcon.png'
  25. import planIcon from '../images/planIcon.png'
  26. import memberIcon from '../images/memberIcon.png'
  27. import noMemberIcon from '../images/noMemberIcon.png'
  28. import ablumIcon from '../images/ablumIcon.png'
  29. import noAblumIcon from '../images/noAblumIcon.png'
  30. import onlineIcon from '../images/onlineIcon.png'
  31. import noOnlineIcon from '../images/noOnlineIcon.png'
  32. import styleIcon from '../images/styleIcon.png'
  33. import nostyleIcon from '../images/noStyleIcon.png'
  34. import videoIcon from '../images/videoIcon.png'
  35. import noVideoIcon from '../images/noVideoIcon.png'
  36. import sVipIcon from '../images/sVipIcon.png'
  37. import vipIcon from '../images/vipIcon.png'
  38. import noVipIcon from '../images/noVipIcon.png'
  39. import icon_back from '@/common/images/icon_back.png'
  40. import {
  41. getUserInfo,
  42. getUserType,
  43. getAuth,
  44. setAuth,
  45. removeAuth
  46. } from '@/helpers/utils'
  47. import { useRoute, useRouter } from 'vue-router'
  48. import request from '@/helpers/request'
  49. import mitt from '@/helpers/mitt'
  50. export default defineComponent({
  51. name: 'loganInfo',
  52. props: {
  53. title: {
  54. type: String,
  55. default: ''
  56. }
  57. },
  58. setup(props, conent) {
  59. const states = reactive({
  60. title: props.title,
  61. user: {} as any,
  62. userType: '',
  63. showChange: false,
  64. iconList: [] as any
  65. })
  66. mitt.on('mittFn', () => {
  67. console.log('mittFn')
  68. setUser()
  69. })
  70. const route = useRoute()
  71. const router = useRouter()
  72. const users = computed(() => {
  73. return state.user.data
  74. })
  75. onMounted(() => {
  76. nextTick(() => {
  77. setUser()
  78. })
  79. })
  80. // 检验是否有对应徽章
  81. const checkBadge = (type: string) => {
  82. // tag : 老师点亮图标
  83. // STYLE:个人风采
  84. // VIDEO:视频课
  85. // LIVE:直播课,
  86. // MUSIC:曲目 逗号隔开
  87. let status = false
  88. const userInfo = users.value
  89. switch (type) {
  90. case 'STYLE':
  91. case 'VIDEO':
  92. case 'LIVE':
  93. case 'MUSIC':
  94. if (userInfo.tag) {
  95. status = userInfo.tag.indexOf(type) > -1
  96. }
  97. break
  98. case 'VIP':
  99. status = userInfo.userVip?.vipType === 'VIP'
  100. break
  101. case 'SVIP':
  102. status =
  103. userInfo.userVip?.vipType === 'SVIP' ||
  104. userInfo.userVip?.vipType === 'PERMANENT_SVIP'
  105. break
  106. default:
  107. status = false
  108. break
  109. }
  110. return status
  111. }
  112. const setUser = () => {
  113. states.user = users.value
  114. console.log(users.value, 'users.value')
  115. states.userType = getUserType()
  116. if (states.user.userType) {
  117. if (
  118. states.user.userType.indexOf('TEACHER') != -1 &&
  119. states.user.userType.indexOf('STUDENT') != -1
  120. ) {
  121. states.showChange = true
  122. } else {
  123. states.showChange = false
  124. }
  125. }
  126. // iconList
  127. if (states.userType == 'TEACHER') {
  128. states.iconList = []
  129. if (checkBadge('VIP') || checkBadge('SVIP')) {
  130. states.iconList.push(memberIcon)
  131. } else {
  132. states.iconList.push(noMemberIcon)
  133. }
  134. if (checkBadge('STYLE')) {
  135. states.iconList.push(styleIcon)
  136. } else {
  137. states.iconList.push(nostyleIcon)
  138. }
  139. if (checkBadge('VIDEO')) {
  140. states.iconList.push(videoIcon)
  141. } else {
  142. states.iconList.push(noVideoIcon)
  143. }
  144. if (checkBadge('LIVE')) {
  145. states.iconList.push(onlineIcon)
  146. } else {
  147. states.iconList.push(noOnlineIcon)
  148. }
  149. if (checkBadge('MUSIC')) {
  150. states.iconList.push(ablumIcon)
  151. } else {
  152. states.iconList.push(noAblumIcon)
  153. }
  154. } else {
  155. states.iconList = []
  156. }
  157. console.log('查看用户登录态', states.user)
  158. }
  159. const gotoPage = (val: string) => {
  160. router.push({ path: val })
  161. }
  162. const changeRoute = () => {
  163. const token = getAuth()
  164. let userType = ''
  165. let str = ''
  166. let nowPath = route.fullPath
  167. if (states.userType == 'TEACHER') {
  168. userType = 'STUDENT'
  169. str = '学生'
  170. if (nowPath.indexOf('userInfo') != -1) {
  171. nowPath = '/studentInfo'
  172. }
  173. } else {
  174. userType = 'TEACHER'
  175. str = '老师'
  176. if (nowPath.indexOf('studentInfo') != -1) {
  177. nowPath = '/userInfo'
  178. }
  179. }
  180. ElMessageBox.confirm(`是否确定切换到${str}?`, '提示', {
  181. type: 'warning'
  182. }).then(async () => {
  183. try {
  184. const url =
  185. userType === 'TEACHER'
  186. ? '/api-website/teacher/queryUserInfo'
  187. : '/api-website/student/queryUserInfo'
  188. const { data } = await request.get(url)
  189. console.log(data, userType)
  190. if (data.lockFlag) {
  191. // 账号已锁定
  192. ElMessage.error(`无法切换,${str}账号异常`)
  193. } else {
  194. setAuth(
  195. JSON.stringify({
  196. token,
  197. loginUserType: userType
  198. })
  199. )
  200. router.push({ path: '/' }).then(() => {
  201. window.location.reload()
  202. })
  203. }
  204. } catch {
  205. // state.user.status = 'init'
  206. }
  207. })
  208. }
  209. const logout = async () => {
  210. try {
  211. await request.get('/api-auth/exit', {})
  212. router.push({ path: '/' })
  213. removeAuth()
  214. setTimeout(() => {
  215. window.location.reload()
  216. }, 100)
  217. } catch (e) {
  218. console.log(e)
  219. }
  220. }
  221. const gotoFans = (nowPath: string) => {
  222. router.push({ path: nowPath })
  223. }
  224. const changeState = (val: string) => {
  225. if (val == 'strudent') {
  226. gotoPage('/studentInfo')
  227. } else if (val == 'teacher') {
  228. gotoPage('/userInfo')
  229. } else if (val == 'change') {
  230. changeRoute()
  231. } else if (val == 'back') {
  232. logout()
  233. }
  234. }
  235. return {
  236. ...toRefs(states),
  237. users,
  238. gotoPage,
  239. changeRoute,
  240. checkBadge,
  241. logout,
  242. changeState,
  243. gotoFans
  244. }
  245. },
  246. render() {
  247. return (
  248. <>
  249. <ElDropdown
  250. onCommand={val => this.changeState(val)}
  251. popper-class="loginPopper"
  252. trigger="hover"
  253. v-slots={{
  254. dropdown: () => (
  255. <>
  256. <div class={classes.dropdownWrap}>
  257. <div class={classes.dropdownWrapUser}>
  258. <div class={classes.userInfoWrap1}>
  259. {/* <img
  260. src={
  261. this.user.heardUrl
  262. ? this.user.heardUrl
  263. : teacherHeader
  264. }
  265. class={classes.userHeader}
  266. alt=""
  267. /> */}
  268. <div class={classes.titleWrap}>
  269. <p class={classes.title}>{this.user.username}</p>
  270. {(this.checkBadge('VIP') ||
  271. this.checkBadge('SVIP')) && (
  272. <img
  273. class={classes.vipLogo}
  274. src={
  275. this.checkBadge('SVIP')
  276. ? sVipIcon
  277. : this.checkBadge('VIP')
  278. ? vipIcon
  279. : noVipIcon
  280. }
  281. style="object-fit: cover;"
  282. alt=""
  283. />
  284. )}
  285. </div>
  286. <div class={classes.iconList}>
  287. {this.userType == 'TEACHER' ? (
  288. <p class={classes.teacherTag}>{'老师'}</p>
  289. ) : (
  290. <p class={classes.studentTag}>{'学生'}</p>
  291. )}
  292. {this.iconList.map(item => (
  293. <img class={classes.icon} src={item} alt="" />
  294. ))}
  295. </div>
  296. </div>
  297. {/* <img src={userBanner} alt="" /> */}
  298. </div>
  299. {this.userType == 'TEACHER' ? (
  300. <div class={classes.dropdownInfo}>
  301. <div
  302. class={classes.dropdownItem}
  303. onClick={() => this.gotoFans('/userInfo/myFans')}
  304. >
  305. <p class={classes.dropdownItemTitle}>
  306. {this.users.fansNum || 0}
  307. </p>
  308. <p class={classes.dropdownItemsubTitle}>粉丝</p>
  309. </div>
  310. <div
  311. class={classes.dropdownItem}
  312. onClick={() => this.gotoFans('/userInfo/musicClass')}
  313. >
  314. <p class={classes.dropdownItemTitle}>
  315. {this.users.musicSheetNum || 0}
  316. </p>
  317. <p class={classes.dropdownItemsubTitle}>乐谱</p>
  318. </div>
  319. {/* <div class={classes.dropdownItem}>
  320. <p class={classes.dropdownItemTitle}>134</p>
  321. <p class={classes.dropdownItemsubTitle}>帖子</p>
  322. </div> */}
  323. </div>
  324. ) : null}
  325. <ElDropdownMenu>
  326. {this.userType == 'TEACHER' ? (
  327. <ElDropdownItem command="teacher" class="backItem">
  328. <div class="dropdownItemWrap">
  329. <img
  330. class={classes.dropdownImg}
  331. src={peopleIcon}
  332. alt=""
  333. />{' '}
  334. 个人中心
  335. </div>
  336. <img src={icon_back} alt="" class="icon_back" />
  337. </ElDropdownItem>
  338. ) : (
  339. <ElDropdownItem command="strudent" class="backItem">
  340. <div class="dropdownItemWrap">
  341. <img
  342. class={classes.dropdownImg}
  343. src={peopleIcon}
  344. alt=""
  345. />{' '}
  346. 个人中心
  347. </div>
  348. <img src={icon_back} alt="" class="icon_back" />
  349. </ElDropdownItem>
  350. )}
  351. {/* <ElDropdownItem onClick={gotoPage('')}><img class={classes.dropdownImg} src={planIcon} alt="" /> 创作中心</ElDropdownItem> */}
  352. {this.showChange ? (
  353. <ElDropdownItem command="change" class="backItem">
  354. <div class="dropdownItemWrap">
  355. <img
  356. class={classes.dropdownImg}
  357. src={changeIcon}
  358. alt=""
  359. />{' '}
  360. 角色切换
  361. </div>
  362. <div class="changeWrap">
  363. <span>
  364. {' '}
  365. {this.userType == 'TEACHER' ? '学生' : '老师'}
  366. </span>
  367. <img src={icon_back} alt="" class="icon_back" />
  368. </div>
  369. </ElDropdownItem>
  370. ) : null}
  371. <ElDropdownItem command="back" class="backItem">
  372. <div class="lineItem">
  373. <div class="backWrap">
  374. <img class="backIcon" src={backIcon} alt="" />{' '}
  375. 退出登录
  376. </div>
  377. <img src={icon_back} alt="" class="icon_back" />
  378. </div>
  379. </ElDropdownItem>
  380. </ElDropdownMenu>
  381. </div>
  382. </>
  383. )
  384. }}
  385. >
  386. <div class={classes.userInfoWrap}>
  387. {/* <p class={classes.title}>{this.user.username}</p> */}
  388. <img
  389. src={this.user.heardUrl ? this.user.heardUrl : teacherHeader}
  390. class={classes.userHeader}
  391. alt=""
  392. />
  393. </div>
  394. </ElDropdown>
  395. </>
  396. )
  397. }
  398. })