From 28db708b1558554cdc40db37d2722c4e19d73c12 Mon Sep 17 00:00:00 2001 From: king <2229249788@qq.com> Date: Mon, 21 Aug 2023 10:34:48 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E9=A6=96=E9=A1=B5=E5=92=8C=E6=A0=B7?= =?UTF-8?q?=E5=BC=8F=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env | 3 +- src/api/home.ts | 37 +++++++++++ src/api/index.ts | 1 + src/app.config.ts | 4 +- src/components/popPut/popPut.tsx | 2 +- src/pages/home/components/adware.tsx | 51 ++++++++++++++ src/pages/home/components/curRecommended.tsx | 59 +++++++++++++++++ src/pages/home/components/feature.tsx | 33 ++++++++++ .../home/components/feature_recommended.tsx | 43 ++++++++++++ src/pages/home/components/search.tsx | 13 ++++ src/pages/home/home.config.ts | 1 + src/pages/home/home.module.scss | 62 ++++++++++++++++++ src/pages/home/home.tsx | 27 +++++++- src/pages/index/components/search.tsx | 13 ---- src/pages/index/index.module.scss | 26 ++++---- src/pages/manage/addStudent/addStudent.tsx | 6 +- src/pages/manage/depAdmin/depAdmin.tsx | 2 +- src/static/img/article.png | Bin 0 -> 3127 bytes src/static/img/courseTag.png | Bin 0 -> 5336 bytes src/static/img/first.png | Bin 0 -> 453 bytes src/static/img/health.png | Bin 0 -> 2637 bytes src/static/img/illness.png | Bin 0 -> 2807 bytes src/static/img/profession.png | Bin 0 -> 2995 bytes src/static/img/second.png | Bin 0 -> 457 bytes src/static/img/third.png | Bin 0 -> 466 bytes src/static/tabs/study-selected.png | Bin 0 -> 1055 bytes src/static/tabs/study.png | Bin 0 -> 1048 bytes src/utils/pathFormt.ts | 17 +++++ 28 files changed, 366 insertions(+), 34 deletions(-) create mode 100644 src/api/home.ts create mode 100644 src/pages/home/components/adware.tsx create mode 100644 src/pages/home/components/curRecommended.tsx create mode 100644 src/pages/home/components/feature.tsx create mode 100644 src/pages/home/components/feature_recommended.tsx create mode 100644 src/pages/home/components/search.tsx create mode 100644 src/pages/home/home.module.scss delete mode 100644 src/pages/index/components/search.tsx create mode 100644 src/static/img/article.png create mode 100644 src/static/img/courseTag.png create mode 100644 src/static/img/first.png create mode 100644 src/static/img/health.png create mode 100644 src/static/img/illness.png create mode 100644 src/static/img/profession.png create mode 100644 src/static/img/second.png create mode 100644 src/static/img/third.png create mode 100644 src/static/tabs/study-selected.png create mode 100644 src/static/tabs/study.png create mode 100644 src/utils/pathFormt.ts diff --git a/.env b/.env index 1eee7ad..064f56f 100644 --- a/.env +++ b/.env @@ -1,4 +1,5 @@ -TARO_APP_API=https://yjx.dev.yaojiankang.top +#TARO_APP_API=https://yjx.dev.yaojiankang.top +TARO_APP_API=https://mooc.yaojiankang.top #TARO_APP_API=https://playedu.yaojiankang.top TARO_APP_LGOIN=true diff --git a/src/api/home.ts b/src/api/home.ts new file mode 100644 index 0000000..7ce586d --- /dev/null +++ b/src/api/home.ts @@ -0,0 +1,37 @@ +import {request} from "@/api/request"; + +export interface AdwareParams { + key: string + value: string + + [key: string]: string +} + +export interface AdwareLinkType { + id: number + api_name: string + path: string + param: string +} + +export interface AdwareType { + advert_link: AdwareLinkType + scope_id: number | string + id: number + name: string + status: 0 | 1 // 禁用 + sort: number + image_url: string + image_link: string + start_time: number + end_time?: number +} + +export const HomeApi = { + advert(only_flag: string) { + return request("/home/v1/advert/unique?only_flag=" + only_flag, "GET") + }, + course(page: number, page_size: number) { + return request<{ data: Curriculum[], total: number }>('/home/v1/course/course', "GET", {page, page_size}) + } +} diff --git a/src/api/index.ts b/src/api/index.ts index bfc8739..341ea63 100644 --- a/src/api/index.ts +++ b/src/api/index.ts @@ -5,3 +5,4 @@ export * from './meeting' export * from './public' export * from './manage' export * from './course' +export * from './home' diff --git a/src/app.config.ts b/src/app.config.ts index 84acf9c..7ee6f9d 100644 --- a/src/app.config.ts +++ b/src/app.config.ts @@ -26,8 +26,8 @@ export default defineAppConfig({ { text: '学习', pagePath: 'pages/index/index', - iconPath: "static/tabs/home-unselect.png", - selectedIconPath: "static/tabs/home-selected.png", + iconPath: "static/tabs/study.png", + selectedIconPath: "static/tabs/study-selected.png", }, { text: "我的", diff --git a/src/components/popPut/popPut.tsx b/src/components/popPut/popPut.tsx index ea557ca..4184ffc 100644 --- a/src/components/popPut/popPut.tsx +++ b/src/components/popPut/popPut.tsx @@ -46,7 +46,7 @@ const PopPut: FC = ({title, chevron, content, image, isProp, children, sh <> - {opt.leftImage && } + {opt.leftImage != null && } {title} diff --git a/src/pages/home/components/adware.tsx b/src/pages/home/components/adware.tsx new file mode 100644 index 0000000..705563b --- /dev/null +++ b/src/pages/home/components/adware.tsx @@ -0,0 +1,51 @@ +import {Image, Swiper, SwiperItem, View} from "@tarojs/components"; +import {FC, useState} from "react"; +import {AdwareType, HomeApi} from "@/api"; +import Taro from "@tarojs/taro"; +import styles from '../home.module.scss' +import {jumpAdware} from "@/utils/pathFormt"; + +const Adware: FC = () => { + const [data, setData] = useState([]) + + async function getAdware() { + const res = await HomeApi.advert('home_swiper') + setData(res) + } + + Taro.useLoad(getAdware) + + return ( + + { + data.length === 1 && jumpAdware(data[0].advert_link)} + className={styles.adware}/> + } + { + data.length > 1 && + {data.map(d => + jumpAdware(d.advert_link)} + style={{width: "100%"}}/> + )} + + } + + ) +} + +export default Adware diff --git a/src/pages/home/components/curRecommended.tsx b/src/pages/home/components/curRecommended.tsx new file mode 100644 index 0000000..8862d61 --- /dev/null +++ b/src/pages/home/components/curRecommended.tsx @@ -0,0 +1,59 @@ +import {FC, useEffect, useState} from "react"; +import {Image, View} from "@tarojs/components"; +import {HomeApi} from "@/api"; +import {useReachBottom} from "@tarojs/taro"; +import styles from "../home.module.scss"; +import VideoCover from "@/components/videoCover/videoCover"; +import courseTag from '@/static/img/courseTag.png' + +const CurRecommended: FC = () => { + const [page, setPage] = useState(1) + const [data, setData] = useState([]) + const [total, setTotal] = useState(0) + + async function getData() { + const res = await HomeApi.course(page, 4) + setTotal(res.total) + const newData = res.data.reduce((pre, cut) => { + const index = pre.findIndex(d => d.id === cut.id) + if (index === 1) { + pre.push(cut) + } else { + pre.splice(index, 1, cut) + } + return pre + }, data) + setData(newData) + } + + useEffect(() => { + getData() + }, [page]) + + useReachBottom(() => { + data.length < total && setPage(page + 1) + }) + + return ( + <> + { + data.length > 0 && + + + { + data.map(c => ) + } + + + } + + ) +} + +export default CurRecommended diff --git a/src/pages/home/components/feature.tsx b/src/pages/home/components/feature.tsx new file mode 100644 index 0000000..8e98b25 --- /dev/null +++ b/src/pages/home/components/feature.tsx @@ -0,0 +1,33 @@ +import {FC} from "react"; +import {Image, View} from "@tarojs/components"; +import illness from '@/static/img/illness.png' +import profession from '@/static/img/profession.png' +import health from '@/static/img/health.png' +import article from '@/static/img/article.png' +import Taro from "@tarojs/taro"; + +const Feature: FC = () => { + const list = [ + {url: '', image: article, text: '品牌'}, + {url: '', image: health, text: '健康管理'}, + {url: '', image: profession, text: '专业技能'}, + {url: '', image: illness, text: '疾病知识'}, + ] + + function jump(url) { + Taro.navigateTo({url}) + } + + return ( + + { + list.map(d => jump(d.url)}> + + {d.text} + ) + } + + ) +} + +export default Feature diff --git a/src/pages/home/components/feature_recommended.tsx b/src/pages/home/components/feature_recommended.tsx new file mode 100644 index 0000000..507bc35 --- /dev/null +++ b/src/pages/home/components/feature_recommended.tsx @@ -0,0 +1,43 @@ +import {FC, useState} from "react"; +import {Swiper, SwiperItem, View} from "@tarojs/components"; +import styles from '../home.module.scss' +import Taro from "@tarojs/taro"; + +interface DataContent { + id: number, + title: string, + Description: string +} + +interface Data { + title: string, + url: string, + data: DataContent[] +} + +const FeatureRecommended: FC = () => { + const [data] = useState([ + {title: "品牌TOP3", url: '', data: []}, + {title: "健康", url: '', data: []}, + {title: "专业技能", url: '', data: []}, + {title: "疾病知识", url: '', data: []}, + ]) + + function jump(url: string) { + Taro.navigateTo({url}) + } + + + return ( + + + { + data.map(d => + jump(d.url)}>{d.title} + ) + } + + + ) +} +export default FeatureRecommended diff --git a/src/pages/home/components/search.tsx b/src/pages/home/components/search.tsx new file mode 100644 index 0000000..7910e33 --- /dev/null +++ b/src/pages/home/components/search.tsx @@ -0,0 +1,13 @@ +import {FC} from "react"; +import {Text, View} from "@tarojs/components"; +import styles from "../home.module.scss"; +import Icon from "@/components/icon"; + +export const Search: FC = () => { + return ( + + + 搜索课程 + + ) +} diff --git a/src/pages/home/home.config.ts b/src/pages/home/home.config.ts index d178761..3ad5d8a 100644 --- a/src/pages/home/home.config.ts +++ b/src/pages/home/home.config.ts @@ -1,4 +1,5 @@ export default definePageConfig({ navigationBarTitleText: '首页', navigationStyle: 'custom', + onReachBottomDistance: 30 }) diff --git a/src/pages/home/home.module.scss b/src/pages/home/home.module.scss new file mode 100644 index 0000000..0072faa --- /dev/null +++ b/src/pages/home/home.module.scss @@ -0,0 +1,62 @@ +.content { + position: relative; + padding: 0 20px; + min-height: 90vh; + box-sizing: border-box; + width: 750rpx; + overflow: hidden; + + &:after { + min-height: 100vh; + position: absolute; + top: 0; + left: -10%; + width: 120%; + content: ''; + display: block; + background: linear-gradient(40deg, #fff 50rpx, #caf0e2, #92ecc5) no-repeat; + min-height: 100vh; + background-size: 100% 600rpx; + filter: blur(50px); + z-index: -1; + } +} + +.search { + width: 710rpx; + margin: 34rpx 0 0; + background: #fff; + border-radius: 100px; + line-height: 68rpx; + color: #bbb; + font-size: 28rpx; + display: flex; + align-items: center; + justify-content: center; +} + +.adware { + margin-top: 40rpx; + width: 100%; + height: 260rpx; + border-radius: 16rpx; + overflow: hidden; +} + +.videoListBox { + border-radius: 20px; +} + +.courseTag { + width: 200px; + margin: auto; + display: block; +} + +.featureRecommended { + background: #fff; + padding: 30rpx; + margin-top: 20rpx; + border-radius: 16rpx; + box-shadow: inset -30px -30px 30px rgba(#fff, .9); +} diff --git a/src/pages/home/home.tsx b/src/pages/home/home.tsx index 39eb775..93d07f3 100644 --- a/src/pages/home/home.tsx +++ b/src/pages/home/home.tsx @@ -1,9 +1,34 @@ import {FC} from "react"; import {View} from "@tarojs/components"; +import styles from "@/pages/index/index.module.scss"; +import Taro from "@tarojs/taro"; +import {Search} from "@/pages/home/components/search"; +import Adware from "@/pages/home/components/adware"; +import Feature from "@/pages/home/components/feature"; +import FeatureRecommended from "@/pages/home/components/feature_recommended"; +import CurRecommended from "@/pages/home/components/curRecommended"; +import MyButton from "@/components/button/MyButton"; +import {Profile} from "@/store"; const Home: FC = () => { + const globalData = Taro.getApp().globalData + const {token, empty} = Profile.useContainer() + return ( - 2 + + 康一诺 + + + + + + { + !token && + 登录后享受更多学习服务~ + 立即登录 + + } + ) } diff --git a/src/pages/index/components/search.tsx b/src/pages/index/components/search.tsx deleted file mode 100644 index 1517300..0000000 --- a/src/pages/index/components/search.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import {FC} from "react"; -import {Text, View} from "@tarojs/components"; -import styles from "@/pages/index/index.module.scss"; -import Icon from "@/components/icon"; - -export const Search: FC = () => { - return ( - - - 搜索课程 - - ) -} diff --git a/src/pages/index/index.module.scss b/src/pages/index/index.module.scss index fe83aa1..b58360c 100644 --- a/src/pages/index/index.module.scss +++ b/src/pages/index/index.module.scss @@ -22,19 +22,21 @@ } } -.search { - width: 710rpx; - margin: 34rpx 0 0; - background: #fff; - border-radius: 100px; - line-height: 68rpx; - color: #bbb; - font-size: 28rpx; - display: flex; - align-items: center; - justify-content: center; -} .videoListBox { border-radius: 20px; } + +.tipsLogin { + padding: 24rpx; + color: #fff; + align-items: center; + position: fixed; + bottom: 0; + left: 0; + display: flex; + justify-content: space-between; + width: 100%; + box-sizing: border-box; + background: rgba(#000, .7); +} diff --git a/src/pages/manage/addStudent/addStudent.tsx b/src/pages/manage/addStudent/addStudent.tsx index 348f3de..44728ef 100644 --- a/src/pages/manage/addStudent/addStudent.tsx +++ b/src/pages/manage/addStudent/addStudent.tsx @@ -81,7 +81,7 @@ const AddStudent = () => { Taro.useDidShow(() => { const newDepIds = storageDep.get() - setDepIds(newDepIds.length ? newDepIds : depIds) + setDepIds(newDepIds) }) return ( @@ -104,9 +104,9 @@ const AddStudent = () => { - + 所属部门 - + {depIds.length ? formatDep() : '选择部门'} diff --git a/src/pages/manage/depAdmin/depAdmin.tsx b/src/pages/manage/depAdmin/depAdmin.tsx index 2956ae4..df6af00 100644 --- a/src/pages/manage/depAdmin/depAdmin.tsx +++ b/src/pages/manage/depAdmin/depAdmin.tsx @@ -159,7 +159,7 @@ const DepAdmin: FC = () => { 添加学员 - showPop(undefined)}>分配部门 + showPop(undefined)}>添加部门 { router.params.id && 更多操作 } diff --git a/src/static/img/article.png b/src/static/img/article.png new file mode 100644 index 0000000000000000000000000000000000000000..2bdac55a29e9c2bcd2edccf6cc878e74eac57144 GIT binary patch literal 3127 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 literal 0 HcmV?d00001 diff --git a/src/static/img/courseTag.png b/src/static/img/courseTag.png new file mode 100644 index 0000000000000000000000000000000000000000..257f074b8a322e353393df844a093c876d17015a GIT binary patch literal 5336 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 literal 0 HcmV?d00001 diff --git a/src/static/img/second.png b/src/static/img/second.png new file mode 100644 index 0000000000000000000000000000000000000000..a225843795996477dab5da176e72a939decb979a GIT binary patch literal 457 zcmV;)0XF`LP)Px$gGod|R7gv;mA^|uQ546&=TSjZLu+e6TU+!8G#W}IkHVqGnxm$8(9q!S7)96+ zDw3F(=o1ltBq9REuQ>5x@+Ikt&6fl>q_hOl4Ft-Q)|FuGyKQb{kbprCeV24hq?vEFhoB z$^vp}T^5i{rDXw`WQy%4DKSzyk(A9K6;H?llCi4>2-DUFv+ct9Z9n!gWX#MBN?gW{ z0NR%*2}C#~UDwCnnlC2|-WVlB0nVOV@0*VO#G}!5HV|N7>OUX?nyg^k<#wOjChF*g z!{M26&@nTXhk+1qO~&Vz%jb zdIHQvu~2CCqs^xPmIh=~ByRgWs`}V#U0;CpYBf!X%+2pHK?5++CD2lU1JA>~pES+r zcZfd$_NI$qZ~;&>5Ej4ZsAROEsXnzn=&rs1a304<&G6PG00000NkvXXu0mjfTF=Wi literal 0 HcmV?d00001 diff --git a/src/static/img/third.png b/src/static/img/third.png new file mode 100644 index 0000000000000000000000000000000000000000..8226ada52545f0221f86f6e698889ec5feb3cbb3 GIT binary patch literal 466 zcmV;@0WJQCP)Px$j7da6R7gv;l*=nbaTLeD-|;9bi`g;k?Cs^F8PADLgA600C6&eB2G0 zu9Yo5>;y&0)8A6U`>lZ52ojrcGf|SS@706ooOvM1bzr|{{<4nkpXXB zWq-)@^A0eLlkpZ0vt$xL*(>DFb9L3AURzK-7;(1frw2zSni_=g0m%6!BSEq`zh=Py z(OFUi&Y#CqjYZU50TC&+zNeTTB=-zmuPUq?KKv@RDFIf3G|d&syKFTenuug49VVX$ zbafx7d{d4T2IY7$WR~u6gRm_J1mf7a2L?8rzzwr2qf`07*qo IM6N<$f;`;O4gdfE literal 0 HcmV?d00001 diff --git a/src/static/tabs/study-selected.png b/src/static/tabs/study-selected.png new file mode 100644 index 0000000000000000000000000000000000000000..f0b2de09b5c1c00cfe0e5f3cf22070827977c28c GIT binary patch literal 1055 zcmV+)1mOFLP)Px&*-1n}RA@u(SzTxxRTTcdyPL+87EM(Y#9E~Ix4TFU2x2MQX1Cx&v{t*xE{MLE zmq_WGKOh!S?1L|&h+?H6vOBd25_}Nc{2}&1Nn1%aC51jji4Rsug$APT?tC(7H{GQB zGn1Vnfw|1f%suBj=ey^eduQel8+>qs`;UOY{~f{Q2qX(92SgpF@PHSGBrJkh5Os!S zj*0fE(OBm9Mi|}G*}DMt8e`&+x+H8PvBjg^3nbppNBfSmyO0|&;748n>d8tdffz2+ zerr6EnW>iBf8L5pd>c{^fUqz2fESr4La0;14nVsJ-hQJV=OvNEJ!|I#{0ZPRi8+CnUE36*fS$i5Us^-J z&g7$+oLjK#D=v1Qw|3LU0LT7O5OYfVu_8a0e0^6%+1pOitdU^DbRK6wrLN*Rd$gdQNPiF6EYd6lG9<96j(tIf#Ixzll>P$tZQ3T>s*@xPU`3Atw2AH!&Q|g(B zyl}Bv#&ZoMr*bdB@I0*NW>H5$Cv3=_hUe5~(-mI%0t05lKb*?cTL z>4rf3Ty95O8=Y5*`VoL;i$y#&u`4~-5`m_xR7W5vV!w(wh(Pc%w>k$rZ=U<4bWdfUFvc7Zu$RJPAVTZ54JTC_yz3XINcg@r4v)~t1DCSQP2;i;@>?hd6$^U z?SdGiEq7g%5TG(TVYnT{p5=7#FeID>@jYz)$`CH&hAOHLCgP8gp$p&Q=uz8M;kfZ@ z&vfqIO+r5mj}Wz+b^@+A&AD>ed_MMI>NhvI&18HdP%#vrIdOMb9iI?*rrNlGVROr- z{_l1kywuDoFY~?=s2ESoBDt;z)iT3x|b^*4M3 Z{sZGm=|(SVZI1u|002ovPDHLkV1nDm>uUf2 literal 0 HcmV?d00001 diff --git a/src/static/tabs/study.png b/src/static/tabs/study.png new file mode 100644 index 0000000000000000000000000000000000000000..05cb70ccbad22fe4ba443be1b98c80f9476de1ce GIT binary patch literal 1048 zcmV+z1n2vSP)Px&(n&-?RA@u(Szm}$RUH1lb9Xh-pxwd*(L|Q;!KZwvKq7k(eDJ@mtWP1ddgsox zcZZ^Uh#-tqrn$TB+`XbMy+q0GR*3i{CfPJKyj7e&6q$Gxr{1fe$Wl{zwG;-wu`?aJ+&Eflcz+NQ6XYK>P*Zn%2Ci zip2@rwtsJiF?4F^X_Pwl0(=>e4G?sLToxs-2!2ptejt@P$-H|!t&}km1)x!^h?Gcm zR{Q$BY&!j2ZQQWutrz(3L$DQOM;!SmdOw{}cZ$R_aRAm}_yA7d`{(Z4=<32_e(8un z`bnxd^9XQ*L!K*DPy&+xz73m116=^tP-G*>C+p0+B>)Mmtn=F+0=WWkN&$Dm<^-@_ zfIa2-!0}oEqOot#vObFdRtXhh-t#sRVv*=L?(se8||bw4MutHK|XgQoRryX4CPnzc|Opr*u$ z0}c8uX`!$SF=?T=S}2#xJ=L*v$)(^3Z(M!3MNvBjQmJdzm}U;-Mn={d2G5b~X@dE^ z*4&!4tedqlk=KCZy01~;;}ETL#5S!%VFcto_Z=uh~rwsi37=>xw$u3MQZM-iMiO8)M0 z-vzz+%kA6G8$gc$;cihBAX;}Ray7`8X4@fj4Fqx>g3BWEGnKjn9d0TCt+oCpo5|d$ zm>bjh$aPnd(yu@pMBPg}0q#;Hr)i93P4m|{QpYBsO6HjBuIN;9g5dUAf&w{Pg3yMyowRKfGY6t=*T_+4}&B`ziX#5pTtRg-UZAD*?O4s=0GAKWCa$y1OEZt!xxlg SzwJZ-0000 { + url += d.key + "=" + d.value + if (index !== params.length - 1) { + url += "&" + } + }) + Taro.navigateTo({url}) + } +} From fe4c7108d8792ad871825685a1b46581168b7f73 Mon Sep 17 00:00:00 2001 From: king <2229249788@qq.com> Date: Mon, 21 Aug 2023 14:22:32 +0800 Subject: [PATCH 2/6] =?UTF-8?q?=E5=81=A5=E5=BA=B7=E7=9F=A5=E8=AF=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env | 4 +- src/api/home.ts | 4 ++ src/app.config.ts | 1 + src/pages/health/health.config.ts | 4 ++ src/pages/health/health.module.scss | 34 +++++++++++ src/pages/health/health.tsx | 42 ++++++++++++++ src/pages/home/components/adware.tsx | 4 +- .../home/components/feature_recommended.tsx | 56 ++++++++++++++----- src/pages/home/home.module.scss | 18 +++++- src/static/css/module.scss | 17 ++++++ types/home.d.ts | 6 ++ 11 files changed, 172 insertions(+), 18 deletions(-) create mode 100644 src/pages/health/health.config.ts create mode 100644 src/pages/health/health.module.scss create mode 100644 src/pages/health/health.tsx create mode 100644 types/home.d.ts diff --git a/.env b/.env index 064f56f..5445a7b 100644 --- a/.env +++ b/.env @@ -1,5 +1,5 @@ -#TARO_APP_API=https://yjx.dev.yaojiankang.top -TARO_APP_API=https://mooc.yaojiankang.top +TARO_APP_API=https://yjx.dev.yaojiankang.top +#TARO_APP_API=https://mooc.yaojiankang.top #TARO_APP_API=https://playedu.yaojiankang.top TARO_APP_LGOIN=true diff --git a/src/api/home.ts b/src/api/home.ts index 7ce586d..e5272dc 100644 --- a/src/api/home.ts +++ b/src/api/home.ts @@ -33,5 +33,9 @@ export const HomeApi = { }, course(page: number, page_size: number) { return request<{ data: Curriculum[], total: number }>('/home/v1/course/course', "GET", {page, page_size}) + }, + /** 健康管理 */ + health(page: number, page_size: number) { + return request<{ data: Health[], total: number }>('/home/v1/health/index', "GET", {page, page_size}) } } diff --git a/src/app.config.ts b/src/app.config.ts index 7ee6f9d..0bd7fb5 100644 --- a/src/app.config.ts +++ b/src/app.config.ts @@ -6,6 +6,7 @@ export default defineAppConfig({ 'pages/login/login', 'pages/check/check', 'pages/my/my', + 'pages/health/health', ], window: { backgroundTextStyle: 'light', diff --git a/src/pages/health/health.config.ts b/src/pages/health/health.config.ts new file mode 100644 index 0000000..dd2f7ad --- /dev/null +++ b/src/pages/health/health.config.ts @@ -0,0 +1,4 @@ +export default definePageConfig({ + navigationBarTitleText: '健康知识', + onReachBottomDistance: 30 +}) diff --git a/src/pages/health/health.module.scss b/src/pages/health/health.module.scss new file mode 100644 index 0000000..f28a403 --- /dev/null +++ b/src/pages/health/health.module.scss @@ -0,0 +1,34 @@ +.container { + width: 100%; + padding: 0 20rpx; + box-sizing: border-box; + columns: 2; + column-gap: 20rpx; +} + +.health { + break-inside: avoid; + background: #fff; + border-radius: 10px; + overflow: hidden; + margin-bottom: 20rpx; + position: relative; + + image, + Image { + background: #eee; + width: 100%; + min-height: 345rpx; + } +} + +.play { + position: absolute; + min-height: 70rpx !important; + z-index: 9999; + width: 40rpx !important; + height: 40rpx !important; + top: 20rpx; + right: 20rpx; + background: transparent !important; +} diff --git a/src/pages/health/health.tsx b/src/pages/health/health.tsx new file mode 100644 index 0000000..1c9dfbb --- /dev/null +++ b/src/pages/health/health.tsx @@ -0,0 +1,42 @@ +import {FC, useEffect, useState} from "react"; +import {Image, ScrollView, View} from "@tarojs/components"; +import {HomeApi} from "@/api"; +import {useReachBottom} from "@tarojs/taro"; +import styles from './health.module.scss' +import play from '@/static/img/play.png' + +const Health: FC = () => { + const [page, setPage] = useState(1) + const [data, setData] = useState([]) + const [total, setTotal] = useState(0) + + async function getData(page: number) { + const res = await HomeApi.health(page, 10) + setData(res.data) + setTotal(res.total) + } + + useReachBottom(() => { + data.length < total && setPage(page + 1) + }) + + useEffect(() => { + getData(page) + }, [page]) + + return ( + + + { + data.map(d => + + + {d.title} + ) + } + + + ) +} + +export default Health diff --git a/src/pages/home/components/adware.tsx b/src/pages/home/components/adware.tsx index 705563b..fbe7b6e 100644 --- a/src/pages/home/components/adware.tsx +++ b/src/pages/home/components/adware.tsx @@ -9,7 +9,7 @@ const Adware: FC = () => { const [data, setData] = useState([]) async function getAdware() { - const res = await HomeApi.advert('home_swiper') + const res = await HomeApi.advert('home_space') setData(res) } @@ -20,7 +20,7 @@ const Adware: FC = () => { { data.length === 1 && jumpAdware(data[0].advert_link)} diff --git a/src/pages/home/components/feature_recommended.tsx b/src/pages/home/components/feature_recommended.tsx index 507bc35..3281c26 100644 --- a/src/pages/home/components/feature_recommended.tsx +++ b/src/pages/home/components/feature_recommended.tsx @@ -1,39 +1,69 @@ -import {FC, useState} from "react"; -import {Swiper, SwiperItem, View} from "@tarojs/components"; +import {FC, useEffect, useState} from "react"; +import {Image, Swiper, SwiperItem, View} from "@tarojs/components"; import styles from '../home.module.scss' import Taro from "@tarojs/taro"; +import {HomeApi} from "@/api"; interface DataContent { id: number, + imageUrl: string title: string, - Description: string + description: string } interface Data { title: string, url: string, + detailsUrl: string data: DataContent[] } const FeatureRecommended: FC = () => { - const [data] = useState([ - {title: "品牌TOP3", url: '', data: []}, - {title: "健康", url: '', data: []}, - {title: "专业技能", url: '', data: []}, - {title: "疾病知识", url: '', data: []}, + const [data, setData] = useState([ + {title: "品牌TOP3", url: '', detailsUrl: '', data: []}, + {title: "健康知识", url: '/pages/health/health', detailsUrl: '', data: []}, + {title: "专业技能", url: '', detailsUrl: '', data: []}, + {title: "疾病知识", url: '', detailsUrl: '', data: []}, ]) + /** 健康知识 */ + async function getHealth() { + const res = await HomeApi.health(1, 3) + const oldData: Data[] = JSON.parse(JSON.stringify(data)) + if (res.data.length) { + oldData[1].data = res.data.map(d => ({ + id: d.id, + title: d.title, + imageUrl: d.url_path, + description: d.introduction + })) + } + setData(oldData) + } + + useEffect(() => { + getHealth() + }, []) + function jump(url: string) { Taro.navigateTo({url}) } - return ( - - + + { - data.map(d => - jump(d.url)}>{d.title} + data.map(d => + jump(d.url)}>{d.title} + { + d.data.map(c => jump(d.detailsUrl + c.id)}> + + + {c.title} + {c.description} + + ) + } ) } diff --git a/src/pages/home/home.module.scss b/src/pages/home/home.module.scss index 0072faa..79f0a75 100644 --- a/src/pages/home/home.module.scss +++ b/src/pages/home/home.module.scss @@ -53,10 +53,26 @@ display: block; } -.featureRecommended { +.feature { + color: #323635; background: #fff; padding: 30rpx; margin-top: 20rpx; border-radius: 16rpx; box-shadow: inset -30px -30px 30px rgba(#fff, .9); } + +.featureTitle { + font-weight: bold; + font-size: 32rpx; + padding-bottom: 24rpx; +} + +.featureImage { + width: 140px; + height: 90px; + background: #eee; + border-radius: 10rpx; + overflow: hidden; + margin-right: 20rpx; +} diff --git a/src/static/css/module.scss b/src/static/css/module.scss index b440b00..8f57891 100644 --- a/src/static/css/module.scss +++ b/src/static/css/module.scss @@ -84,3 +84,20 @@ taro-button-core::after { color: #fff; font-size: 32rpx; } + +/** 单行文本省略 */ +.text-ellipsis { + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + -o-text-overflow: ellipsis; +} + +/** 多行文本省略 */ +.text-ellipsis-2 { + overflow: hidden; + text-overflow: ellipsis; + -webkit-line-clamp: 2; + display: -webkit-box; + -webkit-box-orient: vertical; +} diff --git a/types/home.d.ts b/types/home.d.ts new file mode 100644 index 0000000..ffbd2ff --- /dev/null +++ b/types/home.d.ts @@ -0,0 +1,6 @@ +interface Health { + id: number + title: string + introduction: string + url_path: string +} From 541be630b53637a696d0821d172f4896c73751cf Mon Sep 17 00:00:00 2001 From: king <2229249788@qq.com> Date: Mon, 21 Aug 2023 16:45:20 +0800 Subject: [PATCH 3/6] =?UTF-8?q?=E9=A6=96=E9=A1=B5=20=E5=81=A5=E5=BA=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/home.ts | 15 +++ src/app.config.ts | 2 + src/components/videoCover/videoCover.scss | 2 +- src/pages/business/sort/sort.config.ts | 3 + src/pages/business/sort/sort.tsx | 21 ++++ .../business/videoFull/videoFull.config.ts | 6 ++ src/pages/business/videoFull/videoFull.tsx | 27 ++++++ src/pages/health/health.tsx | 12 ++- src/pages/home/components/curRecommended.tsx | 2 +- src/pages/home/components/feature.tsx | 6 +- .../home/components/feature_recommended.tsx | 97 +++++++++++++++---- src/pages/home/home.module.scss | 29 ++++-- types/home.d.ts | 24 +++++ 13 files changed, 211 insertions(+), 35 deletions(-) create mode 100644 src/pages/business/sort/sort.config.ts create mode 100644 src/pages/business/sort/sort.tsx create mode 100644 src/pages/business/videoFull/videoFull.config.ts create mode 100644 src/pages/business/videoFull/videoFull.tsx diff --git a/src/api/home.ts b/src/api/home.ts index e5272dc..3b39499 100644 --- a/src/api/home.ts +++ b/src/api/home.ts @@ -35,7 +35,22 @@ export const HomeApi = { return request<{ data: Curriculum[], total: number }>('/home/v1/course/course', "GET", {page, page_size}) }, /** 健康管理 */ + healthTop(count: number) { + return request('/home/v1/health/top', "GET", {count}) + }, health(page: number, page_size: number) { return request<{ data: Health[], total: number }>('/home/v1/health/index', "GET", {page, page_size}) + }, + /** 增加播放量 */ + healthSetPlay(id) { + return request(`/home/v1/health/set_play/${id}`, "PUT") + }, + /** 品牌 */ + brand(page: number, page_size: number) { + return request<{ data: Brand[], total: number }>('/home/v1/brand/list', "GET", {page, page_size}) + }, + /** 技能 */ + skillTop(count: number) { + return request('/home/v1/skill/top', "GET", {count}) } } diff --git a/src/app.config.ts b/src/app.config.ts index 0bd7fb5..86b7b99 100644 --- a/src/app.config.ts +++ b/src/app.config.ts @@ -59,6 +59,8 @@ export default defineAppConfig({ 'curHistory/curHistory', 'hourHistory/hourHistory', 'courType/courType', + 'videoFull/videoFull', // 资源id 视频全屏 + 'sort/sort', // 公共二级分类 ] }, { diff --git a/src/components/videoCover/videoCover.scss b/src/components/videoCover/videoCover.scss index b9e734b..df662ed 100644 --- a/src/components/videoCover/videoCover.scss +++ b/src/components/videoCover/videoCover.scss @@ -44,7 +44,7 @@ Image { width: 100%; - //height: 100%; + background: #eee; } } diff --git a/src/pages/business/sort/sort.config.ts b/src/pages/business/sort/sort.config.ts new file mode 100644 index 0000000..f54b62b --- /dev/null +++ b/src/pages/business/sort/sort.config.ts @@ -0,0 +1,3 @@ +export default definePageConfig({ + navigationBarTitleText: '分类' +}) diff --git a/src/pages/business/sort/sort.tsx b/src/pages/business/sort/sort.tsx new file mode 100644 index 0000000..f01c221 --- /dev/null +++ b/src/pages/business/sort/sort.tsx @@ -0,0 +1,21 @@ +import {FC} from "react"; +import {View} from "@tarojs/components"; +import {useRouter} from "@tarojs/taro"; + +type SortType = '' + +interface Params { + id: number + type: SortType + jumpUrl: () => void +} + +const Sort: FC = () => { + const params = useRouter().params as unknown as Params + + return ( + ds + ) +} + +export default Sort diff --git a/src/pages/business/videoFull/videoFull.config.ts b/src/pages/business/videoFull/videoFull.config.ts new file mode 100644 index 0000000..82334a5 --- /dev/null +++ b/src/pages/business/videoFull/videoFull.config.ts @@ -0,0 +1,6 @@ +export default definePageConfig({ + navigationBarTitleText: ' ', + backgroundColor:'#000000', + navigationBarTextStyle:'white', + navigationBarBackgroundColor:'#000000' +}) diff --git a/src/pages/business/videoFull/videoFull.tsx b/src/pages/business/videoFull/videoFull.tsx new file mode 100644 index 0000000..c88333b --- /dev/null +++ b/src/pages/business/videoFull/videoFull.tsx @@ -0,0 +1,27 @@ +import {Video} from "@tarojs/components"; +import {FC} from "react"; +import Taro from "@tarojs/taro"; + +interface Props { + url: string +} + +const VideoFull: FC = () => { + const {url} = Taro.useRouter().params + return ( +