fix: subscription extend instead of overwrite, improve placeholder pages

- Subscription purchase now extends expire_time when user has active
  subscription, instead of cancelling and replacing
- Admin subscription creation uses same extend logic
- Subscribe page shows "续费" button and extend message for renewals
- Help and contact pages: add pink header, centered icon + text
这个提交包含在:
Guoguo
2026-04-29 08:35:58 -07:00
父节点 9bdccdcec8
当前提交 1017fb5dae
修改 8 个文件,包含 114 行新增32 行删除
+44 -15
查看文件
@@ -62,7 +62,9 @@ async function createTrial(userId, orderId) {
}
/**
* Purchase / activate a subscription: expire old active subs, insert new one
* Purchase / activate a subscription: extend existing or create new
* If user has an active subscription, add days to current expire_time.
* If no active subscription, insert a new one starting NOW().
* @param {number} userId
* @param {string} plan - 'monthly' | 'yearly' | 'trial'
* @param {number} amount
@@ -72,20 +74,34 @@ async function createTrial(userId, orderId) {
*/
async function purchase(userId, plan, amount, orderId, days) {
return transaction(async conn => {
await conn.execute(
'UPDATE subscriptions SET status = 2 WHERE user_id = ? AND status = 1',
const [rows] = await conn.execute(
'SELECT subscription_id FROM subscriptions WHERE user_id = ? AND status = 1 AND expire_time > NOW() LIMIT 1',
[userId]
)
await conn.execute(
'INSERT INTO subscriptions (user_id, plan, status, amount, order_id, start_time, expire_time) VALUES (?, ?, 1, ?, ?, NOW(), DATE_ADD(NOW(), INTERVAL ? DAY))',
[userId, plan, amount, orderId, days]
)
if (rows.length > 0) {
// Extend existing active subscription
await conn.execute(
'UPDATE subscriptions SET expire_time = DATE_ADD(expire_time, INTERVAL ? DAY), plan = ?, amount = amount + ? WHERE subscription_id = ?',
[days, plan, amount, rows[0].subscription_id]
)
} else {
// Expire any stale rows (status=1 but already past expire_time), then insert new
await conn.execute(
'UPDATE subscriptions SET status = 2 WHERE user_id = ? AND status = 1',
[userId]
)
await conn.execute(
'INSERT INTO subscriptions (user_id, plan, status, amount, order_id, start_time, expire_time) VALUES (?, ?, 1, ?, ?, NOW(), DATE_ADD(NOW(), INTERVAL ? DAY))',
[userId, plan, amount, orderId, days]
)
}
})
}
/**
* Admin-create a subscription (expire old, insert new) without transaction
* Used by admin subscription creation endpoint
* Admin-create a subscription: extend existing or create new
* If user has an active subscription, add days to current expire_time.
* If no active subscription, insert a new one starting NOW().
* @param {number} userId
* @param {string} plan
* @param {number} amount
@@ -94,14 +110,27 @@ async function purchase(userId, plan, amount, orderId, days) {
* @returns {Promise<void>}
*/
async function adminCreate(userId, plan, amount, orderId, days) {
await query(
'UPDATE subscriptions SET status = 2 WHERE user_id = :user_id AND status = 1',
const active = await one(
'SELECT subscription_id FROM subscriptions WHERE user_id = :user_id AND status = 1 AND expire_time > NOW() LIMIT 1',
{ user_id: userId }
)
await query(
'INSERT INTO subscriptions (user_id, plan, status, amount, order_id, start_time, expire_time) VALUES (:user_id, :plan, 1, :amount, :order_id, NOW(), DATE_ADD(NOW(), INTERVAL :days DAY))',
{ user_id: userId, plan, amount, order_id: orderId, days }
)
if (active) {
// Extend existing active subscription
await query(
'UPDATE subscriptions SET expire_time = DATE_ADD(expire_time, INTERVAL :days DAY), plan = :plan, amount = amount + :amount WHERE subscription_id = :sid',
{ days, plan, amount, sid: active.subscription_id }
)
} else {
// Expire any stale rows, then insert new
await query(
'UPDATE subscriptions SET status = 2 WHERE user_id = :user_id AND status = 1',
{ user_id: userId }
)
await query(
'INSERT INTO subscriptions (user_id, plan, status, amount, order_id, start_time, expire_time) VALUES (:user_id, :plan, 1, :amount, :order_id, NOW(), DATE_ADD(NOW(), INTERVAL :days DAY))',
{ user_id: userId, plan, amount, order_id: orderId, days }
)
}
}
/**