43 Commits
Author SHA1 Message Date
Zhengen 2b60c0d5e0 feat: add 18 independent industry demo templates 2026-11-03 22:33:03 +08:00
Zhengen 1d08bdb6a5 feat: add isolated Docker local testing and HTTP smoke validation 2026-11-03 19:21:58 +08:00
Zhengen e28364e061 Merge remote-tracking branch 'origin/master' 2026-10-27 21:37:26 +08:00
Zhengen d33174192d feat: add company site setup wizard and software service template 2026-10-27 21:36:22 +08:00
Zhengen bd150f810f docs: add product brochure and positioning notes 2026-10-19 22:40:44 +08:00
Zhengen c602a26d1b feat: 新增 seed_own_showcase 命令,创建产品页“世耀CMS”与官网自身案例页
- apps/core/management/commands/seed_own_showcase.py:幂等地在生产已有的
  ProductIndexPage/CaseStudyIndexPage 下创建/更新“世耀CMS”产品页与衡水世耀
  科技官网建设案例页;产品/栏目页缺失时 CommandError 退出,不自动创建栏目。
- apps/core/tests.py:新增 3 个用例(缺栏目页报错、创建成功、重复执行幂等),
  pytest 75 -> 78,全部通过。
2026-10-16 21:19:43 +08:00
Zhengen fd3229959a Merge remote changes (SEO fields, column intros/covers/tags) with Wagtail 8.0 upgrade 2026-10-12 16:27:48 +08:00
Zhengen 71c40c0bd9 Merge branch 'upgrade/wagtail-8.0' 2026-10-12 16:26:18 +08:00
Zhengen 12f5825cc4 升级 Wagtail 7.4 -> 8.0
- requirements/base.txt:wagtail>=7.4,<8.0 -> wagtail>=8.0,<9.0。
- 本地验证:manage.py check 无新增错误(此前长期存在的 13 条
  treebeard.E001 警告消失,Wagtail 8.0 已修复该兼容性问题);
  makemigrations --check 无需新增项目自身迁移;migrate 应用了
  Wagtail 自带的新迁移 wagtailcore.0098_apitoken;pytest 68 个用例
  全部通过。
- 连带升级的依赖:djangorestframework 3.17.2 -> 3.18.3,新增
  django-ninja/pydantic(Wagtail 核心新依赖)。
- wagtail-headless-preview 0.9.0 保持不变,自动化测试覆盖的预览
  接口场景仍通过,但官方测试矩阵尚未明确标注 8.0 兼容性,部署前
  建议在后台手动验证一次 Preview 功能。
2026-10-12 16:23:14 +08:00
Zhengen f2927bae8e feat: expose column intros, page covers and blog tags 2026-10-11 19:44:48 +08:00
Zhengen 858f35cf62 fix: expose page SEO fields and invalidate shared page cache 2026-10-11 18:02:12 +08:00
Zhengen eab27b3454 修复 /contact 404:新增 ContactPage 模型 + 线索表单区块
- 新增 apps.core.ContactPage(SEOablePage),复用 COMMON_BLOCKS StreamField,
  挂载于 HomePage 下;同步补充 HomePage.subpage_types 使后台可创建该子页面。
- 新增迁移 apps/core/migrations/0003_contactpage.py。
- 新增幂等管理命令 seed_contact_page:创建"联系我们"线索表单定义
  (姓名/公司/电话/邮箱/需求描述)+ 创建/更新 slug=contact 的页面,
  接入 bootstrap_deployment 部署引导流程。
- apps/home/tests.py 补充 ContactPage 相关回归测试(subpage_types 集合、
  管理后台可创建性参数化用例),全仓库 pytest 65 -> 68 全部通过。
- 设计文档 §2.16 进度清单同步更新。
2026-09-23 10:24:38 +08:00
Zhengen 18dcc4b584 fix: 生产环境改用 LocMemCache 替代 Redis,避免 Windows 部署引入外部依赖 2026-09-15 10:34:50 +08:00
Zhengen 6fe5195b07 fix: waitress 生产启动加 trusted-proxy 参数,修复反代HTTPS头被清除导致的重定向死循环 2026-09-15 09:55:07 +08:00
Zhengen c52e3a3ff5 修复 Wagtail API v2 fields= 参数请求自定义字段返回 400 的问题
所有 Page 模型(SEOablePage 及其子类 HomePage/BlogPage/BlogIndexPage/
ProductPage/CaseStudyPage/SolutionPage)此前均未声明 api_fields,导致
前端 fields=body,seo_title_override,... 等请求被 Wagtail API v2 拒绝并
返回 400(Wagtail 默认只暴露 id/meta/title,其余字段必须显式加入
api_fields 才能通过 ?fields= 查询)。这正是生产环境首页显示"尚未连接到
Wagtail CMS"的根因。

- apps/core/models.py: SEOablePage 增加 api_fields(seo_title_override/
  seo_description_override);SimpleContentPage 追加 body
- apps/home/models.py: HomePage 追加 body
- apps/blog/models.py: BlogIndexPage 追加 intro;BlogPage 追加
  published_at/intro/body
- apps/products/models.py: ProductPage 追加 summary/body
- apps/cases/models.py: CaseStudyPage 追加 client_name/industry/
  published_at/summary/body
- apps/solutions/models.py: SolutionPage 追加 industry/summary/body

api_fields 是纯 Wagtail 类属性,不是 Django 模型字段,因此不产生新的
migration(makemigrations --check 确认 No changes detected)。

验证:pytest 67 个用例全部通过;manage.py check 无新增错误(仅已知
treebeard.E001 警告)。
2026-09-14 16:22:01 +08:00
Zhengen 88832e6084 Windows nginx模板: 拆分80/443 server块,修复HTTPS强制跳转死循环风险 2026-09-11 16:43:00 +08:00
Zhengen fc51641700 Windows部署: 后端端口统一改为8080 2026-09-11 16:34:30 +08:00
Zhengen 064dbb7561 install-nssm-services.ps1: 局部降级 ErrorActionPreference 以规避首次安装 stop/remove 失败中断脚本 2026-09-11 14:00:34 +08:00
Zhengen 6345c23f1f 修复 install-nssm-services.ps1:PS7 下首次安装报 NativeCommandError 中断
PowerShell 7.3+ 默认会把"原生命令写了 stderr 且退出码非 0"当作终止性错误抛出,
即使用 2>$null 重定向也无法拦截(触发条件是退出码而非 stderr 内容是否被消费)。
脚本里 nssm stop/remove 针对尚不存在的服务(首次安装场景)必然会返回非 0,
这是预期内可忽略的失败,此前会导致 $ErrorActionPreference = "Stop" 直接中断脚本。

修复:脚本顶部关闭 $PSNativeCommandUseErrorActionPreference。
2026-09-11 13:54:58 +08:00
Zhengen 097b16eb09 修复生产环境 postgres.E005:INSTALLED_APPS 缺少 django.contrib.postgres
PostgreSQL 后端下,wagtailsearch.IndexEntry 模型会使用 SearchVectorField/
GinIndex 等 postgres 专属字段/索引类型,必须启用 django.contrib.postgres
才能通过 Django system check。dev 环境用 SQLite 不受影响,故只在
wagtailcms/settings/production.py 追加该 app。

验证:dev settings(sqlite)manage.py check 仍只有已知 treebeard.E001 警告;
pytest 67 个用例全部通过。
2026-09-11 10:57:20 +08:00
Zhengen 1686794ad7 部署配置:新增 Windows Server 裸机部署流程
- requirements/production-windows.txt:Windows 专用生产依赖,用 waitress 替代
  不支持 Windows 的 gunicorn
- deploy/windows/serve-backend.ps1:waitress WSGI 启动脚本
- deploy/windows/install-nssm-services.ps1:用 NSSM 将前后端注册为 Windows 服务
- deploy/windows/nginx-wagtailcms.conf:nginx for Windows 反向代理模板(TCP 端口,
  不用 unix socket)
- documents/Windows服务器部署指南.md:完整部署步骤文档,并说明与 Linux 裸机
  部署(systemd/gunicorn/unix socket/Redis)的差异点
2026-09-11 09:39:30 +08:00
Zhengen 777f5367da 部署配置:新增裸机(非 Docker)部署所需的 systemd/Nginx 模板
- deploy/systemd/wagtailcms-backend.service:gunicorn 后端服务,unix socket 监听
- deploy/systemd/wagtailcms-frontend.service:Next.js 前端服务(npm run start)
- deploy/nginx/wagtailcms.conf:反向代理模板,区分管理后台域名与前端站点域名

供阿里云 ECS 等裸机环境不使用 Docker 时直接部署参考。
2026-09-11 09:22:49 +08:00
Zhengen 599483c3f2 部署引导联动首页初始化:bootstrap_deployment 自动调用 seed_homepage/seed_privacy_policy
- bootstrap_deployment 在 setup_rbac_groups 之后依次调用 seed_homepage、
  seed_privacy_policy,容器每次启动(entrypoint.sh: migrate -> collectstatic ->
  bootstrap_deployment)会自动创建首页并绑定 Site.root_page,再创建隐私政策页面,
  无需人工登录后台手动操作。
- 新增测试验证联动创建效果与幂等性(pytest 65 -> 67,全部通过)。
2026-09-10 16:15:27 +08:00
Zhengen ca1e63e973 新增 seed_homepage 管理命令:初始化首页内容
- apps/home/migrations/0001_initial.py 只创建了 HomePage 表结构,未像
  `wagtail start` 项目模板那样附带创建首页实例的数据迁移,全新环境
  migrate 后后台看到的仍是 Wagtail 自带占位欢迎页
- 新命令 `python manage.py seed_homepage`(幂等,可重复执行/放入部署
  脚本):
  - 创建 home.HomePage 实例并填充默认 StreamField 区块(Hero/数据
    展示/能力网格/CTA),供运营在此基础上编辑
  - 将默认 Site.root_page 指向新首页
  - 清理 Wagtail 自带占位页
- 注意 Site.root_page 外键 on_delete=CASCADE,需先切换 Site 指向再
  删除占位页,避免级联删除 Site 记录
2026-08-19 17:18:40 +08:00
Zhengen 19af182314 生产环境部署准备:Docker 化 + 修复存储配置 + SMTP 邮件
- 修复 production.py 存储配置:Django 6.0 已移除 DEFAULT_FILE_STORAGE/
  STATICFILES_STORAGE 旧式设置兼容层,改用 STORAGES 字典(此前的写法
  实际上早已失效,属于遗留 bug)
- 静态文件接入 whitenoise(压缩+哈希文件名+长缓存头),容器化部署下
  无需额外 Nginx/CDN 即可正确提供静态文件
- 新增生产 SMTP 邮件配置(EMAIL_HOST/PORT/USER/PASSWORD/USE_TLS/
  DEFAULT_FROM_EMAIL),修复线索通知邮件/PIPL 删除确认邮件在生产环境
  发不出去的问题
- 新增 docker/Dockerfile(多阶段构建,非 root 用户运行)
- 新增 docker/entrypoint.sh(启动时自动 migrate + collectstatic +
  bootstrap_deployment,均为幂等操作)
- 新增 docker-compose.prod.yml(backend + postgres + redis 编排)
- 新增 .dockerignore
- .env.example 补充 POSTGRES_*/EMAIL_* 环境变量说明
2026-08-18 14:40:19 +08:00
Zhengen 306068bc22 完善 .gitignore:补充 IDE/OS/日志/覆盖率等常见忽略规则 2026-08-13 14:39:33 +08:00
Zhengen 147107501b 补充测试覆盖率 + 新增部署引导命令 bootstrap_deployment
- 新增 apps/blog、apps/solutions、apps/home、apps/api 测试文件,覆盖标签/排序/
  草稿过滤、HomePage.subpage_types 回归测试、page_preview 预览接口
- apps/core/tests.py 新增健康检查端点、发布 webhook 信号、bootstrap_deployment
  命令的测试用例,pytest 用例数从 40 增至 65,全部通过
- 修复 apps/api/urls.py 中 PagePreviewAPIViewSet.get_object() 未捕获
  DoesNotExist 导致 500 而非文档承诺 404 的 bug
- 新增 apps/core/management/commands/bootstrap_deployment.py:部署时按环境变量
  幂等创建首个超级管理员账号并联动初始化 RBAC 权限组,.env.example 补充对应
  环境变量说明
- 新增 OpenSearch + 中文分词本地 PoC 脚手架(docker-compose.opensearch.yml +
  docker/opensearch/Dockerfile),调研结论详见设计文档 §2.10
- 更新设计文档 §2.16 Phase 1 进度清单
2026-08-11 14:47:10 +08:00
Zhengen f37571f395 feat(rbac): 落地 Wagtail Group + GroupPagePermission/GroupCollectionPermission/Snippet 权限体系
新增 setup_rbac_groups 幂等管理命令,按设计方案 §2.8 矩阵创建 5 个 Group(站点管理员/编辑/审核员/作者/查看者),配置页面/图片文档/Snippet/用户管理权限;Author 仅编辑自己页面利用 Wagtail 内置 OwnershipPermissionPolicy 实现,无需自定义 hook;新增 7 个单元测试,pytest 33→40 全部通过。
2026-08-07 17:07:39 +08:00
Zhengen 3944e11330 feat(core): 补全剩余 6 个 StreamField Block (ProductCard/Pricing/Timeline/Team/TechStack/Video)
- apps/core/blocks.py 新增 ProductCardBlock/PricingBlock/TimelineBlock/TeamBlock/TechStackBlock/VideoBlock,COMMON_BLOCKS 扩充至 14 个内容 Block
- TeamBlock 新增 TeamMemberChooserBlock(SnippetChooserBlock),复用 FormBlock 已有的 get_api_representation 展开模式,展开 TeamMember 完整字段(含 serialize_image 复用)
- 为 blog/cases/home/products/solutions 五个 Page 模型生成并应用 alter field body 迁移(StreamField block 定义变更会写入迁移 state)
- apps/core/tests.py 新增 TeamMemberChooserBlock 空值/展开单元测试,pytest 33 个用例全部通过
- 设计文档 §2.6/§2.16 同步更新为已实现
2026-08-07 15:58:44 +08:00
Zhengen 8d440b9e4a feat: 实现预览模式(wagtail-headless-preview + Next.js Draft Mode) 2026-08-07 15:34:46 +08:00
Zhengen 16e4f97e74 国内可访问服务替换排查:新增蜜罐反垃圾字段 + CDN 加速域名配置 2026-08-07 14:49:00 +08:00
Zhengen d6503bb46f feat: 实现PIPL数据主体删除权支持功能
- 新增 LeadDeletionRequest 模型,支持邮箱验证的删除申请/确认流程
- POST /api/v1/custom/leads/deletion-requests/ 发起申请(通用响应避免探测邮箱是否存在)
- POST /api/v1/custom/leads/deletion-requests/confirm/ 确认删除(24小时token有效期)
- 按邮箱在 Lead.data 中匹配并删除对应记录,跨SQLite/Postgres使用Python级匹配
- LeadDeletionRequest 通过 Django Admin 只读展示供合规审计
- 新增 FRONTEND_BASE_URL 设置用于拼接邮件确认链接
- apps/forms/tests.py 新增6个测试用例(含节流缓存隔离修复),全仓库30个用例通过
- 更新设计文档 §2.15/§2.16 勾选项
2026-08-07 13:29:20 +08:00
Zhengen 8fbbd2e6b0 feat: 新增Snippet全局内容模型(TeamMember/Testimonial/Partner/NavigationMenu/SiteSettings)
- 新增 apps.core.TeamMember/Testimonial/Partner:简单 register_snippet,含 order 排序字段
- 新增 apps.core.NavigationMenu+NavigationMenuItem:ClusterableModel+Orderable+InlinePanel,
  支持内部页面或外部链接二选一
- 新增 apps.core.SiteSettings:接入 wagtail.contrib.settings + BaseSiteSetting,
  存放公司信息/ICP备案号/社交账号等全局配置
- 新增只读 API:/api/v1/custom/core/{team,testimonials,partners,navigation,site-settings}/
- 补充 apps/core/tests.py 单元测试,pytest 用例由 11 个增至 24 个,全部通过
- 更新设计文档 §2.16 Phase 1 进度清单
2026-08-07 13:06:22 +08:00
Zhengen b04de9f5c1 docs: 修正Phase1进度清单中过期的复选框状态 2026-08-07 11:05:41 +08:00
Zhengen ec2e629db2 fix: 生产环境补充SECURE_PROXY_SSL_HEADER,完善白名单配置文档说明 2026-08-07 09:42:29 +08:00
Zhengen 4e4cdf31ac docs: Cookie同意条控件已完成,更新合规清单 2026-08-07 09:38:05 +08:00
Zhengen b05d2b7f52 feat: 新增隐私政策内容页(apps.core.SimpleContentPage)及seed命令,更新设计文档 2026-08-06 17:17:07 +08:00
Zhengen 9e60cabd5e docs: 页脚已替换为实际ICP备案号,更新合规清单状态 2026-08-06 16:54:34 +08:00
Zhengen e2a0f62ef4 docs: ICP备案已完成,更新合规清单状态 2026-08-06 16:37:40 +08:00
Zhengen e6fd8f62f4 docs: update design doc progress (solutions app + pytest suite completed) 2026-08-06 16:24:59 +08:00
Zhengen 052fff1a40 feat: add solutions app, fix HomePage subpage_types, add pytest test suite
- apps/solutions: SolutionIndexPage/SolutionPage (mirrors products/cases)
- apps/home: HomePage.subpage_types now includes products/solutions/cases index pages (previously only blog, blocking admin page creation)
- pytest.ini + conftest.py (root_page/home_page fixtures)
- unit tests for core (SEOablePage, FormBlock API repr), products, cases, forms (lead submit API)
2026-08-06 16:23:49 +08:00
Zhengen 12f7caa158 feat: add products/cases page models and forms lead-capture app
- apps/products: ProductIndexPage/ProductPage
- apps/cases: CaseStudyIndexPage/CaseStudyPage
- apps/forms: FormDefinition/FormDefinitionField/Lead + submit API
- core/blocks: CaseStudyBlock, FormBlock (with API representation)
- register new apps, custom leads API route, migrations
2026-08-06 16:04:21 +08:00
Zhengen 7f51a31150 chore: initial commit of Wagtail backend scaffold 2026-08-06 15:56:14 +08:00