index.vue 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. <template>
  2. <!-- 头部 -->
  3. <nav-bar height="120" backPath="workspace" title="教师专业发展" :showHeaderborder="true" :showFilterPicker="false" :showTabs="false" :onlyTitle="false" rightWidth="0rpx" @CommonFilterData="CommonFilterData"></nav-bar>
  4. <view class="page_content">
  5. <view class="count_list"></view>
  6. </view>
  7. </template>
  8. <script setup>
  9. import navBar from '@/components/nav-bar.vue';
  10. import {queryTeacherCourseTypeList,teacherCenterPageData} from '@/reqApi/studentStudy.js';
  11. import {
  12. reactive,
  13. ref,
  14. onMounted,
  15. nextTick
  16. } from 'vue';
  17. const state = reactive({
  18. courseTypeData:[],//顶部查询数据
  19. filterPickerData: [{
  20. valueIndex:0,//默认值索引
  21. defaultValue:'',//默认值
  22. list:[]
  23. },{
  24. valueIndex:0,//默认值索引
  25. defaultValue:'',//默认值
  26. list:[]
  27. }],
  28. tabList: [{
  29. label: '最新发布',
  30. value: '0'
  31. }, {
  32. label: '播放最多',
  33. value: '1'
  34. }, {
  35. label: '关注最多',
  36. value: '2'
  37. }],
  38. pageList:[],//列表数据
  39. queryStr: '',
  40. sortType: '0',//排序方式,课程中心参数,0-最新发布,1-播放最多,2-关注最多
  41. studCourseTypeClassId: '',//学习专题
  42. studCourseTypeId: '',//内容领域
  43. pageSize: 30,
  44. pageNum: 1,
  45. scrollTop:0,
  46. oldScrollTop:0,
  47. isRefreshing:false,//设置当前下拉刷新状态,true 表示下拉刷新已经被触发,false 表示下拉刷新未被触发
  48. isLoading:true,//加载中
  49. noMoreData:false,//没有更多数据了
  50. loadStatus:'more',//loading状态
  51. })
  52. onMounted(() => {
  53. getCourseTypeDataList();
  54. OnLoadData(true);
  55. });
  56. //获取顶部查询项
  57. const getCourseTypeDataList = () => {
  58. queryTeacherCourseTypeList().then(res => {
  59. if(res.code == 200){
  60. const defaultData = [{
  61. label:'内容领域',
  62. id:'',
  63. value:''
  64. }];
  65. const resData = res?.data || [];
  66. state.courseTypeData = defaultData.concat(resData);
  67. //一级条件
  68. state.filterPickerData[0].list = state.courseTypeData.map(item=>({
  69. ...item,
  70. value:item.id
  71. }))
  72. }else{
  73. state.courseTypeData = [];
  74. state.filterPickerData = [{
  75. valueIndex:0,//默认值索引
  76. defaultValue:'',//默认值
  77. list:[],
  78. },{
  79. valueIndex:0,
  80. defaultValue:'',//默认值
  81. list:[],
  82. }]
  83. }
  84. })
  85. }
  86. //切换条件选择器
  87. const CommonFilterData = (searchWord,filterPicker,tabsSelected,type) => {
  88. const {valueIndex, index,filterPickerValue} = filterPicker;
  89. if(type == 'filterPicker'){
  90. if(index==0){//索引
  91. state.filterPickerData[index].valueIndex = valueIndex;//一级条件选中项的索引
  92. state.filterPickerData[1].valueIndex = 0;//二级条件选中项的索引
  93. const childrenData = state.courseTypeData?.[valueIndex]?.children || [];
  94. const childrenList = childrenData.map(item=>({
  95. ...item,
  96. value:item?.id ?? ''
  97. }))
  98. if(childrenList.length){
  99. childrenList.unshift({
  100. label:'学习专题',
  101. id:'',
  102. value:''
  103. })
  104. }
  105. state.filterPickerData[1].list = childrenList;//二级条件数据
  106. }else{
  107. state.filterPickerData[index].valueIndex = valueIndex;//二级条件选中项的索引
  108. }
  109. }
  110. state.queryStr = searchWord;
  111. state.studCourseTypeId = filterPickerValue[0];
  112. state.studCourseTypeClassId = filterPickerValue[1];
  113. state.sortType = tabsSelected;
  114. OnLoadData(true)
  115. }
  116. /*
  117. *获取数据
  118. * initPage:初始分页 从第一开始
  119. */
  120. const OnLoadData = (initPage) => {
  121. // uni.showLoading({
  122. // title: '加载中'
  123. // });
  124. if (initPage) state.pageNum = 1;//如果是下拉刷新、重新查询 默认加载第一页
  125. state.isLoading = true;
  126. state.loadStatus = 'loading';
  127. teacherCenterPageData({
  128. queryStr:state.queryStr,
  129. studCourseTypeId:state.studCourseTypeId,
  130. studCourseTypeClassId:state.studCourseTypeClassId,
  131. sortType:state.sortType,
  132. pageSize:state.pageSize,
  133. pageNum:state.pageNum
  134. }).then(res=>{
  135. if(res.code == 200){
  136. const total = Number(res.data.total) || 0;//总数
  137. const pages = Math.ceil(total / state.pageSize);//总页数
  138. const recordsData = res?.data?.records || [];
  139. state.pageList = initPage ? recordsData : [...state.pageList,...recordsData];
  140. state.noMoreData = state.pageNum == pages;
  141. state.pageNum++;
  142. }
  143. }).finally(()=>{
  144. // uni.hideLoading();
  145. state.isLoading = false;
  146. state.isRefreshing = false;//下拉刷新未被触发
  147. if(state.noMoreData){
  148. state.loadStatus = 'no-more';
  149. }else{
  150. state.loadStatus = 'more';
  151. }
  152. //返回到页面顶部
  153. if(initPage){
  154. GoTop();
  155. }
  156. })
  157. }
  158. // 自定义下拉刷新被触发 下拉刷新
  159. const OnRefresh = () =>{
  160. state.isRefreshing = true;//下拉刷新已经被触发
  161. OnLoadData(true);
  162. }
  163. //滚动到底部/右边 触发上拉刷新
  164. const OnLoadMore = () => {
  165. if (state.isLoading || state.noMoreData) return;
  166. OnLoadData(false);
  167. }
  168. // 滚动时触发
  169. const OnScroll = (e) => {
  170. state.oldScrollTop = e.detail.scrollTop;
  171. }
  172. //返回到顶部
  173. const GoTop = () => {
  174. // 解决view层不同步的问题
  175. state.scrollTop = state.oldScrollTop;
  176. nextTick(() => {
  177. state.scrollTop = 0
  178. });
  179. }
  180. //视频详情
  181. const GoVideoDetails = (id) => {
  182. uni.navigateTo({
  183. url: `/pages/studentStudy/videoDetails?id=${id}`
  184. });
  185. }
  186. </script>
  187. <style lang="scss" scoped>
  188. .page_content{
  189. height: calc(100% - 448rpx);
  190. .scroll_view_y{
  191. height: 100%;
  192. .refresh_loading{
  193. padding: 10rpx 0;
  194. }
  195. }
  196. .page_list{
  197. display: flex;
  198. width: 100%;
  199. flex-wrap: wrap;
  200. gap:32rpx;
  201. .list_item{
  202. &:nth-child(1){
  203. margin-top: 16rpx;
  204. }
  205. &:nth-child(2){
  206. margin-top: 16rpx;
  207. }
  208. width: calc((100% - 32rpx) / 2);
  209. overflow: hidden;
  210. display: flex;
  211. flex-direction: column;
  212. .item_img{
  213. width: 100%;
  214. height: 220rpx;
  215. border-radius: 8rpx;
  216. }
  217. .item_title{
  218. display: flex;
  219. width: 100%;
  220. margin:8rpx 0;
  221. font-weight: 400;
  222. font-size: 24rpx;
  223. color: #333333;
  224. display: -webkit-box;
  225. -webkit-line-clamp: 2;
  226. -webkit-box-orient: vertical;
  227. overflow: hidden;
  228. text-overflow: ellipsis;
  229. }
  230. .item_time{
  231. display: flex;
  232. align-items: center;
  233. width: 100%;
  234. .img{
  235. width: 28rpx;
  236. height: 28rpx;
  237. margin-right: 8rpx;
  238. }
  239. .time{
  240. font-weight: 400;
  241. font-size: 24rpx;
  242. color: #999999;
  243. }
  244. }
  245. }
  246. }
  247. }
  248. </style>