index.tsx 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. import request from '@/helpers/request'
  2. import { state } from '@/state'
  3. import { ElButton, ElDialog, ElMessage } from 'element-plus'
  4. import { defineComponent } from 'vue'
  5. import iconTips from './images/icon_tips.png'
  6. import liveBg from './images/live_bg.png'
  7. import liveClass from './images/live_class.png'
  8. import openLive from './images/open_live.png'
  9. import styles from './index.module.less'
  10. export default defineComponent({
  11. name: 'open-live',
  12. computed: {
  13. users() {
  14. return state.user.data
  15. },
  16. btnStatus() {
  17. const users: any = this.users
  18. const fansNum: number = this.fansNum
  19. const expTime: number = this.overClassNum
  20. return users?.fansNum >= fansNum && users?.expTime >= expTime
  21. }
  22. },
  23. data() {
  24. return {
  25. fansNum: 0,
  26. overClassNum: 0,
  27. openStatus: false
  28. }
  29. },
  30. async mounted() {
  31. const liveFlag = state.user.data?.liveFlag
  32. state.openLiveStatus = liveFlag === 1 ? true : false
  33. try {
  34. const res = await request.get(
  35. '/api-website/sysConfig/queryByParamNameList',
  36. {
  37. params: {
  38. paramNames: 'open_live_fans_num,open_list_over_class'
  39. }
  40. }
  41. )
  42. const result = res.data
  43. result.forEach((item: any) => {
  44. if (item.paramName === 'open_live_fans_num') {
  45. this.fansNum = Number(item.paramValue)
  46. } else if (item.paramName === 'open_list_over_class') {
  47. this.overClassNum = Number(item.paramValue)
  48. }
  49. })
  50. // 如果没有达人认证,则需要先去认证
  51. // if (!state.user.data?.entryFlag) {
  52. // Dialog.alert({
  53. // message: '您尚未完成达人认证,达人认证后才可开通直播权限哦!',
  54. // confirmButtonColor: '#2DC7AA'
  55. // }).then(() => {
  56. // this.$router.replace('/teacherCert')
  57. // })
  58. // }
  59. } catch {
  60. //
  61. }
  62. },
  63. methods: {
  64. async onOpenLive() {
  65. try {
  66. await request.get('/api-website/teacher/openLive', {})
  67. // Toast('开通成功')
  68. // ElMessage.success('开通成功')
  69. this.openStatus = true
  70. } catch {
  71. //
  72. }
  73. },
  74. getRate(target: any, rate: any) {
  75. // this.users?.fansNum
  76. // this.fansNum
  77. if (rate > 0) {
  78. return target / rate >= 1
  79. ? '100%'
  80. : `${((target / rate) * 100).toFixed(2)}%`
  81. } else {
  82. return '100%'
  83. }
  84. }
  85. },
  86. render() {
  87. return (
  88. <div class={styles.openLive}>
  89. <div class="text-2xl font-semibold text-black leading-none px-6 pt-5 pb-8 flex items-center justify-between">
  90. <span>开通直播</span>
  91. <ElButton
  92. type="primary"
  93. round
  94. size="large"
  95. disabled={!this.btnStatus}
  96. onClick={this.onOpenLive}
  97. >
  98. 开通直播
  99. </ElButton>
  100. </div>
  101. <div class="px-6">
  102. {!this.btnStatus && (
  103. <div
  104. class="py-3 px-[18px] rounded-lg text-sm text-[#E11212] flex items-center"
  105. style={{
  106. background: 'linear-gradient(139deg, #FFEEEE 0%, #FFDDDD 100%)'
  107. }}
  108. >
  109. <img src={iconTips} class="w-[22px] h-[22px] mr-2.5" />
  110. 你尚未达到开通直播的条件!请立即去开通。
  111. </div>
  112. )}
  113. <div class={['flex justify-between', !this.btnStatus && 'mt-8']}>
  114. <div
  115. class="w-[334px] rounded-[10px] px-7 py-7"
  116. style={{
  117. boxShadow: '0px 2px 10px 0px rgba(0,0,0,0.1000)'
  118. }}
  119. >
  120. <div class="flex justify-between items-center">
  121. <span class="text-2xl text-[#666]">
  122. <i class="text-[#E32121]">*</i>粉丝数
  123. </span>
  124. <div class="text-2xl text-[#999] font-semibold flex items-center">
  125. <span class="text-4xl text-black leading-none">
  126. {this.users?.fansNum}
  127. </span>
  128. <span>/</span>
  129. <span class="mt-1">{this.fansNum}</span>
  130. </div>
  131. </div>
  132. <div class="relative h-3.5 mt-7">
  133. <div class="absolute w-full h-full bg-[#E9E9E9] z-10 rounded-lg" />
  134. <div
  135. class="absolute h-full bg-[#FFA449] z-20 rounded-lg"
  136. style={{
  137. width: this.getRate(this.users?.fansNum, this.fansNum)
  138. }}
  139. />
  140. </div>
  141. </div>
  142. <div
  143. class="w-[334px] rounded-[10px] px-7 py-7"
  144. style={{
  145. boxShadow: '0px 2px 10px 0px rgba(0,0,0,0.1000)'
  146. }}
  147. >
  148. <div class="flex justify-between items-center">
  149. <span class="text-2xl text-[#666]">
  150. <i class="text-[#E32121]">*</i>课程数
  151. </span>
  152. <div class="text-2xl text-[#999] font-semibold flex items-center">
  153. <span class="text-4xl text-black leading-none">
  154. {this.users?.expTime}
  155. </span>
  156. <span>/</span>
  157. <span class="mt-1">{this.overClassNum}</span>
  158. </div>
  159. </div>
  160. <div class="relative h-3.5 mt-7">
  161. <div class="absolute w-full h-full bg-[#E9E9E9] z-10 rounded-lg" />
  162. <div
  163. class="absolute h-full bg-[#2DC7AA] z-20 rounded-lg"
  164. style={{
  165. width: this.getRate(this.users?.expTime, this.overClassNum)
  166. }}
  167. />
  168. </div>
  169. </div>
  170. </div>
  171. <div class="mt-20">
  172. <h2 class="text-2xl text-[#333] mb-4">直播</h2>
  173. <div class="text-lg text-[#999]">
  174. 开通直播功能后,您可以创建自己的直播间开启直播。
  175. </div>
  176. <img src={liveBg} class="w-[422px] m-auto pt-16" />
  177. </div>
  178. <div class="mt-20 mb-14">
  179. <h2 class="text-2xl text-[#333] mb-4">直播课</h2>
  180. <div class="text-lg text-[#999]">
  181. 您可制定教学方案设置直播课程,学员购买后,您可在直播间对购买直播课的学员进行直播教学,直播课程无人数上限,可极大的提高课程收入。
  182. </div>
  183. <img src={liveClass} class="w-[422px] m-auto pt-16" />
  184. </div>
  185. </div>
  186. <ElDialog
  187. modelValue={this.openStatus}
  188. onUpdate:modelValue={val => (this.openStatus = val)}
  189. closeOnClickModal={false}
  190. closeOnPressEscape={false}
  191. >
  192. <div class="text-center">
  193. <img src={openLive} class="w-[290px] m-auto" />
  194. <p class="text-xl font-semibold text-[#333] pt-7 pb-8">
  195. 开通成功,快去创建直播课吧
  196. </p>
  197. <ElButton
  198. type="primary"
  199. round
  200. class="!w-44 !h-12 m-auto"
  201. onClick={() => {
  202. this.openStatus = false
  203. this.$router.replace('/userInfo/liveOperation?type=create')
  204. }}
  205. >
  206. 创建直播课
  207. </ElButton>
  208. </div>
  209. </ElDialog>
  210. </div>
  211. )
  212. }
  213. })