删除不再使用的文件和配置,优化项目结构以提升可维护性;新增环境变量配置示例,更新 Docker 和部署相关文件以支持灵活的端口设置;重构数据库连接逻辑,增强错误处理和配置管理,确保更好的兼容性和稳定性。

This commit is contained in:
2026-02-02 18:16:15 +08:00
parent 6dcc6a4709
commit 8eec1ab78c
126 changed files with 12536 additions and 20384 deletions

View File

@@ -1,81 +1,49 @@
/**
* Soul创业派对 - 关于作者页
* 开发: 卡若
*/
const app = getApp()
Page({
data: {
statusBarHeight: 44,
author: {
navBarHeight: 88,
authorInfo: {
name: '卡若',
avatar: 'K',
title: 'Soul派对房主理人 · 私域运营专家',
bio: '每天早上6点到9点在Soul派对房分享真实的创业故事。专注私域运营与项目变现用"云阿米巴"模式帮助创业者构建可持续的商业体系。本书记录了62个真实商业案例涵盖电商、内容、传统行业等多个领域。',
stats: [
{ label: '商业案例', value: '62' },
{ label: '连续直播', value: '365天' },
{ label: '派对分享', value: '1000+' }
],
// 联系方式已移至后台配置
contact: null,
highlights: [
'5年私域运营经验',
'帮助100+品牌从0到1增长',
'连续创业者,擅长商业模式设计'
]
description: '连续创业者,私域运营专家',
liveTime: '06:00-09:00',
platform: 'Soul派对房'
},
bookInfo: {
title: '一场Soul的创业实验',
totalChapters: 62,
parts: [
{ name: '真实的人', chapters: 10 },
{ name: '真实的行业', chapters: 15 },
{ name: '真实的错误', chapters: 9 },
{ name: '真实的赚钱', chapters: 20 },
{ name: '真实的社会', chapters: 9 }
],
price: 9.9
}
authorInitial: '卡',
stats: [
{ value: '55+', label: '真实案例', icon: '📖' },
{ value: '10000+', label: '派对房听众', icon: '👥' },
{ value: '15年', label: '创业经验', icon: '🏆' },
{ value: '3000万', label: '最高年流水', icon: '📈' }
],
milestones: [
{ year: '2007-2014', event: '游戏电竞创业历程,从魔兽世界代练起步' },
{ year: '2015', event: '转型电商,做天猫虚拟充值' },
{ year: '2016-2019', event: '深耕电商领域团队扩张到200人年流水3000万' },
{ year: '2019-2020', event: '公司变故,重整旗鼓' },
{ year: '2020-2025', event: '电竞、地摊、大健康、私域多领域探索' },
{ year: '2025.10.15', event: '在Soul派对房开启每日分享记录真实商业案例' }
]
},
onLoad() {
this.setData({
statusBarHeight: app.globalData.statusBarHeight
})
this.loadBookStats()
},
// 加载书籍统计
async loadBookStats() {
try {
const res = await app.request('/api/book/stats')
if (res && res.success) {
this.setData({
'bookInfo.totalChapters': res.data?.totalChapters || 62,
'author.stats': [
{ label: '商业案例', value: String(res.data?.totalChapters || 62) },
{ label: '连续直播', value: '365天' },
{ label: '派对分享', value: '1000+' }
]
})
}
} catch (e) {
console.log('[About] 加载书籍统计失败,使用默认值')
}
const statusBarHeight = app.globalData.statusBarHeight || 44
const navBarHeight = app.globalData.navBarHeight || (statusBarHeight + 44)
const authorInfo = this.data.authorInfo
const authorInitial = authorInfo.name ? authorInfo.name.charAt(0) : '卡'
this.setData({ statusBarHeight, navBarHeight, authorInitial })
},
// 联系方式功能已禁用
copyWechat() {
wx.showToast({ title: '请在派对房联系作者', icon: 'none' })
},
callPhone() {
wx.showToast({ title: '请在派对房联系作者', icon: 'none' })
},
// 返回
goBack() {
wx.navigateBack()
wx.navigateBack({ fail: () => wx.switchTab({ url: '/pages/index/index' }) })
},
onJoinParty() {
wx.showToast({
title: '请关注小程序或联系客服加入派对群',
icon: 'none',
duration: 2500
})
}
})

View File

@@ -1,4 +1,4 @@
{
"usingComponents": {},
"navigationStyle": "custom"
"navigationBarTitleText": "关于作者",
"usingComponents": {}
}

View File

@@ -1,75 +1,54 @@
<!--关于作者-->
<view class="page">
<view class="nav-bar" style="padding-top: {{statusBarHeight}}px;">
<view class="nav-back" bindtap="goBack">←</view>
<text class="nav-title">关于作者</text>
<view class="nav-placeholder"></view>
<view class="nav-bar" style="height: {{navBarHeight || (statusBarHeight + 44)}}px; padding-top: {{statusBarHeight || 44}}px; box-sizing: border-box;">
<view class="nav-inner safe-header-right">
<view class="nav-back" bindtap="goBack">← 返回</view>
<text class="nav-title">关于作者</text>
</view>
</view>
<view style="height: {{statusBarHeight + 44}}px;"></view>
<view class="content">
<!-- 作者信息卡片 -->
<view class="author-card">
<view class="author-avatar">{{author.avatar}}</view>
<text class="author-name">{{author.name}}</text>
<text class="author-title">{{author.title}}</text>
<text class="author-bio">{{author.bio}}</text>
<!-- 统计数据 -->
<view class="stats-row">
<view class="stat-item" wx:for="{{author.stats}}" wx:key="label">
<text class="stat-value">{{item.value}}</text>
<text class="stat-label">{{item.label}}</text>
</view>
<view class="main">
<view class="card author-card">
<view class="author-avatar">{{authorInitial}}</view>
<text class="author-name">{{authorInfo.name}}</text>
<text class="author-desc">{{authorInfo.description}}</text>
<view class="author-tags">
<text class="tag brand">🕐 每日 {{authorInfo.liveTime}}</text>
<text class="tag">💬 {{authorInfo.platform}}</text>
</view>
<!-- 亮点标签 -->
<view class="highlights" wx:if="{{author.highlights}}">
<view class="highlight-tag" wx:for="{{author.highlights}}" wx:key="*this">
<text class="tag-icon">✓</text>
<text>{{item}}</text>
</view>
<view class="stats">
<view class="stat-item" wx:for="{{stats}}" wx:key="label">
<text class="stat-icon">{{item.icon}}</text>
<text class="stat-value">{{item.value}}</text>
<text class="stat-label">{{item.label}}</text>
</view>
</view>
<view class="card section">
<text class="section-title">关于这本书</text>
<view class="section-paras">
<text class="section-para">"这不是一本教你成功的鸡汤书。"</text>
<text class="section-para">这是我每天早上6点到9点在Soul派对房和几百个陌生人分享的真实故事。</text>
<text class="section-para brand">"社会不是靠努力,是靠洞察与选择。"</text>
</view>
</view>
<view class="card section">
<text class="section-title">创业历程</text>
<view class="timeline">
<view class="timeline-item" wx:for="{{milestones}}" wx:key="year">
<view class="timeline-dot-wrap">
<view class="timeline-dot"></view>
<view class="timeline-line" wx:if="{{index < milestones.length - 1}}"></view>
</view>
<view class="timeline-content">
<text class="milestone-year">{{item.year}}</text>
<text class="milestone-event">{{item.event}}</text>
</view>
</view>
</view>
</view>
<!-- 书籍信息 -->
<view class="book-info-card" wx:if="{{bookInfo}}">
<text class="card-title">📚 {{bookInfo.title}}</text>
<view class="book-stats">
<view class="book-stat">
<text class="book-stat-value">{{bookInfo.totalChapters}}</text>
<text class="book-stat-label">篇章节</text>
</view>
<view class="book-stat">
<text class="book-stat-value">5</text>
<text class="book-stat-label">大篇章</text>
</view>
<view class="book-stat">
<text class="book-stat-value">¥{{bookInfo.price}}</text>
<text class="book-stat-label">全书价格</text>
</view>
</view>
<view class="parts-list">
<view class="part-item" wx:for="{{bookInfo.parts}}" wx:key="name">
<text class="part-name">{{item.name}}</text>
<text class="part-chapters">{{item.chapters}}节</text>
</view>
</view>
</view>
<!-- 联系方式 - 引导到Soul派对房 -->
<view class="contact-card">
<text class="card-title">联系作者</text>
<view class="contact-item">
<text class="contact-icon">🎉</text>
<view class="contact-info">
<text class="contact-label">Soul派对房</text>
<text class="contact-value">每天早上6-9点开播</text>
</view>
</view>
<view class="contact-tip">
<text>在Soul App搜索"创业实验"或"卡若",加入派对房直接交流</text>
</view>
<view class="card join-card">
<text class="join-title">想听更多真实故事?</text>
<text class="join-desc">每天早上6-9点卡若在Soul派对房免费分享</text>
<view class="btn-join" bindtap="onJoinParty">💬 加入派对群</view>
</view>
</view>
</view>

View File

@@ -1,40 +1,35 @@
.page { min-height: 100vh; background: #000; }
.nav-bar { position: fixed; top: 0; left: 0; right: 0; z-index: 100; background: rgba(0,0,0,0.9); backdrop-filter: blur(40rpx); display: flex; align-items: center; justify-content: space-between; padding: 0 32rpx; height: 88rpx; }
.nav-back { width: 72rpx; height: 72rpx; background: #1c1c1e; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-size: 32rpx; color: #fff; }
.nav-title { font-size: 36rpx; font-weight: 600; color: #00CED1; }
.nav-placeholder { width: 72rpx; }
.content { padding: 32rpx; }
.author-card { background: linear-gradient(135deg, #1c1c1e 0%, #2c2c2e 100%); border-radius: 32rpx; padding: 48rpx; text-align: center; margin-bottom: 24rpx; border: 2rpx solid rgba(0,206,209,0.2); }
.author-avatar { width: 160rpx; height: 160rpx; border-radius: 50%; background: linear-gradient(135deg, #00CED1, #20B2AA); display: flex; align-items: center; justify-content: center; margin: 0 auto 24rpx; font-size: 64rpx; color: #fff; font-weight: 700; border: 4rpx solid rgba(0,206,209,0.3); }
.author-name { font-size: 40rpx; font-weight: 700; color: #fff; display: block; margin-bottom: 8rpx; }
.author-title { font-size: 26rpx; color: #00CED1; display: block; margin-bottom: 24rpx; }
.author-bio { font-size: 26rpx; color: rgba(255,255,255,0.7); line-height: 1.8; display: block; margin-bottom: 32rpx; }
.stats-row { display: flex; justify-content: space-around; padding-top: 32rpx; border-top: 2rpx solid rgba(255,255,255,0.1); }
.stat-item { text-align: center; }
.stat-value { font-size: 36rpx; font-weight: 700; color: #00CED1; display: block; }
.stat-label { font-size: 22rpx; color: rgba(255,255,255,0.5); }
.contact-card { background: #1c1c1e; border-radius: 32rpx; padding: 32rpx; }
.card-title { font-size: 28rpx; font-weight: 600; color: #fff; display: block; margin-bottom: 24rpx; }
.contact-item { display: flex; align-items: center; gap: 24rpx; padding: 24rpx; background: rgba(255,255,255,0.05); border-radius: 16rpx; margin-bottom: 16rpx; }
.contact-item:last-child { margin-bottom: 0; }
.contact-icon { font-size: 40rpx; }
.contact-info { flex: 1; }
.contact-label { font-size: 22rpx; color: rgba(255,255,255,0.5); display: block; }
.contact-value { font-size: 28rpx; color: #fff; }
.contact-btn { padding: 12rpx 24rpx; background: rgba(0,206,209,0.2); color: #00CED1; font-size: 24rpx; border-radius: 16rpx; }
/* 亮点标签 */
.highlights { display: flex; flex-wrap: wrap; gap: 16rpx; margin-top: 32rpx; padding-top: 24rpx; border-top: 2rpx solid rgba(255,255,255,0.1); justify-content: center; }
.highlight-tag { display: flex; align-items: center; gap: 8rpx; padding: 12rpx 24rpx; background: rgba(0,206,209,0.15); border-radius: 24rpx; font-size: 24rpx; color: rgba(255,255,255,0.8); }
.tag-icon { color: #00CED1; font-size: 22rpx; }
/* 书籍信息卡片 */
.book-info-card { background: #1c1c1e; border-radius: 32rpx; padding: 32rpx; margin-bottom: 24rpx; }
.book-stats { display: flex; justify-content: space-around; padding: 24rpx 0; margin: 16rpx 0; background: rgba(0,0,0,0.3); border-radius: 16rpx; }
.book-stat { text-align: center; }
.book-stat-value { font-size: 36rpx; font-weight: 700; color: #FFD700; display: block; }
.book-stat-label { font-size: 22rpx; color: rgba(255,255,255,0.5); }
.parts-list { display: flex; flex-wrap: wrap; gap: 12rpx; margin-top: 16rpx; }
.part-item { display: flex; align-items: center; gap: 8rpx; padding: 12rpx 20rpx; background: rgba(255,255,255,0.05); border-radius: 12rpx; }
.part-name { font-size: 24rpx; color: rgba(255,255,255,0.8); }
.part-chapters { font-size: 22rpx; color: #00CED1; }
.page { min-height: 100vh; background: #000; padding-bottom: 80rpx; }
.nav-bar { background: rgba(0,0,0,0.9); border-bottom: 2rpx solid rgba(255,255,255,0.05); box-sizing: border-box; display: flex; flex-direction: column; justify-content: flex-end; }
.nav-inner { display: flex; align-items: center; padding: 0 24rpx; height: 88rpx; min-height: 44px; flex-shrink: 0; }
.nav-back { font-size: 32rpx; color: #00CED1; padding: 16rpx 0; }
.nav-title { flex: 1; text-align: center; font-size: 34rpx; color: #00CED1; }
.main { padding: 32rpx; }
.card { border-radius: 32rpx; padding: 40rpx; margin-bottom: 24rpx; background: linear-gradient(135deg, #1c1c1e 0%, #2c2c2e 100%); border: 2rpx solid rgba(0,206,209,0.2); }
.author-card { display: flex; flex-direction: column; align-items: center; text-align: center; }
.author-avatar { width: 160rpx; height: 160rpx; border-radius: 50%; background: linear-gradient(135deg, #00CED1 0%, #20B2AA 100%); display: flex; align-items: center; justify-content: center; font-size: 60rpx; font-weight: 700; color: #fff; margin-bottom: 24rpx; }
.author-name { font-size: 40rpx; font-weight: 700; color: #fff; display: block; }
.author-desc { font-size: 28rpx; color: rgba(255,255,255,0.5); margin-top: 8rpx; display: block; }
.author-tags { display: flex; gap: 16rpx; margin-top: 24rpx; justify-content: center; flex-wrap: wrap; }
.tag { font-size: 22rpx; padding: 12rpx 24rpx; border-radius: 32rpx; background: rgba(255,255,255,0.05); color: rgba(255,255,255,0.5); }
.tag.brand { background: rgba(0,206,209,0.1); color: #00CED1; }
.stats { display: grid; grid-template-columns: repeat(4, 1fr); gap: 16rpx; margin-bottom: 24rpx; }
.stat-item { padding: 24rpx; border-radius: 24rpx; background: #1c1c1e; border: 2rpx solid rgba(255,255,255,0.05); text-align: center; }
.stat-icon { font-size: 40rpx; display: block; margin-bottom: 12rpx; opacity: 0.9; }
.stat-value { font-size: 32rpx; font-weight: 700; color: #fff; display: block; }
.stat-label { font-size: 20rpx; color: rgba(255,255,255,0.4); }
.section-title { font-size: 32rpx; font-weight: 600; color: #fff; display: block; margin-bottom: 16rpx; }
.section-paras { }
.section-para { font-size: 28rpx; color: rgba(255,255,255,0.8); line-height: 1.7; display: block; margin-bottom: 16rpx; }
.section-para.brand { color: #00CED1; font-weight: 500; }
.timeline { }
.timeline-item { display: flex; gap: 24rpx; }
.timeline-dot-wrap { display: flex; flex-direction: column; align-items: center; flex-shrink: 0; }
.timeline-dot { width: 16rpx; height: 16rpx; border-radius: 50%; background: #00CED1; }
.timeline-line { width: 4rpx; flex: 1; min-height: 24rpx; background: rgba(255,255,255,0.2); margin-top: 8rpx; }
.timeline-content { flex: 1; padding-bottom: 24rpx; }
.milestone-year { font-size: 28rpx; color: #00CED1; font-weight: 600; display: block; margin-bottom: 8rpx; }
.milestone-event { font-size: 26rpx; color: rgba(255,255,255,0.7); display: block; line-height: 1.5; }
.join-card { background: linear-gradient(90deg, rgba(0,206,209,0.1) 0%, rgba(32,178,170,0.05) 100%); border-color: rgba(0,206,209,0.2); text-align: center; }
.join-title { font-size: 32rpx; font-weight: 600; color: #fff; display: block; margin-bottom: 8rpx; }
.join-desc { font-size: 28rpx; color: rgba(255,255,255,0.5); display: block; margin-bottom: 24rpx; }
.btn-join { width: 100%; padding: 24rpx; border-radius: 24rpx; background: #00CED1; color: #fff; font-size: 30rpx; font-weight: 500; text-align: center; }