koishi-plugin-rocom 1.0.1

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.
Files changed (157) hide show
  1. package/lib/client.d.ts +53 -0
  2. package/lib/client.js +473 -0
  3. package/lib/commands/account.d.ts +5 -0
  4. package/lib/commands/account.js +205 -0
  5. package/lib/commands/admin.d.ts +2 -0
  6. package/lib/commands/admin.js +117 -0
  7. package/lib/commands/egg.d.ts +2 -0
  8. package/lib/commands/egg.js +196 -0
  9. package/lib/commands/merchant.d.ts +2 -0
  10. package/lib/commands/merchant.js +242 -0
  11. package/lib/commands/query.d.ts +2 -0
  12. package/lib/commands/query.js +1264 -0
  13. package/lib/commands/wiki.d.ts +2 -0
  14. package/lib/commands/wiki.js +11 -0
  15. package/lib/egg-service.d.ts +229 -0
  16. package/lib/egg-service.js +705 -0
  17. package/lib/index.d.ts +24 -0
  18. package/lib/index.js +3746 -0
  19. package/lib/render-templates/bind-list/index.html +51 -0
  20. package/lib/render-templates/bind-list/style.css +178 -0
  21. package/lib/render-templates/exchange-hall/css/_@astro-renderers.0KDkAyVb.css +1 -0
  22. package/lib/render-templates/exchange-hall/css/index.B3tv56V6.css +1 -0
  23. package/lib/render-templates/exchange-hall/css/index.D2LGPudy.css +1 -0
  24. package/lib/render-templates/exchange-hall/extracted.css +393 -0
  25. package/lib/render-templates/exchange-hall/index.html +99 -0
  26. package/lib/render-templates/exchange-hall/style.css +267 -0
  27. package/lib/render-templates/friendship/index.html +58 -0
  28. package/lib/render-templates/friendship/style.css +182 -0
  29. package/lib/render-templates/home/data/home_item_list.json +122 -0
  30. package/lib/render-templates/home/img/home_icon/100604.png +0 -0
  31. package/lib/render-templates/home/img/home_icon/100604_1.png +0 -0
  32. package/lib/render-templates/home/img/home_icon/100604_2.png +0 -0
  33. package/lib/render-templates/home/img/home_icon/100605.png +0 -0
  34. package/lib/render-templates/home/img/home_icon/100605_1.png +0 -0
  35. package/lib/render-templates/home/img/home_icon/100605_2.png +0 -0
  36. package/lib/render-templates/home/img/home_icon/100606.png +0 -0
  37. package/lib/render-templates/home/img/home_icon/100606_1.png +0 -0
  38. package/lib/render-templates/home/img/home_icon/100606_2.png +0 -0
  39. package/lib/render-templates/home/img/home_icon/100607.png +0 -0
  40. package/lib/render-templates/home/img/home_icon/100607_1.png +0 -0
  41. package/lib/render-templates/home/img/home_icon/100607_2.png +0 -0
  42. package/lib/render-templates/home/img/home_icon/100608.png +0 -0
  43. package/lib/render-templates/home/img/home_icon/100608_1.png +0 -0
  44. package/lib/render-templates/home/img/home_icon/100608_2.png +0 -0
  45. package/lib/render-templates/home/img/home_icon/100622.png +0 -0
  46. package/lib/render-templates/home/img/home_icon/100622_1.png +0 -0
  47. package/lib/render-templates/home/img/home_icon/100622_2.png +0 -0
  48. package/lib/render-templates/home/img/home_icon/100623.png +0 -0
  49. package/lib/render-templates/home/img/home_icon/100623_1.png +0 -0
  50. package/lib/render-templates/home/img/home_icon/100623_2.png +0 -0
  51. package/lib/render-templates/home/img/home_icon/100624.png +0 -0
  52. package/lib/render-templates/home/img/home_icon/100624_1.png +0 -0
  53. package/lib/render-templates/home/img/home_icon/100624_2.png +0 -0
  54. package/lib/render-templates/home/img/home_icon/100627.png +0 -0
  55. package/lib/render-templates/home/img/home_icon/100627_1.png +0 -0
  56. package/lib/render-templates/home/img/home_icon/100627_2.png +0 -0
  57. package/lib/render-templates/home/img/home_icon/100684.png +0 -0
  58. package/lib/render-templates/home/img/home_icon/100684_1.png +0 -0
  59. package/lib/render-templates/home/img/home_icon/100684_2.png +0 -0
  60. package/lib/render-templates/home/img/home_icon/100686.png +0 -0
  61. package/lib/render-templates/home/img/home_icon/100686_1.png +0 -0
  62. package/lib/render-templates/home/img/home_icon/100686_2.png +0 -0
  63. package/lib/render-templates/home/img/home_icon/100687.png +0 -0
  64. package/lib/render-templates/home/img/home_icon/100687_1.png +0 -0
  65. package/lib/render-templates/home/img/home_icon/100687_2.png +0 -0
  66. package/lib/render-templates/home/img/home_icon/100689.png +0 -0
  67. package/lib/render-templates/home/img/home_icon/100689_1.png +0 -0
  68. package/lib/render-templates/home/img/home_icon/100689_2.png +0 -0
  69. package/lib/render-templates/home/img/home_icon/100690.png +0 -0
  70. package/lib/render-templates/home/img/home_icon/100690_1.png +0 -0
  71. package/lib/render-templates/home/img/home_icon/100690_2.png +0 -0
  72. package/lib/render-templates/home/img/home_icon/100691.png +0 -0
  73. package/lib/render-templates/home/img/home_icon/100691_1.png +0 -0
  74. package/lib/render-templates/home/img/home_icon/100691_2.png +0 -0
  75. package/lib/render-templates/home/img/home_icon/100692.png +0 -0
  76. package/lib/render-templates/home/img/home_icon/100692_1.png +0 -0
  77. package/lib/render-templates/home/img/home_icon/100692_2.png +0 -0
  78. package/lib/render-templates/home/img/home_icon/100693.png +0 -0
  79. package/lib/render-templates/home/img/home_icon/100693_1.png +0 -0
  80. package/lib/render-templates/home/img/home_icon/100693_2.png +0 -0
  81. package/lib/render-templates/home/img/home_icon/100694.png +0 -0
  82. package/lib/render-templates/home/img/home_icon/100694_1.png +0 -0
  83. package/lib/render-templates/home/img/home_icon/100694_2.png +0 -0
  84. package/lib/render-templates/home/img/home_icon/100706.png +0 -0
  85. package/lib/render-templates/home/img/home_icon/100706_1.png +0 -0
  86. package/lib/render-templates/home/img/home_icon/100706_2.png +0 -0
  87. package/lib/render-templates/home/img/home_icon/100751.png +0 -0
  88. package/lib/render-templates/home/img/home_icon/100751_1.png +0 -0
  89. package/lib/render-templates/home/img/home_icon/100751_2.png +0 -0
  90. package/lib/render-templates/home/img/home_icon/100755.png +0 -0
  91. package/lib/render-templates/home/img/home_icon/100755_1.png +0 -0
  92. package/lib/render-templates/home/img/home_icon/100755_2.png +0 -0
  93. package/lib/render-templates/home/img/home_icon/100762.png +0 -0
  94. package/lib/render-templates/home/img/home_icon/100762_1.png +0 -0
  95. package/lib/render-templates/home/img/home_icon/100762_2.png +0 -0
  96. package/lib/render-templates/home/img/home_icon/100764.png +0 -0
  97. package/lib/render-templates/home/img/home_icon/100764_1.png +0 -0
  98. package/lib/render-templates/home/img/home_icon/100764_2.png +0 -0
  99. package/lib/render-templates/home/img/home_icon/100869.png +0 -0
  100. package/lib/render-templates/home/img/home_icon/100869_1.png +0 -0
  101. package/lib/render-templates/home/img/home_icon/100869_2.png +0 -0
  102. package/lib/render-templates/home/img/img_HomeVisit_Icon1.png +0 -0
  103. package/lib/render-templates/home/img/img_LevelReward_Bg2.png +0 -0
  104. package/lib/render-templates/home/index.html +139 -0
  105. package/lib/render-templates/home/style.css +537 -0
  106. package/lib/render-templates/ingame-shop/index.html +87 -0
  107. package/lib/render-templates/ingame-shop/style.css +220 -0
  108. package/lib/render-templates/inspect/index.html +47 -0
  109. package/lib/render-templates/inspect/style.css +149 -0
  110. package/lib/render-templates/lineup/index.html +77 -0
  111. package/lib/render-templates/lineup/style.css +255 -0
  112. package/lib/render-templates/lineup-detail/index.html +63 -0
  113. package/lib/render-templates/lineup-detail/style.css +218 -0
  114. package/lib/render-templates/menu/index.html +36 -0
  115. package/lib/render-templates/menu/style.css +126 -0
  116. package/lib/render-templates/package/index.html +115 -0
  117. package/lib/render-templates/package/style.css +352 -0
  118. package/lib/render-templates/personal-card/index.html +292 -0
  119. package/lib/render-templates/personal-card/style.css +2114 -0
  120. package/lib/render-templates/pet-wiki/index.html +118 -0
  121. package/lib/render-templates/pet-wiki/style.css +382 -0
  122. package/lib/render-templates/player-search/index.html +60 -0
  123. package/lib/render-templates/player-search/style.css +192 -0
  124. package/lib/render-templates/record/index.html +86 -0
  125. package/lib/render-templates/record/style.css +322 -0
  126. package/lib/render-templates/searcheggs/Pets.json +104328 -0
  127. package/lib/render-templates/searcheggs/candidates.html +52 -0
  128. package/lib/render-templates/searcheggs/eggs.py +599 -0
  129. package/lib/render-templates/searcheggs/index.html +198 -0
  130. package/lib/render-templates/searcheggs/pair.html +81 -0
  131. package/lib/render-templates/searcheggs/size.html +82 -0
  132. package/lib/render-templates/searcheggs/style.css +586 -0
  133. package/lib/render-templates/searcheggs/want.html +63 -0
  134. package/lib/render-templates/skill-wiki/index.html +68 -0
  135. package/lib/render-templates/skill-wiki/style.css +182 -0
  136. package/lib/render-templates/student/index.html +95 -0
  137. package/lib/render-templates/student/style.css +255 -0
  138. package/lib/render-templates/student-perks/index.html +78 -0
  139. package/lib/render-templates/student-perks/style.css +238 -0
  140. package/lib/render-templates/student-state/index.html +52 -0
  141. package/lib/render-templates/student-state/style.css +157 -0
  142. package/lib/render-templates/yuanxing-shangren/index.html +371 -0
  143. package/lib/render-templates/yuanxing-shangren/style.css +371 -0
  144. package/lib/render.d.ts +11 -0
  145. package/lib/render.js +226 -0
  146. package/lib/role-token.d.ts +27 -0
  147. package/lib/role-token.js +137 -0
  148. package/lib/send-image.d.ts +3 -0
  149. package/lib/send-image.js +135 -0
  150. package/lib/subscription-send.d.ts +8 -0
  151. package/lib/subscription-send.js +48 -0
  152. package/lib/types.d.ts +32 -0
  153. package/lib/types.js +2 -0
  154. package/lib/user.d.ts +67 -0
  155. package/lib/user.js +176 -0
  156. package/package.json +58 -0
  157. package/readme.md +575 -0
@@ -0,0 +1,182 @@
1
+ @font-face {
2
+ font-family: "fzlant";
3
+ src: url("{{_res_path}}ttf/fzlant.D5FI9Et0.ttf");
4
+ }
5
+
6
+ @font-face {
7
+ font-family: "dundun";
8
+ src: url("{{_res_path}}ttf/dundun.xHd_Ee5-.woff2");
9
+ }
10
+
11
+ :root {
12
+ --ink: #2a2218;
13
+ --muted: #786451;
14
+ --line: rgba(113, 96, 78, 0.18);
15
+ --paper: rgba(252, 249, 242, 0.95);
16
+ --accent: #d57f24;
17
+ --accent-2: #2f6fda;
18
+ }
19
+
20
+ * {
21
+ box-sizing: border-box;
22
+ }
23
+
24
+ body.skill-body {
25
+ margin: 0;
26
+ background:
27
+ radial-gradient(circle at top right, rgba(255, 210, 120, 0.28), transparent 28%),
28
+ linear-gradient(180deg, #f6f1e5 0%, #ece6d9 100%);
29
+ color: var(--ink);
30
+ font-family: "fzlant", "Microsoft YaHei", sans-serif;
31
+ }
32
+
33
+ .skill-shell {
34
+ width: 920px;
35
+ margin: 0 auto;
36
+ padding: 22px 18px 28px;
37
+ }
38
+
39
+ .skill-hero {
40
+ display: grid;
41
+ grid-template-columns: minmax(0, 1fr) 260px;
42
+ gap: 16px;
43
+ background: linear-gradient(135deg, rgba(255,255,255,0.9), rgba(250,244,233,0.96));
44
+ border: 1px solid var(--line);
45
+ border-radius: 28px;
46
+ padding: 22px 24px;
47
+ box-shadow: 0 18px 40px rgba(77, 56, 30, 0.08);
48
+ }
49
+
50
+ .hero-kicker,
51
+ .panel-title,
52
+ .stat-value {
53
+ font-family: "dundun", "fzlant", sans-serif;
54
+ }
55
+
56
+ .hero-kicker {
57
+ color: var(--accent-2);
58
+ font-size: 18px;
59
+ letter-spacing: 1px;
60
+ }
61
+
62
+ .hero-name {
63
+ margin: 8px 0 0;
64
+ font-size: 48px;
65
+ line-height: 1.05;
66
+ word-break: break-word;
67
+ }
68
+
69
+ .hero-tags {
70
+ display: flex;
71
+ gap: 10px;
72
+ margin-top: 18px;
73
+ flex-wrap: wrap;
74
+ }
75
+
76
+ .tag {
77
+ border-radius: 999px;
78
+ padding: 8px 14px;
79
+ font-size: 18px;
80
+ background: rgba(42, 34, 24, 0.06);
81
+ border: 1px solid rgba(42, 34, 24, 0.08);
82
+ }
83
+
84
+ .hero-summary {
85
+ margin-top: 18px;
86
+ font-size: 18px;
87
+ line-height: 1.8;
88
+ color: var(--muted);
89
+ word-break: break-word;
90
+ }
91
+
92
+ .hero-stats {
93
+ display: grid;
94
+ gap: 14px;
95
+ align-content: center;
96
+ }
97
+
98
+ .stat-card {
99
+ border-radius: 24px;
100
+ padding: 18px 20px;
101
+ background: rgba(255,255,255,0.8);
102
+ border: 1px solid rgba(42, 34, 24, 0.08);
103
+ text-align: center;
104
+ }
105
+
106
+ .stat-card.accent {
107
+ background: linear-gradient(135deg, rgba(213,127,36,0.12), rgba(255,238,214,0.92));
108
+ }
109
+
110
+ .stat-label {
111
+ font-size: 18px;
112
+ color: var(--muted);
113
+ }
114
+
115
+ .stat-value {
116
+ margin-top: 8px;
117
+ font-size: 52px;
118
+ color: var(--accent);
119
+ }
120
+
121
+ .skill-content {
122
+ display: grid;
123
+ grid-template-columns: 1fr 1fr;
124
+ gap: 16px;
125
+ margin-top: 18px;
126
+ }
127
+
128
+ .panel {
129
+ background: var(--paper);
130
+ border: 1px solid var(--line);
131
+ border-radius: 24px;
132
+ padding: 18px 20px;
133
+ box-shadow: 0 12px 30px rgba(77, 56, 30, 0.05);
134
+ }
135
+
136
+ .panel-title {
137
+ font-size: 26px;
138
+ margin-bottom: 14px;
139
+ }
140
+
141
+ .panel-text {
142
+ font-size: 18px;
143
+ line-height: 1.9;
144
+ color: #4d4032;
145
+ word-break: break-word;
146
+ }
147
+
148
+ .meta-grid {
149
+ display: grid;
150
+ grid-template-columns: repeat(2, minmax(0, 1fr));
151
+ gap: 14px;
152
+ }
153
+
154
+ .meta-item {
155
+ border-radius: 18px;
156
+ padding: 18px;
157
+ background: rgba(255,255,255,0.82);
158
+ border: 1px solid rgba(42, 34, 24, 0.06);
159
+ }
160
+
161
+ .meta-label {
162
+ font-size: 17px;
163
+ color: var(--muted);
164
+ }
165
+
166
+ .meta-value {
167
+ margin-top: 8px;
168
+ font-size: 24px;
169
+ font-weight: 700;
170
+ word-break: break-word;
171
+ }
172
+
173
+ .skill-footer {
174
+ margin-top: 18px;
175
+ padding: 16px 8px 0;
176
+ border-top: 1px solid rgba(113, 96, 78, 0.16);
177
+ display: grid;
178
+ gap: 6px;
179
+ color: #7a6757;
180
+ font-size: 15px;
181
+ word-break: break-word;
182
+ }
@@ -0,0 +1,95 @@
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>
@@ -0,0 +1,255 @@
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
+ }
@@ -0,0 +1,78 @@
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>