diff --git a/.env b/.env index 86e2b46..a9c9848 100644 --- a/.env +++ b/.env @@ -1,5 +1,6 @@ #TARO_APP_API=https://yjx.dev.yaojiankang.top -TARO_APP_API=https://mooc.yaojiankang.top +#TARO_APP_API=https://mooc.yaojiankang.top +TARO_APP_API=https://xingui.yaojiankang.top #TARO_APP_API=https://shopfix.yaojiankang.top #TARO_APP_API=https://playedu.yaojiankang.top TARO_APP_LGOIN=true diff --git a/project.config.json b/project.config.json index d27e980..3d90977 100644 --- a/project.config.json +++ b/project.config.json @@ -1,8 +1,8 @@ { "miniprogramRoot": "./dist", - "projectname": "video", + "projectname": "信桂", "description": "", - "appid": "wx703940a70f0f1be7", + "appid": "wx7ef5cf2d16bdaea2", "setting": { "urlCheck": true, "es6": false, diff --git a/src/api/brand.ts b/src/api/brand.ts index a1187f7..9e83973 100644 --- a/src/api/brand.ts +++ b/src/api/brand.ts @@ -14,6 +14,7 @@ export type BrandRecord = { created_at: string page_view: number collect: boolean + last_publish_time: string } export type ArticleRecord = { id: number; diff --git a/src/api/home.ts b/src/api/home.ts index 60c85d8..838bfa9 100644 --- a/src/api/home.ts +++ b/src/api/home.ts @@ -39,6 +39,8 @@ export interface HomeData { illness: { list: Illness[] } + articles: Articles[] + courses: {data:any,total:number} } interface Course { diff --git a/src/api/illness.ts b/src/api/illness.ts index 2fc86bd..f99edb8 100644 --- a/src/api/illness.ts +++ b/src/api/illness.ts @@ -1,6 +1,7 @@ import {request} from "@/api/request"; export interface Illness { + name?: any; illness: { name: string; description: string; @@ -14,6 +15,8 @@ export interface Illness { } } + + export const illnessApi = { /** 疾病列表 */ list(id: number, page: number, page_size: number) { diff --git a/src/api/meeting.ts b/src/api/meeting.ts index 5c22f50..8bffd08 100644 --- a/src/api/meeting.ts +++ b/src/api/meeting.ts @@ -27,21 +27,29 @@ interface MeetingInfo { } export const meetingAPi = { - setMeetings(data: Meeting) { + addMeetings(data: Meeting) { return request<{ id: number }>('/api/v1/meetings/meeting', "POST", data) }, + setMeetings(data: Meeting) { + return request<{ id: number }>(`/api/v1/meetings/meeting/${data.id}`, "PUT", data) + }, putMeeting(id: number, data: Partial) { return request(`/api/v1/meetings/meeting/${id}`, "PUT", data) }, setMeeting(id: string) { return request(`/api/v1/meetings/meeting/${id}`, "GET") }, + unstopsList() { + return request(`/api/v1/meetings/unstops`, "GET") + }, setList(page: number, page_size: number) { return request<{ data: Meeting[], total: number }>(`/api/v1/meetings/meeting?page=${page}&page_size=${page_size}`, "GET") }, + + exists() { return request('/api/v1/meetings/exists', "GET") }, diff --git a/src/api/public.ts b/src/api/public.ts index 482dce1..cbdb91c 100644 --- a/src/api/public.ts +++ b/src/api/public.ts @@ -14,6 +14,12 @@ export interface CoursesMode { audit_mode: boolean course: Courses } +export interface NewCoursesMode { + articles: any[] + audit_mode: boolean + platform_courses: Curriculum[] + company_courses: Curriculum[] +} export interface Courses { /** 选秀 */ @@ -34,5 +40,8 @@ export const publicApi = { }, articlesPush(page: number, page_size: number) { return request<{ list: Articles[], total: number }>('/home/v1/article/list', "GET", {page, page_size}) - } + }, + newCourse(data: { page: number, page_size: number }) { + return request('/home/v1/home/courses', "GET", data) + }, } diff --git a/src/app.config.ts b/src/app.config.ts index 596dcce..c8a074f 100644 --- a/src/app.config.ts +++ b/src/app.config.ts @@ -6,11 +6,12 @@ export default defineAppConfig({ 'pages/login/login', 'pages/check/check', 'pages/my/my', + 'pages/search/index' ], window: { backgroundTextStyle: 'light', navigationBarBackgroundColor: '#fff', - navigationBarTitleText: '课程', + navigationBarTitleText: '信桂', navigationBarTextStyle: 'black' }, tabBar: { @@ -29,6 +30,12 @@ export default defineAppConfig({ iconPath: "static/tabs/study.png", selectedIconPath: "static/tabs/study-selected.png", }, + { + text: '搜索', + pagePath: 'pages/search/index', + iconPath: "static/img/graySearch.png", + selectedIconPath: "static/img/cyanSearch.png", + }, { text: "我的", pagePath: 'pages/my/my', @@ -76,6 +83,8 @@ export default defineAppConfig({ 'spotMeeting/spotMeeting', 'selectDep/selectDep', 'meetings/meetings', + 'meetings/list', + 'meetings/form/form', 'userInfo/userInfo', 'courseAdmin/courseAdmin', ] diff --git a/src/app.scss b/src/app.scss index 260f4e9..98c98e3 100644 --- a/src/app.scss +++ b/src/app.scss @@ -1,6 +1,8 @@ @import "static/css/module"; //@import 'taro-ui/dist/style/index.scss'; +.inlineblock { display: inline-block } + .flex {display: flex !important;flex-direction:row} .flex-row{ flex-direction:row!important} .flex-column{ flex-direction:column!important} @@ -20,6 +22,7 @@ .align-center{ align-items: center} .align-stretch{ align-items: stretch} .align-start{ align-items: flex-start} +.align-baseline{align-items: baseline} .align-end{ align-items: flex-end} .content-start {align-content: flex-start} @@ -37,6 +40,8 @@ .flex-shrink{flex-shrink: 0} .gap20rpx{gap: 20rpx} +.gap30rpx{gap: 30rpx} +.gap60rpx{gap: 60rpx} .w-1 {width: 10%;min-width: 75rpx} .w-2 {width: 20%;min-width: 150rpx} @@ -376,6 +381,7 @@ .relative {position: relative} .absolute {position: absolute} +.absolute-impt{position: absolute !important;} .fixed {position: fixed} .sticky {position: sticky} @@ -396,3 +402,18 @@ background: #000; opacity: 0.05; } + +.z1{ + z-index: 1; +} +.z2{ + z-index: 2; +} +.z3{ + z-index: 3; +} + +.word-break{ + word-break: break-all; +} + diff --git a/src/components/IconFont/icon.css b/src/components/IconFont/icon.css new file mode 100644 index 0000000..a70840c --- /dev/null +++ b/src/components/IconFont/icon.css @@ -0,0 +1,128 @@ +@font-face { + font-family: 'xgicon'; + src: url('data:application/x-font-woff;charset=utf-8;base64,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') format('woff'); + font-weight: normal; + font-style: normal; + font-display: block; +} + +.xg-icon { + /* use !important to prevent issues with browser extensions that change fonts */ + font-family: 'xgicon' !important; + speak: never; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + + /* Better Font Rendering =========== */ + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.xg-icon-arrow-clockwise:before {content: "\e900"} +.xg-icon-arrow-counterclockwise:before {content: "\e901"} +.xg-icon-backspace:before {content: "\e902"} +.xg-icon-backspace-fill:before {content: "\e903"} +.xg-icon-bar-chart:before {content: "\e904"} +.xg-icon-bar-chart-fill:before {content: "\e905"} +.xg-icon-bar-chart-line:before {content: "\e906"} +.xg-icon-bar-chart-line-fill:before {content: "\e907"} +.xg-icon-caret-down:before {content: "\e908"} +.xg-icon-caret-down-fill:before {content: "\e909"} +.xg-icon-caret-left:before {content: "\e90a"} +.xg-icon-caret-left-fill:before {content: "\e90b"} +.xg-icon-caret-right:before {content: "\e90c"} +.xg-icon-caret-right-fill:before {content: "\e90d"} +.xg-icon-caret-up:before {content: "\e90e"} +.xg-icon-caret-up-fill:before {content: "\e90f"} +.xg-icon-check:before {content: "\e910"} +.xg-icon-check-all:before {content: "\e911"} +.xg-icon-check-circle:before {content: "\e912"} +.xg-icon-check-circle-fill:before {content: "\e913"} +.xg-icon-check-square:before {content: "\e914"} +.xg-icon-check-square-fill:before {content: "\e915"} +.xg-icon-chevron-double-down:before {content: "\e916"} +.xg-icon-chevron-double-left:before {content: "\e917"} +.xg-icon-chevron-double-right:before {content: "\e918"} +.xg-icon-chevron-double-up:before {content: "\e919"} +.xg-icon-chevron-down:before {content: "\e91a"} +.xg-icon-chevron-left:before {content: "\e91b"} +.xg-icon-chevron-right:before {content: "\e91c"} +.xg-icon-chevron-up:before {content: "\e91d"} +.xg-icon-circle:before {content: "\e91e"} +.xg-icon-circle-fill:before {content: "\e91f"} +.xg-icon-exclamation:before {content: "\e920"} +.xg-icon-exclamation-circle:before {content: "\e921"} +.xg-icon-exclamation-circle-fill:before {content: "\e922"} +.xg-icon-exclamation-diamond:before {content: "\e923"} +.xg-icon-exclamation-diamond-fill:before {content: "\e924"} +.xg-icon-exclamation-octagon:before {content: "\e925"} +.xg-icon-exclamation-octagon-fill:before {content: "\e926"} +.xg-icon-exclamation-square:before {content: "\e927"} +.xg-icon-exclamation-square-fill:before {content: "\e928"} +.xg-icon-exclamation-triangle:before {content: "\e929"} +.xg-icon-exclamation-triangle-fill:before {content: "\e92a"} +.xg-icon-gear:before {content: "\e92b"} +.xg-icon-gear-fill:before {content: "\e92c"} +.xg-icon-gender-female:before {content: "\e92d"} +.xg-icon-gender-male:before {content: "\e92e"} +.xg-icon-hand-index:before {content: "\e92f"} +.xg-icon-hand-index-fill:before {content: "\e930"} +.xg-icon-hand-index-thumb:before {content: "\e931"} +.xg-icon-hand-index-thumb-fill:before {content: "\e932"} +.xg-icon-hand-thumbs-down:before {content: "\e933"} +.xg-icon-hand-thumbs-down-fill:before {content: "\e934"} +.xg-icon-hand-thumbs-up:before {content: "\e935"} +.xg-icon-hand-thumbs-up-fill:before {content: "\e936"} +.xg-icon-heart:before {content: "\e937"} +.xg-icon-heart-fill:before {content: "\e938"} +.xg-icon-info:before {content: "\e939"} +.xg-icon-info-circle:before {content: "\e93a"} +.xg-icon-info-circle-fill:before {content: "\e93b"} +.xg-icon-info-square:before {content: "\e93c"} +.xg-icon-info-square-fill:before {content: "\e93d"} +.xg-icon-list:before {content: "\e93e"} +.xg-icon-lock:before {content: "\e93f"} +.xg-icon-lock-fill:before {content: "\e940"} +.xg-icon-play:before {content: "\e941"} +.xg-icon-play-btn:before {content: "\e942"} +.xg-icon-play-btn-fill:before {content: "\e943"} +.xg-icon-play-circle:before {content: "\e944"} +.xg-icon-play-circle-fill:before {content: "\e945"} +.xg-icon-play-fill:before {content: "\e946"} +.xg-icon-question:before {content: "\e947"} +.xg-icon-question-circle:before {content: "\e948"} +.xg-icon-question-circle-fill:before {content: "\e949"} +.xg-icon-question-diamond:before {content: "\e94a"} +.xg-icon-question-diamond-fill:before {content: "\e94b"} +.xg-icon-question-octagon:before {content: "\e94c"} +.xg-icon-question-octagon-fill:before {content: "\e94d"} +.xg-icon-question-square:before {content: "\e94e"} +.xg-icon-question-square-fill:before {content: "\e94f"} +.xg-icon-shield:before {content: "\e950"} +.xg-icon-shield-check:before {content: "\e951"} +.xg-icon-shield-check-fill:before {content: "\e952"} +.xg-icon-shield-exclamation:before {content: "\e953"} +.xg-icon-shield-exclamation-fill:before {content: "\e954"} +.xg-icon-shield-fill:before {content: "\e955"} +.xg-icon-shield-lock:before {content: "\e956"} +.xg-icon-shield-lock-fill:before {content: "\e957"} +.xg-icon-square:before {content: "\e958"} +.xg-icon-square-fill:before {content: "\e959"} +.xg-icon-star:before {content: "\e95a"} +.xg-icon-star-fill:before {content: "\e95b"} +.xg-icon-three-dots:before {content: "\e95c"} +.xg-icon-three-dots-vertical:before {content: "\e95d"} +.xg-icon-trash:before {content: "\e95e"} +.xg-icon-trash-fill:before {content: "\e95f"} +.xg-icon-unlock:before {content: "\e960"} +.xg-icon-unlock-fill:before {content: "\e961"} +.xg-icon-x:before {content: "\e962"} +.xg-icon-x-circle:before {content: "\e963"} +.xg-icon-x-circle-fill:before {content: "\e964"} +.xg-icon-x-octagon:before {content: "\e965"} +.xg-icon-x-octagon-fill:before {content: "\e966"} +.xg-icon-x-square:before {content: "\e967"} +.xg-icon-x-square-fill:before {content:"\e968"} diff --git a/src/components/IconFont/index.tsx b/src/components/IconFont/index.tsx new file mode 100644 index 0000000..4be6369 --- /dev/null +++ b/src/components/IconFont/index.tsx @@ -0,0 +1,88 @@ +import { CSSProperties, FC } from "react" +import { Text, ITouchEvent } from "@tarojs/components" +import './icon.css' + +export type IconName = + | 'arrow-clockwise' + | 'arrow-counterclockwise' + | 'backspace' + | 'bar-chart' + | 'bar-chart-line' + | 'caret-down' + | 'caret-up' + | 'caret-left' + | 'caret-right' + | 'check' + | 'check-all' + | 'chevron-double-down' + | 'chevron-double-up' + | 'chevron-double-left' + | 'chevron-double-right' + | 'chevron-down' + | 'chevron-up' + | 'chevron-left' + | 'chevron-right' + | 'circle' + | 'exclamation' + | 'gear' + | 'gender-female' + | 'gender-male' + | 'heart' + | 'info' + | 'list' + | 'lock' + | 'unlock' + | 'play-btn' + | 'play' + | 'question' + | 'shield' + | 'square' + | 'star' + | 'three-dots-vertical' + | 'three-dots' + | 'trash' + | 'x' + +export type IconShape = + | 'circle' + | 'square' + | 'diamond' + | 'octagon' + | 'triangle' + +export interface IconProps { + name: IconName + shape?: IconShape + color?: string + size?: string | number + fill?: boolean + className?: string + style?: CSSProperties + onClick?: (event: ITouchEvent) => void +} + +const XgIcon: FC = (props) => { + const name = [ + props.name, + props.shape, + props.fill ? 'fill' : undefined + ].filter(Boolean).join('-') + + const color = props.color ?? 'currentColor' + const size = typeof props.size === 'string' ? props.size : `${props.size ?? 16}px` + const fontStyle: CSSProperties = { + ...(props.style ?? {}), + fontSize: size, + color, + } + + return ( + + ) +} + +export default XgIcon diff --git a/src/components/collect/collect.module.scss b/src/components/collect/collect.module.scss index 37eab1a..f811a84 100644 --- a/src/components/collect/collect.module.scss +++ b/src/components/collect/collect.module.scss @@ -13,10 +13,10 @@ height: 32rpx; margin-right: 10rpx; - Image { - width: 100%; - height: 100%; - } + //Image { + // width: 100%; + // height: 100%; + //} } .zoom { diff --git a/src/components/collect/collect.tsx b/src/components/collect/collect.tsx index 974cf0e..2202713 100644 --- a/src/components/collect/collect.tsx +++ b/src/components/collect/collect.tsx @@ -1,11 +1,12 @@ import {CSSProperties, FC, useCallback, useEffect, useState} from "react"; -import star from '@/static/img/star.png' -import starLine from '@/static/img/starLine.png' -import {Image, View} from "@tarojs/components"; +// import star from '@/static/img/star.png' +// import starLine from '@/static/img/starLine.png' +import {View} from "@tarojs/components"; import styles from './collect.module.scss' import {Profile} from "@/store" import Taro from "@tarojs/taro"; import {userApi} from "@/api"; +import IconFont from "@/components/IconFont"; interface Props { onClick?: () => void @@ -62,12 +63,14 @@ const Collect: FC = (props) => { return ( - - + {/**/} + + + + {/**/} - {!props.textHidden && (select ? '已收藏' : '收藏')} + {/*{!props.textHidden && (select ? '已收藏' : '收藏')}*/} + {!props.textHidden && '收藏'} ) } diff --git a/src/components/empty/empty.module.scss b/src/components/empty/empty.module.scss index 10efb9e..82016bd 100644 --- a/src/components/empty/empty.module.scss +++ b/src/components/empty/empty.module.scss @@ -3,6 +3,9 @@ text-align: center; color: #6c757d; position: relative; + display: flex; + flex-direction: column; + align-items: center; } .image { @@ -14,9 +17,5 @@ .name { font-size: 30rpx; - position: absolute; - left: 0; - right: 0; - bottom: 50rpx; margin: auto; } diff --git a/src/components/empty/empty.tsx b/src/components/empty/empty.tsx index 1702395..86c4b85 100644 --- a/src/components/empty/empty.tsx +++ b/src/components/empty/empty.tsx @@ -1,17 +1,29 @@ import {FC} from "react"; -import {Image, View} from "@tarojs/components"; +import {Button, Image, View} from "@tarojs/components"; import emptyImg from '@/static/img/empty.png' import styles from './empty.module.scss' +import MyButton from "@/components/button/MyButton"; +import Taro from "@tarojs/taro"; interface Props { name: string + showBack?: boolean + onRefresh?:() => void } -const Empty: FC = ({name}) => { +const Empty: FC = ({name, showBack, onRefresh}) => { + const hasBack = showBack && Taro.getCurrentPages().length > 1 + const hasRefresh = onRefresh != null return ( {name} + {(hasBack || hasRefresh) && ( + + {hasBack && } + {hasRefresh && 刷新} + + )} ) } diff --git a/src/components/image/image.tsx b/src/components/image/image.tsx index 82fb967..5c563a8 100644 --- a/src/components/image/image.tsx +++ b/src/components/image/image.tsx @@ -13,6 +13,8 @@ interface Props extends ImageProps { height?: number | string fallback?: string errorType?: ImgErrType + loadingImage?: string + errorImage?: string fit?: boolean // 当网络图片加载完成后高度自动 } @@ -38,6 +40,10 @@ const Img: FC = ({src, mode = 'aspectFill', width, fallback = shard, ...p }, [src]) useEffect(() => { + if (props.errorImage) { + setErrorUrl(props.errorImage) + return + } switch (props.errorType) { case undefined: case "acquiesce": @@ -78,8 +84,8 @@ const Img: FC = ({src, mode = 'aspectFill', width, fallback = shard, ...p {!isError && diff --git a/src/components/learningRecord/learningRecord.tsx b/src/components/learningRecord/learningRecord.tsx index 38944e0..777dab2 100644 --- a/src/components/learningRecord/learningRecord.tsx +++ b/src/components/learningRecord/learningRecord.tsx @@ -12,10 +12,9 @@ import debounce from "@/utils/debounce"; const tabList: TabList[] = [ { - title: '日', - value: { - start_time: new Date().setHours(0, 0, 0, 0), - end_time: new Date().setHours(24, 0, 0, 0) + title: '月', value: { + start_time: monthFirst(), + end_time: monthEnd() } }, { @@ -25,9 +24,10 @@ const tabList: TabList[] = [ } }, { - title: '月', value: { - start_time: monthFirst(), - end_time: monthEnd() + title: '日', + value: { + start_time: new Date().setHours(0, 0, 0, 0), + end_time: new Date().setHours(24, 0, 0, 0) } }, ] @@ -59,6 +59,7 @@ const LearningRecord: FC = ({userId, style, className}) => { } } + // @ts-ignore function tabChange({tab}: OnChangOpt) { if (!token) { Taro.navigateTo({url: '/pages/login/login'}) diff --git a/src/components/lineChart/lineChart.module.scss b/src/components/lineChart/lineChart.module.scss index 39e2808..982ad12 100644 --- a/src/components/lineChart/lineChart.module.scss +++ b/src/components/lineChart/lineChart.module.scss @@ -60,11 +60,11 @@ width: 30rpx; background: linear-gradient(180deg, #03D9B3 0%, #05BF88 100%); border-radius: 30rpx; - margin-bottom: 20rpx; + margin-bottom: 6rpx; overflow: hidden; animation: rise 300ms ease-in-out forwards; max-height: 0; - margin-top: 10rpx; + margin-top: 6rpx; } .value { @@ -73,6 +73,7 @@ font-family: PingFang SC-Bold, PingFang SC; font-weight: bold; color: #606563; + line-height: 20rpx; } .time { diff --git a/src/components/lineChart/lineChart.tsx b/src/components/lineChart/lineChart.tsx index 5262578..03b2174 100644 --- a/src/components/lineChart/lineChart.tsx +++ b/src/components/lineChart/lineChart.tsx @@ -17,6 +17,7 @@ const height = 150 const LineChart: FC = ({data}) => { const [maxHeight, setMaxHeight] = useState({time: '', value: 0}) const [lineChartList, setLineChartList] = useState(data) + console.log(maxHeight,lineChartList,'maxHeight') useEffect(() => { setLineChartList(data) @@ -31,7 +32,9 @@ const LineChart: FC = ({data}) => { return ( - {formatDateTime(new Date(maxHeight.time), 'MM月dd日')} + {/*{maxHeight.time}*/} + + {maxHeight.time.split('/').join('月')} {maxHeight.value > 0 ? `日最努力` : `期间没有学习记录`},学习了{formatTime(maxHeight.value, 0)} diff --git a/src/components/login-view/index.module.scss b/src/components/login-view/index.module.scss new file mode 100644 index 0000000..0a388a3 --- /dev/null +++ b/src/components/login-view/index.module.scss @@ -0,0 +1,38 @@ +.fixedBox { + position: relative; + width: 100vw; + height: 100vw; + background: linear-gradient(to bottom, rgba(255, 255, 255, 0), rgba(255, 255, 255, 1), rgba(255, 255, 255, 1)); + //border: 1px solid #f40; + + &-inner { + position: absolute; + width: 100vw; + bottom: 24rpx; + display: flex; + flex-direction: column; + align-items: center; + + &-icon { + image { + width: 32rpx; + height: 32rpx; + } + } + + &-box { + margin-top: 24rpx; + width: 680rpx; + left: 35rpx; + height: 76rpx; + background-color: #45D4A8; + color: #fff; + line-height: 76rpx; + text-align: center; + font-size: 32rpx; + font-weight: 500; + border-radius: 8rpx 8rpx 8rpx 8rpx; + } + + } +} diff --git a/src/components/login-view/index.tsx b/src/components/login-view/index.tsx new file mode 100644 index 0000000..e93e848 --- /dev/null +++ b/src/components/login-view/index.tsx @@ -0,0 +1,28 @@ +import styles from "./index.module.scss"; +import { Text, View} from "@tarojs/components"; +import Taro from "@tarojs/taro"; +import {CSSProperties, FC} from "react"; +import IconFont from "@/components/IconFont"; + +type Props = { + className?: string + style?: CSSProperties +} + +const LoginView3: FC = ({className,style}) => { + return ( + + + + + + + Taro.navigateTo({url: '/pages/login/login'})}> + 登录查看更多内容1 + + + + ) +} +export default LoginView3 diff --git a/src/components/loginView/index.tsx b/src/components/loginView/index.tsx index 2475592..5508d0f 100644 --- a/src/components/loginView/index.tsx +++ b/src/components/loginView/index.tsx @@ -15,7 +15,7 @@ interface Props { onSuccess?: VoidFunction } -const LoginView: FC = (props) => { +export const LoginView: FC = (props) => { const [isLoading, setLoading] = useState(false) const {setUser, setToken, setCompany} = Profile.useContainer() const sizeStyle: CSSProperties = { @@ -72,4 +72,31 @@ const LoginView: FC = (props) => { ) } -export default LoginView +const LoginView2: FC = (props) => { + + const sizeStyle: CSSProperties = { + height: `${props.height || 1000}rpx`, + paddingTop: `${props.paddingTop || 0}rpx`, + ...props.style, + } + + + + return ( + + { + !props.offImage && <> + + {/*暂未登录*/} + + } + { + Taro.navigateTo({ + url:'/pages/login/login' + }) + }} className={styles.button}>去登录 + + ) +} + +export default LoginView2 diff --git a/src/components/navigationBar/navigationBar.module.scss b/src/components/navigationBar/navigationBar.module.scss index dd4ece0..dd7d9f3 100644 --- a/src/components/navigationBar/navigationBar.module.scss +++ b/src/components/navigationBar/navigationBar.module.scss @@ -3,7 +3,6 @@ top: 0; left: 0; width: 100%; - padding-left: 20rpx; z-index: 100; overflow: hidden; background: #fff; diff --git a/src/hooks/pubsub.ts b/src/hooks/pubsub.ts new file mode 100644 index 0000000..bae18e7 --- /dev/null +++ b/src/hooks/pubsub.ts @@ -0,0 +1,39 @@ +import Taro from "@tarojs/taro"; + +type Topic = string | symbol +type Subscriber = (...args: any[]) => void + +export default function usePubsub() { + const events = new Map() + const registers = new Map() + + const pub = (topic: Topic, data: any) => { + Taro.eventCenter.trigger(topic, data) + }; + + const sub = (topic: Topic, callback: Subscriber) => { + const cbs = events.get(topic) ?? [] + events.set(topic, cbs.concat(callback)) + if (!registers.has(topic)) { + console.log({topic}) + const listener = (...args: any[]): void => { + events.get(topic)?.forEach((cb) => cb(...args)) + } + registers.set(topic, listener) + Taro.eventCenter.on(topic, listener) + } + }; + + Taro.useUnload(() => { + registers.forEach((listener, topic) => { + Taro.eventCenter.off(topic, listener) + }) + registers.clear() + events.clear() + }) + + return { + pub, + sub + } +} diff --git a/src/pages/business/curHistory/curHistory.tsx b/src/pages/business/curHistory/curHistory.tsx index 77f2ef0..a934c8a 100644 --- a/src/pages/business/curHistory/curHistory.tsx +++ b/src/pages/business/curHistory/curHistory.tsx @@ -1,4 +1,4 @@ -import {Image, Progress, View} from "@tarojs/components"; +import {Image, Progress, ScrollView, View} from "@tarojs/components"; import Taro from "@tarojs/taro"; import styles from './curHistory.module.scss' import {useState} from "react"; @@ -118,6 +118,7 @@ const CurHistory = () => { round position='bottom' onClickOverlay={() => setShow(false)}> + {hours?.length ? hours?.map(d => @@ -138,6 +139,7 @@ const CurHistory = () => { ) : } + ) diff --git a/src/pages/business/userInfo/userInfo.tsx b/src/pages/business/userInfo/userInfo.tsx index 77f38a5..cc7f553 100644 --- a/src/pages/business/userInfo/userInfo.tsx +++ b/src/pages/business/userInfo/userInfo.tsx @@ -61,9 +61,14 @@ const List = () => { success(res) { Taro.hideLoading() if (res.statusCode === 200) { - const data: User = JSON.parse(res.data).data - setUser(data) - Taro.showToast({title: "图片上传成功"}) + const resp:{msg:string,code:number,data:User} =JSON.parse(res.data) + if(resp.code === 0){ + const data: User = resp.data + setUser(data) + Taro.showToast({title: "图片上传成功"}) + }else{ + Taro.showToast({title: resp.msg, icon: 'none',mask: true}) + } } else { Taro.showToast({title: "图片上传失败", icon: 'error'}) } @@ -102,7 +107,7 @@ const List = () => { return ( <> - + diff --git a/src/pages/business/videoInfo/components/catalogue.tsx b/src/pages/business/videoInfo/components/catalogue.tsx index 72521c6..29312bf 100644 --- a/src/pages/business/videoInfo/components/catalogue.tsx +++ b/src/pages/business/videoInfo/components/catalogue.tsx @@ -11,9 +11,10 @@ import curRecord from '@/static/img/curRecord.png' import hourRecord from "@/static/img/hourRecord.png" import CustomPageContainer from "@/components/custom-page-container/custom-page-container"; import {Profile} from "@/store"; -import LoginView from "@/components/loginView"; +import LoginView from "@/components/login-view"; import Collect from "@/components/collect/collect"; -import omit from '@/static/img/omit.png' +// import omit from '@/static/img/omit.png' +import IconFont from "@/components/IconFont"; interface Props { data: CourseDepData | null @@ -21,6 +22,7 @@ interface Props { id: number //课程 playId: number | null refresh: () => void + collectUpdate?: (v: boolean) => void } const tabList = [ @@ -30,13 +32,12 @@ const tabList = [ ] -const Catalogue: FC = ({data, setHors, id, playId, refresh}) => { +const Catalogue: FC = ({data, setHors, id, playId, collectUpdate}) => { const [current, setCurrent] = useState(1) const [show, setShow] = useState(false) const [playing, setPlaying] = useState(false) const {token} = Profile.useContainer() - videoEvents.onVideoState(({name}) => { switch (name) { case "pause": @@ -50,7 +51,9 @@ const Catalogue: FC = ({data, setHors, id, playId, refresh}) => { function jumCurHistory() { if (playId) { - Taro.navigateTo({url: `/pages/business/hourHistory/hourHistory?courseId=${id}&hourId=${playId}`}) + Taro.navigateTo({ + url: `/pages/business/hourHistory/hourHistory?courseId=${id}&hourId=${playId}` + }) } } @@ -144,7 +147,6 @@ const Catalogue: FC = ({data, setHors, id, playId, refresh}) => { } } - return ( <> @@ -154,22 +156,7 @@ const Catalogue: FC = ({data, setHors, id, playId, refresh}) => { {current === 1 && 课程目录 { - !token && + !token && } {data?.chapters.length ? Object.values(data?.chapters || {}).map((d, index) => @@ -203,9 +190,12 @@ const Catalogue: FC = ({data, setHors, id, playId, refresh}) => { owner_type={3} select={data?.course.collect} styles={{flexDirection: 'column', justifyContent: 'center'}} - stylesImage={{margin: '0 0 8rpx 0'}}/> + stylesImage={{margin: '0 0 8rpx 0'}} + onUpdate={collectUpdate} + /> setShow(true)}> - + {/**/} + 更多 @@ -214,17 +204,18 @@ const Catalogue: FC = ({data, setHors, id, playId, refresh}) => { setShow(false)}> + onClickOverlay={() => setShow(false)} + > 更多操作 Taro.navigateTo({url: '/pages/business/curHistory/curHistory?course_id=' + id})}> - 课程记录 + 课程记录 - 当前课时学习记录 + 当前课时学习记录 setShow(false)} type='default' fillet>取消 diff --git a/src/pages/business/videoInfo/components/hours.tsx b/src/pages/business/videoInfo/components/hours.tsx index 9110829..0ad9740 100644 --- a/src/pages/business/videoInfo/components/hours.tsx +++ b/src/pages/business/videoInfo/components/hours.tsx @@ -1,13 +1,14 @@ import {FC} from "react"; -import '../videoInfo.scss' import {Image, Text, View} from "@tarojs/components"; -import playOk from "@/static/img/play-ok.png"; -import play from "@/static/img/play.png"; +// import playOk from "@/static/img/play-ok.png"; +// import play from "@/static/img/play.png"; import {formatMinute} from "@/utils/time"; import Taro from "@tarojs/taro"; import {curriculum} from "@/api"; import lock from '@/static/img/lock.png' import {Profile} from "@/store"; +import IconFont from "@/components/IconFont"; +import '../videoInfo.scss' interface Props { playId: number | null @@ -71,10 +72,13 @@ const Hours: FC = ({data, click, learn_hour_records, playId}) => { <> {data?.map((d, index) => - onClick(d.id, complete(d.id), d, data?.[index - 1]?.id)}> - + onClick(d.id, complete(d.id), d, data?.[index - 1]?.id)} + > + {/**/} + {playId === d.id && @@ -90,7 +94,6 @@ const Hours: FC = ({data, click, learn_hour_records, playId}) => { )} - ) } diff --git a/src/pages/business/videoInfo/videoInfo.scss b/src/pages/business/videoInfo/videoInfo.scss index ce38d75..51661f3 100644 --- a/src/pages/business/videoInfo/videoInfo.scss +++ b/src/pages/business/videoInfo/videoInfo.scss @@ -7,7 +7,6 @@ height: 500rpx; } - .header { margin-bottom: 10px; border-radius: 0 0 40rpx 40rpx; @@ -20,24 +19,28 @@ .catalogue { background: #fff; border-radius: 40rpx; - padding: 0 24rpx 24rpx; + padding: 0; margin-top: 30rpx; .short_desc { + padding: 0 24rpx 24rpx; color: #606563; line-height: 1.75; word-break: break-word; } .hours { + padding: 0 24rpx 24rpx; position: relative; - min-height: 440rpx; + min-height: 100vw; } } .hor { padding: 20rpx 0; display: flex; + justify-content: flex-start; + align-items: baseline; color: #323635; .image { @@ -46,7 +49,6 @@ margin-top: 8rpx; } - .title { flex: 1; width: 710rpx; @@ -67,7 +69,6 @@ margin-left: 10rpx; margin-top: 10rpx; } - } } diff --git a/src/pages/business/videoInfo/videoInfo.tsx b/src/pages/business/videoInfo/videoInfo.tsx index ffac5b1..dd85ffe 100644 --- a/src/pages/business/videoInfo/videoInfo.tsx +++ b/src/pages/business/videoInfo/videoInfo.tsx @@ -17,7 +17,6 @@ const VideoInfo: FC = () => { const [preview, setPreview] = useState(false) // 预览 const [playing, setPlaying] = useState(false) // 学习中 - const getData = useCallback(async (playing: boolean) => { try { const res = await curriculum.courseDep(id, depId) @@ -27,6 +26,12 @@ const VideoInfo: FC = () => { } }, [playing, playId]) + function changeCollect(v: boolean){ + let temp = data + temp!.course.collect = v + setData(temp) + } + const curEnd = (test?: boolean) => { setPlaying(false) if (!test) { // 没有考题才会请求 @@ -103,11 +108,9 @@ const VideoInfo: FC = () => { return ( - { - playId - ? - : - } + {playId + ? + : } @@ -121,10 +124,9 @@ const VideoInfo: FC = () => { 学习进度{((data?.learn_hour_records.length || 0) / (data?.course.class_hour || 1) * 100).toFixed(0)}% - getData(false)}/> + getData(false)}/> ) } - export default VideoInfo diff --git a/src/pages/check/check.config.ts b/src/pages/check/check.config.ts index bdff298..188ea47 100644 --- a/src/pages/check/check.config.ts +++ b/src/pages/check/check.config.ts @@ -1,3 +1,3 @@ export default definePageConfig({ - navigationBarTitleText: '绑定手机号' + navigationBarTitleText: '员工验证', }) diff --git a/src/pages/check/check.module.scss b/src/pages/check/check.module.scss index 47ccdb6..b760b60 100644 --- a/src/pages/check/check.module.scss +++ b/src/pages/check/check.module.scss @@ -5,7 +5,6 @@ bottom: 0; top: 0; background: #fff; - padding: 0 20rpx; } .submit { @@ -13,7 +12,7 @@ justify-content: center; align-items: center; gap: 12px; - margin: 0 auto; + margin: 50px 24px; a { color: #fff; @@ -24,6 +23,7 @@ display: flex; border-bottom: 1px solid #ededed; padding: 30px 0; + margin: 0 24px; } .image { diff --git a/src/pages/check/check.tsx b/src/pages/check/check.tsx index da26136..dcd2ddb 100644 --- a/src/pages/check/check.tsx +++ b/src/pages/check/check.tsx @@ -1,5 +1,5 @@ import {FC, useCallback, useEffect, useRef, useState} from "react"; -import {Form, Image, Input, View} from "@tarojs/components"; +import {Form, Image, Input, Text, View} from "@tarojs/components"; import {Profile} from "@/store"; import {userApi} from "@/api"; import Taro from "@tarojs/taro"; @@ -8,6 +8,7 @@ import styles from './check.module.scss' import code from '@/static/img/vCode.png' import tel from '@/static/img/tel.png' import MyButton from "@/components/button/MyButton"; +import IconFont from "@/components/IconFont"; const Bing: FC = () => { const form = useRef(null) @@ -76,6 +77,23 @@ const Bing: FC = () => { return ( + + + + + 检测到您第一次登录,需要通过手机号码验证是否为 + 我司战略合作的客户员工 + ,如果无法完成验证请点击 + { + Taro.navigateTo({ + url:`/pages/preview/webView/webView?url=${encodeURIComponent(`${process.env.TARO_APP_API}/QA/yuangongyanzheng.html`)}` + }) + }} className="text-success mx-1" style={{textDecoration:'underline'}}>相关问题解答 + ! + + + +
@@ -85,7 +103,7 @@ const Bing: FC = () => { setPhone_number(Number(e.detail.value))}/> @@ -96,16 +114,16 @@ const Bing: FC = () => { - + {codeTime > 0 ? `${codeTime}` : '获取验证码'} + diff --git a/src/pages/home/components/curRecommended.tsx b/src/pages/home/components/curRecommended.tsx index bee851e..c10f24c 100644 --- a/src/pages/home/components/curRecommended.tsx +++ b/src/pages/home/components/curRecommended.tsx @@ -6,8 +6,8 @@ import styles from "../home.module.scss"; import VideoCover from "@/components/videoCover/videoCover"; import courseTag from '@/static/img/courseTag.png' import ArticlesBox from "@/components/articlesBox/articlesBox"; -import arrowRight from '@/static/img/arrow-right.png' import PageScript from "@/components/pageScript/pageScript"; +import IconFont from "@/components/IconFont"; const CurRecommended: FC = () => { const [page, setPage] = useState(1) @@ -16,10 +16,11 @@ const CurRecommended: FC = () => { const [articles, setArticles] = useState([]) async function getData() { - const res = await HomeApi.course(page, 4) + + const res = await HomeApi.home() setArticles(res.articles) - setTotal(res.course.total) - const newData = res.course.data?.reduce((pre, cut) => { + setTotal(res.courses.total) + const newData = res.courses.data?.reduce((pre, cut) => { const index = pre.findIndex(d => d.id === cut.id) if (index === -1) { pre.push(cut) @@ -47,14 +48,14 @@ const CurRecommended: FC = () => { if (articles.length > 0) { examines = ( - + 推荐文章 - + 查看更多 - + - {articles.map(d => )} + {articles.map(d => )} ) } diff --git a/src/pages/home/components/feature.tsx b/src/pages/home/components/feature.tsx index 9f09acb..3881eb7 100644 --- a/src/pages/home/components/feature.tsx +++ b/src/pages/home/components/feature.tsx @@ -22,7 +22,7 @@ const Feature: FC = () => { return ( { - list.map(d => jump(d.url)}> + list.map(d => jump(d.url)}> {d.text} ) diff --git a/src/pages/home/components/feature_recommended.tsx b/src/pages/home/components/feature_recommended.tsx index b7218f1..32d2110 100644 --- a/src/pages/home/components/feature_recommended.tsx +++ b/src/pages/home/components/feature_recommended.tsx @@ -73,7 +73,7 @@ const FeatureRecommended: FC = (props) => { return props.brand.map(d => ({ id: d.id, title: d.name, - imageUrl: d.brand_album, + imageUrl: d.brand_album?.split(',')[0] ?? d.logo, description: d.graphic_introduction, path: `?id=${d.id}`, })) @@ -117,7 +117,7 @@ const FeatureRecommended: FC = (props) => { try { return props.illness.map(d => ({ id: d.id, - imageUrl: '', + imageUrl: d.album?.split(',')[0] ?? '', description: d.description || '暂无简介', title: d.name, path: `?id=${d.id}` @@ -143,36 +143,56 @@ const FeatureRecommended: FC = (props) => { Taro.navigateTo({url}) } - return ( - - + + + const keys: string[] = [] + const items = data.filter(d => d.data.length === 3).map(d => { + keys.push(d.url) + return ( + <> + jump(d.url, d)} src={d.titleUrl}/> { - data.filter(d => d.data.length === 3).map(d => - jump(d.url, d)} src={d.titleUrl}/> - { - d.data.length > 0 && d.data.map((c, index) => jump(d.detailsUrl + c.path, d)}> - - - - - - - - {c.title} - {c.description} - - ) - } - ) + d.data.length > 0 && d.data.map((c, index) => jump(d.detailsUrl + c.path, d)}> + + + + + + + + {c.title} + {c.description} + + ) } - + + ) + }) + // 没有top3 + if (keys.length === 0) { + return null + } + // 至少2个top3 + if (keys.length > 1) { + return ( + + + {items.map((d, i) => ({d}))} + + + ) + } + // 只有一个top3 + return ( + + {items[0]} ) } diff --git a/src/pages/home/home.tsx b/src/pages/home/home.tsx index 9134c27..dc00b96 100644 --- a/src/pages/home/home.tsx +++ b/src/pages/home/home.tsx @@ -12,7 +12,6 @@ import {HomeApi, HomeData} from "@/api"; import logo from '@/static/img/logo.svg' import Spin from "@/components/spinner"; import NavigationBar from "@/components/navigationBar/navigationBar"; -import {Search} from "@/pages/home/components/search"; const Home: FC = () => { const globalData = Taro.getApp().globalData @@ -51,8 +50,8 @@ const Home: FC = () => { cancelBack leftNode={ <> - - 信桂 + + 信桂 } > @@ -61,7 +60,7 @@ const Home: FC = () => { - + {/**/} = ({categoryKey, setCategoryKey}) => { async function getData() { try { - const res = await publicApi.course({page: page, pageSize: 10}) + const res = await publicApi.newCourse({page: page, page_size: 10}) const old: Courses = JSON.parse(JSON.stringify(data)) setData({ - is_required: screen(old.is_required, res.course.is_required || []), - is_not_required: screen(old.is_not_required, res.course.is_not_required || []), + is_required: screen(old.is_required, res.company_courses || []), + is_not_required: screen(old.is_not_required, res.platform_courses || []), }) } catch (e) { } @@ -114,7 +114,7 @@ export const VideoList: FC = ({categoryKey, setCategoryKey}) => { !token && key === 'is_required' ? : value?.length ? <> - + { value?.map(c => { } - backgroundColor={'transparent'} /> { } const AuditMode: FC = () => { - const [auditMode, setAuditMode] = useState(false) + const [auditMode, setAuditMode] = useState(true) const [articles, setArticles] = useState([]) const [enable, setEnable] = useState(true) useEffect(() => { @@ -54,10 +53,10 @@ const AuditMode: FC = () => { { auditMode ? <> - + 文章列表} /> { - articles.map(d => ) + articles.map(d => ) } diff --git a/src/pages/login/login.module.scss b/src/pages/login/login.module.scss index b568542..097a82d 100644 --- a/src/pages/login/login.module.scss +++ b/src/pages/login/login.module.scss @@ -25,7 +25,7 @@ .brand { width: 140px; - margin: 250px auto 145px; + margin: 70px auto 100px; image { overflow: hidden; @@ -44,7 +44,7 @@ .errorTips { position: fixed; - top: 10%; + top: 0; left: 24px; right: 24px; background: red; @@ -52,7 +52,7 @@ padding: 24px; border-radius: 20px; display: flex; - align-items: center; + align-items: baseline; } .bing { diff --git a/src/pages/login/login.tsx b/src/pages/login/login.tsx index c626eba..f3a25a1 100644 --- a/src/pages/login/login.tsx +++ b/src/pages/login/login.tsx @@ -1,19 +1,20 @@ import {FC, useEffect, useState} from "react"; import {Profile} from "@/store"; -import {Image, Text, View} from "@tarojs/components"; +import {Image, Radio, Text, View} from "@tarojs/components"; import Taro from "@tarojs/taro"; import styles from './login.module.scss' -import Icon from "@/components/icon"; import {userApi} from "@/api"; import {loginApi, LoginParams} from "@/api/login"; import MyButton from "@/components/button/MyButton"; +import logo from '@/static/img/logo.svg' +import IconFont from "@/components/IconFont"; const Login: FC = () => { const [isLoading, setLoading] = useState(false) - const [error, setError] = useState(null) const {setUser, setToken, setCompany, empty} = Profile.useContainer() const [h5params, setH5Params] = useState(null) + const [check, setCheck] = useState(false) useEffect(() => { empty(false) @@ -30,9 +31,21 @@ const Login: FC = () => { } }, []) + function setError(msg: any){ + if(msg) { + Taro.showToast({ + title:msg, + icon:'none' + }) + } + } function login() { if (isLoading) return; + if (!check) { + setError('请阅读并同意《用户协议》及《隐私政策》!') + return; + } if (h5params == null && process.env.TARO_ENV === 'h5') { setError('页面参数错误,请刷新页面!') return; @@ -62,7 +75,7 @@ const Login: FC = () => { }) } else { Taro.setStorageSync('openid', catch_key) - Taro.reLaunch({url: '/pages/check/check'}) + Taro.navigateTo({url: '/pages/check/check'}) } } catch (e) { } @@ -85,20 +98,60 @@ const Login: FC = () => { return ( - - 医学道 + + 信桂 - - 请完成微信授权以继续使用! + + + + 只有与我司签署了 + 战略合作 + 的客户才能够完成登录。 + { + Taro.navigateTo({ + url:`/pages/preview/webView/webView?url=${process.env.TARO_APP_API}/QA/zhanluehezuo.html` + }) + }} className="text-success" style={{textDecoration:'underline'}}>了解战略合作 + + - 微信授权登录 - {error ? - {error} - setError(null)}/> - : null} + {/**/} + {/* 请完成微信授权以继续使用!*/} + {/**/} + 授权登录 + + {/*{error ? */} + {/* */} + {/* */} + {/* {error}*/} + {/**/} + {/* setError(null)}>*/} + {/* */} + {/* */} + {/* : null}*/} + + setCheck(!check) }> + 阅读并同意 + { + Taro.navigateTo({ + url:`/pages/preview/webView/webView?url=${process.env.TARO_APP_API}/yonghuxieyi.html` + }) + }}>《用户协议》 + + { + Taro.navigateTo({ + url:`/pages/preview/webView/webView?url=${process.env.TARO_APP_API}/yinsizhengce.html` + }) + }}>《隐私政策》 + {/*{process.env.TARO_APP_LGOIN === 'true' && 线下登录}*/} + + 蜀ICP备20015955号-4X ) } diff --git a/src/pages/manage/addStudent/addStudent.scss b/src/pages/manage/addStudent/addStudent.scss index 880b002..01ffd9a 100644 --- a/src/pages/manage/addStudent/addStudent.scss +++ b/src/pages/manage/addStudent/addStudent.scss @@ -10,7 +10,8 @@ } .add { - position: fixed; + //position: fixed; width: 710rpx; - margin-top: 10px; + margin-top: 30px; + border: none !important; } diff --git a/src/pages/manage/courseAdmin/components/search.tsx b/src/pages/manage/courseAdmin/components/search.tsx index eaed0c0..7dbaf38 100644 --- a/src/pages/manage/courseAdmin/components/search.tsx +++ b/src/pages/manage/courseAdmin/components/search.tsx @@ -1,5 +1,5 @@ import {FC, useCallback, useEffect, useState} from "react"; -import {Image, Input, Radio, View} from "@tarojs/components"; +import {Image, Input, Radio, Text, View} from "@tarojs/components"; import styles from "../courseAdmin.module.scss"; import Icon from "@/components/icon"; import {CourseAllParam, curriculum} from "@/api"; @@ -94,18 +94,25 @@ export const Search: FC = ({param, setParam, total, setBatch}) => { setShow(true)} className={styles.select}> - 选择部门 + { + param.dep_id > 0 ? + + {deps.find(d => d.id === param.dep_id)?.name} + + : + 选择部门 + } - { - param.dep_id > 0 - && - {deps.find(d => d.id === param.dep_id)?.name} - - - } + {/*{*/} + {/* param.dep_id > 0*/} + {/* && */} + {/* {deps.find(d => d.id === param.dep_id)?.name}*/} + {/* */} + {/* */} + {/*}*/} diff --git a/src/pages/manage/courseAdmin/courseAdmin.module.scss b/src/pages/manage/courseAdmin/courseAdmin.module.scss index 2caca7c..2120a18 100644 --- a/src/pages/manage/courseAdmin/courseAdmin.module.scss +++ b/src/pages/manage/courseAdmin/courseAdmin.module.scss @@ -8,6 +8,8 @@ page { position: sticky; top: 0; border-bottom: 1px solid #F5F8F7; + z-index: 2; + background-color: #fff; } .searchInput { @@ -58,12 +60,15 @@ page { display: flex; justify-content: space-between; align-items: center; + z-index: 1; } .curTitle { padding: 30rpx; display: flex; border-bottom: 1px solid #F5F8F7; + flex:1; + box-sizing: border-box; } .curImage { diff --git a/src/pages/manage/courseAdmin/courseAdmin.tsx b/src/pages/manage/courseAdmin/courseAdmin.tsx index 44e308a..d81175c 100644 --- a/src/pages/manage/courseAdmin/courseAdmin.tsx +++ b/src/pages/manage/courseAdmin/courseAdmin.tsx @@ -190,9 +190,9 @@ const CourseAdmin: FC = () => { 共{d.class_hour}节 - + {d.title} - {d.short_desc} + {d.short_desc} { + const params = Taro.getCurrentInstance().router?.params as { id: string | undefined } + const [manages, setManages] = useState([]) + const [start, setStart] = useState(formatDate(new Date(new Date().getTime() + 24 * 60 * 60 * 1000), "YY-MM-dd 08:00")) + const [end, setEnd] = useState(formatDate(new Date(new Date().getTime() + 24 * 60 * 60 * 1000), "YY-MM-dd 18:00")) + const [depid, setDepid] = useState(null) + const [imgUrl, setImgUrl] = useState('') + const [name, setName] = useState('') + const [loading, setLoading] = useState(false) + const [status, setStatus] = useState(0) // 状态 + const [id, setId] = useState(params.id ? Number(params.id) : undefined) + const {company} = Profile.useContainer() + + function setData(res: Meeting | null) { + /** + * params.id 查看详情请求 + * 当onShow的时候 id === res.id 数据相同不进行以下流程 + */ + if (params.id || id !== res?.id) { + setImgUrl('') + setDepid(res?.dep_id || null) + setName(res?.name || '') + setStatus(res?.status || 0) + setId(res?.id || 0) + + if (res) { + setEnd(formatDate(new Date(res.estimate_end_time), "YY-MM-dd hh:mm")) + setStart(formatDate(new Date(res.estimate_start_time), "YY-MM-dd hh:mm")) + } + } + setLoading(false) + } + + useEffect(() => { + curriculum.department().then(res => { + setManages(res.data) + }) + }, []) + + Taro.useDidShow(() => { + if (params.id != undefined) { + meetingAPi.setMeeting(params.id).then(setData) + } + }) + + const depChange = useCallback((e) => { + setDepid(manages[Number(e.detail.value)]?.id) + }, [manages]) + + const change_start = useCallback((time: string) => { + const mil = new Date(time).getTime() + const endMil = new Date(end).getTime() + if (mil > endMil) { + Taro.showToast({title: '大于结束时间', icon: 'error'}) + } else { + setStart(time) + } + }, [end]) + + const change_end = useCallback((time: string) => { + const mil = new Date(time).getTime() + const startMil = new Date(start).getTime() + if (mil < startMil) { + Taro.showToast({title: '小于开始时间', icon: 'error'}) + } else { + setEnd(time) + } + }, [start]) + + + + + + const submit = useCallback(async (e) => { + if (loading && status === 2) return; + + + + const values: Meeting = e.detail.value + if (!values.name) { + Taro.showToast({title: '请填写会议名称', icon: 'error'}) + return + } + + setLoading(true) + try { + let req = meetingAPi.setMeetings + if(!params.id){ + req = meetingAPi.addMeetings + } + await req({ + ...values, + estimate_end_time: new Date(end).getTime(), + estimate_start_time: new Date(start).getTime(), + dep_id: depid, + company_id: company?.id!, + id: parseInt(params.id!), + }) + setLoading(false) + Taro.eventCenter.trigger('updateMeetingList') + Taro.showToast({title: '操作成功', icon: 'success',mask:true}) + Taro.navigateBack() + } catch (e) { + setLoading(false) + } + }, [imgUrl, depid, end, start]) + + + + + + + + + + return ( + + + + + + + + + + 0} + maxlength={11} + placeholder='请输入会议标题' + onInput={(e) => setName(e.detail.value)} + />} + /> + + change_start(time)} + > + + + + + change_end(time)} + > + + + + + x.id == depid)?.name}/> + + + + {params.id ? '保存':'新建'} + + + + + + + + ) +} + +export default MeetingForm diff --git a/src/pages/manage/meetings/list.config.ts b/src/pages/manage/meetings/list.config.ts new file mode 100644 index 0000000..9e9c957 --- /dev/null +++ b/src/pages/manage/meetings/list.config.ts @@ -0,0 +1,4 @@ +export default definePageConfig({ + navigationBarTitleText: '现场会', + onReachBottomDistance: 30 +}) diff --git a/src/pages/manage/meetings/list.module.scss b/src/pages/manage/meetings/list.module.scss new file mode 100644 index 0000000..08eada3 --- /dev/null +++ b/src/pages/manage/meetings/list.module.scss @@ -0,0 +1,11 @@ +.meeting { + margin-bottom: 20rpx; + border-radius: 16rpx; + padding: 30rpx 24rpx; + box-sizing: border-box; + background-color: #fff; + position: relative; + height: 138rpx; +} + + diff --git a/src/pages/manage/meetings/meetings.module.scss b/src/pages/manage/meetings/meetings.module.scss index 075fb8b..672594b 100644 --- a/src/pages/manage/meetings/meetings.module.scss +++ b/src/pages/manage/meetings/meetings.module.scss @@ -1,43 +1,23 @@ +page{ + width: 100%; +} .meeting { - display: flex; - justify-content: space-between; - margin-bottom: 20rpx; + padding: 30rpx 24rpx; + background: #FFFFFF; + width: 710rpx; + box-sizing: border-box; + position: relative; } .title { - position: relative; - flex: 1; - width: 70%; - background: #fff; - padding: 20rpx; - border-radius: 10rpx; - overflow: hidden; - box-sizing: border-box; + font-size: 32rpx; + font-weight: bold; + color: #606563; + margin-bottom: 20rpx; } - - -.overdue { - position: absolute; - top: 0; - bottom: 0; - right: 0; - left: 0; - text-align: center; - color: #fff; - display: flex; - justify-content: center; - align-items: center; - background: rgba(#000, .8); +.time{ + font-size: 24rpx; + font-weight: 500; + color: #606563; } - -.del { - border-radius: 10rpx; - background: #FF3A2F; - display: flex; - align-items: center; - color: #fff; - width: 100rpx; - justify-content: center; - margin-left: 20rpx; -} diff --git a/src/pages/manage/meetings/meetings.tsx b/src/pages/manage/meetings/meetings.tsx index bbd5b0d..2c2e2ab 100644 --- a/src/pages/manage/meetings/meetings.tsx +++ b/src/pages/manage/meetings/meetings.tsx @@ -1,19 +1,24 @@ import {FC, useCallback, useEffect, useState} from "react"; -import {View} from "@tarojs/components"; +import {Image, Text, View} from "@tarojs/components"; import {Meeting, meetingAPi} from "@/api"; import styles from './meetings.module.scss' import Taro, {useReachBottom} from "@tarojs/taro"; import Empty from "@/components/empty/empty"; import {formatDate} from "@/utils/time"; +import {AtList, AtSwipeAction} from "taro-ui"; +import meetingEnd from "@/static/img/meetingEnd.png" +import Spin from "@/components/spinner"; const MeetingsConfig: FC = () => { const [page, setPage] = useState(1) const [meeting, setMeeting] = useState([]) const [total, setTotal] = useState(0) + const [curIndex, setCurIndex] = useState() + const [enable, setEnable] = useState(true) const getData = useCallback(async () => { try { - const res = await meetingAPi.setList(1, 10) + const res = await meetingAPi.setList(page, 10) setTotal(res.total) setMeeting([ ...(meeting || []), @@ -21,12 +26,14 @@ const MeetingsConfig: FC = () => { ]) } catch (e) { } + + setTimeout(()=>{setEnable(false)},500) }, [page]) function del(id: number, index: number) { try { Taro.showModal({ - title: '确定删除', + title: `确定删除 ${meeting[index].name}`, async success({confirm}) { if (confirm) { await meetingAPi.del(id) @@ -34,6 +41,9 @@ const MeetingsConfig: FC = () => { const oldMeeting: Meeting[] = JSON.parse(JSON.stringify(meeting)) oldMeeting.splice(index, 1) setMeeting(oldMeeting) + setCurIndex(undefined) + }else{ + setCurIndex(undefined) } } }) @@ -41,13 +51,6 @@ const MeetingsConfig: FC = () => { } } - function jumpInfo(item: Meeting) { - if (Date.now() > item.estimate_end_time || item.status > 0) { - return - } - Taro.navigateTo({url: `/pages/manage/spotMeeting/spotMeeting?id=${item.id}`}) - } - useReachBottom(useCallback(() => { if (meeting?.length < total) { setPage(page + 1) @@ -58,26 +61,48 @@ const MeetingsConfig: FC = () => { getData() }, [page]) + async function handleClick(id : number,index: number){ + await del(id,index) + } + + function onOpened(index: number){ + setCurIndex(index) + } + return ( - + <> + + { meeting.length ? - meeting.map((d, index) => - jumpInfo(d)}> - {d.name} - {formatDate(new Date(d.estimate_start_time), "MM-dd")} 至 {formatDate(new Date(d.estimate_start_time), "MM-dd")} - { - (Date.now() > d.estimate_end_time || d.status > 1) && - {d.status > 1 ? '已结束' : "已过期"} + + {meeting.map((d,index) => ( + {handleClick(d.id,index)}} + isOpened={curIndex === index} + onOpened={() => {onOpened(index)}} + options={[{text: '删除',style: {backgroundColor: '#FF4949'},}]} + > + + + + + + {d.name} + {formatDate(new Date(d.estimate_start_time), "MM-dd")} 至 {formatDate(new Date(d.estimate_start_time), "MM-dd")} + - } - - del(d.id, index)}>删除 - ) + + ))} + + : } + ) } diff --git a/src/pages/manage/spotMeeting/spotMeeting.module.scss b/src/pages/manage/spotMeeting/spotMeeting.module.scss index 08f015a..7fb5d41 100644 --- a/src/pages/manage/spotMeeting/spotMeeting.module.scss +++ b/src/pages/manage/spotMeeting/spotMeeting.module.scss @@ -83,11 +83,25 @@ .button { margin: 30rpx auto; + color: #fff; box-shadow: 0 0 10rpx rgba(#00d6ac, .5); } - .buttonDel { + background-color: rgba(255,255,255,0.1) !important; + margin: 30rpx auto; +} + +.buttonEnd{ color: #fff; margin: 30rpx auto; - box-shadow: 0 0 10rpx rgba(#c94f4f, .5); + box-shadow: 0 0 10rpx rgba(#00d6ac, .5); +} +.tips{ + background-color: rgba(#00d6ac, 0.1); + margin: 0 -20rpx; + line-height: 2.5; + font-size: 26rpx; + display: flex; + justify-content: center; + align-items: center; } diff --git a/src/pages/manage/spotMeeting/spotMeeting.tsx b/src/pages/manage/spotMeeting/spotMeeting.tsx index 788ab85..bba47a9 100644 --- a/src/pages/manage/spotMeeting/spotMeeting.tsx +++ b/src/pages/manage/spotMeeting/spotMeeting.tsx @@ -1,32 +1,25 @@ -import {FC, useCallback, useEffect, useState} from "react"; -import {Form, Image, Input, Picker, View} from "@tarojs/components"; +import {FC, useCallback, useState} from "react"; +import {Image, View, Text} from "@tarojs/components"; import Taro, {getSetting, authorize} from "@tarojs/taro"; -import {curriculum, Meeting, meetingAPi} from "@/api"; +import { Meeting, meetingAPi} from "@/api"; import {formatDate} from "@/utils/time"; -import PopPut from "@/components/popPut/popPut"; import MyButton from "@/components/button/MyButton"; import styles from './spotMeeting.module.scss' -import code from '@/static/img/code.png' import Icon from "@/components/icon"; -import failure from "@/static/img/failure.png" -import {Profile} from "@/store"; -import DateTimePicker from "@/components/dateTimePicker/dateTimePicker"; - +import IconFont from "@/components/IconFont"; +import CodeImg from "@/static/img/code.png" +import Spin from "@/components/spinner"; const SpotMeeting: FC = () => { const path = encodeURIComponent("/pages/meeting/meeting") const params = Taro.getCurrentInstance().router?.params as { id: string | undefined } - const [manages, setManages] = useState([]) - const [start, setStart] = useState(formatDate(new Date(new Date().getTime() + 24 * 60 * 60 * 1000), "YY-MM-dd 08:00")) - const [end, setEnd] = useState(formatDate(new Date(new Date().getTime() + 24 * 60 * 60 * 1000), "YY-MM-dd 18:00")) - const [depid, setDepid] = useState(null) - const [imgUrl, setImgUrl] = useState('') + const [start, setStart] = useState(formatDate(new Date(new Date().getTime() + 24 * 60 * 60 * 1000), "MM-dd 08:00")) + const [end, setEnd] = useState(formatDate(new Date(new Date().getTime() + 24 * 60 * 60 * 1000), "MM-dd 18:00")) + const [imgUrl, setImgUrl] = useState(CodeImg) const [name, setName] = useState('') - const [description, setDescription] = useState('') - const [loading, setLoading] = useState(false) const [status, setStatus] = useState(0) // 状态 const [id, setId] = useState(params.id ? Number(params.id) : undefined) const pathUrl = process.env.TARO_ENV === 'h5' ? '/official/qrcode' : '/wechat/link' - const {company} = Profile.useContainer() + const [downStatus, setDownStatus] = useState<1|2|3>(1) function setData(res: Meeting | null) { /** @@ -35,63 +28,35 @@ const SpotMeeting: FC = () => { */ if (params.id || id !== res?.id) { setImgUrl('') - setDepid(res?.dep_id || null) setName(res?.name || '') - setDescription(res?.description || '') setStatus(res?.status || 0) setId(res?.id || 0) if (res) { - downUrl(res.id, false) - setEnd(formatDate(new Date(res.estimate_end_time), "YY-MM-dd 18:00")) - setStart(formatDate(new Date(res.estimate_start_time), "YY-MM-dd 08:00")) + downUrl(res.id) + setEnd(formatDate(new Date(res.estimate_end_time), "MM-dd hh:mm")) + setStart(formatDate(new Date(res.estimate_start_time), "MM-dd hh:mm")) } - } else { - setLoading(false) } } - useEffect(() => { - curriculum.department().then(res => { - setManages(res.data) - }) - }, []) - - Taro.useDidShow(() => { - setLoading(true) + Taro.useLoad(() => { if (params.id != undefined) { meetingAPi.setMeeting(params.id).then(setData) - } else { - meetingAPi.exists().then(setData) } - }) - const depChange = useCallback((e) => { - setDepid(manages[Number(e.detail.value)]?.id) - }, [manages]) - - const change_start = useCallback((time: string) => { - const mil = new Date(time).getTime() - const endMil = new Date(end).getTime() - if (mil > endMil) { - Taro.showToast({title: '大于结束时间', icon: 'error'}) - } else { - setStart(time) - } - }, [end]) + Taro.eventCenter.on('UPDATE', () => { + meetingAPi.setMeeting(params.id!).then(setData) + }) + }) - const change_end = useCallback((time: string) => { - const mil = new Date(time).getTime() - const startMil = new Date(start).getTime() - if (mil < startMil) { - Taro.showToast({title: '小于开始时间', icon: 'error'}) - } else { - setEnd(time) - } - }, [start]) + Taro.useUnload(() => { + Taro.eventCenter.off('UPDATE') + }) /** 下载二维码 */ const handleWriteFile = useCallback(() => { + console.log({imgUrl},'imgUrl') if (imgUrl == null) { Taro.showToast({title: '下载失败', icon: 'error'}) return @@ -101,7 +66,8 @@ const SpotMeeting: FC = () => { success() { Taro.showModal({title: '下载成功'}) }, - fail() { + fail(err) { + console.log(err,'err') Taro.showToast({title: '下载失败', icon: 'error'}) } }) @@ -109,6 +75,10 @@ const SpotMeeting: FC = () => { /** 查看保存权限 */ const handleSaveCode = useCallback(() => { + if( status === 2) { + Taro.showToast({title: '会议已结束,无法下载', icon: 'none'}) + return + } if (process.env.TARO_ENV !== 'h5') { getSetting({ success: function ({authSetting}) { @@ -135,70 +105,46 @@ const SpotMeeting: FC = () => { }, [imgUrl]); /** 获取二维码地址 */ - const downUrl = (id: number, down = true) => { - Taro.showLoading({title: '加载二维码'}) + const downUrl = (id: number,) => { + if(status === 2){ + setDownStatus(2) + return + } + // Taro.showLoading({title: '加载二维码'}) const url = process.env.TARO_APP_API + pathUrl + '?meeting_id=' + id + '&path=' + path + let fileName = new Date().valueOf(); + let filePath = Taro.env.USER_DATA_PATH + '/' + fileName + '.jpg' + console.log(filePath,'filePath') + + if (process.env.TARO_ENV !== 'h5') { Taro.downloadFile({ url, + filePath:filePath, success(res) { - setImgUrl(res.tempFilePath) - if (down) { - handleSaveCode() - } + console.log(res,'res') + setImgUrl(res.filePath) + setDownStatus(3) + }, fail() { - Taro.hideLoading() - Taro.showModal({title: '二维码生成失败'}) - setLoading(false) + setDownStatus(2) + // Taro.hideLoading() + // Taro.showModal({title: '二维码生成失败'}) } }) } else { setTimeout(() => { setImgUrl(url) }) - if (down) { - handleSaveCode() - } + } } - const submit = useCallback(async (e) => { - if (loading && status === 2) return; - if (imgUrl) { // 已有 - handleSaveCode() - return - } - const values: Meeting = e.detail.value - if (!values.name) { - Taro.showToast({title: '请填写会议名称', icon: 'error'}) - return - } - - setLoading(true) - try { - const res = await meetingAPi.setMeetings({ - ...values, - estimate_end_time: new Date(end).getTime(), - estimate_start_time: new Date(start).getTime(), - dep_id: depid, - company_id: company?.id! - }) - downUrl(res.id) - setStatus(0) - setId(res.id) - } catch (e) { - setLoading(false) - } - }, [imgUrl, depid, end, start]) - function imagLoad() { - Taro.hideLoading() - setLoading(false) - } /** 开始 */ async function onStart() { @@ -222,143 +168,98 @@ const SpotMeeting: FC = () => { } } - async function putMeeting() { - Taro.showLoading() - await meetingAPi.putMeeting(id!, { - name, - dep_id: depid, - company_id: company?.id!, - description, - estimate_end_time: new Date(end).getTime(), - estimate_start_time: new Date(start).getTime(), + async function onDel(){ + Taro.showModal({ + title:'友情提示', + content:'是否确认删除', + success: async (res) => { + if(res.confirm){ + try { + Taro.showLoading() + await meetingAPi.del(id!) + Taro.showToast({title: '删除成功', icon: 'none',mask: true}) + Taro.eventCenter.trigger('deleteMeeting', id) + Taro.navigateBack() + }catch (err){ + Taro.showToast({title: '删除失败,稍后重试', icon: 'none',mask: true}) + } finally { + Taro.hideLoading() + } + } + } }) - Taro.hideLoading() - Taro.showToast({title: '修改成功'}) - } + } return ( - 现场会 + + {name} + { + status === 0 && + { + Taro.navigateTo({ + url:`/pages/manage/meetings/form/form?id=${id}` + }) + }} /> + } + {process.env.TARO_ENV === 'h5' && 微信公众号,浏览器中请截图保存} + - { - imgUrl - ? */} + - : <> - 填完写完整信息 - - + { + downStatus < 3 && + + {downStatus === 1 && } + {downStatus === 2 && } + } - {status === 2 && } + {/*:*/} + {/**/} + {/* */} + {/**/} + {/*}*/} - - -
- 0} - placeholder='请输入会议标题' - onInput={(e) => setName(e.detail.value)} - />} - /> - - change_start(time)} - > - - - - - change_end(time)} - > - - - - - x.id == depid)?.name}/> - - - - { - id !== undefined && <> - { - status === 0 && - 开始 - - } - { - status === 1 && - 结束 - } - - } - - { - imgUrl && - 修改 - - } - - - - + {start} + + {end} + + + {/**/} + + 长按保存二维码到相册 + + + { + status === 0 && - {imgUrl ? "保存二维码" : "新建现场会"} + onClick={onStart}> + 开始 - + } + {status === 1 && 结束} - { - !params.id - && Taro.navigateTo({url: '/pages/manage/meetings/meetings'})}> - 历史列表 - - }
+ {status === 0 && 删除}
) } diff --git a/src/pages/my/components/header/header.tsx b/src/pages/my/components/header/header.tsx index a06e480..d3bbc03 100644 --- a/src/pages/my/components/header/header.tsx +++ b/src/pages/my/components/header/header.tsx @@ -5,6 +5,7 @@ import avatar from "@/static/img/avatar.png" import blacktriang from "@/static/img/blacktriangle.png" import {FC, useMemo} from "react"; import Img from "@/components/image/image"; +import Taro from "@tarojs/taro"; interface Props { companyList: Company[] @@ -20,8 +21,12 @@ const Header: FC = ({companyList, showCompany}) => { return ( + { + token && Taro.navigateTo({url:'/pages/business/userInfo/userInfo'}) + }}> - + + {token ? user?.name ?? '匿名' : '请登录'} {token ? company?.name : '登录解锁更多功能哦'} diff --git a/src/pages/my/components/header/service.tsx b/src/pages/my/components/header/service.tsx index 4909f95..115d53d 100644 --- a/src/pages/my/components/header/service.tsx +++ b/src/pages/my/components/header/service.tsx @@ -36,7 +36,7 @@ const Service = () => { if ([1, 2].includes(user?.role_type || 0)) { setList([ {title: '部门管理', src: dep, router: '/pages/manage/depAdmin/depAdmin'}, - {title: '现场会', src: spotMeeting, router: '/pages/manage/spotMeeting/spotMeeting'}, + {title: '现场会', src: spotMeeting, router: '/pages/manage/meetings/list'}, {title: '课程管理', src: course, router: '/pages/manage/courseAdmin/courseAdmin'}, {title: '个人中心', src: userInfo, router: '/pages/business/userInfo/userInfo'}, {title: '历史记录', src: cur, router: '/pages/business/history/history'}, diff --git a/src/pages/my/my.tsx b/src/pages/my/my.tsx index 0767148..283418a 100644 --- a/src/pages/my/my.tsx +++ b/src/pages/my/my.tsx @@ -81,10 +81,9 @@ const My: FC = () => { backgroundColor={`rgba(255,255,255,${Number(navbarOpacity) * .9})`} cancelBack leftNode={ - .5 ? "0%" : '-350%'})`}}> - + .5 ? "0%" : '-350%'})`}}> + {token ? user?.name : '请登录'} }/> @@ -137,7 +136,7 @@ const My: FC = () => { { companyList.length >= 1 && companyList.map((d, idx) => - { if (company?.id === d.id) return; Taro.showLoading({ @@ -170,6 +169,9 @@ const My: FC = () => { + + 蜀ICP备20015955号-4X + ) diff --git a/src/pages/preview/brand/article/article.tsx b/src/pages/preview/brand/article/article.tsx index aa07995..1d1831c 100644 --- a/src/pages/preview/brand/article/article.tsx +++ b/src/pages/preview/brand/article/article.tsx @@ -1,5 +1,5 @@ -import {FC, useCallback, useEffect, useMemo, useState} from "react"; -import {Image, PageContainer, Text, View} from "@tarojs/components"; +import {FC, useCallback, useEffect, useMemo, useRef, useState} from "react"; +import {Image, PageContainer, ScrollView, Text, View} from "@tarojs/components"; import Taro, {useRouter} from "@tarojs/taro"; import {ArticleRecord, brandApi, HomeApi} from "@/api"; import styles from "./article.module.scss"; @@ -27,6 +27,24 @@ const article: FC = () => { const query = Taro.createSelectorQuery() const [maoId, setMaoId] = useState('') const [timing, setTiming] = useState(undefined) + const headingTop = useRef<{ id: string; top: number }[]>([]) + + + + useEffect(() => { + if(headings.length){ + if(headingTop.current?.[0]?.top){ + return + } + headings.forEach(item => { + query.select(`#${item.id}`).boundingClientRect().exec((res) => { + if(res.length === headings.length && res?.[0]?.top){ + headingTop.current = res + } + }) + }) + } + },[headings]) useEffect(() => { @@ -50,18 +68,20 @@ const article: FC = () => { function mao(id: string) { setMaoId(id) setShow(false) - Taro.nextTick(() => { - query.select(`#${id}`).boundingClientRect() - query.exec((res) => { - if (res.length) { - Taro.pageScrollTo({ - scrollTop: res[res.length - 1].top, - duration: 300 - } - ) - } + Taro.nextTick(() => { + console.log(headingTop.current,'headingTop.cur') + + query.select(`#${id}`).boundingClientRect() + query.exec((res) => { + if (res.length) { + Taro.pageScrollTo({ + scrollTop: headingTop.current.find(d => d.id === id)?.top ?? 0, + duration: 300 + } + ) + } + }) }) - }) } const onCollect = (v: boolean | undefined) => { @@ -88,7 +108,7 @@ const article: FC = () => { }) articlesEvent.recordsAdd({id: Number(id), view: (data?.page_view || 0) + 1}) }) - }, 3000)) + }, 2000)) Taro.setNavigationBarTitle({title: data.title}) if (data.content.length < 200) { @@ -167,7 +187,7 @@ const article: FC = () => { - {d?.name} + {d.name} {beforeTime(articleInfo?.created_at)} . 阅读 {articleInfo.page_view || 0} @@ -226,22 +246,25 @@ const article: FC = () => { 目录 - - { - headings.length > 0 && headings.map((d) => mao(d.id)}> - {d.text} - - ) - } - + + + { + headings.length > 0 && headings.map((d) => mao(d.id)}> + {d.text} + + ) + } + + diff --git a/src/pages/preview/brand/list/list.tsx b/src/pages/preview/brand/list/list.tsx index 457982d..5d2ea4b 100644 --- a/src/pages/preview/brand/list/list.tsx +++ b/src/pages/preview/brand/list/list.tsx @@ -48,7 +48,7 @@ const BrandItem: FC<{ data: BrandRecord; onClick: VoidFunction }> = ({data, onCl {data.name} - {beforeTime(data.created_at)} + {beforeTime(data.last_publish_time)} 文章 {data.article_count || 0} diff --git a/src/pages/preview/collect/collect.tsx b/src/pages/preview/collect/collect.tsx index fe96750..98f6667 100644 --- a/src/pages/preview/collect/collect.tsx +++ b/src/pages/preview/collect/collect.tsx @@ -28,6 +28,7 @@ const Profession = () => { */ async function getData(more = false) { if (!categoryId) return; + if (!more && data.get(categoryId)) return; const oldData = new Map(data) const categoryData = oldData.get(categoryId) const page = more ? (categoryData?.page || 0) + 1 : categoryData?.page || 1 @@ -38,7 +39,9 @@ const Profession = () => { } try { + setEnable(true) const data = await userApi.collectList(categoryId!, page, 10) + setEnable(false) // const dataList = data.list.reduce((pre, cur) => { // const index = pre.findIndex(d => d.id === cur.id) // if (index === -1) { @@ -73,18 +76,18 @@ const Profession = () => { }, [data])) useEffect(() => { + console.log(categoryId,'categoryId') categoryId && getData() }, [categoryId]) async function getCategory() { - try { + const res = [{name: '视频', id: 2}, {name: '文章', id: 1}, {name: '课程', id: 3}, {name: '其他', id: 4}] const newTabs = res.map(d => ({title: d.name, value: d.id})) setTabs(newTabs) setCategoryId(newTabs[0].value as number) - } catch (e) { - } - setEnable(false) + // setEnable(false) + } function tabsChange(tab: OnChangOpt) { @@ -112,6 +115,9 @@ const Profession = () => { Taro.useLoad(getCategory) function KillList(data: KillData): JSX.Element { + if(enable){ + return + } if (!data?.data?.length) { return } @@ -130,6 +136,7 @@ const Profession = () => { {d.brand.name} {d.brand.graphic_introduction || '暂无品牌简介'} + {/*{beforeTime(d.created_at)}*/} } @@ -177,7 +184,7 @@ const Profession = () => { return ( <> - + {/**/} diff --git a/src/pages/preview/health/health.tsx b/src/pages/preview/health/health.tsx index 7d0ee4f..de4417f 100644 --- a/src/pages/preview/health/health.tsx +++ b/src/pages/preview/health/health.tsx @@ -43,11 +43,11 @@ const Health: FC = () => { { data.length > 0 ? <> - {data.map(d => )} + {data.map(d => )} - : + : getData(1)} name='暂无数据'/> } diff --git a/src/pages/preview/illness/sort/sort.tsx b/src/pages/preview/illness/sort/sort.tsx index 7ed3168..96dd257 100644 --- a/src/pages/preview/illness/sort/sort.tsx +++ b/src/pages/preview/illness/sort/sort.tsx @@ -100,7 +100,7 @@ const Sort: FC = () => { ) } - : + : } ) diff --git a/src/pages/preview/profession/profession.tsx b/src/pages/preview/profession/profession.tsx index 06558cc..d7ea21f 100644 --- a/src/pages/preview/profession/profession.tsx +++ b/src/pages/preview/profession/profession.tsx @@ -108,6 +108,11 @@ const Profession = () => { ) } + if(!tabs.length){ + return ( + + ) + } return ( <> diff --git a/src/pages/preview/search/search/index.tsx b/src/pages/preview/search/search/index.tsx index a2138c6..b6e87bd 100644 --- a/src/pages/preview/search/search/index.tsx +++ b/src/pages/preview/search/search/index.tsx @@ -55,14 +55,15 @@ const Search: FC = () => { setValue('') setShow(false) setFocus(false) + Taro.navigateBack() } const searchStyles = useMemo((): React.CSSProperties | undefined => { if (focus || show) { return { - transform: "translateY(-43px)", - width: "70%", + // transform: "translateY(-43px)", + // width: "100%", } } }, [focus, show]) @@ -70,7 +71,7 @@ const Search: FC = () => { return ( - + @@ -86,7 +87,8 @@ const Search: FC = () => { onConfirm={searchInput}/> - {focus || show ? 取消 : null} + 取消 + {/*{focus || show ? 取消 : null}*/} diff --git a/src/pages/preview/videoFull/videoFull.module.scss b/src/pages/preview/videoFull/videoFull.module.scss index 35bf238..1d37ee6 100644 --- a/src/pages/preview/videoFull/videoFull.module.scss +++ b/src/pages/preview/videoFull/videoFull.module.scss @@ -19,12 +19,12 @@ page { position: fixed; z-index: 20; width: 100%; - color: #fff; - bottom: calc(env(safe-area-inset-bottom)); + color: #ffffff; + bottom: calc(200rpx + env(safe-area-inset-bottom)); padding: 0 30rpx; box-sizing: border-box; color: #FFFFFF; - transform: translateY(-200%); + //transform: translateY(-200%); } .title { diff --git a/src/pages/preview/videoFull/videoFull.tsx b/src/pages/preview/videoFull/videoFull.tsx index bf46878..62917e7 100644 --- a/src/pages/preview/videoFull/videoFull.tsx +++ b/src/pages/preview/videoFull/videoFull.tsx @@ -96,6 +96,7 @@ const VideoFull: FC = () => { onClick={click} controls autoplay + showBottomProgress='false' className={styles.video} src={data?.resource?.url} showCenterPlayBtn diff --git a/src/pages/preview/webView/webView.config.ts b/src/pages/preview/webView/webView.config.ts index 808161a..2a0a86b 100644 --- a/src/pages/preview/webView/webView.config.ts +++ b/src/pages/preview/webView/webView.config.ts @@ -1,4 +1,4 @@ export default definePageConfig({ - navigationBarTitleText: '链接', + navigationBarTitleText: '', onReachBottomDistance: 30 }) diff --git a/src/pages/preview/webView/webView.tsx b/src/pages/preview/webView/webView.tsx index 4c459ef..b43d0a0 100644 --- a/src/pages/preview/webView/webView.tsx +++ b/src/pages/preview/webView/webView.tsx @@ -1,9 +1,54 @@ -import {FC} from "react"; -import {WebView} from "@tarojs/components"; -import {useRouter} from "@tarojs/taro"; +import {FC, useState} from "react"; +import {Button, Text, View, WebView} from "@tarojs/components"; +import Taro, {useRouter} from "@tarojs/taro"; +import IconFont from "@/components/IconFont"; -const Web:FC = () => { +const Web: FC = () => { + const [hasError, showError] = useState(false) const {url} = useRouter().params as unknown as { url: string } - return + + const onError = () => { + showError(true) + Taro.hideNavigationBarLoading() + } + + const onRefresh = () => { + showError(false) + Taro.showNavigationBarLoading() + } + + Taro.useDidShow(() => { + Taro.showNavigationBarLoading() + }) + + if (hasError) { + return ( + + + 加载失败 + + + + + + + ) + } + + return ( + Taro.hideNavigationBarLoading()} + onError={onError} + /> + ) } + export default Web diff --git a/src/pages/search/components/list.module.scss b/src/pages/search/components/list.module.scss new file mode 100644 index 0000000..e435256 --- /dev/null +++ b/src/pages/search/components/list.module.scss @@ -0,0 +1,58 @@ +.box { + margin-left:30rpx; + margin-bottom: 24rpx; + width:690rpx; + display: flex; + margin-bottom: 20rpx; + background-color: #fff; + border-radius: 16rpx; + padding: 24rpx; + box-sizing: border-box; + position: relative; +} +.image{ + background-color: #ededed; + border-radius: 8rpx; +} +.play { + position: absolute; + z-index: 9999; + width: 50rpx !important; + height: 50rpx !important; + top: 99rpx; + left: 99rpx; + background: transparent !important; +} +.rightBox{ + padding-left: 24rpx; + box-sizing: border-box; + flex: 1; +} +.articleLeftBox{ + padding-right: 24rpx; + box-sizing: border-box; + flex: 1; +} +.videoRightBox{ + padding-left: 24rpx; + box-sizing: border-box; + flex: 1; +} +.courseRightBox{ + padding-left: 24rpx; + box-sizing: border-box; + flex: 1; +} +.desc{ + font-size: 24rpx; + font-weight: 500; + color: #909795; + line-height: 34rpx; + display: -webkit-box; + word-break: break-all; + text-overflow: ellipsis; + overflow: hidden; + -webkit-box-orient:vertical; + -webkit-line-clamp:2; +} + diff --git a/src/pages/search/components/list.tsx b/src/pages/search/components/list.tsx new file mode 100644 index 0000000..cfbb2c5 --- /dev/null +++ b/src/pages/search/components/list.tsx @@ -0,0 +1,167 @@ +import {FC, useCallback, useEffect, useState} from "react"; +import {Image, ScrollView, View} from "@tarojs/components"; +import styles from './list.module.scss' +import Taro from "@tarojs/taro"; +import Empty from "@/components/empty/empty"; +import Img from "@/components/image/image"; +import {SearchApi} from "@/api/search"; +import {rfc33392time} from "@/utils/day"; +import play from "@/static/img/play-back.png"; +import Spin from "@/components/spinner"; + +type Props = { + name: string + clear: boolean +} +const SearchList: FC = ({name, clear}) => { + console.log(name, 'name') + const globalData = Taro.getApp().globalData + const [page, setPage] = useState(1) + const [brands, setBrands] = useState([]) + const [total, setTotal] = useState(0) + const [text, setText] = useState('') + const [loading, setLoading] = useState(true) + + useEffect(() => { + if (!clear) { + setBrands([]) + setLoading(true) + } + }, [clear]) + useEffect(() => { + if (name && clear) { + getData() + } + }, [page, name, clear]) + + const getData = useCallback(async () => { + try { + const data = await SearchApi.list(page, 10, name) + if (page === 1) { + if (data.data.length < 10) { + setText('没有更多了~') + } else { + setText('上拉加载更多~') + } + setBrands([ + ...data.data + ]) + } else { + setBrands([ + ...brands, + ...data.data + ]) + } + setTotal(data.total) + + } catch (e) { + } + setLoading(false) + }, [page, name]) + + + function jumpInfo(id: number, type: string) { + console.log(type, 'type') + let url = '' + switch (type) { + case 'brand': + url = '/pages/preview/brand/info/info'; + break; + case 'article': + url = '/pages/preview/brand/article/article' + break + case 'video_records': + url = '/pages/preview/videoFull/videoFull' + break + case 'courses': + url = '/pages/business/videoInfo/videoInfo' + break + } + Taro.navigateTo({url: `${url}?id=${id}`}) + + } + + function onScrollToLower() { + if (brands?.length < total) { + setPage(page + 1) + getData().then() + } else { + setText('没有更多了~') + } + } + + return ( + + + { + brands.length >= 1 && !loading && + <> + {brands.map((d) => + jumpInfo(d.data.id, d.data.table)} className={styles.box} key={d.data.id}> + { + d.data.table === 'brand' && + <> + + + {d.data.title} + {d.data.content || '暂无品牌简介'} + + + } + { + d.data.table === 'article' && + <> + + {d.data['@data'].title} + {rfc33392time(d.data['@data'].created_at)} {d.data['@data'].page_view}阅读 + + + + } + { + d.data.table === 'video_records' && + <> + + + + {d.data['@data'].title} + {d.data['@data'].introduction} + 播放量: {d.data['@data'].video_view} + + + } + { + d.data.table === 'courses' && + <> + + + {d.data['@data'].title} + 课时:{d.data['@data'].class_hour}节 + 销量:{d.data['@data'].charge} + + + } + + ) + } + {text} + + } + {!loading && brands.length === 0 && } + + ) +} + +export default SearchList + diff --git a/src/pages/search/index.config.ts b/src/pages/search/index.config.ts new file mode 100644 index 0000000..23c20dd --- /dev/null +++ b/src/pages/search/index.config.ts @@ -0,0 +1,3 @@ +export default definePageConfig({ + navigationStyle: 'custom' +}) diff --git a/src/pages/search/index.module.scss b/src/pages/search/index.module.scss new file mode 100644 index 0000000..3ead51e --- /dev/null +++ b/src/pages/search/index.module.scss @@ -0,0 +1,66 @@ +page { + background-color: #F2F8F6; + + .searchHeader { + margin-top: 10px; + padding: 0 20rpx; + display: flex; + align-items: center; + justify-content: space-between; + transition: all 200ms; + position: sticky; + z-index: 200 ; + overflow: hidden; + } + + .searchBox { + flex: 1; + height: 68rpx; + background: #FFFFFF; + border-radius: 32rpx; + box-sizing: border-box; + display: flex; + align-items: center; + padding: 0 24rpx; + + .input { + font-size: 28rpx; + margin-left: 20rpx; + flex: 1; + } + } + + .titleBox { + margin-top: 40rpx; + width: 100%; + display: flex; + box-sizing: border-box; + padding-right: 30rpx; + justify-content: space-between; + + .title { + font-size: 30rpx; + font-weight: bold; + color: #323635; + } + } + + .contentBox { + display: flex; + flex-wrap: wrap; + + .items { + display: inline-block; + background: #FFFFFF; + border-radius: 32rpx; + padding: 10rpx 24rpx; + font-size: 24rpx; + font-weight: 500; + color: #323635; + line-height: 24rpx; + margin-top: 24rpx; + margin-right: 24rpx; + } + } +} + diff --git a/src/pages/search/index.tsx b/src/pages/search/index.tsx new file mode 100644 index 0000000..60330d3 --- /dev/null +++ b/src/pages/search/index.tsx @@ -0,0 +1,154 @@ +import {Input, View, Text, PageContainer, Image} from "@tarojs/components"; +import {FC, useEffect, useMemo, useState} from "react"; +import styles from './index.module.scss' +import Taro from "@tarojs/taro"; +import {useDidShow} from '@tarojs/taro' +import SearchList from './components/list' +import NavigationBar from "@/components/navigationBar/navigationBar"; +import search from '@/static/img/search.png' +import del from '@/static/img/del.png' + + +const Search: FC = () => { + const [value, setValue] = useState('') + const [recentSearch, setRecentSearch] = useState([]) + const [hotSearch] = useState([]) + const [show, setShow] = useState(false) + const [focus, setFocus] = useState(false) + + + useDidShow(getRecentSearch) + + useEffect(() => { + !show && getRecentSearch() + }, [show]) + + function inpFn(e) { + setValue(e.detail.value) + } + + function clearSearch() { + Taro.removeStorageSync('recentSearch') + getRecentSearch() + Taro.showToast({title: '删除成功'}) + } + + function getRecentSearch() { + setRecentSearch(Taro.getStorageSync('recentSearch')) + } + + function getSearchItem(value) { + setValue(value) + setShow(true) + } + + function searchInput() { + if (value === "") return; + getSearchItem(value) + //记录最近搜索 + let recentSearch = Taro.getStorageSync('recentSearch') || []; + recentSearch.unshift(value); + Taro.setStorageSync('recentSearch', [...new Set(recentSearch)]) + } + + function cancelSearch(){ + setValue('') + setShow(false) + setFocus(false) + // Taro.navigateBack() + } + + + const searchStyles = useMemo((): React.CSSProperties | undefined => { + if (focus || show) { + return { + // transform: "translateY(-43px)", + // width: "100%", + } + } + }, [focus, show]) + + + return ( + + 搜索
+ } /> + + + + setFocus(true)} + onBlur={() => setFocus(false)} + className={styles.input} + placeholder={(focus || show) ? '' : "输入关键字搜索"} + type='text' + value={value} + confirmType='search' + onInput={inpFn} + onConfirm={searchInput}/> + + + 清空 + {/*{focus || show ? 取消 : null}*/} + + + + { + recentSearch.length >= 1 && !show && + + + 最近搜索 + + + + { + recentSearch.length > 0 && + recentSearch?.map(d => + + getSearchItem(d)} className="font-28">{d} + ) + } + + + } + { + hotSearch.length >= 1 && !show && + <> + + + 热门搜索 + + + + { + hotSearch.length && + hotSearch.map(d => + + { + getSearchItem(d) + }} className="font-28">{d} + ) + } + + + + } + + + {show && } + + + ) +} +export default Search diff --git a/src/static/css/module.scss b/src/static/css/module.scss index 38e89eb..11ea45d 100644 --- a/src/static/css/module.scss +++ b/src/static/css/module.scss @@ -101,3 +101,131 @@ taro-button-core::after { display: -webkit-box; -webkit-box-orient: vertical; } + +@-webkit-keyframes loading { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } +} +@keyframes loading { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } +} +.at-loading { + display: inline-block; + position: relative; + width: 36rpx; + height: 36rpx; +} +.at-loading__ring { + -webkit-box-sizing: border-box; + box-sizing: border-box; + display: block; + position: absolute; + width: 36rpx; + height: 36rpx; + margin: 1PX; + border-width: 1PX; + border-style: solid; + border-color: #00d6ac transparent transparent transparent; + border-radius: 50%; + -webkit-animation: loading 1.2s cubic-bezier(0.5, 0, 0.5, 1) infinite; + animation: loading 1.2s cubic-bezier(0.5, 0, 0.5, 1) infinite; +} +.at-loading__ring:nth-child(1) { + -webkit-animation-delay: -0.45s; + animation-delay: -0.45s; +} +.at-loading__ring:nth-child(2) { + -webkit-animation-delay: -0.3s; + animation-delay: -0.3s; +} +.at-loading__ring:nth-child(3) { + -webkit-animation-delay: -0.15s; + animation-delay: -0.15s; +} +.at-activity-indicator__content{ + font-size: 28rpx; + color: #6c757d; +} + +//滑动组件样式 +.at-list { + background-color: rgba(0,0,0,0) !important; + position: relative; + width: 710rpx !important; +} +.at-swipe-action { + position: relative; + overflow: hidden; + width: 710rpx !important; + border-radius: 16rpx 16rpx 16rpx 16rpx; + overflow: hidden; + margin-bottom: 20rpx; +} +.at-swipe-action__area { + height: auto; +} +.at-swipe-action__content { + position: relative; + font-size: 32rpx; + background-color: #FFF; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + height: 100%; + z-index: 2; +} +.at-swipe-action__content.animtion { + -webkit-transition: -webkit-transform 300ms cubic-bezier(0.36, 0.66, 0.04, 1); + transition: -webkit-transform 300ms cubic-bezier(0.36, 0.66, 0.04, 1); + transition: transform 300ms cubic-bezier(0.36, 0.66, 0.04, 1); + transition: transform 300ms cubic-bezier(0.36, 0.66, 0.04, 1), -webkit-transform 300ms cubic-bezier(0.36, 0.66, 0.04, 1); +} +.at-swipe-action__option { + -webkit-transition: background-color 0.3s; + transition: background-color 0.3s; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-align: center; + display: -webkit-inline-flex; + display: -ms-inline-flexbox; + display: inline-flex; + padding: 0 32rpx; + height: 100%; + color: #FFF; + font-size: 28rpx; + width: 120rpx; + text-align: center; + background-color: #999; +} +.at-swipe-action__option:active { + background-color: #F0F0F0; +} +.at-swipe-action__options { + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-align: center; + display: -webkit-inline-flex; + display: -ms-inline-flexbox; + display: inline-flex; + position: absolute; + top: 0; + right: 0; + height: 100%; + z-index: 1; + opacity: 0; +} diff --git a/src/static/img/arrow-right.png b/src/static/img/arrow-right.png deleted file mode 100644 index e2d4acc..0000000 Binary files a/src/static/img/arrow-right.png and /dev/null differ diff --git a/src/static/img/beforeMeeting.png b/src/static/img/beforeMeeting.png new file mode 100644 index 0000000..66c68d9 Binary files /dev/null and b/src/static/img/beforeMeeting.png differ diff --git a/src/static/img/cyanSearch.png b/src/static/img/cyanSearch.png new file mode 100644 index 0000000..0ccc8ab Binary files /dev/null and b/src/static/img/cyanSearch.png differ diff --git a/src/static/img/graySearch.png b/src/static/img/graySearch.png new file mode 100644 index 0000000..41a86bc Binary files /dev/null and b/src/static/img/graySearch.png differ diff --git a/src/static/img/meeting.png b/src/static/img/meeting.png new file mode 100644 index 0000000..ad8f7dc Binary files /dev/null and b/src/static/img/meeting.png differ diff --git a/src/static/img/meetingEnd.png b/src/static/img/meetingEnd.png new file mode 100644 index 0000000..7e7863d Binary files /dev/null and b/src/static/img/meetingEnd.png differ diff --git a/src/utils/marked/components/Tablink.tsx b/src/utils/marked/components/Tablink.tsx index 93e61dd..509b24d 100644 --- a/src/utils/marked/components/Tablink.tsx +++ b/src/utils/marked/components/Tablink.tsx @@ -16,7 +16,7 @@ const TabLink:FC = (props:TabLinkProps) => { let webExp= new RegExp(/http(s)?:\/\/([\w-]+\.)+[\w-]+(\/[\w- .\/?%&=]*)?/) if(webExp.test(props.url)){ //跳转webview - Taro.navigateTo({url:`/pages/preview/webView/webView?url=${props.url}`}) + Taro.navigateTo({url:`/pages/preview/webView/webView?url=${encodeURIComponent(props.url)}`}) }else{ //跳转小程序页面 } diff --git a/types/home.d.ts b/types/home.d.ts index 05ddf06..13f8de8 100644 --- a/types/home.d.ts +++ b/types/home.d.ts @@ -15,6 +15,7 @@ interface VideList { interface Brand { id: number brand_album: string + logo: string graphic_introduction: string name: string resource: Resource @@ -39,4 +40,5 @@ interface Illness { description: string name: string thumb:string + album: string }