@zhang_libo/resource-hub 1.0.2 → 1.0.9
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/LICENSE +21 -21
- package/README.en.md +13 -3
- package/README.ja.md +12 -2
- package/README.md +12 -2
- package/README.zh-TW.md +12 -2
- package/dist/app.js +4 -1
- package/dist/app.js.map +1 -1
- package/dist/db/migrate.js +135 -111
- package/dist/db/migrate.js.map +1 -1
- package/package.json +70 -73
- package/public/app.jsx +174 -174
- package/public/features/ChangePasswordModal.jsx +187 -187
- package/public/features/ResourceFormModal.jsx +915 -915
- package/public/layout/AppLayout.jsx +119 -119
- package/public/layout/Sidebar.jsx +1 -1
- package/dist/app.d.ts +0 -2
- package/dist/app.d.ts.map +0 -1
- package/dist/db/migrate.d.ts +0 -3
- package/dist/db/migrate.d.ts.map +0 -1
- package/dist/db/schema.d.ts +0 -743
- package/dist/db/schema.d.ts.map +0 -1
- package/dist/plugins/admin.d.ts +0 -4
- package/dist/plugins/admin.d.ts.map +0 -1
- package/dist/plugins/auth.d.ts +0 -4
- package/dist/plugins/auth.d.ts.map +0 -1
- package/dist/routes/auth.d.ts +0 -4
- package/dist/routes/auth.d.ts.map +0 -1
- package/dist/routes/categories.d.ts +0 -4
- package/dist/routes/categories.d.ts.map +0 -1
- package/dist/routes/config.d.ts +0 -4
- package/dist/routes/config.d.ts.map +0 -1
- package/dist/routes/resources.d.ts +0 -4
- package/dist/routes/resources.d.ts.map +0 -1
- package/dist/routes/tags.d.ts +0 -4
- package/dist/routes/tags.d.ts.map +0 -1
- package/dist/routes/users.d.ts +0 -4
- package/dist/routes/users.d.ts.map +0 -1
- package/dist/services/crypto.js +0 -49
- package/dist/services/crypto.js.map +0 -1
- package/dist/services/mail.d.ts +0 -16
- package/dist/services/mail.d.ts.map +0 -1
- package/dist/services/token.d.ts +0 -9
- package/dist/services/token.d.ts.map +0 -1
- package/dist/types.d.ts +0 -80
- package/dist/types.d.ts.map +0 -1
package/LICENSE
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2026 BadIdea
|
|
4
|
-
|
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
-
in the Software without restriction, including without limitation the rights
|
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
-
furnished to do so, subject to the following conditions:
|
|
11
|
-
|
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
|
13
|
-
copies or substantial portions of the Software.
|
|
14
|
-
|
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
-
SOFTWARE.
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 BadIdea
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.en.md
CHANGED
|
@@ -14,6 +14,14 @@ ResourceHub is a general-purpose resource management product used to centrally o
|
|
|
14
14
|
- **Admin Console**: Admins can manage categories, tags, users, system settings, and email configuration.
|
|
15
15
|
- **Mock Email Mode**: When SMTP is not configured, emails are not actually sent. Instead, the API response includes an email preview for the frontend to display.
|
|
16
16
|
|
|
17
|
+
### Default demo admin account
|
|
18
|
+
|
|
19
|
+
- **Username**: `admin`
|
|
20
|
+
- **Password**: `Abc12345`
|
|
21
|
+
- **Display name**: `admin`
|
|
22
|
+
- **Email**: `zhanglibo610@gmail.com`
|
|
23
|
+
- **Note**: This account is only auto-created when `SEED_DEMO=1` and the database has no users and the system is not initialized; it is intended for demo environments.
|
|
24
|
+
|
|
17
25
|
### Tech Stack Overview
|
|
18
26
|
|
|
19
27
|
- **Frontend**: React 18 (CDN UMD) + Babel Standalone + Tailwind CSS (CDN), hash router, no bundler.
|
|
@@ -26,8 +34,9 @@ For detailed technical documentation, see `[docs/tech-stack.md](docs/tech-stack.
|
|
|
26
34
|
### Install & Run via npm
|
|
27
35
|
|
|
28
36
|
```bash
|
|
29
|
-
npm
|
|
30
|
-
npx resource-hub
|
|
37
|
+
npm install -g @zhang_libo/resource-hub
|
|
38
|
+
npx @zhang_libo/resource-hub
|
|
39
|
+
npm uninstall -g @zhang_libo/resource-hub
|
|
31
40
|
```
|
|
32
41
|
|
|
33
42
|
Default URL: `http://localhost:3000`. On first run, the app will redirect to `#/setup` to initialize the admin user. Runtime parameters can be set via environment variables (e.g. `PORT`, `DB_PATH`, `JWT_SECRET`, `NODE_ENV`); see "Install & Run from Source" below for details.
|
|
@@ -64,9 +73,10 @@ npm start
|
|
|
64
73
|
Key environment variables:
|
|
65
74
|
|
|
66
75
|
- `PORT` (default `3000`)
|
|
67
|
-
- `DB_PATH` (default `data
|
|
76
|
+
- `DB_PATH` (default `data-resource-hub.db`)
|
|
68
77
|
- `JWT_SECRET` (must be a secure random value)
|
|
69
78
|
- `NODE_ENV` (`development` / `production`)
|
|
79
|
+
- `SEED_DEMO` (optional, set to `1` to auto-create the default demo admin and mock data when the DB is empty and not initialized)
|
|
70
80
|
|
|
71
81
|
### Documentation Navigation
|
|
72
82
|
|
package/README.ja.md
CHANGED
|
@@ -14,6 +14,14 @@ ResourceHub は、さまざまなサイト・ツール・ナレッジベース
|
|
|
14
14
|
- **管理コンソール**:管理者はカテゴリ・タグ・ユーザー・システム設定・メール設定を管理可能。
|
|
15
15
|
- **モックメールモード**:SMTP が未設定の場合はメールを実送信せず、レスポンスにメールプレビューを含め、フロントエンドで表示できます。
|
|
16
16
|
|
|
17
|
+
### 既定のデモ管理者アカウント
|
|
18
|
+
|
|
19
|
+
- **ユーザー名**:`admin`
|
|
20
|
+
- **パスワード**:`Abc12345`
|
|
21
|
+
- **表示名**:`admin`
|
|
22
|
+
- **メールアドレス**:`zhanglibo610@gmail.com`
|
|
23
|
+
- **補足**:環境変数 `SEED_DEMO=1` かつデータベースにユーザーが存在せず、システムが未初期化の場合にのみ、起動時にこの管理者アカウントとデモデータが自動作成されます(デモ環境向け)。
|
|
24
|
+
|
|
17
25
|
### 技術スタック概要
|
|
18
26
|
|
|
19
27
|
- **フロントエンド**:React 18(CDN UMD)+ Babel Standalone + Tailwind CSS(CDN)、ハッシュルーター、ビルドツールなし。
|
|
@@ -26,8 +34,9 @@ ResourceHub は、さまざまなサイト・ツール・ナレッジベース
|
|
|
26
34
|
### npm でのインストールと起動
|
|
27
35
|
|
|
28
36
|
```bash
|
|
29
|
-
npm
|
|
30
|
-
npx resource-hub
|
|
37
|
+
npm install -g @zhang_libo/resource-hub
|
|
38
|
+
npx @zhang_libo/resource-hub
|
|
39
|
+
npm uninstall -g @zhang_libo/resource-hub
|
|
31
40
|
```
|
|
32
41
|
|
|
33
42
|
デフォルトのアクセス URL は `http://localhost:3000` です。初回起動時は `#/setup` にリダイレクトされ、管理者アカウントの初期化が行われます。実行時パラメータは環境変数で指定できます(`PORT`、`DB_PATH`、`JWT_SECRET`、`NODE_ENV` など)。詳細は下記「インストールと起動(ソースコードから)」を参照してください。
|
|
@@ -67,6 +76,7 @@ npm start
|
|
|
67
76
|
- `DB_PATH`(デフォルト `data/resource-hub.db`)
|
|
68
77
|
- `JWT_SECRET`(十分に安全なランダム値である必要があります)
|
|
69
78
|
- `NODE_ENV`(`development` / `production`)
|
|
79
|
+
- `SEED_DEMO`(任意。`1` を設定すると、空の DB かつ未初期化の場合に既定のデモ管理者とデモデータを自動作成します)
|
|
70
80
|
|
|
71
81
|
### ドキュメントナビゲーション
|
|
72
82
|
|
package/README.md
CHANGED
|
@@ -14,6 +14,14 @@ ResourceHub 是一个通用的资源管理产品,用来集中整理、访问
|
|
|
14
14
|
- **后台管理**:管理员可维护类别、标签、用户、系统配置和邮件配置。
|
|
15
15
|
- **Mock 邮件模式**:在未配置 SMTP 时,不真实发送邮件,而是在响应中返回邮件预览供前端展示。
|
|
16
16
|
|
|
17
|
+
### 默认演示管理员账号
|
|
18
|
+
|
|
19
|
+
- **用户名**:`admin`
|
|
20
|
+
- **密码**:`Abc12345`
|
|
21
|
+
- **显示名称**:`admin`
|
|
22
|
+
- **邮箱**:`zhanglibo610@gmail.com`
|
|
23
|
+
- **说明**:仅在环境变量 `SEED_DEMO=1` 且数据库中尚无用户、系统未初始化时,启动时自动创建该管理员,并写入演示数据。
|
|
24
|
+
|
|
17
25
|
### 技术栈概览
|
|
18
26
|
|
|
19
27
|
- **前端**:React 18(CDN UMD)+ Babel Standalone + Tailwind CSS(CDN),Hash Router,无打包工具。
|
|
@@ -26,8 +34,9 @@ ResourceHub 是一个通用的资源管理产品,用来集中整理、访问
|
|
|
26
34
|
### 使用 npm 安装与运行
|
|
27
35
|
|
|
28
36
|
```bash
|
|
29
|
-
npm
|
|
30
|
-
npx resource-hub
|
|
37
|
+
npm install -g @zhang_libo/resource-hub
|
|
38
|
+
npx @zhang_libo/resource-hub
|
|
39
|
+
npm uninstall -g @zhang_libo/resource-hub
|
|
31
40
|
```
|
|
32
41
|
|
|
33
42
|
默认访问 `http://localhost:3000`,首次会跳转到 `#/setup` 初始化管理员。运行参数可通过环境变量配置(如 `PORT`、`DB_PATH`、`JWT_SECRET`、`NODE_ENV`),详见下方「安装与运行(源码方式)」中的说明。
|
|
@@ -67,6 +76,7 @@ npm start
|
|
|
67
76
|
- `DB_PATH`(默认 `data/resource-hub.db`)
|
|
68
77
|
- `JWT_SECRET`(必须为安全随机值)
|
|
69
78
|
- `NODE_ENV`(`development` / `production`)
|
|
79
|
+
- `SEED_DEMO`(可选,设为 `1` 时在空库且未初始化时自动创建默认演示管理员并写入 Demo 数据)
|
|
70
80
|
|
|
71
81
|
### 文档导航
|
|
72
82
|
|
package/README.zh-TW.md
CHANGED
|
@@ -14,6 +14,14 @@ ResourceHub 是一個通用的資源管理產品,用來集中整理、存取
|
|
|
14
14
|
- **後台管理**:管理員可維護分類、標籤、使用者、系統設定與郵件設定。
|
|
15
15
|
- **Mock 郵件模式**:在未設定 SMTP 時,不實際寄出郵件,而是在回應中回傳郵件預覽供前端顯示。
|
|
16
16
|
|
|
17
|
+
### 預設示範管理員帳號
|
|
18
|
+
|
|
19
|
+
- **使用者名稱**:`admin`
|
|
20
|
+
- **密碼**:`Abc12345`
|
|
21
|
+
- **顯示名稱**:`admin`
|
|
22
|
+
- **電子郵件**:`zhanglibo610@gmail.com`
|
|
23
|
+
- **說明**:僅在環境變數 `SEED_DEMO=1` 且資料庫尚無使用者、系統尚未初始化時,啟動時才會自動建立此管理員並寫入示範資料。
|
|
24
|
+
|
|
17
25
|
### 技術棧概覽
|
|
18
26
|
|
|
19
27
|
- **前端**:React 18(CDN UMD)+ Babel Standalone + Tailwind CSS(CDN),Hash Router,無打包工具。
|
|
@@ -26,8 +34,9 @@ ResourceHub 是一個通用的資源管理產品,用來集中整理、存取
|
|
|
26
34
|
### 使用 npm 安裝與執行
|
|
27
35
|
|
|
28
36
|
```bash
|
|
29
|
-
npm
|
|
30
|
-
npx resource-hub
|
|
37
|
+
npm install -g @zhang_libo/resource-hub
|
|
38
|
+
npx @zhang_libo/resource-hub
|
|
39
|
+
npm uninstall -g @zhang_libo/resource-hub
|
|
31
40
|
```
|
|
32
41
|
|
|
33
42
|
預設訪問位址為 `http://localhost:3000`,首次啟動會導向 `#/setup` 以初始化管理員。執行參數可透過環境變數設定(如 `PORT`、`DB_PATH`、`JWT_SECRET`、`NODE_ENV`),詳見下方「安裝與執行(原始碼方式)」中的說明。
|
|
@@ -67,6 +76,7 @@ npm start
|
|
|
67
76
|
- `DB_PATH`(預設 `data/resource-hub.db`)
|
|
68
77
|
- `JWT_SECRET`(必須為安全且隨機的值)
|
|
69
78
|
- `NODE_ENV`(`development` / `production`)
|
|
79
|
+
- `SEED_DEMO`(選用,設為 `1` 時,在空庫且尚未初始化的情況下自動建立預設示範管理員並寫入 Demo 資料)
|
|
70
80
|
|
|
71
81
|
### 文件導覽
|
|
72
82
|
|
package/dist/app.js
CHANGED
|
@@ -4,7 +4,7 @@ import Fastify from 'fastify';
|
|
|
4
4
|
import cors from '@fastify/cors';
|
|
5
5
|
import jwt from '@fastify/jwt';
|
|
6
6
|
import staticPlugin from '@fastify/static';
|
|
7
|
-
import { runMigrations } from './db/migrate.js';
|
|
7
|
+
import { runMigrations, seedDemoAdminAndData } from './db/migrate.js';
|
|
8
8
|
import { ensureRsaKeyPair } from './services/rsa.js';
|
|
9
9
|
import authPlugin from './plugins/auth.js';
|
|
10
10
|
import adminPlugin from './plugins/admin.js';
|
|
@@ -20,6 +20,9 @@ const NODE_ENV = process.env.NODE_ENV ?? 'development';
|
|
|
20
20
|
export async function buildApp() {
|
|
21
21
|
runMigrations();
|
|
22
22
|
ensureRsaKeyPair();
|
|
23
|
+
if (process.env.SEED_DEMO === '1') {
|
|
24
|
+
await seedDemoAdminAndData();
|
|
25
|
+
}
|
|
23
26
|
const fastify = Fastify({
|
|
24
27
|
logger: NODE_ENV === 'development' ? { level: 'info' } : false,
|
|
25
28
|
});
|
package/dist/app.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAA;AACnC,OAAO,OAAO,MAAM,SAAS,CAAA;AAC7B,OAAO,IAAI,MAAM,eAAe,CAAA;AAChC,OAAO,GAAG,MAAM,cAAc,CAAA;AAC9B,OAAO,YAAY,MAAM,iBAAiB,CAAA;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
|
package/dist/db/migrate.js
CHANGED
|
@@ -1,122 +1,124 @@
|
|
|
1
1
|
import { sqlite, db } from './index.js';
|
|
2
|
-
import { categories, resources, resourceTags } from './schema.js';
|
|
2
|
+
import { categories, resources, resourceTags, users, initialized } from './schema.js';
|
|
3
3
|
import { v4 as uuidv4 } from 'uuid';
|
|
4
|
+
import bcrypt from 'bcryptjs';
|
|
5
|
+
import { eq } from 'drizzle-orm';
|
|
4
6
|
export function runMigrations() {
|
|
5
|
-
sqlite.exec(`
|
|
6
|
-
CREATE TABLE IF NOT EXISTS initialized (
|
|
7
|
-
id TEXT PRIMARY KEY DEFAULT 'default',
|
|
8
|
-
done INTEGER NOT NULL DEFAULT 0
|
|
9
|
-
);
|
|
10
|
-
|
|
11
|
-
CREATE TABLE IF NOT EXISTS users (
|
|
12
|
-
id TEXT PRIMARY KEY,
|
|
13
|
-
username TEXT NOT NULL UNIQUE,
|
|
14
|
-
display_name TEXT NOT NULL,
|
|
15
|
-
email TEXT NOT NULL UNIQUE,
|
|
16
|
-
role TEXT NOT NULL DEFAULT 'user',
|
|
17
|
-
status TEXT NOT NULL DEFAULT 'active',
|
|
18
|
-
password_hash TEXT NOT NULL,
|
|
19
|
-
created_at INTEGER NOT NULL
|
|
20
|
-
);
|
|
21
|
-
|
|
22
|
-
CREATE TABLE IF NOT EXISTS categories (
|
|
23
|
-
id TEXT PRIMARY KEY,
|
|
24
|
-
name TEXT NOT NULL UNIQUE,
|
|
25
|
-
color TEXT NOT NULL DEFAULT '#0071E3',
|
|
26
|
-
created_at INTEGER NOT NULL
|
|
27
|
-
);
|
|
28
|
-
|
|
29
|
-
CREATE TABLE IF NOT EXISTS resources (
|
|
30
|
-
id TEXT PRIMARY KEY,
|
|
31
|
-
name TEXT NOT NULL,
|
|
32
|
-
url TEXT NOT NULL,
|
|
33
|
-
category_id TEXT REFERENCES categories(id) ON DELETE SET NULL,
|
|
34
|
-
visibility TEXT NOT NULL DEFAULT 'public',
|
|
35
|
-
logo_url TEXT DEFAULT '',
|
|
36
|
-
description TEXT DEFAULT '',
|
|
37
|
-
enabled INTEGER NOT NULL DEFAULT 1,
|
|
38
|
-
owner_id TEXT NOT NULL REFERENCES users(id),
|
|
39
|
-
visit_count INTEGER NOT NULL DEFAULT 0,
|
|
40
|
-
created_at INTEGER NOT NULL,
|
|
41
|
-
updated_at INTEGER NOT NULL
|
|
42
|
-
);
|
|
43
|
-
|
|
44
|
-
CREATE TABLE IF NOT EXISTS resource_tags (
|
|
45
|
-
resource_id TEXT NOT NULL REFERENCES resources(id) ON DELETE CASCADE,
|
|
46
|
-
tag TEXT NOT NULL,
|
|
47
|
-
PRIMARY KEY (resource_id, tag)
|
|
48
|
-
);
|
|
49
|
-
|
|
50
|
-
CREATE TABLE IF NOT EXISTS favorites (
|
|
51
|
-
user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
52
|
-
resource_id TEXT NOT NULL REFERENCES resources(id) ON DELETE CASCADE,
|
|
53
|
-
created_at INTEGER NOT NULL,
|
|
54
|
-
PRIMARY KEY (user_id, resource_id)
|
|
55
|
-
);
|
|
56
|
-
|
|
57
|
-
CREATE TABLE IF NOT EXISTS visit_history (
|
|
58
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
59
|
-
user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
60
|
-
resource_id TEXT NOT NULL REFERENCES resources(id) ON DELETE CASCADE,
|
|
61
|
-
visited_at INTEGER NOT NULL
|
|
62
|
-
);
|
|
63
|
-
|
|
64
|
-
CREATE TABLE IF NOT EXISTS visit_hourly (
|
|
65
|
-
visit_hour INTEGER NOT NULL,
|
|
66
|
-
visit_count INTEGER NOT NULL DEFAULT 0,
|
|
67
|
-
PRIMARY KEY (visit_hour)
|
|
68
|
-
);
|
|
69
|
-
|
|
70
|
-
CREATE TABLE IF NOT EXISTS system_config (
|
|
71
|
-
id TEXT PRIMARY KEY DEFAULT 'default',
|
|
72
|
-
site_title TEXT NOT NULL DEFAULT '资源导航系统',
|
|
73
|
-
site_subtitle TEXT NOT NULL DEFAULT '统一管理与访问你的资源',
|
|
74
|
-
logo_url TEXT DEFAULT '',
|
|
75
|
-
token_expiry INTEGER NOT NULL DEFAULT 60,
|
|
76
|
-
reset_token_expiry INTEGER NOT NULL DEFAULT 60,
|
|
77
|
-
enable_register INTEGER NOT NULL DEFAULT 1,
|
|
78
|
-
restrict_email_domain INTEGER NOT NULL DEFAULT 0,
|
|
79
|
-
email_domain_whitelist TEXT DEFAULT ''
|
|
80
|
-
);
|
|
81
|
-
|
|
82
|
-
CREATE TABLE IF NOT EXISTS email_config (
|
|
83
|
-
id TEXT PRIMARY KEY DEFAULT 'default',
|
|
84
|
-
smtp_host TEXT DEFAULT '',
|
|
85
|
-
smtp_port INTEGER DEFAULT 465,
|
|
86
|
-
encryption TEXT DEFAULT 'ssl',
|
|
87
|
-
from_email TEXT DEFAULT '',
|
|
88
|
-
from_name TEXT DEFAULT '资源导航系统',
|
|
89
|
-
smtp_user TEXT DEFAULT '',
|
|
90
|
-
smtp_password TEXT DEFAULT ''
|
|
91
|
-
);
|
|
92
|
-
|
|
93
|
-
CREATE TABLE IF NOT EXISTS reset_tokens (
|
|
94
|
-
token TEXT PRIMARY KEY,
|
|
95
|
-
email TEXT NOT NULL,
|
|
96
|
-
expires_at INTEGER NOT NULL,
|
|
97
|
-
used INTEGER NOT NULL DEFAULT 0
|
|
98
|
-
);
|
|
99
|
-
|
|
100
|
-
CREATE TABLE IF NOT EXISTS rsa_keys (
|
|
101
|
-
id TEXT PRIMARY KEY DEFAULT 'current',
|
|
102
|
-
public_key TEXT NOT NULL,
|
|
103
|
-
private_key TEXT NOT NULL,
|
|
104
|
-
created_at INTEGER NOT NULL
|
|
105
|
-
);
|
|
106
|
-
|
|
107
|
-
INSERT OR IGNORE INTO initialized (id, done) VALUES ('default', 0);
|
|
108
|
-
INSERT OR IGNORE INTO system_config (id) VALUES ('default');
|
|
109
|
-
INSERT OR IGNORE INTO email_config (id) VALUES ('default');
|
|
7
|
+
sqlite.exec(`
|
|
8
|
+
CREATE TABLE IF NOT EXISTS initialized (
|
|
9
|
+
id TEXT PRIMARY KEY DEFAULT 'default',
|
|
10
|
+
done INTEGER NOT NULL DEFAULT 0
|
|
11
|
+
);
|
|
12
|
+
|
|
13
|
+
CREATE TABLE IF NOT EXISTS users (
|
|
14
|
+
id TEXT PRIMARY KEY,
|
|
15
|
+
username TEXT NOT NULL UNIQUE,
|
|
16
|
+
display_name TEXT NOT NULL,
|
|
17
|
+
email TEXT NOT NULL UNIQUE,
|
|
18
|
+
role TEXT NOT NULL DEFAULT 'user',
|
|
19
|
+
status TEXT NOT NULL DEFAULT 'active',
|
|
20
|
+
password_hash TEXT NOT NULL,
|
|
21
|
+
created_at INTEGER NOT NULL
|
|
22
|
+
);
|
|
23
|
+
|
|
24
|
+
CREATE TABLE IF NOT EXISTS categories (
|
|
25
|
+
id TEXT PRIMARY KEY,
|
|
26
|
+
name TEXT NOT NULL UNIQUE,
|
|
27
|
+
color TEXT NOT NULL DEFAULT '#0071E3',
|
|
28
|
+
created_at INTEGER NOT NULL
|
|
29
|
+
);
|
|
30
|
+
|
|
31
|
+
CREATE TABLE IF NOT EXISTS resources (
|
|
32
|
+
id TEXT PRIMARY KEY,
|
|
33
|
+
name TEXT NOT NULL,
|
|
34
|
+
url TEXT NOT NULL,
|
|
35
|
+
category_id TEXT REFERENCES categories(id) ON DELETE SET NULL,
|
|
36
|
+
visibility TEXT NOT NULL DEFAULT 'public',
|
|
37
|
+
logo_url TEXT DEFAULT '',
|
|
38
|
+
description TEXT DEFAULT '',
|
|
39
|
+
enabled INTEGER NOT NULL DEFAULT 1,
|
|
40
|
+
owner_id TEXT NOT NULL REFERENCES users(id),
|
|
41
|
+
visit_count INTEGER NOT NULL DEFAULT 0,
|
|
42
|
+
created_at INTEGER NOT NULL,
|
|
43
|
+
updated_at INTEGER NOT NULL
|
|
44
|
+
);
|
|
45
|
+
|
|
46
|
+
CREATE TABLE IF NOT EXISTS resource_tags (
|
|
47
|
+
resource_id TEXT NOT NULL REFERENCES resources(id) ON DELETE CASCADE,
|
|
48
|
+
tag TEXT NOT NULL,
|
|
49
|
+
PRIMARY KEY (resource_id, tag)
|
|
50
|
+
);
|
|
51
|
+
|
|
52
|
+
CREATE TABLE IF NOT EXISTS favorites (
|
|
53
|
+
user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
54
|
+
resource_id TEXT NOT NULL REFERENCES resources(id) ON DELETE CASCADE,
|
|
55
|
+
created_at INTEGER NOT NULL,
|
|
56
|
+
PRIMARY KEY (user_id, resource_id)
|
|
57
|
+
);
|
|
58
|
+
|
|
59
|
+
CREATE TABLE IF NOT EXISTS visit_history (
|
|
60
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
61
|
+
user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
62
|
+
resource_id TEXT NOT NULL REFERENCES resources(id) ON DELETE CASCADE,
|
|
63
|
+
visited_at INTEGER NOT NULL
|
|
64
|
+
);
|
|
65
|
+
|
|
66
|
+
CREATE TABLE IF NOT EXISTS visit_hourly (
|
|
67
|
+
visit_hour INTEGER NOT NULL,
|
|
68
|
+
visit_count INTEGER NOT NULL DEFAULT 0,
|
|
69
|
+
PRIMARY KEY (visit_hour)
|
|
70
|
+
);
|
|
71
|
+
|
|
72
|
+
CREATE TABLE IF NOT EXISTS system_config (
|
|
73
|
+
id TEXT PRIMARY KEY DEFAULT 'default',
|
|
74
|
+
site_title TEXT NOT NULL DEFAULT '资源导航系统',
|
|
75
|
+
site_subtitle TEXT NOT NULL DEFAULT '统一管理与访问你的资源',
|
|
76
|
+
logo_url TEXT DEFAULT '',
|
|
77
|
+
token_expiry INTEGER NOT NULL DEFAULT 60,
|
|
78
|
+
reset_token_expiry INTEGER NOT NULL DEFAULT 60,
|
|
79
|
+
enable_register INTEGER NOT NULL DEFAULT 1,
|
|
80
|
+
restrict_email_domain INTEGER NOT NULL DEFAULT 0,
|
|
81
|
+
email_domain_whitelist TEXT DEFAULT ''
|
|
82
|
+
);
|
|
83
|
+
|
|
84
|
+
CREATE TABLE IF NOT EXISTS email_config (
|
|
85
|
+
id TEXT PRIMARY KEY DEFAULT 'default',
|
|
86
|
+
smtp_host TEXT DEFAULT '',
|
|
87
|
+
smtp_port INTEGER DEFAULT 465,
|
|
88
|
+
encryption TEXT DEFAULT 'ssl',
|
|
89
|
+
from_email TEXT DEFAULT '',
|
|
90
|
+
from_name TEXT DEFAULT '资源导航系统',
|
|
91
|
+
smtp_user TEXT DEFAULT '',
|
|
92
|
+
smtp_password TEXT DEFAULT ''
|
|
93
|
+
);
|
|
94
|
+
|
|
95
|
+
CREATE TABLE IF NOT EXISTS reset_tokens (
|
|
96
|
+
token TEXT PRIMARY KEY,
|
|
97
|
+
email TEXT NOT NULL,
|
|
98
|
+
expires_at INTEGER NOT NULL,
|
|
99
|
+
used INTEGER NOT NULL DEFAULT 0
|
|
100
|
+
);
|
|
101
|
+
|
|
102
|
+
CREATE TABLE IF NOT EXISTS rsa_keys (
|
|
103
|
+
id TEXT PRIMARY KEY DEFAULT 'current',
|
|
104
|
+
public_key TEXT NOT NULL,
|
|
105
|
+
private_key TEXT NOT NULL,
|
|
106
|
+
created_at INTEGER NOT NULL
|
|
107
|
+
);
|
|
108
|
+
|
|
109
|
+
INSERT OR IGNORE INTO initialized (id, done) VALUES ('default', 0);
|
|
110
|
+
INSERT OR IGNORE INTO system_config (id) VALUES ('default');
|
|
111
|
+
INSERT OR IGNORE INTO email_config (id) VALUES ('default');
|
|
110
112
|
`);
|
|
111
113
|
const oldVisitHourly = sqlite.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='resource_visit_hourly'").get();
|
|
112
114
|
if (oldVisitHourly?.name) {
|
|
113
115
|
const newCountRow = sqlite.prepare('SELECT COUNT(*) as count FROM visit_hourly').get();
|
|
114
116
|
if ((newCountRow?.count || 0) === 0) {
|
|
115
|
-
sqlite.exec(`
|
|
116
|
-
INSERT INTO visit_hourly (visit_hour, visit_count)
|
|
117
|
-
SELECT visit_hour, SUM(visit_count) AS visit_count
|
|
118
|
-
FROM resource_visit_hourly
|
|
119
|
-
GROUP BY visit_hour
|
|
117
|
+
sqlite.exec(`
|
|
118
|
+
INSERT INTO visit_hourly (visit_hour, visit_count)
|
|
119
|
+
SELECT visit_hour, SUM(visit_count) AS visit_count
|
|
120
|
+
FROM resource_visit_hourly
|
|
121
|
+
GROUP BY visit_hour
|
|
120
122
|
`);
|
|
121
123
|
}
|
|
122
124
|
sqlite.exec('DROP TABLE IF EXISTS resource_visit_hourly;');
|
|
@@ -166,4 +168,26 @@ export function seedMockData(adminId) {
|
|
|
166
168
|
}
|
|
167
169
|
}
|
|
168
170
|
}
|
|
171
|
+
export async function seedDemoAdminAndData() {
|
|
172
|
+
const anyUser = db.select().from(users).limit(1).all();
|
|
173
|
+
if (anyUser.length > 0)
|
|
174
|
+
return;
|
|
175
|
+
const initRow = db.select().from(initialized).where(eq(initialized.id, 'default')).get();
|
|
176
|
+
if (initRow?.done)
|
|
177
|
+
return;
|
|
178
|
+
const now = Math.floor(Date.now() / 1000);
|
|
179
|
+
const adminId = uuidv4();
|
|
180
|
+
const passwordHash = await bcrypt.hash('Abc12345', 10);
|
|
181
|
+
db.insert(users).values({
|
|
182
|
+
id: adminId,
|
|
183
|
+
username: 'admin',
|
|
184
|
+
displayName: 'admin',
|
|
185
|
+
email: 'zhanglibo610@gmail.com',
|
|
186
|
+
role: 'admin',
|
|
187
|
+
status: 'active',
|
|
188
|
+
passwordHash,
|
|
189
|
+
createdAt: now,
|
|
190
|
+
}).run();
|
|
191
|
+
seedMockData(adminId);
|
|
192
|
+
}
|
|
169
193
|
//# sourceMappingURL=migrate.js.map
|
package/dist/db/migrate.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/db/migrate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,YAAY,CAAA;AACvC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/db/migrate.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,73 +1,70 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@zhang_libo/resource-hub",
|
|
3
|
-
"version": "1.0.
|
|
4
|
-
"description": "资源导航系统 - 集中整理与维护站点、工具、知识库与链接,支持用户登录、收藏、访问历史与后台管理",
|
|
5
|
-
"keywords": [
|
|
6
|
-
"resource",
|
|
7
|
-
"management",
|
|
8
|
-
"system",
|
|
9
|
-
"hub",
|
|
10
|
-
"resource-hub",
|
|
11
|
-
"资源",
|
|
12
|
-
"导航",
|
|
13
|
-
"资源管理",
|
|
14
|
-
"链接管理",
|
|
15
|
-
"收藏",
|
|
16
|
-
"后台管理"
|
|
17
|
-
],
|
|
18
|
-
"type": "module",
|
|
19
|
-
"license": "MIT",
|
|
20
|
-
"author": "Libo Zhang",
|
|
21
|
-
"email": "zhanglibo610@gmail.com",
|
|
22
|
-
"repository": {
|
|
23
|
-
"type": "git",
|
|
24
|
-
"url": "https://github.com/my-bad-idea/ResourceHub.git"
|
|
25
|
-
},
|
|
26
|
-
"homepage": "https://github.com/my-bad-idea/ResourceHub#readme",
|
|
27
|
-
"main": "dist/app.js",
|
|
28
|
-
"bin": {
|
|
29
|
-
"resource-hub": "bin/cli.js"
|
|
30
|
-
},
|
|
31
|
-
"engines": {
|
|
32
|
-
"node": ">=18.0.0"
|
|
33
|
-
},
|
|
34
|
-
"files": [
|
|
35
|
-
"dist",
|
|
36
|
-
"public",
|
|
37
|
-
"bin"
|
|
38
|
-
],
|
|
39
|
-
"scripts": {
|
|
40
|
-
"dev": "tsx watch src/app.ts",
|
|
41
|
-
"build": "tsc",
|
|
42
|
-
"start": "node dist/app.js",
|
|
43
|
-
"test:smoke": "node test/smoke.mjs",
|
|
44
|
-
"test:browser": "node test/browser-acceptance.mjs",
|
|
45
|
-
"check": "npm run build && npm run test:smoke",
|
|
46
|
-
"
|
|
47
|
-
"release:
|
|
48
|
-
"
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
"
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
"
|
|
55
|
-
"
|
|
56
|
-
"
|
|
57
|
-
"
|
|
58
|
-
"
|
|
59
|
-
"
|
|
60
|
-
"
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
"
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
"@types/
|
|
67
|
-
"
|
|
68
|
-
"
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
"typescript": "^5"
|
|
72
|
-
}
|
|
73
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@zhang_libo/resource-hub",
|
|
3
|
+
"version": "1.0.9",
|
|
4
|
+
"description": "资源导航系统 - 集中整理与维护站点、工具、知识库与链接,支持用户登录、收藏、访问历史与后台管理",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"resource",
|
|
7
|
+
"management",
|
|
8
|
+
"system",
|
|
9
|
+
"hub",
|
|
10
|
+
"resource-hub",
|
|
11
|
+
"资源",
|
|
12
|
+
"导航",
|
|
13
|
+
"资源管理",
|
|
14
|
+
"链接管理",
|
|
15
|
+
"收藏",
|
|
16
|
+
"后台管理"
|
|
17
|
+
],
|
|
18
|
+
"type": "module",
|
|
19
|
+
"license": "MIT",
|
|
20
|
+
"author": "Libo Zhang",
|
|
21
|
+
"email": "zhanglibo610@gmail.com",
|
|
22
|
+
"repository": {
|
|
23
|
+
"type": "git",
|
|
24
|
+
"url": "https://github.com/my-bad-idea/ResourceHub.git"
|
|
25
|
+
},
|
|
26
|
+
"homepage": "https://github.com/my-bad-idea/ResourceHub#readme",
|
|
27
|
+
"main": "dist/app.js",
|
|
28
|
+
"bin": {
|
|
29
|
+
"resource-hub": "bin/cli.js"
|
|
30
|
+
},
|
|
31
|
+
"engines": {
|
|
32
|
+
"node": ">=18.0.0"
|
|
33
|
+
},
|
|
34
|
+
"files": [
|
|
35
|
+
"dist",
|
|
36
|
+
"public",
|
|
37
|
+
"bin"
|
|
38
|
+
],
|
|
39
|
+
"scripts": {
|
|
40
|
+
"dev": "tsx watch src/app.ts",
|
|
41
|
+
"build": "tsc",
|
|
42
|
+
"start": "node dist/app.js",
|
|
43
|
+
"test:smoke": "node test/smoke.mjs",
|
|
44
|
+
"test:browser": "node test/browser-acceptance.mjs",
|
|
45
|
+
"check": "npm run build && npm run test:smoke",
|
|
46
|
+
"release:patch": "npm run build && npm version patch && git push && git push origin --tags",
|
|
47
|
+
"release:minor": "npm run build && npm version minor && git push && git push origin --tags",
|
|
48
|
+
"release:major": "npm run build && npm version major && git push && git push origin --tags"
|
|
49
|
+
},
|
|
50
|
+
"dependencies": {
|
|
51
|
+
"@fastify/cors": "^9",
|
|
52
|
+
"@fastify/jwt": "^8",
|
|
53
|
+
"@fastify/static": "^7",
|
|
54
|
+
"bcryptjs": "^3.0.3",
|
|
55
|
+
"better-sqlite3": "^12",
|
|
56
|
+
"drizzle-orm": "^0.30",
|
|
57
|
+
"fastify": "^4",
|
|
58
|
+
"fastify-plugin": "^4",
|
|
59
|
+
"nodemailer": "^6",
|
|
60
|
+
"uuid": "^9"
|
|
61
|
+
},
|
|
62
|
+
"devDependencies": {
|
|
63
|
+
"@types/better-sqlite3": "^7.6.13",
|
|
64
|
+
"@types/node": "^20",
|
|
65
|
+
"@types/nodemailer": "^6",
|
|
66
|
+
"@types/uuid": "^9",
|
|
67
|
+
"tsx": "^4",
|
|
68
|
+
"typescript": "^5"
|
|
69
|
+
}
|
|
70
|
+
}
|