更新小程序图标组件,替换传统 emoji 为 iconfont 字体图标,提升视觉一致性。调整多个页面以使用新图标组件,优化用户界面体验。修复开发环境的 API 地址配置,并启用 URL 检查以增强安全性。删除不再使用的 iconfont CSS 文件,改为动态加载字体。增加动态加载 iconfont 的逻辑,确保在小程序中正确显示图标。

This commit is contained in:
Alex-larget
2026-03-18 17:01:26 +08:00
parent c55e54efbd
commit f8d7858825
25 changed files with 289 additions and 503 deletions

View File

@@ -14,8 +14,8 @@ App({
globalData: {
// API 基础地址:开发时修改下面一行切换环境
// baseUrl: "https://soulapi.quwanzhi.com",
baseUrl: 'http://localhost:8080', // 开发
// baseUrl: 'https://souldev.quwanzhi.com', // 测试
// baseUrl: 'http://localhost:8080', // 开发
baseUrl: 'https://souldev.quwanzhi.com', // 测试
// 小程序配置 - 真实AppID
appId: DEFAULT_APP_ID,
@@ -84,6 +84,9 @@ App({
onLaunch(options) {
this.globalData.readSectionIds = wx.getStorageSync('readSectionIds') || []
// 加载 iconfont字体图标。注意小程序不支持在 wxss 里用本地 @font-face 引用字体文件,
// 需使用 loadFontFace 动态加载(字体文件建议走 https CDN
this.loadIconFont()
// 获取系统信息
this.getSystemInfo()
@@ -111,6 +114,23 @@ App({
// 处理分享参数(推荐码绑定)
this.handleReferralCode(options)
},
// 动态加载 iconfont避免本地 @font-face 触发 do-not-use-local-path
loadIconFont() {
if (!wx.loadFontFace) return
// 来自 iconfont 项目Project id 5142223
// 线上/真机需把 at.alicdn.com 加入「downloadFile 合法域名」
const urlWoff2 = 'https://at.alicdn.com/t/c/font_5142223_1sq6pv9vvbt.woff2'
wx.loadFontFace({
family: 'iconfont',
source: `url("${urlWoff2}")`,
global: true,
success: () => {},
fail: (e) => {
console.warn('[Iconfont] loadFontFace failed:', e)
},
})
},
// 小程序显示时:处理分享参数、检测更新、刷新审核模式(从后台切回时)
onShow(options) {

View File

@@ -1,434 +0,0 @@
@font-face {
font-family: "iconfont"; /* Project id 5142223 */
src: url('//at.alicdn.com/t/c/font_5142223_1sq6pv9vvbt.woff2?t=1773819902347') format('woff2'),
url('//at.alicdn.com/t/c/font_5142223_1sq6pv9vvbt.woff?t=1773819902347') format('woff'),
url('//at.alicdn.com/t/c/font_5142223_1sq6pv9vvbt.ttf?t=1773819902347') format('truetype');
}
.iconfont {
font-family: "iconfont" !important;
font-size: 16px;
font-style: normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.icon-wallet:before {
content: "\e6c8";
}
.icon-gift:before {
content: "\e6c9";
}
.icon-zap1:before {
content: "\e75c";
}
.icon-user:before {
content: "\e6b9";
}
.icon-upload:before {
content: "\e6ba";
}
.icon-work:before {
content: "\e6bb";
}
.icon-training:before {
content: "\e6bc";
}
.icon-warning:before {
content: "\e6bd";
}
.icon-zoom-in:before {
content: "\e6be";
}
.icon-zoom-out:before {
content: "\e6bf";
}
.icon-arrow-left-bold:before {
content: "\e6c1";
}
.icon-arrow-up-bold:before {
content: "\e6c2";
}
.icon-close-bold:before {
content: "\e6c3";
}
.icon-arrow-down-bold:before {
content: "\e6c4";
}
.icon-minus-bold:before {
content: "\e6c5";
}
.icon-arrow-right-bold:before {
content: "\e6c6";
}
.icon-select-bold:before {
content: "\e6c7";
}
.icon-money-wallet:before {
content: "\e833";
}
.icon-book-open:before {
content: "\e993";
}
.icon-biaoshilei_yonghuzu:before {
content: "\e61b";
}
.icon-add:before {
content: "\e664";
}
.icon-add-circle:before {
content: "\e665";
}
.icon-adjust:before {
content: "\e666";
}
.icon-arrow-up-circle:before {
content: "\e667";
}
.icon-arrow-right-circle:before {
content: "\e668";
}
.icon-arrow-down:before {
content: "\e669";
}
.icon-ashbin:before {
content: "\e66a";
}
.icon-arrow-right:before {
content: "\e66b";
}
.icon-browse:before {
content: "\e66c";
}
.icon-bottom:before {
content: "\e66d";
}
.icon-back:before {
content: "\e66e";
}
.icon-bad:before {
content: "\e66f";
}
.icon-arrow-left-circle:before {
content: "\e670";
}
.icon-camera:before {
content: "\e671";
}
.icon-chart-bar:before {
content: "\e672";
}
.icon-attachment:before {
content: "\e673";
}
.icon-code:before {
content: "\e674";
}
.icon-close:before {
content: "\e675";
}
.icon-check-item:before {
content: "\e676";
}
.icon-calendar:before {
content: "\e677";
}
.icon-comment:before {
content: "\e678";
}
.icon-complete:before {
content: "\e679";
}
.icon-direction-down:before {
content: "\e67a";
}
.icon-direction-down-circle:before {
content: "\e67b";
}
.icon-direction-right:before {
content: "\e67c";
}
.icon-direction-up:before {
content: "\e67d";
}
.icon-discount:before {
content: "\e67e";
}
.icon-direction-left:before {
content: "\e67f";
}
.icon-download:before {
content: "\e680";
}
.icon-electronics:before {
content: "\e681";
}
.icon-elipsis:before {
content: "\e682";
}
.icon-export:before {
content: "\e683";
}
.icon-explain:before {
content: "\e684";
}
.icon-edit:before {
content: "\e685";
}
.icon-eye-close:before {
content: "\e686";
}
.icon-email:before {
content: "\e687";
}
.icon-error:before {
content: "\e688";
}
.icon-favorite:before {
content: "\e689";
}
.icon-file-common:before {
content: "\e68a";
}
.icon-file-delete:before {
content: "\e68b";
}
.icon-file-add:before {
content: "\e68c";
}
.icon-film:before {
content: "\e68d";
}
.icon-fabulous:before {
content: "\e68e";
}
.icon-file:before {
content: "\e68f";
}
.icon-folder-close:before {
content: "\e690";
}
.icon-filter:before {
content: "\e691";
}
.icon-good:before {
content: "\e692";
}
.icon-hide:before {
content: "\e693";
}
.icon-home:before {
content: "\e694";
}
.icon-file-open:before {
content: "\e695";
}
.icon-forward:before {
content: "\e696";
}
.icon-import:before {
content: "\e697";
}
.icon-layers:before {
content: "\e698";
}
.icon-lock:before {
content: "\e699";
}
.icon-map:before {
content: "\e69a";
}
.icon-menu:before {
content: "\e69b";
}
.icon-help:before {
content: "\e69c";
}
.icon-minus-circle:before {
content: "\e69d";
}
.icon-notification:before {
content: "\e69e";
}
.icon-more:before {
content: "\e69f";
}
.icon-mobile-phone:before {
content: "\e6a0";
}
.icon-minus:before {
content: "\e6a1";
}
.icon-navigation:before {
content: "\e6a2";
}
.icon-prompt:before {
content: "\e6a3";
}
.icon-refresh:before {
content: "\e6a4";
}
.icon-run-up:before {
content: "\e6a5";
}
.icon-picture:before {
content: "\e6a6";
}
.icon-run-in:before {
content: "\e6a7";
}
.icon-pin:before {
content: "\e6a8";
}
.icon-save:before {
content: "\e6a9";
}
.icon-search:before {
content: "\e6aa";
}
.icon-share:before {
content: "\e6ab";
}
.icon-scanning:before {
content: "\e6ac";
}
.icon-security:before {
content: "\e6ad";
}
.icon-sign-out:before {
content: "\e6ae";
}
.icon-select:before {
content: "\e6af";
}
.icon-stop:before {
content: "\e6b0";
}
.icon-success:before {
content: "\e6b1";
}
.icon-switch:before {
content: "\e6b2";
}
.icon-setting:before {
content: "\e6b3";
}
.icon-survey:before {
content: "\e6b4";
}
.icon-time:before {
content: "\e6b5";
}
.icon-telephone:before {
content: "\e6b6";
}
.icon-top:before {
content: "\e6b7";
}
.icon-unlock:before {
content: "\e6b8";
}

View File

@@ -31,7 +31,8 @@ Component({
},
data: {
svgData: ''
svgData: '',
fontGlyph: ''
},
lifetimes: {
@@ -41,6 +42,54 @@ Component({
},
methods: {
// iconfont 映射:将业务 namelucide 风格)映射到 iconfont 的 unicode形如 "\ue6aa"
// 小程序不支持通过 :before { content } 渲染,因此必须直接输出 unicode 字符
getFontGlyph(name) {
const map = {
// 基础高频(来自 static/iconfont.css 的 content 值)
'wallet': '\ue6c8',
'gift': '\ue6c9',
'user': '\ue6b9',
'search': '\ue6aa',
'share': '\ue6ab',
'home': '\ue694',
'lock': '\ue699',
'camera': '\ue671',
'warning': '\ue6bd',
// 箭头/展开
'chevron-left': '\ue6c1',
'chevron-right': '\ue6c6',
'chevron-down': '\ue6c4',
'chevron-up': '\ue6c2',
'arrow-up-right': '\ue6c2',
// 交互/状态
'x': '\ue6c3',
'check': '\ue6c7',
'plus': '\ue664',
'trash-2': '\ue66a',
'pencil': '\ue685',
'zap': '\ue75c',
'info': '\ue69c',
// 语义近似映射iconfont 不一定有同名)
'map-pin': '\ue6a8',
'message-circle': '\ue678',
'smartphone': '\ue6a0',
'refresh-cw': '\ue6a4',
'shield': '\ue6ad',
'star': '\ue689',
'heart': '\ue68e',
// 其他:若 iconfont 里不存在,则继续走 SVG 兜底
'book-open': '\ue993',
'bar-chart': '\ue672',
'clock': '\ue6b5',
}
return map[name] || ''
},
// SVG 图标数据映射Lucide 风格,替换原 emoji
getSvgPath(name) {
const s = '<svg viewBox="0 0 24 24" fill="none" stroke="COLOR" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">'
@@ -96,8 +145,15 @@ Component({
// 更新图标
updateIcon() {
const { name, color } = this.data
const fontGlyph = this.getFontGlyph(name)
let svgString = this.getSvgPath(name)
// 若 iconfont 存在映射,则优先用字体图标;否则走 SVG
if (fontGlyph) {
this.setData({ fontGlyph, svgData: '' })
return
}
if (svgString) {
// 替换颜色占位符
svgString = svgString.replace(/COLOR/g, color)
@@ -106,11 +162,13 @@ Component({
const svgData = `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svgString)}`
this.setData({
svgData: svgData
svgData: svgData,
fontGlyph: ''
})
} else {
this.setData({
svgData: ''
svgData: '',
fontGlyph: ''
})
}
}

View File

@@ -1,5 +1,11 @@
<!-- components/icon/icon.wxml -->
<view class="icon icon-{{name}} {{customClass}}" style="width: {{size}}rpx; height: {{size}}rpx; {{customStyle}}">
<image wx:if="{{svgData}}" class="icon-image" src="{{svgData}}" mode="aspectFit" style="width: {{size}}rpx; height: {{size}}rpx;" />
<!-- 优先 iconfont其次 SVG dataUrl最后兜底 name 文本 -->
<text
wx:if="{{fontGlyph}}"
class="iconfont"
style="font-size: {{size}}rpx; line-height: {{size}}rpx; color: {{color}};"
>{{fontGlyph}}</text>
<image wx:elif="{{svgData}}" class="icon-image" src="{{svgData}}" mode="aspectFit" style="width: {{size}}rpx; height: {{size}}rpx;" />
<text wx:else class="icon-text">{{name}}</text>
</view>

View File

@@ -1,4 +1,5 @@
/* components/icon/icon.wxss */
.icon {
display: inline-flex;
align-items: center;
@@ -6,6 +7,13 @@
flex-shrink: 0;
}
.iconfont {
font-family: "iconfont" !important;
display: inline-flex;
align-items: center;
justify-content: center;
}
.icon-image {
display: block;
width: 100%;

View File

@@ -30,7 +30,7 @@
<!-- 亮点标签 -->
<view class="highlights" wx:if="{{author.highlights}}">
<view class="highlight-tag" wx:for="{{author.highlights}}" wx:key="*this">
<text class="tag-icon"></text>
<icon name="check" size="24" color="#34C759" customClass="tag-icon"></icon>
<text>{{item}}</text>
</view>
</view>

View File

@@ -42,7 +42,7 @@
bindtap="editAddress"
data-id="{{item.id}}"
>
<text class="action-icon">✏️</text>
<icon name="pencil" size="36" color="#00CED1" customClass="action-icon"></icon>
<text class="action-text">编辑</text>
</view>
<view

View File

@@ -50,14 +50,14 @@
<view class="link-row" bindtap="goToFullProfile">
<text class="link-text">完善更多资料</text>
<text class="link-arrow"></text>
<icon name="chevron-right" size="28" color="#00CED1" customClass="link-arrow"></icon>
</view>
</view>
<!-- 头像弹窗:使用微信头像 -->
<view class="modal-overlay" wx:if="{{showAvatarModal}}" bindtap="closeAvatarModal">
<view class="modal-content avatar-modal" catchtap="stopPropagation">
<view class="modal-close" bindtap="closeAvatarModal"></view>
<view class="modal-close" bindtap="closeAvatarModal"><icon name="x" size="36" color="#8e8e93"></icon></view>
<text class="avatar-modal-title">使用微信头像</text>
<text class="avatar-modal-desc">点击下方按钮,一键同步当前微信头像</text>
<button class="btn-choose-avatar" open-type="chooseAvatar" bindchooseavatar="onChooseAvatar">使用微信头像</button>

View File

@@ -6,7 +6,7 @@
<view class="nav-content">
<view class="nav-left">
<view class="search-btn" wx:if="{{searchEnabled}}" bindtap="goToSearch">
<text class="search-icon">🔍</text>
<icon name="search" size="32" color="rgba(255,255,255,0.6)" customClass="search-icon"></icon>
</view>
</view>
<view class="nav-title brand-color">目录</view>
@@ -37,7 +37,7 @@
<!-- 书籍信息卡 -->
<view class="book-info-card card-gradient" wx:if="{{!partsLoading}}">
<view class="book-icon">
<view class="book-icon-inner">📚</view>
<view class="book-icon-inner"><icon name="book-open" size="56" color="#ffffff"></icon></view>
</view>
<view class="book-info">
<text class="book-title">一场SOUL的创业实验场</text>
@@ -54,12 +54,12 @@
<!-- 序言(优先传 mid阅读页用 by-mid 请求) -->
<view class="chapter-item" bindtap="goToRead" data-id="preface" data-mid="{{fixedSectionsMap.preface}}">
<view class="item-left">
<view class="item-icon icon-brand">📖</view>
<view class="item-icon icon-brand"><icon name="book-open" size="36" color="#00CED1"></icon></view>
<text class="item-title">序言为什么我每天早上6点在Soul开播?</text>
</view>
<view class="item-right">
<text class="tag tag-free">免费</text>
<text class="item-arrow"></text>
<icon name="chevron-right" size="28" color="rgba(255,255,255,0.4)" customClass="item-arrow"></icon>
</view>
</view>
@@ -77,7 +77,7 @@
</view>
<view class="part-right">
<text class="part-count">{{item.chapters.length || item.chapterCount}}章</text>
<text class="part-arrow {{expandedPart === item.id ? 'arrow-down' : ''}}">→</text>
<icon name="{{expandedPart === item.id ? 'chevron-down' : 'chevron-right'}}" size="28" color="rgba(255,255,255,0.4)" customClass="part-arrow"></icon>
</view>
</view>
@@ -99,7 +99,7 @@
<text wx:if="{{section.isFree}}" class="tag tag-free">免费</text>
<text wx:elif="{{isVip || (!section.isPremium && hasFullBook) || purchasedSections.indexOf(section.id) > -1}}" class="tag tag-purchased">已解锁</text>
<text wx:else class="section-price">¥{{section.price}}</text>
<text class="section-arrow"></text>
<icon name="chevron-right" size="24" color="rgba(255,255,255,0.3)" customClass="section-arrow"></icon>
</view>
</view>
</block>
@@ -113,12 +113,12 @@
<!-- 尾声(优先传 mid -->
<view class="chapter-item" bindtap="goToRead" data-id="epilogue" data-mid="{{fixedSectionsMap.epilogue}}">
<view class="item-left">
<view class="item-icon icon-brand">📖</view>
<view class="item-icon icon-brand"><icon name="book-open" size="36" color="#00CED1"></icon></view>
<text class="item-title">尾声|这本书的真实目的</text>
</view>
<view class="item-right">
<text class="tag tag-free">免费</text>
<text class="item-arrow"></text>
<icon name="chevron-right" size="28" color="rgba(255,255,255,0.4)" customClass="item-arrow"></icon>
</view>
</view>
@@ -135,7 +135,7 @@
data-mid="{{item.mid}}"
>
<text class="appendix-text">{{item.title}}</text>
<text class="appendix-arrow"></text>
<icon name="chevron-right" size="24" color="rgba(255,255,255,0.3)" customClass="appendix-arrow"></icon>
</view>
</view>
</view>

View File

@@ -144,7 +144,7 @@
<!-- 登录弹窗(好友领取时未登录) -->
<view class="modal-overlay" wx:if="{{showLoginModal}}" bindtap="closeLoginModal">
<view class="modal-content login-modal" catchtap="stopPropagation">
<view class="modal-close" bindtap="closeLoginModal"></view>
<view class="modal-close" bindtap="closeLoginModal"><icon name="x" size="36" color="#8e8e93"></icon></view>
<view class="login-icon"><icon name="lock" size="80" color="#00CED1"></icon></view>
<text class="login-title">登录 Soul创业派对</text>
<text class="login-desc">登录后可免费领取并阅读</text>
@@ -153,7 +153,7 @@
<text>微信快捷登录</text>
</button>
<view class="login-agree-row" catchtap="toggleAgree">
<view class="agree-checkbox {{agreeProtocol ? 'agree-checked' : ''}}">{{agreeProtocol ? '✓' : ''}}</view>
<view class="agree-checkbox {{agreeProtocol ? 'agree-checked' : ''}}"><icon wx:if="{{agreeProtocol}}" name="check" size="24" color="#34C759"></icon></view>
<text class="agree-text">我已阅读并同意</text>
<text class="agree-link" bindtap="openUserProtocol">《用户协议》</text>
<text class="agree-text">和</text>

View File

@@ -42,14 +42,14 @@
<view class="banner-title">{{latestSection.title}}</view>
<view class="banner-action">
<text class="banner-action-text">开始阅读</text>
<view class="banner-arrow"></view>
<icon name="chevron-right" size="32" color="#fff" customClass="banner-arrow"></icon>
</view>
</view>
<view class="banner-card banner-skeleton" wx:else bindtap="goToChapters">
<view class="banner-glow"></view>
<view class="banner-tag">最新更新</view>
<view class="banner-title">加载中...</view>
<view class="banner-action"><text class="banner-action-text">开始阅读</text><view class="banner-arrow"></view></view>
<view class="banner-action"><text class="banner-action-text">开始阅读</text><icon name="chevron-right" size="32" color="#fff" customClass="banner-arrow"></icon></view>
</view>
<!-- 超级个体(横向滚动,已去掉「查看全部」;审核模式隐藏) -->
@@ -87,7 +87,7 @@
<!-- 已加载无数据 -->
<view wx:else class="super-empty">
<text class="super-empty-text">成为会员,展示你的项目</text>
<view class="super-empty-btn" bindtap="goToVip">加入创业派对 </view>
<view class="super-empty-btn" bindtap="goToVip">加入创业派对 <icon name="chevron-right" size="28" color="#00CED1" customClass="inline-arrow"></icon></view>
</view>
</view>
@@ -97,7 +97,7 @@
<text class="section-title">精选推荐</text>
<view class="section-more" wx:if="{{featuredSections.length > 0}}" bindtap="toggleFeaturedExpanded">
<text class="more-text">{{featuredExpandedLoading ? '加载中...' : (featuredExpanded ? '收起' : '展开更多')}}</text>
<text class="more-arrow">{{featuredExpanded ? '▲' : '▼'}}</text>
<icon name="{{featuredExpanded ? 'chevron-up' : 'chevron-down'}}" size="28" color="rgba(255,255,255,0.6)" customClass="more-arrow"></icon>
</view>
</view>
<view class="featured-list">
@@ -116,7 +116,7 @@
</view>
<text class="featured-title">{{item.title}}</text>
</view>
<view class="featured-arrow"></view>
<icon name="chevron-right" size="28" color="rgba(255,255,255,0.6)" customClass="featured-arrow"></icon>
</view>
</view>
</view>
@@ -131,7 +131,7 @@
</view>
<view class="section-more" wx:if="{{latestChapters.length > 5}}" bindtap="toggleLatestExpanded">
<text class="more-text">{{latestExpanded ? '收起' : '展开更多'}}</text>
<text class="more-arrow">{{latestExpanded ? '▲' : '▼'}}</text>
<icon name="{{latestExpanded ? 'chevron-up' : 'chevron-down'}}" size="28" color="rgba(255,255,255,0.6)" customClass="more-arrow"></icon>
</view>
</view>
</view>

View File

@@ -16,7 +16,7 @@
<!-- 匹配提示条 - 简化显示 -->
<view class="match-tip-bar" wx:if="{{matchesRemaining <= 0 && !hasFullBook}}">
<text class="tip-icon"></text>
<icon name="zap" size="36" color="#FFD700" customClass="tip-icon"></icon>
<text class="tip-text">今日免费次数已用完</text>
<view class="tip-btn" bindtap="showUnlockModal">购买次数</view>
</view>
@@ -36,7 +36,7 @@
<view class="sphere-gradient"></view>
<view class="sphere-content">
<block wx:if="{{needPayToMatch}}">
<text class="sphere-icon"></text>
<icon name="zap" size="56" color="#FFD700" customClass="sphere-icon"></icon>
<text class="sphere-title gold-text">购买次数</text>
<text class="sphere-desc">¥1 = 1次匹配</text>
</block>
@@ -102,9 +102,9 @@
<text class="matching-title-v2">正在匹配{{currentTypeLabel}}...</text>
<text class="matching-subtitle-v2">正在从 {{matchAttempts * 127 + 89}} 位创业者中为你寻找</text>
<view class="matching-tips">
<text class="tip-item" wx:if="{{matchAttempts >= 1}}">分析兴趣标签</text>
<text class="tip-item" wx:if="{{matchAttempts >= 2}}">匹配创业方向</text>
<text class="tip-item" wx:if="{{matchAttempts >= 3}}">筛选优质伙伴</text>
<view class="tip-item" wx:if="{{matchAttempts >= 1}}"><icon name="check" size="24" color="#34C759"></icon><text>分析兴趣标签</text></view>
<view class="tip-item" wx:if="{{matchAttempts >= 2}}"><icon name="check" size="24" color="#34C759"></icon><text>匹配创业方向</text></view>
<view class="tip-item" wx:if="{{matchAttempts >= 3}}"><icon name="check" size="24" color="#34C759"></icon><text>筛选优质伙伴</text></view>
</view>
<view class="cancel-btn-v2" bindtap="cancelMatch">取消</view>
</view>
@@ -183,7 +183,7 @@
<text class="join-title">{{joinTypeLabel}}</text>
<text class="join-subtitle" wx:if="{{needBindFirst}}">请先绑定联系方式</text>
<text class="join-subtitle" wx:else>填写联系方式,专人对接</text>
<view class="close-btn-new" bindtap="closeJoinModal"></view>
<view class="close-btn-new" bindtap="closeJoinModal"><icon name="x" size="36" color="#8e8e93"></icon></view>
</view>
<!-- 联系方式切换 -->
@@ -299,7 +299,7 @@
<!-- 解锁弹窗 -->
<view class="modal-overlay" wx:if="{{showUnlockModal}}" bindtap="closeUnlockModal">
<view class="modal-content unlock-modal" catchtap="preventBubble">
<view class="unlock-icon"></view>
<view class="unlock-icon"><icon name="zap" size="64" color="#FFD700"></icon></view>
<text class="unlock-title">购买匹配次数</text>
<text class="unlock-desc">今日3次免费匹配已用完可付费购买额外次数</text>

View File

@@ -132,7 +132,7 @@
<view class="bottom-wrap">
<view class="btn-super" bindtap="goToVip">
<text>成为超级个体</text>
<text class="btn-arrow"></text>
<icon name="chevron-right" size="36" color="#00CED1" customClass="btn-arrow"></icon>
</view>
</view>
<view style="height:160rpx;"></view>

View File

@@ -81,7 +81,7 @@
<view class="modal-content" catchtap="">
<view class="modal-header">
<text class="modal-title">选择咨询项目</text>
<text class="modal-close" bindtap="closeConsultModal">✕</text>
<view class="modal-close" bindtap="closeConsultModal"><icon name="x" size="36" color="#8e8e93"></icon></view>
</view>
<view class="consult-options">
<view
@@ -107,7 +107,8 @@
</view>
<view class="modal-footer">
<view class="confirm-btn" bindtap="onConfirmConsult" disabled="{{creating}}">
{{creating ? '处理中...' : '确认选择'}}
<text>{{creating ? '处理中...' : '确认选择'}}</text>
<icon wx:if="{{!creating}}" name="chevron-right" size="28" color="#fff" customClass="confirm-arrow"></icon>
</view>
<text class="footer-hint">点击确认即代表同意 <text class="footer-link">服务协议</text></text>
</view>

View File

@@ -37,7 +37,10 @@
<view class="section-header">
<text class="section-title">推荐导师</text>
<text class="section-more" bindtap="loadMentors">查看全部 </text>
<view class="section-more" bindtap="loadMentors">
<text>查看全部</text>
<icon name="chevron-right" size="28" color="rgba(255,255,255,0.6)" customClass="section-more-icon"></icon>
</view>
</view>
<view class="loading" wx:if="{{loading}}">加载中...</view>

View File

@@ -91,7 +91,10 @@
</view>
<view class="receive-bottom">
<text class="receive-tip">将依次调起微信收款页完成领取</text>
<text class="receive-link" bindtap="handleMenuTap" data-id="withdrawRecords">查看提现记录 </text>
<view class="receive-link" bindtap="handleMenuTap" data-id="withdrawRecords">
<text>查看提现记录</text>
<icon name="chevron-right" size="24" color="rgba(255,255,255,0.6)" customClass="receive-link-arrow"></icon>
</view>
</view>
</view>
@@ -144,7 +147,7 @@
</view>
<view class="recent-empty" wx:else>
<text class="recent-empty-text">暂无阅读记录</text>
<view class="recent-empty-btn" bindtap="goToChapters">去阅读 </view>
<view class="recent-empty-btn" bindtap="goToChapters">去阅读 <icon name="chevron-right" size="24" color="#00CED1" customClass="recent-empty-arrow"></icon></view>
</view>
</view>
@@ -155,21 +158,21 @@
<view class="menu-icon-wrap icon-teal"><image class="menu-icon-img" src="/assets/icons/folder-teal.svg" mode="aspectFit"/></view>
<text class="menu-text">我的订单</text>
</view>
<text class="menu-arrow"></text>
<icon name="chevron-right" size="28" color="rgba(255,255,255,0.35)" customClass="menu-arrow"></icon>
</view>
<view class="menu-item" bindtap="handleMenuTap" data-id="giftPay">
<view class="menu-left">
<view class="menu-icon-wrap icon-gold"><image class="menu-icon-img" src="/assets/icons/gift.svg" mode="aspectFit"/></view>
<text class="menu-text">我的代付</text>
</view>
<text class="menu-arrow"></text>
<icon name="chevron-right" size="28" color="rgba(255,255,255,0.35)" customClass="menu-arrow"></icon>
</view>
<view class="menu-item" wx:if="{{showSettingsEntry}}" bindtap="handleMenuTap" data-id="settings">
<view class="menu-left">
<view class="menu-icon-wrap icon-gray"><image class="menu-icon-img" src="/assets/icons/settings-gray.svg" mode="aspectFit"/></view>
<text class="menu-text">设置</text>
</view>
<text class="menu-arrow"></text>
<icon name="chevron-right" size="28" color="rgba(255,255,255,0.35)" customClass="menu-arrow"></icon>
</view>
</view>
</view>
@@ -177,7 +180,7 @@
<!-- 登录弹窗 -->
<view class="modal-overlay" wx:if="{{showLoginModal}}" bindtap="closeLoginModal">
<view class="modal-content login-modal-content" catchtap="stopPropagation">
<view class="modal-close" bindtap="closeLoginModal"></view>
<view class="modal-close" bindtap="closeLoginModal"><icon name="x" size="36" color="#8e8e93"></icon></view>
<view class="login-icon"><icon name="lock" size="80" color="#00CED1"></icon></view>
<text class="login-title">登录 Soul创业派对</text>
<text class="login-desc">登录后可购买章节、解锁更多内容</text>
@@ -187,7 +190,7 @@
</button>
<view class="login-modal-cancel" bindtap="closeLoginModal">取消</view>
<view class="login-agree-row" catchtap="toggleAgree">
<view class="agree-checkbox {{agreeProtocol ? 'agree-checked' : ''}}">{{agreeProtocol ? '✓' : ''}}</view>
<view class="agree-checkbox {{agreeProtocol ? 'agree-checked' : ''}}"><icon wx:if="{{agreeProtocol}}" name="check" size="24" color="#34C759"></icon></view>
<text class="agree-text">我已阅读并同意</text>
<text class="agree-link" catchtap="openUserProtocol">《用户协议》</text>
<text class="agree-text">和</text>
@@ -223,7 +226,7 @@
<!-- 头像弹窗:必须点击 button 才能获取微信头像(隐私规范) -->
<view class="modal-overlay" wx:if="{{showAvatarModal}}" bindtap="closeAvatarModal">
<view class="modal-content avatar-modal" catchtap="stopPropagation">
<view class="modal-close" bindtap="closeAvatarModal"></view>
<view class="modal-close" bindtap="closeAvatarModal"><icon name="x" size="36" color="#8e8e93"></icon></view>
<text class="avatar-modal-title">获取微信头像</text>
<text class="avatar-modal-desc">点击下方按钮使用你的微信头像</text>
<button class="btn-choose-avatar" open-type="chooseAvatar" bindchooseavatar="onChooseAvatar">使用微信头像</button>
@@ -234,9 +237,9 @@
<!-- 修改昵称弹窗 -->
<view class="modal-overlay" wx:if="{{showNicknameModal}}" bindtap="closeNicknameModal">
<view class="modal-content nickname-modal" catchtap="stopPropagation">
<view class="modal-close" bindtap="closeNicknameModal"></view>
<view class="modal-close" bindtap="closeNicknameModal"><icon name="x" size="36" color="#8e8e93"></icon></view>
<view class="modal-header">
<text class="modal-icon">✏️</text>
<icon name="pencil" size="48" color="#00CED1" customClass="modal-icon"></icon>
<text class="modal-title">修改昵称</text>
</view>
<view class="nickname-input-wrap">

View File

@@ -1,7 +1,7 @@
<!-- 资料编辑 - comprehensive_profile_editor_v1_1 | input/textarea 用 view 包裹,配色 enhanced -->
<view class="page">
<view class="nav-bar" style="padding-top: {{statusBarHeight}}px;">
<view class="nav-back" bindtap="goBack"><text class="back-icon"></text></view>
<view class="nav-back" bindtap="goBack"><icon name="chevron-left" size="44" color="#5EEAD4" customClass="back-icon"></icon></view>
<text class="nav-title">编辑资料</text>
<view class="nav-placeholder"></view>
</view>
@@ -11,7 +11,7 @@
<scroll-view wx:else class="scroll-main" scroll-y>
<!-- 温馨提示 -->
<view class="tip-card">
<text class="tip-icon"></text>
<icon name="info" size="36" color="#00CED1" customClass="tip-icon"></icon>
<text class="tip-text">温馨提示:需完善手机号和微信号才能使用提现和找伙伴功能</text>
</view>
@@ -152,7 +152,7 @@
<!-- 头像弹窗:通过 button 获取微信头像 -->
<view class="modal-overlay" wx:if="{{showAvatarModal}}" bindtap="closeAvatarModal">
<view class="modal-content avatar-modal" catchtap="stopPropagation">
<view class="modal-close" bindtap="closeAvatarModal"></view>
<view class="modal-close" bindtap="closeAvatarModal"><icon name="x" size="36" color="#8e8e93"></icon></view>
<text class="avatar-modal-title">使用微信头像</text>
<text class="avatar-modal-desc">点击下方按钮,一键同步当前微信头像</text>
<button class="btn-choose-avatar" open-type="chooseAvatar" bindchooseavatar="onChooseAvatar">使用微信头像</button>

View File

@@ -129,7 +129,7 @@
<view class="bottom-bar">
<view class="vip-btn-outline" bindtap="goToVip">
<text>成为超级个体</text>
<text class="vip-btn-arrow"></text>
<icon name="chevron-right" size="36" color="#00CED1" customClass="vip-btn-arrow"></icon>
</view>
</view>
</view>

View File

@@ -83,7 +83,7 @@
<text class="btn-label">下一篇</text>
<view class="btn-row">
<text class="btn-title">{{nextSection.title}}</text>
<text class="btn-arrow"></text>
<icon name="chevron-right" size="28" color="#00CED1" customClass="btn-arrow"></icon>
</view>
</view>
<view class="nav-btn nav-end" wx:else>
@@ -156,7 +156,7 @@
<text class="btn-label">下一篇</text>
<view class="btn-row">
<text class="btn-title">{{nextSection.title}}</text>
<text class="btn-arrow"></text>
<icon name="chevron-right" size="28" color="#00CED1" customClass="btn-arrow"></icon>
</view>
</view>
<view class="nav-btn nav-end" wx:else>
@@ -232,7 +232,7 @@
<text class="btn-label">下一篇</text>
<view class="btn-row">
<text class="btn-title">{{nextSection.title}}</text>
<text class="btn-arrow"></text>
<icon name="chevron-right" size="28" color="#00CED1" customClass="btn-arrow"></icon>
</view>
</view>
<view class="nav-btn nav-end" wx:else>
@@ -253,7 +253,7 @@
<!-- 错误提示 -->
<view class="paywall">
<view class="paywall-icon">⚠️</view>
<view class="paywall-icon"><icon name="warning" size="80" color="#ff9500"></icon></view>
<text class="paywall-title">网络异常</text>
<text class="paywall-desc">无法确认权限,请检查网络后重试</text>
@@ -269,7 +269,7 @@
<view class="modal-content poster-modal" catchtap="stopPropagation">
<view class="modal-header">
<text class="modal-title">生成海报</text>
<view class="modal-close" bindtap="closePosterModal"></view>
<view class="modal-close" bindtap="closePosterModal"><icon name="x" size="36" color="#8e8e93"></icon></view>
</view>
<!-- 海报预览 -->
@@ -291,7 +291,7 @@
<!-- 登录弹窗 - 须勾选同意协议,《用户协议》《隐私政策》可点击查看 -->
<view class="modal-overlay" wx:if="{{showLoginModal}}" bindtap="closeLoginModal">
<view class="modal-content login-modal" catchtap="stopPropagation">
<view class="modal-close" bindtap="closeLoginModal"></view>
<view class="modal-close" bindtap="closeLoginModal"><icon name="x" size="36" color="#8e8e93"></icon></view>
<view class="login-icon"><icon name="lock" size="80" color="#00CED1"></icon></view>
<text class="login-title">登录 Soul创业派对</text>
<text class="login-desc">登录后可购买章节、解锁更多内容</text>
@@ -302,7 +302,7 @@
</button>
<view class="login-agree-row" catchtap="toggleAgree">
<view class="agree-checkbox {{agreeProtocol ? 'agree-checked' : ''}}">{{agreeProtocol ? '✓' : ''}}</view>
<view class="agree-checkbox {{agreeProtocol ? 'agree-checked' : ''}}"><icon wx:if="{{agreeProtocol}}" name="check" size="24" color="#34C759"></icon></view>
<text class="agree-text">我已阅读并同意</text>
<text class="agree-link" catchtap="openUserProtocol">《用户协议》</text>
<text class="agree-text">和</text>

View File

@@ -94,7 +94,7 @@
<text class="title-text">绑定用户</text>
<text class="binding-count">({{totalBindings}})</text>
</view>
<text class="toggle-icon">{{showBindingList ? '▲' : '▼'}}</text>
<icon name="{{showBindingList ? 'chevron-up' : 'chevron-down'}}" size="28" color="rgba(255,255,255,0.6)" customClass="toggle-icon"></icon>
</view>
<block wx:if="{{showBindingList}}">
@@ -132,7 +132,7 @@
wx:key="id"
>
<view class="user-avatar {{item.status === 'converted' ? 'avatar-converted' : item.status === 'expired' ? 'avatar-expired' : ''}}">
<text wx:if="{{item.status === 'converted'}}">✓</text>
<icon wx:if="{{item.status === 'converted'}}" name="check" size="28" color="#34C759"></icon>
<icon wx:elif="{{item.status === 'expired'}}" name="clock" size="28" color="#ff9500"></icon>
<text wx:else>{{item.nickname[0] || '用'}}</text>
</view>
@@ -246,7 +246,7 @@
<!-- 海报生成弹窗 - 优化小程序显示 -->
<view class="modal-overlay" wx:if="{{showPosterModal}}" bindtap="closePosterModal">
<view class="poster-dialog" catchtap="stopPropagation">
<view class="poster-close" bindtap="closePosterModal"></view>
<view class="poster-close" bindtap="closePosterModal"><icon name="x" size="36" color="#8e8e93"></icon></view>
<!-- 上半部分:海报内容(不使用画布,纯布局 + 二维码图片) -->
<view class="poster-card">

View File

@@ -104,7 +104,7 @@
<view class="result-content" wx:if="{{item.matchedContent}}">
<text class="content-preview">{{item.matchedContent}}</text>
</view>
<view class="result-arrow"></view>
<icon name="chevron-right" size="28" color="#8e8e93" customClass="result-arrow"></icon>
</view>
</view>
</block>

View File

@@ -31,7 +31,7 @@
</view>
</view>
<view class="bind-right">
<text class="bind-check" wx:if="{{phoneNumber}}">✓</text>
<icon wx:if="{{phoneNumber}}" name="check" size="36" color="#34C759" customClass="bind-check"></icon>
<button wx:else class="get-phone-btn" open-type="getPhoneNumber" bindgetphonenumber="onGetPhoneNumber">
一键获取
</button>
@@ -54,7 +54,7 @@
</view>
</view>
<view class="bind-right">
<text class="bind-check" wx:if="{{wechatId}}">✓</text>
<icon wx:if="{{wechatId}}" name="check" size="36" color="#34C759" customClass="bind-check"></icon>
</view>
</view>
@@ -126,7 +126,7 @@
<view class="modal-content" catchtap="stopPropagation">
<view class="modal-header">
<text class="modal-title">绑定{{bindType === 'phone' ? '手机号' : bindType === 'wechat' ? '微信号' : '支付宝'}}</text>
<view class="modal-close" bindtap="closeBindModal"></view>
<view class="modal-close" bindtap="closeBindModal"><icon name="x" size="36" color="#8e8e93"></icon></view>
</view>
<view class="modal-body">
@@ -158,7 +158,7 @@
<view class="modal-content" catchtap="stopPropagation">
<view class="modal-header">
<text class="modal-title">切换账号(开发)</text>
<view class="modal-close" bindtap="closeSwitchAccountModal"></view>
<view class="modal-close" bindtap="closeSwitchAccountModal"><icon name="x" size="36" color="#8e8e93"></icon></view>
</view>
<view class="modal-body">
<view class="form-input-wrap">

View File

@@ -21,7 +21,7 @@ Page({
{ title: '匹配创业伙伴', desc: '精准人脉匹配', icon: 'users' },
{ title: '创业老板排行', desc: '项目曝光展示', icon: 'bar-chart' },
{ title: '链接资源', desc: '深度私域资源池', icon: 'link' },
{ title: '专属VIP标识', desc: '金色尊享光圈', icon: '' }
{ title: '专属VIP标识', desc: '金色尊享光圈', icon: 'check' }
],
purchasing: false
},

View File

@@ -3,7 +3,7 @@
"projectname": "miniprogram",
"setting": {
"compileHotReLoad": true,
"urlCheck": false,
"urlCheck": true,
"coverView": true,
"lazyloadPlaceholderEnable": false,
"skylineRenderEnable": false,

View File

@@ -0,0 +1,121 @@
@font-face {
font-family: "iconfont"; /* Project id 5142223 */
/* 微信小程序里 url 带 query 可能导致找不到本地文件,统一去掉 */
/* 使用从根目录开始的绝对路径(最稳) */
src: url('/static/iconfont.woff2') format('woff2'),
url('/static/iconfont.woff') format('woff'),
url('/static/iconfont.ttf') format('truetype');
}
.iconfont {
font-family: "iconfont" !important;
font-size: 16px;
font-style: normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.icon-qianbao:before { content: "\e6c8"; }
.icon-gift:before { content: "\e6c9"; }
.icon-zap1:before { content: "\e75c"; }
.icon-user:before { content: "\e6b9"; }
.icon-upload:before { content: "\e6ba"; }
.icon-work:before { content: "\e6bb"; }
.icon-training:before { content: "\e6bc"; }
.icon-warning:before { content: "\e6bd"; }
.icon-zoom-in:before { content: "\e6be"; }
.icon-zoom-out:before { content: "\e6bf"; }
.icon-arrow-left-bold:before { content: "\e6c1"; }
.icon-arrow-up-bold:before { content: "\e6c2"; }
.icon-close-bold:before { content: "\e6c3"; }
.icon-arrow-down-bold:before { content: "\e6c4"; }
.icon-minus-bold:before { content: "\e6c5"; }
.icon-arrow-right-bold:before { content: "\e6c6"; }
.icon-select-bold:before { content: "\e6c7"; }
.icon-money-wallet:before { content: "\e833"; }
.icon-book-open:before { content: "\e993"; }
.icon-biaoshilei_yonghuzu:before { content: "\e61b"; }
.icon-add:before { content: "\e664"; }
.icon-add-circle:before { content: "\e665"; }
.icon-adjust:before { content: "\e666"; }
.icon-arrow-up-circle:before { content: "\e667"; }
.icon-arrow-right-circle:before { content: "\e668"; }
.icon-arrow-down:before { content: "\e669"; }
.icon-ashbin:before { content: "\e66a"; }
.icon-arrow-right:before { content: "\e66b"; }
.icon-browse:before { content: "\e66c"; }
.icon-bottom:before { content: "\e66d"; }
.icon-back:before { content: "\e66e"; }
.icon-bad:before { content: "\e66f"; }
.icon-arrow-left-circle:before { content: "\e670"; }
.icon-camera:before { content: "\e671"; }
.icon-chart-bar:before { content: "\e672"; }
.icon-attachment:before { content: "\e673"; }
.icon-code:before { content: "\e674"; }
.icon-close:before { content: "\e675"; }
.icon-check-item:before { content: "\e676"; }
.icon-calendar:before { content: "\e677"; }
.icon-comment:before { content: "\e678"; }
.icon-complete:before { content: "\e679"; }
.icon-direction-down:before { content: "\e67a"; }
.icon-direction-down-circle:before { content: "\e67b"; }
.icon-direction-right:before { content: "\e67c"; }
.icon-direction-up:before { content: "\e67d"; }
.icon-discount:before { content: "\e67e"; }
.icon-electronics:before { content: "\e681"; }
.icon-elipsis:before { content: "\e682"; }
.icon-export:before { content: "\e683"; }
.icon-explain:before { content: "\e684"; }
.icon-edit:before { content: "\e685"; }
.icon-eye-close:before { content: "\e686"; }
.icon-email:before { content: "\e687"; }
.icon-error:before { content: "\e688"; }
.icon-favorite:before { content: "\e689"; }
.icon-file-common:before { content: "\e68a"; }
.icon-file-delete:before { content: "\e68b"; }
.icon-file-add:before { content: "\e68c"; }
.icon-film:before { content: "\e68d"; }
.icon-fabulous:before { content: "\e68e"; }
.icon-file:before { content: "\e68f"; }
.icon-folder-close:before { content: "\e690"; }
.icon-filter:before { content: "\e691"; }
.icon-good:before { content: "\e692"; }
.icon-hide:before { content: "\e693"; }
.icon-home:before { content: "\e694"; }
.icon-file-open:before { content: "\e695"; }
.icon-forward:before { content: "\e696"; }
.icon-import:before { content: "\e697"; }
.icon-layers:before { content: "\e698"; }
.icon-lock:before { content: "\e699"; }
.icon-map:before { content: "\e69a"; }
.icon-menu:before { content: "\e69b"; }
.icon-help:before { content: "\e69c"; }
.icon-minus-circle:before { content: "\e69d"; }
.icon-notification:before { content: "\e69e"; }
.icon-more:before { content: "\e69f"; }
.icon-mobile-phone:before { content: "\e6a0"; }
.icon-minus:before { content: "\e6a1"; }
.icon-navigation:before { content: "\e6a2"; }
.icon-prompt:before { content: "\e6a3"; }
.icon-refresh:before { content: "\e6a4"; }
.icon-run-up:before { content: "\e6a5"; }
.icon-picture:before { content: "\e6a6"; }
.icon-run-in:before { content: "\e6a7"; }
.icon-pin:before { content: "\e6a8"; }
.icon-save:before { content: "\e6a9"; }
.icon-search:before { content: "\e6aa"; }
.icon-share:before { content: "\e6ab"; }
.icon-scanning:before { content: "\e6ac"; }
.icon-security:before { content: "\e6ad"; }
.icon-sign-out:before { content: "\e6ae"; }
.icon-select:before { content: "\e6af"; }
.icon-stop:before { content: "\e6b0"; }
.icon-success:before { content: "\e6b1"; }
.icon-switch:before { content: "\e6b2"; }
.icon-setting:before { content: "\e6b3"; }
.icon-survey:before { content: "\e6b4"; }
.icon-time:before { content: "\e6b5"; }
.icon-telephone:before { content: "\e6b6"; }
.icon-top:before { content: "\e6b7"; }
.icon-unlock:before { content: "\e6b8"; }