# 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 |