- app/portal.py: 主入口,通过from cms.init import load_cms加载业务模块 - conf/config.json: 应用配置(ocai_cms数据库, 端口9090, cms模块wwwroot挂载到/cms) - wwwroot/: 公开页面(index/news/cases/products)和公开API - build.sh: 构建脚本(安装基础设施包+pip install cms模块+DDL/CRUD生成) - deploy.sh: 一键部署脚本(构建→建表→初始数据→权限→启动) - init_data.py: 从cms模块init/data.yaml加载初始数据 - init_any/superuser_permissions.py: RBAC权限初始化
172 lines
4.8 KiB
Bash
Executable File
172 lines
4.8 KiB
Bash
Executable File
#!/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"
|