diff --git a/.env b/.env new file mode 100644 index 0000000..d21ce96 --- /dev/null +++ b/.env @@ -0,0 +1,21 @@ +# 数据库配置 +DB_HOST=pc-3nsh5mzbet7w5l890.rwlb.rds.aliyuncs.com +DB_PORT=3306 +DB_USER=u1admin +DB_PASSWORD=6y6K!aFg +DB_NAME=employee_performance + +# JWT 配置 +JWT_SECRET=dev_jwt_secret_please_change_in_production + +# FastGPT API 配置 +FASTGPT_API_KEY=fastgpt-oEipxYa5BfVaeGDj74iAXi8YSkWyye07lTNYuj7yydsEKAc4Hp2Z2RDbxsxc4TuZ +FASTGPT_API_URL=https://cloud.fastgpt.cn/api/v1/chat/completions +FASTGPT_MODEL=gpt-4 + +# 代理配置(Node.js 不自动读取系统代理,需手动配置) +#HTTPS_PROXY=http://127.0.0.1:7890 + +# 服务器配置 +PORT=3001 +NODE_ENV=development diff --git a/backend/.dockerignore b/backend/.dockerignore new file mode 100644 index 0000000..2e1db6f --- /dev/null +++ b/backend/.dockerignore @@ -0,0 +1,42 @@ +# 依赖目录 +node_modules +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# 构建输出 +dist +build + +# 环境文件(在运行时通过环境变量或挂载提供) +.env +.env.local +.env.development +.env.production + +# 测试相关 +coverage +.nyc_output + +# 编辑器文件 +.vscode +.idea +*.swp +*.swo + +# 系统文件 +.DS_Store +Thumbs.db + +# Git +.git +.gitignore + +# Docker相关 +.dockerignore +Dockerfile +docker-compose.yml + +# 日志文件 +logs +*.log \ No newline at end of file diff --git a/backend/DOCKER-README.md b/backend/DOCKER-README.md new file mode 100644 index 0000000..b4cdba1 --- /dev/null +++ b/backend/DOCKER-README.md @@ -0,0 +1,84 @@ +# Docker 部署说明 + +## 1. 仅构建后端镜像 + +```bash +# 在 backend 目录中 +cd backend + +# 构建 Docker 镜像 +docker build -t employee-performance-backend:latest . + +# 运行容器 +docker run -d \ + -p 3001:3001 \ + -e DB_HOST=localhost \ + -e DB_PORT=3306 \ + -e DB_USER=performance_user \ + -e DB_PASSWORD=userpassword123 \ + -e DB_NAME=employee_performance \ + -e JWT_SECRET=your_jwt_secret_here_change_in_production \ + -e FASTGPT_API_KEY=your_fastgpt_api_key_here \ + --name employee-performance-backend \ + employee-performance-backend:latest +``` + +## 2. 使用 Docker Compose(推荐) + +```bash +# 在项目根目录(包含 docker-compose.yml) +cd .. + +# 启动所有服务(MySQL + 后端) +docker-compose up -d + +# 查看日志 +docker-compose logs -f + +# 停止服务 +docker-compose down + +# 停止并删除数据卷 +docker-compose down -v +``` + +## 3. 环境变量配置 + +复制 `.env.example` 为 `.env` 并根据需要修改: + +```bash +cd backend +cp .env.example .env +``` + +或者通过 Docker Compose 的环境变量直接配置(见 docker-compose.yml)。 + +## 4. 数据库初始化 + +Docker Compose 会自动: +1. 创建 MySQL 8.0 容器 +2. 初始化数据库结构(使用 `src/db/init.sql`) +3. 插入测试数据(使用 `src/db/seed.sql`) + +## 5. 健康检查 + +后端服务提供健康检查端点: +``` +GET http://localhost:3001/health +``` + +Docker 容器已配置健康检查,确保服务正常运行。 + +## 6. 构建优化 + +Dockerfile 使用多阶段构建: +- 第一阶段:安装依赖并构建 TypeScript +- 第二阶段:仅复制运行所需文件,减小镜像大小 + +## 7. 生产环境注意事项 + +1. **修改默认密码**:在 docker-compose.yml 中修改 MySQL 密码 +2. **设置强 JWT_SECRET**:使用强密钥替换默认值 +3. **配置 FastGPT API**:提供有效的 API 密钥 +4. **数据持久化**:MySQL 数据存储在 `mysql_data` 卷中 +5. **网络安全**:生产环境应考虑使用 Docker 网络隔离 \ No newline at end of file diff --git a/backend/Dockerfile b/backend/Dockerfile new file mode 100644 index 0000000..8c4f2b5 --- /dev/null +++ b/backend/Dockerfile @@ -0,0 +1,53 @@ +# 构建阶段 +FROM node:20-alpine AS builder + +# 设置工作目录 +WORKDIR /app + +# 复制package.json和package-lock.json +COPY package*.json ./ + +# 安装依赖(包括devDependencies,因为需要typescript等构建工具) +RUN npm ci --only=production --ignore-scripts && \ + npm ci --only=development --ignore-scripts + +# 复制源代码 +COPY . . + +# 构建TypeScript +RUN npm run build + +# 运行时阶段 +FROM node:20-alpine AS runtime + +# 设置工作目录 +WORKDIR /app + +# 创建非root用户 +RUN addgroup -g 1001 -S nodejs && \ + adduser -S nodejs -u 1001 -G nodejs + +# 复制package.json +COPY --from=builder --chown=nodejs:nodejs /app/package*.json ./ + +# 安装仅生产依赖 +RUN npm ci --only=production --ignore-scripts + +# 复制构建产物 +COPY --from=builder --chown=nodejs:nodejs /app/dist ./dist + +# 复制可能需要的其他文件(如数据库初始化脚本) +COPY --from=builder --chown=nodejs:nodejs /app/src/db ./src/db + +# 切换用户 +USER nodejs + +# 暴露端口(默认3001,可通过环境变量覆盖) +EXPOSE 3001 + +# 健康检查 +HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ + CMD node -e "require('http').get('http://localhost:3001/health', (r) => {if(r.statusCode===200)process.exit(0);process.exit(1)}).on('error',()=>process.exit(1))" + +# 启动命令 +CMD ["npm", "start"] \ No newline at end of file diff --git a/backend/tmpclaude-14d8-cwd b/backend/tmpclaude-14d8-cwd new file mode 100644 index 0000000..c189ea7 --- /dev/null +++ b/backend/tmpclaude-14d8-cwd @@ -0,0 +1 @@ +/c/Users/99095/Desktop/优一科技/performance-evaluation-system/backend diff --git a/backend/tmpclaude-3607-cwd b/backend/tmpclaude-3607-cwd new file mode 100644 index 0000000..c189ea7 --- /dev/null +++ b/backend/tmpclaude-3607-cwd @@ -0,0 +1 @@ +/c/Users/99095/Desktop/优一科技/performance-evaluation-system/backend diff --git a/backend/tmpclaude-7c27-cwd b/backend/tmpclaude-7c27-cwd new file mode 100644 index 0000000..c189ea7 --- /dev/null +++ b/backend/tmpclaude-7c27-cwd @@ -0,0 +1 @@ +/c/Users/99095/Desktop/优一科技/performance-evaluation-system/backend diff --git a/create-db-user.sql b/create-db-user.sql new file mode 100644 index 0000000..f86ae7d --- /dev/null +++ b/create-db-user.sql @@ -0,0 +1,14 @@ +-- 创建新的数据库用户(如果你能以 root 身份登录 MySQL) +-- 在 MySQL 命令行中执行此脚本 + +-- 创建用户(密码设置为 123456) +CREATE USER IF NOT EXISTS 'emp_user'@'localhost' IDENTIFIED BY '123456'; + +-- 授予权限 +GRANT ALL PRIVILEGES ON employee_performance.* TO 'emp_user'@'localhost'; + +-- 刷新权限 +FLUSH PRIVILEGES; + +-- 显示用户 +SELECT User, Host FROM mysql.user WHERE User = 'emp_user'; diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..4a85feb --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,64 @@ +version: '3.8' + +services: + # MySQL数据库 + mysql: + image: mysql:8.0 + container_name: employee-performance-mysql + restart: unless-stopped + environment: + MYSQL_ROOT_PASSWORD: rootpassword123 + MYSQL_DATABASE: employee_performance + MYSQL_USER: performance_user + MYSQL_PASSWORD: userpassword123 + ports: + - "3306:3306" + volumes: + - mysql_data:/var/lib/mysql + - ./backend/src/db/init.sql:/docker-entrypoint-initdb.d/init.sql + - ./backend/src/db/seed.sql:/docker-entrypoint-initdb.d/seed.sql + healthcheck: + test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-uroot", "-prootpassword123"] + timeout: 20s + retries: 10 + start_period: 30s + networks: + - performance-network + + # 后端应用 + backend: + build: + context: ./backend + dockerfile: Dockerfile + container_name: employee-performance-backend + restart: unless-stopped + environment: + DB_HOST: mysql + DB_PORT: 3306 + DB_USER: performance_user + DB_PASSWORD: userpassword123 + DB_NAME: employee_performance + JWT_SECRET: your_jwt_secret_here_change_in_production + FASTGPT_API_KEY: your_fastgpt_api_key_here + FASTGPT_API_URL: https://api.fastgpt.in/api/v1/chat/completions + FASTGPT_MODEL: gpt-4 + PORT: 3001 + NODE_ENV: production + ports: + - "3001:3001" + depends_on: + mysql: + condition: service_healthy + networks: + - performance-network + # 如果需要在容器内运行数据库初始化脚本,可以取消下面的注释 + # volumes: + # - ./backend/src/db:/app/src/db:ro + +networks: + performance-network: + driver: bridge + +volumes: + mysql_data: + driver: local \ No newline at end of file diff --git a/tmpclaude-1560-cwd b/tmpclaude-1560-cwd new file mode 100644 index 0000000..0a8904c --- /dev/null +++ b/tmpclaude-1560-cwd @@ -0,0 +1 @@ +/c/Users/99095/Desktop/优一科技/performance-evaluation-system diff --git a/tmpclaude-5530-cwd b/tmpclaude-5530-cwd new file mode 100644 index 0000000..0a8904c --- /dev/null +++ b/tmpclaude-5530-cwd @@ -0,0 +1 @@ +/c/Users/99095/Desktop/优一科技/performance-evaluation-system diff --git a/tmpclaude-709e-cwd b/tmpclaude-709e-cwd new file mode 100644 index 0000000..0a8904c --- /dev/null +++ b/tmpclaude-709e-cwd @@ -0,0 +1 @@ +/c/Users/99095/Desktop/优一科技/performance-evaluation-system diff --git a/tmpclaude-7f74-cwd b/tmpclaude-7f74-cwd new file mode 100644 index 0000000..0a8904c --- /dev/null +++ b/tmpclaude-7f74-cwd @@ -0,0 +1 @@ +/c/Users/99095/Desktop/优一科技/performance-evaluation-system diff --git a/tmpclaude-8f6e-cwd b/tmpclaude-8f6e-cwd new file mode 100644 index 0000000..0a8904c --- /dev/null +++ b/tmpclaude-8f6e-cwd @@ -0,0 +1 @@ +/c/Users/99095/Desktop/优一科技/performance-evaluation-system diff --git a/tmpclaude-9841-cwd b/tmpclaude-9841-cwd new file mode 100644 index 0000000..0a8904c --- /dev/null +++ b/tmpclaude-9841-cwd @@ -0,0 +1 @@ +/c/Users/99095/Desktop/优一科技/performance-evaluation-system diff --git a/tmpclaude-9b0e-cwd b/tmpclaude-9b0e-cwd new file mode 100644 index 0000000..0a8904c --- /dev/null +++ b/tmpclaude-9b0e-cwd @@ -0,0 +1 @@ +/c/Users/99095/Desktop/优一科技/performance-evaluation-system diff --git a/tmpclaude-a768-cwd b/tmpclaude-a768-cwd new file mode 100644 index 0000000..0a8904c --- /dev/null +++ b/tmpclaude-a768-cwd @@ -0,0 +1 @@ +/c/Users/99095/Desktop/优一科技/performance-evaluation-system diff --git a/tmpclaude-aa47-cwd b/tmpclaude-aa47-cwd new file mode 100644 index 0000000..0a8904c --- /dev/null +++ b/tmpclaude-aa47-cwd @@ -0,0 +1 @@ +/c/Users/99095/Desktop/优一科技/performance-evaluation-system diff --git a/tmpclaude-e0aa-cwd b/tmpclaude-e0aa-cwd new file mode 100644 index 0000000..0a8904c --- /dev/null +++ b/tmpclaude-e0aa-cwd @@ -0,0 +1 @@ +/c/Users/99095/Desktop/优一科技/performance-evaluation-system