feat(points,store): add activation recharge and full points commerce pages

This commit is contained in:
leeexin committed 2026-03-09 21:36:53 +08:00
1 parent f52cf53067
commit 81cc92efea
21 files changed
+4173 -70

No files matched your search

+2
View File
@@ -19,6 +19,8 @@
{% if user %}
<a class="link-btn" href="{{ url_for('user_profile_page', username=user.username) }}">我的主页</a>
<a class="link-btn" href="{{ url_for('user_achievements_page', username=user.username) }}">我的成就</a>
<a class="link-btn" href="{{ url_for('wallet_page') }}">积分中心</a>
<a class="link-btn" href="{{ url_for('store_page') }}">积分商城</a>
{% endif %}
<a class="link-btn" href="{{ url_for('rooms_page') }}">联机大厅</a>
<a class="link-btn" href="{{ url_for('leaderboard_page') }}">玩家排行</a>
+28
View File
@@ -32,6 +32,11 @@
<a href="{{ url_for('admin_section_page', section='cards') }}" class="{% if admin_section == 'cards' %}active{% endif %}">游戏卡治理</a>
<a href="{{ url_for('admin_section_page', section='modules') }}" class="{% if admin_section == 'modules' %}active{% endif %}">模组治理</a>
<a href="{{ url_for('admin_section_page', section='badges') }}" class="{% if admin_section == 'badges' %}active{% endif %}">职业徽章</a>
<a href="{{ url_for('admin_section_page', section='activation_codes') }}" class="{% if admin_section == 'activation_codes' %}active{% endif %}">激活码</a>
<a href="{{ url_for('admin_section_page', section='shop_items') }}" class="{% if admin_section == 'shop_items' %}active{% endif %}">商品管理</a>
<a href="{{ url_for('admin_section_page', section='shop_orders') }}" class="{% if admin_section == 'shop_orders' %}active{% endif %}">订单管理</a>
<a href="{{ url_for('admin_section_page', section='points') }}" class="{% if admin_section == 'points' %}active{% endif %}">积分管理</a>
<a href="{{ url_for('admin_section_page', section='finance') }}" class="{% if admin_section == 'finance' %}active{% endif %}">财务统计</a>
<a href="{{ url_for('admin_section_page', section='oauth') }}" class="{% if admin_section == 'oauth' %}active{% endif %}">OAuth 配置</a>
</aside>
@@ -57,6 +62,29 @@
<button id="badge-reset" type="button" class="ghost-btn">恢复默认</button>
<button id="badge-save" type="button">保存徽章配置</button>
</div>
{% elif admin_section == 'activation_codes' %}
<h2>激活码管理</h2>
<div class="admin-inline-actions">
<button id="code-generate-btn" type="button" class="secondary-btn">批量生成激活码</button>
</div>
<div id="activation-codes-table" class="table-wrap"></div>
{% elif admin_section == 'shop_items' %}
<h2>商品管理</h2>
<div class="admin-inline-actions">
<button id="shop-item-create-btn" type="button" class="secondary-btn">新增商品</button>
</div>
<div id="shop-items-table" class="table-wrap"></div>
{% elif admin_section == 'shop_orders' %}
<h2>订单管理</h2>
<div id="shop-orders-table" class="table-wrap"></div>
{% elif admin_section == 'points' %}
<h2>积分管理</h2>
<div id="points-users-table" class="table-wrap"></div>
<h3 style="margin-top: 0.8rem;">积分流水</h3>
<div id="points-transactions-table" class="table-wrap"></div>
{% elif admin_section == 'finance' %}
<h2>财务统计</h2>
<div id="finance-summary" class="badge-config-list"></div>
{% else %}
<h2>Linux DO OAuth 配置</h2>
<form id="linuxdo-oauth-form">
+4
View File
@@ -13,6 +13,10 @@
<p id="editor-page-subtitle">创建可复用的多人文字冒险卡,支持多状态条、结束条件与扩展系统。</p>
</div>
<div class="top-actions">
{% if user %}
<a class="link-btn" href="{{ url_for('wallet_page') }}">积分中心</a>
<a class="link-btn" href="{{ url_for('store_page') }}">积分商城</a>
{% endif %}
<a class="link-btn" href="{{ url_for('plaza_page') }}">返回广场</a>
<a class="link-btn" href="{{ url_for('index') }}">返回大厅</a>
</div>
+2
View File
@@ -22,6 +22,8 @@
{% endif %}
<a class="link-btn" href="{{ url_for('user_profile_page', username=user.username) }}">我的主页</a>
<a class="link-btn" href="{{ url_for('user_achievements_page', username=user.username) }}">我的成就</a>
<a class="link-btn" href="{{ url_for('wallet_page') }}">积分中心</a>
<a class="link-btn" href="{{ url_for('store_page') }}">积分商城</a>
<a class="link-btn" href="{{ url_for('rooms_page') }}">联机大厅</a>
<a class="link-btn" href="{{ url_for('leaderboard_page') }}">玩家排行</a>
<a class="link-btn" href="{{ url_for('plaza_page') }}">游戏卡广场</a>
+2
View File
@@ -16,6 +16,8 @@
{% if user %}
<a class="link-btn" href="{{ url_for('user_profile_page', username=user.username) }}">我的主页</a>
<a class="link-btn" href="{{ url_for('user_achievements_page', username=user.username) }}">我的成就</a>
<a class="link-btn" href="{{ url_for('wallet_page') }}">积分中心</a>
<a class="link-btn" href="{{ url_for('store_page') }}">积分商城</a>
{% endif %}
<a class="link-btn" href="{{ url_for('rooms_page') }}">联机大厅</a>
<a class="link-btn" href="{{ url_for('index') }}">返回大厅</a>
+2
View File
@@ -19,6 +19,8 @@
{% if user %}
<a class="link-btn" href="{{ url_for('user_profile_page', username=user.username) }}">我的主页</a>
<a class="link-btn" href="{{ url_for('user_achievements_page', username=user.username) }}">我的成就</a>
<a class="link-btn" href="{{ url_for('wallet_page') }}">积分中心</a>
<a class="link-btn" href="{{ url_for('store_page') }}">积分商城</a>
{% endif %}
<a class="link-btn" href="{{ url_for('leaderboard_page') }}">玩家排行</a>
<a class="link-btn" href="{{ url_for('rooms_page') }}">联机大厅</a>
+2
View File
@@ -22,6 +22,8 @@
{% if user %}
<a class="link-btn" href="{{ url_for('user_profile_page', username=user.username) }}">我的主页</a>
<a class="link-btn" href="{{ url_for('user_achievements_page', username=user.username) }}">我的成就</a>
<a class="link-btn" href="{{ url_for('wallet_page') }}">积分中心</a>
<a class="link-btn" href="{{ url_for('store_page') }}">积分商城</a>
{% endif %}
<a class="link-btn back-home-link" href="/">返回主页</a>
<button id="invite-btn" class="secondary-btn" type="button">邀请链接</button>
+2
View File
@@ -19,6 +19,8 @@
{% if user %}
<a class="link-btn" href="{{ url_for('user_profile_page', username=user.username) }}">我的主页</a>
<a class="link-btn" href="{{ url_for('user_achievements_page', username=user.username) }}">我的成就</a>
<a class="link-btn" href="{{ url_for('wallet_page') }}">积分中心</a>
<a class="link-btn" href="{{ url_for('store_page') }}">积分商城</a>
{% endif %}
<a class="link-btn" id="summary-back-room" href="{{ url_for('room_page', room_id=room_id) }}">返回房间</a>
<a class="link-btn" href="{{ url_for('rooms_page') }}">联机大厅</a>
+2
View File
@@ -16,6 +16,8 @@
{% if user %}
<a class="link-btn" href="{{ url_for('user_profile_page', username=user.username) }}">我的主页</a>
<a class="link-btn" href="{{ url_for('user_achievements_page', username=user.username) }}">我的成就</a>
<a class="link-btn" href="{{ url_for('wallet_page') }}">积分中心</a>
<a class="link-btn" href="{{ url_for('store_page') }}">积分商城</a>
{% endif %}
<a class="link-btn" href="{{ url_for('leaderboard_page') }}">玩家排行</a>
<a class="link-btn" href="{{ url_for('plaza_page') }}">游戏卡广场</a>
+68
View File
@@ -0,0 +1,68 @@
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>积分商城 - Echo Tavern</title>
<link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}" />
</head>
<body class="store-page"
data-user='{{ user | tojson | safe if user else "null" }}'
data-theme="{{ user.theme if user else 'dopamine' }}">
<header class="lobby-topbar">
<div class="brand-block">
<h1>积分商城</h1>
<p>购买游戏卡、模组与装扮特权,消耗积分即时发放权益。</p>
</div>
<div class="top-actions">
{% if user %}
<a class="link-btn" href="{{ url_for('user_profile_page', username=user.username) }}">我的主页</a>
<a class="link-btn" href="{{ url_for('wallet_page') }}">积分中心</a>
<a class="link-btn" href="{{ url_for('user_achievements_page', username=user.username) }}">我的成就</a>
{% endif %}
<a class="link-btn" href="{{ url_for('plaza_page') }}">游戏卡广场</a>
<a class="link-btn" href="{{ url_for('index') }}">返回大厅</a>
</div>
</header>
<main class="plaza-grid">
<section class="card">
<h2>商品列表</h2>
<form id="store-search-form">
<label for="store-type">商品类型</label>
<select id="store-type">
<option value="">全部</option>
<option value="game_card">游戏卡</option>
<option value="module">扩展模组</option>
<option value="decoration">装扮</option>
<option value="privilege">功能特权</option>
<option value="bundle">礼包</option>
</select>
<label for="store-q">关键词</label>
<input id="store-q" maxlength="80" placeholder="输入商品名或描述关键词" />
<button type="submit" class="secondary-btn">筛选</button>
</form>
<div id="store-items" class="cards-grid" style="margin-top: 0.8rem;"></div>
</section>
<section class="card">
<h2>余额信息</h2>
<div id="store-points" class="status-grid"></div>
<h2 style="margin-top: 1rem;">商品详情</h2>
<div id="store-detail" class="profile-hero"></div>
<h2 style="margin-top: 1rem;">我的权益</h2>
<ul id="store-entitlements" class="compact-list"></ul>
<h2 style="margin-top: 1rem;">最近订单</h2>
<div id="store-orders" class="table-wrap"></div>
</section>
</main>
<section id="status" class="status-banner"></section>
<script src="{{ url_for('static', filename='js/theme.js') }}"></script>
<script src="{{ url_for('static', filename='js/invite_notify.js') }}"></script>
<script src="{{ url_for('static', filename='js/store.js') }}"></script>
</body>
</html>
+2
View File
@@ -19,6 +19,8 @@
{% if user %}
<a class="link-btn" href="{{ url_for('user_profile_page', username=user.username) }}">我的主页</a>
<a class="link-btn" href="{{ url_for('user_achievements_page', username=user.username) }}">我的成就</a>
<a class="link-btn" href="{{ url_for('wallet_page') }}">积分中心</a>
<a class="link-btn" href="{{ url_for('store_page') }}">积分商城</a>
{% endif %}
<a class="link-btn" href="{{ url_for('rooms_page') }}">联机大厅</a>
<a class="link-btn" href="{{ url_for('leaderboard_page') }}">返回排行</a>
+59
View File
@@ -0,0 +1,59 @@
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>积分中心 - Echo Tavern</title>
<link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}" />
</head>
<body class="wallet-page"
data-user='{{ user | tojson | safe if user else "null" }}'
data-theme="{{ user.theme if user else 'dopamine' }}">
<header class="lobby-topbar">
<div class="brand-block">
<h1>积分中心</h1>
<p>查看余额、兑换激活码、查询积分流水与订单记录。</p>
</div>
<div class="top-actions">
{% if user %}
<a class="link-btn" href="{{ url_for('user_profile_page', username=user.username) }}">我的主页</a>
<a class="link-btn" href="{{ url_for('user_achievements_page', username=user.username) }}">我的成就</a>
<a class="link-btn" href="{{ url_for('store_page') }}">积分商城</a>
{% endif %}
<a class="link-btn" href="{{ url_for('rooms_page') }}">联机大厅</a>
<a class="link-btn" href="{{ url_for('index') }}">返回大厅</a>
</div>
</header>
<main class="plaza-grid">
<section class="card">
<h2>账户概览</h2>
<div id="wallet-balance" class="status-grid"></div>
<h2 style="margin-top: 1rem;">激活码充值</h2>
<form id="redeem-form">
<label for="redeem-code">输入激活码</label>
<input id="redeem-code" maxlength="64" placeholder="例如 ETXXXXXXXXXXXX" required />
<button type="submit">立即充值</button>
</form>
<p class="helper-text">同一激活码仅可使用一次,频繁尝试会触发风控。</p>
<h2 style="margin-top: 1rem;">到账提醒</h2>
<ul id="wallet-rewards" class="compact-list"></ul>
</section>
<section class="card">
<h2>积分流水</h2>
<div id="wallet-transactions" class="table-wrap"></div>
<h2 style="margin-top: 1rem;">我的订单</h2>
<div id="wallet-orders" class="table-wrap"></div>
</section>
</main>
<section id="status" class="status-banner"></section>
<script src="{{ url_for('static', filename='js/theme.js') }}"></script>
<script src="{{ url_for('static', filename='js/invite_notify.js') }}"></script>
<script src="{{ url_for('static', filename='js/wallet.js') }}"></script>
</body>
</html>