a7614e5485edad19c10238e0b6fcf06852614fa9
- 导入脚本 scripts/import-footer-template.ts:从 legacy dump 提取 post 58 的 _elementor_data 写入 contents(type=template, slug=footer),并按线上 post-58.css/DOM 补齐快照后改动 (f95e22e Google Preferred Source、405d251 width:auto、2481635 桌面外距) - Layout/getLayoutData 下发 footerDoc,Footer 改用 ElementorRenderer 直出原模板, 短代码按 widget id 注入:menu-2 移动端折叠菜单、gtranslate 语言下拉(原生 select.gt_selector) - Renderer 增强:section html_tag/边框/content_position、column 响应式宽度与 populated padding/margin(tablet/mobile)、widget 响应式盒模型、icon widget(fixed 返回顶部)、 icon-list 图标/间距/文字排版与 CSS 变量悬停、image 宽度、divider Elementor DOM、 text-editor 对齐与 current-date-time 动态年份、shortcode 预渲染上下文 - slim 白名单补齐响应式/图标/动态标签字段;app.css 新增 FA Solid/Regular 字体、 页脚 scoped 规则、elementor-hidden-* 响应式可见性 - 实测 1436:页脚总高 590.4 与原站全等(列宽/内层列/logo/社交/下拉逐项一致); 390:56/15/347/337/97/46.4/61 逐项全等;语言切换写 ui_lang cookie;返回顶部回滚 0 - bun test 11 pass;版本 0.10.19
DusunIoT 重建版(TanStack Start + Bun + PostgreSQL)
将原 WordPress + Elementor + WooCommerce + GTranslate 站点(dusuniot.com)重构为单体应用: 前台 SSR 1:1 还原、后台 React + Ant Design 功能等价实现、PostgreSQL 关系型数据模型。
方案文档:
docs/dusuniot-rebuild-tanstack-bun-pg-v2.md
技术栈
| 领域 | 选型 |
|---|---|
| 运行时 / 包管理 | Bun 1.4+ |
| 前台 SSR / 路由 | TanStack Start(Vite)+ React 19 + TS |
| 数据库 | PostgreSQL 16(Bun.sql + Drizzle ORM) |
| 后台 UI | React + Ant Design 6(仅 SVG 图标,禁 emoji/图标字体) |
| 后台任务 | jobs 表持久化队列(scripts/jobs-worker.ts,独立进程) |
快速开始
bun install
# .env 默认 DATABASE_URL=postgres://dusuniot:dusuniot@127.0.0.1:25432/dusuniot
bun run db:migrate # 应用迁移(src/db/migrations)
bun run import:wordpress # 全量导入 WP 备份库(需 MariaDB 容器 dusuniot-mariadb, 端口 13306)
bun run dev # 开发服务器 http://localhost:3311
bun run build && bun run start # 生产构建(Nitro .output)
bun run scripts/jobs-worker.ts # 后台任务 worker
bun test # 单元/集成测试
WordPress 数据迁移
- 备份源:
dusuniot-full-20261029.tar.gz(站点文件 + mysqldump)。媒体已硬链接到public/uploads。 - 导入脚本:
scripts/wordpress-import/import.ts,支持--only=step1,step2分步重跑(步骤:reset/media/users/categories/attributes/products/contents/views/orders/flamingo/elementor/forms/menus/filters/redirects/languages/final)。 - 导入规模:148 产品(含属性/筛选映射)、674 内容(含 Elementor JSON)、53,101 询盘(Flamingo + Elementor 双源)、108 订单、8,210 媒体、493 条 301 重定向、104 语言、4 菜单 283 菜单项。
- 旧 ID 映射存
legacy_id_mappings表;WP 旧密码(phpass $P$)保留在users.legacy_password_hash,客户登录时透明升级 bcrypt。
与原站插件的功能等价映射
| 原插件 | 新实现 |
|---|---|
| WooCommerce | products/orders/order_items/payments 关系模型 + 购物车/结账/账户(PayPal 回调位预留,幂等键 transaction_id) |
| Contact Form 7 + Flamingo | inquiry_forms(表单定义)+ inquiries(统一询盘表)+ 邮件任务队列 |
| Filter Everything | filters 配置表 + product_attributes/values/map 关系型筛选(复合索引 + EXISTS 交集查询) |
| GTranslate | /<lang>/ 前缀路由 + UI 壳层字符串 + content/product_translations 真实发布版本(缺翻译不生成伪语言页) |
| Redirection | redirects 表 + 请求中间件(301/302,支持正则) |
| Elementor(前台) | src/components/elementor/Renderer.tsx(section/column/heading/text-editor/image/button/image-box/icon-list/tabs/toggle 等 20+ widget) |
| Rank Math SEO | contents/products 内置 SEO 字段 + sitemap.xml + robots.txt + hreflang |
| WP Rocket | 设计上按 URL/语言做服务端缓存(Cloudflare/Nginx 层),登录态/购物车禁共享缓存 |
| Dusun Flamingo Reader | 后台询盘模块 + REST API(保留给 AI 线索管道) |
URL 兼容(SEO 硬性要求)
- 页面
/<slug>/、文章/<category>/<slug>/、产品/product/<slug>/、产品分类/collection/<slug>/(与原站 permalink 一致,trailingSlash always)。 - 493 条旧重定向规则原样生效;canonical/hreflang/sitemap 由 SEO 模块输出。
后台
/admin(默认管理员见导入输出)。模块:Dashboard / 内容 / 产品 / 订单 / 询盘 / 媒体 / 语言 / SEO 重定向 / 筛选 / 用户 / 设置。
所有接口 requireAdmin() 权限校验,敏感操作写 audit_logs。
目录结构
见方案文档第 6 节。src/server/* 按业务域拆分(auth/content→data/products→data/filters/orders→commerce/inquiries/translations/seo/jobs)。
版本
版本号以 package.json version 为准,每轮交付自增(patch/minor/major)。
Languages
TypeScript
93.5%
CSS
6.4%