- app/portal.py: 主入口,通过from cms.init import load_cms加载业务模块 - conf/config.json: 应用配置(ocai_cms数据库, 端口9090, cms模块wwwroot挂载到/cms) - wwwroot/: 公开页面(index/news/cases/products)和公开API - build.sh: 构建脚本(安装基础设施包+pip install cms模块+DDL/CRUD生成) - deploy.sh: 一键部署脚本(构建→建表→初始数据→权限→启动) - init_data.py: 从cms模块init/data.yaml加载初始数据 - init_any/superuser_permissions.py: RBAC权限初始化
5.7 KiB
5.7 KiB
Portal系统架构
项目概述
Portal是企业官网CMS系统的独立Web应用壳,采用与pipeline-app相同的"壳+模块"架构模式。 Portal负责Web服务器启动、基础设施加载和公开前端页面;CMS业务逻辑通过pip install以模块方式引入。
架构模式: 壳+模块
┌─────────────────────────────────────────────────┐
│ Portal (Web壳) │
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ ahserver │ │ rbac │ │ appbase │ │
│ │ (Web服务) │ │ (认证) │ │ (基础) │ │
│ └──────────┘ └──────────┘ └──────────┘ │
│ │
│ ┌──────────────────────────────────────────┐ │
│ │ wwwroot/ (公开前端) │ │
│ │ index.ui products.ui news.ui ... │ │
│ │ api/get_published_content.dspy ... │ │
│ │ dingdingflow/index.ui ... │ │
│ └──────────────────────────────────────────┘ │
│ │
│ ┌──────────────────────────────────────────┐ │
│ │ CMS模块 (pip install -e ~/repos/cms) │ │
│ │ │ │
│ │ ┌─────────┐ ┌──────────────┐ │ │
│ │ │ entcms │ │ dingdingflow │ │ │
│ │ │ 内容管理 │ │ 钉钉审批 │ │ │
│ │ │ CRUD页面│ │ CRUD页面 │ │ │
│ │ │ 数据模型 │ │ 数据模型 │ │ │
│ │ └─────────┘ └──────────────┘ │ │
│ └──────────────────────────────────────────┘ │
└─────────────────────────────────────────────────┘
初始化流程
Portal启动时的加载顺序:
1. set_globalvariable() — 注册全局函数 (get_module_dbname, UiError等)
2. load_pybricks() — 加载bricks前端框架
3. load_appbase() — 加载应用基础模块 (公共函数注册)
4. load_rbac() — 加载RBAC认证模块 (角色权限控制)
5. load_cms() — 加载CMS业务模块 (entcms + dingdingflow)
所有模块注册到 ServerEnv,供.dspy和.ui文件在运行时调用。
数据库
统一使用 ocai_cms 数据库:
| 模块 | 表 |
|---|---|
| entcms | cms_content, cms_categories, cms_sections, cms_leads, cms_site_config |
| dingdingflow | dd_approvals, dd_approval_configs |
get_module_dbname() 对所有模块返回 'ocai_cms'。
前端页面分层
公开页面 (Portal wwwroot/)
| 页面 | 权限 | 说明 |
|---|---|---|
| index.ui | any | 官网首页 (导航/Hero/产品/案例/新闻/页脚/浮动入口) |
| products.ui | any | 产品架构列表 |
| news.ui | any | 新闻列表 |
| news_detail.ui | any | 新闻详情 |
| cases.ui | any | 案例列表 |
| admin.ui | logined | 管理后台仪表盘 (入口) |
| menu.ui | logined | 管理菜单 |
公开API (Portal wwwroot/api/)
| API | 权限 | 说明 |
|---|---|---|
| get_published_content.dspy | any | 获取已发布内容 |
| get_content_detail.dspy | any | 获取内容详情 |
| get_config.dspy | any | 获取站点配置 |
| get_sections.dspy | any | 获取栏目列表 |
| submit_lead.dspy | any | 提交商机线索 |
管理CRUD页面 (CMS模块wwwroot/)
由cms模块提供,不在portal/wwwroot中:
- cms_content_list (内容管理)
- cms_categories_list (分类管理)
- cms_sections_list (栏目管理)
- cms_leads_list (线索管理)
- cms_site_config_list (站点配置)
钉钉审批 (Portal wwwroot/dingdingflow/)
| 页面 | 权限 | 说明 |
|---|---|---|
| dingdingflow/index.ui | any | 审批列表入口 |
| dingdingflow/menu.ui | any | 审批菜单 |
| dingdingflow/api/*.dspy | any | 审批API |
技术栈
| 层 | 技术 |
|---|---|
| Web服务器 | ahserver (异步HTTP) |
| 前端框架 | bricks-framework (JSON UI DSL) |
| 数据库 | MySQL (async, sqlor连接池) |
| 认证 | RBAC (角色权限控制) |
| 基础设施 | appbase, apppublic, checklang |
| 业务模块 | cms (entcms + dingdingflow) |
部署架构
Nginx/LB (80/443)
│
▼
Portal (ahserver :9090)
│
├── / wwwroot/ (公开页面 + API)
├── /bricks/ → pkgs/bricks/dist (前端框架)
└── CMS模块 (pip installed)
└── CRUD页面 + 业务逻辑
│
▼
MySQL (ocai_cms)
Redis (session)
与pipeline-app对比
| 特征 | pipeline-app | portal |
|---|---|---|
| 业务模块数 | 3 (core/ops/dist) | 1 (cms) |
| 模块安装方式 | 本地子目录 | editable pip install |
| 公开页面 | index.ui | index.ui + products + news + cases |
| 公开API | 无 | 5个只读接口 |
| 数据库 | pipeline_* | ocai_cms |
| 端口 | 8080 | 9090 |