fix(fe): 按钮长文案撑爆 + 用户主页帖子没样式 + 首字头像空白

三个都是我上一轮引入或没顾上的。

## 「Pro 会员(即将开放)」把按钮撑爆

.btn 同时用了 flex 垂直居中和 line-height:96rpx。flex 已经负责居中了,
line-height 纯属多余,而且文案一换行就被这个固定行高顶到按钮外面——
「我的」页底部那颗按钮正好触发。改成 min-height + line-height:1.3,
按钮能随文案长高,短文案的高度不变。

## 用户主页的帖子没有任何样式

.post-card 那一整套只写在 pages/community/community.wxss 里,而页面级
wxss 不跨页生效,所以用户主页上的帖子退化成裸文本。整块提到 app.wxss。
顺带给主页的帖子补上作者行和标签,和社区保持一致。

## 头像圈里空白

WXML 表达式不支持字符串下标,{{nickname[0]}} 求值为空。改成在 js 里
slice 好再传给模板。

另外确认一下:粉丝列表本来就能点进主页——关注和粉丝共用 pages/relations
一个页面,每行都绑了 goUser,和关注列表走同一个 pages/user 主页。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Blizzard
2026-07-29 17:19:18 +08:00
parent 25f655a6fc
commit 3ad1516aa4
7 changed files with 123 additions and 112 deletions
-34
View File
@@ -1,39 +1,5 @@
.compose-card{margin-bottom:var(--sp-4)}
.post-card{background:#fff;border-radius:var(--r-lg);box-shadow:var(--sd-1);padding:var(--sp-4);margin-bottom:var(--sp-4)}
.post-head{display:flex;align-items:center;gap:var(--sp-3);margin-bottom:var(--sp-3)}
.post-avatar{
width:80rpx;height:80rpx;border-radius:var(--r-sm);background:var(--primary-soft);
display:flex;align-items:center;justify-content:center;font-size:40rpx;flex:none;
}
.post-user{flex:1;min-width:0}
.pu-b{font-size:var(--fs-md);display:block;font-weight:var(--fw-b)}
.ai-tag{
display:inline-block;margin-left:var(--sp-1);padding:0 var(--sp-1);border-radius:var(--r-xs);
background:var(--blue-soft);color:var(--blue-ink);font-size:var(--fs-cap);font-weight:var(--fw-b);vertical-align:1rpx;
}
.pu-s{font-size:var(--fs-sm);color:var(--muted)}
.post-content{font-size:var(--fs-md);line-height:1.62;color:var(--text-2);margin-bottom:var(--sp-3)}
.photo-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:var(--sp-1);margin-bottom:var(--sp-3)}
.photo-tile{
aspect-ratio:1;border-radius:var(--r-sm);background:var(--primary-soft);
display:flex;align-items:center;justify-content:center;font-size:56rpx;
}
/* 三等分。原来是 space-around 排三个宽度不一的项,点赞数一变宽度就跳 */
.post-actions{display:flex;border-top:1rpx solid var(--line);padding-top:var(--sp-2)}
.pa-btn{
flex:1;height:72rpx;
display:flex;align-items:center;justify-content:center;gap:var(--sp-1);
color:var(--muted);font-weight:var(--fw);font-size:var(--fs-sm);
}
.pa-n{line-height:1}
.pa-btn.liked{color:var(--red-ink)}
.pa-btn:active{background:var(--surface-2);border-radius:var(--r-sm)}
/* 分享用微信原生 open-type=share,得抹掉 button 默认外观 */
.pa-share{background:transparent;border:none;padding:0;margin:0;line-height:inherit}
.pa-share::after{border:none}
/* 关注按钮 */
.follow-btn{
+3 -1
View File
@@ -12,7 +12,9 @@ Page({
api
.relations(this.data.uid, this.data.kind, page)
.then((res) => {
const merged = page === 1 ? res.list || [] : this.data.list.concat(res.list || []);
// WXML 表达式不支持字符串下标,首字母得在这里算好
const list = (res.list || []).map((u) => ({ ...u, initial: (u.nickname || '?').slice(0, 1) }));
const merged = page === 1 ? list : this.data.list.concat(list);
this.setData({ list: merged, page, loaded: true, hasMore: merged.length < (res.total || 0) });
})
.catch((e) => {
+1 -1
View File
@@ -6,7 +6,7 @@
<view wx:for="{{list}}" wx:key="id" class="rel" bindtap="goUser" data-id="{{item.id}}">
<view class="rel-av">
<image wx:if="{{item.avatar_url}}" class="rel-av-img" src="{{item.avatar_url}}" mode="aspectFill"></image>
<block wx:else>{{item.nickname[0]}}</block>
<block wx:else>{{item.initial}}</block>
</view>
<view class="rel-name">{{item.nickname}}<text wx:if="{{item.is_bot}}" class="ai-tag">AI</text></view>
<view wx:if="{{!item.is_self}}" class="follow-btn {{item.followed ? 'on' : ''}}"
+18 -2
View File
@@ -1,6 +1,8 @@
const api = require('../../utils/api.js');
const { toastErr } = require('../../utils/ui.js');
const TAG_CLASS = { 求助: 'warn', 经验: 'blue', 精选: 'purple', 避坑: 'red', 晒宠: '' };
function fmtAgo(iso) {
if (!iso) return '';
const d = new Date(iso);
@@ -26,7 +28,12 @@ Page({
loadCard() {
api
.userCard(this.data.uid)
.then((card) => this.setData({ card, loading: false }))
.then((card) =>
this.setData({
card: { ...card, initial: (card.nickname || '?').slice(0, 1) },
loading: false,
}),
)
.catch((e) => {
this.setData({ loading: false });
toastErr(e);
@@ -36,7 +43,16 @@ Page({
api
.userPosts(this.data.uid, page)
.then((res) => {
const list = (res.list || []).map((p) => ({ ...p, timeText: fmtAgo(p.created_at) }));
const list = (res.list || []).map((p) => {
const tag = (p.tags || [])[0] || '';
return {
...p,
timeText: fmtAgo(p.created_at),
author_emoji: p.author_emoji || '🐾',
tag,
tagClass: TAG_CLASS[tag] || '',
};
});
const merged = page === 1 ? list : this.data.posts.concat(list);
this.setData({ posts: merged, page, hasMore: merged.length < (res.total || 0) });
})
+7 -2
View File
@@ -12,7 +12,7 @@ module.exports.isUrl = function (s) { return s && s.indexOf('http') === 0; }
<view class="card u-head">
<view class="u-av">
<image wx:if="{{card.avatar_url}}" class="u-av-img" src="{{card.avatar_url}}" mode="aspectFill"></image>
<block wx:else>{{card.nickname[0]}}</block>
<block wx:else>{{card.initial}}</block>
</view>
<view class="u-name">{{card.nickname}}<text wx:if="{{card.is_bot}}" class="ai-tag">AI</text></view>
@@ -33,7 +33,12 @@ module.exports.isUrl = function (s) { return s && s.indexOf('http') === 0; }
<view wx:for="{{posts}}" wx:key="id" class="post-card">
<view class="post-head">
<view class="pu-s">{{item.timeText}}</view>
<view class="post-avatar">{{item.author_emoji}}</view>
<view class="post-user">
<view class="pu-b">{{item.author_name}}</view>
<view class="pu-s">{{item.timeText}}</view>
</view>
<view wx:if="{{item.tag}}" class="tag {{item.tagClass}}">{{item.tag}}</view>
</view>
<view class="post-content">{{item.content}}</view>
<view wx:if="{{item.images.length}}" class="photo-grid">