diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..f2d220a --- /dev/null +++ b/.dockerignore @@ -0,0 +1,14 @@ +.git +.gitignore +.DS_Store +*.md +muban.xlsx +uploads/* +!uploads/.gitkeep +data/* +!data/.gitkeep +!data/import_template.xlsx +vendor +composer.lock +.env +.env.* diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..adaa172 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,35 @@ +FROM php:8.2-apache + +RUN apt-get update \ + && apt-get install -y --no-install-recommends \ + libzip-dev \ + libxml2-dev \ + unzip \ + git \ + && docker-php-ext-install pdo_sqlite zip \ + && a2enmod rewrite headers \ + && rm -rf /var/lib/apt/lists/* + +COPY --from=composer:2 /usr/bin/composer /usr/bin/composer + +WORKDIR /var/www/html + +COPY docker/apache-vhost.conf /etc/apache2/sites-available/000-default.conf +COPY docker/entrypoint.sh /usr/local/bin/entrypoint.sh +RUN chmod +x /usr/local/bin/entrypoint.sh + +COPY composer.json ./ +RUN composer install --no-dev --prefer-dist --no-interaction --optimize-autoloader + +COPY app ./app +COPY public ./public +COPY data ./data +COPY uploads ./uploads + +RUN chown -R www-data:www-data /var/www/html/data /var/www/html/uploads \ + && chmod -R 775 /var/www/html/data /var/www/html/uploads + +EXPOSE 80 + +ENTRYPOINT ["/usr/local/bin/entrypoint.sh"] +CMD ["apache2-foreground"] diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..a07b424 --- /dev/null +++ b/composer.json @@ -0,0 +1,16 @@ +{ + "name": "jinniu/loan-archive", + "description": "金牛集团贷款档案管理系统", + "type": "project", + "require": { + "php": ">=8.0", + "ext-pdo_sqlite": "*", + "ext-mbstring": "*", + "ext-fileinfo": "*", + "phpoffice/phpspreadsheet": "^1.29" + }, + "config": { + "optimize-autoloader": true, + "sort-packages": true + } +} diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..94b68ff --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,13 @@ +services: + web: + build: . + container_name: baota-archive + ports: + - "${APP_PORT:-8080}:80" + volumes: + # 持久化业务数据(SQLite + JSON)与上传文件 + - ./data:/var/www/html/data + - ./uploads:/var/www/html/uploads + environment: + TZ: Asia/Shanghai + restart: unless-stopped diff --git a/docker/apache-vhost.conf b/docker/apache-vhost.conf new file mode 100644 index 0000000..145b62b --- /dev/null +++ b/docker/apache-vhost.conf @@ -0,0 +1,19 @@ + + ServerAdmin webmaster@localhost + DocumentRoot /var/www/html/public + + + Options -Indexes +FollowSymLinks + AllowOverride All + Require all granted + DirectoryIndex index.php + + + # 禁止直接访问业务数据与源码目录 + + Require all denied + + + ErrorLog ${APACHE_LOG_DIR}/error.log + CustomLog ${APACHE_LOG_DIR}/access.log combined + diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh new file mode 100755 index 0000000..fa11f34 --- /dev/null +++ b/docker/entrypoint.sh @@ -0,0 +1,10 @@ +#!/bin/sh +set -e + +mkdir -p /var/www/html/data /var/www/html/uploads + +# 挂载卷后修正写权限,避免 SQLite / 上传失败 +chown -R www-data:www-data /var/www/html/data /var/www/html/uploads +chmod -R 775 /var/www/html/data /var/www/html/uploads + +exec "$@" diff --git a/部署说明.md b/部署说明.md index 10e48eb..ec9302e 100755 --- a/部署说明.md +++ b/部署说明.md @@ -2,6 +2,13 @@ ## 1. 环境要求 +### 方式 A:Docker 一键部署(推荐) + +- Docker 20+ / Docker Compose v2 +- 无需本机安装 PHP / Nginx / 扩展 + +### 方式 B:宝塔面板 + - 宝塔面板(Linux) - Nginx 或 Apache - PHP 8.0+(建议 8.2) @@ -23,7 +30,67 @@ - `delete_approvals.json`:双管理员删除审批记录 - `import_template.xlsx`:可选,自定义导入模板(手工放置) -## 3. 宝塔部署步骤 +## 3. Docker 一键部署 + +在项目根目录执行: + +```bash +docker compose up -d --build +``` + +浏览器访问:`http://服务器IP:8080` + +常用命令: + +```bash +# 查看日志 +docker compose logs -f + +# 停止 +docker compose down + +# 修改端口(默认 8080) +APP_PORT=80 docker compose up -d --build +``` + +`data/` 与 `uploads/` 已通过卷挂载持久化,容器重建不会丢业务数据。镜像内已预装 PhpSpreadsheet,可直接导入/导出 xlsx。 + +### 3.1 从旧环境迁移数据库(可完整迁移) + +本系统数据库是 **SQLite 文件**,不是 MySQL。迁移 = 拷贝文件,无需导 SQL。 + +**需要拷贝的内容:** + +| 路径 | 说明 | +|------|------| +| `data/archive.sqlite` | 主库(用户、目录、档案、文件元数据) | +| `data/*.json` | 分期计划、结息/逾期、删除审批、贷款机构等 | +| `data/import_template.xlsx` | 可选,自定义导入模板 | +| `uploads/` 整目录 | 档案附件实体文件 | + +**步骤:** + +1. 在旧服务器停止写入(或短暂停站),避免拷到一半又有新数据。 +2. 将上述文件复制到本项目对应目录,例如: + +```bash +# 示例:从旧站备份目录恢复 +cp /path/to/old/data/archive.sqlite ./data/ +cp /path/to/old/data/*.json ./data/ 2>/dev/null || true +cp -a /path/to/old/uploads/. ./uploads/ +``` + +3. 启动 Docker: + +```bash +docker compose up -d --build +``` + +4. 登录验证:档案列表、分期计划、文件预览/下载是否正常。 + +> 注意:`archive.sqlite` 里记录了上传文件相对路径,**必须与 `uploads/` 一起迁移**,否则库在、附件会 404。 + +## 4. 宝塔部署步骤 1. 新建 PHP 站点 2. 上传项目到站点目录 @@ -32,14 +99,14 @@ 5. 给 `data/` 与 `uploads/` 赋予可写权限 6. 访问域名初始化系统 -## 4. 默认账号 +## 5. 默认账号 - 用户名:`admin` - 密码:`jinniu123` > 登录后建议立即修改默认密码。 -## 5. 导出说明 +## 6. 导出说明 - 导出支持:`xlsx` / `csv` - 页面可自由选择格式 @@ -49,15 +116,15 @@ composer require phpoffice/phpspreadsheet ``` -## 6. 导入说明 +## 7. 导入说明 -### 6.1 下载模板 +### 7.1 下载模板 - 点击页面“模板下载” - 系统优先下载:`data/import_template.xlsx`(如果你手工放了该文件) - 若该文件不存在,系统会动态生成模板(需要 `PhpSpreadsheet`) -### 6.2 模板字段规则 +### 7.2 模板字段规则 #### 必填字段 @@ -80,19 +147,19 @@ composer require phpoffice/phpspreadsheet - 结息日(1-28) - 是否有分期还款计划(是/否) -## 7. 文件上传与存储 +## 8. 文件上传与存储 文件上传后按“目录层级 + 档案”自动存储,例如: `uploads/一级目录/二级目录/三级目录/archive_档案ID_档案名/文件` -## 8. 删除审批(双管理员) +## 9. 删除审批(双管理员) - 管理员A点击删除 -> 仅提交申请 - 管理员B在“删除审核”页面审批通过后才执行真实删除 - 申请人本人不能审批自己的删除申请 -## 9. 试运行建议 +## 10. 试运行建议 上线前建议至少验证: