统一文章收藏

v2
king 1 year ago
parent ae52d73588
commit 86bc1a4cc0
  1. 1
      src/api/brand.ts
  2. 1
      src/app.config.ts
  3. 16
      src/pages/home/components/curRecommended.tsx
  4. 27
      src/pages/preview/brand/article/article.module.scss
  5. 72
      src/pages/preview/brand/article/article.tsx
  6. 1
      src/pages/preview/brand/list/list.tsx
  7. 4
      src/pages/preview/illness/article/article.config.ts
  8. 80
      src/pages/preview/illness/article/article.module.scss
  9. 128
      src/pages/preview/illness/article/article.tsx
  10. 2
      src/pages/preview/illness/list/list.tsx
  11. 2
      src/pages/preview/search/search/components/list.tsx

@ -20,6 +20,7 @@ export type ArticleRecord = {
created_at: string created_at: string
content: string content: string
brands: BrandRecord[] brands: BrandRecord[]
collect:boolean
} }
export const brandApi = { export const brandApi = {

@ -91,7 +91,6 @@ export default defineAppConfig({
'videoFull/videoFull', // 资源id 视频全屏 'videoFull/videoFull', // 资源id 视频全屏
'illness/sort/sort', 'illness/sort/sort',
'illness/list/list', 'illness/list/list',
'illness/article/article',
'webView/webView', 'webView/webView',
'search/search/index', 'search/search/index',
] ]

@ -9,19 +9,9 @@ import Img from "@/components/image/image";
import {beforeTime} from "@/utils/time"; import {beforeTime} from "@/utils/time";
const toArticlePage = (d: any) => { const toArticlePage = (d: any) => {
console.log({d}) Taro.navigateTo({
switch (d.owner_type) { url: `/pages/preview/brand/article/article?id=${d.id}`
case 1: })
Taro.navigateTo({
url: `/pages/preview/brand/article/article?id=${d.id}`
})
return
case 2:
Taro.navigateTo({
url: `/pages/preview/illness/article/article?id=${d.id}`
})
return
}
} }
const CurRecommended: FC = () => { const CurRecommended: FC = () => {

@ -38,6 +38,26 @@
} }
} }
.botmBox {
z-index: 99;
position: fixed;
bottom: 0;
width: 690rpx;
height: 100rpx;
padding: 0 30rpx env(safe-area-inset-bottom);
display: flex;
justify-content: flex-end;
align-items: center;
background: #F5F8F7;
color: #909795;
View {
font-size: 26rpx;
padding: 0 10px;
text-align: center;
}
}
.article { .article {
font-size: 30rpx; font-size: 30rpx;
display: flex; display: flex;
@ -52,3 +72,10 @@
font-size: 40rpx; font-size: 40rpx;
margin-bottom: 50rpx; margin-bottom: 50rpx;
} }
.articleBox {
background: #fff;
min-height: calc(100vh - env(safe-area-inset-bottom) + 180rpx);
box-sizing: border-box;
padding: 30rpx 30rpx calc(env(safe-area-inset-bottom) + 150rpx) 30rpx;
}

@ -1,5 +1,5 @@
import {FC, useCallback, useEffect, useMemo, useState} from "react"; import {FC, useCallback, useEffect, useMemo, useState} from "react";
import {Image, Text, View} from "@tarojs/components"; import {Image, PageContainer, Text, View} from "@tarojs/components";
import Taro, {useRouter} from "@tarojs/taro"; import Taro, {useRouter} from "@tarojs/taro";
import {ArticleRecord, brandApi} from "@/api"; import {ArticleRecord, brandApi} from "@/api";
import styles from "./article.module.scss"; import styles from "./article.module.scss";
@ -10,6 +10,8 @@ import Empty from "@/components/empty/empty";
import Spin from "@/components/spinner"; import Spin from "@/components/spinner";
import {beforeTime} from "@/utils/time"; import {beforeTime} from "@/utils/time";
import Img from "@/components/image/image"; import Img from "@/components/image/image";
import Collect from "@/components/collect/collect";
import catalogue from "@/static/img/catalogue.png";
const article: FC = () => { const article: FC = () => {
@ -18,9 +20,12 @@ const article: FC = () => {
const {id} = useRouter().params as unknown as { id: number } const {id} = useRouter().params as unknown as { id: number }
const [articleInfo, setArticleInfo] = useState<ArticleRecord>() const [articleInfo, setArticleInfo] = useState<ArticleRecord>()
const [ultra, setUltra] = useState(true) const [ultra, setUltra] = useState(true)
const [show, setShow] = useState(false)
const globalData = Taro.getApp().globalData const globalData = Taro.getApp().globalData
const pageHeight = globalData.windowHeight - globalData.textBarHeight - globalData.statusBarHeight const pageHeight = globalData.windowHeight - globalData.textBarHeight - globalData.statusBarHeight
const {children, headings} = useMemo(() => parse(articleInfo?.content || ''), [articleInfo]) const {children, headings} = useMemo(() => parse(articleInfo?.content || ''), [articleInfo])
const query = Taro.createSelectorQuery()
useEffect(() => { useEffect(() => {
setTimeout(() => { setTimeout(() => {
@ -34,6 +39,22 @@ const article: FC = () => {
}, 300) }, 300)
}, [children]) }, [children])
function mao(id: string) {
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.useReady(() => { Taro.useReady(() => {
getData().then() getData().then()
}) })
@ -54,12 +75,30 @@ const article: FC = () => {
function helloWorld() { function helloWorld() {
return ( return (
<> <>
<View className={styles.botmBox}>
<View>
<Collect
select={articleInfo?.collect}
styles={{flexDirection: 'column', justifyContent: 'center', padding: '20rpx'}}
stylesImage={{margin: '0 0 8rpx 0'}}
owner_id={Number(id)}
owner_type={1}/>
</View>
{
headings.length > 0 && <View onClick={() => setShow(true)}>
<Image src={catalogue} mode='widthFix' style={{width: '40rpx', height: '40rpx'}}/>
<View></View>
</View>
}
</View>
<Spin overlay enable={enable}/> <Spin overlay enable={enable}/>
<View style={{ <View
padding: '10px', className={styles.articleBox}
height: !token ? Taro.getWindowInfo().windowHeight - 60 + 'px' : 'auto', style={{
overflow: !token ? 'hidden' : 'auto' height: !token ? Taro.getWindowInfo().windowHeight - 60 + 'px' : 'auto',
}}> overflow: !token ? 'hidden' : 'auto'
}}>
<View id="childrenNode"> <View id="childrenNode">
<View className={styles.articleTitle}>{articleInfo?.title}</View> <View className={styles.articleTitle}>{articleInfo?.title}</View>
{ {
@ -67,7 +106,7 @@ const article: FC = () => {
<View> <View>
{ {
articleInfo?.brands.map(d => <View className={styles.article}> articleInfo?.brands.map(d => <View className={styles.article}>
<Img src={d.logo} width={80} height={80} className={styles.articleImag}/> <Img src={d.logo} width={80} height={80} className={styles.articleImag} errorType='avatar'/>
<View className='ml-2'> <View className='ml-2'>
<View>{d?.name}</View> <View>{d?.name}</View>
<View className='flex mt-1 text-muted font-24'> <View className='flex mt-1 text-muted font-24'>
@ -97,9 +136,26 @@ const article: FC = () => {
</View> </View>
</View> </View>
} }
<PageContainer
onClickOverlay={() => setShow(false)}
show={show}
round
overlay
overlayStyle={'background:rgba(0,0,0,0.3)'}>
<View className="px-3 py-5">
{
headings.length > 0 && headings.map((d) => <View
className="pb-3"
style={{fontSize: '28rpx', fontWeight: '500', color: '#323635'}}
onClick={() => mao(d.id)}>
{d.text}
</View>
)
}
</View>
</PageContainer>
</> </>
) )
} }
return helloWorld() return helloWorld()

@ -60,7 +60,6 @@ const BrandItem: FC<{ data: BrandRecord; onClick: VoidFunction }> = ({data, onCl
<Image src={articleLine}/> <Image src={articleLine}/>
{data.article_count || 0} {data.article_count || 0}
</View> </View>
{JSON.stringify(data.collect)}
<Collect owner_id={data.id} owner_type={4} select={data.collect}/> <Collect owner_id={data.id} owner_type={4} select={data.collect}/>
</View> </View>
</View> </View>

@ -1,4 +0,0 @@
export default definePageConfig({
navigationBarTitleText: '',
onReachBottomDistance: 50
})

@ -1,80 +0,0 @@
.botmBox {
z-index: 99;
position: fixed;
bottom: 0;
width: 750rpx;
box-sizing: border-box;
height: 150rpx;
padding-bottom: env(safe-area-inset-bottom);
display: flex;
justify-content: flex-end;
align-items: center;
background: #F5F8F7;
color: #909795;
font-size: 26rpx;
View {
padding: 0 10px;
text-align: center;
}
}
.articleBox {
padding: 30rpx 30rpx calc(env(safe-area-inset-bottom) + 150rpx) 30rpx;
}
.fixedBox {
position: fixed;
z-index: 100;
top: 0;
width: 100vw;
height: 100vh;
background: linear-gradient(to bottom, rgba(255, 255, 255, 0), rgba(255, 255, 255, 1), rgba(255, 255, 255, 1));
&-inner {
position: absolute;
width: 100vw;
top: 45vh;
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;
}
}
}
.article {
font-size: 30rpx;
display: flex;
margin-bottom: 40rpx;
}
.articleImag {
border-radius: 100rpx;
}
.articleTitle {
font-size: 40rpx;
margin-bottom: 50rpx;
}

@ -1,128 +0,0 @@
import {FC, useEffect, useMemo, useState} from "react";
import {Image, PageContainer, Text, View} from "@tarojs/components";
import Taro, {useRouter} from "@tarojs/taro";
import {ArticleRecord, brandApi} from "@/api";
import styles from './article.module.scss'
import down from '@/static/img/doubleDown.png'
import {Profile} from "@/store";
import {parse} from "@/utils/marked/marked";
import {beforeTime} from "@/utils/time";
import Img from "@/components/image/image";
import catalogue from '@/static/img/catalogue.png'
import Collect from "@/components/collect/collect";
const article: FC = () => {
const {token} = Profile.useContainer()
const {id} = useRouter().params as unknown as { id: number }
const [show, setShow] = useState(false)
const [articleInfo, setArticleInfo] = useState<ArticleRecord>()
const {children, headings} = useMemo(() => parse(articleInfo?.content || ''), [articleInfo])
const query = Taro.createSelectorQuery()
useEffect(() => {
getData()
}, [id])
const getData = async () => {
Taro.setNavigationBarTitle({title: '疾病文章详情'})
try {
const data = await brandApi.articleInfo(id)
Taro.setNavigationBarTitle({title: data.title})
setArticleInfo(data)
} catch (e) {
}
}
function mao(id: string) {
setShow(false)
Taro.nextTick(() => {
query.select(`#${id}`).boundingClientRect()
query.exec((res) => {
if (res.length) {
Taro.pageScrollTo({
scrollTop: res[res.length - 1].top,
duration: 300
}
)
}
})
})
}
function helloWorld() {
return (
<>
<View className={styles.botmBox} style={{display: show ? 'none' : 'flex'}} onClick={() => setShow(true)}>
<View>
<Collect
styles={{flexDirection: 'column', justifyContent: 'center', padding: '20rpx'}}
stylesImage={{margin: '0 0 8rpx 0'}}
owner_id={id}
owner_type={1}/>
</View>
<View>
<Image src={catalogue} mode='widthFix' style={{width: '40rpx', height: '40rpx'}}/>
<View></View>
</View>
</View>
<View
className={styles.articleBox}
style={{
height: !token ? Taro.getWindowInfo().windowHeight - 60 + 'px' : 'auto',
overflow: !token ? 'hidden' : 'auto'
}}>
<View>
<View className={styles.articleTitle}>{articleInfo?.title}</View>
{
articleInfo?.brands.map(d => <View className={styles.article}>
<Img src={d.logo} width={80} height={80} className={styles.articleImag} errorType="avatar"/>
<View className='ml-2'>
<View>{d?.name}</View>
<View className='flex mt-1 text-muted font-24'>
<View className='mr-2'>{beforeTime(articleInfo?.created_at)} . </View>
<View> {articleInfo.page_view || 1}</View>
</View>
</View>
</View>)
}
</View>
{children}
</View>
{
!token &&
<View className={styles.fixedBox}>
<View className={styles['fixedBox-inner']}>
<View className={styles['fixedBox-inner-icon']}>
<Image src={down}></Image>
</View>
<View className={styles['fixedBox-inner-box']}
onClick={() => Taro.navigateTo({url: '/pages/login/login'})}>
<Text></Text>
</View>
</View>
</View>
}
<PageContainer
onClickOverlay={() => setShow(false)}
show={show}
round
overlay
overlayStyle={'background:rgba(0,0,0,0.3)'}>
<View className="px-3 py-5">
{headings.length > 0 && headings.map((d) => <View
className="pb-3"
style={{fontSize: '28rpx', fontWeight: '500', color: '#323635'}}
onClick={() => mao(d.id)}>
{d.text}
</View>
)}
</View>
</PageContainer>
</>
)
}
return helloWorld()
}
export default article

@ -34,7 +34,7 @@ const BrandList: FC = () => {
}, [page]) }, [page])
function jump(id: number) { function jump(id: number) {
Taro.navigateTo({url: '/pages/preview/illness/article/article?id=' + id}) Taro.navigateTo({url: '/pages/preview/brand/article/article?id=' + id})
} }

@ -71,7 +71,7 @@ const SearchList: FC<Props> = ({name, clear}) => {
url = '/pages/preview/illness/list/list'; url = '/pages/preview/illness/list/list';
break; break;
case 'article': case 'article':
url = '/pages/preview/illness/article/article' url = '/pages/preview/brand/article/article'
break break
case 'video_records': case 'video_records':
return Taro.navigateTo({url: `/pages/preview/videoFull/videoFull?url=${health.resources.url}&poster=${health.url_path}&title=${health.title}`}) return Taro.navigateTo({url: `/pages/preview/videoFull/videoFull?url=${health.resources.url}&poster=${health.url_path}&title=${health.title}`})

Loading…
Cancel
Save