Compare commits
No commits in common. "main" and "master" have entirely different histories.
25
.gitignore
vendored
Normal file
25
.gitignore
vendored
Normal 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
|
||||
80
README.md
80
README.md
@ -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
58
app/global_func.py
Normal 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
58
app/portal.py
Normal 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
171
build.sh
Executable 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
76
conf/config.json
Normal 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
88
deploy.sh
Executable 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
139
docs/architecture.md
Normal 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
90
i18n/en/msg.txt
Normal 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
90
i18n/jp/msg.txt
Normal 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
90
i18n/ko/msg.txt
Normal 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
90
i18n/zh/msg.txt
Normal 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
114
init_any_permissions.py
Normal 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
179
init_data.py
Normal 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()
|
||||
143
init_superuser_permissions.py
Normal file
143
init_superuser_permissions.py
Normal 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
3
json/build.sh
Executable file
@ -0,0 +1,3 @@
|
||||
#!/bin/bash
|
||||
|
||||
xls2ui -m ../models -o ../wwwroot portal *.json
|
||||
29
json/cms_categories_list.json
Normal file
29
json/cms_categories_list.json
Normal 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')}}"
|
||||
}
|
||||
}
|
||||
}
|
||||
38
json/cms_content_list.json
Normal file
38
json/cms_content_list.json
Normal 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
39
json/cms_leads_list.json
Normal 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')}}"
|
||||
}
|
||||
}
|
||||
}
|
||||
32
json/cms_sections_list.json
Normal file
32
json/cms_sections_list.json
Normal 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')}}"
|
||||
}
|
||||
}
|
||||
}
|
||||
30
json/cms_site_config_list.json
Normal file
30
json/cms_site_config_list.json
Normal 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
90
load_path.py
Normal 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())
|
||||
25
models/cms_categories.json
Normal file
25
models/cms_categories.json
Normal 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
35
models/cms_content.json
Normal 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
33
models/cms_leads.json
Normal 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
29
models/cms_sections.json
Normal 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"]}
|
||||
]
|
||||
}
|
||||
23
models/cms_site_config.json
Normal file
23
models/cms_site_config.json
Normal 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
97
plugins/cms_functions.py
Normal 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
14
start.py
Normal 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
18
start.sh
Executable 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
16
stop.sh
Executable 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
322
wwwroot/admin.ui
Normal 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"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
30
wwwroot/api/cms_categories_create.dspy
Normal file
30
wwwroot/api/cms_categories_create.dspy
Normal 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)
|
||||
14
wwwroot/api/cms_categories_delete.dspy
Normal file
14
wwwroot/api/cms_categories_delete.dspy
Normal 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)
|
||||
21
wwwroot/api/cms_categories_update.dspy
Normal file
21
wwwroot/api/cms_categories_update.dspy
Normal 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)
|
||||
39
wwwroot/api/cms_content_create.dspy
Normal file
39
wwwroot/api/cms_content_create.dspy
Normal 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)
|
||||
14
wwwroot/api/cms_content_delete.dspy
Normal file
14
wwwroot/api/cms_content_delete.dspy
Normal 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)
|
||||
24
wwwroot/api/cms_content_update.dspy
Normal file
24
wwwroot/api/cms_content_update.dspy
Normal 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)
|
||||
35
wwwroot/api/cms_leads_create.dspy
Normal file
35
wwwroot/api/cms_leads_create.dspy
Normal 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)
|
||||
14
wwwroot/api/cms_leads_delete.dspy
Normal file
14
wwwroot/api/cms_leads_delete.dspy
Normal 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)
|
||||
20
wwwroot/api/cms_leads_update.dspy
Normal file
20
wwwroot/api/cms_leads_update.dspy
Normal 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)
|
||||
35
wwwroot/api/cms_sections_create.dspy
Normal file
35
wwwroot/api/cms_sections_create.dspy
Normal 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)
|
||||
14
wwwroot/api/cms_sections_delete.dspy
Normal file
14
wwwroot/api/cms_sections_delete.dspy
Normal 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)
|
||||
22
wwwroot/api/cms_sections_update.dspy
Normal file
22
wwwroot/api/cms_sections_update.dspy
Normal 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)
|
||||
29
wwwroot/api/cms_site_config_create.dspy
Normal file
29
wwwroot/api/cms_site_config_create.dspy
Normal 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)
|
||||
14
wwwroot/api/cms_site_config_delete.dspy
Normal file
14
wwwroot/api/cms_site_config_delete.dspy
Normal 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)
|
||||
21
wwwroot/api/cms_site_config_update.dspy
Normal file
21
wwwroot/api/cms_site_config_update.dspy
Normal 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)
|
||||
18
wwwroot/api/get_config.dspy
Normal file
18
wwwroot/api/get_config.dspy
Normal 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}
|
||||
16
wwwroot/api/get_content_detail.dspy
Normal file
16
wwwroot/api/get_content_detail.dspy
Normal 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': '内容不存在'}
|
||||
15
wwwroot/api/get_published_content.dspy
Normal file
15
wwwroot/api/get_published_content.dspy
Normal 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)}
|
||||
9
wwwroot/api/get_search_cms_categories.dspy
Normal file
9
wwwroot/api/get_search_cms_categories.dspy
Normal 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)
|
||||
8
wwwroot/api/get_search_content_type.dspy
Normal file
8
wwwroot/api/get_search_content_type.dspy
Normal 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)
|
||||
18
wwwroot/api/get_sections.dspy
Normal file
18
wwwroot/api/get_sections.dspy
Normal 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)}
|
||||
22
wwwroot/api/submit_lead.dspy
Normal file
22
wwwroot/api/submit_lead.dspy
Normal 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
13
wwwroot/cases.ui
Normal 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
153
wwwroot/cms_scripts.js
Normal 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
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
222
wwwroot/i18n/en/i18n.json
Normal 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
220
wwwroot/i18n/en/msg.txt
Normal 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
222
wwwroot/i18n/jp/i18n.json
Normal 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
220
wwwroot/i18n/jp/msg.txt
Normal 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
222
wwwroot/i18n/ko/i18n.json
Normal 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
220
wwwroot/i18n/ko/msg.txt
Normal 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
152
wwwroot/i18n/zh/i18n.json
Normal 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
150
wwwroot/i18n/zh/msg.txt
Normal 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模型
|
||||
隐藏: 隐藏
|
||||
静态内容: 静态内容
|
||||
首屏标语、页脚信息、联系方式: 首屏标语、页脚信息、联系方式
|
||||
1
wwwroot/i18n_getmsgs.dspy
Normal file
1
wwwroot/i18n_getmsgs.dspy
Normal file
@ -0,0 +1 @@
|
||||
return json.dumps({"success": True, "msgs": {}}, ensure_ascii=False)
|
||||
247
wwwroot/index.ui
Normal file
247
wwwroot/index.ui
Normal 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": "👤", "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
44
wwwroot/menu.ui
Normal 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
13
wwwroot/news.ui
Normal 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
13
wwwroot/news_detail.ui
Normal 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>"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
89
wwwroot/portal_userinfo.ui
Normal file
89
wwwroot/portal_userinfo.ui
Normal 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
13
wwwroot/products.ui
Normal 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
23
wwwroot/user_menu.ui
Normal 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')}}"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
BIN
官网改版设计说明.pptx
Normal file
BIN
官网改版设计说明.pptx
Normal file
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user