index.tsx 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. import OHeader from '@/components/o-header'
  2. import OSticky from '@/components/o-sticky'
  3. import { Tabs, Tab, showToast, Icon, Popup, Grid, GridItem, Image } from 'vant'
  4. import { defineComponent, reactive, ref, onMounted, onDeactivated } from 'vue'
  5. import eidtIcon from './images/eidt-icon.png'
  6. import styles from './index.module.less'
  7. import schoolBg from './images/school-bg.png'
  8. import logoIcon from './images/logo.png'
  9. import { useRouter } from 'vue-router'
  10. import { state as globalState } from '@/state'
  11. import TeacherItem from './modals/teacher-item'
  12. import { schoolSystem } from '@/constant/index'
  13. import iconCallPhone from '@common/images/icon-call-phone.png'
  14. import iconCallMessage from '@common/images/icon-call-message.png'
  15. import request from '@/helpers/request'
  16. import OEmpty from '@/components/o-empty'
  17. export default defineComponent({
  18. name: 'school-detail',
  19. setup() {
  20. const router = useRouter()
  21. const state = reactive({
  22. list: [],
  23. info: {} as any,
  24. heightV: 0 as number,
  25. scrollTop: 0 as number,
  26. showMessage: false,
  27. selectItem: {} as any
  28. })
  29. const getSchoolDetail = async () => {
  30. const schoolId = (globalState.user.data.schoolInfos || [])
  31. .map((item) => {
  32. return item.id
  33. })
  34. .join(',')
  35. try {
  36. const { data } = await request.get(`/api-school/school/detail/${schoolId}`, {})
  37. state.info = data
  38. } catch (e: any) {
  39. showToast(e.message)
  40. }
  41. }
  42. const gotoEidt = () => {
  43. // /school-eidt
  44. router.push({
  45. path: '/school-eidt',
  46. query: {
  47. page: 'type'
  48. }
  49. })
  50. }
  51. const getTeacherList = async () => {
  52. // const schoolId = (globalState.user.data.schoolInfos || [])
  53. // .map((item) => {
  54. // return item.id
  55. // })
  56. // .join(',')
  57. try {
  58. const { data } = await request.post(`/api-school/teacher/page`, {
  59. data: {
  60. page: 1,
  61. rows: 9999,
  62. delFlag: false
  63. }
  64. })
  65. state.list = data.rows
  66. } catch (e: any) {
  67. showToast(e.message)
  68. }
  69. }
  70. onMounted(() => {
  71. window.addEventListener('scroll', handleScroll)
  72. getSchoolDetail()
  73. getTeacherList()
  74. })
  75. onDeactivated(() => {
  76. window.removeEventListener('scroll', handleScroll)
  77. })
  78. const getHeight = (dataHeight: number) => {
  79. state.heightV = dataHeight
  80. }
  81. const handleScroll = () => {
  82. const scrollTop =
  83. window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0
  84. state.scrollTop = scrollTop
  85. }
  86. return () => (
  87. <>
  88. <div class={styles.schoolWrap}>
  89. <OSticky onGetHeight={getHeight}>
  90. <OHeader
  91. border={false}
  92. background={state.heightV > state.scrollTop ? 'transparent' : '#fff'}
  93. >
  94. {{
  95. right: () => (
  96. <Icon style={{ fontSize: '24px' }} name={eidtIcon} onClick={gotoEidt}></Icon>
  97. )
  98. }}
  99. </OHeader>
  100. </OSticky>
  101. {/* <img src={schoolBg} class={styles.schoolBg} alt="" /> */}
  102. <div class={styles.absWrap}>
  103. <div class={styles.schoolMainTitle}>
  104. <div class={styles.schoolMainLeft}>
  105. <img src={state.info.logo ? state.info.logo : logoIcon} alt="" />
  106. </div>
  107. <div class={styles.schoolMainRight}>
  108. <p class={styles.schoolMainTitle}>{state.info.name}</p>
  109. <p class={styles.schoolMainSub}>
  110. {state.info.provinceName}
  111. {state.info.cityName}
  112. </p>
  113. </div>
  114. </div>
  115. <div class={styles.detailInfo}>
  116. <p>
  117. <span>主管领导</span>
  118. {state.info.emergencyContact}
  119. </p>
  120. <p>
  121. <span>管理老师</span>
  122. {state.info.educationalAdministrationUsername}
  123. </p>
  124. <p>
  125. <span>学年制</span>
  126. {schoolSystem[state.info.schoolSystem]}{' '}
  127. </p>
  128. <p>
  129. <span>邮箱账号</span>
  130. {state.info.email}
  131. </p>
  132. <p class={styles.flexP}>
  133. <span>学校地址</span> <p>{state.info.address}</p>
  134. </p>
  135. </div>
  136. </div>
  137. <div class={[styles.teacherList]}>
  138. <h2 class={styles.teacherTitle}>
  139. <div class={styles.dot}></div>
  140. <p>伴学指导</p>
  141. </h2>
  142. {state.list.length > 0 ? (
  143. <div>
  144. {state.list.map((item) => (
  145. <TeacherItem
  146. item={item}
  147. onToMsg={(item: any) => {
  148. state.selectItem = item
  149. state.showMessage = true
  150. }}
  151. ></TeacherItem>
  152. ))}
  153. </div>
  154. ) : (
  155. <OEmpty tips="暂无伴学指导" />
  156. )}
  157. </div>
  158. </div>
  159. <Popup
  160. v-model:show={state.showMessage}
  161. position="bottom"
  162. style={{ background: 'transparent' }}
  163. >
  164. <div class={styles.codeContainer}>
  165. <div class={styles.codeBottom}>
  166. <Icon
  167. name="cross"
  168. size={22}
  169. class={styles.close}
  170. color="#666"
  171. onClick={() => (state.showMessage = false)}
  172. />
  173. <h3 class={styles.title}>
  174. <i></i>联系方式
  175. </h3>
  176. <Grid columnNum={2} border={false}>
  177. <GridItem
  178. onClick={() => {
  179. postMessage({
  180. api: 'joinChatGroup',
  181. content: {
  182. type: 'single', // single 单人 multi 多人
  183. id: state.selectItem.imUserId
  184. }
  185. })
  186. state.showMessage = false
  187. }}
  188. >
  189. {{
  190. icon: () => <Image class={styles.shareImg} src={iconCallMessage} />,
  191. text: () => <div class={styles.shareText}>发送消息</div>
  192. }}
  193. </GridItem>
  194. <GridItem
  195. onClick={() => {
  196. postMessage({
  197. api: 'callPhone',
  198. content: {
  199. phone: state.selectItem.phone
  200. }
  201. })
  202. state.showMessage = false
  203. }}
  204. >
  205. {{
  206. icon: () => <Image class={styles.shareImg} src={iconCallPhone} />,
  207. text: () => <div class={styles.shareText}>拨打电话</div>
  208. }}
  209. </GridItem>
  210. </Grid>
  211. </div>
  212. </div>
  213. </Popup>
  214. </>
  215. )
  216. }
  217. })