From bab70c8eee2382b19ff9934e488f08674d8f81ef Mon Sep 17 00:00:00 2001 From: Pine Date: Thu, 27 Aug 2026 15:30:19 +0800 Subject: [PATCH] =?UTF-8?q?feat(content):=20=E5=B0=8F=E7=A8=8B=E5=BA=8F?= =?UTF-8?q?=E8=AF=A6=E6=83=85=E5=AF=8CUI(=E9=98=85=E8=AF=BB/=E5=8A=A8?= =?UTF-8?q?=E4=BD=9C=E6=9D=A1/=E7=95=99=E8=A8=80)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - content-detail 微信文章式:标题 + 作者(头像/昵称/认证✓) + 日期 + 阅读X + 富文本正文 - 作者条+动作(点赞/转发=复制链接/收藏/写留言滚动) - 阅读X + 留言区(输入框+😊🖼+发送+列表,未登录提示登录;空态"还没有留言,来写首评") - utils/content.js +getComments/addComment Co-Authored-By: Claude --- .../src/pages/content-detail/index.jsx | 95 +++++++++++++++---- .../src/pages/content-detail/index.scss | 43 +++++++-- miniprogram/src/utils/content.js | 12 +++ 3 files changed, 122 insertions(+), 28 deletions(-) diff --git a/miniprogram/src/pages/content-detail/index.jsx b/miniprogram/src/pages/content-detail/index.jsx index 24972e0..a811126 100644 --- a/miniprogram/src/pages/content-detail/index.jsx +++ b/miniprogram/src/pages/content-detail/index.jsx @@ -1,70 +1,123 @@ -import { View, Text, Image, Video, ScrollView, Button, RichText } from '@tarojs/components'; +import { View, Text, Image, Video, ScrollView, Input, Button, RichText } from '@tarojs/components'; import Taro from '@tarojs/taro'; import { useState, useEffect } from 'react'; -import { getContent } from '@/utils/content'; +import { getContent, getComments, addComment } from '@/utils/content'; +import { isAuthed } from '@/utils/auth'; import './index.scss'; -/** 资讯详情:封面/视频 + 正文 + 图集 + 外链 + 发布人。 */ +const rw = (s) => (s || '').replace('T', ' ').replace('Z', '').slice(0, 16); + +/** 资讯详情(微信文章式):标题/作者/阅读 + 正文 + 动作条 + 留言。 */ export default function ContentDetail() { const [item, setItem] = useState(null); + const [comments, setComments] = useState([]); const [err, setErr] = useState(''); const [loaded, setLoaded] = useState(false); + const [like, setLike] = useState(false); + const [fav, setFav] = useState(false); + const [draft, setDraft] = useState(''); + const [sending, setSending] = useState(false); useEffect(() => { const inst = Taro.getCurrentInstance(); const id = (inst && inst.router && inst.router.params && inst.router.params.id) || ''; if (!id) { setErr('无效内容'); setLoaded(true); return; } getContent(id).then(setItem).catch(() => setErr('加载失败')).finally(() => setLoaded(true)); + getComments(id).then(setComments).catch(() => {}); }, []); if (!loaded) return 加载中…; if (err || !item) return {err || '内容不存在'}; + const id = item.id; const img = item.cover || (item.video ? item.video_cover : ''); const images = Array.isArray(item.images) ? item.images : []; + const author = item.publisher_name || '云超服'; + const views = item.read_count || 0; + + const copyLink = () => Taro.setClipboardData({ data: `https://opc.pinesound.cn/#/content-detail?id=${id}` }).then(() => Taro.showToast({ title: '链接已复制', icon: 'none' })); + const scrollToComment = () => { Taro.pageScrollTo({ selector: '.cd-comments', duration: 300 }); }; + const send = async () => { + if (!isAuthed()) { Taro.showToast({ title: '请先登录', icon: 'none' }); return; } + if (!draft.trim()) return; + setSending(true); + try { + const c = await addComment(id, draft.trim()); + if (c) { setComments((m) => [c, ...m]); setDraft(''); Taro.showToast({ title: '已留言', icon: 'success' }); } + } catch (e) { Taro.showToast({ title: (e && e.message) || '留言失败', icon: 'none' }); } + finally { setSending(false); } + }; return ( - {/* 视频或封面 */} + {/* 封面/视频 */} {item.video ?