Commit Graph
442 Commits
Author SHA1 Message Date
bwstudio 0bfe6f9d8c fix(script): admin init 重复插入种子导航,改为按 url 幂等去重
原 nav 导入条件 `if not Nav.query.get(id) if id else True` 对无 id 的种子项
永远为 True,导致每次容器启动 flask admin init 都重复插入 54 条种子导航,
与真实数据叠加产生重复。改为按 id 或 url 去重,已存在则跳过。
2026-09-06 21:34:37 +08:00
bwstudio 05f1ac6a00 fix(deps): 补充 markdown 依赖(about.py 用到,否则容器启动崩溃) 2026-09-06 21:34:35 +08:00
bwstudio be99b8a925 feat(data): 数据库搬到 data/ 目录 + SQLite WAL + 单卷绑定挂载
- config.py 新增 PEAR_DATA_DIR(默认 <项目根>/data),SQLite 库、Flask-Session
  统一收进 DATA_DIR;不设时本地开发行为不变
- applications/__init__.py 顶部先 load_dotenv,保证 .env 里的 PEAR_DATA_DIR
  在 config 导入时就生效
- extensions/init_sqlalchemy.py 接 SQLite connect 事件:WAL + synchronous=NORMAL
  + busy_timeout=30s(多 worker 写不再撞锁)
- config.py 注入 SQLALCHEMY_ENGINE_OPTIONS(pool_pre_ping + SQLite connect_args
  超时;MySQL 路径下自动跳过 connect_args 防止参数错误)
- 新增 alembic 迁移 a47a5d2a3f1b 建 site_nav_click(含 anon_id 字段),
  解决之前该表只由 db.create_all 建、不在迁移链里的隐患
- .gitignore / .dockerignore 加 data/ 排除规则(且把 migrations/ 从
  ignore 里重新放行 —— 否则新加的迁移进不了库)
- NAS Docker 部署全面重写:
  - compose 唯一绑定挂载 ./data:/app/data,宿主 File Station 看得见
  - start.sh 自检 data 目录 + 子目录;workers 默认改为 1 threads 8
    (SQLite 写串行,单进程最稳)
  - 新增 backup.sh:sqlite3 .backup 在线热备(确保 WAL 一致性)+ 压缩
    + 保留 14 天
  - Dockerfile 安装 sqlite3 客户端备用,建 /app/data 子目录并 chown
- docs/deployment-nas.md 重写数据持久化章节(路径表 + 热备命令 +
  恢复步骤 + 整库迁移 tar/untar 流程)
2026-09-06 19:43:28 +08:00
bwstudio 34e8010830 feat(site): 方案 C - 「我常访问」个人榜(匿名 ID + localStorage 合并)
- NavClick 加 anon_id 字段(已为历史表自动迁移)
- 后端静默下发 wk_anon cookie(uuid4,1 年,HttpOnly)
- 点击埋点写入 anon_id;新增 GET /site/api/my-top 与 POST /site/api/my-clear
- 首页服务端渲染「我常访问」区(时间衰减加权分),与「热门网址」共显
- 前端 localStorage 累计 + 与服务端榜取 max 合并;冷启动阈值 2 个网址
- 一键清除:清 localStorage + 服务端删该匿名 ID 的全部记录
- 移动端抽屉、顶部导航同步加「我常访问」入口
- 底部隐私说明更新
2026-09-06 19:16:45 +08:00
bwstudio a47ad991d0 feat(public): 首页增加「热门网址」分类(访问量 TOP12)
跨分类聚合:按 NavClick 总点击数倒序,取前 12 个有效 nav。

实现要点:
- applications/view/public/nav.py: 新增 _top_navs(limit=12),
  复用 get_nav_visit_counts() 的 60s 进程内缓存;同点击数按 id asc 稳定排序;
  0 点击返回空列表(前端整段不渲染)
- _render_index() 注入 top_navs 到模板
- templates/public/index.html: 在 groups 循环前渲染 .section-hot,标题「🔥 热门网址」,
  meta 显示「近期访问量最大的 N 个」;卡片复用 .card,新增 .card-top 类
- templates/public/base.html:
  - .card-top:左侧 3px 品牌色边框 + 浅色背景渐变 + hover 增强阴影
  - .section-hot h2 图标用 brand-orange #ff6b35
  - .cat-nav-inner a.cat-nav-hot 顶部导航热门入口用品牌色
  - 抽屉:首页 top_navs 非空时插入「🔥 热门」区段,链接到 #cat-top

边界:
- 没有任何点击时整段隐藏(包括抽屉和顶部 nav),不出现「0 个」空标题
- 同一 nav 不会重复(按 nav.id 维度聚合)
- Nav.enable=0 的不会进 TOP12

验证:
- 15 个 nav 各灌入 20..6 次点击,前 12 个按降序显示访问数 20..9
- 清空所有 NavClick 后首页 section-hot / #cat-top / .cat-drawer-hot 三处全不渲染
- 测试数据已清理
2026-09-06 18:52:05 +08:00
bwstudio 2fe59e15ef feat(scripts): 从 CSV 增量导入 Nav + 同步 NavCategory
scripts/import_nav_urls.py:从 C://Users//PF//Desktop//nav_urls.csv 导入

业务规则(与用户确认):
- 「热门网址」分类不导入(仅是使用频度的复述,与内网应用重叠 7 条)
- 新建 4 个 NavCategory:内网应用(sort=9) / 外网应用(sort=8) / 其他应用(sort=7) / 常用工具(sort=6)
- 删除 2 个 E2E 测试残留 NavCategory(icon=layui-icon-test 且 nav_count=0)
- Nav 增量导入:URL 已存在(按 category+url_normalized 去重)则跳过
- 同 URL 在不同分类可双写(按用户语义分类的本质)
- 同分类内 URL 末尾 / 差异视作重复

支持 --dry-run 干跑模式。

本次实跑结果:
- NavCategory created: 4
- Nav total inserted: 67
  - 内网应用: 35
  - 外网应用: 18
  - 其他应用: 12
  - 常用工具: 2
- Skipped (热门网址): 10
- Skipped (duplicate url in same cat): 1(液位仪末尾 /)
- E2E trash NavCategory deleted: 2

Nav 总数从 54 → 121;NavCategory 从 7 → 9。
2026-09-06 18:42:05 +08:00
bwstudio 98edfdaf2d feat(deploy): 个人 NAS 单机 Docker 部署方案
适用:内网 / 家庭 / 小团队(≤50 并发),无 K8s 需求。
特性:单容器 + SQLite + 端口暴露,最小维护成本。

新增:
- deploy/nas/Dockerfile: python:3.11-slim 基础镜像 + 非 root + HEALTHCHECK
- deploy/nas/start.sh: flask db upgrade 幂等迁移 + gunicorn (2 workers × 4 threads)
- deploy/nas/docker-compose.yaml: 单服务 + 4 个命名卷 (db/logs/session/upload) + 资源限制
- docs/deployment-nas.md: 完整部署/备份/升级/排障指南

完善:
- .env.example: 改为生产环境导向 (PEAR_ENV=pro,SECRET_KEY 必填)
- .dockerignore: 排除 deploy/dev (开发用容器配置)、tests/截图、一次性脚本
- applications/view/public/__init__.py: 注释说明 /healthz 已在 applications/view/health.py 注册

复用现有:
- /healthz 接口 (applications/view/health.py) 含 DB 探活,DB 不可达返回 503
  → 容器 HEALTHCHECK 直接用 /healthz 即可

⚠️ 本机无 docker,未执行 docker build 验证;已静态校验 YAML/bash 语法、
   文件路径、.env 字段消费、ProConfig 严格性、/healthz 端点可用性。
   首次 NAS 上部署时跑一遍文档步骤即可。
2026-09-06 18:35:31 +08:00
bwstudio 0ffc103e46 feat(plugins): 4 个业务插件代码 + 前台公开页面改造
plugins/navManager:导航 CRUD + 导航分类 CRUD(独立 blueprint)
plugins/friendManager:友情链接 CRUD
plugins/aboutManager:关于本站 CRUD
plugins/siteStats:访问统计主页 + JSON 接口 + /site/* GET 埋点 + nav 卡片点击埋点

applications/view/public/nav.py:导航聚合页 / 分类详情 / JSON 接口,支持 visit_count 注入
applications/view/public/about.py:关于本站公开页
applications/view/public/friend.py:友情链接公开页

templates/public/base.html:响应式首页(搜索框 / 分类抽屉 / 5 主题切换 / footer 隐私小字)
templates/public/index.html / category.html:卡片右下角访问次数
templates/public/about.html / friend.html:关于 + 友链前台页

docs/plugins-development.md:插件开发完整指南(生命周期 + 4 个示例 + FAQ + framework 迁移)

scripts/:探针与端到端验证脚本(probe_*/verify_*/test_*)
2026-09-06 18:18:06 +08:00
bwstudio 1ea69c2c34 refactor(plugins): 将导航/友链/关于/统计 4 模块迁出 framework 至 plugins
- 在 applications/config.py 中通过 PLUGIN_ENABLE_FOLDERS 启用 4 个业务插件
- 删除 framework 内 applications/view/system/nav.py 与 templates/system/nav/* 模板
- applications/extensions/init_plugs 移除重复的 broadcast_execute('event_init'/'event_finish')
  (由 init_bps / init_script 触发,避免 Blueprint 注册冲突)
- applications/view/system/index.py:未登录访问 / 直接渲染前台公开聚合页
- templates/system/index.html:移动端首屏即折叠侧边栏
- 新增 5 个 model(Nav 字段 status→enable 兼容、NavCategory、About、Friend、VisitLog/PageStat、NavClick)
- 新增 2 个 schema(NavCategorySchema、FriendOutSchema/ManageSchema)
- admin_about/admin_friend/admin_nav_category 在 init.json 中以「网站管理」分组挂载
- .gitignore 补充一次性备份、调试截图、探针截图不入库
2026-09-06 18:17:52 +08:00
bwstudio 1214bfdf4a feat(ops): 环境变量化配置 + 健康检查 + 启动脚本 + 部署/安全文档
主要变更:

config
- 引入 python-dotenv,从 .env 加载 SECRET_KEY / MAIL_* / SQLALCHEMY_DATABASE_URI
- 拆分 BaseConfig / DevConfig / ProConfig,PEAR_ENV 控制切换
- ProConfig 在 init_app() 校验 SECRET_KEY,禁止使用默认值

ops
- 新增 /healthz 端点:DB 探活 + 环境名 + 时间戳,失败返回 503
- 新增 start.bat (Windows) / Makefile (跨平台) 一键启动 / 初始化
- 新增 .env.example 模板;.gitignore 排除 .env / logs / vscode 等
- 新增 docs/DEPLOY.md(部署指南)和 docs/SECURITY.md(安全清单)
- app.py 不再硬编码 debug=False,交给配置类决定

本提交不包含上一次会话的其它工作树修改(模板/导航相关),后续单独 PR。
2026-09-05 20:46:12 +08:00
bwstudio 9ba96bcc3e style(public): 前台导航页响应式适配 + 暗色模式 + 锚点目录
主要改动
- templates/public/base.html
  - 增加 3 套响应式断点:≤900px(平板)、≤600px(手机)、≤360px(小屏)
  - topbar 在小屏下压缩 padding/字号,actions 自适应换行
  - grid 卡片在手机端最小 160px,小屏单列
  - 卡片字号、间距在手机端缩放
  - 增加 sticky 分类目录条占位
  - 增加回到顶部按钮(滚动后显示)
  - 增加暗色模式 CSS(prefers-color-scheme + data-theme 手动覆盖)和主题切换按钮
  - 补充 theme-color、viewport 等移动端 meta
- templates/public/index.html
  - 输出 5 个分类的 sticky 目录导航(点击锚点跳转)
  - 每个 section 设置 id=cat-N 锚点
  - 卡片 title/url 增加 title 提示
- templates/public/category.html
  - 目录条加返回首页 + 当前分类名
  - section 锚点统一为 cat-detail

验证
- curl 抓取 /site/ 响应 200,HTML 中 10 项响应式/交互特性检查全部通过
- 服务器本地运行无异常
2026-09-05 15:33:45 +08:00
bwstudio 115585c00d feat(nav): 从 nav.bwhome.top 同步 5 个分类共 54 条导航
分类与数量
- 常用分类(4 条):短信平台、BT网站大全、菜鸟教程、旺柯博客
- 旺珂内网(10 条):MoviePilot / Jellyfin / qBittorent / 旁路由 / 小雅电影 / QNAP / NextCloud / PVE / BW gitea / 家庭服务器
- 常用网站(4 条):百度 / 豆瓣 / 新浪 / DeepSeek
- 休闲娱乐(18 条):HDFans / OKPT / HDTime / 小蚂蚁PT / HDArea / 铂金学院 / carpt / hdkyl / tosky / 52PT / 1PTBA / PTZONE / 馒头 / 铜钟音乐 / PTFans / 咖啡 / BTSCHOOL / 库非
- 技术网站(18 条):JFinal / shadmin / layuijfinal / respeed / 网站代理 / Layui / GitHub加速 / down.npee / DNS查询 / DOCK状态 / 博旺 / chromeDriver / 系统更新 / 免费节点 / Clash节点 / 狐蒂云 / chatgpt / NVIDIA AI

数据来源:https://nav.bwhome.top(OneNav 系统)
已 flask admin init --force 灌入数据库并通过 /site/api/navs 验证
2026-09-05 15:15:33 +08:00
bwstudio b208087f74 feat(nav): 新增前台公开导航页与后台导航管理
新增模块
- Nav 模型(applications/models/admin_nav.py):公开导航表,与 admin_power 解耦
- NavOutSchema / NavManageSchema(applications/schemas/admin_nav.py)
- 前台公开视图 applications/view/public/nav.py:/site/、/site/category/<name>、/site/api/navs,无需登录
- 后台管理视图 applications/view/system/nav.py:CRUD + 启用/禁用,挂入 system_bp
- 前台模板 templates/public/{base,index,category}.html(独立配色,无需登录即可访问)
- 后台模板 templates/system/nav/{main,add,edit}.html(Layui table + form)

调整
- applications/view/__init__.py:注册前台蓝图到根
- applications/view/system/__init__.py:注册后台 nav 子蓝图
- applications/common/script/admin.py:admin init/export 支持 navs 数组
- applications/common/script/app_data/init.json:新增 10 条导航种子 + 4 条 system:nav 权限

数据库
- 新增 public_nav 表(含 category 索引)
- migration: 38751d88d42c_add_public_nav_table.py
2026-09-05 14:58:08 +08:00
bwstudio 3debece5d3 0905初始化
- 在 .gitignore 中新增 .workbuddy/ 目录(WorkBuddy 运行时数据,不入版本库)
- 工程基线:venv 已建(Python 3.11.7)、迁移已生成、admin 种子数据已灌入
2026-09-05 14:40:26 +08:00
不胜舟 97eda740fe 区分测试生产环境部署配置 2026-01-16 19:21:30 +08:00
不胜舟 372b0030c3 重构 admin 初始化:改为 JSON 配置,增加导入导出功能 2026-01-16 18:48:57 +08:00
不胜舟 12c31a8e8a 重构 admin 初始化:改为 JSON 配置,增加导入导出功能 2026-01-16 18:43:03 +08:00
wojiaoyishang 490f538261 移除启用的定时任务文件夹 2025-12-14 13:26:12 +08:00
梦见吃了一大碗皮卡丘andGitee 9f64f7bdac !143 update templates/system/task/main.html.
Merge pull request !143 from laoknas/N/A
2025-12-14 01:47:53 +00:00
梦见吃了一大碗皮卡丘andGitee 96b93b08a1 !142 update templates/system/task/add.html.
Merge pull request !142 from laoknas/N/A
2025-12-14 01:47:44 +00:00
梦见吃了一大碗皮卡丘andGitee 3bfcd1d21f !141 update applications/extensions/__init__.py.
Merge pull request !141 from laoknas/N/A
2025-12-14 01:47:35 +00:00
laoknasandGitee c55e47ba4d update templates/system/task/main.html.
程序中已经没有改计划任务了,应该移除此模板。(会与计划任务插件冲突)

Signed-off-by: laoknas <kuai410022283@qq.com>
2025-12-13 16:55:45 +00:00
laoknasandGitee 29c6e5dbb6 update templates/system/task/add.html.
程序中已经没有改计划任务了,应该移除此模板。(会与计划任务插件冲突)

Signed-off-by: laoknas <kuai410022283@qq.com>
2025-12-13 16:54:57 +00:00
laoknasandGitee 0ebc9394ad update applications/extensions/__init__.py.
在 init_plugs 函数中添加了两个关键的事件广播调用:
- 第33行: broadcast_execute(app, 'event_init')
- 第34行: broadcast_execute(app, 'event_finish')

### 执行流程优化
修改后的 init_plugs 函数执行流程更加合理:

1. 加载插件模块 :注册所有启用的插件
2. 触发 event_begin :通知插件系统开始初始化
3. 初始化核心功能 :登录、数据库、邮件、上传等
4. 初始化系统蓝图 :模板指令、错误视图等
5. 触发 event_init :执行插件的主要初始化逻辑
6. 触发 event_finish :执行插件的最终初始化操作


### 事件触发时机
事件名称 触发时机 用途 event_begin 插件加载后,核心功能初始化前 插件准备工作 event_init 核心功能初始化完成后 插件主要初始化逻辑 event_finish 所有初始化完成后 插件最终初始化操作,包括应用上下文初始化

这个修改是插件系统架构的重要优化,确保了所有插件能够在正确的时机执行初始化逻辑,特别是对于复杂的任务插件至关重要。

Signed-off-by: laoknas <kuai410022283@qq.com>
2025-12-13 16:50:39 +00:00
不胜舟andGitee da453c839e !138 fix #ICW0DF:修复readme资源结果错别字
Merge pull request !138 from ChenWenhui/master
2025-09-02 08:47:50 +00:00
chenwenhui01 3986210925 fix:readme资源结果错别字 2025-09-02 16:38:52 +08:00
不胜舟 5bcc28a492 feat(api): 新增 CSRF 校验 2025-09-02 11:37:27 +08:00
不胜舟 000330dbd7 feat(cli): 新增检查路由鉴权装饰器的命令 2025-09-01 20:22:54 +08:00
不胜舟 ad7b79129e 引入接口频率限制机制 2025-08-25 22:42:52 +08:00
不胜舟 4da732538f 引入接口频率限制机制 2025-08-25 22:01:33 +08:00
我叫以赏andGitee 041447585c !136 fix: 当在lxc容器运行时,获取磁盘信息失败
Merge pull request !136 from zmf96/master
2025-05-18 15:22:58 +00:00
zmf96andGitee 49d1db3571 fix: 当在lxc容器运行时,获取磁盘信息失败
Signed-off-by: zmf96 <1602893+zmf96@user.noreply.gitee.com>
2025-05-18 15:21:49 +00:00
我叫以赏andGitee d9286699bf !135 fix:打开基本资料页面后,刷新浏览器会引发js无法运行
Merge pull request !135 from 浩浩/master
2025-04-18 12:37:40 +00:00
dinghao d5dd7302ad fix:打开基本资料页面后,刷新浏览器会引发js无法运行 2025-04-18 18:40:52 +08:00
我叫以赏andGitee 9561e8ae00 更新 README
Signed-off-by: 我叫以赏 <lovepikachu@foxmail.com>
2025-03-02 04:31:58 +00:00
我叫以赏andGitee d9e690b5e9 !134 【轻量级 PR】:update applications/view/system/rights.py.
Merge pull request !134 from 星辰大海/N/A
2025-02-25 11:28:31 +00:00
星辰大海andGitee d49b3c1a79 update applications/view/system/rights.py.
管理员也需要隐藏不要显示的菜单。

Signed-off-by: 星辰大海 <2317903+shaodj@user.noreply.gitee.com>
2025-02-25 11:27:47 +00:00
我叫以赏andGitee 7340e45f4b Update: 同步项目 Pear Admin Layui 的框架
Signed-off-by: 我叫以赏 <lovepikachu@foxmail.com>
2025-02-13 02:17:34 +00:00
我叫以赏andGitee ee8bf1cbfc Update: 更新文档
Signed-off-by: 我叫以赏 <lovepikachu@foxmail.com>
2025-02-13 02:16:35 +00:00
我叫以赏andGitee 634dabb8cc !133 Update: 同步项目框架与 Pear Admin 4.0 同步,完善部分功能
Merge pull request !133 from 我叫以赏/master
2025-02-13 02:14:07 +00:00
wojiaoyishang 23db487356 添加文档构建章节 2025-01-31 10:51:11 +08:00
wojiaoyishang c5b70d90fb 更新文档与预览地址 2025-01-30 17:04:30 +08:00
wojiaoyishang 552bf77924 完善文档并添加示例插件 2025-01-30 16:56:12 +08:00
wojiaoyishang ac1f82e81d 基本完成文档 2025-01-30 10:31:50 +08:00
wojiaoyishang 41bda82c60 完善开发文档与调整初始化项目架构 2025-01-28 17:47:41 +08:00
wojiaoyishang da5917344e 更新文档,完善插件功能 2025-01-27 21:34:42 +08:00
wojiaoyishang feed91dcd0 完善文档最佳实践 2025-01-27 20:41:22 +08:00
wojiaoyishang 5153daf7da 更新文档 2025-01-27 19:48:27 +08:00
wojiaoyishang 155af93c77 完善开发文档与合并 admin_log 文件 2025-01-27 11:30:59 +08:00
wojiaoyishang 0db36a6218 完善开发文档与更新函数注释 2025-01-27 11:16:26 +08:00