index.tsx 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. import { defineComponent, onMounted, reactive, ref, nextTick } from 'vue'
  2. import { Image, Popup, showDialog, Sticky, Tab, Tabs } from 'vant'
  3. import styles from './index.module.less'
  4. // import { useRect } from '@vant/use'
  5. import Apply from './component/apply'
  6. import Payment from './component/payment'
  7. import Order from './component/order'
  8. import { useRoute, useRouter } from 'vue-router'
  9. import { setLogout } from '@/state'
  10. import request from '@/helpers/request'
  11. import { browser, getUrlCode } from '@/helpers/utils'
  12. export default defineComponent({
  13. name: 'pre-apply',
  14. setup() {
  15. const route = useRoute()
  16. const router = useRouter()
  17. const state = reactive({
  18. tabValue: 'apply',
  19. heightV: 235,
  20. registerInfo: {} as any,
  21. purchase: false, // 购买状态
  22. register: true, // 是否注册
  23. // showPopup: false,
  24. code: '' as any,
  25. // 是否开启微信登录(测试使用)默认为false
  26. testIsWeixin: false
  27. })
  28. const onNext = async (name: string) => {
  29. if (name === 'payment') {
  30. await getRegisterStatus()
  31. }
  32. nextTick(() => {
  33. state.tabValue = name
  34. window.scrollTo(0, 0)
  35. })
  36. }
  37. const getRegisterStatus = async () => {
  38. try {
  39. const { data } = await request.get(
  40. '/api-student/orchestraRegister/registerStatus/' + route.query.id
  41. )
  42. state.registerInfo = data || {}
  43. // 判断是否报名注册过
  44. state.register = data.register
  45. if (data.register) {
  46. nextTick(() => {
  47. state.tabValue = 'payment'
  48. })
  49. }
  50. // 购买状态, 判断是否已经购买完了
  51. if (data.purchase) {
  52. state.purchase = data.purchase
  53. nextTick(() => {
  54. state.tabValue = 'order'
  55. })
  56. }
  57. // INITIATION_SURVEY: '启蒙调查',
  58. // PRE_REGISTER: '预报名',
  59. // REGISTER: '乐团报名',
  60. // DOING: '乐团交付',
  61. // DONE: '已交付'
  62. // CLOSE: '已交付'
  63. // 判断乐团报名,只有 乐团报名 乐团交付 已交付才可以报名
  64. const oStatus = data.status // 乐团状态
  65. if (oStatus !== 'REGISTER' && oStatus !== 'DOING' && oStatus !== 'DONE') {
  66. showDialog({
  67. title: '提示',
  68. message: '乐团建设中,请稍等'
  69. }).then(() => {
  70. setLogout()
  71. const query = {
  72. returnUrl: route.path,
  73. ...route.query
  74. } as any
  75. router.replace({
  76. path: '/loginMusic',
  77. query: query
  78. })
  79. })
  80. return
  81. }
  82. // 判断乐团
  83. if (data.registerOrchestra >= 1) {
  84. showDialog({
  85. title: '提示',
  86. message: '您已在其它乐团'
  87. }).then(() => {
  88. setLogout()
  89. const query = {
  90. returnUrl: route.path,
  91. ...route.query
  92. } as any
  93. router.replace({
  94. path: '/loginMusic',
  95. query: query
  96. })
  97. })
  98. return
  99. }
  100. // 判断是否有openId 并且 purchase
  101. // if (!data.openId && !data.purchase) {
  102. // if (browser().weixin) {
  103. // // 微信公众号支付
  104. // //授权
  105. // const code = getUrlCode()
  106. // if (!code) {
  107. // goAuth(data.wxAppId)
  108. // } else {
  109. // state.code = code
  110. // }
  111. // }
  112. // }
  113. // nextTick(() => {
  114. // state.tabValue = 'order'
  115. // })
  116. } catch {
  117. //
  118. }
  119. }
  120. const getRegisterInfo = async (val: string) => {
  121. // 重新查询状态
  122. if (val === 'apply') {
  123. try {
  124. const { data } = await request.get(
  125. '/api-student/orchestraRegister/registerStatus/' + route.query.id
  126. )
  127. state.registerInfo = data || {}
  128. } catch {
  129. //
  130. }
  131. }
  132. // document.getElementById('app')?.scrollTo(0, 0)
  133. window.scrollTo(0, 0)
  134. }
  135. const goAuth = (wxAppId: string) => {
  136. // 用户授权
  137. const urlNow = encodeURIComponent(window.location.href)
  138. const scope = 'snsapi_base' //snsapi_userinfo //静默授权 用户无感知
  139. const appid = wxAppId || 'wx8654c671631cfade'
  140. const url = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appid}&redirect_uri=${urlNow}&response_type=code&scope=${scope}&state=STATE&connect_redirect=1#wechat_redirect`
  141. window.location.replace(url)
  142. }
  143. const getAppIdAndCode = async () => {
  144. try {
  145. const { data } = await request.get('/api-student/open/paramConfig/wechatAppId')
  146. // 判断是否有微信appId
  147. if (data) {
  148. goAuth(data)
  149. }
  150. } catch {
  151. //
  152. }
  153. }
  154. // 先请求接口 判断是否有code
  155. if (state.testIsWeixin) {
  156. getRegisterStatus()
  157. } else {
  158. if (browser().weixin) {
  159. // 微信公众号支付
  160. //授权
  161. const code = getUrlCode()
  162. if (!code) {
  163. getAppIdAndCode()
  164. } else {
  165. state.code = code
  166. getRegisterStatus()
  167. }
  168. } else {
  169. setLogout()
  170. const query = {
  171. returnUrl: route.path,
  172. ...route.query
  173. } as any
  174. router.replace({
  175. path: '/loginMusic',
  176. query: query
  177. })
  178. }
  179. }
  180. return () => (
  181. <div class={styles.preApply}>
  182. <div class={styles.banner}>
  183. <p class={styles.orchestraName}>{state.registerInfo.orchestraName}</p>
  184. </div>
  185. <Sticky position="top">
  186. <Tabs
  187. lineWidth={20}
  188. lineHeight={4}
  189. v-model:active={state.tabValue}
  190. onChange={(val: any) => getRegisterInfo(val)}
  191. >
  192. <Tab title="报名信息" name="apply" disabled={state.purchase}></Tab>
  193. <Tab title="缴费信息" name="payment" disabled={state.purchase || !state.register}></Tab>
  194. <Tab title="我的订单" name="order" disabled={!state.register}></Tab>
  195. </Tabs>
  196. </Sticky>
  197. {state.tabValue === 'apply' && (
  198. <Apply
  199. onNext={onNext}
  200. code={state.code}
  201. registerInfo={state.registerInfo}
  202. schoolSystem={state.registerInfo.schoolSystem}
  203. />
  204. )}
  205. {state.tabValue === 'payment' && <Payment onNext={onNext} />}
  206. {state.tabValue === 'order' && <Order onNext={onNext} />}
  207. {/* <Popup
  208. v-model:show={state.showPopup}
  209. round
  210. style={{ width: '92%' }}
  211. closeOnClickOverlay={false}
  212. >
  213. <div class={styles.popupContainer}>
  214. <div class={styles.dialogTitle}>
  215. <i></i>
  216. 提示
  217. </div>
  218. <p class={styles.popupTips}>请使用微信打开</p>
  219. </div>
  220. </Popup> */}
  221. </div>
  222. )
  223. }
  224. })