index.jsx 12KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328
  1. import React, { useState, useEffect } from 'react'
  2. import NavHeader from '@/components/NavHeader/index'
  3. import ScrollPageRefresh from '@/components/ScrollPageRefresh/index'
  4. import RenZhengScreen from '@/components/RenZhengScreen/index'
  5. import { Swiper, SwiperItem, Text } from '@tarojs/components'
  6. import request, { apis } from '@/utils/request'
  7. import { useModel } from '@/store'
  8. import useUserMounted from '@/utils/hooks/useUserMounted'
  9. import Taro from '@tarojs/taro'
  10. import Page from '@/layouts'
  11. import nav2detail from '@/utils/nav2detail'
  12. import { getShareObject } from '@/utils/share'
  13. import '@/assets/css/reset.less'
  14. import '@/assets/css/iconfont.less'
  15. import './index.less'
  16. export default function Index (props) {
  17. const { user } = useModel('user')
  18. const [OwnerList] = useState([
  19. { icon: 'iconjiaofei', name: '物业缴费', id: 1, router: '/pages/WuYe/index', setName: 'WuYeNavId', setValue: '4', isTab: true },
  20. { icon: 'icontongzhi', name: '物业通知', id: 2, router: '/pages/WuYe/index', setName: 'WuYeNavId', setValue: '1', isTab: true },
  21. { icon: 'iconbaoxiu', name: '物业报修', id: 3, router: '/pages/WuYe/index', setName: 'WuYeNavId', setValue: '3', isTab: true },
  22. { icon: 'iconrenzheng', name: '业主认证', id: 4, router: '/pages/WoDe/WoDeRenZheng/index', isTab: false },
  23. { icon: 'iconguanjia', name: '生活管家', id: 5, router: '/pages/WuYe/ShengHuoGuanJia/index', isTab: false, bold: true }
  24. ])
  25. const [NavList] = useState([
  26. { icon: 'iconhuodong1', name: '活动', id: 1, router: '/pages/ShouYe/HuoDong/index', isTab: false },
  27. { icon: 'iconfuli1', name: '福利', id: 2, router: '/pages/FuLi/index', setName: null, setValue: null, isTab: true },
  28. { icon: 'iconfuwu', name: '服务', id: 3, router: '/pages/WuYe/index', setName: 'WuYeNavId', setValue: '2', isTab: true },
  29. { icon: 'iconxinwen', name: '资讯', id: 4, router: '/pages/ShouYe/ZiXun/index', isTab: false }
  30. ])
  31. const [BannerList, setBannerList] = useState([])
  32. // const [ActivityList, setActivityList] = useState([])
  33. const [NewsList, setNewsList] = useState([])
  34. const [ShowNotice, setShowNotice] = useState(false)
  35. const [NoticeInfo, setNoticeInfo] = useState(null)
  36. const [NoticeWidth, setNoticeWidth] = useState(0)
  37. const [NoticeParentWidth, setNoticeParentWidth] = useState(0)
  38. // 宣传位
  39. const [propagandaList, setPropagandaList] = useState([])
  40. useUserMounted(() => {
  41. Init()
  42. })
  43. useEffect(() => {
  44. if (NoticeInfo !== null) {
  45. window.setTimeout(() => {
  46. let QueryParent = Taro.createSelectorQuery()
  47. let QueryChild = Taro.createSelectorQuery()
  48. QueryParent.select('#NoticeParent').boundingClientRect()
  49. QueryChild.select('#NoticeText').boundingClientRect()
  50. QueryParent.exec((res) => {
  51. setNoticeParentWidth(res[0].width)
  52. QueryChild.exec((cres) => {
  53. setNoticeWidth(cres[0].width)
  54. })
  55. })
  56. }, 100)
  57. // let NoticeText = document.getElementById('NoticeText')
  58. // console.log(NoticeText.boundingClientRect[0].width)
  59. }
  60. }, [NoticeInfo])
  61. const Init = (done = () => { }) => { // 初始化
  62. GetNotice() // 获取通知
  63. let DownCount = 0
  64. GetBanner(() => { // 获取轮播图
  65. DownCount += 1
  66. if (CheckDownCount(DownCount)) {
  67. done()
  68. }
  69. })
  70. GetPropagandaList(() => { // 宣传位
  71. DownCount += 1
  72. if (CheckDownCount(DownCount)) {
  73. done()
  74. }
  75. })
  76. // GetActivityList(() => { // 获取活动列表
  77. // DownCount += 1
  78. // if (CheckDownCount(DownCount)) {
  79. // done()
  80. // }
  81. // })
  82. GetNewsList(() => { // 获取资讯列表
  83. DownCount += 1
  84. if (CheckDownCount(DownCount)) {
  85. done()
  86. }
  87. })
  88. }
  89. const GetNotice = () => { // 获取通知
  90. request({ ...apis.getGongGaoList, args: { orgId: user.orgId }, params: { annType: 'notice', pageNum: 1, pageSize: 1 } }).then((res) => {
  91. setNoticeInfo(res.records[0])
  92. if (res.records !== null && res.records.length > 0) {
  93. setShowNotice(true)
  94. }
  95. })
  96. }
  97. const GetBanner = (done = () => { }) => { // 获取轮播图
  98. setBannerList([])
  99. request({ ...apis.getBanner, params: { showType: 'banner', showPosition: 'index', pageNum: 1, pageSize: 5 } }).then((res) => {
  100. setBannerList([...(res || [])])
  101. done()
  102. }).catch(() => {
  103. done()
  104. })
  105. }
  106. // const GetActivityList = (done = () => { }) => { // 获取活动列表
  107. // setActivityList([])
  108. // request({ ...apis.getActivityList, params: { pageNum: 1, pageSize: 1 } }).then((res) => {
  109. // setActivityList([...res.list])
  110. // done()
  111. // }).catch(() => {
  112. // done()
  113. // })
  114. // }
  115. const GetPropagandaList = (done = () => { }) => {
  116. setPropagandaList([])
  117. request({ ...apis.getIndexAdv, params: { pageNum: 1, pageSize: 1, showType: 'propaganda' } }).then(res => {
  118. setPropagandaList([...(res || [])])
  119. done()
  120. }).catch(() => done())
  121. }
  122. const GetNewsList = (done = () => { }) => { // 获取资讯列表
  123. setNewsList([])
  124. request({ ...apis.getNewsList, params: { pageNum: 1, pageSize: 10 } }).then((res) => {
  125. setNewsList([...res.records])
  126. done()
  127. }).catch(() => {
  128. done()
  129. })
  130. }
  131. const CheckDownCount = (num) => { // 检测请求接口数量
  132. return num >= 3
  133. }
  134. const NavClick = (item) => {
  135. return () => {
  136. if (item.isTab) {
  137. if (item.setName !== null) {
  138. Taro.setStorageSync(item.setName, item.setValue)
  139. Taro.reLaunch({ url: item.router })
  140. } else {
  141. Taro.switchTab({ url: item.router })
  142. }
  143. } else {
  144. Taro.navigateTo({ url: item.router })
  145. }
  146. }
  147. }
  148. const Refresh = (e) => { // 页面下拉刷新
  149. Init(e)
  150. }
  151. const OwnerClick = (item) => {
  152. return () => {
  153. if (item.isTab) {
  154. if (item.setName !== null) {
  155. Taro.setStorageSync(item.setName, item.setValue)
  156. Taro.reLaunch({ url: item.router })
  157. } else {
  158. Taro.switchTab({ url: item.router })
  159. }
  160. } else {
  161. Taro.navigateTo({ url: item.router })
  162. }
  163. }
  164. }
  165. // 分享转发
  166. Taro.useShareAppMessage(() => {
  167. const shareObj = getShareObject({ title: '远道智慧社区' }, user)
  168. return shareObj
  169. })
  170. return (
  171. <Page>
  172. <view className='ShouYe flex-v'>
  173. <RenZhengScreen></RenZhengScreen>
  174. <NavHeader BgColor='#f35844' Title='首页'></NavHeader>
  175. <view className='flex-item'>
  176. {/* 正文 */}
  177. <view className='PageContainer'>
  178. <ScrollPageRefresh ListRefresh={false} Refresh={Refresh} RefreshBg='#f35844'>
  179. <view className='Content'>
  180. {/* 背景图 */}
  181. <view className='TopBg'></view>
  182. <view>
  183. {/* 通知栏 */}
  184. <view className={ShowNotice ? 'NoticeContent flex-h active' : 'NoticeContent flex-h'}>
  185. <text className='iconfont icontongzhi1'></text>
  186. <view id='NoticeParent' className='flex-item' onClick={() => { Taro.navigateTo({ url: `/pages/WuYe/GongGaoDetail/index?id=${NoticeInfo.id}` }) }}>
  187. <view style={{ width: `${NoticeWidth > NoticeParentWidth ? NoticeWidth : NoticeParentWidth}px` }}>
  188. <text id='NoticeText'>{NoticeInfo === null ? '' : NoticeInfo.announcementTitle}</text>
  189. </view>
  190. </view>
  191. <text className='iconfont iconguanbi' onClick={() => { setShowNotice(false) }}></text>
  192. </view>
  193. {/* 欢迎词 */}
  194. <Text className='Welcome'>欢迎来到远道智慧社区!</Text>
  195. {/* banner */}
  196. <view className='BannerContainer'>
  197. <view>
  198. <view>
  199. <Swiper className='BannerSwiper' autoplay circular indicator-dots indicator-color='rgba(0,0,0,0.4)' indicator-active-color='rgba(255,255,255,0.8)'>
  200. {
  201. BannerList.map((item, index) => (
  202. <SwiperItem className='SwiperItem' key={`Banner-${index}`}>
  203. <view className='BannerItem' onClick={() => nav2detail({ type: item.contentType, id: item.targetId })}>
  204. <image mode='aspectFill' src={item.image}></image>
  205. </view>
  206. </SwiperItem>
  207. ))
  208. }
  209. </Swiper>
  210. </view>
  211. </view>
  212. </view>
  213. {/* 导航 */}
  214. <view className='NavContainer flex-h'>
  215. {
  216. NavList.map((item, index) => (
  217. <view key={`Nav-${index}`} className='flex-item'>
  218. <view onClick={NavClick(item)}>
  219. <view className='centerLabel'>
  220. <Text className={`iconfont ${item.icon}`}></Text>
  221. <Text>{item.name}</Text>
  222. </view>
  223. </view>
  224. </view>
  225. ))
  226. }
  227. </view>
  228. {/* 业主专区 */}
  229. <view className='OwnerContainer'>
  230. <view>
  231. <view className='Title'>
  232. <Text>业主专区</Text>
  233. </view>
  234. <view className='OwnerList flex-h'>
  235. {
  236. OwnerList.map((item, index) => (
  237. <view className='flex-item' key={`Owners-${index}`} onClick={OwnerClick(item)}>
  238. <Text className={`iconfont ${item.icon}`} style={{fontWeight: item.bold !== undefined && item.bold === true ? 'bold' : 'normal'}}></Text>
  239. <view>
  240. <view><Text>{item.name}</Text></view>
  241. </view>
  242. </view>
  243. ))
  244. }
  245. </view>
  246. </view>
  247. </view>
  248. {/* 热门活动 */}
  249. {
  250. propagandaList.length > 0 &&
  251. <view className='HotActivityContainer'>
  252. <view>
  253. {/* <view className='Title'>
  254. <Text>热门推荐</Text>
  255. </view> */}
  256. <view className='Activity' onClick={() => nav2detail({ type: propagandaList[0].contentType, id: propagandaList[0].targetId })}>
  257. <image className='centerLabel' mode='aspectFill' src={propagandaList[0].image}></image>
  258. </view>
  259. </view>
  260. </view>
  261. }
  262. {/* 热门资讯 */}
  263. <view className='NewsContainer'>
  264. <view>
  265. <view className='Title flex-h'>
  266. <Text className='flex-item'>热门资讯</Text>
  267. <Text onClick={() => { Taro.navigateTo({ url: '/pages/ShouYe/ZiXun/index' }) }}>查看全部</Text>
  268. <Text className='iconfont iconjiantouright'></Text>
  269. </view>
  270. <view className='List'>
  271. {
  272. NewsList.map((item, index) => (
  273. <view key={`News-${index}`} className='flex-h' onClick={() => { Taro.navigateTo({ url: `/pages/HuoDong/ZiXunDetail/index?id=${item.newsId}` }) }}>
  274. <view className='Img'>
  275. <image mode='aspectFill' src={item.newsImg} className='centerLabel'></image>
  276. </view>
  277. <view className='flex-item'>
  278. <view><Text>{item.newsName}</Text></view>
  279. <view><Text>{item.desc || ''}</Text></view>
  280. </view>
  281. </view>
  282. ))
  283. }
  284. </view>
  285. </view>
  286. </view>
  287. <view className='PageBottom'></view>
  288. </view>
  289. </view>
  290. </ScrollPageRefresh>
  291. </view>
  292. </view>
  293. </view>
  294. </Page>
  295. )
  296. }