This commit is contained in:
mzltMpfqGS
2026-04-15 19:45:16 +08:00
commit e4a087e67e
301 changed files with 35048 additions and 0 deletions

View File

@@ -0,0 +1,87 @@
// components/article-card/article-card.js
// 文章卡片组件
Component({
properties: {
article: {
type: Object,
value: {}
},
showActions: {
type: Boolean,
value: true
}
},
data: {
isFavorite: false,
isLike: false
},
lifetimes: {
attached() {
if (this.data.article) {
this.setData({
isFavorite: this.data.article.isFavorite || false,
isLike: this.data.article.isLike || false
})
}
}
},
methods: {
onTap() {
const article = this.data.article
if (article && article.id) {
wx.navigateTo({
url: `/pages/article-detail/article-detail?id=${article.id}`
})
}
},
onFavorite(e) {
e.stopPropagation()
const article = this.data.article
if (!article || !article.id) return
const isFavorite = !this.data.isFavorite
this.setData({ isFavorite })
this.triggerEvent('favorite', {
articleId: article.id,
isFavorite
})
},
onLike(e) {
e.stopPropagation()
const article = this.data.article
if (!article || !article.id) return
const isLike = !this.data.isLike
this.setData({ isLike })
this.triggerEvent('like', {
articleId: article.id,
isLike
})
},
onShare(e) {
e.stopPropagation()
const article = this.data.article
if (article) {
wx.showShareMenu({
withShareTicket: true,
menus: ['shareAppMessage', 'shareTimeline']
})
}
}
}
})
/**
* @联系作者16768118056
* @描述:(此项目非免费分享)源码百分百可用,搞定毕设不发愁,支持远程调试安装、二次开发、定制、讲解、文档类。
* @访问https://www.notmaker.com/detail/8326a897119d4542896c863a69d7bbe7/gtt20260415查看完整运行演示。
*/

View File

@@ -0,0 +1,10 @@
{
"component": true,
"usingComponents": {}
}
/**
* @16768118056
* @
* @访https://www.notmaker.com/detail/8326a897119d4542896c863a69d7bbe7/gtt20260415查看完整运行演示。
*/

View File

@@ -0,0 +1,36 @@
<!-- components/article-card/article-card.wxml -->
<!-- 文章卡片组件 -->
<view class="article-card" bindtap="onTap">
<view class="card-content">
<image class="cover" wx:if="{{article.coverImage}}" src="{{article.coverImage}}" mode="aspectFill" />
<view class="info">
<text class="title">{{article.title}}</text>
<text class="summary">{{article.summary}}</text>
<view class="meta">
<text class="author">{{article.authorName}}</text>
<text class="time">{{article.createTime}}</text>
</view>
</view>
</view>
<view class="card-actions" wx:if="{{showActions}}">
<view class="action-item {{isLike ? 'active' : ''}}" bindtap="onLike">
<text class="iconfont {{isLike ? 'icon-like-fill' : 'icon-like'}}"></text>
<text>{{article.likeCount || 0}}</text>
</view>
<view class="action-item {{isFavorite ? 'active' : ''}}" bindtap="onFavorite">
<text class="iconfont {{isFavorite ? 'icon-favorite-fill' : 'icon-favorite'}}"></text>
<text>{{article.favoriteCount || 0}}</text>
</view>
<view class="action-item" bindtap="onShare">
<text class="iconfont icon-share"></text>
<text>分享</text>
</view>
</view>
</view>
/**
* @联系作者16768118056
* @描述:(此项目非免费分享)源码百分百可用,搞定毕设不发愁,支持远程调试安装、二次开发、定制、讲解、文档类。
* @访问https://www.notmaker.com/detail/8326a897119d4542896c863a69d7bbe7/gtt20260415查看完整运行演示。
*/

View File

@@ -0,0 +1,102 @@
/* components/article-card/article-card.wxss */
/* 文章卡片样式 */
.article-card {
background-color: #fff;
border-radius: 16rpx;
overflow: hidden;
margin-bottom: 20rpx;
}
.card-content {
display: flex;
padding: 24rpx;
}
.cover {
width: 200rpx;
height: 150rpx;
border-radius: 12rpx;
margin-right: 20rpx;
flex-shrink: 0;
}
.info {
flex: 1;
display: flex;
flex-direction: column;
min-width: 0;
}
.title {
font-size: 30rpx;
font-weight: bold;
color: #333;
margin-bottom: 12rpx;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
}
.summary {
font-size: 24rpx;
color: #999;
margin-bottom: 16rpx;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
flex: 1;
}
.meta {
display: flex;
gap: 20rpx;
}
.author,
.time {
font-size: 22rpx;
color: #999;
}
.card-actions {
display: flex;
border-top: 1rpx solid #f0f0f0;
}
.action-item {
flex: 1;
display: flex;
align-items: center;
justify-content: center;
padding: 20rpx;
gap: 8rpx;
}
.action-item .iconfont {
font-size: 32rpx;
color: #999;
}
.action-item text {
font-size: 24rpx;
color: #999;
}
.action-item.active .iconfont {
color: #667eea;
}
.action-item.active text {
color: #667eea;
}
/**
* @联系作者16768118056
* @描述:(此项目非免费分享)源码百分百可用,搞定毕设不发愁,支持远程调试安装、二次开发、定制、讲解、文档类。
* @访问https://www.notmaker.com/detail/8326a897119d4542896c863a69d7bbe7/gtt20260415查看完整运行演示。
*/

View File

@@ -0,0 +1,28 @@
// components/category-item/category-item.js
// 分类项组件
Component({
properties: {
category: {
type: Object,
value: {}
},
selected: {
type: Boolean,
value: false
}
},
methods: {
onTap() {
const category = this.data.category
this.triggerEvent('tap', { category })
}
}
})
/**
* @联系作者16768118056
* @描述:(此项目非免费分享)源码百分百可用,搞定毕设不发愁,支持远程调试安装、二次开发、定制、讲解、文档类。
* @访问https://www.notmaker.com/detail/8326a897119d4542896c863a69d7bbe7/gtt20260415查看完整运行演示。
*/

View File

@@ -0,0 +1,10 @@
{
"component": true,
"usingComponents": {}
}
/**
* @16768118056
* @
* @访https://www.notmaker.com/detail/8326a897119d4542896c863a69d7bbe7/gtt20260415查看完整运行演示。
*/

View File

@@ -0,0 +1,14 @@
<!-- components/category-item/category-item.wxml -->
<!-- 分类项组件 -->
<view class="category-item {{selected ? 'selected' : ''}}" bindtap="onTap">
<image class="icon" wx:if="{{category.icon}}" src="{{category.icon}}" mode="aspectFit" />
<text class="name">{{category.name}}</text>
<text class="count" wx:if="{{category.articleCount}}">{{category.articleCount}}</text>
</view>
/**
* @联系作者16768118056
* @描述:(此项目非免费分享)源码百分百可用,搞定毕设不发愁,支持远程调试安装、二次开发、定制、讲解、文档类。
* @访问https://www.notmaker.com/detail/8326a897119d4542896c863a69d7bbe7/gtt20260415查看完整运行演示。
*/

View File

@@ -0,0 +1,37 @@
/* components/category-item/category-item.wxss */
/* 分类项样式 */
.category-item {
display: flex;
align-items: center;
padding: 24rpx 30rpx;
background-color: #fff;
border-bottom: 1rpx solid #f0f0f0;
}
.category-item.selected {
background-color: #f0f7ff;
}
.icon {
width: 48rpx;
height: 48rpx;
margin-right: 20rpx;
}
.name {
flex: 1;
font-size: 28rpx;
color: #333;
}
.count {
font-size: 24rpx;
color: #999;
}
/**
* @联系作者16768118056
* @描述:(此项目非免费分享)源码百分百可用,搞定毕设不发愁,支持远程调试安装、二次开发、定制、讲解、文档类。
* @访问https://www.notmaker.com/detail/8326a897119d4542896c863a69d7bbe7/gtt20260415查看完整运行演示。
*/

View File

@@ -0,0 +1,49 @@
// components/comment-item/comment-item.js
// 评论项组件
Component({
properties: {
comment: {
type: Object,
value: {}
},
showArticle: {
type: Boolean,
value: false
}
},
methods: {
onAvatarTap() {
const comment = this.data.comment
if (comment && comment.userId) {
wx.navigateTo({
url: `/pages/user-profile/user-profile?userId=${comment.userId}`
})
}
},
onReply() {
this.triggerEvent('reply', { comment: this.data.comment })
},
onLike() {
this.triggerEvent('like', { comment: this.data.comment })
},
onArticleTap() {
const comment = this.data.comment
if (comment && comment.articleId) {
wx.navigateTo({
url: `/pages/article-detail/article-detail?id=${comment.articleId}`
})
}
}
}
})
/**
* @联系作者16768118056
* @描述:(此项目非免费分享)源码百分百可用,搞定毕设不发愁,支持远程调试安装、二次开发、定制、讲解、文档类。
* @访问https://www.notmaker.com/detail/8326a897119d4542896c863a69d7bbe7/gtt20260415查看完整运行演示。
*/

View File

@@ -0,0 +1,10 @@
{
"component": true,
"usingComponents": {}
}
/**
* @16768118056
* @
* @访https://www.notmaker.com/detail/8326a897119d4542896c863a69d7bbe7/gtt20260415查看完整运行演示。
*/

View File

@@ -0,0 +1,33 @@
<!-- components/comment-item/comment-item.wxml -->
<!-- 评论项组件 -->
<view class="comment-item">
<image class="avatar" src="{{comment.avatar || '/static/images/default-avatar.png'}}" bindtap="onAvatarTap" />
<view class="content">
<view class="header">
<text class="nickname">{{comment.nickname}}</text>
<text class="time">{{comment.createTime}}</text>
</view>
<text class="text">{{comment.content}}</text>
<view class="article-info" wx:if="{{showArticle && comment.articleTitle}}" bindtap="onArticleTap">
<text class="iconfont icon-article"></text>
<text class="article-title">{{comment.articleTitle}}</text>
</view>
<view class="actions">
<view class="action-btn" bindtap="onLike">
<text class="iconfont {{comment.isLiked ? 'icon-like-fill' : 'icon-like'}}"></text>
<text>{{comment.likeCount || 0}}</text>
</view>
<view class="action-btn" bindtap="onReply">
<text class="iconfont icon-comment"></text>
<text>回复</text>
</view>
</view>
</view>
</view>
/**
* @联系作者16768118056
* @描述:(此项目非免费分享)源码百分百可用,搞定毕设不发愁,支持远程调试安装、二次开发、定制、讲解、文档类。
* @访问https://www.notmaker.com/detail/8326a897119d4542896c863a69d7bbe7/gtt20260415查看完整运行演示。
*/

View File

@@ -0,0 +1,95 @@
/* components/comment-item/comment-item.wxss */
/* 评论项样式 */
.comment-item {
display: flex;
padding: 24rpx 0;
}
.avatar {
width: 64rpx;
height: 64rpx;
border-radius: 32rpx;
margin-right: 20rpx;
flex-shrink: 0;
}
.content {
flex: 1;
min-width: 0;
}
.header {
display: flex;
align-items: center;
margin-bottom: 12rpx;
}
.nickname {
font-size: 28rpx;
font-weight: bold;
color: #333;
margin-right: 16rpx;
}
.time {
font-size: 22rpx;
color: #999;
}
.text {
font-size: 28rpx;
color: #333;
line-height: 1.6;
margin-bottom: 12rpx;
}
.article-info {
display: flex;
align-items: center;
padding: 16rpx;
background-color: #f5f5f5;
border-radius: 8rpx;
margin-bottom: 12rpx;
}
.article-info .iconfont {
font-size: 24rpx;
color: #667eea;
margin-right: 12rpx;
}
.article-title {
font-size: 24rpx;
color: #667eea;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.actions {
display: flex;
gap: 40rpx;
}
.action-btn {
display: flex;
align-items: center;
gap: 8rpx;
}
.action-btn .iconfont {
font-size: 28rpx;
color: #999;
}
.action-btn text {
font-size: 24rpx;
color: #999;
}
/**
* @联系作者16768118056
* @描述:(此项目非免费分享)源码百分百可用,搞定毕设不发愁,支持远程调试安装、二次开发、定制、讲解、文档类。
* @访问https://www.notmaker.com/detail/8326a897119d4542896c863a69d7bbe7/gtt20260415查看完整运行演示。
*/

View File

@@ -0,0 +1,31 @@
// components/empty-state/empty-state.js
// 空状态组件
Component({
properties: {
icon: {
type: String,
value: 'icon-empty'
},
text: {
type: String,
value: '暂无数据'
},
actionText: {
type: String,
value: ''
}
},
methods: {
onAction() {
this.triggerEvent('action')
}
}
})
/**
* @联系作者16768118056
* @描述:(此项目非免费分享)源码百分百可用,搞定毕设不发愁,支持远程调试安装、二次开发、定制、讲解、文档类。
* @访问https://www.notmaker.com/detail/8326a897119d4542896c863a69d7bbe7/gtt20260415查看完整运行演示。
*/

View File

@@ -0,0 +1,10 @@
{
"component": true,
"usingComponents": {}
}
/**
* @16768118056
* @
* @访https://www.notmaker.com/detail/8326a897119d4542896c863a69d7bbe7/gtt20260415查看完整运行演示。
*/

View File

@@ -0,0 +1,14 @@
<!-- components/empty-state/empty-state.wxml -->
<!-- 空状态组件 -->
<view class="empty-state">
<text class="iconfont {{icon}}"></text>
<text class="text">{{text}}</text>
<button class="action-btn" wx:if="{{actionText}}" bindtap="onAction">{{actionText}}</button>
</view>
/**
* @联系作者16768118056
* @描述:(此项目非免费分享)源码百分百可用,搞定毕设不发愁,支持远程调试安装、二次开发、定制、讲解、文档类。
* @访问https://www.notmaker.com/detail/8326a897119d4542896c863a69d7bbe7/gtt20260415查看完整运行演示。
*/

View File

@@ -0,0 +1,36 @@
/* components/empty-state/empty-state.wxss */
/* 空状态样式 */
.empty-state {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 100rpx 0;
}
.empty-state .iconfont {
font-size: 120rpx;
color: #ddd;
margin-bottom: 30rpx;
}
.empty-state .text {
font-size: 28rpx;
color: #999;
margin-bottom: 30rpx;
}
.action-btn {
padding: 16rpx 40rpx;
font-size: 28rpx;
color: #667eea;
background-color: rgba(102, 126, 234, 0.1);
border-radius: 32rpx;
}
/**
* @联系作者16768118056
* @描述:(此项目非免费分享)源码百分百可用,搞定毕设不发愁,支持远程调试安装、二次开发、定制、讲解、文档类。
* @访问https://www.notmaker.com/detail/8326a897119d4542896c863a69d7bbe7/gtt20260415查看完整运行演示。
*/

View File

@@ -0,0 +1,21 @@
// components/loading/loading.js
// 加载状态组件
Component({
properties: {
text: {
type: String,
value: '加载中...'
},
show: {
type: Boolean,
value: true
}
}
})
/**
* @联系作者16768118056
* @描述:(此项目非免费分享)源码百分百可用,搞定毕设不发愁,支持远程调试安装、二次开发、定制、讲解、文档类。
* @访问https://www.notmaker.com/detail/8326a897119d4542896c863a69d7bbe7/gtt20260415查看完整运行演示。
*/

View File

@@ -0,0 +1,10 @@
{
"component": true,
"usingComponents": {}
}
/**
* @16768118056
* @
* @访https://www.notmaker.com/detail/8326a897119d4542896c863a69d7bbe7/gtt20260415查看完整运行演示。
*/

View File

@@ -0,0 +1,22 @@
<!-- components/loading/loading.wxml -->
<!-- 加载状态组件 -->
<view class="loading-container" wx:if="{{show}}">
<view class="loading-spinner">
<view class="spinner-item"></view>
<view class="spinner-item"></view>
<view class="spinner-item"></view>
<view class="spinner-item"></view>
<view class="spinner-item"></view>
<view class="spinner-item"></view>
<view class="spinner-item"></view>
<view class="spinner-item"></view>
</view>
<text class="loading-text">{{text}}</text>
</view>
/**
* @联系作者16768118056
* @描述:(此项目非免费分享)源码百分百可用,搞定毕设不发愁,支持远程调试安装、二次开发、定制、讲解、文档类。
* @访问https://www.notmaker.com/detail/8326a897119d4542896c863a69d7bbe7/gtt20260415查看完整运行演示。
*/

View File

@@ -0,0 +1,61 @@
/* components/loading/loading.wxss */
/* 加载状态样式 */
.loading-container {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 60rpx 0;
}
.loading-spinner {
width: 60rpx;
height: 60rpx;
position: relative;
}
.spinner-item {
width: 100%;
height: 100%;
position: absolute;
left: 0;
top: 0;
}
.spinner-item::before {
content: '';
display: block;
width: 12rpx;
height: 12rpx;
background-color: #667eea;
border-radius: 50%;
margin: 0 auto;
animation: spinner-fade 1.2s infinite ease-in-out;
}
.spinner-item:nth-child(1) { transform: rotate(0deg); animation-delay: -1.1s; }
.spinner-item:nth-child(2) { transform: rotate(45deg); animation-delay: -1s; }
.spinner-item:nth-child(3) { transform: rotate(90deg); animation-delay: -0.9s; }
.spinner-item:nth-child(4) { transform: rotate(135deg); animation-delay: -0.8s; }
.spinner-item:nth-child(5) { transform: rotate(180deg); animation-delay: -0.7s; }
.spinner-item:nth-child(6) { transform: rotate(225deg); animation-delay: -0.6s; }
.spinner-item:nth-child(7) { transform: rotate(270deg); animation-delay: -0.5s; }
.spinner-item:nth-child(8) { transform: rotate(315deg); animation-delay: -0.4s; }
@keyframes spinner-fade {
0% { opacity: 0.3; }
100% { opacity: 1; }
}
.loading-text {
margin-top: 20rpx;
font-size: 24rpx;
color: #999;
}
/**
* @联系作者16768118056
* @描述:(此项目非免费分享)源码百分百可用,搞定毕设不发愁,支持远程调试安装、二次开发、定制、讲解、文档类。
* @访问https://www.notmaker.com/detail/8326a897119d4542896c863a69d7bbe7/gtt20260415查看完整运行演示。
*/

View File

@@ -0,0 +1,55 @@
// components/tag-list/tag-list.js
// 标签列表组件
Component({
properties: {
tags: {
type: Array,
value: []
},
selected: {
type: Boolean,
value: false
},
max: {
type: Number,
value: 0
}
},
data: {
selectedTags: []
},
methods: {
onTagTap(e) {
const tag = e.currentTarget.dataset.tag
const selectedTags = this.data.selectedTags
const index = selectedTags.findIndex(item => item.id === tag.id)
if (index !== -1) {
selectedTags.splice(index, 1)
} else {
if (this.data.max > 0 && selectedTags.length >= this.data.max) {
wx.showToast({ title: `最多选择${this.data.max}个标签`, icon: 'none' })
return
}
selectedTags.push(tag)
}
this.setData({ selectedTags })
this.triggerEvent('change', { tags: selectedTags })
},
clearAll() {
this.setData({ selectedTags: [] })
this.triggerEvent('change', { tags: [] })
}
}
})
/**
* @联系作者16768118056
* @描述:(此项目非免费分享)源码百分百可用,搞定毕设不发愁,支持远程调试安装、二次开发、定制、讲解、文档类。
* @访问https://www.notmaker.com/detail/8326a897119d4542896c863a69d7bbe7/gtt20260415查看完整运行演示。
*/

View File

@@ -0,0 +1,10 @@
{
"component": true,
"usingComponents": {}
}
/**
* @16768118056
* @
* @访https://www.notmaker.com/detail/8326a897119d4542896c863a69d7bbe7/gtt20260415查看完整运行演示。
*/

View File

@@ -0,0 +1,20 @@
<!-- components/tag-list/tag-list.wxml -->
<!-- 标签列表组件 -->
<view class="tag-list">
<view
class="tag-item {{selectedTags.length > 0 && selectedTags.findIndex(t => t.id === item.id) !== -1 ? 'selected' : ''}}"
wx:for="{{tags}}"
wx:key="id"
bindtap="onTagTap"
data-tag="{{item}}"
>
<text>{{item.name}}</text>
</view>
</view>
/**
* @联系作者16768118056
* @描述:(此项目非免费分享)源码百分百可用,搞定毕设不发愁,支持远程调试安装、二次开发、定制、讲解、文档类。
* @访问https://www.notmaker.com/detail/8326a897119d4542896c863a69d7bbe7/gtt20260415查看完整运行演示。
*/

View File

@@ -0,0 +1,29 @@
/* components/tag-list/tag-list.wxss */
/* 标签列表样式 */
.tag-list {
display: flex;
flex-wrap: wrap;
gap: 16rpx;
}
.tag-item {
padding: 12rpx 24rpx;
font-size: 26rpx;
color: #666;
background-color: #f5f5f5;
border-radius: 28rpx;
border: 2rpx solid transparent;
}
.tag-item.selected {
color: #667eea;
background-color: rgba(102, 126, 234, 0.1);
border-color: #667eea;
}
/**
* @联系作者16768118056
* @描述:(此项目非免费分享)源码百分百可用,搞定毕设不发愁,支持远程调试安装、二次开发、定制、讲解、文档类。
* @访问https://www.notmaker.com/detail/8326a897119d4542896c863a69d7bbe7/gtt20260415查看完整运行演示。
*/

View File

@@ -0,0 +1,58 @@
// components/user-card/user-card.js
// 用户卡片组件
Component({
properties: {
user: {
type: Object,
value: {}
},
showFollow: {
type: Boolean,
value: true
}
},
data: {
isFollowing: false
},
lifetimes: {
attached() {
if (this.data.user) {
this.setData({ isFollowing: this.data.user.isFollowing || false })
}
}
},
methods: {
onTap() {
const user = this.data.user
if (user && user.id) {
wx.navigateTo({
url: `/pages/user-profile/user-profile?userId=${user.id}`
})
}
},
onFollow(e) {
e.stopPropagation()
const user = this.data.user
if (!user || !user.id) return
const isFollowing = !this.data.isFollowing
this.setData({ isFollowing })
this.triggerEvent('follow', {
userId: user.id,
isFollowing
})
}
}
})
/**
* @联系作者16768118056
* @描述:(此项目非免费分享)源码百分百可用,搞定毕设不发愁,支持远程调试安装、二次开发、定制、讲解、文档类。
* @访问https://www.notmaker.com/detail/8326a897119d4542896c863a69d7bbe7/gtt20260415查看完整运行演示。
*/

View File

@@ -0,0 +1,10 @@
{
"component": true,
"usingComponents": {}
}
/**
* @16768118056
* @
* @访https://www.notmaker.com/detail/8326a897119d4542896c863a69d7bbe7/gtt20260415查看完整运行演示。
*/

View File

@@ -0,0 +1,24 @@
<!-- components/user-card/user-card.wxml -->
<!-- 用户卡片组件 -->
<view class="user-card" bindtap="onTap">
<image class="avatar" src="{{user.avatar || '/static/images/default-avatar.png'}}" />
<view class="info">
<text class="nickname">{{user.nickname}}</text>
<text class="bio" wx:if="{{user.bio}}">{{user.bio}}</text>
<view class="stats" wx:if="{{user.articleCount || user.favoriteCount || user.followerCount}}">
<text class="stat">文章 {{user.articleCount || 0}}</text>
<text class="stat">粉丝 {{user.followerCount || 0}}</text>
<text class="stat">获赞 {{user.likeCount || 0}}</text>
</view>
</view>
<button class="follow-btn {{isFollowing ? 'following' : ''}}" wx:if="{{showFollow}}" bindtap="onFollow">
{{isFollowing ? '已关注' : '关注'}}
</button>
</view>
/**
* @联系作者16768118056
* @描述:(此项目非免费分享)源码百分百可用,搞定毕设不发愁,支持远程调试安装、二次开发、定制、讲解、文档类。
* @访问https://www.notmaker.com/detail/8326a897119d4542896c863a69d7bbe7/gtt20260415查看完整运行演示。
*/

View File

@@ -0,0 +1,70 @@
/* components/user-card/user-card.wxss */
/* 用户卡片样式 */
.user-card {
display: flex;
align-items: center;
padding: 24rpx;
background-color: #fff;
border-radius: 16rpx;
}
.avatar {
width: 96rpx;
height: 96rpx;
border-radius: 48rpx;
margin-right: 20rpx;
flex-shrink: 0;
}
.info {
flex: 1;
display: flex;
flex-direction: column;
min-width: 0;
}
.nickname {
font-size: 30rpx;
font-weight: bold;
color: #333;
margin-bottom: 8rpx;
}
.bio {
font-size: 24rpx;
color: #999;
margin-bottom: 12rpx;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.stats {
display: flex;
gap: 20rpx;
}
.stat {
font-size: 22rpx;
color: #999;
}
.follow-btn {
padding: 12rpx 28rpx;
font-size: 26rpx;
color: #fff;
background-color: #667eea;
border-radius: 32rpx;
}
.follow-btn.following {
color: #999;
background-color: #f5f5f5;
}
/**
* @联系作者16768118056
* @描述:(此项目非免费分享)源码百分百可用,搞定毕设不发愁,支持远程调试安装、二次开发、定制、讲解、文档类。
* @访问https://www.notmaker.com/detail/8326a897119d4542896c863a69d7bbe7/gtt20260415查看完整运行演示。
*/