diff --git a/_codex_tabs_verify.png b/_codex_tabs_verify.png
deleted file mode 100644
index 1f28e94..0000000
Binary files a/_codex_tabs_verify.png and /dev/null differ
diff --git a/_codex_toolbox_verify.png b/_codex_toolbox_verify.png
deleted file mode 100644
index 4da6469..0000000
Binary files a/_codex_toolbox_verify.png and /dev/null differ
diff --git a/api/config.js b/api/config.js
index fe6fd90..478537b 100644
--- a/api/config.js
+++ b/api/config.js
@@ -45,6 +45,11 @@ export default {
INTERFACE_POINT_GET_LOG_LIST: '/point/loglist', // 点数账单流水
INTERFACE_POINT_POST_CREATE_ORDER: '/point/createorder', // 创建充值订单
INTERFACE_POINT_GET_ORDER_STATUS: '/point/orderstatus', // 订单状态轮询
+ INTERFACE_POINT_GET_EARN_CONFIG: '/point/earnconfig', // 积分获取页配置(签到 + 邀请 + 看广告)
+ INTERFACE_POINT_POST_CHECKIN: '/point/checkin', // 每日签到领取积分
+ INTERFACE_POINT_POST_AD_TICKET: '/point/adticket', // 看广告前领取一次性凭证
+ INTERFACE_POINT_POST_AD_REWARD: '/point/adreward', // 看完广告发放积分
+ INTERFACE_POINT_POST_AD_CANCEL: '/point/adcancel', // 广告未看完,作废凭证
INTERFACE_BILLING_GET_CONFIG: '/billing/config', // 产品计费配置
INTERFACE_BILLING_POST_QUOTE: '/billing/quote', // 产品计价
@@ -63,6 +68,25 @@ export default {
INTERFACE_ANIME_GET_DETAIL: '/anime/getdetail', // 动漫头像详情
INTERFACE_ANIME_POST_DEL: '/anime/del', // 动漫头像删除
INTERFACE_ANIME_GET_STYLE_LIST: '/anime/getstylelist', // 动漫头像风格
+ INTERFACE_IDPHOTO_GET_CONFIG: '/idphoto/config',
+ INTERFACE_IDPHOTO_POST_CREATE: '/idphoto/create',
+ INTERFACE_IDPHOTO_POST_RERENDER: '/idphoto/rerender',
+ INTERFACE_IDPHOTO_GET_DETAIL: '/idphoto/getdetail',
+ INTERFACE_IDPHOTO_POST_DEL: '/idphoto/del',
+
+ // 形象照/职业照/写真(混元生图 3.0,一次可出多张)
+ INTERFACE_PORTRAIT_GET_CONFIG: '/portrait/config',
+ INTERFACE_PORTRAIT_POST_CREATE: '/portrait/create',
+ INTERFACE_PORTRAIT_GET_DETAIL: '/portrait/getdetail',
+ INTERFACE_PORTRAIT_GET_LIST: '/portrait/getlist',
+ INTERFACE_PORTRAIT_POST_DEL: '/portrait/del',
+
+ // 老照片修复/上色(混元生图 3.0,异步任务 + 轮询)
+ INTERFACE_OLDPHOTO_GET_CONFIG: '/oldphoto/config',
+ INTERFACE_OLDPHOTO_POST_CREATE: '/oldphoto/create',
+ INTERFACE_OLDPHOTO_GET_DETAIL: '/oldphoto/getdetail',
+ INTERFACE_OLDPHOTO_GET_LIST: '/oldphoto/getlist',
+ INTERFACE_OLDPHOTO_POST_DEL: '/oldphoto/del',
// 机器人/文本生成(旧项目 AI 写作/取名接口)
INTERFACE_BOT_POST_EDIT: '/robot/edit', // 创建/编辑机器人
diff --git a/api/index.js b/api/index.js
index b98a21f..304632b 100644
--- a/api/index.js
+++ b/api/index.js
@@ -66,7 +66,15 @@ export const pointApi = {
// 创建充值订单(小程序返回虚拟支付参数)
createOrder: (params) => request({ url: API.INTERFACE_POINT_POST_CREATE_ORDER, method: 'POST', params }),
// 订单状态轮询
- getOrderStatus: (params) => request({ url: API.INTERFACE_POINT_GET_ORDER_STATUS, method: 'POST', params })
+ getOrderStatus: (params) => request({ url: API.INTERFACE_POINT_GET_ORDER_STATUS, method: 'POST', params }),
+ // 积分获取页配置(签到、邀请、看广告配置与今日进度,免登录可调)
+ getEarnConfig: (params) => request({ url: API.INTERFACE_POINT_GET_EARN_CONFIG, method: 'POST', params }),
+ // 每日签到,服务端按用户与日期幂等发放
+ checkin: (params) => request({ url: API.INTERFACE_POINT_POST_CHECKIN, method: 'POST', params }),
+ // 看广告:先取一次性凭证,看完再兑换积分,未看完则作废
+ getAdTicket: (params) => request({ url: API.INTERFACE_POINT_POST_AD_TICKET, method: 'POST', params }),
+ getAdReward: (params) => request({ url: API.INTERFACE_POINT_POST_AD_REWARD, method: 'POST', params }),
+ cancelAdTicket: (params) => request({ url: API.INTERFACE_POINT_POST_AD_CANCEL, method: 'POST', params })
}
export const billingApi = {
@@ -74,6 +82,34 @@ export const billingApi = {
quote: (params) => request({ url: API.INTERFACE_BILLING_POST_QUOTE, method: 'POST', params })
}
+export const idPhotoApi = {
+ getConfig: (params) => request({ url: API.INTERFACE_IDPHOTO_GET_CONFIG, method: 'POST', params }),
+ getList: (params = {}) => request({
+ url: API.INTERFACE_WORK_GET_LIST,
+ method: 'POST',
+ params: { ...params, type: 'photo' }
+ }),
+ rerender: (params) => request({ url: API.INTERFACE_IDPHOTO_POST_RERENDER, method: 'POST', params }),
+ getDetail: (params) => request({ url: API.INTERFACE_IDPHOTO_GET_DETAIL, method: 'POST', params }),
+ delete: (params) => request({ url: API.INTERFACE_IDPHOTO_POST_DEL, method: 'POST', params })
+}
+
+export const portraitApi = {
+ getConfig: (params) => request({ url: API.INTERFACE_PORTRAIT_GET_CONFIG, method: 'POST', params }),
+ getDetail: (params) => request({ url: API.INTERFACE_PORTRAIT_GET_DETAIL, method: 'POST', params }),
+ getList: (params) => request({ url: API.INTERFACE_PORTRAIT_GET_LIST, method: 'POST', params }),
+ delete: (params) => request({ url: API.INTERFACE_PORTRAIT_POST_DEL, method: 'POST', params })
+ // create 走 multipart 直传,见 utils/upload.js 的 createPortrait
+}
+
+export const oldPhotoApi = {
+ getConfig: (params) => request({ url: API.INTERFACE_OLDPHOTO_GET_CONFIG, method: 'POST', params }),
+ getDetail: (params) => request({ url: API.INTERFACE_OLDPHOTO_GET_DETAIL, method: 'POST', params }),
+ getList: (params) => request({ url: API.INTERFACE_OLDPHOTO_GET_LIST, method: 'POST', params }),
+ delete: (params) => request({ url: API.INTERFACE_OLDPHOTO_POST_DEL, method: 'POST', params })
+ // create 走 multipart 直传,见 utils/upload.js 的 createOldPhoto
+}
+
export const toolApi = {
getMyWorkList: (params) => request({ url: API.INTERFACE_WORK_GET_LIST, method: 'POST', params }),
getAppList: (params) => request({ url: API.INTERFACE_APP_GET_LIST, method: 'POST', params }),
@@ -114,5 +150,8 @@ export default {
vip: vipApi,
point: pointApi,
billing: billingApi,
+ idPhoto: idPhotoApi,
+ oldPhoto: oldPhotoApi,
+ portrait: portraitApi,
tool: toolApi
}
diff --git a/pages.json b/pages.json
index c0a96fc..a24c733 100644
--- a/pages.json
+++ b/pages.json
@@ -71,18 +71,54 @@
"navigationBarTitleText": "证件照"
}
},
+ {
+ "path": "pages/tool/id-photo-history",
+ "style": {
+ "navigationBarTitleText": "证件照记录"
+ }
+ },
+ {
+ "path": "pages/tool/id-photo-detail",
+ "style": {
+ "navigationBarTitleText": "证件照详情"
+ }
+ },
{
"path": "pages/tool/portrait-photo",
"style": {
"navigationBarTitleText": "形象照/职业照/写真"
}
},
+ {
+ "path": "pages/tool/portrait-history",
+ "style": {
+ "navigationBarTitleText": "生成记录"
+ }
+ },
+ {
+ "path": "pages/tool/portrait-detail",
+ "style": {
+ "navigationBarTitleText": "形象照详情"
+ }
+ },
{
"path": "pages/tool/old-photo",
"style": {
"navigationBarTitleText": "老照片修复/上色"
}
},
+ {
+ "path": "pages/tool/old-photo-history",
+ "style": {
+ "navigationBarTitleText": "历史记录"
+ }
+ },
+ {
+ "path": "pages/tool/old-photo-detail",
+ "style": {
+ "navigationBarTitleText": "老照片详情"
+ }
+ },
{
"path": "pages/tool/work-detail",
"style": {
@@ -122,6 +158,36 @@
"backgroundColor": "#f3f7fb"
}
},
+ {
+ "path": "pages/point/earn",
+ "style": {
+ "navigationBarTitleText": "获得点数"
+ }
+ },
+ {
+ "path": "pages/my/wechat",
+ "style": {
+ "navigationBarTitleText": "关注公众号"
+ }
+ },
+ {
+ "path": "pages/my/feedback",
+ "style": {
+ "navigationBarTitleText": "意见反馈"
+ }
+ },
+ {
+ "path": "pages/my/contact",
+ "style": {
+ "navigationBarTitleText": "联系我们"
+ }
+ },
+ {
+ "path": "pages/my/setting",
+ "style": {
+ "navigationBarTitleText": "设置"
+ }
+ },
{
"path": "pages/invite/invite",
"style": {
diff --git a/pages/agreement/agreement.vue b/pages/agreement/agreement.vue
index d0501b0..d9fa24b 100644
--- a/pages/agreement/agreement.vue
+++ b/pages/agreement/agreement.vue
@@ -1,45 +1,130 @@
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+ {{ errorMsg ? '内容加载失败' : '内容暂未发布' }}
+ {{ errorMsg || '该内容正在整理中,可稍后再来查看。' }}
+ 重新加载
+
diff --git a/pages/bill/bill.vue b/pages/bill/bill.vue
index 6597d1c..29b677a 100644
--- a/pages/bill/bill.vue
+++ b/pages/bill/bill.vue
@@ -54,6 +54,11 @@
{{ item.type_text }}
{{ item.time }}
+
+
+ 订单号 {{ orderNo(item) }}
+ 复制
+
{{ formatAmount(item.amount) }}
@@ -255,6 +260,24 @@ function formatAmount(value) {
return num > 0 ? `+${num}` : String(num)
}
+/**
+ * 充值流水的订单号。
+ * 后端 point_log.biz_no 在充值时存的就是 point_order.order_no(消费存的是计费流水号,不展示)。
+ */
+function orderNo(item) {
+ if (!item || item.type !== 'recharge') return ''
+ return String(item.biz_no || '').trim()
+}
+
+function copyOrderNo(value) {
+ if (!value) return
+ uni.setClipboardData({
+ data: value,
+ success: () => toast('订单号已复制'),
+ fail: () => toast('复制失败,请长按选择')
+ })
+}
+
function getTypeMark(type) {
return typeMark[type] || '记'
}
@@ -574,6 +597,30 @@ function goRecharge() {
font-size: 22rpx;
}
+.ledger-order {
+ margin-top: 10rpx;
+ display: flex;
+ align-items: center;
+ gap: 10rpx;
+}
+
+.ledger-order-text {
+ min-width: 0;
+ flex: 1;
+ color: #9aa4b2;
+ font-size: 21rpx;
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+}
+
+.ledger-order-copy {
+ flex-shrink: 0;
+ color: #0b8cff;
+ font-size: 21rpx;
+ font-weight: 800;
+}
+
.ledger-type {
height: 34rpx;
padding: 0 14rpx;
diff --git a/pages/login/login.vue b/pages/login/login.vue
index a63ea13..d202b09 100644
--- a/pages/login/login.vue
+++ b/pages/login/login.vue
@@ -3,10 +3,9 @@
- 登录后同步作品、点数和创作记录
@@ -23,14 +22,14 @@
@getphonenumber="getPhoneNumber"
@click="onPhoneLoginClick"
>
-
+
手机号登录
@@ -69,6 +68,7 @@ import { userApi } from '@/api/index.js'
import { useUserStore } from '@/store/user.js'
import { useApp } from '@/utils/useApp.js'
import { isInWechat } from '@/utils/util.js'
+import { rememberLoginSource, returnAfterLogin } from '@/utils/login.js'
import CONFIG from '@/utils/config.js'
const userStore = useUserStore()
@@ -89,9 +89,9 @@ onLoad((options = {}) => {
type.value = options.type || '1'
source.value = options.source || ''
const redirect = options.redirect || options.url || ''
+ rememberLoginSource(redirect)
// #ifdef H5
- if (redirect) uni.setStorageSync('login_redirect', decodeURIComponent(redirect))
if (options.code) postLogin(options.code) // 公众号授权回跳
// #endif
@@ -260,10 +260,10 @@ function afterLogin(res) {
if (inviteCode) uni.removeStorageSync('invite_code')
- // 统一跳回首页
+ // 返回发起登录的页面,navigateBack/reLaunch 都会触发目标页重新读取登录态
setTimeout(() => {
- uni.switchTab({ url: '/pages/toolbox/toolbox' })
- }, 1200)
+ returnAfterLogin()
+ }, 800)
}
@@ -289,13 +289,6 @@ function afterLogin(res) {
display: block;
}
-.login-tip {
- margin-top: 24rpx;
- color: #7f8896;
- font-size: 26rpx;
- line-height: 1.4;
-}
-
.login-actions {
margin-top: 92rpx;
display: flex;
@@ -329,14 +322,14 @@ function afterLogin(res) {
&.wechat {
color: #fff;
- background: #46bb36;
- box-shadow: 0 14rpx 28rpx rgba(70, 187, 54, 0.18);
+ background: #0b8cff;
+ box-shadow: 0 14rpx 28rpx rgba(11, 140, 255, 0.2);
}
&.phone {
- color: #46bb36;
+ color: #0b8cff;
background: #ffffff;
- border: 2rpx solid rgba(70, 187, 54, 0.55);
+ border: 2rpx solid rgba(11, 140, 255, 0.48);
}
}
@@ -396,8 +389,8 @@ function afterLogin(res) {
flex-shrink: 0;
&.checked {
- background: #46bb36;
- border-color: #46bb36;
+ background: #0b8cff;
+ border-color: #0b8cff;
}
}
diff --git a/pages/login/phone.vue b/pages/login/phone.vue
index a980a44..5bf1c2b 100644
--- a/pages/login/phone.vue
+++ b/pages/login/phone.vue
@@ -23,9 +23,11 @@
+
+
diff --git a/pages/my/feedback.vue b/pages/my/feedback.vue
new file mode 100644
index 0000000..36f4def
--- /dev/null
+++ b/pages/my/feedback.vue
@@ -0,0 +1,321 @@
+
+
+ {{ tipText }}
+
+
+
+ *问题类型
+
+
+ {{ item.label }}
+
+
+
+
+
+
+
+ *反馈内容
+ {{ form.content.length }}/500
+
+
+
+
+
+
+ *联系电话
+
+
+
+
+
+
+ *问题截图
+ {{ form.imgs.length }}/9
+
+
+
+
+ ×
+
+
+ +
+ 上传截图
+
+
+ 支持 PNG / JPG,单张不超过 10M
+
+
+
+
+ {{ submitting ? '提交中...' : '提交反馈' }}
+
+
+
+
+
+
+
+
diff --git a/pages/my/setting.vue b/pages/my/setting.vue
new file mode 100644
index 0000000..3edfdcc
--- /dev/null
+++ b/pages/my/setting.vue
@@ -0,0 +1,127 @@
+
+
+
+ 关于
+
+
+ {{ item.name }}
+ {{ item.value }}
+
+
+
+
+
+
+ 账号
+
+
+ 退出登录
+
+
+
+
+
+
+
+
+
diff --git a/pages/my/wechat.vue b/pages/my/wechat.vue
new file mode 100644
index 0000000..7793ee4
--- /dev/null
+++ b/pages/my/wechat.vue
@@ -0,0 +1,140 @@
+
+
+
+ AIONLINE 助手
+ 关注公众号
+ 分享 AI 资讯与使用技巧,并定期发放福利。
+
+
+
+
+ AIonline助手
+
+
+
+ 1点击二维码查看大图
+ 2长按保存到相册
+ 3打开微信扫一扫识别
+
+
+ 1长按上方二维码
+ 2识别并前往图中的公众号
+ 3点击关注即可
+
+
+
+
+
+ 关注后可以做什么
+ · 第一时间收到新功能与活动通知
+ · 获取 AI 绘画、写作的实用提示词
+ · 参与不定期的点数与会员福利活动
+
+
+
+
+
+
+
diff --git a/pages/point/earn.vue b/pages/point/earn.vue
new file mode 100644
index 0000000..5cca24e
--- /dev/null
+++ b/pages/point/earn.vue
@@ -0,0 +1,523 @@
+
+
+
+
+
+ 获得点数
+ 当前 {{ balance }} 点
+ 完成下面的任务即可获得点数,点数可用于全部 AI 工具
+
+
+ 明细
+ 充值
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ pointCopy(checkinTask.title, '每日签到') }}
+ {{ pointCopy(checkinTask.desc, '每天签到一次,点数立即到账') }}
+
+ {{ checkinTask.checked_in ? '今日已完成,明天再来' : '今日尚未签到' }}
+
+
+
+ +{{ checkinTask.points_per_checkin }}
+
+ {{ checkinBtnText }}
+
+
+
+
+
+
+
+
+ ▶
+
+
+ {{ pointCopy(adTask.title, '看视频获得点数') }}
+ {{ pointCopy(adTask.desc, '完整观看一段视频即可获得点数') }}
+ {{ adProgressText }}
+
+
+ +{{ adTask.points_per_ad }}
+
+ {{ adBtnText }}
+
+
+
+
+
+
+
+
+ +
+
+
+ 邀请好友注册
+
+ 好友注册成功,你获得 {{ inviteTask.inviter_points }} 点,好友也获得 {{ inviteTask.invitee_points }} 点
+
+
+ 已邀请 {{ inviteTask.stats.success || 0 }} 人 · 累计获得 {{ inviteTask.stats.inviter_points || 0 }} 点
+
+
+
+ +{{ inviteTask.inviter_points }}
+ 去邀请
+
+
+
+
+
+
+ 暂无可做的任务
+ 活动暂未开启,可以先通过充值获得点数。
+ 去充值
+
+
+
+
+ 规则说明
+ · {{ line }}
+
+
+
+
+
+
+
+
diff --git a/pages/profile/profile.vue b/pages/profile/profile.vue
index c58abe5..af03af5 100644
--- a/pages/profile/profile.vue
+++ b/pages/profile/profile.vue
@@ -1,73 +1,123 @@
-
+
-
+
-
- {{ userStore.isLogin ? `Hi,${userStore.nickname}!` : 'Hi,手机微信昵称!' }}
+
+ {{ `Hi,${userStore.nickname || 'AI在线用户'}!` }}
点数余额
- {{ userStore.isLogin ? userStore.pointsText : '123456' }}
+ {{ userStore.pointsText }}
账单
充值
+
+
+
+
+
+
+ 登录 AI在线
+ 同步点数、作品与创作记录
+
+
+
+ 登录后可跨设备查看创作数据
+
+ 立即登录
+
+
+
+
-
@@ -177,7 +244,10 @@ onShow(() => {
overflow: hidden;
background: linear-gradient(135deg, #3f94ff 0%, #2384f8 100%);
box-sizing: border-box;
+}
+.guest-card {
+ background: linear-gradient(135deg, #4298ff 0%, #1677ef 100%);
}
.balance-texture {
@@ -198,6 +268,92 @@ onShow(() => {
box-sizing: border-box;
}
+.guest-copy {
+ position: relative;
+ z-index: 1;
+ height: 100%;
+ padding: 36rpx 42rpx 34rpx;
+ display: flex;
+ flex-direction: column;
+ box-sizing: border-box;
+}
+
+.guest-main {
+ display: flex;
+ align-items: center;
+ min-width: 0;
+}
+
+.guest-avatar {
+ width: 84rpx;
+ height: 84rpx;
+ border-radius: 50%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ flex-shrink: 0;
+ background: rgba(255, 255, 255, 0.96);
+ box-shadow: 0 10rpx 24rpx rgba(16, 87, 174, 0.2);
+}
+
+.guest-text {
+ margin-left: 24rpx;
+ min-width: 0;
+ display: flex;
+ flex-direction: column;
+}
+
+.guest-title {
+ color: #ffffff;
+ font-size: 34rpx;
+ font-weight: 700;
+ line-height: 1.25;
+}
+
+.guest-description {
+ margin-top: 8rpx;
+ color: rgba(255, 255, 255, 0.78);
+ font-size: 24rpx;
+ line-height: 1.4;
+}
+
+.guest-bottom {
+ margin-top: auto;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: 20rpx;
+}
+
+.guest-tip {
+ color: rgba(255, 255, 255, 0.68);
+ font-size: 22rpx;
+ line-height: 1.35;
+}
+
+.login-btn {
+ min-width: 180rpx;
+ height: 64rpx;
+ padding: 0 24rpx 0 28rpx;
+ border-radius: 32rpx;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ gap: 6rpx;
+ flex-shrink: 0;
+ color: #2384f8;
+ font-size: 27rpx;
+ font-weight: 700;
+ background: #ffffff;
+ box-shadow: 0 10rpx 24rpx rgba(16, 87, 174, 0.18);
+ box-sizing: border-box;
+}
+
+.login-btn--pressed {
+ opacity: 0.84;
+ transform: scale(0.98);
+}
+
.hello {
max-width: 430rpx;
color: #ffffff;
@@ -260,10 +416,19 @@ onShow(() => {
background: rgba(255, 255, 255, 0.08);
}
+.menu-group {
+ margin-top: 26rpx;
+}
+
+.group-title {
+ display: block;
+ margin: 0 8rpx 12rpx;
+ color: #8a95a6;
+ font-size: 23rpx;
+ font-weight: 800;
+}
+
.menu-panel {
- margin-top: 28rpx;
- padding-top: 18rpx;
- padding-bottom: 14rpx;
border-radius: 21rpx;
background: #ffffff;
overflow: hidden;
@@ -272,20 +437,21 @@ onShow(() => {
.menu-row {
position: relative;
- height: 100rpx;
- padding: 0 27rpx 0 27rpx;
+ min-height: 108rpx;
+ padding: 20rpx 27rpx;
display: flex;
align-items: center;
box-sizing: border-box;
+ /* 分隔线只在图标右侧起始,视觉上更整齐 */
&::after {
content: '';
position: absolute;
- left: 25rpx;
+ left: 105rpx;
right: 24rpx;
bottom: 0;
height: 1rpx;
- background: #eeeeee;
+ background: #f1f5fa;
}
&:last-child::after {
@@ -294,44 +460,33 @@ onShow(() => {
}
.menu-icon {
- width: 34rpx;
- height: 34rpx;
+ width: 68rpx;
+ height: 68rpx;
+ border-radius: 18rpx;
+ display: flex;
+ align-items: center;
+ justify-content: center;
flex-shrink: 0;
}
.menu-name {
- margin-left: 25rpx;
- color: #333333;
- font-size: 28rpx;
- line-height: 1;
+ margin-left: 22rpx;
+ color: #172033;
+ font-size: 29rpx;
+ line-height: 1.3;
flex: 1;
min-width: 0;
}
.menu-hint {
margin-left: 20rpx;
- max-width: 300rpx;
- color: #999999;
- font-size: 26rpx;
- line-height: 1;
+ max-width: 280rpx;
+ color: #8a95a6;
+ font-size: 24rpx;
+ line-height: 1.3;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
-.arrow {
- width: 14rpx;
- height: 22rpx;
- margin-left: 20rpx;
- flex-shrink: 0;
-}
-
-.logout {
- height: 104rpx;
- color: #333333;
- font-size: 27rpx;
- display: flex;
- align-items: center;
- justify-content: center;
-}
diff --git a/pages/recharge/recharge.vue b/pages/recharge/recharge.vue
index 674bc0d..8a86dbb 100644
--- a/pages/recharge/recharge.vue
+++ b/pages/recharge/recharge.vue
@@ -26,6 +26,10 @@
{{ item.badge }}
{{ item.points }}点
¥{{ item.price_yuan }}
+
+ ¥{{ item.old_price_yuan }}
+ 多送{{ item.bonus_percent }}%
+
@@ -339,6 +343,27 @@ $muted: #8b95a3;
font-weight: 800;
color: $accent;
}
+ .offer-row {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ gap: 8rpx;
+ min-height: 30rpx;
+ white-space: nowrap;
+ }
+ .old-price {
+ color: #9aa6b2;
+ font-size: 21rpx;
+ text-decoration: line-through;
+ }
+ .bonus {
+ padding: 3rpx 8rpx;
+ border-radius: 999rpx;
+ color: #159a54;
+ background: #edfdf4;
+ font-size: 19rpx;
+ font-weight: 900;
+ }
}
/* 确认充值 */
diff --git a/pages/tool/id-photo-detail.vue b/pages/tool/id-photo-detail.vue
new file mode 100644
index 0000000..e3cecc4
--- /dev/null
+++ b/pages/tool/id-photo-detail.vue
@@ -0,0 +1,451 @@
+
+
+
+
+
+
+ {{ stateTitle }}
+ {{ countDown }} S 后刷新
+ {{ detail.error_msg || '暂时无法读取证件照成品,请稍后重试' }}
+ 重新制作
+
+
+
+
+
+
+ FINISHED PHOTO
+ {{ detail.spec_name || '证件照' }}
+
+ {{ detail.dpi || 300 }} DPI
+
+
+
+
+ 点击照片可查看大图
+
+
+
+ 成品信息
+
+ 证件照规格
+ {{ detail.spec_name || '-' }}
+
+
+ 像素尺寸
+ {{ sizeText }}
+
+
+ 背景颜色
+
+
+ {{ String(detail.background || '#438EDB').toUpperCase() }}
+
+
+
+ 画面优化
+ {{ beautyText }}
+
+
+ 创建时间
+ {{ formatTime(detail.add_time) }}
+
+
+
+
+
+
+
+
+
+ 保存照片
+
+ 再做一张
+
+
+
+
+
+
+
diff --git a/pages/tool/id-photo-history.vue b/pages/tool/id-photo-history.vue
new file mode 100644
index 0000000..91201a1
--- /dev/null
+++ b/pages/tool/id-photo-history.vue
@@ -0,0 +1,554 @@
+
+
+
+
+
+
+ ID PHOTO RECORDS
+ 我的证件照
+ 制作记录会自动保存,可随时查看成品、下载照片或继续制作。
+
+ 制作
+
+
+
+
+ {{ total || list.length }}
+ 全部记录
+
+
+ {{ pendingCount }}
+ 制作中
+
+
+ {{ successCount }}
+ 已完成
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.status_text || statusText(item) }}
+
+
+ 正在制作
+
+
+ {{ item.summary || '制作失败' }}
+
+
+
+
+ {{ item.title || '证件照' }}
+ {{ item.subtitle || '标准证件照' }}
+
+ {{ formatTime(item.add_time) }}
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+ 还没有证件照
+ 上传一张清晰正面照,制作符合规格的证件照。
+ 去制作
+
+
+ {{ list.length ? '加载更多...' : '加载中...' }}
+ 已经到底了
+
+
+
+
+
+
+
+
diff --git a/pages/tool/id-photo.vue b/pages/tool/id-photo.vue
index 8d32d20..7464054 100644
--- a/pages/tool/id-photo.vue
+++ b/pages/tool/id-photo.vue
@@ -1,164 +1,281 @@
-
-
-
-
- ID PHOTO STUDIO
- 快速制作标准证件照
- 选择尺寸、背景和服装,生成适合报名、签证、证件使用的照片。
-
-
-
-
-
-
-
-
-
-
+
+
+
+ SMART ID PHOTO
+ 一张自拍,制作标准证件照
+ 上传一张清晰正面照,自动换好底色、裁成所需尺寸,几秒获得可直接下载使用的高清证件照。
+
+ 300 DPI
+ 快速换底色
+
+
-
-
-
- *上传图片
- 上传正面半身照,自动裁切为证件照
-
- 0/1
-
-
-
- +
-
-
- 选择一张清晰照片
- 建议五官无遮挡、背景简单、光线均匀
-
- 上传
+
+
+
+ 照片预览
+ {{ previewDescription }}
+ 历史记录
-
-
- 选尺寸
- 常用规格
+
+
+
-
-
- 搜索
+ 点击上传一张照片
+ 支持 JPG、PNG、WebP,不超过 10MB
+ 选择照片
+
+ 正面平视
+ 光线均匀
+ 单人半身
-
-
-
- {{ tab.name }}
-
-
-
-
-
-
- {{ item.name }}
- {{ item.pixel }}
- {{ item.print }}
+
+
+
+
+
+
+
+
+
+
+ 正在处理照片
+ {{ progress }}%
+
+
+
+
+
+ {{ progressStage }} · 预计还需 {{ estimatedSeconds }} 秒
+
-
+
+
+
+ {{ selectedSpec ? `${selectedSpec.width} × ${selectedSpec.height}px` : photoMetaText }}
+ 已生成 {{ result.dpi || selectedSpec?.dpi || 300 }} DPI
+ 制作前不会上传原图
+
+
+
+ {{ errorMessage }}
+
+
+
+ 保存照片
+ {{ result ? '制作新照片' : '更换照片' }}
+
+
-
-
- 选背景
- 生成后可替换
+
+
+
+ 选择规格
+ 规格由后台统一配置,成品严格输出所选像素
-
+ {{ selectedSpec?.dpi || 300 }} DPI
+
+
+
+
+
+ ×
+
+
+
+
-
- {{ item.name }}
+ {{ item.name }}
+
+
+
+
+
+ {{ item.name }}
+ 常用
+
+ {{ item.width }}×{{ item.height }}px
+ {{ item.print || item.print_size }}
+
+ 没有匹配的证件照规格
+
-
-
- 性别
- 用于服装推荐
+
+
+
+ 背景与自然优化
+ 换色与微调不重复扣点,已生成照片可快速应用
-
-
- {{ item }}
+ 待应用
+
+
+ 背景颜色
+
+
+
+
+ {{ item.name }}
-
-
- 选服装
- 可选
-
-
-
- {{ item }}
+ 画面优化
+
+
+
+
+ {{ item.name }}
+ {{ item.desc }}
-
-
- 描述词
- 可补充要求
+
+
+
+ 构图微调
+ 拖动后点击应用,不会重新抠图或扣点
+
+ 恢复默认
-
-
-
- {{ item }}
+
+
+
+ 人物大小
+ {{ Math.round(settings.scale * 100) }}%
+
+
+
+
+
+
+ 水平位置
+ {{ adjustmentText(settings.offset_x, '左', '右') }}
+
+
+
+
+
+ 垂直位置
+ {{ adjustmentText(settings.offset_y, '上', '下') }}
+
+
+
+
+
+ {{ rerendering ? '正在快速应用...' : '应用调整' }}
-
+
-
- {{ balanceText }}
- 去充值
+
+ {{ billingLabel }}
+ {{ billingSubtext }}
-
- 历史记录
-
-
- {{ submitText }}
+
+ 历史记录
+
+
+ {{ primaryText }}
@@ -166,632 +283,1451 @@
diff --git a/pages/tool/old-photo-detail.vue b/pages/tool/old-photo-detail.vue
new file mode 100644
index 0000000..b47d2d6
--- /dev/null
+++ b/pages/tool/old-photo-detail.vue
@@ -0,0 +1,434 @@
+
+
+
+
+
+
+
+ {{ isPending ? (Number(detail.status) === 10 ? '排队中,请耐心等待' : 'AI 正在修复上色') : '修复失败' }}
+ {{ countDown }} S
+ {{ detail.error_msg || '本次未扣点,可以换一张更清晰的照片重试' }}
+
+
+
+
+
+ 查看对比
+
+
+
+ 修复信息
+
+ 修复档位:
+ {{ detail.mode_name || '-' }}
+
+
+ 当前状态:
+ {{ detail.status_text || '-' }}
+
+
+ 原图尺寸:
+ {{ detail.source_width }} × {{ detail.source_height }}px
+
+
+ 清晰度:
+ 已做高清增强
+
+
+ 创建时间:
+ {{ formatTime(detail.add_time) }}
+
+
+ 功能来源:
+ 老照片修复 / 上色
+
+ AI 会重绘上色,五官可能出现轻微变化,建议对照原图确认。
+
+
+
+
+
+ 保存
+ 对比
+ 再修一张
+
+
+
+
+
+
+
+ 效果对比
+ ×
+
+
+
+
+
+
+
+
+ ‹
+ ›
+
+
+ 原图
+ 修复后
+
+ 左右滑动中间按钮查看变化
+
+
+
+
+
+
+
+
diff --git a/pages/tool/old-photo-history.vue b/pages/tool/old-photo-history.vue
new file mode 100644
index 0000000..3e19227
--- /dev/null
+++ b/pages/tool/old-photo-history.vue
@@ -0,0 +1,393 @@
+
+
+
+
+
+
+ OLD PHOTO GALLERY
+ 我的老照片
+ 每次修复结果都会保存,完成后可查看对比、保存原图或继续修复。
+
+ 修复
+
+
+
+
+ {{ total || list.length }}
+ 全部记录
+
+
+ {{ pendingCount }}
+ 生成中
+
+
+ {{ successCount }}
+ 已完成
+
+
+
+
+
+
+
+
+
+ {{ item.status_text }}
+
+
+
+ {{ Number(item.status) === 10 ? '排队中' : '正在修复' }}
+
+
+ {{ item.error_msg || '修复失败' }}
+
+
+
+
+ {{ item.mode_name || '老照片修复' }}
+
+ {{ formatTime(item.add_time) }}
+ 删除
+
+
+
+
+
+
+
+
+
+ 还没有修复记录
+ 上传一张老照片,试试修复和上色的效果。
+ 去修复
+
+
+ {{ list.length ? '加载更多...' : '加载中...' }}
+ 已经到底了
+
+
+
+
+
+
+
+
diff --git a/pages/tool/old-photo.vue b/pages/tool/old-photo.vue
index cca93bb..9f089c5 100644
--- a/pages/tool/old-photo.vue
+++ b/pages/tool/old-photo.vue
@@ -1,145 +1,270 @@
-
-
-
-
-
- OLD PHOTO RESTORE
- 老照片修复 / 上色
- 适合黑白、泛黄、模糊、划痕或破损照片,先搭建 UI,生成逻辑后续接入。
-
-
-
-
+
+
+
+ OLD PHOTO RESTORE
+ 老照片修复 / 上色
+ 黑白、泛黄、模糊、有划痕的照片都能修。AI 会重绘上色,五官可能有轻微变化。
+
+ 查看对比
+ 上传照片
+
+
+
+
+
+
+
+
+
+
+ 原图
+ 修复
+
+
-
-
-
- *上传照片
- 支持黑白、泛黄、模糊、划痕或破损照片
-
- 0/1
-
-
- +
-
- 上传需要修复的老照片
- 建议选择主体清晰、人物不被严重遮挡的照片
-
- 上传
-
+
+
+
+ {{ job.title || '修复结果' }}
+ {{ job.status_text }}
+
+
+
+
+
+ {{ progressTitle }}
+ 已等待 {{ waitedSeconds }} 秒,可以留在本页等待,也可以稍后从历史记录查看
+
+
+
+
+ {{ job.error_msg || '生成失败' }}
+ 本次未扣点,可以换一张更清晰的照片重试
+
+
+
+
+
+
+
+
+ 查看对比
+ 保存到相册
+ 再修一张
+
+
-
-
- 照片风格
- 输出方式
-
-
-
- {{ item }}
-
-
+
+
+
+
+ *上传照片
+ 支持黑白、泛黄、模糊、划痕或破损照片,单张不超过 10M
+
+ {{ localImage ? '1/1' : '0/1' }}
+
+
+
+
+ +
+
+
+ {{ localImage ? '已选择照片,可点击更换' : '上传需要修复的老照片' }}
+ 建议主体清晰、人物未被严重遮挡
+ {{ localImage ? '更换' : '上传' }}
+
+
-
-
- 描述关键词
- 点击添加
-
-
-
-
- {{ item }}
-
+
+
+
+ 修复档位
+ 按张计费
+
+
+
+
+ {{ item.name }}
+ {{ item.desc }}
+ {{ item.points }}点
-
+
+
+
+
+ 补充说明
+ 选填
+
+
+
+ · {{ tip }}
+
+
+
+
{{ balanceText }}
去充值
- 历史记录
-
+ 历史记录
+
{{ submitText }}
+
+
+
+
+
+
+ {{ comparePair.title }}
+ ×
+
+
+
+
+
+
+
+
+ ‹
+ ›
+
+
+ 原图
+ 修复后
+
+ 左右滑动中间按钮查看变化
+
+
+
diff --git a/pages/tool/portrait-detail.vue b/pages/tool/portrait-detail.vue
new file mode 100644
index 0000000..427ae91
--- /dev/null
+++ b/pages/tool/portrait-detail.vue
@@ -0,0 +1,503 @@
+
+
+
+
+
+
+
+ {{ stateTitle }}
+ {{ detail.success_count || 0 }} / {{ detail.count || 0 }} 张 · {{ countDown }}S
+ {{ detail.error_msg || '失败的照片不扣点,可以重新生成' }}
+
+
+
+
+
+
+ {{ activeIndex + 1 }} / {{ resultUrls.length }}
+
+
+
+
+
+
+
+ 生成信息
+
+ 照片风格:
+ {{ detail.style_name || '-' }}
+
+
+ {{ item.label }}:
+ {{ item.value }}
+
+
+ 生成模型:
+ {{ detail.model_name || '-' }}
+
+
+ 图片比例:
+ {{ detail.ratio || '-' }}
+
+
+ 生成张数:
+
+ 成功 {{ detail.success_count || 0 }} 张,失败 {{ detail.fail_count }} 张
+
+
+
+ 补充描述:
+ {{ detail.extra_prompt }}
+
+
+ 创建时间:
+ {{ formatTime(detail.add_time) }}
+
+
+ 功能来源:
+ 形象照 / 职业照 / 写真
+
+ AI 会重绘服装与背景,五官可能出现轻微变化,建议对照原图确认。
+
+
+
+
+
+ 保存
+ 对比
+ 再拍一组
+
+
+
+
+
+
+
+ 效果对比
+ ×
+
+
+
+
+
+
+
+
+ ‹
+ ›
+
+
+ 原图
+ 生成图
+
+ 左右滑动中间按钮查看变化
+
+
+
+
+
+
+
+
diff --git a/pages/tool/portrait-history.vue b/pages/tool/portrait-history.vue
new file mode 100644
index 0000000..f27a370
--- /dev/null
+++ b/pages/tool/portrait-history.vue
@@ -0,0 +1,408 @@
+
+
+
+
+
+
+ PORTRAIT GALLERY
+ 我的形象照
+ 每次生成的照片都会保存,完成后可查看大图、保存原图或继续创作。
+
+ 生成
+
+
+
+
+ {{ total || list.length }}
+ 全部记录
+
+
+ {{ pendingCount }}
+ 生成中
+
+
+ {{ photoCount }}
+ 已出图
+
+
+
+
+
+
+
+
+
+ {{ item.status_text }}
+ {{ item.success_count }}张
+
+
+
+ {{ item.success_count || 0 }}/{{ item.count || 0 }} 张
+
+
+ {{ item.error_msg || '生成失败' }}
+
+
+
+
+ {{ item.style_name || '形象照' }}
+
+ {{ formatTime(item.add_time) }}
+ 删除
+
+
+
+
+
+
+
+
+
+ 还没有形象照
+ 上传一张人像照片,试试商务形象照或艺术写真。
+ 去生成
+
+
+ {{ list.length ? '加载更多...' : '加载中...' }}
+ 已经到底了
+
+
+
+
+
+
+
+
diff --git a/pages/tool/portrait-photo.vue b/pages/tool/portrait-photo.vue
index 7fbc845..9129d52 100644
--- a/pages/tool/portrait-photo.vue
+++ b/pages/tool/portrait-photo.vue
@@ -1,220 +1,414 @@
-
-
-
-
-
- PORTRAIT PHOTO STUDIO
- 生成你的职业形象照
- 从商务形象、普通职业到艺术写真,快速得到适合头像和简历的照片。
-
-
-
-
-
-
-
-
-
-
+
+
+
+ PORTRAIT PHOTO STUDIO
+ 生成你的职业形象照
+ 从商务形象、普通职业到艺术写真。AI 会重绘服装与背景,五官可能有轻微变化。
+
+ 查看对比
+ 上传照片
+
+
+
+
+
+
+
+
+
+
+ 原图
+ 艺术
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
- *上传照片
- 建议选择五官无遮挡、光线均匀的半身照
-
- 0/1
-
-
- +
-
- 上传正面清晰人像照片
- 支持自拍、半身照,生成商务照、职业照或写真
-
- 上传
-
+
+
+
+ {{ job.style_name || '生成结果' }}
+ {{ progressText }}
+
+
+
+
+ {{ pendingTitle }}
+ 已等待 {{ waitedSeconds }} 秒,可以留在本页等待,也可以稍后从记录里查看
+
+
+
+ {{ job.error_msg || '生成失败' }}
+ 失败的照片不扣点,可以换一张更清晰的照片重试
+
+
+
+
+
+
+
+ 查看详情
+ 保存全部
+ 再拍一组
+
+
-
-
- 照片风格
- 选择生成方向
-
-
-
- {{ item.name }}
-
-
+
+
+
+
+ *上传照片
+ 建议选择五官无遮挡、光线均匀的半身照,单张不超过 10M
+
+ {{ localImage ? '1/1' : '0/1' }}
+
+
+
+
+ +
+
+
+ {{ localImage ? '已选择照片,可点击更换' : '上传正面清晰人像照片' }}
+ 支持自拍、半身照,生成商务照、职业照或写真
+
+ {{ localImage ? '更换' : '上传' }}
+
+
-
-
- 纯色背景
-
-
- {{ item.name }}
-
-
-
-
- 服装
-
- 正装
- 衬衫
-
-
-
- 取景范围
-
- 半身
- 全身
- 胸像
-
-
-
+
+
+
+ 生成模型
+ 不同模型价格可能不同
+
+
+
+ {{ item.name }}
+
+
+
-
-
- 背景
-
- {{ item }}
-
-
-
- 服装
-
- {{ item }}
-
-
-
+
+
+
+ 照片风格
+ 选择生成方向
+
-
-
- {{ item }}
-
+
+
+
+
+
+
+
+ {{ item.name }}
-
-
- 图片比例
- 构图尺寸
-
-
-
- {{ item }}
+
+
+ {{ group.name }}
+
+
+ {{ item.name }}
+
+
+
-
-
- 生成数量
- 20点/张,共{{ quantity * 20 }}点
-
-
- -
- {{ quantity }}
- +
-
- 按单张收费,每次最多生成10张
+
+
+
+ 图片比例
+ 构图尺寸
+
+
+
+ {{ item.name }}
+
+
-
-
- 补充描述
- 可选
-
-
-
+
+
+
+ 生成数量
+ {{ unitPoints }}点/张,共{{ totalPoints }}点
+
+
+ -
+ {{ quantity }}
+ +
-
+ 按单张收费,一次最多生成{{ maxCount }}张,失败的不扣点
+
+
+
+
+ 补充描述
+ 选填
+
+
+
+ · {{ tip }}
+
+
+
+
{{ balanceText }}
去充值
- 历史记录
-
+ 生成记录
+
{{ submitText }}
+
+
+
+
+
+
+ {{ comparePair.title }}
+ ×
+
+
+
+
+
+
+
+
+ ‹
+ ›
+
+
+ 原图
+ 艺术照
+
+ 左右滑动中间按钮查看变化
+
+
diff --git a/pages/tool/work-detail.vue b/pages/tool/work-detail.vue
index a927c44..7236a66 100644
--- a/pages/tool/work-detail.vue
+++ b/pages/tool/work-detail.vue
@@ -160,8 +160,9 @@ function getPageStackDelta(routeName) {
height: 0;
}
+/* 底栏是 fixed 的,留够 300rpx 才不会盖住内容 */
.wrap {
- padding: 28rpx 28rpx 150rpx;
+ padding: 28rpx 28rpx 300rpx;
}
.state-card,
diff --git a/pages/toolbox/toolbox.vue b/pages/toolbox/toolbox.vue
index 46721eb..3de2090 100644
--- a/pages/toolbox/toolbox.vue
+++ b/pages/toolbox/toolbox.vue
@@ -32,7 +32,9 @@
-
+
+
+
{{ item.name }}
{{ item.desc }}
@@ -301,10 +303,19 @@ function onRefresh() {
}
}
-.tool-icon {
+.tool-icon-wrap {
width: 91rpx;
height: 91rpx;
flex-shrink: 0;
+ border-radius: 12rpx;
+ overflow: hidden;
+ background: #edf7ff;
+}
+
+.tool-icon {
+ width: 100%;
+ height: 100%;
+ display: block;
}
.tool-main {
diff --git a/pages/works/works.vue b/pages/works/works.vue
index 3f44bd2..101d80d 100644
--- a/pages/works/works.vue
+++ b/pages/works/works.vue
@@ -5,24 +5,36 @@
-
-
- {{ item.name }}
- {{ counts[item.key] || 0 }}
+
+
+
+
+ {{ item.name }}
+ {{ counts[item.key] || 0 }}
+
-
+