todo
This commit is contained in:
307
build.sh
Normal file
307
build.sh
Normal file
@@ -0,0 +1,307 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# 数字档案管理系统前端 - 多阶段构建脚本
|
||||||
|
# 支持开发环境构建和生成Docker镜像
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# 颜色定义
|
||||||
|
RED='\033[0;31m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
BLUE='\033[0;34m'
|
||||||
|
NC='\033[0m' # No Color
|
||||||
|
|
||||||
|
# 配置变量
|
||||||
|
PROJECT_NAME="digital-archive-frontend"
|
||||||
|
IMAGE_NAME="${PROJECT_NAME}"
|
||||||
|
IMAGE_TAG="latest"
|
||||||
|
BUILD_TYPE="${1:-prod}" # 构建类型:dev, prod, stage
|
||||||
|
DOCKER_REGISTRY="" # Docker镜像仓库地址
|
||||||
|
PUSH_IMAGE="${2:-false}" # 是否推送镜像
|
||||||
|
|
||||||
|
# 日志函数
|
||||||
|
log_info() {
|
||||||
|
echo -e "${GREEN}[INFO]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
log_warn() {
|
||||||
|
echo -e "${YELLOW}[WARN]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
log_error() {
|
||||||
|
echo -e "${RED}[ERROR]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
log_step() {
|
||||||
|
echo -e "${BLUE}[STEP]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
# 显示帮助信息
|
||||||
|
show_help() {
|
||||||
|
echo "用法: $0 [构建类型] [是否推送镜像]"
|
||||||
|
echo ""
|
||||||
|
echo "构建类型:"
|
||||||
|
echo " dev 开发环境构建"
|
||||||
|
echo " prod 生产环境构建(默认)"
|
||||||
|
echo " stage 测试环境构建"
|
||||||
|
echo ""
|
||||||
|
echo "是否推送镜像:"
|
||||||
|
echo " true 构建完成后推送镜像到仓库"
|
||||||
|
echo " false 仅构建镜像,不推送(默认)"
|
||||||
|
echo ""
|
||||||
|
echo "环境变量:"
|
||||||
|
echo " DOCKER_REGISTRY 设置Docker镜像仓库地址"
|
||||||
|
echo ""
|
||||||
|
echo "示例:"
|
||||||
|
echo " $0 # 生产环境构建,不推送镜像"
|
||||||
|
echo " $0 dev # 开发环境构建"
|
||||||
|
echo " $0 prod true # 生产环境构建并推送镜像"
|
||||||
|
echo " DOCKER_REGISTRY=registry.example.com $0 prod true # 推送到指定仓库"
|
||||||
|
}
|
||||||
|
|
||||||
|
# 检查依赖
|
||||||
|
check_dependencies() {
|
||||||
|
log_step "检查构建依赖..."
|
||||||
|
|
||||||
|
# 检查Node.js
|
||||||
|
if ! command -v node &> /dev/null; then
|
||||||
|
log_error "Node.js 未安装"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 检查npm
|
||||||
|
if ! command -v npm &> /dev/null; then
|
||||||
|
log_error "npm 未安装"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 检查Docker
|
||||||
|
if ! command -v docker &> /dev/null; then
|
||||||
|
log_error "Docker 未安装"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
log_info "Node.js版本: $(node --version)"
|
||||||
|
log_info "npm版本: $(npm --version)"
|
||||||
|
log_info "Docker版本: $(docker --version)"
|
||||||
|
}
|
||||||
|
|
||||||
|
# 清理构建缓存
|
||||||
|
clean_build_cache() {
|
||||||
|
log_step "清理构建缓存..."
|
||||||
|
|
||||||
|
# 清理npm缓存
|
||||||
|
npm cache clean --force
|
||||||
|
|
||||||
|
# 清理Docker构建缓存
|
||||||
|
docker builder prune -f
|
||||||
|
|
||||||
|
# 删除悬空镜像
|
||||||
|
docker image prune -f
|
||||||
|
|
||||||
|
log_info "构建缓存清理完成"
|
||||||
|
}
|
||||||
|
|
||||||
|
# 安装依赖
|
||||||
|
install_dependencies() {
|
||||||
|
log_step "安装项目依赖..."
|
||||||
|
|
||||||
|
# 设置npm镜像源
|
||||||
|
npm config set registry https://registry.npmmirror.com
|
||||||
|
|
||||||
|
# 安装依赖
|
||||||
|
if [[ "$BUILD_TYPE" == "dev" ]]; then
|
||||||
|
npm ci --production=false
|
||||||
|
else
|
||||||
|
npm ci
|
||||||
|
fi
|
||||||
|
|
||||||
|
log_info "依赖安装完成"
|
||||||
|
}
|
||||||
|
|
||||||
|
# 执行代码检查
|
||||||
|
run_code_checks() {
|
||||||
|
log_step "执行代码质量检查..."
|
||||||
|
|
||||||
|
# ESLint检查
|
||||||
|
log_info "运行ESLint检查..."
|
||||||
|
if ! npm run lint; then
|
||||||
|
log_warn "ESLint检查发现一些问题,请检查代码质量"
|
||||||
|
fi
|
||||||
|
|
||||||
|
log_info "代码检查完成"
|
||||||
|
}
|
||||||
|
|
||||||
|
# 构建前端应用
|
||||||
|
build_frontend() {
|
||||||
|
log_step "构建前端应用..."
|
||||||
|
|
||||||
|
case "$BUILD_TYPE" in
|
||||||
|
"dev")
|
||||||
|
log_info "开发环境构建..."
|
||||||
|
npm run build:stage
|
||||||
|
;;
|
||||||
|
"prod")
|
||||||
|
log_info "生产环境构建..."
|
||||||
|
npm run build:prod
|
||||||
|
;;
|
||||||
|
"stage")
|
||||||
|
log_info "测试环境构建..."
|
||||||
|
npm run build:stage
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
log_error "未知的构建类型: $BUILD_TYPE"
|
||||||
|
show_help
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# 检查构建结果
|
||||||
|
if [ ! -d "dist" ]; then
|
||||||
|
log_error "构建失败,dist目录未生成"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
log_info "前端应用构建完成"
|
||||||
|
}
|
||||||
|
|
||||||
|
# 构建Docker镜像
|
||||||
|
build_docker_image() {
|
||||||
|
log_step "构建Docker镜像..."
|
||||||
|
|
||||||
|
local full_image_name="${IMAGE_NAME}:${IMAGE_TAG}"
|
||||||
|
|
||||||
|
# 如果有镜像仓库地址,添加前缀
|
||||||
|
if [ -n "$DOCKER_REGISTRY" ]; then
|
||||||
|
full_image_name="${DOCKER_REGISTRY}/${full_image_name}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
log_info "构建镜像: $full_image_name"
|
||||||
|
|
||||||
|
# 构建Docker镜像
|
||||||
|
docker build \
|
||||||
|
--tag "$full_image_name" \
|
||||||
|
--build-arg BUILD_TYPE="$BUILD_TYPE" \
|
||||||
|
--no-cache \
|
||||||
|
.
|
||||||
|
|
||||||
|
# 验证镜像构建
|
||||||
|
if ! docker image inspect "$full_image_name" > /dev/null 2>&1; then
|
||||||
|
log_error "Docker镜像构建失败"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
log_info "Docker镜像构建完成: $full_image_name"
|
||||||
|
|
||||||
|
# 显示镜像信息
|
||||||
|
docker images | grep "$IMAGE_NAME"
|
||||||
|
}
|
||||||
|
|
||||||
|
# 推送Docker镜像
|
||||||
|
push_docker_image() {
|
||||||
|
if [[ "$PUSH_IMAGE" != "true" ]]; then
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
log_step "推送Docker镜像..."
|
||||||
|
|
||||||
|
local full_image_name="${IMAGE_NAME}:${IMAGE_TAG}"
|
||||||
|
|
||||||
|
# 如果有镜像仓库地址,添加前缀
|
||||||
|
if [ -n "$DOCKER_REGISTRY" ]; then
|
||||||
|
full_image_name="${DOCKER_REGISTRY}/${full_image_name}"
|
||||||
|
else
|
||||||
|
log_error "未设置DOCKER_REGISTRY环境变量,无法推送镜像"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 登录Docker仓库(如果需要)
|
||||||
|
if [[ "$DOCKER_REGISTRY" != "" ]]; then
|
||||||
|
log_info "登录Docker仓库: $DOCKER_REGISTRY"
|
||||||
|
# 这里可以根据需要添加登录逻辑
|
||||||
|
# docker login $DOCKER_REGISTRY
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 推送镜像
|
||||||
|
log_info "推送镜像: $full_image_name"
|
||||||
|
docker push "$full_image_name"
|
||||||
|
|
||||||
|
log_info "镜像推送完成"
|
||||||
|
}
|
||||||
|
|
||||||
|
# 生成部署信息文件
|
||||||
|
generate_deploy_info() {
|
||||||
|
log_step "生成部署信息..."
|
||||||
|
|
||||||
|
local deploy_info="deploy-info.json"
|
||||||
|
|
||||||
|
cat > "$deploy_info" << EOF
|
||||||
|
{
|
||||||
|
"project": "$PROJECT_NAME",
|
||||||
|
"build_type": "$BUILD_TYPE",
|
||||||
|
"image_name": "$IMAGE_NAME",
|
||||||
|
"image_tag": "$IMAGE_TAG",
|
||||||
|
"docker_registry": "$DOCKER_REGISTRY",
|
||||||
|
"build_time": "$(date -Iseconds)",
|
||||||
|
"git_commit": "$(git rev-parse HEAD 2>/dev/null || echo 'unknown')",
|
||||||
|
"git_branch": "$(git branch --show-current 2>/dev/null || echo 'unknown')",
|
||||||
|
"node_version": "$(node --version)",
|
||||||
|
"npm_version": "$(npm --version)"
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
log_info "部署信息已生成: $deploy_info"
|
||||||
|
}
|
||||||
|
|
||||||
|
# 显示构建摘要
|
||||||
|
show_summary() {
|
||||||
|
log_step "构建摘要"
|
||||||
|
echo ""
|
||||||
|
echo "项目名称: $PROJECT_NAME"
|
||||||
|
echo "构建类型: $BUILD_TYPE"
|
||||||
|
echo "镜像名称: $IMAGE_NAME:$IMAGE_TAG"
|
||||||
|
|
||||||
|
if [ -n "$DOCKER_REGISTRY" ]; then
|
||||||
|
echo "镜像仓库: $DOCKER_REGISTRY"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "构建时间: $(date)"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
if [[ "$PUSH_IMAGE" == "true" && -n "$DOCKER_REGISTRY" ]]; then
|
||||||
|
echo "镜像已推送到: $DOCKER_REGISTRY/$IMAGE_NAME:$IMAGE_TAG"
|
||||||
|
else
|
||||||
|
echo "镜像已构建完成,可使用以下命令运行:"
|
||||||
|
echo " docker run -d -p 80:80 $IMAGE_NAME:$IMAGE_TAG"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
}
|
||||||
|
|
||||||
|
# 主构建流程
|
||||||
|
main() {
|
||||||
|
# 检查帮助参数
|
||||||
|
if [[ "$1" == "-h" || "$1" == "--help" ]]; then
|
||||||
|
show_help
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
log_info "开始构建数字档案管理系统前端..."
|
||||||
|
log_info "构建类型: $BUILD_TYPE"
|
||||||
|
|
||||||
|
check_dependencies
|
||||||
|
clean_build_cache
|
||||||
|
install_dependencies
|
||||||
|
run_code_checks
|
||||||
|
build_frontend
|
||||||
|
build_docker_image
|
||||||
|
push_docker_image
|
||||||
|
generate_deploy_info
|
||||||
|
show_summary
|
||||||
|
|
||||||
|
log_info "构建完成!"
|
||||||
|
}
|
||||||
|
|
||||||
|
# 执行主函数
|
||||||
|
main "$@"
|
||||||
@@ -1,30 +1,38 @@
|
|||||||
version: '3.8'
|
version: '3.8'
|
||||||
|
|
||||||
services:
|
services:
|
||||||
# 前端服务
|
# 数字档案管理系统前端服务
|
||||||
digital-archive-frontend:
|
digital-archive-frontend:
|
||||||
build:
|
image: ${IMAGE_NAME:-digital-archive-frontend}:${IMAGE_TAG:-latest}
|
||||||
context: .
|
container_name: ${CONTAINER_NAME:-digital-archive-frontend}
|
||||||
dockerfile: Dockerfile
|
|
||||||
container_name: digital-archive-frontend
|
|
||||||
ports:
|
ports:
|
||||||
- "80:80"
|
- "${HOST_PORT:-80}:80"
|
||||||
networks:
|
networks:
|
||||||
- proxy
|
- ${NETWORK_NAME:-proxy}
|
||||||
restart: unless-stopped
|
restart: ${RESTART_POLICY:-unless-stopped}
|
||||||
environment:
|
environment:
|
||||||
- NGINX_HOST=localhost
|
- NGINX_HOST=${NGINX_HOST:-localhost}
|
||||||
- NGINX_PORT=80
|
- NGINX_PORT=80
|
||||||
volumes:
|
volumes:
|
||||||
- ./nginx.conf:/etc/nginx/nginx.conf:ro
|
- ./nginx.conf:/etc/nginx/nginx.conf:ro
|
||||||
- ./ssl:/etc/nginx/ssl:ro
|
# - ./ssl:/etc/nginx/ssl:ro # 如果需要SSL证书,取消注释并配置证书文件
|
||||||
healthcheck:
|
healthcheck:
|
||||||
test: ["CMD", "curl", "-f", "http://localhost/health"]
|
test: ["CMD", "curl", "-f", "http://localhost/"]
|
||||||
interval: 30s
|
interval: 30s
|
||||||
timeout: 10s
|
timeout: 10s
|
||||||
retries: 3
|
retries: 3
|
||||||
start_period: 40s
|
start_period: 40s
|
||||||
|
labels:
|
||||||
|
- "traefik.enable=true"
|
||||||
|
- "traefik.http.routers.${CONTAINER_NAME:-digital-archive-frontend}.rule=Host(`${DOMAIN_NAME:-localhost}`)"
|
||||||
|
- "traefik.http.routers.${CONTAINER_NAME:-digital-archive-frontend}.entrypoints=web"
|
||||||
|
logging:
|
||||||
|
driver: "json-file"
|
||||||
|
options:
|
||||||
|
max-size: "10m"
|
||||||
|
max-file: "3"
|
||||||
|
|
||||||
networks:
|
networks:
|
||||||
proxy:
|
proxy:
|
||||||
external: true
|
external: ${EXTERNAL_NETWORK:-true}
|
||||||
|
name: ${NETWORK_NAME:-proxy}
|
||||||
@@ -27,4 +27,13 @@ export const documentDocking = (data) => {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// 营销系统对接
|
||||||
|
export const productSalesDocking = (data) => {
|
||||||
|
return request({
|
||||||
|
url: "/point-strategy/v/archives/productSalesDocking",
|
||||||
|
method: "post",
|
||||||
|
data:data,
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -174,6 +174,17 @@
|
|||||||
"
|
"
|
||||||
>公文系统对接</el-button
|
>公文系统对接</el-button
|
||||||
>
|
>
|
||||||
|
<el-button
|
||||||
|
@click="handleBtn(item, key, 'productSales')"
|
||||||
|
size="mini"
|
||||||
|
type="primary"
|
||||||
|
v-if="
|
||||||
|
(Alltable.length === 3 && key === 0) ||
|
||||||
|
(Alltable.length === 2 && key === 0) ||
|
||||||
|
Alltable.length === 1
|
||||||
|
"
|
||||||
|
>营销系统对接</el-button
|
||||||
|
>
|
||||||
<el-button
|
<el-button
|
||||||
size="mini"
|
size="mini"
|
||||||
type="primary"
|
type="primary"
|
||||||
@@ -360,6 +371,7 @@
|
|||||||
import {
|
import {
|
||||||
documentDocking,
|
documentDocking,
|
||||||
contractDocking,
|
contractDocking,
|
||||||
|
productSalesDocking,
|
||||||
} from "@/api/preFiling/preArchiveManagement/preFileApp.js";
|
} from "@/api/preFiling/preArchiveManagement/preFileApp.js";
|
||||||
import {
|
import {
|
||||||
message,
|
message,
|
||||||
@@ -507,6 +519,20 @@ export default {
|
|||||||
message("error", error, 2000);
|
message("error", error, 2000);
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
|
case "productSales": // 营销系统
|
||||||
|
productSalesDocking()
|
||||||
|
.then((res) => {
|
||||||
|
if (res.code == 100) {
|
||||||
|
this.$message({type:'success',message:`【营销系统对接】${res.msg}`,showClose:true,duration:0});
|
||||||
|
this.clickSearch(key, 1, 0);
|
||||||
|
} else {
|
||||||
|
message("warning", res.msg, 2000);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch((error) => {
|
||||||
|
message("error", error, 2000);
|
||||||
|
});
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
// 获取批量修改单个档案详情
|
// 获取批量修改单个档案详情
|
||||||
|
|||||||
Reference in New Issue
Block a user