Add Docker one-click deploy and data migration docs.
Enable PHP 8.2 + Apache compose stack with persistent data/uploads volumes and PhpSpreadsheet for xlsx import/export. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -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.*
|
||||||
+35
@@ -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"]
|
||||||
@@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
<VirtualHost *:80>
|
||||||
|
ServerAdmin webmaster@localhost
|
||||||
|
DocumentRoot /var/www/html/public
|
||||||
|
|
||||||
|
<Directory /var/www/html/public>
|
||||||
|
Options -Indexes +FollowSymLinks
|
||||||
|
AllowOverride All
|
||||||
|
Require all granted
|
||||||
|
DirectoryIndex index.php
|
||||||
|
</Directory>
|
||||||
|
|
||||||
|
# 禁止直接访问业务数据与源码目录
|
||||||
|
<DirectoryMatch "^/var/www/html/(app|data|uploads|vendor)">
|
||||||
|
Require all denied
|
||||||
|
</DirectoryMatch>
|
||||||
|
|
||||||
|
ErrorLog ${APACHE_LOG_DIR}/error.log
|
||||||
|
CustomLog ${APACHE_LOG_DIR}/access.log combined
|
||||||
|
</VirtualHost>
|
||||||
Executable
+10
@@ -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 "$@"
|
||||||
@@ -2,6 +2,13 @@
|
|||||||
|
|
||||||
## 1. 环境要求
|
## 1. 环境要求
|
||||||
|
|
||||||
|
### 方式 A:Docker 一键部署(推荐)
|
||||||
|
|
||||||
|
- Docker 20+ / Docker Compose v2
|
||||||
|
- 无需本机安装 PHP / Nginx / 扩展
|
||||||
|
|
||||||
|
### 方式 B:宝塔面板
|
||||||
|
|
||||||
- 宝塔面板(Linux)
|
- 宝塔面板(Linux)
|
||||||
- Nginx 或 Apache
|
- Nginx 或 Apache
|
||||||
- PHP 8.0+(建议 8.2)
|
- PHP 8.0+(建议 8.2)
|
||||||
@@ -23,7 +30,67 @@
|
|||||||
- `delete_approvals.json`:双管理员删除审批记录
|
- `delete_approvals.json`:双管理员删除审批记录
|
||||||
- `import_template.xlsx`:可选,自定义导入模板(手工放置)
|
- `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 站点
|
1. 新建 PHP 站点
|
||||||
2. 上传项目到站点目录
|
2. 上传项目到站点目录
|
||||||
@@ -32,14 +99,14 @@
|
|||||||
5. 给 `data/` 与 `uploads/` 赋予可写权限
|
5. 给 `data/` 与 `uploads/` 赋予可写权限
|
||||||
6. 访问域名初始化系统
|
6. 访问域名初始化系统
|
||||||
|
|
||||||
## 4. 默认账号
|
## 5. 默认账号
|
||||||
|
|
||||||
- 用户名:`admin`
|
- 用户名:`admin`
|
||||||
- 密码:`jinniu123`
|
- 密码:`jinniu123`
|
||||||
|
|
||||||
> 登录后建议立即修改默认密码。
|
> 登录后建议立即修改默认密码。
|
||||||
|
|
||||||
## 5. 导出说明
|
## 6. 导出说明
|
||||||
|
|
||||||
- 导出支持:`xlsx` / `csv`
|
- 导出支持:`xlsx` / `csv`
|
||||||
- 页面可自由选择格式
|
- 页面可自由选择格式
|
||||||
@@ -49,15 +116,15 @@
|
|||||||
composer require phpoffice/phpspreadsheet
|
composer require phpoffice/phpspreadsheet
|
||||||
```
|
```
|
||||||
|
|
||||||
## 6. 导入说明
|
## 7. 导入说明
|
||||||
|
|
||||||
### 6.1 下载模板
|
### 7.1 下载模板
|
||||||
|
|
||||||
- 点击页面“模板下载”
|
- 点击页面“模板下载”
|
||||||
- 系统优先下载:`data/import_template.xlsx`(如果你手工放了该文件)
|
- 系统优先下载:`data/import_template.xlsx`(如果你手工放了该文件)
|
||||||
- 若该文件不存在,系统会动态生成模板(需要 `PhpSpreadsheet`)
|
- 若该文件不存在,系统会动态生成模板(需要 `PhpSpreadsheet`)
|
||||||
|
|
||||||
### 6.2 模板字段规则
|
### 7.2 模板字段规则
|
||||||
|
|
||||||
#### 必填字段
|
#### 必填字段
|
||||||
|
|
||||||
@@ -80,19 +147,19 @@ composer require phpoffice/phpspreadsheet
|
|||||||
- 结息日(1-28)
|
- 结息日(1-28)
|
||||||
- 是否有分期还款计划(是/否)
|
- 是否有分期还款计划(是/否)
|
||||||
|
|
||||||
## 7. 文件上传与存储
|
## 8. 文件上传与存储
|
||||||
|
|
||||||
文件上传后按“目录层级 + 档案”自动存储,例如:
|
文件上传后按“目录层级 + 档案”自动存储,例如:
|
||||||
|
|
||||||
`uploads/一级目录/二级目录/三级目录/archive_档案ID_档案名/文件`
|
`uploads/一级目录/二级目录/三级目录/archive_档案ID_档案名/文件`
|
||||||
|
|
||||||
## 8. 删除审批(双管理员)
|
## 9. 删除审批(双管理员)
|
||||||
|
|
||||||
- 管理员A点击删除 -> 仅提交申请
|
- 管理员A点击删除 -> 仅提交申请
|
||||||
- 管理员B在“删除审核”页面审批通过后才执行真实删除
|
- 管理员B在“删除审核”页面审批通过后才执行真实删除
|
||||||
- 申请人本人不能审批自己的删除申请
|
- 申请人本人不能审批自己的删除申请
|
||||||
|
|
||||||
## 9. 试运行建议
|
## 10. 试运行建议
|
||||||
|
|
||||||
上线前建议至少验证:
|
上线前建议至少验证:
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user