novelws 5.3.0 → 5.4.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.
@@ -0,0 +1,13 @@
1
+ <!DOCTYPE html>
2
+ <html lang="zh-CN">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>NovelWS Dashboard</title>
7
+ <script type="module" crossorigin src="/assets/index-embc4E14.js"></script>
8
+ <link rel="stylesheet" crossorigin href="/assets/index-nD7kmLMb.css">
9
+ </head>
10
+ <body>
11
+ <div id="app"></div>
12
+ </body>
13
+ </html>
@@ -36,88 +36,111 @@ def get_db_config(config):
36
36
 
37
37
 
38
38
  DDL = f"""
39
+ -- ============================================================
40
+ -- 主角相关表结构(5张表)
41
+ -- Schema: {SCHEMA}
42
+ -- ============================================================
43
+
39
44
  -- 主角技能主表
45
+ -- 说明:记录主角学会的所有技能
40
46
  CREATE TABLE IF NOT EXISTS {SCHEMA}.protagonist_skills (
41
- id SERIAL PRIMARY KEY,
42
- skill_name VARCHAR(100) NOT NULL UNIQUE,
43
- skill_category VARCHAR(20) NOT NULL,
44
- skill_level VARCHAR(50),
45
- parent_skill_id INT REFERENCES {SCHEMA}.protagonist_skills(id),
46
- description TEXT,
47
- acquired_chapter INT NOT NULL,
48
- acquired_method VARCHAR(200),
49
- last_used_chapter INT,
50
- use_count INT DEFAULT 0,
51
- status VARCHAR(20) DEFAULT 'active'
47
+ id SERIAL PRIMARY KEY,
48
+ skill_name VARCHAR(100) NOT NULL UNIQUE, -- 技能名称(唯一)
49
+ skill_category VARCHAR(20) NOT NULL, -- 技能分类:账本脑/符/阵/被动/功法等
50
+ skill_level VARCHAR(50), -- 技能等级:入门/固化/小成/大成
51
+ parent_skill_id INT REFERENCES {SCHEMA}.protagonist_skills(id), -- 父技能ID(技能树)
52
+ description TEXT, -- 技能描述/效果说明
53
+ acquired_chapter INT NOT NULL, -- 获得章节号
54
+ acquired_method VARCHAR(200), -- 获得方式:自悟/修炼突破/副本掉落/交易等
55
+ last_used_chapter INT, -- 最后使用章节号
56
+ use_count INT DEFAULT 0, -- 使用次数
57
+ status VARCHAR(20) DEFAULT 'active' -- 状态:active(可用)/locked(锁定)/forgotten(遗忘)
52
58
  );
53
59
 
54
60
  -- 技能时序表
61
+ -- 说明:记录技能的每次使用/变化事件
55
62
  CREATE TABLE IF NOT EXISTS {SCHEMA}.protagonist_skill_events (
56
- id SERIAL PRIMARY KEY,
57
- skill_id INT NOT NULL REFERENCES {SCHEMA}.protagonist_skills(id),
58
- chapter_number INT NOT NULL,
59
- event_type VARCHAR(30) NOT NULL,
60
- detail TEXT,
61
- volume_id INT NOT NULL REFERENCES {SCHEMA}.volumes(id)
63
+ id SERIAL PRIMARY KEY,
64
+ skill_id INT NOT NULL REFERENCES {SCHEMA}.protagonist_skills(id), -- 技能ID
65
+ chapter_number INT NOT NULL, -- 事件发生章节号
66
+ event_type VARCHAR(30) NOT NULL, -- 事件类型:acquired(获得)/upgraded(升级)/used(使用)/forgotten(遗忘)
67
+ detail TEXT, -- 事件详情
68
+ volume_id INT NOT NULL REFERENCES {SCHEMA}.volumes(id) -- 所属卷ID
62
69
  );
63
70
 
64
- -- 装备/道具主表
71
+ -- 主角装备/道具主表
72
+ -- 说明:记录主角当前拥有的所有物品
65
73
  CREATE TABLE IF NOT EXISTS {SCHEMA}.protagonist_inventory (
66
- id SERIAL PRIMARY KEY,
67
- item_name VARCHAR(100) NOT NULL,
68
- item_type VARCHAR(30) NOT NULL,
69
- quantity INT DEFAULT 1,
70
- quality VARCHAR(30),
71
- description TEXT,
72
- acquired_chapter INT NOT NULL,
73
- acquired_method VARCHAR(200),
74
- status VARCHAR(20) DEFAULT 'held',
75
- UNIQUE(item_name, acquired_chapter)
74
+ id SERIAL PRIMARY KEY,
75
+ item_name VARCHAR(100) NOT NULL, -- 物品名称
76
+ item_type VARCHAR(30) NOT NULL, -- 物品类型:装备/材料/消耗品/工具
77
+ quantity INT DEFAULT 1, -- 数量
78
+ quality VARCHAR(30), -- 品质:普通/稀有/精良/史诗/传说
79
+ description TEXT, -- 物品描述
80
+ acquired_chapter INT NOT NULL, -- 获得章节号
81
+ acquired_method VARCHAR(200), -- 获得方式:拾取/交易/制作/副本掉落
82
+ status VARCHAR(20) DEFAULT 'held', -- 状态:held(持有)/consumed(已消耗)/equipped(装备中)
83
+ UNIQUE(item_name, acquired_chapter) -- 同一物品同名只能有一条记录
76
84
  );
77
85
 
78
86
  -- 道具时序表
87
+ -- 说明:记录物品的获取、使用、消耗等事件
79
88
  CREATE TABLE IF NOT EXISTS {SCHEMA}.protagonist_inventory_events (
80
- id SERIAL PRIMARY KEY,
81
- item_id INT NOT NULL REFERENCES {SCHEMA}.protagonist_inventory(id),
82
- chapter_number INT NOT NULL,
83
- event_type VARCHAR(30) NOT NULL,
84
- quantity_change INT DEFAULT 0,
85
- detail TEXT,
86
- volume_id INT NOT NULL REFERENCES {SCHEMA}.volumes(id)
89
+ id SERIAL PRIMARY KEY,
90
+ item_id INT NOT NULL REFERENCES {SCHEMA}.protagonist_inventory(id), -- 物品ID
91
+ chapter_number INT NOT NULL, -- 事件发生章节号
92
+ event_type VARCHAR(30) NOT NULL, -- 事件类型:acquired(获得)/used(使用)/lost(丢失)/given(赠予)
93
+ quantity_change INT DEFAULT 0, -- 数量变化(正数增加,负数减少)
94
+ detail TEXT, -- 事件详情
95
+ volume_id INT NOT NULL REFERENCES {SCHEMA}.volumes(id) -- 所属卷ID
87
96
  );
88
97
 
89
98
  -- 修炼进度表
99
+ -- 说明:记录主角的修炼突破历程
90
100
  CREATE TABLE IF NOT EXISTS {SCHEMA}.protagonist_cultivation (
91
- id SERIAL PRIMARY KEY,
92
- chapter_number INT NOT NULL,
93
- level VARCHAR(50) NOT NULL,
94
- progress_pct DECIMAL(5,1),
95
- breakthrough_type VARCHAR(20),
96
- trigger VARCHAR(200),
97
- detail TEXT,
98
- volume_id INT NOT NULL REFERENCES {SCHEMA}.volumes(id)
101
+ id SERIAL PRIMARY KEY,
102
+ chapter_number INT NOT NULL, -- 记录发生的章节号
103
+ level VARCHAR(50) NOT NULL, -- 修炼等级/境界(如:段1·炼气前期)
104
+ progress_pct DECIMAL(5,1), -- 进度百分比(0-100)
105
+ breakthrough_type VARCHAR(20), -- 突破类型:major(大境界突破)/minor(小境界提升)
106
+ trigger VARCHAR(200), -- 触发原因:修炼突破/副本战斗/特殊事件
107
+ detail TEXT, -- 详情描述
108
+ volume_id INT NOT NULL REFERENCES {SCHEMA}.volumes(id) -- 所属卷ID
99
109
  );
100
110
 
101
- -- 索引
102
- CREATE INDEX IF NOT EXISTS idx_skills_category ON {SCHEMA}.protagonist_skills(skill_category);
103
- CREATE INDEX IF NOT EXISTS idx_skills_status ON {SCHEMA}.protagonist_skills(status);
104
- CREATE INDEX IF NOT EXISTS idx_skill_events_skill ON {SCHEMA}.protagonist_skill_events(skill_id);
105
- CREATE INDEX IF NOT EXISTS idx_skill_events_vol ON {SCHEMA}.protagonist_skill_events(volume_id);
106
- CREATE INDEX IF NOT EXISTS idx_skill_events_type ON {SCHEMA}.protagonist_skill_events(event_type);
107
- CREATE INDEX IF NOT EXISTS idx_inventory_type ON {SCHEMA}.protagonist_inventory(item_type);
108
- CREATE INDEX IF NOT EXISTS idx_inventory_status ON {SCHEMA}.protagonist_inventory(status);
109
- CREATE INDEX IF NOT EXISTS idx_inv_events_item ON {SCHEMA}.protagonist_inventory_events(item_id);
110
- CREATE INDEX IF NOT EXISTS idx_inv_events_vol ON {SCHEMA}.protagonist_inventory_events(volume_id);
111
- CREATE INDEX IF NOT EXISTS idx_cultivation_vol ON {SCHEMA}.protagonist_cultivation(volume_id);
112
- CREATE INDEX IF NOT EXISTS idx_cultivation_ch ON {SCHEMA}.protagonist_cultivation(chapter_number);
113
-
114
- -- 视图
111
+ -- ============================================================
112
+ -- 索引(提升查询性能)
113
+ -- ============================================================
114
+
115
+ -- 技能相关索引
116
+ CREATE INDEX IF NOT EXISTS idx_skills_category ON {SCHEMA}.protagonist_skills(skill_category); -- 按技能分类查询
117
+ CREATE INDEX IF NOT EXISTS idx_skills_status ON {SCHEMA}.protagonist_skills(status); -- 按状态查询技能
118
+ CREATE INDEX IF NOT EXISTS idx_skill_events_skill ON {SCHEMA}.protagonist_skill_events(skill_id); -- 按技能查询事件
119
+ CREATE INDEX IF NOT EXISTS idx_skill_events_vol ON {SCHEMA}.protagonist_skill_events(volume_id); -- 按卷查询技能事件
120
+ CREATE INDEX IF NOT EXISTS idx_skill_events_type ON {SCHEMA}.protagonist_skill_events(event_type); -- 按事件类型查询
121
+
122
+ -- 背包相关索引
123
+ CREATE INDEX IF NOT EXISTS idx_inventory_type ON {SCHEMA}.protagonist_inventory(item_type); -- 按物品类型查询
124
+ CREATE INDEX IF NOT EXISTS idx_inventory_status ON {SCHEMA}.protagonist_inventory(status); -- 按状态查询背包
125
+ CREATE INDEX IF NOT EXISTS idx_inv_events_item ON {SCHEMA}.protagonist_inventory_events(item_id); -- 按物品查询事件
126
+ CREATE INDEX IF NOT EXISTS idx_inv_events_vol ON {SCHEMA}.protagonist_inventory_events(volume_id); -- 按卷查询背包事件
127
+
128
+ -- 修炼进度索引
129
+ CREATE INDEX IF NOT EXISTS idx_cultivation_vol ON {SCHEMA}.protagonist_cultivation(volume_id); -- 按卷查询修炼进度
130
+ CREATE INDEX IF NOT EXISTS idx_cultivation_ch ON {SCHEMA}.protagonist_cultivation(chapter_number); -- 按章节查询修炼进度
131
+
132
+ -- ============================================================
133
+ -- 视图(常用查询)
134
+ -- ============================================================
135
+
136
+ -- 当前持有物品视图:显示主角当前背包中的所有物品
115
137
  CREATE OR REPLACE VIEW {SCHEMA}.current_inventory AS
116
138
  SELECT item_name, item_type, quantity, quality, description, acquired_chapter
117
139
  FROM {SCHEMA}.protagonist_inventory
118
140
  WHERE status = 'held'
119
141
  ORDER BY item_type, item_name;
120
142
 
143
+ -- 技能总览视图:显示所有技能的概览信息及使用统计
121
144
  CREATE OR REPLACE VIEW {SCHEMA}.skill_overview AS
122
145
  SELECT s.skill_name, s.skill_category, s.skill_level, s.status,
123
146
  s.acquired_chapter, s.use_count,
@@ -127,10 +150,102 @@ LEFT JOIN {SCHEMA}.protagonist_skill_events e ON s.id = e.skill_id
127
150
  GROUP BY s.id
128
151
  ORDER BY s.skill_category, s.acquired_chapter;
129
152
 
153
+ -- 修炼进度曲线视图:按章节展示修炼进度变化
130
154
  CREATE OR REPLACE VIEW {SCHEMA}.cultivation_curve AS
131
155
  SELECT chapter_number, level, progress_pct, breakthrough_type, trigger
132
156
  FROM {SCHEMA}.protagonist_cultivation
133
157
  ORDER BY chapter_number;
158
+
159
+ -- ============================================================
160
+ -- 表和字段的中文注释(COMMENT ON)
161
+ -- ============================================================
162
+
163
+ -- protagonist_skills 表注释
164
+ COMMENT ON TABLE {SCHEMA}.protagonist_skills IS '主角技能主表:记录主角学会的所有技能';
165
+ COMMENT ON COLUMN {SCHEMA}.protagonist_skills.id IS '主键ID';
166
+ COMMENT ON COLUMN {SCHEMA}.protagonist_skills.skill_name IS '技能名称';
167
+ COMMENT ON COLUMN {SCHEMA}.protagonist_skills.skill_category IS '技能分类:账本脑/符/阵/被动/功法等';
168
+ COMMENT ON COLUMN {SCHEMA}.protagonist_skills.skill_level IS '技能等级:入门/固化/小成/大成';
169
+ COMMENT ON COLUMN {SCHEMA}.protagonist_skills.parent_skill_id IS '父技能ID(技能树)';
170
+ COMMENT ON COLUMN {SCHEMA}.protagonist_skills.description IS '技能描述/效果说明';
171
+ COMMENT ON COLUMN {SCHEMA}.protagonist_skills.acquired_chapter IS '获得章节号';
172
+ COMMENT ON COLUMN {SCHEMA}.protagonist_skills.acquired_method IS '获得方式:自悟/修炼突破/副本掉落/交易等';
173
+ COMMENT ON COLUMN {SCHEMA}.protagonist_skills.last_used_chapter IS '最后使用章节号';
174
+ COMMENT ON COLUMN {SCHEMA}.protagonist_skills.use_count IS '使用次数';
175
+ COMMENT ON COLUMN {SCHEMA}.protagonist_skills.status IS '状态:active(可用)/locked(锁定)/forgotten(遗忘)';
176
+
177
+ -- protagonist_skill_events 表注释
178
+ COMMENT ON TABLE {SCHEMA}.protagonist_skill_events IS '技能时序表:记录技能的每次使用/变化事件';
179
+ COMMENT ON COLUMN {SCHEMA}.protagonist_skill_events.id IS '主键ID';
180
+ COMMENT ON COLUMN {SCHEMA}.protagonist_skill_events.skill_id IS '技能ID';
181
+ COMMENT ON COLUMN {SCHEMA}.protagonist_skill_events.chapter_number IS '事件发生章节号';
182
+ COMMENT ON COLUMN {SCHEMA}.protagonist_skill_events.event_type IS '事件类型:acquired(获得)/upgraded(升级)/used(使用)/forgotten(遗忘)';
183
+ COMMENT ON COLUMN {SCHEMA}.protagonist_skill_events.detail IS '事件详情';
184
+ COMMENT ON COLUMN {SCHEMA}.protagonist_skill_events.volume_id IS '所属卷ID';
185
+
186
+ -- protagonist_inventory 表注释
187
+ COMMENT ON TABLE {SCHEMA}.protagonist_inventory IS '主角装备/道具主表:记录主角当前拥有的所有物品';
188
+ COMMENT ON COLUMN {SCHEMA}.protagonist_inventory.id IS '主键ID';
189
+ COMMENT ON COLUMN {SCHEMA}.protagonist_inventory.item_name IS '物品名称';
190
+ COMMENT ON COLUMN {SCHEMA}.protagonist_inventory.item_type IS '物品类型:装备/材料/消耗品/工具';
191
+ COMMENT ON COLUMN {SCHEMA}.protagonist_inventory.quantity IS '数量';
192
+ COMMENT ON COLUMN {SCHEMA}.protagonist_inventory.quality IS '品质:普通/稀有/精良/史诗/传说';
193
+ COMMENT ON COLUMN {SCHEMA}.protagonist_inventory.description IS '物品描述';
194
+ COMMENT ON COLUMN {SCHEMA}.protagonist_inventory.acquired_chapter IS '获得章节号';
195
+ COMMENT ON COLUMN {SCHEMA}.protagonist_inventory.acquired_method IS '获得方式:拾取/交易/制作/副本掉落';
196
+ COMMENT ON COLUMN {SCHEMA}.protagonist_inventory.status IS '状态:held(持有)/consumed(已消耗)/equipped(装备中)';
197
+
198
+ -- protagonist_inventory_events 表注释
199
+ COMMENT ON TABLE {SCHEMA}.protagonist_inventory_events IS '道具时序表:记录物品的获取、使用、消耗等事件';
200
+ COMMENT ON COLUMN {SCHEMA}.protagonist_inventory_events.id IS '主键ID';
201
+ COMMENT ON COLUMN {SCHEMA}.protagonist_inventory_events.item_id IS '物品ID';
202
+ COMMENT ON COLUMN {SCHEMA}.protagonist_inventory_events.chapter_number IS '事件发生章节号';
203
+ COMMENT ON COLUMN {SCHEMA}.protagonist_inventory_events.event_type IS '事件类型:acquired(获得)/used(使用)/lost(丢失)/given(赠予)';
204
+ COMMENT ON COLUMN {SCHEMA}.protagonist_inventory_events.quantity_change IS '数量变化(正数增加,负数减少)';
205
+ COMMENT ON COLUMN {SCHEMA}.protagonist_inventory_events.detail IS '事件详情';
206
+ COMMENT ON COLUMN {SCHEMA}.protagonist_inventory_events.volume_id IS '所属卷ID';
207
+
208
+ -- protagonist_cultivation 表注释
209
+ COMMENT ON TABLE {SCHEMA}.protagonist_cultivation IS '修炼进度表:记录主角的修炼突破历程';
210
+ COMMENT ON COLUMN {SCHEMA}.protagonist_cultivation.id IS '主键ID';
211
+ COMMENT ON COLUMN {SCHEMA}.protagonist_cultivation.chapter_number IS '记录发生的章节号';
212
+ COMMENT ON COLUMN {SCHEMA}.protagonist_cultivation.level IS '修炼等级/境界(如:段1·炼气前期)';
213
+ COMMENT ON COLUMN {SCHEMA}.protagonist_cultivation.progress_pct IS '进度百分比(0-100)';
214
+ COMMENT ON COLUMN {SCHEMA}.protagonist_cultivation.breakthrough_type IS '突破类型:major(大境界突破)/minor(小境界提升)';
215
+ COMMENT ON COLUMN {SCHEMA}.protagonist_cultivation.trigger IS '触发原因:修炼突破/副本战斗/特殊事件';
216
+ COMMENT ON COLUMN {SCHEMA}.protagonist_cultivation.detail IS '详情描述';
217
+ COMMENT ON COLUMN {SCHEMA}.protagonist_cultivation.volume_id IS '所属卷ID';
218
+
219
+ -- ============================================================
220
+ -- 视图的中文注释(COMMENT ON)
221
+ -- ============================================================
222
+
223
+ -- current_inventory 视图注释
224
+ COMMENT ON VIEW {SCHEMA}.current_inventory IS '当前背包:显示主角当前持有的物品';
225
+ COMMENT ON COLUMN {SCHEMA}.current_inventory.item_name IS '物品名称';
226
+ COMMENT ON COLUMN {SCHEMA}.current_inventory.item_type IS '物品类型';
227
+ COMMENT ON COLUMN {SCHEMA}.current_inventory.quantity IS '数量';
228
+ COMMENT ON COLUMN {SCHEMA}.current_inventory.quality IS '品质';
229
+ COMMENT ON COLUMN {SCHEMA}.current_inventory.description IS '物品描述';
230
+ COMMENT ON COLUMN {SCHEMA}.current_inventory.acquired_chapter IS '获得章节';
231
+
232
+ -- skill_overview 视图注释
233
+ COMMENT ON VIEW {SCHEMA}.skill_overview IS '技能总览:显示所有技能的概览信息及使用统计';
234
+ COMMENT ON COLUMN {SCHEMA}.skill_overview.skill_name IS '技能名称';
235
+ COMMENT ON COLUMN {SCHEMA}.skill_overview.skill_category IS '技能分类';
236
+ COMMENT ON COLUMN {SCHEMA}.skill_overview.skill_level IS '技能等级';
237
+ COMMENT ON COLUMN {SCHEMA}.skill_overview.status IS '技能状态';
238
+ COMMENT ON COLUMN {SCHEMA}.skill_overview.acquired_chapter IS '获得章节';
239
+ COMMENT ON COLUMN {SCHEMA}.skill_overview.use_count IS '使用次数';
240
+ COMMENT ON COLUMN {SCHEMA}.skill_overview.total_events IS '事件总数';
241
+
242
+ -- cultivation_curve 视图注释
243
+ COMMENT ON VIEW {SCHEMA}.cultivation_curve IS '修炼进度曲线:按章节展示修炼进度变化';
244
+ COMMENT ON COLUMN {SCHEMA}.cultivation_curve.chapter_number IS '章节号';
245
+ COMMENT ON COLUMN {SCHEMA}.cultivation_curve.level IS '修炼等级';
246
+ COMMENT ON COLUMN {SCHEMA}.cultivation_curve.progress_pct IS '进度百分比';
247
+ COMMENT ON COLUMN {SCHEMA}.cultivation_curve.breakthrough_type IS '突破类型';
248
+ COMMENT ON COLUMN {SCHEMA}.cultivation_curve.trigger IS '触发原因';
134
249
  """
135
250
 
136
251
  # ── 技能数据(vol-001~003) ──