koishi-plugin-rocom 1.0.9 → 1.0.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/client.d.ts CHANGED
@@ -51,8 +51,10 @@ export declare class RocomClient {
51
51
  ingameHomeInfo(ctx: Context, uid: string, waitMs?: number): Promise<any>;
52
52
  ingameMerchantInfo(ctx: Context, shopId: string | number): Promise<any>;
53
53
  getFriendship(ctx: Context, fwToken: string, userIds: string, userIdentifier?: string): Promise<any>;
54
- getStudentState(ctx: Context, fwToken: string, accountType?: number, userIdentifier?: string): Promise<any>;
55
- getStudentPerks(ctx: Context, fwToken: string, area?: number, accountType?: number, userIdentifier?: string): Promise<any>;
56
54
  searchWikiPet(ctx: Context, query: string, limit?: number): Promise<any>;
57
55
  searchWikiSkill(ctx: Context, query: string, limit?: number): Promise<any>;
56
+ getWikiPetDetail(ctx: Context, options: {
57
+ id?: number;
58
+ name?: string;
59
+ }): Promise<any>;
58
60
  }
package/lib/client.js CHANGED
@@ -516,25 +516,19 @@ class RocomClient {
516
516
  async getFriendship(ctx, fwToken, userIds, userIdentifier = '') {
517
517
  return this.get(ctx, '/api/v1/games/rocom/social/friendship', this.rocomHeaders(fwToken, userIdentifier), { user_ids: userIds });
518
518
  }
519
- async getStudentState(ctx, fwToken, accountType, userIdentifier = '') {
520
- const params = {};
521
- if (accountType !== undefined)
522
- params.account_type = accountType;
523
- return this.get(ctx, '/api/v1/games/rocom/activity/student-state', this.rocomHeaders(fwToken, userIdentifier), params);
524
- }
525
- async getStudentPerks(ctx, fwToken, area, accountType, userIdentifier = '') {
526
- const params = {};
527
- if (area !== undefined)
528
- params.area = area;
529
- if (accountType !== undefined)
530
- params.account_type = accountType;
531
- return this.get(ctx, '/api/v1/games/rocom/activity/perks', this.rocomHeaders(fwToken, userIdentifier), params);
532
- }
533
519
  async searchWikiPet(ctx, query, limit = 10) {
534
- return this.get(ctx, '/api/v1/games/rocom/wiki/pet', this.wegameHeaders(), { q: query, limit });
520
+ return this.get(ctx, '/api/v1/games/rocom/pet/list', this.wegameHeaders(), { q: query, page_size: limit });
535
521
  }
536
522
  async searchWikiSkill(ctx, query, limit = 10) {
537
- return this.get(ctx, '/api/v1/games/rocom/wiki/skill', this.wegameHeaders(), { q: query, limit });
523
+ return this.get(ctx, '/api/v1/games/rocom/pet/skill-users', this.wegameHeaders(), { skill: query, limit });
524
+ }
525
+ async getWikiPetDetail(ctx, options) {
526
+ const params = {};
527
+ if (options.id !== undefined)
528
+ params.id = options.id;
529
+ if (options.name)
530
+ params.name = options.name;
531
+ return this.get(ctx, '/api/v1/games/rocom/pet/detail', this.wegameHeaders(), params);
538
532
  }
539
533
  }
540
534
  exports.RocomClient = RocomClient;
@@ -1153,45 +1153,6 @@ function buildFriendshipRenderData(payload, userIds) {
1153
1153
  copyright: 'Koishi & WeGame Locke Kingdom Plugin',
1154
1154
  };
1155
1155
  }
1156
- function buildStudentRenderData(statePayload, perksPayload, area, accountType) {
1157
- const school = statePayload?.school || statePayload?.school_name || '未返回';
1158
- const certified = String(statePayload?.certified) === '1';
1159
- const cards = perksPayload?.cards || [];
1160
- return {
1161
- title: '洛克学生',
1162
- subtitle: `大区:${area} 账号类型:${accountTypeText(accountType)}`,
1163
- heroTitle: '学生信息总览',
1164
- heroValue: certified ? '已通过' : '未认证',
1165
- heroSubvalue: school,
1166
- summaryCards: [
1167
- { label: '认证状态', value: certified ? '已认证' : '未认证' },
1168
- { label: '学校', value: school },
1169
- { label: '奖励数量', value: String(cards.length) },
1170
- ],
1171
- stateItems: [
1172
- { label: '学生认证', value: certified ? '是' : '否' },
1173
- { label: '游戏内认证', value: String(statePayload?.game_certified) === '1' ? '是' : '否' },
1174
- { label: '学校', value: school },
1175
- { label: '上游状态', value: statePayload?.result?.error_message || 'WG_COMM_SUCC' },
1176
- { label: '上游错误码', value: stringifyInspectValue(statePayload?.result?.error_code || 0) },
1177
- ],
1178
- perkCards: cards.map((card) => ({
1179
- name: card.name || `奖励 #${card.id || '-'}`,
1180
- count: card.count || 0,
1181
- desc: card.desc || '暂无说明',
1182
- icon: card.icon || '',
1183
- id: stringifyInspectValue(card.id),
1184
- stateText: `状态码 ${stringifyInspectValue(card.state)}`,
1185
- })),
1186
- detailItems: Object.entries(perksPayload || {})
1187
- .filter(([key, value]) => !['cards', 'result'].includes(key) && (value === null || typeof value !== 'object'))
1188
- .map(([key, value]) => ({ label: key.replace(/_/g, ' '), value: stringifyInspectValue(value) })),
1189
- stateResult: statePayload?.result?.error_message || 'WG_COMM_SUCC',
1190
- perksResult: perksPayload?.result?.error_message || 'WG_COMM_SUCC',
1191
- commandHint: '洛克.学生 [area] [account_type]',
1192
- copyright: 'Koishi & WeGame Locke Kingdom Plugin',
1193
- };
1194
- }
1195
1156
  function sessionTarget(session) {
1196
1157
  return {
1197
1158
  platform: session?.platform || session?.bot?.platform || '',
@@ -1866,23 +1827,6 @@ function register(deps) {
1866
1827
  return `好友关系查询失败:${client.getLastErrorBrief()}`;
1867
1828
  await sendImage(deps, session, 'friendship', buildFriendshipRenderData(res, userIds), `【好友关系】${userIds}`);
1868
1829
  });
1869
- ctx.command('洛克').subcommand('.学生 [area:number] [accountType:number]', '查询学生认证状态与学生活动福利')
1870
- .alias('洛克学生')
1871
- .action(async ({ session }, area = 101, accountType = 0) => {
1872
- const fwToken = await (0, account_1.getPrimaryToken)(deps, session.userId);
1873
- if (!fwToken)
1874
- return (0, account_1.notLoggedInHint)();
1875
- const userIdentifier = session.userId;
1876
- const [stateRes, perksRes] = await Promise.all([
1877
- client.getStudentState(ctx, fwToken, accountType, userIdentifier),
1878
- client.getStudentPerks(ctx, fwToken, area, accountType, userIdentifier),
1879
- ]);
1880
- if (!stateRes)
1881
- return `学生认证状态查询失败:${client.getLastErrorBrief()}`;
1882
- if (!perksRes)
1883
- return `学生活动福利查询失败:${client.getLastErrorBrief()}`;
1884
- await sendImage(deps, session, 'student', buildStudentRenderData(stateRes, perksRes, area, accountType), '【洛克学生】认证与福利信息');
1885
- });
1886
1830
  ctx.command('订阅家园菜园 [uid:string]', '订阅指定 UID 的家园菜园成熟提醒')
1887
1831
  .action(async ({ session }, uid = '') => subscribeHome(deps, session, uid, 'garden'));
1888
1832
  ctx.command('订阅家园灵感 [uid:string]', '订阅指定 UID 的家园精灵灵感完成提醒')
package/lib/index.js CHANGED
@@ -51,7 +51,6 @@ const MENU_GROUPS = [
51
51
  { cmd: '洛克.家园', desc: '查询家园菜园' },
52
52
  { cmd: '洛克.商店', desc: '查询 ingame 商店' },
53
53
  { cmd: '洛克.好友关系', desc: '查询好友关系' },
54
- { cmd: '洛克.学生', desc: '查询学生认证与福利' },
55
54
  ],
56
55
  },
57
56
  {
package/lib/render.js CHANGED
@@ -165,9 +165,6 @@ class Renderer {
165
165
  '.player-search-page',
166
166
  '.ingame-shop-page',
167
167
  '.friendship-page',
168
- '.student-state-page',
169
- '.student-perks-page',
170
- '.student-page',
171
168
  '.merchant-page',
172
169
  '.home-page',
173
170
  '.pet-panel-page',
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "koishi-plugin-rocom",
3
3
  "description": "洛克王国查询与订阅插件",
4
- "version": "1.0.9",
4
+ "version": "1.0.10",
5
5
  "main": "lib/index.js",
6
6
  "typings": "lib/index.d.ts",
7
7
  "homepage": "https://github.com/staytomorrow/koishi-plugin-rocom",
package/readme.md CHANGED
@@ -10,10 +10,9 @@
10
10
  ---
11
11
 
12
12
  临时APIKey(任选其一)
13
- sk-ba042e079cf9ccb30e72b3d5af458f45
14
- sk-c7952558b84a176b76d0215760732330
15
- sk-b3d96323b2b045282c52f81ca43fcad8
16
- sk-5c14c1e5da063037d02c15e50285dd04
13
+ sk-0c1476b201301170e6360453becb27f5
14
+
15
+ sk-481029d0d4fc412ce9ebb391397c1e5c
17
16
 
18
17
  ---
19
18
 
@@ -1,95 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="zh-CN">
3
- <head>
4
- <meta charset="utf-8">
5
- <meta name="viewport" content="width=1280, initial-scale=1">
6
- <link rel="stylesheet" href="{{_res_path}}render/student/style.css">
7
- </head>
8
- <body>
9
- <div class="student-page">
10
- <div class="page-header">
11
- <div class="page-title">{{title}}</div>
12
- <div class="page-subtitle">{{subtitle}}</div>
13
- </div>
14
-
15
- <div class="hero-card">
16
- <div class="hero-title">{{heroTitle}}</div>
17
- <div class="hero-value">{{heroValue}}</div>
18
- <div class="hero-subvalue">{{heroSubvalue}}</div>
19
- </div>
20
-
21
- <div class="summary-grid">
22
- {{each summaryCards item}}
23
- <div class="summary-card">
24
- <div class="summary-label">{{item.label}}</div>
25
- <div class="summary-value">{{item.value}}</div>
26
- </div>
27
- {{/each}}
28
- </div>
29
-
30
- <div class="dual-grid">
31
- <div class="panel-card">
32
- <div class="section-title">认证信息</div>
33
- <div class="detail-card">
34
- {{each stateItems item}}
35
- <div class="detail-row">
36
- <div class="detail-label">{{item.label}}</div>
37
- <div class="detail-value">{{item.value}}</div>
38
- </div>
39
- {{/each}}
40
- </div>
41
- <div class="panel-footer">认证接口:{{stateResult}}</div>
42
- </div>
43
-
44
- <div class="panel-card">
45
- <div class="section-title">奖励信息</div>
46
- <div class="perks-list">
47
- {{each perkCards item}}
48
- <div class="perk-card">
49
- <div class="perk-top">
50
- <div class="perk-icon-wrap">
51
- {{if item.icon}}
52
- <img src="{{item.icon}}" class="perk-icon" alt="{{item.name}}">
53
- {{else}}
54
- <div class="perk-icon perk-icon-fallback">?</div>
55
- {{/if}}
56
- </div>
57
- <div class="perk-main">
58
- <div class="perk-name">{{item.name}}</div>
59
- <div class="perk-meta">ID {{item.id}} | 数量 x{{item.count}}</div>
60
- </div>
61
- <div class="perk-state">{{item.stateText}}</div>
62
- </div>
63
- <div class="perk-desc">{{item.desc}}</div>
64
- </div>
65
- {{/each}}
66
- {{if !perkCards || !perkCards.length}}
67
- <div class="empty-card">当前接口未返回奖励列表。</div>
68
- {{/if}}
69
- </div>
70
- <div class="panel-footer">奖励接口:{{perksResult}}</div>
71
- </div>
72
- </div>
73
-
74
- {{if detailItems && detailItems.length}}
75
- <div class="panel-card extra-panel">
76
- <div class="section-title">补充信息</div>
77
- <div class="detail-card">
78
- {{each detailItems item}}
79
- <div class="detail-row">
80
- <div class="detail-label">{{item.label}}</div>
81
- <div class="detail-value">{{item.value}}</div>
82
- </div>
83
- {{/each}}
84
- </div>
85
- </div>
86
- {{/if}}
87
-
88
- {{if commandHint}}
89
- <div class="command-hint">{{commandHint}}</div>
90
- {{/if}}
91
-
92
- <div class="footer">{{copyright}}</div>
93
- </div>
94
- </body>
95
- </html>
@@ -1,255 +0,0 @@
1
- @font-face {
2
- font-family: "rocom-student";
3
- src: url("../../ttf/HYWenHei-85W-1.ttf") format("truetype");
4
- font-display: swap;
5
- }
6
-
7
- html,
8
- body {
9
- margin: 0;
10
- padding: 26px;
11
- background: #efe6d8;
12
- display: inline-block;
13
- font-family: "rocom-student", "Microsoft YaHei", "PingFang SC", sans-serif;
14
- }
15
-
16
- .student-page {
17
- width: 1260px;
18
- padding: 34px 36px 30px;
19
- box-sizing: border-box;
20
- border-radius: 28px;
21
- color: #322618;
22
- background:
23
- linear-gradient(rgba(40, 29, 18, 0.10), rgba(40, 29, 18, 0.10)),
24
- url("../../img/ercode-bg.D1ccSQKH.png") center/cover no-repeat;
25
- }
26
-
27
- .page-header {
28
- padding-bottom: 18px;
29
- border-bottom: 2px dashed rgba(141, 106, 68, 0.28);
30
- }
31
-
32
- .page-title {
33
- font-size: 44px;
34
- line-height: 1.1;
35
- font-weight: 800;
36
- }
37
-
38
- .page-subtitle {
39
- margin-top: 10px;
40
- font-size: 22px;
41
- line-height: 1.4;
42
- color: #6d5944;
43
- }
44
-
45
- .hero-card,
46
- .summary-card,
47
- .panel-card,
48
- .command-hint,
49
- .empty-card {
50
- border: 1px solid rgba(141, 106, 68, 0.16);
51
- border-radius: 20px;
52
- background: rgba(255, 252, 247, 0.82);
53
- box-shadow: 0 10px 26px rgba(83, 58, 35, 0.08);
54
- }
55
-
56
- .hero-card {
57
- margin-top: 22px;
58
- padding: 24px 26px;
59
- background:
60
- linear-gradient(135deg, rgba(237, 179, 89, 0.24), rgba(255, 251, 245, 0.88)),
61
- rgba(255, 252, 247, 0.86);
62
- }
63
-
64
- .hero-title {
65
- font-size: 20px;
66
- color: #8b735b;
67
- }
68
-
69
- .hero-value {
70
- margin-top: 8px;
71
- font-size: 42px;
72
- line-height: 1.15;
73
- font-weight: 800;
74
- color: #2e2418;
75
- }
76
-
77
- .hero-subvalue {
78
- margin-top: 8px;
79
- font-size: 22px;
80
- color: #6d5944;
81
- }
82
-
83
- .summary-grid {
84
- display: grid;
85
- grid-template-columns: repeat(3, 1fr);
86
- gap: 16px;
87
- margin-top: 22px;
88
- }
89
-
90
- .summary-card {
91
- padding: 18px 20px;
92
- }
93
-
94
- .summary-label {
95
- font-size: 18px;
96
- color: #8b735b;
97
- }
98
-
99
- .summary-value {
100
- margin-top: 10px;
101
- font-size: 30px;
102
- line-height: 1.2;
103
- font-weight: 800;
104
- }
105
-
106
- .dual-grid {
107
- display: grid;
108
- grid-template-columns: 1fr 1.2fr;
109
- gap: 18px;
110
- margin-top: 24px;
111
- }
112
-
113
- .panel-card {
114
- padding: 20px;
115
- }
116
-
117
- .extra-panel {
118
- margin-top: 18px;
119
- }
120
-
121
- .section-title {
122
- margin-bottom: 14px;
123
- font-size: 28px;
124
- font-weight: 800;
125
- }
126
-
127
- .detail-card {
128
- overflow: hidden;
129
- border-radius: 18px;
130
- background: rgba(255,255,255,0.42);
131
- border: 1px solid rgba(141, 106, 68, 0.10);
132
- }
133
-
134
- .detail-row {
135
- display: grid;
136
- grid-template-columns: 220px 1fr;
137
- gap: 16px;
138
- padding: 15px 18px;
139
- border-bottom: 1px solid rgba(141, 106, 68, 0.10);
140
- }
141
-
142
- .detail-row:last-child {
143
- border-bottom: none;
144
- }
145
-
146
- .detail-label {
147
- font-size: 20px;
148
- font-weight: 700;
149
- color: #6d5944;
150
- }
151
-
152
- .detail-value {
153
- font-size: 20px;
154
- color: #322618;
155
- word-break: break-word;
156
- }
157
-
158
- .perks-list {
159
- display: grid;
160
- gap: 14px;
161
- }
162
-
163
- .perk-card {
164
- padding: 16px;
165
- border-radius: 18px;
166
- background: rgba(255,255,255,0.42);
167
- border: 1px solid rgba(141, 106, 68, 0.10);
168
- }
169
-
170
- .perk-top {
171
- display: grid;
172
- grid-template-columns: 72px 1fr auto;
173
- gap: 14px;
174
- align-items: center;
175
- }
176
-
177
- .perk-icon-wrap {
178
- width: 72px;
179
- height: 72px;
180
- border-radius: 16px;
181
- background: rgba(230, 219, 203, 0.58);
182
- display: flex;
183
- align-items: center;
184
- justify-content: center;
185
- overflow: hidden;
186
- }
187
-
188
- .perk-icon {
189
- width: 100%;
190
- height: 100%;
191
- object-fit: cover;
192
- }
193
-
194
- .perk-icon-fallback {
195
- display: flex;
196
- align-items: center;
197
- justify-content: center;
198
- font-size: 28px;
199
- font-weight: 800;
200
- color: #8b735b;
201
- }
202
-
203
- .perk-name {
204
- font-size: 24px;
205
- font-weight: 800;
206
- line-height: 1.2;
207
- }
208
-
209
- .perk-meta {
210
- margin-top: 6px;
211
- font-size: 17px;
212
- color: #7a6550;
213
- }
214
-
215
- .perk-state {
216
- padding: 8px 12px;
217
- border-radius: 999px;
218
- background: rgba(211, 144, 53, 0.14);
219
- color: #9f6621;
220
- font-size: 17px;
221
- font-weight: 700;
222
- }
223
-
224
- .perk-desc {
225
- margin-top: 12px;
226
- font-size: 18px;
227
- line-height: 1.5;
228
- color: #4f3c29;
229
- }
230
-
231
- .panel-footer {
232
- margin-top: 14px;
233
- font-size: 18px;
234
- color: #7a6550;
235
- }
236
-
237
- .empty-card {
238
- padding: 24px;
239
- font-size: 20px;
240
- color: #6d5944;
241
- }
242
-
243
- .command-hint {
244
- margin-top: 20px;
245
- padding: 14px 18px;
246
- font-size: 20px;
247
- color: #6d5944;
248
- }
249
-
250
- .footer {
251
- margin-top: 18px;
252
- text-align: center;
253
- font-size: 16px;
254
- color: rgba(113, 93, 73, 0.88);
255
- }
@@ -1,78 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="zh-CN">
3
- <head>
4
- <meta charset="utf-8">
5
- <meta name="viewport" content="width=1280, initial-scale=1">
6
- <link rel="stylesheet" href="{{_res_path}}render/student-perks/style.css">
7
- </head>
8
- <body>
9
- <div class="student-perks-page perks-page">
10
- <div class="page-header">
11
- <div class="page-title">{{title}}</div>
12
- <div class="page-subtitle">{{subtitle}}</div>
13
- </div>
14
-
15
- <div class="hero-card">
16
- <div class="hero-copy">
17
- <div class="hero-title">{{heroTitle}}</div>
18
- <div class="hero-value">{{heroValue}}</div>
19
- <div class="hero-subvalue">{{heroSubvalue}}</div>
20
- </div>
21
- </div>
22
-
23
- <div class="summary-grid">
24
- {{each summaryCards item}}
25
- <div class="summary-card">
26
- <div class="summary-label">{{item.label}}</div>
27
- <div class="summary-value">{{item.value}}</div>
28
- </div>
29
- {{/each}}
30
- </div>
31
-
32
- <div class="section-title">奖励列表</div>
33
- <div class="perk-grid">
34
- {{each perkCards item}}
35
- <div class="perk-card">
36
- <div class="perk-top">
37
- <div class="perk-icon-wrap">
38
- {{if item.icon}}
39
- <img src="{{item.icon}}" class="perk-icon" alt="{{item.name}}">
40
- {{else}}
41
- <div class="perk-icon perk-icon-fallback">?</div>
42
- {{/if}}
43
- </div>
44
- <div class="perk-main">
45
- <div class="perk-name">{{item.name}}</div>
46
- <div class="perk-meta">ID {{item.id}} | 数量 x{{item.count}}</div>
47
- </div>
48
- <div class="perk-state">{{item.stateText}}</div>
49
- </div>
50
- <div class="perk-desc">{{item.desc}}</div>
51
- <div class="perk-code">状态码 {{item.stateCode}}</div>
52
- </div>
53
- {{/each}}
54
- {{if !perkCards || !perkCards.length}}
55
- <div class="empty-card">当前接口未返回奖励列表。</div>
56
- {{/if}}
57
- </div>
58
-
59
- {{if detailItems && detailItems.length}}
60
- <div class="section-title">补充信息</div>
61
- <div class="detail-card">
62
- {{each detailItems item}}
63
- <div class="detail-row">
64
- <div class="detail-label">{{item.label}}</div>
65
- <div class="detail-value">{{item.value}}</div>
66
- </div>
67
- {{/each}}
68
- </div>
69
- {{/if}}
70
-
71
- {{if commandHint}}
72
- <div class="command-hint">{{commandHint}}</div>
73
- {{/if}}
74
-
75
- <div class="footer">{{copyright}}</div>
76
- </div>
77
- </body>
78
- </html>
@@ -1,238 +0,0 @@
1
- @font-face {
2
- font-family: "rocom-perks";
3
- src: url("../../ttf/HYWenHei-85W-1.ttf") format("truetype");
4
- font-display: swap;
5
- }
6
-
7
- html,
8
- body {
9
- margin: 0;
10
- padding: 26px;
11
- background: #efe6d8;
12
- display: inline-block;
13
- font-family: "rocom-perks", "Microsoft YaHei", "PingFang SC", sans-serif;
14
- }
15
-
16
- .perks-page {
17
- width: 1260px;
18
- padding: 34px 36px 30px;
19
- box-sizing: border-box;
20
- border-radius: 28px;
21
- color: #322618;
22
- background:
23
- linear-gradient(rgba(40, 29, 18, 0.10), rgba(40, 29, 18, 0.10)),
24
- url("../../img/ercode-bg.D1ccSQKH.png") center/cover no-repeat;
25
- }
26
-
27
- .page-header {
28
- padding-bottom: 18px;
29
- border-bottom: 2px dashed rgba(141, 106, 68, 0.28);
30
- }
31
-
32
- .page-title {
33
- font-size: 44px;
34
- line-height: 1.1;
35
- font-weight: 800;
36
- }
37
-
38
- .page-subtitle {
39
- margin-top: 10px;
40
- font-size: 22px;
41
- line-height: 1.4;
42
- color: #6d5944;
43
- }
44
-
45
- .summary-grid {
46
- display: grid;
47
- grid-template-columns: repeat(3, 1fr);
48
- gap: 16px;
49
- margin-top: 22px;
50
- }
51
-
52
- .summary-card,
53
- .hero-card,
54
- .perk-card,
55
- .detail-card,
56
- .command-hint,
57
- .empty-card {
58
- border: 1px solid rgba(141, 106, 68, 0.16);
59
- border-radius: 20px;
60
- background: rgba(255, 252, 247, 0.82);
61
- box-shadow: 0 10px 26px rgba(83, 58, 35, 0.08);
62
- }
63
-
64
- .hero-card {
65
- margin-top: 22px;
66
- padding: 24px 26px;
67
- background:
68
- linear-gradient(135deg, rgba(237, 179, 89, 0.24), rgba(255, 251, 245, 0.88)),
69
- rgba(255, 252, 247, 0.86);
70
- }
71
-
72
- .hero-title {
73
- font-size: 20px;
74
- color: #8b735b;
75
- }
76
-
77
- .hero-value {
78
- margin-top: 8px;
79
- font-size: 42px;
80
- line-height: 1.15;
81
- font-weight: 800;
82
- color: #2e2418;
83
- }
84
-
85
- .hero-subvalue {
86
- margin-top: 8px;
87
- font-size: 22px;
88
- color: #6d5944;
89
- }
90
-
91
- .summary-card {
92
- padding: 18px 20px;
93
- }
94
-
95
- .summary-label {
96
- font-size: 18px;
97
- color: #8b735b;
98
- }
99
-
100
- .summary-value {
101
- margin-top: 10px;
102
- font-size: 30px;
103
- line-height: 1.2;
104
- font-weight: 800;
105
- }
106
-
107
- .section-title {
108
- margin: 28px 0 16px;
109
- font-size: 28px;
110
- font-weight: 800;
111
- }
112
-
113
- .perk-grid {
114
- display: grid;
115
- grid-template-columns: repeat(2, 1fr);
116
- gap: 18px;
117
- }
118
-
119
- .perk-card {
120
- padding: 20px;
121
- }
122
-
123
- .perk-top {
124
- display: grid;
125
- grid-template-columns: 84px 1fr auto;
126
- gap: 16px;
127
- align-items: center;
128
- }
129
-
130
- .perk-icon-wrap {
131
- width: 84px;
132
- height: 84px;
133
- border-radius: 18px;
134
- background: rgba(230, 219, 203, 0.58);
135
- display: flex;
136
- align-items: center;
137
- justify-content: center;
138
- overflow: hidden;
139
- }
140
-
141
- .perk-icon {
142
- width: 100%;
143
- height: 100%;
144
- object-fit: cover;
145
- }
146
-
147
- .perk-icon-fallback {
148
- display: flex;
149
- align-items: center;
150
- justify-content: center;
151
- font-size: 28px;
152
- font-weight: 800;
153
- color: #8b735b;
154
- }
155
-
156
- .perk-name {
157
- font-size: 28px;
158
- font-weight: 800;
159
- line-height: 1.2;
160
- }
161
-
162
- .perk-meta {
163
- margin-top: 8px;
164
- font-size: 18px;
165
- color: #7a6550;
166
- }
167
-
168
- .perk-state {
169
- padding: 8px 14px;
170
- border-radius: 999px;
171
- background: rgba(211, 144, 53, 0.14);
172
- color: #9f6621;
173
- font-size: 18px;
174
- font-weight: 700;
175
- }
176
-
177
- .perk-desc {
178
- margin-top: 16px;
179
- font-size: 20px;
180
- line-height: 1.55;
181
- color: #4f3c29;
182
- min-height: 62px;
183
- }
184
-
185
- .perk-code {
186
- margin-top: 14px;
187
- font-size: 17px;
188
- color: #8b735b;
189
- }
190
-
191
- .detail-card {
192
- overflow: hidden;
193
- }
194
-
195
- .detail-row {
196
- display: grid;
197
- grid-template-columns: 260px 1fr;
198
- gap: 16px;
199
- padding: 16px 20px;
200
- border-bottom: 1px solid rgba(141, 106, 68, 0.10);
201
- }
202
-
203
- .detail-row:last-child {
204
- border-bottom: none;
205
- }
206
-
207
- .detail-label {
208
- font-size: 21px;
209
- font-weight: 700;
210
- color: #6d5944;
211
- }
212
-
213
- .detail-value {
214
- font-size: 21px;
215
- color: #322618;
216
- word-break: break-word;
217
- }
218
-
219
- .empty-card {
220
- grid-column: 1 / -1;
221
- padding: 28px;
222
- font-size: 22px;
223
- color: #6d5944;
224
- }
225
-
226
- .command-hint {
227
- margin-top: 20px;
228
- padding: 14px 18px;
229
- font-size: 20px;
230
- color: #6d5944;
231
- }
232
-
233
- .footer {
234
- margin-top: 18px;
235
- text-align: center;
236
- font-size: 16px;
237
- color: rgba(113, 93, 73, 0.88);
238
- }
@@ -1,52 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="zh-CN">
3
- <head>
4
- <meta charset="utf-8">
5
- <meta name="viewport" content="width=1200, initial-scale=1">
6
- <link rel="stylesheet" href="{{_res_path}}render/student-state/style.css">
7
- </head>
8
- <body>
9
- <div class="student-state-page state-page">
10
- <div class="page-header">
11
- <div class="page-title">{{title}}</div>
12
- <div class="page-subtitle">{{subtitle}}</div>
13
- </div>
14
-
15
- <div class="hero-card">
16
- <div class="hero-copy">
17
- <div class="hero-title">{{heroTitle}}</div>
18
- <div class="hero-value">{{heroValue}}</div>
19
- <div class="hero-subvalue">{{heroSubvalue}}</div>
20
- </div>
21
- </div>
22
-
23
- <div class="summary-grid">
24
- {{each summaryCards item}}
25
- <div class="summary-card">
26
- <div class="summary-label">{{item.label}}</div>
27
- <div class="summary-value">{{item.value}}</div>
28
- </div>
29
- {{/each}}
30
- </div>
31
-
32
- <div class="section-title">认证详情</div>
33
- <div class="detail-card">
34
- {{each detailItems item}}
35
- <div class="detail-row">
36
- <div class="detail-label">{{item.label}}</div>
37
- <div class="detail-value">{{item.value}}</div>
38
- </div>
39
- {{/each}}
40
- {{if !detailItems || !detailItems.length}}
41
- <div class="empty-text">当前接口未返回更多认证字段。</div>
42
- {{/if}}
43
- </div>
44
-
45
- {{if commandHint}}
46
- <div class="command-hint">{{commandHint}}</div>
47
- {{/if}}
48
-
49
- <div class="footer">{{copyright}}</div>
50
- </div>
51
- </body>
52
- </html>
@@ -1,157 +0,0 @@
1
- @font-face {
2
- font-family: "rocom-state";
3
- src: url("../../ttf/HYWenHei-85W-1.ttf") format("truetype");
4
- font-display: swap;
5
- }
6
-
7
- html,
8
- body {
9
- margin: 0;
10
- padding: 26px;
11
- background: #efe6d8;
12
- display: inline-block;
13
- font-family: "rocom-state", "Microsoft YaHei", "PingFang SC", sans-serif;
14
- }
15
-
16
- .state-page {
17
- width: 1180px;
18
- padding: 34px 36px 30px;
19
- box-sizing: border-box;
20
- border-radius: 28px;
21
- color: #322618;
22
- background:
23
- linear-gradient(rgba(40, 29, 18, 0.10), rgba(40, 29, 18, 0.10)),
24
- url("../../img/ercode-bg.D1ccSQKH.png") center/cover no-repeat;
25
- }
26
-
27
- .page-header {
28
- padding-bottom: 18px;
29
- border-bottom: 2px dashed rgba(141, 106, 68, 0.28);
30
- }
31
-
32
- .page-title {
33
- font-size: 44px;
34
- line-height: 1.1;
35
- font-weight: 800;
36
- }
37
-
38
- .page-subtitle {
39
- margin-top: 10px;
40
- font-size: 22px;
41
- line-height: 1.4;
42
- color: #6d5944;
43
- }
44
-
45
- .summary-grid {
46
- display: grid;
47
- grid-template-columns: repeat(3, 1fr);
48
- gap: 16px;
49
- margin-top: 22px;
50
- }
51
-
52
- .summary-card,
53
- .hero-card,
54
- .detail-card,
55
- .command-hint {
56
- border: 1px solid rgba(141, 106, 68, 0.16);
57
- border-radius: 20px;
58
- background: rgba(255, 252, 247, 0.82);
59
- box-shadow: 0 10px 26px rgba(83, 58, 35, 0.08);
60
- }
61
-
62
- .hero-card {
63
- margin-top: 22px;
64
- padding: 24px 26px;
65
- background:
66
- linear-gradient(135deg, rgba(237, 179, 89, 0.24), rgba(255, 251, 245, 0.88)),
67
- rgba(255, 252, 247, 0.86);
68
- }
69
-
70
- .hero-title {
71
- font-size: 20px;
72
- color: #8b735b;
73
- }
74
-
75
- .hero-value {
76
- margin-top: 8px;
77
- font-size: 42px;
78
- line-height: 1.15;
79
- font-weight: 800;
80
- color: #2e2418;
81
- }
82
-
83
- .hero-subvalue {
84
- margin-top: 8px;
85
- font-size: 22px;
86
- color: #6d5944;
87
- }
88
-
89
- .summary-card {
90
- padding: 18px 20px;
91
- }
92
-
93
- .summary-label {
94
- font-size: 18px;
95
- color: #8b735b;
96
- }
97
-
98
- .summary-value {
99
- margin-top: 10px;
100
- font-size: 30px;
101
- line-height: 1.2;
102
- font-weight: 800;
103
- }
104
-
105
- .section-title {
106
- margin: 28px 0 16px;
107
- font-size: 28px;
108
- font-weight: 800;
109
- }
110
-
111
- .detail-card {
112
- overflow: hidden;
113
- }
114
-
115
- .detail-row {
116
- display: grid;
117
- grid-template-columns: 260px 1fr;
118
- gap: 16px;
119
- padding: 16px 20px;
120
- border-bottom: 1px solid rgba(141, 106, 68, 0.10);
121
- }
122
-
123
- .detail-row:last-child {
124
- border-bottom: none;
125
- }
126
-
127
- .detail-label {
128
- font-size: 21px;
129
- font-weight: 700;
130
- color: #6d5944;
131
- }
132
-
133
- .detail-value {
134
- font-size: 21px;
135
- color: #322618;
136
- word-break: break-word;
137
- }
138
-
139
- .empty-text {
140
- padding: 26px;
141
- font-size: 22px;
142
- color: #6d5944;
143
- }
144
-
145
- .command-hint {
146
- margin-top: 20px;
147
- padding: 14px 18px;
148
- font-size: 20px;
149
- color: #6d5944;
150
- }
151
-
152
- .footer {
153
- margin-top: 18px;
154
- text-align: center;
155
- font-size: 16px;
156
- color: rgba(113, 93, 73, 0.88);
157
- }