Compare commits
No commits in common. "master" and "main" have entirely different histories.
25
.gitignore
vendored
25
.gitignore
vendored
@ -1,25 +0,0 @@
|
|||||||
# 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,80 +1,2 @@
|
|||||||
# Portal — 企业官网CMS独立Web应用
|
# portial
|
||||||
|
|
||||||
基于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 |
|
|
||||||
|
|||||||
@ -1,58 +0,0 @@
|
|||||||
"""
|
|
||||||
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
|
|
||||||
@ -1,58 +0,0 @@
|
|||||||
"""
|
|
||||||
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
171
build.sh
@ -1,171 +0,0 @@
|
|||||||
#!/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"
|
|
||||||
@ -1,76 +0,0 @@
|
|||||||
{
|
|
||||||
"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
88
deploy.sh
@ -1,88 +0,0 @@
|
|||||||
#!/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 "╚══════════════════════════════════════════╝"
|
|
||||||
@ -1,139 +0,0 @@
|
|||||||
# 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 |
|
|
||||||
@ -1,90 +0,0 @@
|
|||||||
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
|
|
||||||
@ -1,90 +0,0 @@
|
|||||||
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が不足しています
|
|
||||||
联系人: 担当者
|
|
||||||
联系销售: 営業に連絡
|
|
||||||
行业: 業界
|
|
||||||
负责人: 担当者
|
|
||||||
退出登录: ログアウト
|
|
||||||
邮箱: メールアドレス
|
|
||||||
配置值: 設定値
|
|
||||||
配置组: 設定グループ
|
|
||||||
配置组和配置键不能为空: 設定グループと設定キーは空にできません
|
|
||||||
配置键: 設定キー
|
|
||||||
静态内容: 静的コンテンツ
|
|
||||||
@ -1,90 +0,0 @@
|
|||||||
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 누락
|
|
||||||
联系人: 담당자
|
|
||||||
联系销售: 영업 문의
|
|
||||||
行业: 업종
|
|
||||||
负责人: 담당자
|
|
||||||
退出登录: 로그아웃
|
|
||||||
邮箱: 이메일
|
|
||||||
配置值: 구성 값
|
|
||||||
配置组: 구성 그룹
|
|
||||||
配置组和配置键不能为空: 구성 그룹과 구성 키는 비워둘 수 없습니다
|
|
||||||
配置键: 구성 키
|
|
||||||
静态内容: 정적 콘텐츠
|
|
||||||
@ -1,90 +0,0 @@
|
|||||||
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
|
|
||||||
联系人: 联系人
|
|
||||||
联系销售: 联系销售
|
|
||||||
行业: 行业
|
|
||||||
负责人: 负责人
|
|
||||||
退出登录: 退出登录
|
|
||||||
邮箱: 邮箱
|
|
||||||
配置值: 配置值
|
|
||||||
配置组: 配置组
|
|
||||||
配置组和配置键不能为空: 配置组和配置键不能为空
|
|
||||||
配置键: 配置键
|
|
||||||
静态内容: 静态内容
|
|
||||||
@ -1,114 +0,0 @@
|
|||||||
"""
|
|
||||||
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
179
init_data.py
@ -1,179 +0,0 @@
|
|||||||
"""
|
|
||||||
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()
|
|
||||||
@ -1,143 +0,0 @@
|
|||||||
"""
|
|
||||||
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完成")
|
|
||||||
@ -1,3 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
xls2ui -m ../models -o ../wwwroot portal *.json
|
|
||||||
@ -1,29 +0,0 @@
|
|||||||
{
|
|
||||||
"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')}}"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,38 +0,0 @@
|
|||||||
{
|
|
||||||
"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')}}"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,39 +0,0 @@
|
|||||||
{
|
|
||||||
"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')}}"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,32 +0,0 @@
|
|||||||
{
|
|
||||||
"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')}}"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,30 +0,0 @@
|
|||||||
{
|
|
||||||
"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
90
load_path.py
@ -1,90 +0,0 @@
|
|||||||
#!/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())
|
|
||||||
@ -1,25 +0,0 @@
|
|||||||
{
|
|
||||||
"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"]}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@ -1,35 +0,0 @@
|
|||||||
{
|
|
||||||
"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"]}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@ -1,33 +0,0 @@
|
|||||||
{
|
|
||||||
"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"]}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@ -1,29 +0,0 @@
|
|||||||
{
|
|
||||||
"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"]}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@ -1,23 +0,0 @@
|
|||||||
{
|
|
||||||
"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"]}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@ -1,97 +0,0 @@
|
|||||||
"""
|
|
||||||
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
14
start.py
@ -1,14 +0,0 @@
|
|||||||
#!/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
18
start.sh
@ -1,18 +0,0 @@
|
|||||||
#!/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
16
stop.sh
@ -1,16 +0,0 @@
|
|||||||
#!/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
322
wwwroot/admin.ui
@ -1,322 +0,0 @@
|
|||||||
{
|
|
||||||
"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"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@ -1,30 +0,0 @@
|
|||||||
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)
|
|
||||||
@ -1,14 +0,0 @@
|
|||||||
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)
|
|
||||||
@ -1,21 +0,0 @@
|
|||||||
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)
|
|
||||||
@ -1,39 +0,0 @@
|
|||||||
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)
|
|
||||||
@ -1,14 +0,0 @@
|
|||||||
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)
|
|
||||||
@ -1,24 +0,0 @@
|
|||||||
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)
|
|
||||||
@ -1,35 +0,0 @@
|
|||||||
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)
|
|
||||||
@ -1,14 +0,0 @@
|
|||||||
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)
|
|
||||||
@ -1,20 +0,0 @@
|
|||||||
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)
|
|
||||||
@ -1,35 +0,0 @@
|
|||||||
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)
|
|
||||||
@ -1,14 +0,0 @@
|
|||||||
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)
|
|
||||||
@ -1,22 +0,0 @@
|
|||||||
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)
|
|
||||||
@ -1,29 +0,0 @@
|
|||||||
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)
|
|
||||||
@ -1,14 +0,0 @@
|
|||||||
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)
|
|
||||||
@ -1,21 +0,0 @@
|
|||||||
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)
|
|
||||||
@ -1,18 +0,0 @@
|
|||||||
|
|
||||||
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}
|
|
||||||
@ -1,16 +0,0 @@
|
|||||||
|
|
||||||
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': '内容不存在'}
|
|
||||||
@ -1,15 +0,0 @@
|
|||||||
|
|
||||||
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)}
|
|
||||||
@ -1,9 +0,0 @@
|
|||||||
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)
|
|
||||||
@ -1,8 +0,0 @@
|
|||||||
result = [
|
|
||||||
{'value': '', 'text': '全部类型'},
|
|
||||||
{'value': 'news', 'text': '新闻'},
|
|
||||||
{'value': 'product', 'text': '产品'},
|
|
||||||
{'value': 'case', 'text': '案例'},
|
|
||||||
{'value': 'banner', 'text': 'Banner'}
|
|
||||||
]
|
|
||||||
return json.dumps(result, ensure_ascii=False)
|
|
||||||
@ -1,18 +0,0 @@
|
|||||||
|
|
||||||
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)}
|
|
||||||
@ -1,22 +0,0 @@
|
|||||||
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'}
|
|
||||||
}
|
|
||||||
@ -1,13 +0,0 @@
|
|||||||
{% 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>"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@ -1,153 +0,0 @@
|
|||||||
/* ===== 开元云科技 官网交互脚本 ===== */
|
|
||||||
|
|
||||||
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' });
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
File diff suppressed because it is too large
Load Diff
@ -1,222 +0,0 @@
|
|||||||
{
|
|
||||||
"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"
|
|
||||||
}
|
|
||||||
@ -1,220 +0,0 @@
|
|||||||
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
|
|
||||||
@ -1,222 +0,0 @@
|
|||||||
{
|
|
||||||
"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モデル",
|
|
||||||
"附属密钥": "附属キー",
|
|
||||||
"限中国国内手机": "中国国内の携帯電話限定",
|
|
||||||
"隐藏": "非表示",
|
|
||||||
"静态内容": "静的コンテンツ",
|
|
||||||
"首屏标语、页脚信息、联系方式": "ファーストビューのスローガン、フッター情報、連絡先"
|
|
||||||
}
|
|
||||||
@ -1,220 +0,0 @@
|
|||||||
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モデル
|
|
||||||
附属密钥: 附属キー
|
|
||||||
限中国国内手机: 中国国内の携帯電話限定
|
|
||||||
隐藏: 非表示
|
|
||||||
静态内容: 静的コンテンツ
|
|
||||||
首屏标语、页脚信息、联系方式: ファーストビューのスローガン、フッター情報、連絡先
|
|
||||||
@ -1,222 +0,0 @@
|
|||||||
{
|
|
||||||
"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 모델",
|
|
||||||
"附属密钥": "보조 키",
|
|
||||||
"限中国国内手机": "중국 국내 휴대폰만 가능",
|
|
||||||
"隐藏": "숨기기",
|
|
||||||
"静态内容": "정적 콘텐츠",
|
|
||||||
"首屏标语、页脚信息、联系方式": "메인 배너 슬로건, 푸터 정보, 연락처"
|
|
||||||
}
|
|
||||||
@ -1,220 +0,0 @@
|
|||||||
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 모델
|
|
||||||
附属密钥: 보조 키
|
|
||||||
限中国国内手机: 중국 국내 휴대폰만 가능
|
|
||||||
隐藏: 숨기기
|
|
||||||
静态内容: 정적 콘텐츠
|
|
||||||
首屏标语、页脚信息、联系方式: 메인 배너 슬로건, 푸터 정보, 연락처
|
|
||||||
@ -1,152 +0,0 @@
|
|||||||
{
|
|
||||||
"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,150 +0,0 @@
|
|||||||
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 +0,0 @@
|
|||||||
return json.dumps({"success": True, "msgs": {}}, ensure_ascii=False)
|
|
||||||
247
wwwroot/index.ui
247
wwwroot/index.ui
@ -1,247 +0,0 @@
|
|||||||
{% 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>"}}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@ -1,44 +0,0 @@
|
|||||||
{
|
|
||||||
"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"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,13 +0,0 @@
|
|||||||
{% 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>"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@ -1,13 +0,0 @@
|
|||||||
{% 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>"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@ -1,89 +0,0 @@
|
|||||||
{% 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 %}
|
|
||||||
@ -1,13 +0,0 @@
|
|||||||
{% 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>"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@ -1,23 +0,0 @@
|
|||||||
{
|
|
||||||
"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
BIN
官网改版设计说明.pptx
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user