Compare commits

...

No commits in common. "main" and "master" have entirely different histories.
main ... master

74 changed files with 6113 additions and 1 deletions

25
.gitignore vendored Normal file
View File

@ -0,0 +1,25 @@
# CRUD auto-generated directories (regenerated via xls2crud)
wwwroot/cms_content_list/
wwwroot/cms_sections_list/
wwwroot/cms_categories_list/
wwwroot/cms_leads_list/
wwwroot/cms_site_config_list/
# Python
__pycache__/
*.pyc
*.pyo
# Virtual environment
py3/
# Logs
logs/*.log
# PID file
portal.pid
# IDE
.idea/
.vscode/
*.swp

View File

@ -1,2 +1,80 @@
# portial # Portal — 企业官网CMS独立Web应用
基于Sage/bricks-framework的独立Web应用通过pip install加载cms业务模块。
## 架构
```
Portal (Web应用壳) CMS (业务模块)
┌─────────────────────┐ ┌──────────────────────┐
│ app/portal.py │────>│ cms/init.py │
│ load_cms() │ │ load_cms() │
│ │ │ - CMS CRUD │
│ wwwroot/ │ │ - DD审批 │
│ index.ui (官网) │ │ │
│ news.ui │ │ wwwroot/ │
│ api/ (公开API) │ │ admin.ui │
│ │ │ api/ (管理API) │
│ conf/config.json │ │ │
│ build.sh │ │ models/ json/ init/ │
│ deploy.sh │ │ data.yaml │
└─────────────────────┘ └──────────────────────┘
```
## 快速开始
```bash
# 一键部署
cd ~/repos/portal && ./deploy.sh
# 或分步执行:
./build.sh # 构建
mysql -h db -u test -p ocai_cms < cms.ddl.sql # 建表
py3/bin/python init_data.py # 初始数据
py3/bin/python init_superuser_permissions.py # 权限
py3/bin/python init_any_permissions.py
py3/bin/python ~/repos/cms/scripts/load_path.py
./start.sh # 启动
```
## 目录结构
```
portal/
├── app/
│ ├── portal.py # 主入口 (from cms.init import load_cms)
│ └── global_func.py # 全局函数
├── conf/config.json # 应用配置 (数据库ocai_cms, 端口9090)
├── wwwroot/ # 公开页面
│ ├── index.ui # 官网首页
│ ├── products.ui # 产品架构
│ ├── news.ui / news_detail.ui
│ ├── cases.ui # 成功案例
│ ├── admin.ui # 管理后台入口
│ └── api/ # 公开只读API
│ ├── get_published_content.dspy
│ ├── get_content_detail.dspy
│ ├── get_config.dspy
│ ├── get_sections.dspy
│ └── submit_lead.dspy
├── build.sh # 构建脚本
├── deploy.sh # 一键部署
├── init_data.py # 加载初始数据
├── init_any_permissions.py # 匿名权限
└── init_superuser_permissions.py
```
## CMS模块
CMS业务模块位于 `~/repos/cms/`,通过 `pip install -e` 安装。
详见 [CMS模块README](../cms/README.md)。
## 访问地址
| 页面 | URL |
|------|-----|
| 官网首页 | http://localhost:9090/ |
| 产品架构 | /products.ui |
| 新闻动态 | /news.ui |
| 成功案例 | /cases.ui |
| 管理后台 | /cms/admin.ui |

58
app/global_func.py Normal file
View File

@ -0,0 +1,58 @@
"""
Portal全局函数 注册到ServerEnv供.dspy和.ui调用
"""
from ahserver.serverenv import ServerEnv
from appPublic.jsonConfig import getConfig
def get_module_dbname(mname):
"""Portal应用统一使用ocai_cms数据库"""
return 'ocai_cms'
def UiWindow(title, icon, content, cheight=10, cwidth=15):
return {
"widgettype": "PopupWindow",
"options": {
"author": "portal",
"cwidth": cwidth,
"cheight": cheight,
"title": title,
"content": content,
"icon": icon or entire_url('/bricks/imgs/app.png'),
"movable": True,
"auto_open": True
}
}
def UiError(title="出错", message="出错啦", timeout=5):
return {
"widgettype": "Error",
"options": {
"author": "portal",
"timeout": timeout,
"cwidth": 15,
"cheight": 10,
"title": title,
"message": message
}
}
def UiMessage(title="消息", message="后台消息", timeout=5):
return {
"widgettype": "Message",
"options": {
"author": "portal",
"timeout": timeout,
"cwidth": 15,
"cheight": 10,
"title": title,
"message": message
}
}
def set_globalvariable():
g = ServerEnv()
g.getConfig = getConfig
g.get_module_dbname = get_module_dbname
g.UiError = UiError
g.UiMessage = UiMessage
g.UiWindow = UiWindow

58
app/portal.py Normal file
View File

@ -0,0 +1,58 @@
"""
Portal Web应用主入口 CMS业务壳
启动: py3/bin/python app/portal.py -p 9090 -w $(pwd)
Portal是一个轻量级Web应用壳通过pip install加载cms业务模块
类似pipeline-app模式app壳负责基础设施初始化业务逻辑在模块中
"""
import os, sys
# 添加应用根目录到Python路径
app_dir = os.path.dirname(os.path.abspath(__file__))
root_dir = os.path.dirname(app_dir)
sys.path.insert(0, root_dir)
# Ensure app/ is in path for local imports
sys.path.insert(0, app_dir)
from appPublic.log import MyLogger, info
from appPublic.folderUtils import ProgramPath
from appPublic.jsonConfig import getConfig
from appPublic.registerfunction import RegisterFunction
from bricks_for_python.init import load_pybricks
from ahserver.webapp import webapp
from ahserver.serverenv import ServerEnv
from sqlor.dbpools import DBPools
# CMS业务模块 (通过pip install -e ~/repos/cms安装)
from cms.init import load_cms
# RBAC认证(复用sage的rbac模块)
from rbac.init import load_rbac
from appbase.init import load_appbase
# 全局函数
from global_func import set_globalvariable
__version__ = '1.0.0'
def get_module_dbname(m):
return 'ocai_cms'
def init():
rf = RegisterFunction()
set_globalvariable()
env = ServerEnv()
env.get_module_dbname = get_module_dbname
# Initialize DBPools and register db on ServerEnv for dspy use
config = getConfig('.')
env.db = DBPools(config.databases)
load_pybricks()
load_appbase()
load_rbac()
load_cms()
if __name__ == '__main__':
webapp(init)

171
build.sh Executable file
View File

@ -0,0 +1,171 @@
#!/usr/bin/env bash
# Portal Web应用 — 构建脚本
# Portal是CMS业务的独立Web应用壳通过pip install加载cms模块
# 用法: cd ~/repos/portal && ./build.sh
set -e
cdir=$(pwd)
uname=$(id -un)
gname=$(id -gn)
echo "============================================"
echo " Portal Web应用 — 构建"
echo "============================================"
# ===========================================
# Step 1: Python虚拟环境
# ===========================================
echo ""
echo "--- Step 1: 创建Python虚拟环境 ---"
if [ ! -d "py3" ]; then
python3 -m venv py3
fi
source py3/bin/activate
# ===========================================
# Step 2: 核心基础设施包
# ===========================================
echo ""
echo "--- Step 2: 安装核心基础设施包 ---"
mkdir -p pkgs
for m in apppublic sqlor ahserver bricks-for-python xls2ddl
do
echo " install $m..."
cd $cdir/pkgs
if [ ! -d "$m" ]; then
git clone https://git.opencomputing.cn/yumoqing/$m
fi
cd $m
$cdir/py3/bin/pip install . 2>/dev/null || echo " WARN: $m install failed"
done
# bricks前端
echo " install bricks..."
cd $cdir/pkgs
if [ ! -d "bricks" ]; then
git clone https://git.opencomputing.cn/yumoqing/bricks
fi
cd bricks/bricks
./build.sh 2>/dev/null || echo " WARN: bricks build skipped"
# bricks符号链接
mkdir -p $cdir/bricks
if [ -d "$cdir/pkgs/bricks/dist" ]; then
rm -f $cdir/bricks
ln -sf $cdir/pkgs/bricks/dist $cdir/bricks
fi
# ===========================================
# Step 3: RBAC + AppBase + checklang
# ===========================================
echo ""
echo "--- Step 3: 安装RBAC/AppBase模块 ---"
for m in appbase rbac checklang
do
echo " install $m..."
cd $cdir/pkgs
if [ ! -d "$m" ]; then
git clone https://git.opencomputing.cn/yumoqing/$m
fi
cd $m
$cdir/py3/bin/pip install . 2>/dev/null || echo " WARN: $m install failed"
done
# ===========================================
# Step 4: CMS业务模块 (editable mode)
# ===========================================
echo ""
echo "--- Step 4: 安装CMS业务模块 ---"
CMS_DIR=~/repos/cms
echo " install cms (editable)..."
$cdir/py3/bin/pip install -e $CMS_DIR 2>/dev/null || echo " WARN: cms install failed"
# ===========================================
# Step 5: 数据库DDL (从cms模块的models目录)
# ===========================================
echo ""
echo "--- Step 5: 生成数据库DDL ---"
if [ -d "$CMS_DIR/models" ]; then
cd $CMS_DIR/models
echo " 生成 CMS DDL..."
$cdir/py3/bin/json2ddl mysql . > $cdir/cms.ddl.sql 2>/dev/null || echo " WARN: json2ddl failed"
echo " DDL已生成: cms.ddl.sql"
fi
# ===========================================
# Step 6: CRUD UI生成 (从cms模块的json目录)
# ===========================================
echo ""
echo "--- Step 6: 生成CRUD UI ---"
if [ -d "$CMS_DIR/json" ]; then
cd $CMS_DIR/json
echo " 生成 CMS CRUD UI..."
for f in *.json; do
[ -f "$f" ] || continue
echo " $f"
$cdir/py3/bin/xls2ui -m ../models -o $CMS_DIR/wwwroot cms $f 2>/dev/null || echo " WARN: xls2ui failed for $f"
done
fi
# ===========================================
# Step 7: 日志和文件目录
# ===========================================
echo ""
echo "--- Step 7: 创建运行时目录 ---"
mkdir -p $cdir/logs
mkdir -p $cdir/files
# ===========================================
# Step 8: systemd服务文件
# ===========================================
echo ""
echo "--- Step 8: 生成systemd服务文件 ---"
cat > $cdir/portal.service <<EOF
[Unit]
Description=Portal CMS Web Application
After=network.target
[Service]
User=$uname
Group=$gname
Type=forking
WorkingDirectory=$cdir
ExecStart=$cdir/start.sh
ExecStop=$cdir/stop.sh
StandardOutput=append:$cdir/logs/portal.log
StandardError=append:$cdir/logs/portal.log
SyslogIdentifier=portal
[Install]
WantedBy=multi-user.target
EOF
echo " portal.service 已生成"
# ===========================================
# Done
# ===========================================
cd $cdir
echo ""
echo "============================================"
echo " 构建完成!"
echo "============================================"
echo ""
echo "后续步骤:"
echo " 1. 编辑 conf/config.json 填入数据库密码"
echo " 2. 执行DDL创建CMS业务表:"
echo " mysql -h HOST -u USER -pPASS ocai_cms < cms.ddl.sql"
echo " 3. 初始化数据(appcodes/分类/栏目/配置):"
echo " py3/bin/python init_data.py"
echo " 4. 初始化权限:"
echo " py3/bin/python init_superuser_permissions.py"
echo " py3/bin/python init_any_permissions.py"
echo " py3/bin/python ~/repos/cms/scripts/load_path.py"
echo " 5. 启动应用:"
echo " ./start.sh"
echo ""
echo "访问地址: http://localhost:9090/"
echo "管理后台: http://localhost:9090/admin.ui"

76
conf/config.json Normal file
View File

@ -0,0 +1,76 @@
{
"password_key": "!@#$%^&*(*&^%$QWERTYUIqwertyui234567",
"logger": {
"name": "portal",
"levelname": "info",
"logfile": "$[workdir]$/logs/portal.log"
},
"filesroot": "$[workdir]$/files",
"databases": {
"ocai_cms": {
"driver": "mysql",
"async_mode": true,
"coding": "utf8",
"dbname": "ocai_cms",
"kwargs": {
"user": "test",
"db": "ocai_cms",
"password": "SS+C1MDMJrslBwGzYIv3nQ==",
"host": "db"
}
}
},
"website": {
"paths": [
[
"$[workdir]$/wwwroot",
""
],
[
"$[workdir]$/../cms/wwwroot",
"/cms"
]
],
"host": "0.0.0.0",
"port": 9090,
"coding": "utf-8",
"session_redis": {
"url": "redis://127.0.0.1:6379/0"
},
"indexes": [
"index.ui",
"index.html",
"index.tmpl"
],
"processors": [
[
".xlsxds",
"xlsxds"
],
[
".sqlds",
"sqlds"
],
[
".tmpl",
"tmpl"
],
[
".dspy",
"dspy"
],
[
".ui",
"bui"
],
[
".md",
"md"
]
]
},
"langMapping": {
"zh-Hans-CN": "zh-cn",
"en-US": "en"
}
}

88
deploy.sh Executable file
View File

@ -0,0 +1,88 @@
#!/usr/bin/env bash
# Portal 一键部署脚本
# 完成从构建到启动的全流程
# 用法: cd ~/repos/portal && ./deploy.sh
set -e
cdir=$(cd "$(dirname "$0")" && pwd)
cd "$cdir"
echo "╔══════════════════════════════════════════╗"
echo "║ Portal CMS — 一键部署 ║"
echo "╚══════════════════════════════════════════╝"
echo ""
# Step 1: Build
echo "=== Step 1/5: 构建 ==="
bash "$cdir/build.sh"
echo ""
# Step 2: Database DDL
echo "=== Step 2/5: 创建数据库表 ==="
if [ -f "$cdir/cms.ddl.sql" ]; then
# 从config.json读取数据库连接信息
DB_HOST=$(python3 -c "import json; c=json.load(open('$cdir/conf/config.json')); print(c['databases']['ocai_cms']['kwargs']['host'])" 2>/dev/null || echo "db")
DB_USER=$(python3 -c "import json; c=json.load(open('$cdir/conf/config.json')); print(c['databases']['ocai_cms']['kwargs']['user'])" 2>/dev/null || echo "test")
DB_PASS=$(python3 -c "
import json, sys
sys.path.insert(0, '$cdir')
from appPublic.password import decode
c=json.load(open('$cdir/conf/config.json'))
print(decode(c['databases']['ocai_cms']['kwargs']['password'], c['password_key']))
" 2>/dev/null || echo "")
DB_NAME=$(python3 -c "import json; c=json.load(open('$cdir/conf/config.json')); print(c['databases']['ocai_cms']['kwargs']['db'])" 2>/dev/null || echo "ocai_cms")
if [ -n "$DB_PASS" ]; then
echo " 执行DDL: $DB_HOST/$DB_NAME ..."
mysql -h "$DB_HOST" -u "$DB_USER" -p"$DB_PASS" "$DB_NAME" < "$cdir/cms.ddl.sql" 2>/dev/null && \
echo " ✓ DDL执行成功" || \
echo " ⚠ DDL执行失败(表可能已存在),继续..."
else
echo " ⚠ 无法读取数据库密码,请手动执行:"
echo " mysql -h $DB_HOST -u $DB_USER -p $DB_NAME < cms.ddl.sql"
fi
else
echo " ⚠ cms.ddl.sql 不存在,跳过(请先运行 build.sh)"
fi
echo ""
# Step 3: Init data
echo "=== Step 3/5: 加载初始数据 ==="
if [ -f "$cdir/py3/bin/python" ]; then
"$cdir/py3/bin/python" "$cdir/init_data.py" 2>&1 || echo " ⚠ 初始数据加载失败,继续..."
else
echo " ⚠ py3未构建跳过"
fi
echo ""
# Step 4: Init permissions
echo "=== Step 4/5: 初始化权限 ==="
if [ -f "$cdir/py3/bin/python" ]; then
"$cdir/py3/bin/python" "$cdir/init_superuser_permissions.py" 2>&1 || echo " ⚠ superuser权限失败"
"$cdir/py3/bin/python" "$cdir/init_any_permissions.py" 2>&1 || echo " ⚠ any权限失败"
"$cdir/py3/bin/python" ~/repos/cms/scripts/load_path.py 2>&1 || echo " ⚠ CMS模块权限失败"
echo " ✓ 权限初始化完成"
else
echo " ⚠ py3未构建跳过"
fi
echo ""
# Step 5: Start
echo "=== Step 5/5: 启动应用 ==="
if [ -f "$cdir/start.sh" ]; then
# 先停掉旧进程
bash "$cdir/stop.sh" 2>/dev/null || true
sleep 1
bash "$cdir/start.sh"
echo " ✓ 应用已启动"
else
echo " ⚠ start.sh 不存在"
fi
echo ""
echo "╔══════════════════════════════════════════╗"
echo "║ 部署完成! ║"
echo "╠══════════════════════════════════════════╣"
echo "║ 官网: http://localhost:9090/ ║"
echo "║ 管理: http://localhost:9090/cms/admin.ui ║"
echo "╚══════════════════════════════════════════╝"

139
docs/architecture.md Normal file
View File

@ -0,0 +1,139 @@
# 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 |

90
i18n/en/msg.txt Normal file
View File

@ -0,0 +1,90 @@
Add Error: Add Error
Add Success: Add Success
Authorization Error: Authorization Error
CMS内容表: CMS Content Table
CMS分类表: CMS Category Table
CMS商机线索表: CMS Lead Table
CMS栏目表: CMS Column Table
CMS站点配置表: CMS Site Config Table
Cancel: Cancel
Conform: Confirm
Delete Error: Delete Error
Delete Success: Delete Success
Discard: Discard
ID: ID
Please login: Please login
Record no exist or with wrong ownership: Record no exist or with wrong ownership
Reset: Reset
Submit: Submit
Update Error: Update Error
Update Success: Update Success
failed: failed
ok: ok
个人信息: Personal Info
了解产品架构: Learn About Product Architecture
了解更多 → 联系销售: Learn More → Contact Sales
产品架构: Product Architecture
企业动态: Enterprise News
值类型: Value Type
公司: Company
内容不存在: Content Does Not Exist
内容分类: Content Category
内容管理: Content Management
内容类型: Content Type
分类ID: Category ID
分类名称: Category Name
分类名称不能为空: Category Name Cannot Be Empty
创建人: Creator
创建时间: Created Time
副标题: Subtitle
原始文本: Original Text
发布时间: Published Time
商机线索: Lead
图片URL: Image URL
地区: Region
备注: Remarks
官网预览: Website Preview
审批ID: Approval ID
展示配置: Display Config
意向产品: Intended Product
成功案例: Success Stories
扩展JSON: Extended JSON
排序: Sort Order
描述: Description
摘要: Summary
是否可见: Is Visible
更新时间: Updated Time
未登录: Not Logged In
来源: Source
查看全部 →: View All →
标签: Tags
标题: Title
标题不能为空: Title Cannot Be Empty
栏目Key: Column Key
栏目Key和标题不能为空: Column Key and Title Cannot Be Empty
栏目管理: Column Management
栏目类型: Column Type
样式配置: Style Config
正文: Body
注册: Register
父分类ID: Parent Category ID
状态: Status
电话: Phone
留言: Message
登录: Login
站点配置: Site Config
管理后台: Admin Panel
组织ID: Organization ID
缺少ID: Missing ID
缺少id: Missing id
联系人: Contact Person
联系销售: Contact Sales
行业: Industry
负责人: Owner
退出登录: Logout
邮箱: Email
配置值: Config Value
配置组: Config Group
配置组和配置键不能为空: Config Group and Config Key Cannot Be Empty
配置键: Config Key
静态内容: Static Content

90
i18n/jp/msg.txt Normal file
View File

@ -0,0 +1,90 @@
Add Error: 追加エラー
Add Success: 追加成功
Authorization Error: 認証エラー
CMS内容表: CMSコンテンツテーブル
CMS分类表: CMSカテゴリテーブル
CMS商机线索表: CMSリードテーブル
CMS栏目表: CMSカラムテーブル
CMS站点配置表: CMSサイト設定テーブル
Cancel: キャンセル
Conform: 確認
Delete Error: 削除エラー
Delete Success: 削除成功
Discard: 破棄
ID: ID
Please login: ログインしてください
Record no exist or with wrong ownership: レコードが存在しないか、所有権が正しくありません
Reset: リセット
Submit: 送信
Update Error: 更新エラー
Update Success: 更新成功
failed: 失敗
ok: OK
个人信息: 個人情報
了解产品架构: 製品アーキテクチャを知る
了解更多 → 联系销售: 詳しく見る → 営業に連絡
产品架构: 製品アーキテクチャ
企业动态: 企業ニュース
值类型: 値タイプ
公司: 会社
内容不存在: コンテンツが存在しません
内容分类: コンテンツカテゴリ
内容管理: コンテンツ管理
内容类型: コンテンツタイプ
分类ID: カテゴリID
分类名称: カテゴリ名
分类名称不能为空: カテゴリ名は空にできません
创建人: 作成者
创建时间: 作成日時
副标题: サブタイトル
原始文本: 原文
发布时间: 公開日時
商机线索: リード
图片URL: 画像URL
地区: 地域
备注: 備考
官网预览: ウェブサイトプレビュー
审批ID: 承認ID
展示配置: 表示設定
意向产品: 希望製品
成功案例: 成功事例
扩展JSON: 拡張JSON
排序: 並び順
描述: 説明
摘要: 要約
是否可见: 表示可否
更新时间: 更新日時
未登录: 未ログイン
来源: ソース
查看全部 →: すべて表示 →
标签: タグ
标题: タイトル
标题不能为空: タイトルは空にできません
栏目Key: カラムキー
栏目Key和标题不能为空: カラムキーとタイトルは空にできません
栏目管理: カラム管理
栏目类型: カラムタイプ
样式配置: スタイル設定
正文: 本文
注册: 登録
父分类ID: 親カテゴリID
状态: ステータス
电话: 電話番号
留言: メッセージ
登录: ログイン
站点配置: サイト設定
管理后台: 管理パネル
组织ID: 組織ID
缺少ID: IDが不足しています
缺少id: idが不足しています
联系人: 担当者
联系销售: 営業に連絡
行业: 業界
负责人: 担当者
退出登录: ログアウト
邮箱: メールアドレス
配置值: 設定値
配置组: 設定グループ
配置组和配置键不能为空: 設定グループと設定キーは空にできません
配置键: 設定キー
静态内容: 静的コンテンツ

90
i18n/ko/msg.txt Normal file
View File

@ -0,0 +1,90 @@
Add Error: 추가 오류
Add Success: 추가 성공
Authorization Error: 인증 오류
CMS内容表: CMS 콘텐츠 테이블
CMS分类表: CMS 카테고리 테이블
CMS商机线索表: CMS 리드 테이블
CMS栏目表: CMS 칼럼 테이블
CMS站点配置表: CMS 사이트 구성 테이블
Cancel: 취소
Conform: 확인
Delete Error: 삭제 오류
Delete Success: 삭제 성공
Discard: 폐기
ID: ID
Please login: 로그인해 주세요
Record no exist or with wrong ownership: 레코드가 존재하지 않거나 소유권이 잘못되었습니다
Reset: 초기화
Submit: 제출
Update Error: 업데이트 오류
Update Success: 업데이트 성공
failed: 실패
ok: 확인
个人信息: 개인 정보
了解产品架构: 제품 아키텍처 알아보기
了解更多 → 联系销售: 자세히 보기 → 영업 문의
产品架构: 제품 아키텍처
企业动态: 기업 뉴스
值类型: 값 유형
公司: 회사
内容不存在: 콘텐츠가 존재하지 않습니다
内容分类: 콘텐츠 카테고리
内容管理: 콘텐츠 관리
内容类型: 콘텐츠 유형
分类ID: 카테고리 ID
分类名称: 카테고리 이름
分类名称不能为空: 카테고리 이름은 비워둘 수 없습니다
创建人: 생성자
创建时间: 생성 시간
副标题: 부제목
原始文本: 원본 텍스트
发布时间: 게시 시간
商机线索: 리드
图片URL: 이미지 URL
地区: 지역
备注: 비고
官网预览: 웹사이트 미리보기
审批ID: 승인 ID
展示配置: 표시 구성
意向产品: 희망 제품
成功案例: 성공 사례
扩展JSON: 확장 JSON
排序: 정렬 순서
描述: 설명
摘要: 요약
是否可见: 표시 여부
更新时间: 업데이트 시간
未登录: 로그인되지 않음
来源: 출처
查看全部 →: 전체 보기 →
标签: 태그
标题: 제목
标题不能为空: 제목은 비워둘 수 없습니다
栏目Key: 칼럼 키
栏目Key和标题不能为空: 칼럼 키와 제목은 비워둘 수 없습니다
栏目管理: 칼럼 관리
栏目类型: 칼럼 유형
样式配置: 스타일 구성
正文: 본문
注册: 등록
父分类ID: 상위 카테고리 ID
状态: 상태
电话: 전화
留言: 메시지
登录: 로그인
站点配置: 사이트 구성
管理后台: 관리자 패널
组织ID: 조직 ID
缺少ID: ID 누락
缺少id: id 누락
联系人: 담당자
联系销售: 영업 문의
行业: 업종
负责人: 담당자
退出登录: 로그아웃
邮箱: 이메일
配置值: 구성 값
配置组: 구성 그룹
配置组和配置键不能为空: 구성 그룹과 구성 키는 비워둘 수 없습니다
配置键: 구성 키
静态内容: 정적 콘텐츠

90
i18n/zh/msg.txt Normal file
View File

@ -0,0 +1,90 @@
Add Error: Add Error
Add Success: Add Success
Authorization Error: Authorization Error
CMS内容表: CMS内容表
CMS分类表: CMS分类表
CMS商机线索表: CMS商机线索表
CMS栏目表: CMS栏目表
CMS站点配置表: CMS站点配置表
Cancel: Cancel
Conform: Conform
Delete Error: Delete Error
Delete Success: Delete Success
Discard: Discard
ID: ID
Please login: Please login
Record no exist or with wrong ownership: Record no exist or with wrong ownership
Reset: Reset
Submit: Submit
Update Error: Update Error
Update Success: Update Success
failed: failed
ok: ok
个人信息: 个人信息
了解产品架构: 了解产品架构
了解更多 → 联系销售: 了解更多 → 联系销售
产品架构: 产品架构
企业动态: 企业动态
值类型: 值类型
公司: 公司
内容不存在: 内容不存在
内容分类: 内容分类
内容管理: 内容管理
内容类型: 内容类型
分类ID: 分类ID
分类名称: 分类名称
分类名称不能为空: 分类名称不能为空
创建人: 创建人
创建时间: 创建时间
副标题: 副标题
原始文本: 原始文本
发布时间: 发布时间
商机线索: 商机线索
图片URL: 图片URL
地区: 地区
备注: 备注
官网预览: 官网预览
审批ID: 审批ID
展示配置: 展示配置
意向产品: 意向产品
成功案例: 成功案例
扩展JSON: 扩展JSON
排序: 排序
描述: 描述
摘要: 摘要
是否可见: 是否可见
更新时间: 更新时间
未登录: 未登录
来源: 来源
查看全部 →: 查看全部 →
标签: 标签
标题: 标题
标题不能为空: 标题不能为空
栏目Key: 栏目Key
栏目Key和标题不能为空: 栏目Key和标题不能为空
栏目管理: 栏目管理
栏目类型: 栏目类型
样式配置: 样式配置
正文: 正文
注册: 注册
父分类ID: 父分类ID
状态: 状态
电话: 电话
留言: 留言
登录: 登录
站点配置: 站点配置
管理后台: 管理后台
组织ID: 组织ID
缺少ID: 缺少ID
缺少id: 缺少id
联系人: 联系人
联系销售: 联系销售
行业: 行业
负责人: 负责人
退出登录: 退出登录
邮箱: 邮箱
配置值: 配置值
配置组: 配置组
配置组和配置键不能为空: 配置组和配置键不能为空
配置键: 配置键
静态内容: 静态内容

114
init_any_permissions.py Normal file
View File

@ -0,0 +1,114 @@
"""
Portal RBAC权限初始化 any (匿名) 角色
扫描 wwwroot bricks 下的公开页面授予 any 角色权限
规则:
- wwwroot/* /<file> (公开页面和API)
- bricks/* /bricks/<file>
- /cms/* cms/scripts/load_path.py 管理(需要登录)
用法: cd ~/repos/portal && py3/bin/python init_any_permissions.py
"""
import os, sys, subprocess
def find_app_root():
return os.path.dirname(os.path.abspath(__file__))
app_root = find_app_root()
sage_root = None
for c in [os.path.expanduser("~/repos/sage"), os.path.expanduser("~/sage")]:
if os.path.isdir(os.path.join(c, "py3", "bin")):
sage_root = c
break
if not sage_root:
print("ERROR: 找不到Sage无法初始化权限")
sys.exit(1)
py = os.path.join(sage_root, "py3", "bin", "python")
sp = os.path.join(sage_root, "set_role_perm.py")
if not os.path.exists(sp):
print("ERROR: 找不到set_role_perm.py")
sys.exit(1)
SKIP_DIRS = {".git", "__pycache__", "node_modules", ".svn"}
SKIP_EXTS = {".pyc", ".pyo", ".swp", ".swo", ".bak", ".orig", ".log", ".pid", ".lock"}
def scan_dir(base_dir, url_prefix):
paths = []
if not os.path.isdir(base_dir):
return paths
for root, dirs, files in os.walk(base_dir):
dirs[:] = [d for d in dirs if d not in SKIP_DIRS]
for f in sorted(files):
_, ext = os.path.splitext(f)
if ext.lower() in SKIP_EXTS or f.startswith("."):
continue
full_path = os.path.join(root, f)
if os.path.islink(full_path):
link_target = os.path.realpath(full_path)
if not link_target.startswith(app_root):
continue
rel_path = os.path.relpath(full_path, base_dir)
url = url_prefix + "/" + rel_path.replace(os.sep, "/")
paths.append(url)
return paths
def set_any_perms(paths):
count = 0
env = os.environ.copy()
env['SAGE_RBAC_DB'] = 'ocai_cms'
for p in paths:
result = subprocess.run(
[py, sp, "any", p],
cwd=sage_root, capture_output=True, text=True, env=env
)
status = "" if result.returncode == 0 else ""
print(f" {status} any {p}")
count += 1
return count
print("=== Portal RBAC权限初始化 — any (匿名访问) ===")
print(f"Sage: {sage_root}")
print()
# 1. wwwroot/ 公开页面和API
wwwroot_dir = os.path.join(app_root, "wwwroot")
root_paths = scan_dir(wwwroot_dir, "")
root_paths.append("/") # 根路径
print(f"--- wwwroot/ → / ({len(root_paths)} 个路径) ---")
n1 = set_any_perms(root_paths)
# 2. bricks/
bricks_dir = os.path.join(app_root, "bricks")
bricks_paths = scan_dir(bricks_dir, "/bricks")
if bricks_paths:
print(f"\n--- bricks → /bricks ({len(bricks_paths)} 个文件) ---")
n2 = set_any_perms(bricks_paths)
else:
n2 = 0
print(f"\n--- bricks → /bricks (未构建,跳过) ---")
# 3. rbac模块公开路径 (登录页、注册、验证码等)
# 从rbac的load_path.py导入PATHS_ANY列表
rbac_load_path = os.path.join(os.path.dirname(app_root), "rbac", "scripts", "load_path.py")
rbac_any_paths = []
if os.path.exists(rbac_load_path):
import importlib.util
spec = importlib.util.spec_from_file_location("rbac_load_path", rbac_load_path)
mod = importlib.util.module_from_spec(spec)
# 阻止register_paths自动执行
mod.__name__ = "rbac_load_path"
spec.loader.exec_module(mod)
rbac_any_paths = getattr(mod, 'PATHS_ANY', [])
else:
print("WARNING: 找不到rbac/scripts/load_path.py跳过rbac路径注册")
if rbac_any_paths:
print(f"\n--- rbac模块 → any ({len(rbac_any_paths)} 个路径) ---")
n3 = set_any_perms(rbac_any_paths)
else:
n3 = 0
print("\n--- rbac模块 → any (无路径,跳过) ---")
total = n1 + n2 + n3
print(f"\n=== 完成: 共设置 {total} 个any权限 ===")

179
init_data.py Normal file
View File

@ -0,0 +1,179 @@
"""
Portal 一键部署 初始化数据
cms 模块的 init/data.yaml 加载所有初始数据:
- appcodes (枚举编码)
- appcodes_kv (枚举值)
- cms_categories (默认分类)
- cms_site_config (默认站点配置)
- cms_sections (默认栏目配置)
- dd_approval_configs (默认审批配置)
用法: cd ~/repos/portal && py3/bin/python init_data.py
"""
import os, sys, json
app_dir = os.path.dirname(os.path.abspath(__file__))
root_dir = app_dir
sys.path.insert(0, root_dir)
# 读取YAML
try:
import yaml
except ImportError:
# 简单YAML解析(fallback)
yaml = None
CMS_DIR = os.path.expanduser("~/cms")
DATA_FILE = os.path.join(CMS_DIR, "init", "data.yaml")
def load_yaml_simple(path):
"""简单YAML加载(仅支持本文件用到的结构)"""
if yaml:
with open(path, 'r', encoding='utf-8') as f:
return yaml.safe_load(f)
else:
# 用json做fallback - 要求data文件也有json版本
json_path = path.replace('.yaml', '.json')
if os.path.exists(json_path):
with open(json_path, 'r', encoding='utf-8') as f:
return json.load(f)
raise ImportError("需要PyYAML: pip install pyyaml")
def main():
print("=== Portal 一键部署 — 初始化数据 ===")
print(f"CMS模块: {CMS_DIR}")
print(f"数据文件: {DATA_FILE}")
print()
if not os.path.exists(DATA_FILE):
print(f"ERROR: 数据文件不存在: {DATA_FILE}")
sys.exit(1)
# 加载YAML
data = load_yaml_simple(DATA_FILE)
# 连接数据库
from sqlor.dbpools import DBPools
from appPublic.uniqueID import getID
from ahserver.serverenv import ServerEnv
from appPublic.jsonConfig import getConfig
from appPublic.log import MyLogger
# 初始化日志和配置
MyLogger(getConfig())
db = DBPools(getConfig().databases)
dbname = 'ocai_cms'
import asyncio
async def insert_data():
async with db.sqlorContext(dbname) as sor:
# 1. appcodes
appcodes = data.get('appcodes', [])
if appcodes:
print(f"\n--- appcodes ({len(appcodes)} 条) ---")
for item in appcodes:
item.setdefault('id', getID())
item.setdefault('org_id', '0')
try:
# 检查是否已存在
existing = await sor.R('appcodes', {'id': item['id']})
if not existing:
await sor.C('appcodes', item)
print(f"{item['id']} - {item.get('name', '')}")
else:
print(f" · {item['id']} (已存在)")
except Exception as e:
print(f"{item.get('id', '?')}: {e}")
# 2. appcodes_kv
appcodes_kv = data.get('appcodes_kv', [])
if appcodes_kv:
print(f"\n--- appcodes_kv ({len(appcodes_kv)} 条) ---")
for item in appcodes_kv:
item.setdefault('id', getID())
item.setdefault('org_id', '0')
try:
existing = await sor.R('appcodes_kv', {'id': item['id']})
if not existing:
await sor.C('appcodes_kv', item)
print(f"{item['id']} ({item.get('parentid', '')}.{item.get('k', '')} = {item.get('v', '')})")
else:
print(f" · {item['id']} (已存在)")
except Exception as e:
print(f"{item.get('id', '?')}: {e}")
# 3. cms_categories
categories = data.get('cms_categories', [])
if categories:
print(f"\n--- cms_categories ({len(categories)} 条) ---")
for item in categories:
item.setdefault('id', getID())
try:
existing = await sor.R('cms_categories', {'id': item['id']})
if not existing:
await sor.C('cms_categories', item)
print(f"{item['id']} - {item.get('name', '')} [{item.get('content_type', '')}]")
else:
print(f" · {item['id']} (已存在)")
except Exception as e:
print(f"{item.get('id', '?')}: {e}")
# 4. cms_site_config
configs = data.get('cms_site_config', [])
if configs:
print(f"\n--- cms_site_config ({len(configs)} 条) ---")
for item in configs:
item.setdefault('id', getID())
try:
existing = await sor.R('cms_site_config', {'id': item['id']})
if not existing:
await sor.C('cms_site_config', item)
print(f"{item['id']} ({item.get('config_group', '')}.{item.get('config_key', '')})")
else:
print(f" · {item['id']} (已存在)")
except Exception as e:
print(f"{item.get('id', '?')}: {e}")
# 5. cms_sections
sections = data.get('cms_sections', [])
if sections:
print(f"\n--- cms_sections ({len(sections)} 条) ---")
for item in sections:
item.setdefault('id', getID())
try:
existing = await sor.R('cms_sections', {'id': item['id']})
if not existing:
await sor.C('cms_sections', item)
print(f"{item['id']} - {item.get('title', '')} [{item.get('section_type', '')}]")
else:
print(f" · {item['id']} (已存在)")
except Exception as e:
print(f"{item.get('id', '?')}: {e}")
# 6. dd_approval_configs
dd_configs = data.get('dd_approval_configs', [])
if dd_configs:
print(f"\n--- dd_approval_configs ({len(dd_configs)} 条) ---")
for item in dd_configs:
item.setdefault('id', getID())
try:
existing = await sor.R('dd_approval_configs', {'id': item['id']})
if not existing:
await sor.C('dd_approval_configs', item)
print(f"{item['id']} - {item.get('biz_type', '')}")
else:
print(f" · {item['id']} (已存在)")
except Exception as e:
print(f"{item.get('id', '?')}: {e}")
total = len(appcodes) + len(appcodes_kv) + len(categories) + len(configs) + len(sections) + len(dd_configs)
print(f"\n=== 完成: 处理 {total} 条初始数据 ===")
asyncio.run(insert_data())
if __name__ == '__main__':
main()

View File

@ -0,0 +1,143 @@
"""
Portal RBAC权限初始化 superuser角色
为owner.superuser授予Portal所有权限
Portal包含:
- 公开页面 (wwwroot下的.ui和静态文件)
- CMS管理CRUD页面 (cms模块wwwroot路由到/cms/)
- appbase系统基础模块
用法: cd ~/repos/portal && py3/bin/python init_superuser_permissions.py
"""
import os, sys, subprocess
def find_app_root():
return os.path.dirname(os.path.abspath(__file__))
app_root = find_app_root()
sage_root = None
for c in [os.path.expanduser("~/repos/sage"), os.path.expanduser("~/sage")]:
if os.path.isdir(os.path.join(c, "py3", "bin")):
sage_root = c
break
if not sage_root:
sage_root = app_root
py = os.path.join(sage_root, "py3", "bin", "python")
sp = os.path.join(sage_root, "set_role_perm.py") if os.path.exists(os.path.join(sage_root, "set_role_perm.py")) else None
if not sp:
print("ERROR: 找不到set_role_perm.py")
sys.exit(1)
def run(role, paths):
env = os.environ.copy()
env['SAGE_RBAC_DB'] = 'ocai_cms'
for p in paths:
print(f" {role:30s} {p}")
subprocess.run([py, sp, role, p], cwd=sage_root, capture_output=True, env=env)
# ─── superuser — 所有权限 ───
superuser_paths = [
# 公开页面
"/index.ui", "/news.ui", "/news_detail.ui",
"/cases.ui", "/products.ui",
"/cms_styles.css", "/cms_scripts.js",
"/menu.ui", "/admin.ui",
# 公开API
"/api/get_published_content.dspy",
"/api/get_content_detail.dspy",
"/api/get_config.dspy",
"/api/get_sections.dspy",
"/api/submit_lead.dspy",
# CMS管理 — 由cms模块提供路由到 /cms/
"/cms",
"/cms/admin.ui", "/cms/menu.ui",
# CMS Content CRUD
"/cms/cms_content_list", "/cms/cms_content_list/%",
"/cms/api/cms_content_create.dspy",
"/cms/api/cms_content_update.dspy",
"/cms/api/cms_content_delete.dspy",
"/cms/api/cms_content_list.dspy",
"/cms/api/submit_content_approval.dspy",
# CMS Categories
"/cms/cms_categories_list", "/cms/cms_categories_list/%",
"/cms/api/cms_categories_create.dspy",
"/cms/api/cms_categories_update.dspy",
"/cms/api/cms_categories_delete.dspy",
"/cms/api/cms_categories_list.dspy",
"/cms/api/category_options.dspy",
# CMS Sections
"/cms/cms_sections_list", "/cms/cms_sections_list/%",
"/cms/api/cms_sections_create.dspy",
"/cms/api/cms_sections_update.dspy",
"/cms/api/cms_sections_delete.dspy",
"/cms/api/cms_sections_list.dspy",
# CMS Site Config
"/cms/cms_site_config_list", "/cms/cms_site_config_list/%",
"/cms/api/cms_site_config_create.dspy",
"/cms/api/cms_site_config_update.dspy",
"/cms/api/cms_site_config_delete.dspy",
"/cms/api/cms_site_config_list.dspy",
# CMS Leads
"/cms/cms_leads_list", "/cms/cms_leads_list/%",
"/cms/api/cms_leads_create.dspy",
"/cms/api/cms_leads_update.dspy",
"/cms/api/cms_leads_delete.dspy",
"/cms/api/cms_leads_list.dspy",
# DingTalk Approvals (cms模块内)
"/cms/api/submit_approval.dspy",
"/cms/api/dingtalk_callback.dspy",
"/cms/dd_approvals", "/cms/dd_approvals/%",
"/cms/api/dd_approvals_create.dspy",
"/cms/api/dd_approvals_update.dspy",
"/cms/api/dd_approvals_delete.dspy",
"/cms/api/dd_approvals_list.dspy",
"/cms/dd_approval_configs", "/cms/dd_approval_configs/%",
"/cms/api/dd_approval_configs_create.dspy",
"/cms/api/dd_approval_configs_update.dspy",
"/cms/api/dd_approval_configs_delete.dspy",
"/cms/api/dd_approval_configs_list.dspy",
# appbase 系统基础模块
"/appbase/appcodes_kv", "/appbase/appcodes_kv/%",
"/appbase/appcodes", "/appbase/appcodes/%",
"/appbase/params", "/appbase/params/%",
"/appbase/svgicon", "/appbase/svgicon/%",
"/appbase/cron/index.ui",
# rbac模块 (登录后管理页面)
"/rbac",
"/rbac/index.ui", "/rbac/admin_menu.ui", "/rbac/usermenu.ui",
"/rbac/add_adminuser.dspy", "/rbac/add_adminuser.ui",
"/rbac/add_provider.dspy", "/rbac/add_provider.ui",
"/rbac/add_reseller.dspy", "/rbac/add_superuser.dspy",
"/rbac/find_unauth_files.dspy",
"/rbac/get_all_roles.dspy", "/rbac/get_normal_roles.dspy",
"/rbac/get_provider.dspy", "/rbac/get_reseller.dspy",
"/rbac/list_path_roles.dspy", "/rbac/list_path_roles.ui",
"/rbac/organization", "/rbac/orgtypes",
"/rbac/permission", "/rbac/provider", "/rbac/reseller",
"/rbac/refresh_userperm.dspy",
"/rbac/role", "/rbac/rolepermission",
"/rbac/stat_active_users.ui", "/rbac/stat_total_orgs.ui", "/rbac/stat_total_users.ui",
"/rbac/user", "/rbac/user/myrole.ui", "/rbac/user/user.ui", "/rbac/user/user_panel.ui",
"/rbac/user/userapikey", "/rbac/user/userapikey/%",
"/rbac/user/userinfo.ui", "/rbac/user/edit_profile.dspy", "/rbac/user/save_profile.dspy",
"/rbac/user/wechat_login.ui",
"/rbac/userapp", "/rbac/userdepartment", "/rbac/userrole",
"/rbac/users", "/rbac/usersync", "/rbac/usersync/index.dspy",
]
print("=== Portal RBAC权限初始化 — superuser ===")
print(f"\n--- owner.superuser (超级管理员) ---")
run("owner.superuser", superuser_paths)
print("\n完成")

3
json/build.sh Executable file
View File

@ -0,0 +1,3 @@
#!/bin/bash
xls2ui -m ../models -o ../wwwroot portal *.json

View File

@ -0,0 +1,29 @@
{
"tblname": "cms_categories",
"alias": "cms_categories_list",
"title": "内容分类",
"uitype": "tree",
"params": {
"idField": "id",
"textField": "name",
"parentField": "parent_id",
"sortby": ["sort_order asc", "created_at desc"],
"logined_userorgid": "org_id",
"browserfields": {
"exclouded": ["display_config"],
"alters": {
"content_type": {
"uitype": "code",
"dataurl": "{{entire_url('../api/get_search_content_type.dspy')}}",
"datamethod": "GET"
}
}
},
"editexclouded": ["id", "org_id", "created_at"],
"editable": {
"new_data_url": "{{entire_url('../api/cms_categories_create.dspy')}}",
"update_data_url": "{{entire_url('../api/cms_categories_update.dspy')}}",
"delete_data_url": "{{entire_url('../api/cms_categories_delete.dspy')}}"
}
}
}

View File

@ -0,0 +1,38 @@
{
"tblname": "cms_content",
"alias": "cms_content_list",
"title": "内容管理",
"params": {
"sortby": ["sort_order asc", "created_at desc"],
"logined_userorgid": "org_id",
"browserfields": {
"exclouded": ["body", "extra_json", "approval_id", "created_by"],
"alters": {
"status": {
"uitype": "code",
"data": [
{"value": "draft", "text": "草稿"},
{"value": "published", "text": "已发布"},
{"value": "archived", "text": "已归档"}
]
},
"content_type": {
"uitype": "code",
"dataurl": "{{entire_url('../api/get_search_content_type.dspy')}}",
"datamethod": "GET"
},
"category_id": {
"uitype": "code",
"dataurl": "{{entire_url('../api/get_search_cms_categories.dspy')}}",
"datamethod": "GET"
}
}
},
"editexclouded": ["id", "org_id", "created_by", "created_at", "updated_at"],
"editable": {
"new_data_url": "{{entire_url('../api/cms_content_create.dspy')}}",
"update_data_url": "{{entire_url('../api/cms_content_update.dspy')}}",
"delete_data_url": "{{entire_url('../api/cms_content_delete.dspy')}}"
}
}
}

39
json/cms_leads_list.json Normal file
View File

@ -0,0 +1,39 @@
{
"tblname": "cms_leads",
"alias": "cms_leads_list",
"title": "商机线索",
"params": {
"sortby": ["created_at desc"],
"logined_userorgid": "org_id",
"browserfields": {
"exclouded": ["raw_text"],
"alters": {
"status": {
"uitype": "code",
"data": [
{"value": "new", "text": "新线索"},
{"value": "contacting", "text": "联系中"},
{"value": "qualified", "text": "已确认"},
{"value": "converted", "text": "已转化"},
{"value": "closed", "text": "已关闭"}
]
},
"source": {
"uitype": "code",
"data": [
{"value": "website", "text": "官网"},
{"value": "form", "text": "表单"},
{"value": "ai", "text": "AI抽取"},
{"value": "other", "text": "其他"}
]
}
}
},
"editexclouded": ["id", "org_id", "created_at", "updated_at"],
"editable": {
"new_data_url": "{{entire_url('../api/cms_leads_create.dspy')}}",
"update_data_url": "{{entire_url('../api/cms_leads_update.dspy')}}",
"delete_data_url": "{{entire_url('../api/cms_leads_delete.dspy')}}"
}
}
}

View File

@ -0,0 +1,32 @@
{
"tblname": "cms_sections",
"alias": "cms_sections_list",
"title": "栏目管理",
"params": {
"sortby": ["sort_order asc", "created_at desc"],
"logined_userorgid": "org_id",
"browserfields": {
"exclouded": ["static_content", "style_config"],
"alters": {
"is_visible": {
"uitype": "code",
"data": [
{"value": "1", "text": "显示"},
{"value": "0", "text": "隐藏"}
]
},
"content_type": {
"uitype": "code",
"dataurl": "{{entire_url('../api/get_search_content_type.dspy')}}",
"datamethod": "GET"
}
}
},
"editexclouded": ["id", "org_id", "created_at", "updated_at"],
"editable": {
"new_data_url": "{{entire_url('../api/cms_sections_create.dspy')}}",
"update_data_url": "{{entire_url('../api/cms_sections_update.dspy')}}",
"delete_data_url": "{{entire_url('../api/cms_sections_delete.dspy')}}"
}
}
}

View File

@ -0,0 +1,30 @@
{
"tblname": "cms_site_config",
"alias": "cms_site_config_list",
"title": "站点配置",
"params": {
"sortby": ["config_group asc", "sort_order asc"],
"logined_userorgid": "org_id",
"browserfields": {
"exclouded": [],
"alters": {
"config_type": {
"uitype": "code",
"data": [
{"value": "text", "text": "文本"},
{"value": "number", "text": "数字"},
{"value": "json", "text": "JSON"},
{"value": "bool", "text": "布尔"},
{"value": "image", "text": "图片URL"}
]
}
}
},
"editexclouded": ["id", "org_id", "updated_at"],
"editable": {
"new_data_url": "{{entire_url('../api/cms_site_config_create.dspy')}}",
"update_data_url": "{{entire_url('../api/cms_site_config_update.dspy')}}",
"delete_data_url": "{{entire_url('../api/cms_site_config_delete.dspy')}}"
}
}
}

90
load_path.py Normal file
View File

@ -0,0 +1,90 @@
#!/usr/bin/env python3
"""
Portal CMS CRUD RBAC 权限注册脚本
直接操作 ocai_cms 数据库的 permission/rolepermission
注册CMS管理后台的CRUD路径权限
用法: cd ~/portal && py3/bin/python load_path.py
"""
import asyncio
import sys
import os
sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)), 'pkgs'))
from appPublic.jsonConfig import getConfig
from sqlor.dbpools import DBPools
from appPublic.uniqueID import getID
# CMS管理页面路径 — superuser可访问
PATHS_SUPERUSER = [
"/admin.ui",
# CMS Content CRUD
"/cms_content_list", "/cms_content_list/%",
"/api/cms_content_create.dspy", "/api/cms_content_update.dspy", "/api/cms_content_delete.dspy",
# CMS Sections CRUD
"/cms_sections_list", "/cms_sections_list/%",
"/api/cms_sections_create.dspy", "/api/cms_sections_update.dspy", "/api/cms_sections_delete.dspy",
# CMS Categories CRUD
"/cms_categories_list", "/cms_categories_list/%",
"/api/cms_categories_create.dspy", "/api/cms_categories_update.dspy", "/api/cms_categories_delete.dspy",
# CMS Leads CRUD
"/cms_leads_list", "/cms_leads_list/%",
"/api/cms_leads_create.dspy", "/api/cms_leads_update.dspy", "/api/cms_leads_delete.dspy",
# CMS Site Config CRUD
"/cms_site_config_list", "/cms_site_config_list/%",
"/api/cms_site_config_create.dspy", "/api/cms_site_config_update.dspy", "/api/cms_site_config_delete.dspy",
]
SUPERUSER_ROLE_ID = 'r0ZHXa9vjGUHqkd4m_66w'
async def register_permissions():
config = getConfig('.')
db = DBPools(config.databases)
async with db.sqlorContext('ocai_cms') as sor:
cur = await sor.conn.cursor()
# Get existing permissions
await cur.execute("SELECT path FROM permission")
existing = {r[0] for r in await cur.fetchall()}
count = 0
for path in PATHS_SUPERUSER:
if path not in existing:
perm_id = getID()
await cur.execute(
"INSERT INTO permission (id, name, path) VALUES (%s, %s, %s)",
(perm_id, None, path)
)
existing.add(path)
print(f" + permission: {path}")
# Get permission ID and link to superuser role
await cur.execute("SELECT id FROM permission WHERE path = %s", (path,))
row = await cur.fetchone()
if row:
perm_id = row[0]
# Check if rolepermission already exists
await cur.execute(
"SELECT id FROM rolepermission WHERE roleid = %s AND permid = %s",
(SUPERUSER_ROLE_ID, perm_id)
)
if not await cur.fetchone():
rp_id = getID()
await cur.execute(
"INSERT INTO rolepermission (id, roleid, permid) VALUES (%s, %s, %s)",
(rp_id, SUPERUSER_ROLE_ID, perm_id)
)
count += 1
await sor.conn.commit()
await cur.close()
print(f"\nDone: {count} new rolepermission entries for owner.superuser")
if __name__ == "__main__":
print("=== Portal CMS RBAC 权限注册 ===")
asyncio.run(register_permissions())

View File

@ -0,0 +1,25 @@
{
"summary": [
{
"name": "cms_categories",
"title": "CMS分类表",
"primary": ["id"]
}
],
"fields": [
{"name": "id", "title": "ID", "type": "str", "length": 32, "nullable": "no", "comments": "主键ID"},
{"name": "org_id", "title": "组织ID", "type": "str", "length": 32, "nullable": "no", "comments": "所属组织"},
{"name": "name", "title": "分类名称", "type": "str", "length": 100, "nullable": "no", "comments": "分类名称"},
{"name": "parent_id", "title": "父分类ID", "type": "str", "length": 32, "nullable": "yes", "comments": "父分类ID空表示顶级"},
{"name": "content_type", "title": "内容类型", "type": "str", "length": 32, "nullable": "yes", "comments": "关联内容类型"},
{"name": "description", "title": "描述", "type": "str", "length": 500, "nullable": "yes", "comments": "分类描述"},
{"name": "sort_order", "title": "排序", "type": "int", "nullable": "yes", "default": "0", "comments": "排序序号"},
{"name": "created_at", "title": "创建时间", "type": "timestamp", "nullable": "no", "comments": "创建时间"},
{"name": "display_config", "title": "展示配置", "type": "text", "nullable": "yes", "comments": "展示配置JSON"}
],
"indexes": [
{"name": "idx_categories_org", "idxtype": "index", "idxfields": ["org_id"]},
{"name": "idx_categories_parent", "idxtype": "index", "idxfields": ["parent_id"]},
{"name": "idx_categories_type", "idxtype": "index", "idxfields": ["content_type"]}
]
}

35
models/cms_content.json Normal file
View File

@ -0,0 +1,35 @@
{
"summary": [
{
"name": "cms_content",
"title": "CMS内容表",
"primary": ["id"]
}
],
"fields": [
{"name": "id", "title": "ID", "type": "str", "length": 32, "nullable": "no", "comments": "主键ID"},
{"name": "org_id", "title": "组织ID", "type": "str", "length": 32, "nullable": "no", "comments": "所属组织"},
{"name": "content_type", "title": "内容类型", "type": "str", "length": 32, "nullable": "no", "comments": "news/product/case/banner"},
{"name": "category_id", "title": "分类ID", "type": "str", "length": 32, "nullable": "yes", "comments": "关联分类"},
{"name": "title", "title": "标题", "type": "str", "length": 200, "nullable": "no", "comments": "内容标题"},
{"name": "subtitle", "title": "副标题", "type": "str", "length": 200, "nullable": "yes", "comments": "副标题"},
{"name": "summary_text", "title": "摘要", "type": "text", "nullable": "yes", "comments": "内容摘要"},
{"name": "body", "title": "正文", "type": "text", "nullable": "yes", "comments": "正文内容(HTML)"},
{"name": "image_url", "title": "图片URL", "type": "str", "length": 500, "nullable": "yes", "comments": "封面图片URL"},
{"name": "tags", "title": "标签", "type": "str", "length": 500, "nullable": "yes", "comments": "标签,逗号分隔"},
{"name": "sort_order", "title": "排序", "type": "int", "nullable": "yes", "default": "0", "comments": "排序序号"},
{"name": "status", "title": "状态", "type": "str", "length": 20, "nullable": "no", "default": "draft", "comments": "draft/published/archived"},
{"name": "approval_id", "title": "审批ID", "type": "str", "length": 64, "nullable": "yes", "comments": "钉钉审批实例ID"},
{"name": "published_at", "title": "发布时间", "type": "timestamp", "nullable": "yes", "comments": "发布时间"},
{"name": "extra_json", "title": "扩展JSON", "type": "text", "nullable": "yes", "comments": "扩展属性JSON"},
{"name": "created_by", "title": "创建人", "type": "str", "length": 32, "nullable": "yes", "comments": "创建人ID"},
{"name": "created_at", "title": "创建时间", "type": "timestamp", "nullable": "no", "comments": "创建时间"},
{"name": "updated_at", "title": "更新时间", "type": "timestamp", "nullable": "no", "comments": "更新时间"}
],
"indexes": [
{"name": "idx_content_type", "idxtype": "index", "idxfields": ["content_type"]},
{"name": "idx_content_status", "idxtype": "index", "idxfields": ["status"]},
{"name": "idx_content_org", "idxtype": "index", "idxfields": ["org_id"]},
{"name": "idx_content_category", "idxtype": "index", "idxfields": ["category_id"]}
]
}

33
models/cms_leads.json Normal file
View File

@ -0,0 +1,33 @@
{
"summary": [
{
"name": "cms_leads",
"title": "CMS商机线索表",
"primary": ["id"]
}
],
"fields": [
{"name": "id", "title": "ID", "type": "str", "length": 32, "nullable": "no", "comments": "主键ID"},
{"name": "org_id", "title": "组织ID", "type": "str", "length": 32, "nullable": "no", "comments": "所属组织"},
{"name": "source", "title": "来源", "type": "str", "length": 50, "nullable": "yes", "comments": "来源: website/form/ai等"},
{"name": "name", "title": "联系人", "type": "str", "length": 100, "nullable": "yes", "comments": "联系人姓名"},
{"name": "company", "title": "公司", "type": "str", "length": 200, "nullable": "yes", "comments": "公司名称"},
{"name": "phone", "title": "电话", "type": "str", "length": 30, "nullable": "yes", "comments": "联系电话"},
{"name": "email", "title": "邮箱", "type": "str", "length": 200, "nullable": "yes", "comments": "电子邮箱"},
{"name": "industry", "title": "行业", "type": "str", "length": 100, "nullable": "yes", "comments": "所属行业"},
{"name": "region", "title": "地区", "type": "str", "length": 100, "nullable": "yes", "comments": "所在地区"},
{"name": "interest_products", "title": "意向产品", "type": "str", "length": 500, "nullable": "yes", "comments": "意向产品"},
{"name": "message", "title": "留言", "type": "text", "nullable": "yes", "comments": "访客留言内容"},
{"name": "raw_text", "title": "原始文本", "type": "text", "nullable": "yes", "comments": "AI抽取前的原始文本"},
{"name": "status", "title": "状态", "type": "str", "length": 20, "nullable": "no", "default": "new", "comments": "new/contacting/qualified/converted/closed"},
{"name": "assigned_to", "title": "负责人", "type": "str", "length": 32, "nullable": "yes", "comments": "分配给的销售人员ID"},
{"name": "notes", "title": "备注", "type": "text", "nullable": "yes", "comments": "跟进备注"},
{"name": "created_at", "title": "创建时间", "type": "timestamp", "nullable": "no", "comments": "创建时间"},
{"name": "updated_at", "title": "更新时间", "type": "timestamp", "nullable": "no", "comments": "更新时间"}
],
"indexes": [
{"name": "idx_leads_org", "idxtype": "index", "idxfields": ["org_id"]},
{"name": "idx_leads_status", "idxtype": "index", "idxfields": ["status"]},
{"name": "idx_leads_source", "idxtype": "index", "idxfields": ["source"]}
]
}

29
models/cms_sections.json Normal file
View File

@ -0,0 +1,29 @@
{
"summary": [
{
"name": "cms_sections",
"title": "CMS栏目表",
"primary": ["id"]
}
],
"fields": [
{"name": "id", "title": "ID", "type": "str", "length": 32, "nullable": "no", "comments": "主键ID"},
{"name": "org_id", "title": "组织ID", "type": "str", "length": 32, "nullable": "no", "comments": "所属组织"},
{"name": "section_key", "title": "栏目Key", "type": "str", "length": 64, "nullable": "no", "comments": "栏目唯一标识"},
{"name": "title", "title": "标题", "type": "str", "length": 100, "nullable": "no", "comments": "栏目标题"},
{"name": "subtitle", "title": "副标题", "type": "str", "length": 200, "nullable": "yes", "comments": "栏目副标题"},
{"name": "section_type", "title": "栏目类型", "type": "str", "length": 32, "nullable": "yes", "comments": "栏目类型: hero/features/list/cta等"},
{"name": "content_type", "title": "内容类型", "type": "str", "length": 32, "nullable": "yes", "comments": "关联内容类型: news/product/case/banner"},
{"name": "sort_order", "title": "排序", "type": "int", "nullable": "yes", "default": "0", "comments": "排序序号"},
{"name": "is_visible", "title": "是否可见", "type": "str", "length": 1, "nullable": "no", "default": "1", "comments": "1=显示,0=隐藏"},
{"name": "display_config", "title": "展示配置", "type": "text", "nullable": "yes", "comments": "展示配置JSON"},
{"name": "style_config", "title": "样式配置", "type": "text", "nullable": "yes", "comments": "样式配置JSON"},
{"name": "static_content", "title": "静态内容", "type": "text", "nullable": "yes", "comments": "静态HTML内容"},
{"name": "created_at", "title": "创建时间", "type": "timestamp", "nullable": "no", "comments": "创建时间"},
{"name": "updated_at", "title": "更新时间", "type": "timestamp", "nullable": "no", "comments": "更新时间"}
],
"indexes": [
{"name": "idx_sections_org", "idxtype": "index", "idxfields": ["org_id"]},
{"name": "idx_sections_key", "idxtype": "unique", "idxfields": ["org_id", "section_key"]}
]
}

View File

@ -0,0 +1,23 @@
{
"summary": [
{
"name": "cms_site_config",
"title": "CMS站点配置表",
"primary": ["id"]
}
],
"fields": [
{"name": "id", "title": "ID", "type": "str", "length": 32, "nullable": "no", "comments": "主键ID"},
{"name": "org_id", "title": "组织ID", "type": "str", "length": 32, "nullable": "no", "comments": "所属组织"},
{"name": "config_group", "title": "配置组", "type": "str", "length": 50, "nullable": "no", "comments": "配置分组: header/footer/contact/seo等"},
{"name": "config_key", "title": "配置键", "type": "str", "length": 100, "nullable": "no", "comments": "配置键名"},
{"name": "config_value", "title": "配置值", "type": "text", "nullable": "yes", "comments": "配置值"},
{"name": "config_type", "title": "值类型", "type": "str", "length": 20, "nullable": "yes", "default": "text", "comments": "text/number/json/bool/image"},
{"name": "sort_order", "title": "排序", "type": "int", "nullable": "yes", "default": "0", "comments": "排序序号"},
{"name": "updated_at", "title": "更新时间", "type": "timestamp", "nullable": "no", "comments": "更新时间"}
],
"indexes": [
{"name": "idx_site_config_org", "idxtype": "index", "idxfields": ["org_id"]},
{"name": "idx_site_config_key", "idxtype": "unique", "idxfields": ["org_id", "config_group", "config_key"]}
]
}

97
plugins/cms_functions.py Normal file
View File

@ -0,0 +1,97 @@
"""
CMS Jinja2 模板函数插件
注册到 ServerEnv index.ui 等模板使用
函数:
get_site_config() dict
get_published_content(content_type, limit) list[dict]
get_latest_news(limit) list[dict]
"""
from ahserver.serverenv import ServerEnv
from sqlor.dbpools import DBPools
from appPublic.jsonConfig import getConfig
import os
_workdir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
_config = None
_db = None
def _get_db():
global _config, _db
if _db is None:
_config = getConfig(_workdir)
_db = DBPools(_config.databases)
return _db
async def get_site_config():
"""获取站点配置"""
try:
db = _get_db()
async with db.sqlorContext('ocai_cms') as sor:
rows = await sor.sqlExe(
"SELECT config_key, config_value FROM cms_site_config", {}
)
cfg = {}
for r in rows:
cfg[r['config_key']] = r['config_value']
return cfg
except Exception:
return {}
async def get_published_content(content_type, limit=10):
"""获取已发布内容"""
try:
db = _get_db()
async with db.sqlorContext('ocai_cms') as sor:
rows = await sor.sqlExe(
"SELECT c.id, c.title, c.subtitle, c.summary_text, c.image_url, "
"c.tags, c.body, cat.name as category_name "
"FROM cms_content c "
"LEFT JOIN cms_categories cat ON c.category_id = cat.id "
"WHERE c.content_type = ${ct}$ AND c.status = 'published' "
"ORDER BY c.sort_order, c.created_at DESC "
"LIMIT ${lim}$",
{"ct": content_type, "lim": int(limit)}
)
return list(rows)
except Exception:
return []
async def get_latest_news(limit=3):
"""获取最新新闻"""
try:
db = _get_db()
async with db.sqlorContext('ocai_cms') as sor:
rows = await sor.sqlExe(
"SELECT c.id, c.title, c.subtitle, c.summary_text, c.image_url, "
"c.published_at, cat.name as category_name "
"FROM cms_content c "
"LEFT JOIN cms_categories cat ON c.category_id = cat.id "
"WHERE c.content_type = 'news' AND c.status = 'published' "
"ORDER BY c.published_at DESC, c.created_at DESC "
"LIMIT ${lim}$",
{"lim": int(limit)}
)
return list(rows)
except Exception:
return []
def get_module_dbname(module_name):
"""Portal 所有模块共用 ocai_cms 数据库"""
return 'ocai_cms'
def load_cms():
g = ServerEnv()
g.get_site_config = get_site_config
g.get_published_content = get_published_content
g.get_latest_news = get_latest_news
g.get_module_dbname = get_module_dbname
load_cms()

14
start.py Normal file
View File

@ -0,0 +1,14 @@
#!/usr/bin/env python3
"""Portal启动脚本"""
import os
import sys
# 使用venv的ahserver
sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'pkgs'))
from ahserver.configuredServer import ConfiguredServer
from ahserver.auth_api import AuthAPI
if __name__ == '__main__':
server = ConfiguredServer(AuthAPI, workdir=os.path.dirname(os.path.abspath(__file__)))
server.run()

18
start.sh Executable file
View File

@ -0,0 +1,18 @@
#!/usr/bin/env bash
set -e
WORKDIR="$(cd "$(dirname "$0")" && pwd)"
cd "$WORKDIR"
if [ -f portal.pid ]; then
pid=$(cat portal.pid)
if kill -0 "$pid" 2>/dev/null; then
echo "Already running (PID $pid)"
exit 0
fi
rm -f portal.pid
fi
echo "Starting portal on port 9090..."
$WORKDIR/py3/bin/python $WORKDIR/app/portal.py -p 9090 -w $WORKDIR >> $WORKDIR/logs/portal.log 2>&1 &
echo $! > portal.pid
echo "Started PID $(cat portal.pid)"

16
stop.sh Executable file
View File

@ -0,0 +1,16 @@
#!/usr/bin/env bash
WORKDIR="$(cd "$(dirname "$0")" && pwd)"
cd "$WORKDIR"
if [ -f portal.pid ]; then
pid=$(cat portal.pid)
if kill -0 "$pid" 2>/dev/null; then
kill "$pid"
echo "Stopped PID $pid"
else
echo "Process $pid not running"
fi
rm -f portal.pid
else
echo "No pid file found"
fi

322
wwwroot/admin.ui Normal file
View File

@ -0,0 +1,322 @@
{
"widgettype": "VBox",
"options": {
"width": "100%",
"height": "100%",
"padding": "20px"
},
"subwidgets": [
{
"widgettype": "Text",
"options": {
"text": "企业CMS管理后台",
"fontSize": "24px",
"fontWeight": "bold",
"css": "title"
}
},
{
"widgettype": "Text",
"options": {
"text": "管理官网内容、分类、商机线索和站点配置",
"fontSize": "14px",
"color": "#999",
"css": "subtitle"
}
},
{
"widgettype": "ResponsableBox",
"options": {
"gap": "16px",
"minWidth": "220px",
"css": "admin-cards"
},
"subwidgets": [
{
"widgettype": "Button",
"options": {
"css": "card",
"padding": "20px",
"borderRadius": "12px",
"border": "none"
},
"binds": [
{
"wid": "self",
"event": "click",
"actiontype": "urlwidget",
"target": "app.sage_main_content",
"options": {
"url": "{{entire_url('/cms_content_list')}}"
},
"mode": "replace"
}
],
"subwidgets": [
{
"widgettype": "VBox",
"options": {
"alignItems": "flex-start",
"gap": "8px"
},
"subwidgets": [
{
"widgettype": "Text",
"options": {
"text": "📝",
"fontSize": "32px"
}
},
{
"widgettype": "Text",
"options": {
"text": "内容管理",
"fontSize": "18px",
"fontWeight": "bold"
}
},
{
"widgettype": "Text",
"options": {
"text": "新闻、案例、产品、Banner",
"fontSize": "13px",
"color": "#999"
}
}
]
}
]
},
{
"widgettype": "Button",
"options": {
"css": "card",
"padding": "20px",
"borderRadius": "12px",
"border": "none"
},
"binds": [
{
"wid": "self",
"event": "click",
"actiontype": "urlwidget",
"target": "app.sage_main_content",
"options": {
"url": "{{entire_url('/cms_sections_list')}}"
},
"mode": "replace"
}
],
"subwidgets": [
{
"widgettype": "VBox",
"options": {
"alignItems": "flex-start",
"gap": "8px"
},
"subwidgets": [
{
"widgettype": "Text",
"options": {
"text": "🎨",
"fontSize": "32px"
}
},
{
"widgettype": "Text",
"options": {
"text": "栏目管理",
"fontSize": "18px",
"fontWeight": "bold"
}
},
{
"widgettype": "Text",
"options": {
"text": "栏目排序、显示隐藏、展示风格",
"fontSize": "13px",
"color": "#999"
}
}
]
}
]
},
{
"widgettype": "Button",
"options": {
"css": "card",
"padding": "20px",
"borderRadius": "12px",
"border": "none"
},
"binds": [
{
"wid": "self",
"event": "click",
"actiontype": "urlwidget",
"target": "app.sage_main_content",
"options": {
"url": "{{entire_url('/cms_categories_list')}}"
},
"mode": "replace"
}
],
"subwidgets": [
{
"widgettype": "VBox",
"options": {
"alignItems": "flex-start",
"gap": "8px"
},
"subwidgets": [
{
"widgettype": "Text",
"options": {
"text": "📂",
"fontSize": "32px"
}
},
{
"widgettype": "Text",
"options": {
"text": "内容分类",
"fontSize": "18px",
"fontWeight": "bold"
}
},
{
"widgettype": "Text",
"options": {
"text": "管理产品分类、案例行业、新闻栏目",
"fontSize": "13px",
"color": "#999"
}
}
]
}
]
},
{
"widgettype": "Button",
"options": {
"css": "card",
"padding": "20px",
"borderRadius": "12px",
"border": "none"
},
"binds": [
{
"wid": "self",
"event": "click",
"actiontype": "urlwidget",
"target": "app.sage_main_content",
"options": {
"url": "{{entire_url('/cms_leads_list')}}"
},
"mode": "replace"
}
],
"subwidgets": [
{
"widgettype": "VBox",
"options": {
"alignItems": "flex-start",
"gap": "8px"
},
"subwidgets": [
{
"widgettype": "Text",
"options": {
"text": "🎯",
"fontSize": "32px"
}
},
{
"widgettype": "Text",
"options": {
"text": "商机线索",
"fontSize": "18px",
"fontWeight": "bold"
}
},
{
"widgettype": "Text",
"options": {
"text": "访客留言、AI抽取商机",
"fontSize": "13px",
"color": "#999"
}
}
]
}
]
},
{
"widgettype": "Button",
"options": {
"css": "card",
"padding": "20px",
"borderRadius": "12px",
"border": "none"
},
"binds": [
{
"wid": "self",
"event": "click",
"actiontype": "urlwidget",
"target": "app.sage_main_content",
"options": {
"url": "{{entire_url('/cms_site_config_list')}}"
},
"mode": "replace"
}
],
"subwidgets": [
{
"widgettype": "VBox",
"options": {
"alignItems": "flex-start",
"gap": "8px"
},
"subwidgets": [
{
"widgettype": "Text",
"options": {
"text": "⚙️",
"fontSize": "32px"
}
},
{
"widgettype": "Text",
"options": {
"text": "站点配置",
"fontSize": "18px",
"fontWeight": "bold"
}
},
{
"widgettype": "Text",
"options": {
"text": "首屏标语、页脚信息、联系方式",
"fontSize": "13px",
"color": "#999"
}
}
]
}
]
}
]
},
{
"widgettype": "VBox",
"id": "sage_main_content",
"options": {
"width": "100%",
"flex": "1",
"marginTop": "20px"
}
}
]
}

View File

@ -0,0 +1,30 @@
user_id = await get_user()
if not user_id:
return json.dumps({'status': 'error', 'message': '未登录'}, ensure_ascii=False)
org_id = params_kw.get('org_id', '')
if not org_id:
org_id = (await get_userorgid()) or '0'
now = curDateString()
data = {
'id': getID(),
'org_id': org_id,
'name': params_kw.get('name', ''),
'parent_id': params_kw.get('parent_id', ''),
'content_type': params_kw.get('content_type', ''),
'description': params_kw.get('description', ''),
'sort_order': int(params_kw.get('sort_order', '0') or '0'),
'created_at': now,
'display_config': params_kw.get('display_config', ''),
}
if not data['name']:
return json.dumps({'status': 'error', 'message': '分类名称不能为空'}, ensure_ascii=False)
try:
async with get_sor_context(request._run_ns, 'ocai_cms') as sor:
await sor.I('cms_categories', data)
return json.dumps({'status': 'ok', 'id': data['id']}, ensure_ascii=False)
except Exception as e:
return json.dumps({'status': 'error', 'message': str(e)}, ensure_ascii=False)

View File

@ -0,0 +1,14 @@
user_id = await get_user()
if not user_id:
return json.dumps({'status': 'error', 'message': '未登录'}, ensure_ascii=False)
rec_id = params_kw.get('id', '')
if not rec_id:
return json.dumps({'status': 'error', 'message': '缺少id'}, ensure_ascii=False)
try:
async with get_sor_context(request._run_ns, 'ocai_cms') as sor:
await sor.D('cms_categories', {'id': rec_id})
return json.dumps({'status': 'ok'}, ensure_ascii=False)
except Exception as e:
return json.dumps({'status': 'error', 'message': str(e)}, ensure_ascii=False)

View File

@ -0,0 +1,21 @@
user_id = await get_user()
if not user_id:
return json.dumps({'status': 'error', 'message': '未登录'}, ensure_ascii=False)
rec_id = params_kw.get('id', '')
if not rec_id:
return json.dumps({'status': 'error', 'message': '缺少id'}, ensure_ascii=False)
data = {'id': rec_id}
for field in ['name', 'parent_id', 'content_type', 'description', 'display_config']:
if field in params_kw:
data[field] = params_kw[field]
if 'sort_order' in params_kw:
data['sort_order'] = int(params_kw['sort_order'] or '0')
try:
async with get_sor_context(request._run_ns, 'ocai_cms') as sor:
await sor.U('cms_categories', data)
return json.dumps({'status': 'ok'}, ensure_ascii=False)
except Exception as e:
return json.dumps({'status': 'error', 'message': str(e)}, ensure_ascii=False)

View File

@ -0,0 +1,39 @@
user_id = await get_user()
if not user_id:
return json.dumps({'status': 'error', 'message': '未登录'}, ensure_ascii=False)
org_id = params_kw.get('org_id', '')
if not org_id:
org_id = (await get_userorgid()) or '0'
now = curDateString()
data = {
'id': getID(),
'org_id': org_id,
'content_type': params_kw.get('content_type', ''),
'category_id': params_kw.get('category_id', ''),
'title': params_kw.get('title', ''),
'subtitle': params_kw.get('subtitle', ''),
'summary_text': params_kw.get('summary_text', ''),
'body': params_kw.get('body', ''),
'image_url': params_kw.get('image_url', ''),
'tags': params_kw.get('tags', ''),
'sort_order': int(params_kw.get('sort_order', '0') or '0'),
'status': params_kw.get('status', 'draft'),
'approval_id': params_kw.get('approval_id', ''),
'published_at': params_kw.get('published_at', '') or None,
'extra_json': params_kw.get('extra_json', ''),
'created_by': user_id,
'created_at': now,
'updated_at': now,
}
if not data['title']:
return json.dumps({'status': 'error', 'message': '标题不能为空'}, ensure_ascii=False)
try:
async with get_sor_context(request._run_ns, 'ocai_cms') as sor:
await sor.I('cms_content', data)
return json.dumps({'status': 'ok', 'id': data['id']}, ensure_ascii=False)
except Exception as e:
return json.dumps({'status': 'error', 'message': str(e)}, ensure_ascii=False)

View File

@ -0,0 +1,14 @@
user_id = await get_user()
if not user_id:
return json.dumps({'status': 'error', 'message': '未登录'}, ensure_ascii=False)
rec_id = params_kw.get('id', '')
if not rec_id:
return json.dumps({'status': 'error', 'message': '缺少id'}, ensure_ascii=False)
try:
async with get_sor_context(request._run_ns, 'ocai_cms') as sor:
await sor.D('cms_content', {'id': rec_id})
return json.dumps({'status': 'ok'}, ensure_ascii=False)
except Exception as e:
return json.dumps({'status': 'error', 'message': str(e)}, ensure_ascii=False)

View File

@ -0,0 +1,24 @@
user_id = await get_user()
if not user_id:
return json.dumps({'status': 'error', 'message': '未登录'}, ensure_ascii=False)
rec_id = params_kw.get('id', '')
if not rec_id:
return json.dumps({'status': 'error', 'message': '缺少id'}, ensure_ascii=False)
data = {'id': rec_id, 'updated_at': curDateString()}
for field in ['content_type', 'category_id', 'title', 'subtitle', 'summary_text',
'body', 'image_url', 'tags', 'status', 'approval_id', 'extra_json']:
if field in params_kw:
data[field] = params_kw[field]
if 'sort_order' in params_kw:
data['sort_order'] = int(params_kw['sort_order'] or '0')
if 'published_at' in params_kw:
data['published_at'] = params_kw['published_at'] or None
try:
async with get_sor_context(request._run_ns, 'ocai_cms') as sor:
await sor.U('cms_content', data)
return json.dumps({'status': 'ok'}, ensure_ascii=False)
except Exception as e:
return json.dumps({'status': 'error', 'message': str(e)}, ensure_ascii=False)

View File

@ -0,0 +1,35 @@
user_id = await get_user()
if not user_id:
return json.dumps({'status': 'error', 'message': '未登录'}, ensure_ascii=False)
org_id = params_kw.get('org_id', '')
if not org_id:
org_id = (await get_userorgid()) or '0'
now = curDateString()
data = {
'id': getID(),
'org_id': org_id,
'source': params_kw.get('source', 'website'),
'name': params_kw.get('name', ''),
'company': params_kw.get('company', ''),
'phone': params_kw.get('phone', ''),
'email': params_kw.get('email', ''),
'industry': params_kw.get('industry', ''),
'region': params_kw.get('region', ''),
'interest_products': params_kw.get('interest_products', ''),
'message': params_kw.get('message', ''),
'raw_text': params_kw.get('raw_text', ''),
'status': params_kw.get('status', 'new'),
'assigned_to': params_kw.get('assigned_to', ''),
'notes': params_kw.get('notes', ''),
'created_at': now,
'updated_at': now,
}
try:
async with get_sor_context(request._run_ns, 'ocai_cms') as sor:
await sor.I('cms_leads', data)
return json.dumps({'status': 'ok', 'id': data['id']}, ensure_ascii=False)
except Exception as e:
return json.dumps({'status': 'error', 'message': str(e)}, ensure_ascii=False)

View File

@ -0,0 +1,14 @@
user_id = await get_user()
if not user_id:
return json.dumps({'status': 'error', 'message': '未登录'}, ensure_ascii=False)
rec_id = params_kw.get('id', '')
if not rec_id:
return json.dumps({'status': 'error', 'message': '缺少id'}, ensure_ascii=False)
try:
async with get_sor_context(request._run_ns, 'ocai_cms') as sor:
await sor.D('cms_leads', {'id': rec_id})
return json.dumps({'status': 'ok'}, ensure_ascii=False)
except Exception as e:
return json.dumps({'status': 'error', 'message': str(e)}, ensure_ascii=False)

View File

@ -0,0 +1,20 @@
user_id = await get_user()
if not user_id:
return json.dumps({'status': 'error', 'message': '未登录'}, ensure_ascii=False)
rec_id = params_kw.get('id', '')
if not rec_id:
return json.dumps({'status': 'error', 'message': '缺少id'}, ensure_ascii=False)
data = {'id': rec_id, 'updated_at': curDateString()}
for field in ['source', 'name', 'company', 'phone', 'email', 'industry', 'region',
'interest_products', 'message', 'raw_text', 'status', 'assigned_to', 'notes']:
if field in params_kw:
data[field] = params_kw[field]
try:
async with get_sor_context(request._run_ns, 'ocai_cms') as sor:
await sor.U('cms_leads', data)
return json.dumps({'status': 'ok'}, ensure_ascii=False)
except Exception as e:
return json.dumps({'status': 'error', 'message': str(e)}, ensure_ascii=False)

View File

@ -0,0 +1,35 @@
user_id = await get_user()
if not user_id:
return json.dumps({'status': 'error', 'message': '未登录'}, ensure_ascii=False)
org_id = params_kw.get('org_id', '')
if not org_id:
org_id = (await get_userorgid()) or '0'
now = curDateString()
data = {
'id': getID(),
'org_id': org_id,
'section_key': params_kw.get('section_key', ''),
'title': params_kw.get('title', ''),
'subtitle': params_kw.get('subtitle', ''),
'section_type': params_kw.get('section_type', ''),
'content_type': params_kw.get('content_type', ''),
'sort_order': int(params_kw.get('sort_order', '0') or '0'),
'is_visible': params_kw.get('is_visible', '1'),
'display_config': params_kw.get('display_config', ''),
'style_config': params_kw.get('style_config', ''),
'static_content': params_kw.get('static_content', ''),
'created_at': now,
'updated_at': now,
}
if not data['section_key'] or not data['title']:
return json.dumps({'status': 'error', 'message': '栏目Key和标题不能为空'}, ensure_ascii=False)
try:
async with get_sor_context(request._run_ns, 'ocai_cms') as sor:
await sor.I('cms_sections', data)
return json.dumps({'status': 'ok', 'id': data['id']}, ensure_ascii=False)
except Exception as e:
return json.dumps({'status': 'error', 'message': str(e)}, ensure_ascii=False)

View File

@ -0,0 +1,14 @@
user_id = await get_user()
if not user_id:
return json.dumps({'status': 'error', 'message': '未登录'}, ensure_ascii=False)
rec_id = params_kw.get('id', '')
if not rec_id:
return json.dumps({'status': 'error', 'message': '缺少id'}, ensure_ascii=False)
try:
async with get_sor_context(request._run_ns, 'ocai_cms') as sor:
await sor.D('cms_sections', {'id': rec_id})
return json.dumps({'status': 'ok'}, ensure_ascii=False)
except Exception as e:
return json.dumps({'status': 'error', 'message': str(e)}, ensure_ascii=False)

View File

@ -0,0 +1,22 @@
user_id = await get_user()
if not user_id:
return json.dumps({'status': 'error', 'message': '未登录'}, ensure_ascii=False)
rec_id = params_kw.get('id', '')
if not rec_id:
return json.dumps({'status': 'error', 'message': '缺少id'}, ensure_ascii=False)
data = {'id': rec_id, 'updated_at': curDateString()}
for field in ['section_key', 'title', 'subtitle', 'section_type', 'content_type',
'is_visible', 'display_config', 'style_config', 'static_content']:
if field in params_kw:
data[field] = params_kw[field]
if 'sort_order' in params_kw:
data['sort_order'] = int(params_kw['sort_order'] or '0')
try:
async with get_sor_context(request._run_ns, 'ocai_cms') as sor:
await sor.U('cms_sections', data)
return json.dumps({'status': 'ok'}, ensure_ascii=False)
except Exception as e:
return json.dumps({'status': 'error', 'message': str(e)}, ensure_ascii=False)

View File

@ -0,0 +1,29 @@
user_id = await get_user()
if not user_id:
return json.dumps({'status': 'error', 'message': '未登录'}, ensure_ascii=False)
org_id = params_kw.get('org_id', '')
if not org_id:
org_id = (await get_userorgid()) or '0'
now = curDateString()
data = {
'id': getID(),
'org_id': org_id,
'config_group': params_kw.get('config_group', ''),
'config_key': params_kw.get('config_key', ''),
'config_value': params_kw.get('config_value', ''),
'config_type': params_kw.get('config_type', 'text'),
'sort_order': int(params_kw.get('sort_order', '0') or '0'),
'updated_at': now,
}
if not data['config_group'] or not data['config_key']:
return json.dumps({'status': 'error', 'message': '配置组和配置键不能为空'}, ensure_ascii=False)
try:
async with get_sor_context(request._run_ns, 'ocai_cms') as sor:
await sor.I('cms_site_config', data)
return json.dumps({'status': 'ok', 'id': data['id']}, ensure_ascii=False)
except Exception as e:
return json.dumps({'status': 'error', 'message': str(e)}, ensure_ascii=False)

View File

@ -0,0 +1,14 @@
user_id = await get_user()
if not user_id:
return json.dumps({'status': 'error', 'message': '未登录'}, ensure_ascii=False)
rec_id = params_kw.get('id', '')
if not rec_id:
return json.dumps({'status': 'error', 'message': '缺少id'}, ensure_ascii=False)
try:
async with get_sor_context(request._run_ns, 'ocai_cms') as sor:
await sor.D('cms_site_config', {'id': rec_id})
return json.dumps({'status': 'ok'}, ensure_ascii=False)
except Exception as e:
return json.dumps({'status': 'error', 'message': str(e)}, ensure_ascii=False)

View File

@ -0,0 +1,21 @@
user_id = await get_user()
if not user_id:
return json.dumps({'status': 'error', 'message': '未登录'}, ensure_ascii=False)
rec_id = params_kw.get('id', '')
if not rec_id:
return json.dumps({'status': 'error', 'message': '缺少id'}, ensure_ascii=False)
data = {'id': rec_id, 'updated_at': curDateString()}
for field in ['config_group', 'config_key', 'config_value', 'config_type']:
if field in params_kw:
data[field] = params_kw[field]
if 'sort_order' in params_kw:
data['sort_order'] = int(params_kw['sort_order'] or '0')
try:
async with get_sor_context(request._run_ns, 'ocai_cms') as sor:
await sor.U('cms_site_config', data)
return json.dumps({'status': 'ok'}, ensure_ascii=False)
except Exception as e:
return json.dumps({'status': 'error', 'message': str(e)}, ensure_ascii=False)

View File

@ -0,0 +1,18 @@
config = getConfig('.')
DBPools(config.databases)
dbname = get_module_dbname('cms')
async with db.sqlorContext(dbname) as sor:
group = params_kw.get('group', None)
ns = {'sort': 'sort_order asc'}
if group:
ns['config_group'] = group
rows = await sor.R('cms_site_config', ns)
result = {}
for r in rows:
g = r.get('config_group', '')
if g not in result:
result[g] = {}
result[g][r.get('config_key', '')] = r.get('config_value', '')
return {'status': 'ok', 'data': result}

View File

@ -0,0 +1,16 @@
config = getConfig('.')
DBPools(config.databases)
dbname = get_module_dbname('cms')
async with db.sqlorContext(dbname) as sor:
_id = params_kw.get('id', '')
if not _id:
return {'status': 'error', 'message': '缺少ID'}
else:
ns = {'id': _id}
rows = await sor.R('cms_content', ns)
if rows:
return {'status': 'ok', 'data': rows[0]}
else:
return {'status': 'error', 'message': '内容不存在'}

View File

@ -0,0 +1,15 @@
config = getConfig('.')
DBPools(config.databases)
dbname = get_module_dbname('cms')
async with db.sqlorContext(dbname) as sor:
content_type = params_kw.get('content_type', None)
limit = int(params_kw.get('limit', '10'))
ns = {'status': 'published', 'sort': 'sort_order asc, published_at desc'}
if content_type:
ns['content_type'] = content_type
rows = await sor.R('cms_content', ns)
if limit:
rows = rows[:limit]
return {'status': 'ok', 'rows': rows, 'total': len(rows)}

View File

@ -0,0 +1,9 @@
result = [{'value': '', 'text': '全部分类'}]
try:
async with get_sor_context(request._run_ns, 'ocai_cms') as sor:
rows = await sor.sqlExe("select id as value, name as text from cms_categories order by sort_order asc, created_at desc", {})
result = [{'value': '', 'text': '全部分类'}] + list(rows)
return json.dumps(result, ensure_ascii=False)
except Exception as e:
debug(f'search categories error: {e}')
return json.dumps(result, ensure_ascii=False)

View File

@ -0,0 +1,8 @@
result = [
{'value': '', 'text': '全部类型'},
{'value': 'news', 'text': '新闻'},
{'value': 'product', 'text': '产品'},
{'value': 'case', 'text': '案例'},
{'value': 'banner', 'text': 'Banner'}
]
return json.dumps(result, ensure_ascii=False)

View File

@ -0,0 +1,18 @@
config = getConfig('.')
DBPools(config.databases)
dbname = get_module_dbname('cms')
async with db.sqlorContext(dbname) as sor:
ns = {'is_visible': '1', 'sort': 'sort_order asc'}
rows = await sor.R('cms_sections', ns)
# Parse JSON fields
for r in rows:
for field in ['display_config', 'style_config', 'static_content']:
v = r.get(field, None)
if v and isinstance(v, str):
try:
r[field] = json.loads(v)
except:
pass
return {'status': 'ok', 'rows': rows, 'total': len(rows)}

View File

@ -0,0 +1,22 @@
config = getConfig('.')
DBPools(config.databases)
dbname = get_module_dbname('cms')
async with db.sqlorContext(dbname) as sor:
data = {
'id': getID(),
'source': 'website',
'status': 'new',
'org_id': '0'
}
for field in ['name', 'company', 'phone', 'email', 'industry', 'region',
'interest_products', 'message']:
v = params_kw.get(field, None)
if v is not None:
data[field] = v
await sor.C('cms_leads', data)
return {
'widgettype': 'Message',
'options': {'text': '感谢您的留言,我们会尽快联系您!', 'messagetype': 'success'}
}

13
wwwroot/cases.ui Normal file
View File

@ -0,0 +1,13 @@
{% set all_cases = get_published_content('case', 20) %}
{
"widgettype": "VBox",
"options": {"width": "100%", "css": "site-root"},
"subwidgets": [
{
"widgettype": "Html",
"options": {
"html": "<nav class=\"nav-bar\"><a class=\"nav-logo\" href=\"{{entire_url('index.ui')}}\">开元云科技<\/a><ul class=\"nav-links\"><li><a href=\"{{entire_url('index.ui')}}#products\">产品架构<\/a><\/li><li><a href=\"{{entire_url('index.ui')}}#cases\">成功案例<\/a><\/li><li><a href=\"{{entire_url('news.ui')}}\">企业动态<\/a><\/li><\/ul><\/nav><section class=\"section\" style=\"padding-top:100px\"><h2 class=\"section-title\">成功案例<\/h2><p class=\"section-desc\">AI正在改变千行百业<\/p><div class=\"cases-grid\">{% for c in all_cases %}<div class=\"case-card\"><div class=\"case-tag\">{{c.tags or '行业案例'}}<\/div><div class=\"case-title\">{{c.title}}<\/div><div class=\"case-desc\">{{c.summary_text}}<\/div><\/div>{% endfor %}<\/div><div class=\"cta-banner\" style=\"margin-top:40px\"><div class=\"cta-text\">想了解这些方案如何落地?<\/div><a class=\"btn-primary\" href=\"{{entire_url('index.ui')}}#contact\">了解更多 → 联系销售<\/a><\/div><\/section><footer class=\"site-footer\"><p>© 2026 开元云科技 · 国家级高新技术企业 · 专精特新企业<\/p><\/footer>"
}
}
]
}

153
wwwroot/cms_scripts.js Normal file
View File

@ -0,0 +1,153 @@
/* ===== 开元云科技 官网交互脚本 ===== */
document.addEventListener('DOMContentLoaded', function() {
initScrollAnimations();
initProductCards();
initFloatingWidget();
initSmoothScroll();
});
/* === Scroll Fade-in Animations === */
function initScrollAnimations() {
var elements = document.querySelectorAll('.fade-in');
if (!elements.length) return;
var observer = new IntersectionObserver(function(entries) {
entries.forEach(function(entry) {
if (entry.isIntersecting) {
entry.target.classList.add('visible');
}
});
}, { threshold: 0.1 });
elements.forEach(function(el) { observer.observe(el); });
}
/* === Product Card Expand === */
function initProductCards() {
var cards = document.querySelectorAll('.product-card');
cards.forEach(function(card) {
card.addEventListener('click', function() {
var wasActive = card.classList.contains('active');
// Close all
cards.forEach(function(c) { c.classList.remove('active'); });
// Toggle current
if (!wasActive) {
card.classList.add('active');
}
});
});
}
/* === Floating Contact Widget === */
function initFloatingWidget() {
var avatar = document.querySelector('.float-avatar');
var panel = document.querySelector('.float-panel');
if (!avatar || !panel) return;
avatar.addEventListener('click', function(e) {
e.stopPropagation();
panel.classList.toggle('active');
});
// Close panel on outside click
document.addEventListener('click', function(e) {
if (!panel.contains(e.target) && !avatar.contains(e.target)) {
panel.classList.remove('active');
}
});
// Panel option clicks -> show form
var options = panel.querySelectorAll('.panel-option');
options.forEach(function(opt) {
opt.addEventListener('click', function() {
var formType = opt.getAttribute('data-form');
var panelBody = panel.querySelector('.panel-body');
var panelForm = panel.querySelector('.panel-form');
if (panelBody) panelBody.style.display = 'none';
if (panelForm) {
panelForm.classList.add('active');
panelForm.setAttribute('data-type', formType);
}
});
});
// Back button
var backBtn = panel.querySelector('.back-btn');
if (backBtn) {
backBtn.addEventListener('click', function() {
var panelBody = panel.querySelector('.panel-body');
var panelForm = panel.querySelector('.panel-form');
if (panelBody) panelBody.style.display = 'block';
if (panelForm) panelForm.classList.remove('active');
});
}
// Form submit
var submitBtn = panel.querySelector('.submit-btn');
if (submitBtn) {
submitBtn.addEventListener('click', function(e) {
e.preventDefault();
var form = panel.querySelector('.panel-form');
var name = form.querySelector('[name="name"]');
var phone = form.querySelector('[name="phone"]');
var company = form.querySelector('[name="company"]');
var message = form.querySelector('[name="message"]');
if (!phone || !phone.value.trim()) {
alert('请填写联系电话');
return;
}
var data = {
name: name ? name.value : '',
phone: phone ? phone.value : '',
company: company ? company.value : '',
message: message ? message.value : '',
interest_products: form.getAttribute('data-type') || ''
};
// Submit via fetch
var submitUrl = form.getAttribute('data-submit-url');
if (!submitUrl) {
alert('提交成功,我们会尽快联系您!');
panel.classList.remove('active');
return;
}
fetch(submitUrl, {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify(data)
})
.then(function(r) { return r.json(); })
.then(function(resp) {
alert('感谢您的留言,我们会尽快联系您!');
panel.classList.remove('active');
// Reset form
if (name) name.value = '';
if (phone) phone.value = '';
if (company) company.value = '';
if (message) message.value = '';
})
.catch(function(err) {
console.error('Submit error:', err);
alert('提交失败,请稍后重试');
});
});
}
}
/* === Smooth Scroll for Nav Links === */
function initSmoothScroll() {
var links = document.querySelectorAll('.nav-links a[href^="#"]');
links.forEach(function(link) {
link.addEventListener('click', function(e) {
var target = document.querySelector(this.getAttribute('href'));
if (target) {
e.preventDefault();
target.scrollIntoView({ behavior: 'smooth', block: 'start' });
}
});
});
}

1061
wwwroot/cms_styles.css Normal file

File diff suppressed because it is too large Load Diff

222
wwwroot/i18n/en/i18n.json Normal file
View File

@ -0,0 +1,222 @@
{
"1 个 AI 平台": "1 AI Platform",
"1+N+X 产品架构": "1+N+X Product Architecture",
"AI抽取": "AI Extraction",
"AI视觉检测替代人工质检缺陷识别准确率达99.7%产线效率提升40%": "AI visual inspection replaces manual QC, defect recognition accuracy reaches 99.7%, production line efficiency improved by 40%",
"API Key管理": "API Key Management",
"Add Error": "Add Error",
"Add Success": "Add Success",
"Authorization Error": "Authorization Error",
"Banner": "Banner",
"CMS内容表": "CMS Content Table",
"CMS分类表": "CMS Category Table",
"CMS商机线索表": "CMS Business Leads Table",
"CMS栏目表": "CMS Column Table",
"CMS站点配置表": "CMS Site Configuration Table",
"Cancel": "Cancel",
"Conform": "Conform",
"Delete Error": "Delete Error",
"Delete Success": "Delete Success",
"Discard": "Discard",
"ID": "ID",
"JSON": "JSON",
"N 个行业模型": "N Industry Models",
"Please login": "Please login",
"Record no exist or with wrong ownership": "Record no exist or with wrong ownership",
"Reset": "Reset",
"Submit": "Submit",
"Token交易记录": "Token Transaction Records",
"Update Error": "Update Error",
"Update Success": "Update Success",
"X 个智能体": "X AI Agents",
"api密钥": "API Key",
"failed": "failed",
"ok": "ok",
"token每天统计": "Daily Token Statistics",
"token消耗量Top5": "Top 5 Token Consumption",
"© 2026 开元云科技 · 国家级高新技术企业 · 专精特新企业": "© 2026 Kaiyuan Cloud Tech · National High-tech Enterprise · Specialized & Innovative SME",
"⚙️": "⚙️",
"一个AI平台 + N个行业模型 + X个智能体": "One AI Platform + N Industry Models + X AI Agents",
"上位系统": "Upstream System",
"上位系统管理": "Upstream System Management",
"下位系统接口": "Downstream System Interface",
"个人信息": "Personal Information",
"了解产品架构": "Learn About Product Architecture",
"了解更多 → 联系销售": "Learn More → Contact Sales",
"产品": "Products",
"产品架构": "Product Architecture",
"产品类别管理": "Product Category Management",
"产线定义": "Pipeline Definition",
"产线定义、步骤配置与发布管理": "Pipeline definition, step configuration, and release management",
"产线平台": "Pipeline Platform",
"产线步骤": "Pipeline Steps",
"产线管理": "Pipeline Management",
"任务中心": "Task Center",
"企业CMS管理后台": "Enterprise CMS Admin Panel",
"企业动态": "Company News",
"会话文件名": "Session Filename",
"余额与充值": "Balance & Top-up",
"使用记录": "Usage Records",
"供应协议": "Supply Agreement",
"供应量管理": "Supply Management",
"供销协议管理": "Supply & Sales Agreement Management",
"信用额度": "Credit Limit",
"值类型": "Value Type",
"元境": "MetaRealm",
"充值": "Top-up",
"全部分类": "All Categories",
"全部类型": "All Types",
"公司": "Company",
"其他": "Other",
"内容不存在": "Content Not Found",
"内容分类": "Content Category",
"内容管理": "Content Management",
"内容类型": "Content Type",
"函数名": "Function Name",
"分类ID": "Category ID",
"分类名称": "Category Name",
"分类名称不能为空": "Category name cannot be empty",
"分销协议": "Distribution Agreement",
"分销协议管理": "Distribution Agreement Management",
"分销商产线配置": "Distributor Pipeline Configuration",
"分销商管理": "Distributor Management",
"分销管理": "Distribution Management",
"创建人": "Created By",
"创建时间": "Created At",
"副标题": "Subtitle",
"医疗健康": "Healthcare",
"原始文本": "Original Text",
"发布时间": "Published At",
"发布记录": "Release Records",
"商机线索": "Business Leads",
"图片URL": "Image URL",
"地区": "Region",
"基于东数西算国家战略部署提供高性能、低成本的AI算力服务。支持主流大模型的统一接入、调度和管理为企业构建坚实的AI基础设施。": "Based on the national East Data West Computing strategy, providing high-performance, low-cost AI computing services. Supports unified access, scheduling, and management of mainstream large models, building solid AI infrastructure for enterprises.",
"基于东数西算国家战略打造新一代AI智能体服务平台赋能千行百业智能化转型": "Based on the national East Data West Computing strategy, building a next-generation AI agent service platform to empower intelligent transformation across industries",
"备注": "Remarks",
"大模型API调用": "LLM API Calls",
"官网": "Official Website",
"官网预览": "Website Preview",
"定价管理": "Pricing Management",
"实时交易风险监测欺诈识别准确率提升60%误报率降低35%": "Real-time transaction risk monitoring, fraud identification accuracy improved by 60%, false positive rate reduced by 35%",
"审批ID": "Approval ID",
"展示平台": "Display Platform",
"展示配置": "Display Configuration",
"已关闭": "Closed",
"已发布": "Published",
"已归档": "Archived",
"已确认": "Confirmed",
"已转化": "Converted",
"布尔": "Boolean",
"帐务": "Accounting",
"开元云科技": "Kaiyuan Cloud Tech",
"开元云科技与多家行业领军企业达成战略合作共建AI生态": "Kaiyuan Cloud Tech reaches strategic partnerships with leading enterprises to build AI ecosystem",
"开元云科技发布新一代AI智能体平台赋能企业数字化转型": "Kaiyuan Cloud Tech launches next-generation AI agent platform, empowering enterprise digital transformation",
"影像AI辅助诊断覆盖50+病种诊断效率提升3倍漏诊率降低80%": "Imaging AI-assisted diagnosis covers 50+ diseases, diagnosis efficiency improved 3x, missed diagnosis rate reduced by 80%",
"性能最优Top5": "Top 5 Best Performance",
"想了解这些方案如何落地?": "Want to know how these solutions are implemented?",
"意向产品": "Interested Products",
"感谢您的留言,我们会尽快联系您!": "Thank you for your message, we will contact you soon!",
"成功案例": "Success Stories",
"我": "Me",
"扩展JSON": "Extended JSON",
"排序": "Sort Order",
"接口输入输出": "Interface I/O",
"接口集": "Interface Set",
"描述": "Description",
"摘要": "Summary",
"数字": "Number",
"数据IO": "Data I/O",
"文本": "Text",
"新线索": "New Lead",
"新闻": "News",
"新闻、案例、产品、Banner": "News, Cases, Products, Banner",
"是否可见": "Visible",
"显示": "Show",
"智能体支持多模态交互、工具调用、多Agent协作。企业可根据业务需求自由组合和定制打造专属AI工作团队。": "AI agents support multi-modal interaction, tool calling, and multi-agent collaboration. Enterprises can freely combine and customize based on business needs to build dedicated AI work teams.",
"智能制造": "Smart Manufacturing",
"更新时间": "Updated At",
"服务管理": "Service Management",
"未登录": "Not Logged In",
"权限管理": "Permission Management",
"来源": "Source",
"某三甲医院AI辅助诊断": "AI-Assisted Diagnosis at a Top-tier Hospital",
"某大型制造企业智能质检": "Intelligent Quality Inspection at a Large Manufacturing Enterprise",
"某银行智能风控系统": "Intelligent Risk Control System at a Bank",
"查看全部 →": "View All →",
"标签": "Tags",
"标题": "Title",
"标题不能为空": "Title cannot be empty",
"栏目Key": "Column Key",
"栏目Key和标题不能为空": "Column Key and title cannot be empty",
"栏目排序、显示隐藏、展示风格": "Column sorting, show/hide, display style",
"栏目管理": "Column Management",
"栏目类型": "Column Type",
"样式配置": "Style Configuration",
"案例": "Cases",
"正文": "Body",
"每个行业模型都经过大量行业数据训练和微调理解行业术语和业务流程能够直接解决行业痛点快速落地AI应用。": "Each industry model is trained and fine-tuned with extensive industry data, understands industry terminology and business processes, and can directly address industry pain points for rapid AI application deployment.",
"注册": "Register",
"添加供应商": "Add Supplier",
"添加管理员": "Add Admin",
"灵活组合的智能体应用,覆盖客服、写作、分析、编程等多种场景": "Flexibly combined AI agent applications covering customer service, writing, analysis, programming, and more",
"父分类ID": "Parent Category ID",
"状态": "Status",
"电话": "Phone",
"留言": "Message",
"登录": "Login",
"看看AI如何改变这些行业": "See How AI Is Transforming These Industries",
"真人素材": "Real Person Assets",
"科目管理": "Account Management",
"科目配置": "Account Configuration",
"站点配置": "Site Configuration",
"签退": "Sign Out",
"管理": "Management",
"管理产品分类、案例行业、新闻栏目": "Manage product categories, case industries, news columns",
"管理产线定义、运营配置、分销渠道与任务执行": "Manage pipeline definitions, operations configuration, distribution channels, and task execution",
"管理产线定价、供应量与使用记录": "Manage pipeline pricing, supply, and usage records",
"管理分销商与产线配置": "Manage distributors and pipeline configuration",
"管理后台": "Admin Panel",
"管理官网内容、分类、商机线索和站点配置": "Manage website content, categories, business leads, and site configuration",
"系统日志": "System Logs",
"系统权限管理": "System Permission Management",
"系统管理": "System Management",
"组织ID": "Organization ID",
"统一AI基础设施平台提供算力调度、模型管理、智能体编排等核心能力": "Unified AI infrastructure platform providing core capabilities including computing scheduling, model management, and agent orchestration",
"缺少ID": "Missing ID",
"缺少id": "Missing id",
"联系中": "Contacting",
"联系人": "Contact Person",
"联系销售": "Contact Sales",
"草稿": "Draft",
"行业": "Industry",
"表单": "Form",
"角色权限管理": "Role Permission Management",
"角色管理": "Role Management",
"设备组": "Device Group",
"访客留言、AI抽取商机": "Visitor messages, AI-extracted business leads",
"评价最高Top5": "Top 5 Highest Rated",
"调用数量Top5": "Top 5 by Call Volume",
"负责人": "Owner",
"账务中心": "Accounting Center",
"账务明细": "Accounting Details",
"账单查询": "Bill Inquiry",
"账户管理": "Account Management",
"运营商配置": "Operator Configuration",
"运营管理": "Operations Management",
"退出登录": "Logout",
"邮箱": "Email",
"配置值": "Config Value",
"配置组": "Config Group",
"配置组和配置键不能为空": "Config group and config key cannot be empty",
"配置账务": "Configure Accounting",
"配置键": "Config Key",
"重置密码": "Reset Password",
"金融科技": "FinTech",
"针对制造、金融、医疗、教育等行业深度定制的专业AI模型": "Professionally customized AI models for manufacturing, finance, healthcare, education, and more",
"附属密钥": "Sub-key",
"限中国国内手机": "China domestic phones only",
"隐藏": "Hide",
"静态内容": "Static Content",
"首屏标语、页脚信息、联系方式": "Hero banner, footer info, contact details"
}

220
wwwroot/i18n/en/msg.txt Normal file
View File

@ -0,0 +1,220 @@
1 个 AI 平台: 1 AI Platform
1+N+X 产品架构: 1+N+X Product Architecture
AI抽取: AI Extraction
AI视觉检测替代人工质检缺陷识别准确率达99.7%产线效率提升40%: AI visual inspection replaces manual QC, defect recognition accuracy reaches 99.7%, production line efficiency improved by 40%
API Key管理: API Key Management
Add Error: Add Error
Add Success: Add Success
Authorization Error: Authorization Error
Banner: Banner
CMS内容表: CMS Content Table
CMS分类表: CMS Category Table
CMS商机线索表: CMS Business Leads Table
CMS栏目表: CMS Column Table
CMS站点配置表: CMS Site Configuration Table
Cancel: Cancel
Conform: Conform
Delete Error: Delete Error
Delete Success: Delete Success
Discard: Discard
ID: ID
JSON: JSON
N 个行业模型: N Industry Models
Please login: Please login
Record no exist or with wrong ownership: Record no exist or with wrong ownership
Reset: Reset
Submit: Submit
Token交易记录: Token Transaction Records
Update Error: Update Error
Update Success: Update Success
X 个智能体: X AI Agents
api密钥: API Key
failed: failed
ok: ok
token每天统计: Daily Token Statistics
token消耗量Top5: Top 5 Token Consumption
© 2026 开元云科技 · 国家级高新技术企业 · 专精特新企业: © 2026 Kaiyuan Cloud Tech · National High-tech Enterprise · Specialized & Innovative SME
⚙️: ⚙️
一个AI平台 + N个行业模型 + X个智能体: One AI Platform + N Industry Models + X AI Agents
上位系统: Upstream System
上位系统管理: Upstream System Management
下位系统接口: Downstream System Interface
个人信息: Personal Information
了解产品架构: Learn About Product Architecture
了解更多 → 联系销售: Learn More → Contact Sales
产品: Products
产品架构: Product Architecture
产品类别管理: Product Category Management
产线定义: Pipeline Definition
产线定义、步骤配置与发布管理: Pipeline definition, step configuration, and release management
产线平台: Pipeline Platform
产线步骤: Pipeline Steps
产线管理: Pipeline Management
任务中心: Task Center
企业CMS管理后台: Enterprise CMS Admin Panel
企业动态: Company News
会话文件名: Session Filename
余额与充值: Balance & Top-up
使用记录: Usage Records
供应协议: Supply Agreement
供应量管理: Supply Management
供销协议管理: Supply & Sales Agreement Management
信用额度: Credit Limit
值类型: Value Type
元境: MetaRealm
充值: Top-up
全部分类: All Categories
全部类型: All Types
公司: Company
其他: Other
内容不存在: Content Not Found
内容分类: Content Category
内容管理: Content Management
内容类型: Content Type
函数名: Function Name
分类ID: Category ID
分类名称: Category Name
分类名称不能为空: Category name cannot be empty
分销协议: Distribution Agreement
分销协议管理: Distribution Agreement Management
分销商产线配置: Distributor Pipeline Configuration
分销商管理: Distributor Management
分销管理: Distribution Management
创建人: Created By
创建时间: Created At
副标题: Subtitle
医疗健康: Healthcare
原始文本: Original Text
发布时间: Published At
发布记录: Release Records
商机线索: Business Leads
图片URL: Image URL
地区: Region
基于东数西算国家战略部署提供高性能、低成本的AI算力服务。支持主流大模型的统一接入、调度和管理为企业构建坚实的AI基础设施。: Based on the national East Data West Computing strategy, providing high-performance, low-cost AI computing services. Supports unified access, scheduling, and management of mainstream large models, building solid AI infrastructure for enterprises.
基于东数西算国家战略打造新一代AI智能体服务平台赋能千行百业智能化转型: Based on the national East Data West Computing strategy, building a next-generation AI agent service platform to empower intelligent transformation across industries
备注: Remarks
大模型API调用: LLM API Calls
官网: Official Website
官网预览: Website Preview
定价管理: Pricing Management
实时交易风险监测欺诈识别准确率提升60%误报率降低35%: Real-time transaction risk monitoring, fraud identification accuracy improved by 60%, false positive rate reduced by 35%
审批ID: Approval ID
展示平台: Display Platform
展示配置: Display Configuration
已关闭: Closed
已发布: Published
已归档: Archived
已确认: Confirmed
已转化: Converted
布尔: Boolean
帐务: Accounting
开元云科技: Kaiyuan Cloud Tech
开元云科技与多家行业领军企业达成战略合作共建AI生态: Kaiyuan Cloud Tech reaches strategic partnerships with leading enterprises to build AI ecosystem
开元云科技发布新一代AI智能体平台赋能企业数字化转型: Kaiyuan Cloud Tech launches next-generation AI agent platform, empowering enterprise digital transformation
影像AI辅助诊断覆盖50+病种诊断效率提升3倍漏诊率降低80%: Imaging AI-assisted diagnosis covers 50+ diseases, diagnosis efficiency improved 3x, missed diagnosis rate reduced by 80%
性能最优Top5: Top 5 Best Performance
想了解这些方案如何落地?: Want to know how these solutions are implemented?
意向产品: Interested Products
感谢您的留言,我们会尽快联系您!: Thank you for your message, we will contact you soon!
成功案例: Success Stories
我: Me
扩展JSON: Extended JSON
排序: Sort Order
接口输入输出: Interface I/O
接口集: Interface Set
描述: Description
摘要: Summary
数字: Number
数据IO: Data I/O
文本: Text
新线索: New Lead
新闻: News
新闻、案例、产品、Banner: News, Cases, Products, Banner
是否可见: Visible
显示: Show
智能体支持多模态交互、工具调用、多Agent协作。企业可根据业务需求自由组合和定制打造专属AI工作团队。: AI agents support multi-modal interaction, tool calling, and multi-agent collaboration. Enterprises can freely combine and customize based on business needs to build dedicated AI work teams.
智能制造: Smart Manufacturing
更新时间: Updated At
服务管理: Service Management
未登录: Not Logged In
权限管理: Permission Management
来源: Source
某三甲医院AI辅助诊断: AI-Assisted Diagnosis at a Top-tier Hospital
某大型制造企业智能质检: Intelligent Quality Inspection at a Large Manufacturing Enterprise
某银行智能风控系统: Intelligent Risk Control System at a Bank
查看全部 →: View All →
标签: Tags
标题: Title
标题不能为空: Title cannot be empty
栏目Key: Column Key
栏目Key和标题不能为空: Column Key and title cannot be empty
栏目排序、显示隐藏、展示风格: Column sorting, show/hide, display style
栏目管理: Column Management
栏目类型: Column Type
样式配置: Style Configuration
案例: Cases
正文: Body
每个行业模型都经过大量行业数据训练和微调理解行业术语和业务流程能够直接解决行业痛点快速落地AI应用。: Each industry model is trained and fine-tuned with extensive industry data, understands industry terminology and business processes, and can directly address industry pain points for rapid AI application deployment.
注册: Register
添加供应商: Add Supplier
添加管理员: Add Admin
灵活组合的智能体应用,覆盖客服、写作、分析、编程等多种场景: Flexibly combined AI agent applications covering customer service, writing, analysis, programming, and more
父分类ID: Parent Category ID
状态: Status
电话: Phone
留言: Message
登录: Login
看看AI如何改变这些行业: See How AI Is Transforming These Industries
真人素材: Real Person Assets
科目管理: Account Management
科目配置: Account Configuration
站点配置: Site Configuration
签退: Sign Out
管理: Management
管理产品分类、案例行业、新闻栏目: Manage product categories, case industries, news columns
管理产线定义、运营配置、分销渠道与任务执行: Manage pipeline definitions, operations configuration, distribution channels, and task execution
管理产线定价、供应量与使用记录: Manage pipeline pricing, supply, and usage records
管理分销商与产线配置: Manage distributors and pipeline configuration
管理后台: Admin Panel
管理官网内容、分类、商机线索和站点配置: Manage website content, categories, business leads, and site configuration
系统日志: System Logs
系统权限管理: System Permission Management
系统管理: System Management
组织ID: Organization ID
统一AI基础设施平台提供算力调度、模型管理、智能体编排等核心能力: Unified AI infrastructure platform providing core capabilities including computing scheduling, model management, and agent orchestration
缺少ID: Missing ID
缺少id: Missing id
联系中: Contacting
联系人: Contact Person
联系销售: Contact Sales
草稿: Draft
行业: Industry
表单: Form
角色权限管理: Role Permission Management
角色管理: Role Management
设备组: Device Group
访客留言、AI抽取商机: Visitor messages, AI-extracted business leads
评价最高Top5: Top 5 Highest Rated
调用数量Top5: Top 5 by Call Volume
负责人: Owner
账务中心: Accounting Center
账务明细: Accounting Details
账单查询: Bill Inquiry
账户管理: Account Management
运营商配置: Operator Configuration
运营管理: Operations Management
退出登录: Logout
邮箱: Email
配置值: Config Value
配置组: Config Group
配置组和配置键不能为空: Config group and config key cannot be empty
配置账务: Configure Accounting
配置键: Config Key
重置密码: Reset Password
金融科技: FinTech
针对制造、金融、医疗、教育等行业深度定制的专业AI模型: Professionally customized AI models for manufacturing, finance, healthcare, education, and more
附属密钥: Sub-key
限中国国内手机: China domestic phones only
隐藏: Hide
静态内容: Static Content
首屏标语、页脚信息、联系方式: Hero banner, footer info, contact details

222
wwwroot/i18n/jp/i18n.json Normal file
View File

@ -0,0 +1,222 @@
{
"1 个 AI 平台": "1つのAIプラットフォーム",
"1+N+X 产品架构": "1+N+X プロダクトアーキテクチャ",
"AI抽取": "AI抽出",
"AI视觉检测替代人工质检缺陷识别准确率达99.7%产线效率提升40%": "AI画像検査が人手検査を代替し、欠陥識別精度99.7%、ライン効率40%向上",
"API Key管理": "API Key管理",
"Add Error": "Add Error",
"Add Success": "Add Success",
"Authorization Error": "Authorization Error",
"Banner": "Banner",
"CMS内容表": "CMSコンテンツテーブル",
"CMS分类表": "CMSカテゴリテーブル",
"CMS商机线索表": "CMS商談リードテーブル",
"CMS栏目表": "CMSセクションテーブル",
"CMS站点配置表": "CMSサイト設定テーブル",
"Cancel": "Cancel",
"Conform": "Conform",
"Delete Error": "Delete Error",
"Delete Success": "Delete Success",
"Discard": "Discard",
"ID": "ID",
"JSON": "JSON",
"N 个行业模型": "N個の業界モデル",
"Please login": "Please login",
"Record no exist or with wrong ownership": "Record no exist or with wrong ownership",
"Reset": "Reset",
"Submit": "Submit",
"Token交易记录": "Token取引記録",
"Update Error": "Update Error",
"Update Success": "Update Success",
"X 个智能体": "X個のAIエージェント",
"api密钥": "APIシークレットキー",
"failed": "failed",
"ok": "ok",
"token每天统计": "Token日次統計",
"token消耗量Top5": "Token消費量Top5",
"© 2026 开元云科技 · 国家级高新技术企业 · 专精特新企业": "© 2026 開元雲科技 · 国家級ハイテク企業 · 専門特新企業",
"⚙️": "⚙️",
"一个AI平台 + N个行业模型 + X个智能体": "1つのAIプラットフォーム + N個の業界モデル + X個のAIエージェント",
"上位系统": "上位システム",
"上位系统管理": "上位システム管理",
"下位系统接口": "下位システムインターフェース",
"个人信息": "個人情報",
"了解产品架构": "プロダクトアーキテクチャの詳細",
"了解更多 → 联系销售": "詳細を見る → 営業に問い合わせ",
"产品": "プロダクト",
"产品架构": "プロダクトアーキテクチャ",
"产品类别管理": "プロダクトカテゴリ管理",
"产线定义": "生産ライン定義",
"产线定义、步骤配置与发布管理": "生産ライン定義、ステップ設定、リリース管理",
"产线平台": "生産ラインプラットフォーム",
"产线步骤": "生産ラインステップ",
"产线管理": "生産ライン管理",
"任务中心": "タスクセンター",
"企业CMS管理后台": "企業CMS管理画面",
"企业动态": "企業ニュース",
"会话文件名": "セッションファイル名",
"余额与充值": "残高とチャージ",
"使用记录": "利用記録",
"供应协议": "供給契約",
"供应量管理": "供給量管理",
"供销协议管理": "需給契約管理",
"信用额度": "与信枠",
"值类型": "値のタイプ",
"元境": "元境",
"充值": "チャージ",
"全部分类": "全カテゴリ",
"全部类型": "全タイプ",
"公司": "会社",
"其他": "その他",
"内容不存在": "コンテンツが存在しません",
"内容分类": "コンテンツカテゴリ",
"内容管理": "コンテンツ管理",
"内容类型": "コンテンツタイプ",
"函数名": "関数名",
"分类ID": "カテゴリID",
"分类名称": "カテゴリ名",
"分类名称不能为空": "カテゴリ名は必須です",
"分销协议": "販売代理契約",
"分销协议管理": "販売代理契約管理",
"分销商产线配置": "販売代理店の生産ライン設定",
"分销商管理": "販売代理店管理",
"分销管理": "販売代理管理",
"创建人": "作成者",
"创建时间": "作成日時",
"副标题": "サブタイトル",
"医疗健康": "医療・ヘルスケア",
"原始文本": "元のテキスト",
"发布时间": "公開日時",
"发布记录": "リリース記録",
"商机线索": "商談リード",
"图片URL": "画像URL",
"地区": "地域",
"基于东数西算国家战略部署提供高性能、低成本的AI算力服务。支持主流大模型的统一接入、调度和管理为企业构建坚实的AI基础设施。": "東数西算国家戦略に基づき、高性能・低コストのAIコンピューティングサービスを提供。主要大規模モデルの一元的な接続・スケジューリング・管理をサポートし、企業に堅牢なAIインフラを構築します。",
"基于东数西算国家战略打造新一代AI智能体服务平台赋能千行百业智能化转型": "東数西算国家戦略に基づき、次世代AIエージェントサービスプラットフォームを構築し、あらゆる業界のスマート化転革を推進",
"备注": "備考",
"大模型API调用": "大規模モデルAPI呼び出し",
"官网": "公式サイト",
"官网预览": "公式サイトプレビュー",
"定价管理": "価格設定管理",
"实时交易风险监测欺诈识别准确率提升60%误报率降低35%": "リアルタイム取引リスク監視、不正検知精度60%向上、誤検知率35%削減",
"审批ID": "承認ID",
"展示平台": "展示プラットフォーム",
"展示配置": "表示設定",
"已关闭": "クローズ",
"已发布": "公開済み",
"已归档": "アーカイブ済み",
"已确认": "確認済み",
"已转化": "コンバージョン済み",
"布尔": "ブール値",
"帐务": "経理",
"开元云科技": "開元雲科技",
"开元云科技与多家行业领军企业达成战略合作共建AI生态": "開元雲科技は複数の業界リーディング企業と戦略提携を締結し、AIエコシステムを共同構築",
"开元云科技发布新一代AI智能体平台赋能企业数字化转型": "開元雲科技が次世代AIエージェントプラットフォームをリリース、企業のデジタル変革を推進",
"影像AI辅助诊断覆盖50+病种诊断效率提升3倍漏诊率降低80%": "画像AI支援診断は50以上の疾患をカバー、診断効率3倍向上、見落とし率80%削減",
"性能最优Top5": "パフォーマンス上位Top5",
"想了解这些方案如何落地?": "これらのソリューションの導入方法を知りたいですか?",
"意向产品": "希望プロダクト",
"感谢您的留言,我们会尽快联系您!": "メッセージありがとうございます。折り返しご連絡いたします!",
"成功案例": "導入事例",
"我": "自分",
"扩展JSON": "拡張JSON",
"排序": "並び順",
"接口输入输出": "インターフェース入出力",
"接口集": "インターフェース集合",
"描述": "説明",
"摘要": "要約",
"数字": "数値",
"数据IO": "データIO",
"文本": "テキスト",
"新线索": "新規リード",
"新闻": "ニュース",
"新闻、案例、产品、Banner": "ニュース、事例、プロダクト、Banner",
"是否可见": "表示可否",
"显示": "表示",
"智能体支持多模态交互、工具调用、多Agent协作。企业可根据业务需求自由组合和定制打造专属AI工作团队。": "AIエージェントはマルチモーダル対話、ツール呼び出し、マルチエージェント連携をサポート。企業は業務ニーズに応じて自由に組み合わせ・カスタマイズし、専属AIワークチームを構築できます。",
"智能制造": "スマート製造",
"更新时间": "更新日時",
"服务管理": "サービス管理",
"未登录": "未ログイン",
"权限管理": "権限管理",
"来源": "ソース",
"某三甲医院AI辅助诊断": "某三次病院AI支援診断",
"某大型制造企业智能质检": "某大手製造企業スマート品質検査",
"某银行智能风控系统": "某銀行スマートリスク管理システム",
"查看全部 →": "すべて見る →",
"标签": "タグ",
"标题": "タイトル",
"标题不能为空": "タイトルは必須です",
"栏目Key": "セクションKey",
"栏目Key和标题不能为空": "セクションKeyとタイトルは必須です",
"栏目排序、显示隐藏、展示风格": "セクションの並び順、表示・非表示、表示スタイル",
"栏目管理": "セクション管理",
"栏目类型": "セクションタイプ",
"样式配置": "スタイル設定",
"案例": "事例",
"正文": "本文",
"每个行业模型都经过大量行业数据训练和微调理解行业术语和业务流程能够直接解决行业痛点快速落地AI应用。": "各業界モデルは大量の業界データで訓練・ファインチューニングされており、業界用語や業務プロセスを理解し、業界の課題を直接解決し、AIアプリケーションを迅速に導入できます。",
"注册": "登録",
"添加供应商": "サプライヤーを追加",
"添加管理员": "管理者を追加",
"灵活组合的智能体应用,覆盖客服、写作、分析、编程等多种场景": "柔軟に組み合わせ可能なAIエージェントアプリ、カスタマーサポート、ライティング、分析、プログラミングなど多様なシーンをカバー",
"父分类ID": "親カテゴリID",
"状态": "ステータス",
"电话": "電話番号",
"留言": "メッセージ",
"登录": "ログイン",
"看看AI如何改变这些行业": "AIがこれらの業界をどう変えるかを見る",
"真人素材": "実写素材",
"科目管理": "科目管理",
"科目配置": "科目設定",
"站点配置": "サイト設定",
"签退": "ログアウト",
"管理": "管理",
"管理产品分类、案例行业、新闻栏目": "プロダクトカテゴリ、事例業界、ニュースセクションの管理",
"管理产线定义、运营配置、分销渠道与任务执行": "生産ライン定義、運用設定、販売チャネル、タスク実行の管理",
"管理产线定价、供应量与使用记录": "生産ライン価格設定、供給量、利用記録の管理",
"管理分销商与产线配置": "販売代理店と生産ライン設定の管理",
"管理后台": "管理画面",
"管理官网内容、分类、商机线索和站点配置": "公式サイトコンテンツ、カテゴリ、商談リード、サイト設定の管理",
"系统日志": "システムログ",
"系统权限管理": "システム権限管理",
"系统管理": "システム管理",
"组织ID": "組織ID",
"统一AI基础设施平台提供算力调度、模型管理、智能体编排等核心能力": "統合AIインフラプラットフォーム、コンピューティングスケジューリング、モデル管理、エージェントオーケストレーションなど中核機能を提供",
"缺少ID": "IDがありません",
"缺少id": "idがありません",
"联系中": "連絡中",
"联系人": "担当者",
"联系销售": "営業に問い合わせ",
"草稿": "下書き",
"行业": "業界",
"表单": "フォーム",
"角色权限管理": "ロール権限管理",
"角色管理": "ロール管理",
"设备组": "デバイスグループ",
"访客留言、AI抽取商机": "訪問者メッセージ、AI商談抽出",
"评价最高Top5": "評価上位Top5",
"调用数量Top5": "呼び出し数Top5",
"负责人": "責任者",
"账务中心": "経理センター",
"账务明细": "経理明細",
"账单查询": "請求書照会",
"账户管理": "アカウント管理",
"运营商配置": "キャリア設定",
"运营管理": "運用管理",
"退出登录": "ログアウト",
"邮箱": "メールアドレス",
"配置值": "設定値",
"配置组": "設定グループ",
"配置组和配置键不能为空": "設定グループと設定キーは必須です",
"配置账务": "経理設定",
"配置键": "設定キー",
"重置密码": "パスワードリセット",
"金融科技": "フィンテック",
"针对制造、金融、医疗、教育等行业深度定制的专业AI模型": "製造、金融、医療、教育などの業界向けに深くカスタマイズされた専門AIモデル",
"附属密钥": "附属キー",
"限中国国内手机": "中国国内の携帯電話限定",
"隐藏": "非表示",
"静态内容": "静的コンテンツ",
"首屏标语、页脚信息、联系方式": "ファーストビューのスローガン、フッター情報、連絡先"
}

220
wwwroot/i18n/jp/msg.txt Normal file
View File

@ -0,0 +1,220 @@
1 个 AI 平台: 1つのAIプラットフォーム
1+N+X 产品架构: 1+N+X プロダクトアーキテクチャ
AI抽取: AI抽出
AI视觉检测替代人工质检缺陷识别准确率达99.7%产线效率提升40%: AI画像検査が人手検査を代替し、欠陥識別精度99.7%、ライン効率40%向上
API Key管理: API Key管理
Add Error: Add Error
Add Success: Add Success
Authorization Error: Authorization Error
Banner: Banner
CMS内容表: CMSコンテンツテーブル
CMS分类表: CMSカテゴリテーブル
CMS商机线索表: CMS商談リードテーブル
CMS栏目表: CMSセクションテーブル
CMS站点配置表: CMSサイト設定テーブル
Cancel: Cancel
Conform: Conform
Delete Error: Delete Error
Delete Success: Delete Success
Discard: Discard
ID: ID
JSON: JSON
N 个行业模型: N個の業界モデル
Please login: Please login
Record no exist or with wrong ownership: Record no exist or with wrong ownership
Reset: Reset
Submit: Submit
Token交易记录: Token取引記録
Update Error: Update Error
Update Success: Update Success
X 个智能体: X個のAIエージェント
api密钥: APIシークレットキー
failed: failed
ok: ok
token每天统计: Token日次統計
token消耗量Top5: Token消費量Top5
© 2026 开元云科技 · 国家级高新技术企业 · 专精特新企业: © 2026 開元雲科技 · 国家級ハイテク企業 · 専門特新企業
⚙️: ⚙️
一个AI平台 + N个行业模型 + X个智能体: 1つのAIプラットフォーム + N個の業界モデル + X個のAIエージェント
上位系统: 上位システム
上位系统管理: 上位システム管理
下位系统接口: 下位システムインターフェース
个人信息: 個人情報
了解产品架构: プロダクトアーキテクチャの詳細
了解更多 → 联系销售: 詳細を見る → 営業に問い合わせ
产品: プロダクト
产品架构: プロダクトアーキテクチャ
产品类别管理: プロダクトカテゴリ管理
产线定义: 生産ライン定義
产线定义、步骤配置与发布管理: 生産ライン定義、ステップ設定、リリース管理
产线平台: 生産ラインプラットフォーム
产线步骤: 生産ラインステップ
产线管理: 生産ライン管理
任务中心: タスクセンター
企业CMS管理后台: 企業CMS管理画面
企业动态: 企業ニュース
会话文件名: セッションファイル名
余额与充值: 残高とチャージ
使用记录: 利用記録
供应协议: 供給契約
供应量管理: 供給量管理
供销协议管理: 需給契約管理
信用额度: 与信枠
值类型: 値のタイプ
元境: 元境
充值: チャージ
全部分类: 全カテゴリ
全部类型: 全タイプ
公司: 会社
其他: その他
内容不存在: コンテンツが存在しません
内容分类: コンテンツカテゴリ
内容管理: コンテンツ管理
内容类型: コンテンツタイプ
函数名: 関数名
分类ID: カテゴリID
分类名称: カテゴリ名
分类名称不能为空: カテゴリ名は必須です
分销协议: 販売代理契約
分销协议管理: 販売代理契約管理
分销商产线配置: 販売代理店の生産ライン設定
分销商管理: 販売代理店管理
分销管理: 販売代理管理
创建人: 作成者
创建时间: 作成日時
副标题: サブタイトル
医疗健康: 医療・ヘルスケア
原始文本: 元のテキスト
发布时间: 公開日時
发布记录: リリース記録
商机线索: 商談リード
图片URL: 画像URL
地区: 地域
基于东数西算国家战略部署提供高性能、低成本的AI算力服务。支持主流大模型的统一接入、调度和管理为企业构建坚实的AI基础设施。: 東数西算国家戦略に基づき、高性能・低コストのAIコンピューティングサービスを提供。主要大規模モデルの一元的な接続・スケジューリング・管理をサポートし、企業に堅牢なAIインフラを構築します。
基于东数西算国家战略打造新一代AI智能体服务平台赋能千行百业智能化转型: 東数西算国家戦略に基づき、次世代AIエージェントサービスプラットフォームを構築し、あらゆる業界のスマート化転革を推進
备注: 備考
大模型API调用: 大規模モデルAPI呼び出し
官网: 公式サイト
官网预览: 公式サイトプレビュー
定价管理: 価格設定管理
实时交易风险监测欺诈识别准确率提升60%误报率降低35%: リアルタイム取引リスク監視、不正検知精度60%向上、誤検知率35%削減
审批ID: 承認ID
展示平台: 展示プラットフォーム
展示配置: 表示設定
已关闭: クローズ
已发布: 公開済み
已归档: アーカイブ済み
已确认: 確認済み
已转化: コンバージョン済み
布尔: ブール値
帐务: 経理
开元云科技: 開元雲科技
开元云科技与多家行业领军企业达成战略合作共建AI生态: 開元雲科技は複数の業界リーディング企業と戦略提携を締結し、AIエコシステムを共同構築
开元云科技发布新一代AI智能体平台赋能企业数字化转型: 開元雲科技が次世代AIエージェントプラットフォームをリリース、企業のデジタル変革を推進
影像AI辅助诊断覆盖50+病种诊断效率提升3倍漏诊率降低80%: 画像AI支援診断は50以上の疾患をカバー、診断効率3倍向上、見落とし率80%削減
性能最优Top5: パフォーマンス上位Top5
想了解这些方案如何落地?: これらのソリューションの導入方法を知りたいですか?
意向产品: 希望プロダクト
感谢您的留言,我们会尽快联系您!: メッセージありがとうございます。折り返しご連絡いたします!
成功案例: 導入事例
我: 自分
扩展JSON: 拡張JSON
排序: 並び順
接口输入输出: インターフェース入出力
接口集: インターフェース集合
描述: 説明
摘要: 要約
数字: 数値
数据IO: データIO
文本: テキスト
新线索: 新規リード
新闻: ニュース
新闻、案例、产品、Banner: ニュース、事例、プロダクト、Banner
是否可见: 表示可否
显示: 表示
智能体支持多模态交互、工具调用、多Agent协作。企业可根据业务需求自由组合和定制打造专属AI工作团队。: AIエージェントはマルチモーダル対話、ツール呼び出し、マルチエージェント連携をサポート。企業は業務ニーズに応じて自由に組み合わせ・カスタマイズし、専属AIワークチームを構築できます。
智能制造: スマート製造
更新时间: 更新日時
服务管理: サービス管理
未登录: 未ログイン
权限管理: 権限管理
来源: ソース
某三甲医院AI辅助诊断: 某三次病院AI支援診断
某大型制造企业智能质检: 某大手製造企業スマート品質検査
某银行智能风控系统: 某銀行スマートリスク管理システム
查看全部 →: すべて見る →
标签: タグ
标题: タイトル
标题不能为空: タイトルは必須です
栏目Key: セクションKey
栏目Key和标题不能为空: セクションKeyとタイトルは必須です
栏目排序、显示隐藏、展示风格: セクションの並び順、表示・非表示、表示スタイル
栏目管理: セクション管理
栏目类型: セクションタイプ
样式配置: スタイル設定
案例: 事例
正文: 本文
每个行业模型都经过大量行业数据训练和微调理解行业术语和业务流程能够直接解决行业痛点快速落地AI应用。: 各業界モデルは大量の業界データで訓練・ファインチューニングされており、業界用語や業務プロセスを理解し、業界の課題を直接解決し、AIアプリケーションを迅速に導入できます。
注册: 登録
添加供应商: サプライヤーを追加
添加管理员: 管理者を追加
灵活组合的智能体应用,覆盖客服、写作、分析、编程等多种场景: 柔軟に組み合わせ可能なAIエージェントアプリ、カスタマーサポート、ライティング、分析、プログラミングなど多様なシーンをカバー
父分类ID: 親カテゴリID
状态: ステータス
电话: 電話番号
留言: メッセージ
登录: ログイン
看看AI如何改变这些行业: AIがこれらの業界をどう変えるかを見る
真人素材: 実写素材
科目管理: 科目管理
科目配置: 科目設定
站点配置: サイト設定
签退: ログアウト
管理: 管理
管理产品分类、案例行业、新闻栏目: プロダクトカテゴリ、事例業界、ニュースセクションの管理
管理产线定义、运营配置、分销渠道与任务执行: 生産ライン定義、運用設定、販売チャネル、タスク実行の管理
管理产线定价、供应量与使用记录: 生産ライン価格設定、供給量、利用記録の管理
管理分销商与产线配置: 販売代理店と生産ライン設定の管理
管理后台: 管理画面
管理官网内容、分类、商机线索和站点配置: 公式サイトコンテンツ、カテゴリ、商談リード、サイト設定の管理
系统日志: システムログ
系统权限管理: システム権限管理
系统管理: システム管理
组织ID: 組織ID
统一AI基础设施平台提供算力调度、模型管理、智能体编排等核心能力: 統合AIインフラプラットフォーム、コンピューティングスケジューリング、モデル管理、エージェントオーケストレーションなど中核機能を提供
缺少ID: IDがありません
缺少id: idがありません
联系中: 連絡中
联系人: 担当者
联系销售: 営業に問い合わせ
草稿: 下書き
行业: 業界
表单: フォーム
角色权限管理: ロール権限管理
角色管理: ロール管理
设备组: デバイスグループ
访客留言、AI抽取商机: 訪問者メッセージ、AI商談抽出
评价最高Top5: 評価上位Top5
调用数量Top5: 呼び出し数Top5
负责人: 責任者
账务中心: 経理センター
账务明细: 経理明細
账单查询: 請求書照会
账户管理: アカウント管理
运营商配置: キャリア設定
运营管理: 運用管理
退出登录: ログアウト
邮箱: メールアドレス
配置值: 設定値
配置组: 設定グループ
配置组和配置键不能为空: 設定グループと設定キーは必須です
配置账务: 経理設定
配置键: 設定キー
重置密码: パスワードリセット
金融科技: フィンテック
针对制造、金融、医疗、教育等行业深度定制的专业AI模型: 製造、金融、医療、教育などの業界向けに深くカスタマイズされた専門AIモデル
附属密钥: 附属キー
限中国国内手机: 中国国内の携帯電話限定
隐藏: 非表示
静态内容: 静的コンテンツ
首屏标语、页脚信息、联系方式: ファーストビューのスローガン、フッター情報、連絡先

222
wwwroot/i18n/ko/i18n.json Normal file
View File

@ -0,0 +1,222 @@
{
"1 个 AI 平台": "1개의 AI 플랫폼",
"1+N+X 产品架构": "1+N+X 제품 아키텍처",
"AI抽取": "AI 추출",
"AI视觉检测替代人工质检缺陷识别准确率达99.7%产线效率提升40%": "AI 비전 검사로 수동 품질 검사를 대체하여 결함 식별 정확도 99.7% 달성, 생산라인 효율 40% 향상",
"API Key管理": "API Key 관리",
"Add Error": "Add Error",
"Add Success": "Add Success",
"Authorization Error": "Authorization Error",
"Banner": "Banner",
"CMS内容表": "CMS 콘텐츠 테이블",
"CMS分类表": "CMS 분류 테이블",
"CMS商机线索表": "CMS 영업 리드 테이블",
"CMS栏目表": "CMS 섹션 테이블",
"CMS站点配置表": "CMS 사이트 설정 테이블",
"Cancel": "Cancel",
"Conform": "Conform",
"Delete Error": "Delete Error",
"Delete Success": "Delete Success",
"Discard": "Discard",
"ID": "ID",
"JSON": "JSON",
"N 个行业模型": "N개의 산업 모델",
"Please login": "Please login",
"Record no exist or with wrong ownership": "Record no exist or with wrong ownership",
"Reset": "Reset",
"Submit": "Submit",
"Token交易记录": "Token 거래 내역",
"Update Error": "Update Error",
"Update Success": "Update Success",
"X 个智能体": "X개의 에이전트",
"api密钥": "API 키",
"failed": "failed",
"ok": "ok",
"token每天统计": "Token 일별 통계",
"token消耗量Top5": "Token 소모량 Top5",
"© 2026 开元云科技 · 国家级高新技术企业 · 专精特新企业": "© 2026 카이위안클라우드테크 · 국가급 첨단기술기업 · 전문화 특수화 기업",
"⚙️": "⚙️",
"一个AI平台 + N个行业模型 + X个智能体": "1개의 AI 플랫폼 + N개의 산업 모델 + X개의 에이전트",
"上位系统": "상위 시스템",
"上位系统管理": "상위 시스템 관리",
"下位系统接口": "하위 시스템 인터페이스",
"个人信息": "개인 정보",
"了解产品架构": "제품 아키텍처 알아보기",
"了解更多 → 联系销售": "자세히 알아보기 → 영업팀 문의",
"产品": "제품",
"产品架构": "제품 아키텍처",
"产品类别管理": "제품 카테고리 관리",
"产线定义": "생산라인 정의",
"产线定义、步骤配置与发布管理": "생산라인 정의, 단계 설정 및 배포 관리",
"产线平台": "생산라인 플랫폼",
"产线步骤": "생산라인 단계",
"产线管理": "생산라인 관리",
"任务中心": "작업 센터",
"企业CMS管理后台": "기업 CMS 관리 백엔드",
"企业动态": "기업 소식",
"会话文件名": "세션 파일명",
"余额与充值": "잔액 및 충전",
"使用记录": "사용 기록",
"供应协议": "공급 계약",
"供应量管理": "공급량 관리",
"供销协议管理": "공급 판매 계약 관리",
"信用额度": "신용 한도",
"值类型": "값 유형",
"元境": "위안경",
"充值": "충전",
"全部分类": "전체 분류",
"全部类型": "전체 유형",
"公司": "회사",
"其他": "기타",
"内容不存在": "콘텐츠가 존재하지 않습니다",
"内容分类": "콘텐츠 분류",
"内容管理": "콘텐츠 관리",
"内容类型": "콘텐츠 유형",
"函数名": "함수명",
"分类ID": "분류 ID",
"分类名称": "분류 이름",
"分类名称不能为空": "분류 이름은 비워둘 수 없습니다",
"分销协议": "유통 계약",
"分销协议管理": "유통 계약 관리",
"分销商产线配置": "유통업체 생산라인 설정",
"分销商管理": "유통업체 관리",
"分销管理": "유통 관리",
"创建人": "생성자",
"创建时间": "생성 시간",
"副标题": "부제목",
"医疗健康": "의료 건강",
"原始文本": "원본 텍스트",
"发布时间": "게시 시간",
"发布记录": "배포 기록",
"商机线索": "영업 리드",
"图片URL": "이미지 URL",
"地区": "지역",
"基于东数西算国家战略部署提供高性能、低成本的AI算力服务。支持主流大模型的统一接入、调度和管理为企业构建坚实的AI基础设施。": "동수서산 국가 전략에 기반하여 고성능·저비용 AI 컴퓨팅 서비스를 제공합니다. 주요 대규모 모델의 통합 접근, 스케줄링 및 관리를 지원하여 기업에 견고한 AI 인프라를 구축합니다.",
"基于东数西算国家战略打造新一代AI智能体服务平台赋能千行百业智能化转型": "동수서산 국가 전략에 기반하여 차세대 AI 에이전트 서비스 플랫폼을 구축하고, 다양한 산업의 지능형 전환을 지원합니다",
"备注": "비고",
"大模型API调用": "대규모 모델 API 호출",
"官网": "공식 웹사이트",
"官网预览": "공식 웹사이트 미리보기",
"定价管理": "가격 관리",
"实时交易风险监测欺诈识别准确率提升60%误报率降低35%": "실시간 거래 리스크 모니터링으로 사기 식별 정확도 60% 향상, 오탐률 35% 감소",
"审批ID": "승인 ID",
"展示平台": "전시 플랫폼",
"展示配置": "표시 설정",
"已关闭": "닫힘",
"已发布": "게시됨",
"已归档": "보관됨",
"已确认": "확인됨",
"已转化": "전환됨",
"布尔": "부울",
"帐务": "회계",
"开元云科技": "카이위안클라우드테크",
"开元云科技与多家行业领军企业达成战略合作共建AI生态": "카이위안클라우드테크, 다수의 업계 선도 기업과 전략적 제휴를 체결하여 AI 생태계 공동 구축",
"开元云科技发布新一代AI智能体平台赋能企业数字化转型": "카이위안클라우드테크, 차세대 AI 에이전트 플랫폼 출시로 기업의 디지털 전환 지원",
"影像AI辅助诊断覆盖50+病种诊断效率提升3倍漏诊率降低80%": "영상 AI 보조 진단 50개 이상 질환 커버, 진단 효율 3배 향상, 오진율 80% 감소",
"性能最优Top5": "최고 성능 Top5",
"想了解这些方案如何落地?": "이 솔루션들이 어떻게 구현되는지 궁금하신가요?",
"意向产品": "희망 제품",
"感谢您的留言,我们会尽快联系您!": "메시지를 남겨주셔서 감사합니다. 빠른 시일 내에 연락드리겠습니다!",
"成功案例": "성공 사례",
"我": "나",
"扩展JSON": "확장 JSON",
"排序": "정렬",
"接口输入输出": "인터페이스 입출력",
"接口集": "인터페이스 세트",
"描述": "설명",
"摘要": "요약",
"数字": "숫자",
"数据IO": "데이터 IO",
"文本": "텍스트",
"新线索": "새 리드",
"新闻": "뉴스",
"新闻、案例、产品、Banner": "뉴스, 사례, 제품, Banner",
"是否可见": "표시 여부",
"显示": "표시",
"智能体支持多模态交互、工具调用、多Agent协作。企业可根据业务需求自由组合和定制打造专属AI工作团队。": "에이전트는 다중 모달 상호작용, 도구 호출, 다중 에이전트 협업을 지원합니다. 기업은 비즈니스 요구에 따라 자유롭게 조합하고 커스터마이징하여 전용 AI 작업 팀을 구축할 수 있습니다.",
"智能制造": "스마트 제조",
"更新时间": "업데이트 시간",
"服务管理": "서비스 관리",
"未登录": "로그인되지 않음",
"权限管理": "권한 관리",
"来源": "출처",
"某三甲医院AI辅助诊断": "某 상급 종합병원 AI 보조 진단",
"某大型制造企业智能质检": "某 대형 제조 기업 스마트 품질 검사",
"某银行智能风控系统": "某 은행 스마트 리스크 관리 시스템",
"查看全部 →": "전체 보기 →",
"标签": "태그",
"标题": "제목",
"标题不能为空": "제목은 비워둘 수 없습니다",
"栏目Key": "섹션 Key",
"栏目Key和标题不能为空": "섹션 Key와 제목은 비워둘 수 없습니다",
"栏目排序、显示隐藏、展示风格": "섹션 정렬, 표시/숨기기, 표시 스타일",
"栏目管理": "섹션 관리",
"栏目类型": "섹션 유형",
"样式配置": "스타일 설정",
"案例": "사례",
"正文": "본문",
"每个行业模型都经过大量行业数据训练和微调理解行业术语和业务流程能够直接解决行业痛点快速落地AI应用。": "각 산업 모델은 방대한 산업 데이터로 훈련 및 미세 조정되어 업계 용어와 비즈니스 프로세스를 이해하며, 업계 과제를 직접 해결하고 AI 애플리케이션을 빠르게 구현할 수 있습니다.",
"注册": "회원가입",
"添加供应商": "공급업체 추가",
"添加管理员": "관리자 추가",
"灵活组合的智能体应用,覆盖客服、写作、分析、编程等多种场景": "유연하게 조합 가능한 에이전트 애플리케이션으로 고객 지원, 글쓰기, 분석, 프로그래밍 등 다양한 시나리오를 커버",
"父分类ID": "상위 분류 ID",
"状态": "상태",
"电话": "전화",
"留言": "메시지",
"登录": "로그인",
"看看AI如何改变这些行业": "AI가 이러한 산업을 어떻게 변화시키는지 확인하세요",
"真人素材": "실사 소재",
"科目管理": "계정 관리",
"科目配置": "계정 설정",
"站点配置": "사이트 설정",
"签退": "로그오프",
"管理": "관리",
"管理产品分类、案例行业、新闻栏目": "제품 분류, 사례 업종, 뉴스 섹션 관리",
"管理产线定义、运营配置、分销渠道与任务执行": "생산라인 정의, 운영 설정, 유통 채널 및 작업 실행 관리",
"管理产线定价、供应量与使用记录": "생산라인 가격, 공급량 및 사용 기록 관리",
"管理分销商与产线配置": "유통업체 및 생산라인 설정 관리",
"管理后台": "관리 백엔드",
"管理官网内容、分类、商机线索和站点配置": "공식 웹사이트 콘텐츠, 분류, 영업 리드 및 사이트 설정 관리",
"系统日志": "시스템 로그",
"系统权限管理": "시스템 권한 관리",
"系统管理": "시스템 관리",
"组织ID": "조직 ID",
"统一AI基础设施平台提供算力调度、模型管理、智能体编排等核心能力": "통합 AI 인프라 플랫폼으로 컴퓨팅 스케줄링, 모델 관리, 에이전트 오케스트레이션 등 핵심 기능 제공",
"缺少ID": "ID 누락",
"缺少id": "ID 누락",
"联系中": "연락 중",
"联系人": "담당자",
"联系销售": "영업팀 문의",
"草稿": "초안",
"行业": "업종",
"表单": "양식",
"角色权限管理": "역할 권한 관리",
"角色管理": "역할 관리",
"设备组": "디바이스 그룹",
"访客留言、AI抽取商机": "방문자 메시지, AI 영업 리드 추출",
"评价最高Top5": "최고 평가 Top5",
"调用数量Top5": "호출 수 Top5",
"负责人": "담당자",
"账务中心": "회계 센터",
"账务明细": "회계 내역",
"账单查询": "청구서 조회",
"账户管理": "계정 관리",
"运营商配置": "통신사 설정",
"运营管理": "운영 관리",
"退出登录": "로그아웃",
"邮箱": "이메일",
"配置值": "설정값",
"配置组": "설정 그룹",
"配置组和配置键不能为空": "설정 그룹과 설정 키는 비워둘 수 없습니다",
"配置账务": "회계 설정",
"配置键": "설정 키",
"重置密码": "비밀번호 재설정",
"金融科技": "핀테크",
"针对制造、金融、医疗、教育等行业深度定制的专业AI模型": "제조, 금융, 의료, 교육 등 업종에 맞춰 심층 커스터마이징된 전문 AI 모델",
"附属密钥": "보조 키",
"限中国国内手机": "중국 국내 휴대폰만 가능",
"隐藏": "숨기기",
"静态内容": "정적 콘텐츠",
"首屏标语、页脚信息、联系方式": "메인 배너 슬로건, 푸터 정보, 연락처"
}

220
wwwroot/i18n/ko/msg.txt Normal file
View File

@ -0,0 +1,220 @@
1 个 AI 平台: 1개의 AI 플랫폼
1+N+X 产品架构: 1+N+X 제품 아키텍처
AI抽取: AI 추출
AI视觉检测替代人工质检缺陷识别准确率达99.7%产线效率提升40%: AI 비전 검사로 수동 품질 검사를 대체하여 결함 식별 정확도 99.7% 달성, 생산라인 효율 40% 향상
API Key管理: API Key 관리
Add Error: Add Error
Add Success: Add Success
Authorization Error: Authorization Error
Banner: Banner
CMS内容表: CMS 콘텐츠 테이블
CMS分类表: CMS 분류 테이블
CMS商机线索表: CMS 영업 리드 테이블
CMS栏目表: CMS 섹션 테이블
CMS站点配置表: CMS 사이트 설정 테이블
Cancel: Cancel
Conform: Conform
Delete Error: Delete Error
Delete Success: Delete Success
Discard: Discard
ID: ID
JSON: JSON
N 个行业模型: N개의 산업 모델
Please login: Please login
Record no exist or with wrong ownership: Record no exist or with wrong ownership
Reset: Reset
Submit: Submit
Token交易记录: Token 거래 내역
Update Error: Update Error
Update Success: Update Success
X 个智能体: X개의 에이전트
api密钥: API 키
failed: failed
ok: ok
token每天统计: Token 일별 통계
token消耗量Top5: Token 소모량 Top5
© 2026 开元云科技 · 国家级高新技术企业 · 专精特新企业: © 2026 카이위안클라우드테크 · 국가급 첨단기술기업 · 전문화 특수화 기업
⚙️: ⚙️
一个AI平台 + N个行业模型 + X个智能体: 1개의 AI 플랫폼 + N개의 산업 모델 + X개의 에이전트
上位系统: 상위 시스템
上位系统管理: 상위 시스템 관리
下位系统接口: 하위 시스템 인터페이스
个人信息: 개인 정보
了解产品架构: 제품 아키텍처 알아보기
了解更多 → 联系销售: 자세히 알아보기 → 영업팀 문의
产品: 제품
产品架构: 제품 아키텍처
产品类别管理: 제품 카테고리 관리
产线定义: 생산라인 정의
产线定义、步骤配置与发布管理: 생산라인 정의, 단계 설정 및 배포 관리
产线平台: 생산라인 플랫폼
产线步骤: 생산라인 단계
产线管理: 생산라인 관리
任务中心: 작업 센터
企业CMS管理后台: 기업 CMS 관리 백엔드
企业动态: 기업 소식
会话文件名: 세션 파일명
余额与充值: 잔액 및 충전
使用记录: 사용 기록
供应协议: 공급 계약
供应量管理: 공급량 관리
供销协议管理: 공급 판매 계약 관리
信用额度: 신용 한도
值类型: 값 유형
元境: 위안경
充值: 충전
全部分类: 전체 분류
全部类型: 전체 유형
公司: 회사
其他: 기타
内容不存在: 콘텐츠가 존재하지 않습니다
内容分类: 콘텐츠 분류
内容管理: 콘텐츠 관리
内容类型: 콘텐츠 유형
函数名: 함수명
分类ID: 분류 ID
分类名称: 분류 이름
分类名称不能为空: 분류 이름은 비워둘 수 없습니다
分销协议: 유통 계약
分销协议管理: 유통 계약 관리
分销商产线配置: 유통업체 생산라인 설정
分销商管理: 유통업체 관리
分销管理: 유통 관리
创建人: 생성자
创建时间: 생성 시간
副标题: 부제목
医疗健康: 의료 건강
原始文本: 원본 텍스트
发布时间: 게시 시간
发布记录: 배포 기록
商机线索: 영업 리드
图片URL: 이미지 URL
地区: 지역
基于东数西算国家战略部署提供高性能、低成本的AI算力服务。支持主流大模型的统一接入、调度和管理为企业构建坚实的AI基础设施。: 동수서산 국가 전략에 기반하여 고성능·저비용 AI 컴퓨팅 서비스를 제공합니다. 주요 대규모 모델의 통합 접근, 스케줄링 및 관리를 지원하여 기업에 견고한 AI 인프라를 구축합니다.
基于东数西算国家战略打造新一代AI智能体服务平台赋能千行百业智能化转型: 동수서산 국가 전략에 기반하여 차세대 AI 에이전트 서비스 플랫폼을 구축하고, 다양한 산업의 지능형 전환을 지원합니다
备注: 비고
大模型API调用: 대규모 모델 API 호출
官网: 공식 웹사이트
官网预览: 공식 웹사이트 미리보기
定价管理: 가격 관리
实时交易风险监测欺诈识别准确率提升60%误报率降低35%: 실시간 거래 리스크 모니터링으로 사기 식별 정확도 60% 향상, 오탐률 35% 감소
审批ID: 승인 ID
展示平台: 전시 플랫폼
展示配置: 표시 설정
已关闭: 닫힘
已发布: 게시됨
已归档: 보관됨
已确认: 확인됨
已转化: 전환됨
布尔: 부울
帐务: 회계
开元云科技: 카이위안클라우드테크
开元云科技与多家行业领军企业达成战略合作共建AI生态: 카이위안클라우드테크, 다수의 업계 선도 기업과 전략적 제휴를 체결하여 AI 생태계 공동 구축
开元云科技发布新一代AI智能体平台赋能企业数字化转型: 카이위안클라우드테크, 차세대 AI 에이전트 플랫폼 출시로 기업의 디지털 전환 지원
影像AI辅助诊断覆盖50+病种诊断效率提升3倍漏诊率降低80%: 영상 AI 보조 진단 50개 이상 질환 커버, 진단 효율 3배 향상, 오진율 80% 감소
性能最优Top5: 최고 성능 Top5
想了解这些方案如何落地?: 이 솔루션들이 어떻게 구현되는지 궁금하신가요?
意向产品: 희망 제품
感谢您的留言,我们会尽快联系您!: 메시지를 남겨주셔서 감사합니다. 빠른 시일 내에 연락드리겠습니다!
成功案例: 성공 사례
我: 나
扩展JSON: 확장 JSON
排序: 정렬
接口输入输出: 인터페이스 입출력
接口集: 인터페이스 세트
描述: 설명
摘要: 요약
数字: 숫자
数据IO: 데이터 IO
文本: 텍스트
新线索: 새 리드
新闻: 뉴스
新闻、案例、产品、Banner: 뉴스, 사례, 제품, Banner
是否可见: 표시 여부
显示: 표시
智能体支持多模态交互、工具调用、多Agent协作。企业可根据业务需求自由组合和定制打造专属AI工作团队。: 에이전트는 다중 모달 상호작용, 도구 호출, 다중 에이전트 협업을 지원합니다. 기업은 비즈니스 요구에 따라 자유롭게 조합하고 커스터마이징하여 전용 AI 작업 팀을 구축할 수 있습니다.
智能制造: 스마트 제조
更新时间: 업데이트 시간
服务管理: 서비스 관리
未登录: 로그인되지 않음
权限管理: 권한 관리
来源: 출처
某三甲医院AI辅助诊断: 某 상급 종합병원 AI 보조 진단
某大型制造企业智能质检: 某 대형 제조 기업 스마트 품질 검사
某银行智能风控系统: 某 은행 스마트 리스크 관리 시스템
查看全部 →: 전체 보기 →
标签: 태그
标题: 제목
标题不能为空: 제목은 비워둘 수 없습니다
栏目Key: 섹션 Key
栏目Key和标题不能为空: 섹션 Key와 제목은 비워둘 수 없습니다
栏目排序、显示隐藏、展示风格: 섹션 정렬, 표시/숨기기, 표시 스타일
栏目管理: 섹션 관리
栏目类型: 섹션 유형
样式配置: 스타일 설정
案例: 사례
正文: 본문
每个行业模型都经过大量行业数据训练和微调理解行业术语和业务流程能够直接解决行业痛点快速落地AI应用。: 각 산업 모델은 방대한 산업 데이터로 훈련 및 미세 조정되어 업계 용어와 비즈니스 프로세스를 이해하며, 업계 과제를 직접 해결하고 AI 애플리케이션을 빠르게 구현할 수 있습니다.
注册: 회원가입
添加供应商: 공급업체 추가
添加管理员: 관리자 추가
灵活组合的智能体应用,覆盖客服、写作、分析、编程等多种场景: 유연하게 조합 가능한 에이전트 애플리케이션으로 고객 지원, 글쓰기, 분석, 프로그래밍 등 다양한 시나리오를 커버
父分类ID: 상위 분류 ID
状态: 상태
电话: 전화
留言: 메시지
登录: 로그인
看看AI如何改变这些行业: AI가 이러한 산업을 어떻게 변화시키는지 확인하세요
真人素材: 실사 소재
科目管理: 계정 관리
科目配置: 계정 설정
站点配置: 사이트 설정
签退: 로그오프
管理: 관리
管理产品分类、案例行业、新闻栏目: 제품 분류, 사례 업종, 뉴스 섹션 관리
管理产线定义、运营配置、分销渠道与任务执行: 생산라인 정의, 운영 설정, 유통 채널 및 작업 실행 관리
管理产线定价、供应量与使用记录: 생산라인 가격, 공급량 및 사용 기록 관리
管理分销商与产线配置: 유통업체 및 생산라인 설정 관리
管理后台: 관리 백엔드
管理官网内容、分类、商机线索和站点配置: 공식 웹사이트 콘텐츠, 분류, 영업 리드 및 사이트 설정 관리
系统日志: 시스템 로그
系统权限管理: 시스템 권한 관리
系统管理: 시스템 관리
组织ID: 조직 ID
统一AI基础设施平台提供算力调度、模型管理、智能体编排等核心能力: 통합 AI 인프라 플랫폼으로 컴퓨팅 스케줄링, 모델 관리, 에이전트 오케스트레이션 등 핵심 기능 제공
缺少ID: ID 누락
缺少id: ID 누락
联系中: 연락 중
联系人: 담당자
联系销售: 영업팀 문의
草稿: 초안
行业: 업종
表单: 양식
角色权限管理: 역할 권한 관리
角色管理: 역할 관리
设备组: 디바이스 그룹
访客留言、AI抽取商机: 방문자 메시지, AI 영업 리드 추출
评价最高Top5: 최고 평가 Top5
调用数量Top5: 호출 수 Top5
负责人: 담당자
账务中心: 회계 센터
账务明细: 회계 내역
账单查询: 청구서 조회
账户管理: 계정 관리
运营商配置: 통신사 설정
运营管理: 운영 관리
退出登录: 로그아웃
邮箱: 이메일
配置值: 설정값
配置组: 설정 그룹
配置组和配置键不能为空: 설정 그룹과 설정 키는 비워둘 수 없습니다
配置账务: 회계 설정
配置键: 설정 키
重置密码: 비밀번호 재설정
金融科技: 핀테크
针对制造、金融、医疗、教育等行业深度定制的专业AI模型: 제조, 금융, 의료, 교육 등 업종에 맞춰 심층 커스터마이징된 전문 AI 모델
附属密钥: 보조 키
限中国国内手机: 중국 국내 휴대폰만 가능
隐藏: 숨기기
静态内容: 정적 콘텐츠
首屏标语、页脚信息、联系方式: 메인 배너 슬로건, 푸터 정보, 연락처

152
wwwroot/i18n/zh/i18n.json Normal file
View File

@ -0,0 +1,152 @@
{
"1 个 AI 平台": "1 个 AI 平台",
"1+N+X 产品架构": "1+N+X 产品架构",
"AI抽取": "AI抽取",
"AI视觉检测替代人工质检缺陷识别准确率达99.7%产线效率提升40%": "AI视觉检测替代人工质检缺陷识别准确率达99.7%产线效率提升40%",
"Add Error": "Add Error",
"Add Success": "Add Success",
"Authorization Error": "Authorization Error",
"Banner": "Banner",
"CMS内容表": "CMS内容表",
"CMS分类表": "CMS分类表",
"CMS商机线索表": "CMS商机线索表",
"CMS栏目表": "CMS栏目表",
"CMS站点配置表": "CMS站点配置表",
"Cancel": "Cancel",
"Conform": "Conform",
"Delete Error": "Delete Error",
"Delete Success": "Delete Success",
"Discard": "Discard",
"ID": "ID",
"JSON": "JSON",
"N 个行业模型": "N 个行业模型",
"Please login": "Please login",
"Record no exist or with wrong ownership": "Record no exist or with wrong ownership",
"Reset": "Reset",
"Submit": "Submit",
"Update Error": "Update Error",
"Update Success": "Update Success",
"X 个智能体": "X 个智能体",
"failed": "failed",
"ok": "ok",
"© 2026 开元云科技 · 国家级高新技术企业 · 专精特新企业": "© 2026 开元云科技 · 国家级高新技术企业 · 专精特新企业",
"⚙️": "⚙️",
"一个AI平台 + N个行业模型 + X个智能体": "一个AI平台 + N个行业模型 + X个智能体",
"个人信息": "个人信息",
"了解产品架构": "了解产品架构",
"了解更多 → 联系销售": "了解更多 → 联系销售",
"产品": "产品",
"产品架构": "产品架构",
"企业CMS管理后台": "企业CMS管理后台",
"企业动态": "企业动态",
"值类型": "值类型",
"全部分类": "全部分类",
"全部类型": "全部类型",
"公司": "公司",
"其他": "其他",
"内容不存在": "内容不存在",
"内容分类": "内容分类",
"内容管理": "内容管理",
"内容类型": "内容类型",
"分类ID": "分类ID",
"分类名称": "分类名称",
"分类名称不能为空": "分类名称不能为空",
"创建人": "创建人",
"创建时间": "创建时间",
"副标题": "副标题",
"医疗健康": "医疗健康",
"原始文本": "原始文本",
"发布时间": "发布时间",
"商机线索": "商机线索",
"图片URL": "图片URL",
"地区": "地区",
"基于东数西算国家战略部署提供高性能、低成本的AI算力服务。支持主流大模型的统一接入、调度和管理为企业构建坚实的AI基础设施。": "基于东数西算国家战略部署提供高性能、低成本的AI算力服务。支持主流大模型的统一接入、调度和管理为企业构建坚实的AI基础设施。",
"基于东数西算国家战略打造新一代AI智能体服务平台赋能千行百业智能化转型": "基于东数西算国家战略打造新一代AI智能体服务平台赋能千行百业智能化转型",
"备注": "备注",
"官网": "官网",
"官网预览": "官网预览",
"实时交易风险监测欺诈识别准确率提升60%误报率降低35%": "实时交易风险监测欺诈识别准确率提升60%误报率降低35%",
"审批ID": "审批ID",
"展示配置": "展示配置",
"已关闭": "已关闭",
"已发布": "已发布",
"已归档": "已归档",
"已确认": "已确认",
"已转化": "已转化",
"布尔": "布尔",
"开元云科技": "开元云科技",
"开元云科技与多家行业领军企业达成战略合作共建AI生态": "开元云科技与多家行业领军企业达成战略合作共建AI生态",
"开元云科技发布新一代AI智能体平台赋能企业数字化转型": "开元云科技发布新一代AI智能体平台赋能企业数字化转型",
"影像AI辅助诊断覆盖50+病种诊断效率提升3倍漏诊率降低80%": "影像AI辅助诊断覆盖50+病种诊断效率提升3倍漏诊率降低80%",
"想了解这些方案如何落地?": "想了解这些方案如何落地?",
"意向产品": "意向产品",
"感谢您的留言,我们会尽快联系您!": "感谢您的留言,我们会尽快联系您!",
"成功案例": "成功案例",
"扩展JSON": "扩展JSON",
"排序": "排序",
"描述": "描述",
"摘要": "摘要",
"数字": "数字",
"文本": "文本",
"新线索": "新线索",
"新闻": "新闻",
"新闻、案例、产品、Banner": "新闻、案例、产品、Banner",
"是否可见": "是否可见",
"显示": "显示",
"智能体支持多模态交互、工具调用、多Agent协作。企业可根据业务需求自由组合和定制打造专属AI工作团队。": "智能体支持多模态交互、工具调用、多Agent协作。企业可根据业务需求自由组合和定制打造专属AI工作团队。",
"智能制造": "智能制造",
"更新时间": "更新时间",
"未登录": "未登录",
"来源": "来源",
"某三甲医院AI辅助诊断": "某三甲医院AI辅助诊断",
"某大型制造企业智能质检": "某大型制造企业智能质检",
"某银行智能风控系统": "某银行智能风控系统",
"查看全部 →": "查看全部 →",
"标签": "标签",
"标题": "标题",
"标题不能为空": "标题不能为空",
"栏目Key": "栏目Key",
"栏目Key和标题不能为空": "栏目Key和标题不能为空",
"栏目排序、显示隐藏、展示风格": "栏目排序、显示隐藏、展示风格",
"栏目管理": "栏目管理",
"栏目类型": "栏目类型",
"样式配置": "样式配置",
"案例": "案例",
"正文": "正文",
"每个行业模型都经过大量行业数据训练和微调理解行业术语和业务流程能够直接解决行业痛点快速落地AI应用。": "每个行业模型都经过大量行业数据训练和微调理解行业术语和业务流程能够直接解决行业痛点快速落地AI应用。",
"注册": "注册",
"灵活组合的智能体应用,覆盖客服、写作、分析、编程等多种场景": "灵活组合的智能体应用,覆盖客服、写作、分析、编程等多种场景",
"父分类ID": "父分类ID",
"状态": "状态",
"电话": "电话",
"留言": "留言",
"登录": "登录",
"看看AI如何改变这些行业": "看看AI如何改变这些行业",
"站点配置": "站点配置",
"管理产品分类、案例行业、新闻栏目": "管理产品分类、案例行业、新闻栏目",
"管理后台": "管理后台",
"管理官网内容、分类、商机线索和站点配置": "管理官网内容、分类、商机线索和站点配置",
"组织ID": "组织ID",
"统一AI基础设施平台提供算力调度、模型管理、智能体编排等核心能力": "统一AI基础设施平台提供算力调度、模型管理、智能体编排等核心能力",
"缺少ID": "缺少ID",
"缺少id": "缺少id",
"联系中": "联系中",
"联系人": "联系人",
"联系销售": "联系销售",
"草稿": "草稿",
"行业": "行业",
"表单": "表单",
"访客留言、AI抽取商机": "访客留言、AI抽取商机",
"负责人": "负责人",
"退出登录": "退出登录",
"邮箱": "邮箱",
"配置值": "配置值",
"配置组": "配置组",
"配置组和配置键不能为空": "配置组和配置键不能为空",
"配置键": "配置键",
"金融科技": "金融科技",
"针对制造、金融、医疗、教育等行业深度定制的专业AI模型": "针对制造、金融、医疗、教育等行业深度定制的专业AI模型",
"隐藏": "隐藏",
"静态内容": "静态内容",
"首屏标语、页脚信息、联系方式": "首屏标语、页脚信息、联系方式"
}

150
wwwroot/i18n/zh/msg.txt Normal file
View File

@ -0,0 +1,150 @@
1 个 AI 平台: 1 个 AI 平台
1+N+X 产品架构: 1+N+X 产品架构
AI抽取: AI抽取
AI视觉检测替代人工质检缺陷识别准确率达99.7%产线效率提升40%: AI视觉检测替代人工质检缺陷识别准确率达99.7%产线效率提升40%
Add Error: Add Error
Add Success: Add Success
Authorization Error: Authorization Error
Banner: Banner
CMS内容表: CMS内容表
CMS分类表: CMS分类表
CMS商机线索表: CMS商机线索表
CMS栏目表: CMS栏目表
CMS站点配置表: CMS站点配置表
Cancel: Cancel
Conform: Conform
Delete Error: Delete Error
Delete Success: Delete Success
Discard: Discard
ID: ID
JSON: JSON
N 个行业模型: N 个行业模型
Please login: Please login
Record no exist or with wrong ownership: Record no exist or with wrong ownership
Reset: Reset
Submit: Submit
Update Error: Update Error
Update Success: Update Success
X 个智能体: X 个智能体
failed: failed
ok: ok
© 2026 开元云科技 · 国家级高新技术企业 · 专精特新企业: © 2026 开元云科技 · 国家级高新技术企业 · 专精特新企业
⚙️: ⚙️
一个AI平台 + N个行业模型 + X个智能体: 一个AI平台 + N个行业模型 + X个智能体
个人信息: 个人信息
了解产品架构: 了解产品架构
了解更多 → 联系销售: 了解更多 → 联系销售
产品: 产品
产品架构: 产品架构
企业CMS管理后台: 企业CMS管理后台
企业动态: 企业动态
值类型: 值类型
全部分类: 全部分类
全部类型: 全部类型
公司: 公司
其他: 其他
内容不存在: 内容不存在
内容分类: 内容分类
内容管理: 内容管理
内容类型: 内容类型
分类ID: 分类ID
分类名称: 分类名称
分类名称不能为空: 分类名称不能为空
创建人: 创建人
创建时间: 创建时间
副标题: 副标题
医疗健康: 医疗健康
原始文本: 原始文本
发布时间: 发布时间
商机线索: 商机线索
图片URL: 图片URL
地区: 地区
基于东数西算国家战略部署提供高性能、低成本的AI算力服务。支持主流大模型的统一接入、调度和管理为企业构建坚实的AI基础设施。: 基于东数西算国家战略部署提供高性能、低成本的AI算力服务。支持主流大模型的统一接入、调度和管理为企业构建坚实的AI基础设施。
基于东数西算国家战略打造新一代AI智能体服务平台赋能千行百业智能化转型: 基于东数西算国家战略打造新一代AI智能体服务平台赋能千行百业智能化转型
备注: 备注
官网: 官网
官网预览: 官网预览
实时交易风险监测欺诈识别准确率提升60%误报率降低35%: 实时交易风险监测欺诈识别准确率提升60%误报率降低35%
审批ID: 审批ID
展示配置: 展示配置
已关闭: 已关闭
已发布: 已发布
已归档: 已归档
已确认: 已确认
已转化: 已转化
布尔: 布尔
开元云科技: 开元云科技
开元云科技与多家行业领军企业达成战略合作共建AI生态: 开元云科技与多家行业领军企业达成战略合作共建AI生态
开元云科技发布新一代AI智能体平台赋能企业数字化转型: 开元云科技发布新一代AI智能体平台赋能企业数字化转型
影像AI辅助诊断覆盖50+病种诊断效率提升3倍漏诊率降低80%: 影像AI辅助诊断覆盖50+病种诊断效率提升3倍漏诊率降低80%
想了解这些方案如何落地?: 想了解这些方案如何落地?
意向产品: 意向产品
感谢您的留言,我们会尽快联系您!: 感谢您的留言,我们会尽快联系您!
成功案例: 成功案例
扩展JSON: 扩展JSON
排序: 排序
描述: 描述
摘要: 摘要
数字: 数字
文本: 文本
新线索: 新线索
新闻: 新闻
新闻、案例、产品、Banner: 新闻、案例、产品、Banner
是否可见: 是否可见
显示: 显示
智能体支持多模态交互、工具调用、多Agent协作。企业可根据业务需求自由组合和定制打造专属AI工作团队。: 智能体支持多模态交互、工具调用、多Agent协作。企业可根据业务需求自由组合和定制打造专属AI工作团队。
智能制造: 智能制造
更新时间: 更新时间
未登录: 未登录
来源: 来源
某三甲医院AI辅助诊断: 某三甲医院AI辅助诊断
某大型制造企业智能质检: 某大型制造企业智能质检
某银行智能风控系统: 某银行智能风控系统
查看全部 →: 查看全部 →
标签: 标签
标题: 标题
标题不能为空: 标题不能为空
栏目Key: 栏目Key
栏目Key和标题不能为空: 栏目Key和标题不能为空
栏目排序、显示隐藏、展示风格: 栏目排序、显示隐藏、展示风格
栏目管理: 栏目管理
栏目类型: 栏目类型
样式配置: 样式配置
案例: 案例
正文: 正文
每个行业模型都经过大量行业数据训练和微调理解行业术语和业务流程能够直接解决行业痛点快速落地AI应用。: 每个行业模型都经过大量行业数据训练和微调理解行业术语和业务流程能够直接解决行业痛点快速落地AI应用。
注册: 注册
灵活组合的智能体应用,覆盖客服、写作、分析、编程等多种场景: 灵活组合的智能体应用,覆盖客服、写作、分析、编程等多种场景
父分类ID: 父分类ID
状态: 状态
电话: 电话
留言: 留言
登录: 登录
看看AI如何改变这些行业: 看看AI如何改变这些行业
站点配置: 站点配置
管理产品分类、案例行业、新闻栏目: 管理产品分类、案例行业、新闻栏目
管理后台: 管理后台
管理官网内容、分类、商机线索和站点配置: 管理官网内容、分类、商机线索和站点配置
组织ID: 组织ID
统一AI基础设施平台提供算力调度、模型管理、智能体编排等核心能力: 统一AI基础设施平台提供算力调度、模型管理、智能体编排等核心能力
缺少ID: 缺少ID
缺少id: 缺少id
联系中: 联系中
联系人: 联系人
联系销售: 联系销售
草稿: 草稿
行业: 行业
表单: 表单
访客留言、AI抽取商机: 访客留言、AI抽取商机
负责人: 负责人
退出登录: 退出登录
邮箱: 邮箱
配置值: 配置值
配置组: 配置组
配置组和配置键不能为空: 配置组和配置键不能为空
配置键: 配置键
金融科技: 金融科技
针对制造、金融、医疗、教育等行业深度定制的专业AI模型: 针对制造、金融、医疗、教育等行业深度定制的专业AI模型
隐藏: 隐藏
静态内容: 静态内容
首屏标语、页脚信息、联系方式: 首屏标语、页脚信息、联系方式

View File

@ -0,0 +1 @@
return json.dumps({"success": True, "msgs": {}}, ensure_ascii=False)

247
wwwroot/index.ui Normal file
View File

@ -0,0 +1,247 @@
{% set config = get_site_config() %}
{% set products = get_published_content('product', 10) %}
{% set cases = get_published_content('case', 6) %}
{% set news = get_latest_news(2) %}
{
"widgettype": "VBox",
"id": "app",
"options": {"width": "100%", "css": "site-root"},
"subwidgets": [
{
"widgettype": "HBox",
"id": "nav_bar",
"options": {"width": "100%", "css": "nav-bar"},
"subwidgets": [
{
"widgettype": "Text",
"options": {"text": "开元云科技", "css": "nav-logo"}
},
{
"widgettype": "HBox",
"options": {"css": "nav-links"},
"subwidgets": [
{"widgettype": "Button", "options": {"label": "产品架构", "css": "nav-link"},
"binds": [{"wid": "self", "event": "click", "actiontype": "script", "script": "var e=document.getElementById('products');if(e)e.scrollIntoView({behavior:'smooth'})"}]},
{"widgettype": "Button", "options": {"label": "成功案例", "css": "nav-link"},
"binds": [{"wid": "self", "event": "click", "actiontype": "script", "script": "var e=document.getElementById('cases');if(e)e.scrollIntoView({behavior:'smooth'})"}]},
{"widgettype": "Button", "options": {"label": "企业动态", "css": "nav-link"},
"binds": [{"wid": "self", "event": "click", "actiontype": "script", "script": "var e=document.getElementById('news');if(e)e.scrollIntoView({behavior:'smooth'})"}]}
]
},
{"widgettype": "Filler"},
{
"widgettype": "HBox",
"options": {"css": "nav-right"},
"subwidgets": [
{"widgettype": "Button", "options": {"label": "联系销售", "css": "nav-cta"},
"binds": [{"wid": "self", "event": "click", "actiontype": "script", "script": "var e=document.getElementById('contact');if(e)e.scrollIntoView({behavior:'smooth'})"}]},
{% if get_user() %}
{
"widgettype": "HBox",
"options": {"css": "nav-user clickable"},
"binds": [{
"wid": "self", "event": "click",
"actiontype": "urlwidget",
"popup_options": {"eventpos": true, "cwidth": 10, "dismiss_events": ["command"]},
"target": "Popup",
"options": {"url": "{{entire_url('user_menu.ui')}}"}
}],
"subwidgets": [
{"widgettype": "Text", "options": {"text": "&#x1F464;", "css": "nav-avatar"}},
{"widgettype": "Text", "options": {"text": "{{ get_username() }}", "css": "nav-username"}}
]
}
{% else %}
{"widgettype": "Button", "options": {"label": "登录", "css": "nav-login"},
"binds": [{"wid": "self", "event": "click", "actiontype": "urlwidget", "target": "self", "options": {"url": "{{entire_url('/rbac/user/login.ui')}}"}}]},
{"widgettype": "Button", "options": {"label": "注册", "css": "nav-register"},
"binds": [{"wid": "self", "event": "click", "actiontype": "urlwidget", "target": "self", "options": {"url": "{{entire_url('/rbac/user/register.ui')}}"}}]}
{% endif %}
]
}
]
},
{
"widgettype": "VBox",
"id": "hero",
"options": {"width": "100%", "css": "hero-section"},
"subwidgets": [
{"widgettype": "Html", "options": {"html": "<div class=\"hero-bg-glow\"></div>"}},
{
"widgettype": "VBox",
"options": {"css": "hero-content"},
"subwidgets": [
{"widgettype": "Html", "options": {"html": "<div class=\"hero-tag\"><span class=\"pulse-dot\"></span>AI 智能体服务平台</div>"}},
{"widgettype": "Html", "options": {"html": "<h1 class=\"hero-title\">一个平台,<span class=\"gradient-text\">千行百业</span><br>智能跃迁</h1>"}},
{"widgettype": "Text", "options": {"text": "基于东数西算国家战略打造新一代AI智能体服务平台赋能千行百业智能化转型", "css": "hero-subtitle"}},
{
"widgettype": "HBox",
"options": {"css": "hero-buttons"},
"subwidgets": [
{"widgettype": "Button", "options": {"label": "联系销售", "css": "btn-primary"},
"binds": [{"wid": "self", "event": "click", "actiontype": "script", "script": "var e=document.getElementById('contact');if(e)e.scrollIntoView({behavior:'smooth'})"}]},
{"widgettype": "Button", "options": {"label": "了解产品架构", "css": "btn-outline"},
"binds": [{"wid": "self", "event": "click", "actiontype": "script", "script": "var e=document.getElementById('products');if(e)e.scrollIntoView({behavior:'smooth'})"}]}
]
}
]
},
{"widgettype": "Html", "options": {"html": "<div class=\"hero-mascot\"><svg width=\"200\" height=\"160\" viewBox=\"0 0 200 160\" fill=\"none\" stroke=\"white\" stroke-width=\"1.8\"><path d=\"M40 100c0-33 27-60 60-60 24 0 44 14 54 34 4-2 8-3 13-3 18 0 33 15 33 33s-15 33-33 33H53c-18 0-33-15-33-33 0-15 10-27 20-4z\" stroke-linejoin=\"round\"/><circle cx=\"80\" cy=\"90\" r=\"5\"/><circle cx=\"110\" cy=\"90\" r=\"5\"/><path d=\"M85 105c5 5 15 5 20 0\" stroke-linecap=\"round\"/><path d=\"M95 50c-3-15 3-25 10-30\" stroke-linecap=\"round\"/><circle cx=\"107\" cy=\"18\" r=\"4\"/></svg></div>"}}
]
},
{
"widgettype": "VBox",
"id": "products",
"options": {"width": "100%", "css": "section fade-in"},
"subwidgets": [
{"widgettype": "Title2", "options": {"text": "1+N+X 产品架构", "css": "section-title"}},
{"widgettype": "Text", "options": {"text": "一个AI平台 + N个行业模型 + X个智能体", "css": "section-desc"}},
{
"widgettype": "HBox",
"options": {"css": "products-grid"},
"subwidgets": [
{
"widgettype": "VBox",
"options": {"css": "product-card"},
"subwidgets": [
{"widgettype": "Html", "options": {"html": "<div class=\"card-icon\">🧠</div>"}},
{"widgettype": "Title3", "options": {"text": "1 个 AI 平台", "css": "card-title"}},
{"widgettype": "Text", "options": {"text": "统一AI基础设施平台提供算力调度、模型管理、智能体编排等核心能力", "css": "card-desc"}},
{"widgettype": "Text", "options": {"text": "基于东数西算国家战略部署提供高性能、低成本的AI算力服务。支持主流大模型的统一接入、调度和管理为企业构建坚实的AI基础设施。", "css": "product-detail"}}
]
},
{
"widgettype": "VBox",
"options": {"css": "product-card"},
"subwidgets": [
{"widgettype": "Html", "options": {"html": "<div class=\"card-icon\">🏭</div>"}},
{"widgettype": "Title3", "options": {"text": "N 个行业模型", "css": "card-title"}},
{"widgettype": "Text", "options": {"text": "针对制造、金融、医疗、教育等行业深度定制的专业AI模型", "css": "card-desc"}},
{"widgettype": "Text", "options": {"text": "每个行业模型都经过大量行业数据训练和微调理解行业术语和业务流程能够直接解决行业痛点快速落地AI应用。", "css": "product-detail"}}
]
},
{
"widgettype": "VBox",
"options": {"css": "product-card"},
"subwidgets": [
{"widgettype": "Html", "options": {"html": "<div class=\"card-icon\">🤖</div>"}},
{"widgettype": "Title3", "options": {"text": "X 个智能体", "css": "card-title"}},
{"widgettype": "Text", "options": {"text": "灵活组合的智能体应用,覆盖客服、写作、分析、编程等多种场景", "css": "card-desc"}},
{"widgettype": "Text", "options": {"text": "智能体支持多模态交互、工具调用、多Agent协作。企业可根据业务需求自由组合和定制打造专属AI工作团队。", "css": "product-detail"}}
]
}
]
}
]
},
{
"widgettype": "VBox",
"id": "cases",
"options": {"width": "100%", "css": "section fade-in"},
"subwidgets": [
{
"widgettype": "HBox",
"options": {"css": "section-header"},
"subwidgets": [
{
"widgettype": "VBox",
"subwidgets": [
{"widgettype": "Title2", "options": {"text": "成功案例", "css": "section-title"}},
{"widgettype": "Text", "options": {"text": "看看AI如何改变这些行业", "css": "section-desc"}}
]
},
{"widgettype": "Filler"}
]
},
{
"widgettype": "HBox",
"options": {"css": "cases-grid"},
"subwidgets": [
{
"widgettype": "VBox",
"options": {"css": "case-card"},
"subwidgets": [
{"widgettype": "Text", "options": {"text": "智能制造", "css": "case-tag"}},
{"widgettype": "Title4", "options": {"text": "某大型制造企业智能质检", "css": "case-title"}},
{"widgettype": "Text", "options": {"text": "AI视觉检测替代人工质检缺陷识别准确率达99.7%产线效率提升40%", "css": "case-desc"}}
]
},
{
"widgettype": "VBox",
"options": {"css": "case-card"},
"subwidgets": [
{"widgettype": "Text", "options": {"text": "金融科技", "css": "case-tag"}},
{"widgettype": "Title4", "options": {"text": "某银行智能风控系统", "css": "case-title"}},
{"widgettype": "Text", "options": {"text": "实时交易风险监测欺诈识别准确率提升60%误报率降低35%", "css": "case-desc"}}
]
},
{
"widgettype": "VBox",
"options": {"css": "case-card"},
"subwidgets": [
{"widgettype": "Text", "options": {"text": "医疗健康", "css": "case-tag"}},
{"widgettype": "Title4", "options": {"text": "某三甲医院AI辅助诊断", "css": "case-title"}},
{"widgettype": "Text", "options": {"text": "影像AI辅助诊断覆盖50+病种诊断效率提升3倍漏诊率降低80%", "css": "case-desc"}}
]
}
]
},
{
"widgettype": "HBox",
"options": {"css": "cta-banner"},
"subwidgets": [
{"widgettype": "Text", "options": {"text": "想了解这些方案如何落地?", "css": "cta-text"}},
{"widgettype": "Button", "options": {"label": "了解更多 → 联系销售", "css": "btn-primary"},
"binds": [{"wid": "self", "event": "click", "actiontype": "script", "script": "var e=document.getElementById('contact');if(e)e.scrollIntoView({behavior:'smooth'})"}]}
]
}
]
},
{
"widgettype": "VBox",
"id": "news",
"options": {"width": "100%", "css": "section fade-in"},
"subwidgets": [
{
"widgettype": "HBox",
"options": {"css": "news-header"},
"subwidgets": [
{"widgettype": "Title2", "options": {"text": "企业动态", "css": "section-title"}},
{"widgettype": "Button", "options": {"label": "查看全部 →", "css": "news-view-all"},
"binds": [{"wid": "self", "event": "click", "actiontype": "urlwidget", "target": "self", "options": {"url": "{{entire_url('news.ui')}}"}}]}
]
},
{
"widgettype": "VBox",
"options": {"css": "news-list"},
"subwidgets": [
{
"widgettype": "HBox",
"options": {"css": "news-item"},
"subwidgets": [
{"widgettype": "Text", "options": {"text": "2026-05-20", "css": "news-date"}},
{"widgettype": "Text", "options": {"text": "开元云科技发布新一代AI智能体平台赋能企业数字化转型", "css": "news-title"}}
]
},
{
"widgettype": "HBox",
"options": {"css": "news-item"},
"subwidgets": [
{"widgettype": "Text", "options": {"text": "2026-05-15", "css": "news-date"}},
{"widgettype": "Text", "options": {"text": "开元云科技与多家行业领军企业达成战略合作共建AI生态", "css": "news-title"}}
]
}
]
}
]
},
{
"widgettype": "VBox",
"options": {"width": "100%", "css": "site-footer"},
"subwidgets": [
{"widgettype": "Text", "options": {"text": "© 2026 开元云科技 · 国家级高新技术企业 · 专精特新企业"}}
]
},
{"widgettype": "Html", "options": {"html": "<div class=\"float-contact\" id=\"contact\"><div class=\"float-bubble\">有什么可以帮您?</div><div class=\"float-avatar\"><svg width=\"32\" height=\"32\" viewBox=\"0 0 200 160\" fill=\"none\" stroke=\"white\" stroke-width=\"5\"><path d=\"M40 100c0-33 27-60 60-60 24 0 44 14 54 34 4-2 8-3 13-3 18 0 33 15 33 33s-15 33-33 33H53c-18 0-33-15-33-33 0-15 10-27 20-4z\" stroke-linejoin=\"round\"/><circle cx=\"80\" cy=\"90\" r=\"5\" fill=\"white\"/><circle cx=\"110\" cy=\"90\" r=\"5\" fill=\"white\"/><path d=\"M85 105c5 5 15 5 20 0\" stroke-linecap=\"round\"/><path d=\"M95 50c-3-15 3-25 10-30\" stroke-linecap=\"round\"/><circle cx=\"107\" cy=\"18\" r=\"4\" fill=\"white\"/></svg></div><div class=\"float-panel\"><div class=\"panel-header\">云宝商机助手</div><div class=\"panel-body\"><div class=\"panel-option\" data-form=\"product_interest\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"/></svg>您对哪些产品感兴趣?</div><div class=\"panel-option\" data-form=\"message\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M21 15a2 2 0 01-2 2H7l-4 4V5a2 2 0 012-2h14a2 2 0 012 2z\"/></svg>给我们留言</div><div class=\"panel-option\" data-form=\"contact\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M22 16.92v3a2 2 0 01-2.18 2 19.79 19.79 0 01-8.63-3.07 19.5 19.5 0 01-6-6A19.79 19.79 0 012.12 4.18 2 2 0 014.11 2h3a2 2 0 012 1.72c.127.96.361 1.903.7 2.81a2 2 0 01-.45 2.11L8.09 9.91a16 16 0 006 6l1.27-1.27a2 2 0 012.11-.45c.907.339 1.85.573 2.81.7A2 2 0 0122 16.92z\"/></svg>留下联系方式</div></div><div class=\"panel-form\" data-submit-url=\"{{entire_url('api/submit_lead.dspy')}}\"><button class=\"back-btn\">← 返回</button><input name=\"name\" placeholder=\"您的姓名\" type=\"text\"/><input name=\"phone\" placeholder=\"联系电话 *\" type=\"tel\"/><input name=\"company\" placeholder=\"公司名称\" type=\"text\"/><textarea name=\"message\" placeholder=\"请描述您的需求...\" rows=\"3\"></textarea><button class=\"submit-btn\">提交</button></div></div></div>"}}
]
}

44
wwwroot/menu.ui Normal file
View File

@ -0,0 +1,44 @@
{
"widgettype": "Menu",
"id": "entcms_menu",
"options": {
"items": [
{
"name": "cms_content_list",
"label": "内容管理",
"url": "{{entire_url('/cms_content_list')}}",
"target": "app.sage_main_content"
},
{
"name": "cms_sections_list",
"label": "栏目管理",
"url": "{{entire_url('/cms_sections_list')}}",
"target": "app.sage_main_content"
},
{
"name": "cms_categories_list",
"label": "内容分类",
"url": "{{entire_url('/cms_categories_list')}}",
"target": "app.sage_main_content"
},
{
"name": "cms_leads_list",
"label": "商机线索",
"url": "{{entire_url('/cms_leads_list')}}",
"target": "app.sage_main_content"
},
{
"name": "cms_site_config_list",
"label": "站点配置",
"url": "{{entire_url('/cms_site_config_list')}}",
"target": "app.sage_main_content"
},
{
"name": "public_site",
"label": "官网预览",
"url": "{{entire_url('/index.ui')}}",
"target": "app.sage_main_content"
}
]
}
}

13
wwwroot/news.ui Normal file
View File

@ -0,0 +1,13 @@
{% set news_items = get_published_content('news', 50) %}
{
"widgettype": "VBox",
"options": {"width": "100%", "css": "site-root"},
"subwidgets": [
{
"widgettype": "Html",
"options": {
"html": "<nav class=\"nav-bar\"><a class=\"nav-logo\" href=\"{{entire_url('index.ui')}}\">开元云科技<\/a><ul class=\"nav-links\"><li><a href=\"{{entire_url('index.ui')}}#products\">产品架构<\/a><\/li><li><a href=\"{{entire_url('index.ui')}}#cases\">成功案例<\/a><\/li><li><a href=\"{{entire_url('index.ui')}}#news\">企业动态<\/a><\/li><\/ul><\/nav><section class=\"section\" style=\"padding-top:100px\"><h2 class=\"section-title\">企业动态<\/h2><p class=\"section-desc\">了解开元云最新资讯与行业洞察<\/p><div class=\"news-list\">{% for item in news_items %}<a class=\"news-item\" href=\"{{entire_url('news_detail.ui')}}?id={{item.id}}\"><span class=\"news-date\">{{item.published_at or item.created_at}}<\/span><div><span class=\"news-title\">{{item.title}}<\/span>{% if item.summary_text %}<p style=\"font-size:13px;color:#666;margin-top:4px\">{{item.summary_text}}<\/p>{% endif %}<\/div><\/a>{% endfor %}<\/div><\/section><footer class=\"site-footer\"><p>© 2026 开元云科技 · 国家级高新技术企业 · 专精特新企业<\/p><\/footer>"
}
}
]
}

13
wwwroot/news_detail.ui Normal file
View File

@ -0,0 +1,13 @@
{% set article = get_content_detail(params_kw.get('id', '')) %}
{
"widgettype": "VBox",
"options": {"width": "100%", "css": "site-root"},
"subwidgets": [
{
"widgettype": "Html",
"options": {
"html": "<nav class=\"nav-bar\"><a class=\"nav-logo\" href=\"{{entire_url('index.ui')}}\">开元云科技<\/a><ul class=\"nav-links\"><li><a href=\"{{entire_url('index.ui')}}#products\">产品架构<\/a><\/li><li><a href=\"{{entire_url('index.ui')}}#cases\">成功案例<\/a><\/li><li><a href=\"{{entire_url('news.ui')}}\">企业动态<\/a><\/li><\/ul><\/nav><section class=\"section\" style=\"padding-top:100px;max-width:800px\">{% if article %}<a href=\"{{entire_url('news.ui')}}\" style=\"color:#A29BFE;font-size:14px;margin-bottom:24px;display:inline-block\">← 返回新闻列表<\/a><h1 class=\"section-title\" style=\"margin-bottom:12px\">{{article.title}}<\/h1><p style=\"font-size:13px;color:#666;margin-bottom:32px\">{{article.published_at or article.created_at}}{% if article.tags %} · {{article.tags}}{% endif %}<\/p>{% if article.image_url %}<img src=\"{{article.image_url}}\" style=\"width:100%;border-radius:12px;margin-bottom:32px\" /><\/img>{% endif %}<div style=\"font-size:16px;line-height:1.8;color:#ccc\">{{article.body or article.summary_text or ''}}<\/div>{% else %}<p style=\"color:#999\">文章不存在或已下线<\/p><a href=\"{{entire_url('news.ui')}}\" style=\"color:#A29BFE\">← 返回新闻列表<\/a>{% endif %}<\/section><footer class=\"site-footer\"><p>© 2026 开元云科技 · 国家级高新技术企业 · 专精特新企业<\/p><\/footer>"
}
}
]
}

View File

@ -0,0 +1,89 @@
{% if get_user() %}
{
"widgettype": "HBox",
"options": {
"css": "portal-user-info clickable",
"width": "auto"
},
"binds": [
{
"wid": "self",
"event": "click",
"actiontype": "urlwidget",
"popup_options": {
"eventpos": true,
"cwidth": 10,
"dismiss_events": ["command"]
},
"target": "Popup",
"options": {
"url": "{{entire_url('user_menu.ui')}}"
}
}
],
"subwidgets": [
{
"widgettype": "Svg",
"options": {
"url": "{{entire_url('/bricks/imgs/user.svg')}}",
"rate": 1.3
}
},
{
"widgettype": "Text",
"options": {
"css": "portal-username",
"text": "{{get_username()}}"
}
}
]
}
{% else %}
{
"widgettype": "HBox",
"options": {
"css": "portal-user-info",
"width": "auto"
},
"subwidgets": [
{
"widgettype": "Button",
"options": {
"label": "登录",
"css": "portal-login-btn",
"i18n": true
},
"binds": [
{
"wid": "self",
"event": "click",
"actiontype": "urlwidget",
"target": "self",
"options": {
"url": "{{entire_url('/rbac/user/login.ui')}}"
}
}
]
},
{
"widgettype": "Button",
"options": {
"label": "注册",
"css": "portal-register-btn",
"i18n": true
},
"binds": [
{
"wid": "self",
"event": "click",
"actiontype": "urlwidget",
"target": "self",
"options": {
"url": "{{entire_url('/rbac/user/register.ui')}}"
}
}
]
}
]
}
{% endif %}

13
wwwroot/products.ui Normal file
View File

@ -0,0 +1,13 @@
{% set products = get_published_content('product', 50) %}
{
"widgettype": "VBox",
"options": {"width": "100%", "css": "site-root"},
"subwidgets": [
{
"widgettype": "Html",
"options": {
"html": "<nav class=\"nav-bar\"><a class=\"nav-logo\" href=\"{{entire_url('index.ui')}}\">开元云科技<\/a><ul class=\"nav-links\"><li><a href=\"{{entire_url('index.ui')}}#products\">产品架构<\/a><\/li><li><a href=\"{{entire_url('index.ui')}}#cases\">成功案例<\/a><\/li><li><a href=\"{{entire_url('news.ui')}}\">企业动态<\/a><\/li><\/ul><\/nav><section class=\"section\" style=\"padding-top:100px\"><h2 class=\"section-title\">产品架构<\/h2><p class=\"section-desc\">AI基础设施全栈解决方案<\/p><div class=\"cases-grid\">{% for p in products %}<div class=\"case-card\"><div class=\"case-tag\">{{p.tags or '核心产品'}}<\/div><div class=\"case-title\">{{p.title}}<\/div><div class=\"case-desc\">{{p.summary_text}}<\/div><\/div>{% endfor %}<\/div><div class=\"cta-banner\" style=\"margin-top:40px\"><div class=\"cta-text\">需要定制化方案?<\/div><a class=\"btn-primary\" href=\"{{entire_url('index.ui')}}#contact\">联系解决方案团队 →<\/a><\/div><\/section><footer class=\"site-footer\"><p>© 2026 开元云科技 · 国家级高新技术企业 · 专精特新企业<\/p><\/footer>"
}
}
]
}

23
wwwroot/user_menu.ui Normal file
View File

@ -0,0 +1,23 @@
{
"widgettype": "Menu",
"options": {
"cwidth": 10,
"items": [
{
"name": "profile",
"label": "个人信息",
"submenu": "{{entire_url('/rbac/user/userinfo.ui')}}"
},
{
"name": "admin",
"label": "管理后台",
"submenu": "{{entire_url('/admin.ui')}}"
},
{
"name": "logout",
"label": "退出登录",
"submenu": "{{entire_url('/rbac/user/logout.dspy')}}"
}
]
}
}

Binary file not shown.