30 Commits

Author SHA1 Message Date
8a8e11414f chore(docker): docker/php/entrypoint.sh 如果应用根目录不存在,则跳过权限设置 2025-12-25 16:55:59 +08:00
46135002f9 revert: 0443cc46ec 2025-12-25 16:51:19 +08:00
72f6b341a1 chore: 优化entrypoint.sh 去掉带参数设置 2025-12-25 16:42:23 +08:00
0cb2dfa647 chore(docker): docker/php/entrypoint.sh 支持带参数的这种执行,参数优先于环境变量 2025-12-25 16:07:19 +08:00
0443cc46ec chore(docker): 优化docker/php/entrypoint.sh 2025-12-25 14:32:48 +08:00
85cf52b0e4 chore(docker): 优化docker/php/entrypoint.sh 2025-12-25 14:22:59 +08:00
c7aaa1bd16 chore(docker): 更新docker/php/entrypoint.sh 2025-12-25 14:03:32 +08:00
0519879ebb chore(docker): 更新docker/php/entrypoint.sh 2025-12-25 13:53:51 +08:00
f461fe93f0 chore(docker): 更新docker配置,解决多余的执行步骤 2025-12-25 09:34:07 +08:00
2eb98efe61 chore(docker): update docker/php/entrypoint.sh 2025-12-25 09:07:34 +08:00
866ca8d938 chore(docker): update docker/php/entrypoint.sh 2025-12-25 08:58:34 +08:00
267cfa12a2 chore(docker): update entrypoint.sh 2025-12-25 08:38:43 +08:00
d7df9293bb chore(sms): 优化短信发送记录,显示验证码 2025-12-24 18:29:03 +08:00
604917b56c fix(docker): 修复 mysql init.sql 重复的IDX_nc_member_label_label_id 2025-12-24 17:35:18 +08:00
840ce860ea chore(docker): 更新docker 2025-12-24 17:22:53 +08:00
04e1735028 chore(docker): 更新mysql初始脚本 2025-12-24 17:16:04 +08:00
ba829c4f53 chore(docker): 删除.env.local 2025-12-24 16:39:24 +08:00
b266023afc chore(docker): 去除多余的NGINX STL 端口暴漏 2025-12-24 14:38:14 +08:00
23abd0496b fix(docker): 修复nginx docker 问题 2025-12-24 14:25:35 +08:00
dffb2563be chore(docker): 简化nginx docker的处理 2025-12-24 14:10:34 +08:00
80998fba70 chore(docker): update nginx dockerfile 2025-12-24 14:05:01 +08:00
1f65bb61dd chore(think): update think 2025-12-24 11:43:00 +08:00
9e044672ee chore(src/config): 增加database.php 文件 2025-12-24 11:38:48 +08:00
989494af6d chore(docker/php): 优化supervisord.conf 当websocket文件不存在,不启动 2025-12-24 11:30:01 +08:00
5d8c3ba4ce chore(env): 更新环境变量 2025-12-24 11:16:32 +08:00
a973ce720e chore(env): update .env 文件 2025-12-24 11:11:14 +08:00
218d405f56 chore: update .gitignore 2025-12-24 11:06:47 +08:00
2d07082b81 chore(docker): 更新docker 2025-12-24 10:59:32 +08:00
15720c6a62 chore(env): 增加test环境变量 2025-12-24 10:47:21 +08:00
224c2a3117 chore(docker): docker 及环境变量更新 2025-12-24 10:39:14 +08:00
75 changed files with 12230 additions and 178 deletions

3
.env
View File

@@ -7,8 +7,6 @@ APP_ENV=development
# PHP/PHP-FPM 配置
PHP_VERSION=7.4
PHP_FPM_VERSION=7.4-fpm
PHP_FPM_PORT=9100
XDEBUG_POST=9103
# 数据库配置
MYSQL_ROOT_HOST=%
@@ -23,5 +21,4 @@ REDIS_PORT=6399
# Nginx 配置
NGINX_PORT=8010
NGINX_SSL_PORT=8012

24
.env.development Normal file
View File

@@ -0,0 +1,24 @@
# 项目配置, 请根据实际情况修改
PROJECT_NAME=newshop
# ThinkPHP 6.x 配置, 请根据实际情况修改
APP_ENV=development
# PHP/PHP-FPM 配置
PHP_VERSION=7.4
PHP_FPM_VERSION=7.4-fpm
# 数据库配置
MYSQL_ROOT_HOST=%
MYSQL_DATABASE=shop_mallnew
MYSQL_USER=shop_mallnew
MYSQL_PASSWORD=shop_mallnew
MYSQL_PORT=3326
# Redis 绑定端口及密码
REDIS_PASSWORD=luckyshop123!@#
REDIS_PORT=6499
# Nginx 暴漏端口
NGINX_PORT=8050

View File

@@ -1,24 +1,23 @@
# 项目配置, 请根据实际情况修改
PROJECT_NAME=newshop
# ThinkPHP 6.x 配置, 请根据实际情况修改
APP_ENV=development
# PHP/PHP-FPM 配置
PHP_VERSION=7.4
PHP_FPM_VERSION=7.4-fpm
PHP_FPM_PORT=9000
XDEBUG_POST=9003
# 数据库配置
MYSQL_ROOT_HOST=%
MYSQL_DATABASE=shop_mallnew
MYSQL_USER=shop_mallnew
MYSQL_PASSWORD=shop_mallnew
MYSQL_PORT=3306
MYSQL_PORT=3316
# Redis 配置
REDIS_PASSWORD=luckyshop123!@#
REDIS_PORT=6379
REDIS_PORT=6399
# Nginx 配置
NGINX_PORT=80
NGINX_SSL_PORT=443
NGINX_PORT=8010

24
.env.production Normal file
View File

@@ -0,0 +1,24 @@
# 项目配置, 请根据实际情况修改
PROJECT_NAME=newshop
# ThinkPHP 6.x 配置, 请根据实际情况修改
APP_ENV=production
# PHP/PHP-FPM 配置
PHP_VERSION=7.4
PHP_FPM_VERSION=7.4-fpm
# 数据库配置
MYSQL_ROOT_HOST=%
MYSQL_DATABASE=shop_mallnew
MYSQL_USER=shop_mallnew
MYSQL_PASSWORD=shop_mallnew
MYSQL_PORT=3926
# Redis 绑定端口及密码
REDIS_PASSWORD=luckyshop123!@#
REDIS_PORT=6829
# Nginx 暴漏端口
NGINX_PORT=8858

24
.env.staging Normal file
View File

@@ -0,0 +1,24 @@
# 项目配置, 请根据实际情况修改
PROJECT_NAME=newshop
# ThinkPHP 6.x 配置, 请根据实际情况修改
APP_ENV=staging
# PHP/PHP-FPM 配置
PHP_VERSION=7.4
PHP_FPM_VERSION=7.4-fpm
# 数据库配置
MYSQL_ROOT_HOST=%
MYSQL_DATABASE=shop_mallnew
MYSQL_USER=shop_mallnew
MYSQL_PASSWORD=shop_mallnew
MYSQL_PORT=3826
# Redis 绑定端口及密码
REDIS_PASSWORD=luckyshop123!@#
REDIS_PORT=6809
# Nginx 暴漏端口
NGINX_PORT=8854

24
.env.test Normal file
View File

@@ -0,0 +1,24 @@
# 项目配置, 请根据实际情况修改
PROJECT_NAME=newshop
# ThinkPHP 6.x 配置, 请根据实际情况修改
APP_ENV=test
# PHP/PHP-FPM 配置
PHP_VERSION=7.4
PHP_FPM_VERSION=7.4-fpm
# 数据库配置
MYSQL_ROOT_HOST=%
MYSQL_DATABASE=shop_mallnew
MYSQL_USER=shop_mallnew
MYSQL_PASSWORD=shop_mallnew
MYSQL_PORT=3346
# Redis 绑定端口及密码
REDIS_PASSWORD=luckyshop123!@#
REDIS_PORT=6799
# Nginx 暴漏端口
NGINX_PORT=8360

3
.gitignore vendored
View File

@@ -18,6 +18,9 @@ __pycache__
.idea
.vscode
# 环境变量
.env
# 源码结构
debug.txt
.travis.yml

138
README.md Normal file
View File

@@ -0,0 +1,138 @@
# 在线商城PHP项目
## Git 分支策略
| 环境 | 推荐分支 | 备选分支 | 说明 |
|------|----------|----------|------|
| local | `dev` | `develop` | 本地开发环境 |
| development | `dev` | `development` | 开发测试环境 |
| test | `test` | `staging` | 测试环境 |
| staging | `staging` | `pre-release` | 预发布环境 |
| production | `master` | `main` | 生产环境 |
**部署建议**
- 每个环境部署前请先切换到对应的Git分支
- 确保代码版本与目标环境匹配
- 生产环境部署前建议先在staging环境验证
## Docker 部署
```bash
cp .env.example .env.development
```
**注意**
- 在同一目录下面,执行 `docker-compose` 命令时,需要指定项目名称。用来区分不同的环境。如 `shop_local``shop_dev` 等。
- 本地部署时,需要将 `APP_ENV` 设置为 `local`
- 开发环境部署时,需要将 `APP_ENV` 设置为 `development`
## 环境变量
- `APP_ENV`: 应用环境,默认值为 `development`
## 开发环境-local 部署
**对应Git分支**: `main``develop`
```bash
# 切换到本地开发分支
git checkout main # 或 develop
# 本地部署时,需要将 APP_ENV 设置为 local, 并指定 docker-compose.local.yml 文件
docker-compose --env-file .env.local -f docker-compose.local.yml up -d
# docker-compose --project-name shop_local --env-file .env.local -f docker-compose.local.yml up -d
# docker-compose down 命令,用来停止并删除容器
docker-compose -f docker-compose.local.yml down -v
# docker-compose --project-name shop_local down -v
```
## 开发环境-development 部署
**对应Git分支**: `dev``development`
```bash
# 切换到开发分支
git checkout dev # 或 development
# 默认使用 docker-compose.yml 文件
docker-compose --project-name shop_development --env-file .env.development up -d
# docker-compose down 命令,用来停止并删除容器
docker-compose --project-name shop_development down -v
```
## 开发环境-test 部署 (测试环境)
**对应Git分支**: `test``staging`
```bash
# 切换到测试分支
git checkout test # 或 staging
# 默认使用 docker-compose.yml 文件
docker-compose --project-name shop_test --env-file .env.test up -d
# docker-compose down 命令,用来停止并删除容器
docker-compose --project-name shop_test down -v
```
## 开发环境-staging 部署(预发布环境)
**对应Git分支**: `staging``pre-release`
```bash
# 切换到预发布分支
git checkout staging # 或 pre-release
# 默认使用 docker-compose.yml 文件
docker-compose --project-name shop_staging --env-file .env.staging up -d
# docker-compose down 命令,用来停止并删除容器
docker-compose --project-name shop_staging down -v
```
## 生产环境-production 部署
**对应Git分支**: `master``main``production`
```bash
# 切换到生产分支
git checkout main
# 确保代码是最新的生产版本
git pull origin main
# 默认使用 docker-compose.yml 文件
docker-compose --project-name shop_production --env-file .env.production up -d
# docker-compose down 命令,用来停止并删除容器
docker-compose --project-name shop_production down -v
```
## 便捷部署脚本
### 环境切换与部署脚本
- `deploy.sh` 脚本:
### 使用方法
```bash
# 赋予执行权限
chmod +x deploy.sh
# 部署到开发环境
./deploy.sh development
# 部署到测试环境
./deploy.sh test
# 部署到生产环境
./deploy.sh production
```

100
deploy.sh Normal file
View File

@@ -0,0 +1,100 @@
#!/bin/bash
# deploy.sh - 环境切换与部署脚本
# 使用方法: ./deploy.sh <environment>
# 示例: ./deploy.sh development
ENVIRONMENT=$1
PROJECT_NAME="shop_${ENVIRONMENT}"
BRANCH=""
COMPOSE_FILE="docker-compose.yml"
ENV_FILE=".env.${ENVIRONMENT}"
# 现实运行中的服务器网站,数据库备份目录
RUN_SERVER_WEB_ROOT="/data/wwwroot/shop-projects"
RUN_SERVER_DB_BACKUP_DIR="/data/backup/shop-projects"
case $ENVIRONMENT in
"local")
BRANCH="dev"
COMPOSE_FILE="docker-compose.local.yml"
ENV_FILE=".env.local"
;;
"development")
BRANCH="dev"
;;
"test")
BRANCH="test"
;;
"staging")
BRANCH="staging"
;;
"production")
BRANCH="main"
;;
*)
echo "错误: 不支持的环境 '$ENVIRONMENT'"
echo "支持的环境: local, development, test, staging, production"
exit 1
;;
esac
echo "=========================================="
echo "部署环境: $ENVIRONMENT"
echo "项目名称: $PROJECT_NAME"
echo "Git分支: $BRANCH"
echo "配置文件: $COMPOSE_FILE"
echo "环境文件: $ENV_FILE"
echo "=========================================="
# 切换分支
echo "切换到Git分支: $BRANCH"
git checkout $BRANCH
if [ $? -ne 0 ]; then
echo "错误: 无法切换到分支 $BRANCH"
exit 1
fi
# 拉取最新代码
echo "拉取最新代码..."
git pull origin $BRANCH
# 根据不同的环境,执行不同的操作
# 预发布环境、生产环境都需要使用运行服务上的用户文件,将用户文件复制到指定目录
# 根据不同的环境,执行不同的操作
# 预发布环境、生产环境都需要还原数据库,使用数据库备份文件,并尝试使用数据库升级
if [ "$ENVIRONMENT" = "local" ]; then
echo "本地环境,跳过数据库还原"
else
echo "还原数据库..."
# 还原数据库
docker-compose --project-name $PROJECT_NAME exec -T db bash -c "mysql -uroot -p$DB_ROOT_PASSWORD shop < $DB_BACKUP_DIR/shop.sql"
if [ $? -ne 0 ]; then
echo "错误: 数据库还原失败"
exit 1
fi
# 尝试使用数据库升级脚本
echo "尝试使用数据库升级..."
docker-compose --project-name $PROJECT_NAME exec -T db bash -c "php artisan migrate --force"
if [ $? -ne 0 ]; then
echo "数据库升级失败"
else
echo "数据库升级成功"
fi
fi
# 构建并启动容器
echo "构建并启动Docker容器..."
if [ "$ENVIRONMENT" = "local" ]; then
docker-compose --env-file $ENV_FILE -f $COMPOSE_FILE up -d
else
docker-compose --project-name $PROJECT_NAME --env-file $ENV_FILE up -d
fi
echo "部署完成!"
echo "查看容器状态: docker-compose --project-name $PROJECT_NAME ps"
echo "查看日志: docker-compose --project-name $PROJECT_NAME logs -f"

View File

@@ -14,7 +14,7 @@ services:
build:
context: ./docker/php
dockerfile: Dockerfile
container_name: ${PROJECT_NAME}_php
container_name: ${PROJECT_NAME}_${APP_ENV}_php
restart: always
extra_hosts:
- "host.docker.internal:host-gateway" # 支持主机名解析
@@ -25,23 +25,20 @@ services:
# 不然ThinkPHP 6.x 系列,会只加载 .env 文件,而不会加载 .env.local 文件,导致 .env.local 文件中的配置不会生效
APP_ENV: ${APP_ENV:-development}
APP_DEBUG: ${APP_DEBUG:-true}
XDEBUG_CONFIG: ${XDEBUG_CONFIG:-client_host=host.docker.internal client_port=9003}
PHP_IDE_CONFIG: serverName=docker-php
ports:
- "${PHP_FPM_PORT:-9000}:9000" # PHP-FPM
- "${XDEBUG_POST:-9003}:9003" # Xdebug
# PHP应用根目录可选默认 /var/www/html
PHP_APP_ROOT: ${PHP_APP_ROOT:-/var/www/html}
# 用户ID映射可选用于解决挂载权限问题
USER_ID: ${USER_ID:-33}
GROUP_ID: ${GROUP_ID:-33}
volumes:
- ./:/var/www/all_source
- ./src:/var/www/html
- ./src:/var/www/html:rw
# 更新下载源列表以加速apt-get
- ./docker/debian/sources.list:/etc/apt/sources.list:ro
- ./docker/php/php.ini:/usr/local/etc/php/php.ini:ro
- ./docker/php/xdebug.ini:/usr/local/etc/php/conf.d/xdebug.ini
- xdebug_logs:/tmp # Xdebug 日志目录
depends_on:
- db
healthcheck:
test: ["CMD", "bash", "-c", "curl -f http://localhost:9000/status && ps aux | grep '[p]hp think cron:schedule'"]
test: ["CMD", "bash", "-c", "curl -f http://localhost:9000/status"]
interval: 30s
timeout: 10s
retries: 3
@@ -49,18 +46,18 @@ services:
networks:
- sass-platform-net
labels:
- "com.docker.compose.project.working_dir=${PROJECT_NAME}"
- "com.docker.compose.project.working_dir=${PROJECT_NAME}_${APP_ENV}"
nginx:
build:
context: ./docker/nginx
dockerfile: Dockerfile
container_name: ${PROJECT_NAME}_nginx
container_name: ${PROJECT_NAME}_${APP_ENV}_nginx
restart: always
ports:
- "${NGINX_PORT:-80}:80"
- "${NGINX_SSL_PORT:-443}:443"
volumes:
# 挂载项目代码到 Nginx 容器中
- ./src:/var/www/html:rw
# 更新下载源列表以加速apt-get
- ./docker/debian/sources.list:/etc/apt/sources.list:ro
@@ -72,11 +69,11 @@ services:
networks:
- sass-platform-net
labels:
- "com.docker.compose.project.working_dir=${PROJECT_NAME}"
- "com.docker.compose.project.working_dir=${PROJECT_NAME}_${APP_ENV}"
db:
image: mysql:5.7.44
container_name: ${PROJECT_NAME}_mysql
container_name: ${PROJECT_NAME}_${APP_ENV}_mysql
environment:
<<: *shared-api-env
volumes:
@@ -93,12 +90,12 @@ services:
- --collation-server=utf8mb4_unicode_ci
- --innodb_buffer_pool_size=256M
labels:
- "com.docker.compose.project.working_dir=${PROJECT_NAME}"
- "com.docker.compose.project.working_dir=${PROJECT_NAME}_${APP_ENV}"
# Redis 服务(可选)
redis:
image: redis:8.2
container_name: ${PROJECT_NAME}_redis
container_name: ${PROJECT_NAME}_${APP_ENV}_redis
environment:
REDIS_PASSWORD: ${REDIS_PASSWORD:-luckyshop123!@#}
REDISCLI_AUTH: ${REDIS_PASSWORD:-luckyshop123!@#}
@@ -111,13 +108,26 @@ services:
- sass-platform-net
restart: unless-stopped
labels:
- "com.docker.compose.project.working_dir=${PROJECT_NAME}"
- "com.docker.compose.project.working_dir=${PROJECT_NAME}_${APP_ENV}"
volumes:
mysql_db_data:
name: ${PROJECT_NAME}_${APP_ENV}_mysql_db_data
driver: local
driver_opts:
type: none
o: bind
device: ./docker/mysql_db_data/${APP_ENV}
redis_data:
xdebug_logs:
name: ${PROJECT_NAME}_${APP_ENV}_redis_data
driver: local
driver_opts:
type: none
o: bind
device: ./docker/redis_data/${APP_ENV}
networks:
sass-platform-net:
name: ${PROJECT_NAME}_${APP_ENV}_net
driver: bridge

File diff suppressed because one or more lines are too long

View File

@@ -1,27 +1,26 @@
[mysqld]
# 字符集设置
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
# 连接设置
max_connections=100
wait_timeout=28800
interactive_timeout=28800
# 缓冲区设置
innodb_buffer_pool_size=256M
key_buffer_size=64M
# 日志设置
slow_query_log=1
slow_query_log_file=/var/lib/mysql/slow.log
long_query_time=2
# 其他设置
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
[mysqld]
# 字符集设置
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
# 连接设置
max_connections=100
wait_timeout=28800
interactive_timeout=28800
# 缓冲区设置
innodb_buffer_pool_size=256M
key_buffer_size=64M
# 日志设置
slow_query_log=1
slow_query_log_file=/var/lib/mysql/slow.log
long_query_time=2
# 其他设置
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
[client]
default-character-set=utf8mb4

9
docker/mysql_db_data/.gitignore vendored Normal file
View File

@@ -0,0 +1,9 @@
# 忽略所有文件
*
# 只保留指定的 .gitkeep 文件
!.gitignore
!development/.gitkeep
!test/.gitkeep
!production/.gitkeep
!staging/.gitkeep

View File

View File

@@ -1,29 +1,21 @@
FROM nginx:alpine
# 删除默认配置
RUN rm /etc/nginx/conf.d/default.conf
#
# - ./.docker/nginx/conf.c:/etc/nginx/conf.c:ro
# - ./.docker/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
# - ./.docker/nginx/sites-enabled:/etc/nginx/sites-enabled:ro
# 将本地 nginx 配置复制到镜像中并设置为只读
COPY ./conf.c /etc/nginx/conf.c
COPY ./default.conf /etc/nginx/conf.d/default.conf
COPY ./sites-enabled /etc/nginx/sites-enabled
# 设置只读权限(文件 0444目录及其内容 0555
RUN chmod 0444 /etc/nginx/conf.c \
&& chmod 0444 /etc/nginx/conf.d/default.conf \
&& chmod -R 0555 /etc/nginx/sites-enabled
# 设置工作目录
WORKDIR /var/www/html
# 创建日志目录
RUN mkdir -p /var/log/nginx
# 暴露端口
EXPOSE 80 443
FROM nginx:alpine
# 删除默认配置
RUN rm /etc/nginx/conf.d/default.conf
# 将本地 nginx 配置复制到镜像中
COPY ./conf.c/ /etc/nginx/conf.c/
COPY ./default.conf /etc/nginx/conf.d/default.conf
COPY ./sites-enabled/ /etc/nginx/sites-enabled/
# 暴露端口
EXPOSE 80 443
# 添加在Dockerfile末尾CMD命令之前
COPY ./entrypoint.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/entrypoint.sh
ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]
# 启动nginx
CMD ["nginx", "-g", "daemon off;"]

View File

@@ -0,0 +1,14 @@
location /ws {
proxy_pass http://php-fpm:8080; # 注意:这里用的是 Docker 服务名或容器名
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# 可选设置超时WebSocket 是长连接)
proxy_read_timeout 86400s;
proxy_send_timeout 86400s;
}

View File

@@ -0,0 +1,18 @@
#!/bin/bash
set -e
echo "=== NGINX Docker 权限初始化 ==="
# 设置权限
chmod -R 0444 /etc/nginx/conf.c
chmod 0444 /etc/nginx/conf.d/default.conf
chmod -R 0755 /etc/nginx/sites-enabled
# 创建日志目录
mkdir -p /var/log/nginx
echo "=== NGINX Docker 权限初始化完成 ==="
# 执行原有的启动命令
exec "$@"

View File

@@ -20,6 +20,9 @@
# add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
# --- SSL configuration end ---
# 启用 WebSocket 支持
include conf.c/enable-websocket.conf;
#PHP-INFO-START PHP引用配置可以注释或修改
include conf.c/enable-php-74.conf;
#PHP-INFO-END

View File

@@ -1,10 +0,0 @@
# 使用官方PHP镜像
FROM php:7.4.33-fpm-dev-newshop
# 设置工作目录
WORKDIR /var/www/html
# 暴露端口
EXPOSE 9000 9003
CMD ["php-fpm"]

View File

@@ -27,8 +27,14 @@ RUN apt-get update && apt-get install -y \
libfreetype6-dev \
libjpeg62-turbo-dev \
libpng-dev \
iputils-ping \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
# 安装 WebSocat 完成后,清理缓存
COPY ./websocat /usr/local/bin/websocat
RUN chmod +x /usr/local/bin/websocat
# 安装 PHP 扩展
RUN docker-php-ext-configure gd --with-freetype --with-jpeg \
&& docker-php-ext-install \
@@ -45,9 +51,6 @@ RUN docker-php-ext-configure gd --with-freetype --with-jpeg \
# 安装 Redis 扩展
RUN pecl install redis-5.3.7 && docker-php-ext-enable redis
# 安装 Xdebug兼容 PHP 7.4 的版本)
RUN pecl install xdebug-3.1.6 && docker-php-ext-enable xdebug
# 安装Composer
COPY --from=composer:2.2.25 /usr/bin/composer /usr/bin/composer
@@ -56,30 +59,15 @@ RUN composer --version
# 修改 PHP 配置
RUN echo "memory_limit=256M" > /usr/local/etc/php/conf.d/memory-limit.ini \
&& echo "upload_max_filesize=50M" >> /usr/local/etc/php/conf.d/uploads.ini \
&& echo "post_max_size=50M" >> /usr/local/etc/php/conf.d/uploads.ini
# 创建 Xdebug 配置
RUN echo "zend_extension=xdebug.so" > /usr/local/etc/php/conf.d/xdebug.ini
&& echo "upload_max_filesize=150M" >> /usr/local/etc/php/conf.d/uploads.ini \
&& echo "post_max_size=150M" >> /usr/local/etc/php/conf.d/uploads.ini
# # 使用Composer安装项目依赖可选根据需要启用, 更多的时候,会出错,要在容器中执行操作)
# RUN composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
# RUN composer install --no-dev --optimize-autoloader --working-dir=/var/www/html
# # 创建非 root 用户
# RUN useradd -m -u 1000 phpuser && chown -R phpuser:phpuser /var/www/html
# 设置权限, 防止以下目录无法写入的问题
RUN chmod -R a+rw /var/www/html/runtime
RUN chmod -R a+rw /var/www/html/uploads
RUN chmod -R a+rw /var/www/html/tmp
RUN chmod -R a+rw /var/www/html/temp
# USER phpuser
# 暴露端口
EXPOSE 9000 9003
# 暴露端口9000 为 PHP-FPM 端口8080 为 WebSocket 端口
EXPOSE 9000 8080
############ 查看 cron 进程
## 查看 cron 进程
@@ -95,4 +83,10 @@ EXPOSE 9000 9003
#######################################
# 启动Supervisor
# 添加在Dockerfile末尾CMD命令之前
COPY ./entrypoint.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/entrypoint.sh
ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]
# 修改CMD命令
CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"]

344
docker/php/entrypoint.sh Normal file
View File

@@ -0,0 +1,344 @@
#!/bin/bash
# 移除 set -e 以便更好的错误控制
echo "=== Web应用权限初始化 ==="
# 定义应用根目录,优先使用环境变量,否则使用默认值
APP_ROOT="${PHP_APP_ROOT:-/var/www/html}"
echo "使用应用根目录: $APP_ROOT"
# 如果应用根目录不存在,则跳过权限设置
if [ ! -d "$APP_ROOT" ]; then
echo "❌ 应用根目录:'$APP_ROOT'不存在,跳过权限设置"
exit 1
fi
# 创建统一的Web组并配置所有用户最高效的权限管理
configure_web_users() {
# 常见Web服务器用户列表
WEB_USERS=("www-data" "www" "apache" "nginx")
# 获取环境变量中的用户ID
TARGET_UID=${USER_ID:-33}
TARGET_GID=${GROUP_ID:-33}
echo "配置统一Web组权限目标UID:GID = $TARGET_UID:$TARGET_GID"
# 创建统一的Web组增强错误处理
WEB_GROUP="webaccess"
if ! getent group "$WEB_GROUP" &>/dev/null; then
echo "创建统一Web组: $WEB_GROUP"
# 尝试使用指定GID创建组
if groupadd -g $TARGET_GID "$WEB_GROUP" 2>/dev/null; then
echo "✅ 统一Web组创建成功GID: $TARGET_GID"
else
echo "⚠️ GID $TARGET_GID 已被占用尝试自动分配GID"
# 尝试不指定GID创建组
if groupadd "$WEB_GROUP" 2>/dev/null; then
ACTUAL_GID=$(getent group "$WEB_GROUP" | cut -d: -f3)
echo "✅ 统一Web组创建成功自动分配GID: $ACTUAL_GID"
else
echo "❌ 创建 $WEB_GROUP 组失败,尝试使用备用方案"
# 备用方案使用现有的www-data组
if getent group "www-data" &>/dev/null; then
WEB_GROUP="www-data"
echo "🔄 使用现有的www-data组作为统一组"
else
echo "❌ 备用方案也失败,权限配置可能不完整"
WEB_GROUP=""
fi
fi
fi
else
ACTUAL_GID=$(getent group "$WEB_GROUP" | cut -d: -f3)
echo "✅ 统一Web组 $WEB_GROUP 已存在GID: $ACTUAL_GID"
fi
# 最终验证组是否存在
if [ -z "$WEB_GROUP" ] || ! getent group "$WEB_GROUP" &>/dev/null; then
echo "❌ 无法创建或找到可用的Web组权限配置将受限"
return 1
fi
# 只将已存在的Web用户加入统一组增强错误处理
success_count=0
total_users=0
for web_user in "${WEB_USERS[@]}"; do
total_users=$((total_users + 1))
if id "$web_user" &>/dev/null; then
echo "📝 处理Web用户: $web_user"
# 获取用户当前组信息(安全的变量处理)
current_groups=$(id -Gn "$web_user" 2>/dev/null | tr '\n' ' ' | sed 's/ *$//')
echo " 当前所属组: ${current_groups:-}"
# 尝试将用户加入统一组(使用-a参数保留现有组只添加新组
if usermod -a -G "$WEB_GROUP" "$web_user" 2>/dev/null; then
echo " ✅ 成功将 $web_user 添加到统一组 $WEB_GROUP"
success_count=$((success_count + 1))
else
echo " ⚠️ 无法将 $web_user 添加到统一组,尝试设置主组"
# 备用方案:设置主组
if usermod -g "$WEB_GROUP" "$web_user" 2>/dev/null; then
echo " ✅ 成功将 $web_user 主组设置为 $WEB_GROUP"
success_count=$((success_count + 1))
else
echo " ❌ 无法配置 $web_user 的组权限"
fi
fi
else
echo "⚭ Web用户 $web_user 不存在,跳过"
fi
done
echo "📊 用户配置汇总: $success_count/$total_users 个Web用户配置成功"
# 至少要有一个用户配置成功
if [ $success_count -eq 0 ]; then
echo "⚠️ 没有Web用户被成功配置但继续执行"
fi
echo "统一Web组配置完成"
}
# 错误处理:如果配置失败,不要终止整个脚本
configure_web_users || echo "⚠️ Web用户配置出现问题但继续执行权限设置"
echo "当前用户: $(whoami)"
echo "UID: $(id -u), GID: $(id -g)"
# 修复所有目录权限使用统一Web组最高效的权限管理
if [ -d "$APP_ROOT" ]; then
# 重新获取最终的WEB_GROUP可能已被修改
FINAL_WEB_GROUP=""
# 首选使用创建的webaccess组
if getent group "webaccess" &>/dev/null; then
FINAL_WEB_GROUP="webaccess"
echo "🎯 使用创建的统一Web组: $FINAL_WEB_GROUP"
# 备选使用www-data组
elif getent group "www-data" &>/dev/null; then
FINAL_WEB_GROUP="www-data"
echo "🔄 回退到www-data组: $FINAL_WEB_GROUP"
# 最后:使用当前用户的组
else
CURRENT_USER=$(whoami)
CURRENT_GROUP=$(id -gn "$CURRENT_USER")
FINAL_WEB_GROUP="$CURRENT_GROUP"
echo "🔧 使用当前用户组: $FINAL_WEB_GROUP"
fi
# 最终验证
if [ -z "$FINAL_WEB_GROUP" ]; then
echo "❌ 无法确定有效的Web组跳过权限设置"
echo "=== 启动应用 ==="
exec "$@"
fi
WEB_GROUP="$FINAL_WEB_GROUP"
WEB_GROUP_GID=$(getent group "$WEB_GROUP" | cut -d: -f3)
echo "✅ 最终使用Web组: $WEB_GROUP (GID: $WEB_GROUP_GID)"
echo "🔒 统一组权限模式所有Web用户通过组继承权限"
# 设置所有权为统一Web组增强错误处理
echo "📁 设置应用目录所有权为统一Web组"
CURRENT_USER=$(whoami)
if chown -R $CURRENT_USER:$WEB_GROUP "$APP_ROOT" 2>/dev/null; then
echo "✅ 所有权设置成功: $CURRENT_USER:$WEB_GROUP"
else
echo "⚠️ 所有权设置失败,尝试只设置组权限"
chgrp -R "$WEB_GROUP" "$APP_ROOT" 2>/dev/null || echo "❌ 组权限设置也失败"
fi
# 设置目录权限为775组权限为rwx所有组内用户都有完整权限
echo "🔐 设置目录权限775文件权限664"
# 使用更安全的权限设置方式,避免权限被拒绝
dir_count=0
file_count=0
# 设置目录权限(兼容性更好的方式)
if command -v find >/dev/null 2>&1; then
dir_count=$(find "$APP_ROOT" -type d -exec chmod 775 {} \; 2>/dev/null | wc -l)
file_count=$(find "$APP_ROOT" -type f -exec chmod 664 {} \; 2>/dev/null | wc -l)
find "$APP_ROOT" -type d -exec chmod g+s {} \; 2>/dev/null
else
# 备用方案:使用简单的循环
echo "find命令不可用跳过批量权限设置"
dir_count=0
file_count=0
fi
echo "📊 权限设置完成: $dir_count个目录, $file_count个文件"
echo "✅ 统一组权限设置完成所有Web用户通过组获得权限"
# 设置ACL如果支持只需设置统一组
if command -v setfacl >/dev/null 2>&1; then
echo "🔒 设置ACL权限只需设置统一Web组"
acl_success=0
# 只为统一Web组设置ACL权限限制处理深度
if setfacl -R -m g:$WEB_GROUP:rwx "$APP_ROOT" 2>/dev/null; then
echo " ✅ 设置组ACL权限成功"
acl_success=$((acl_success + 1))
else
echo " ❌ 设置组ACL权限失败"
fi
# 设置默认ACL权限新创建的文件自动继承权限
if setfacl -dR -m g:$WEB_GROUP:rwx "$APP_ROOT" 2>/dev/null; then
echo " ✅ 设置默认ACL权限成功"
acl_success=$((acl_success + 1))
else
echo " ❌ 设置默认ACL权限失败"
fi
if [ $acl_success -eq 2 ]; then
echo "🎉 统一组ACL设置完成所有组内用户自动获得权限"
elif [ $acl_success -eq 1 ]; then
echo "⚠️ ACL部分设置成功建议检查文件系统ACL支持"
else
echo "❌ ACL设置完全失败文件系统可能不支持ACL"
fi
else
echo " ACL不支持依赖传统权限模式"
echo "✅ 775权限已足够所有组内用户都有rwx权限"
fi
# 设置umask
umask 0002
echo "✅ 应用目录权限修复完成"
# 验证文件权限是否足够(测试统一组权限效果)
echo "=== 验证统一组权限效果 ==="
# 查找测试文件的更可靠方法
test_file=""
# 方法1: 查找index.html
if [ -f "$APP_ROOT/index.html" ]; then
test_file="$APP_ROOT/index.html"
fi
# 方法2: 查找任意HTML文件更安全的方式
if [ -z "$test_file" ]; then
first_html=$(find "$APP_ROOT" -maxdepth 2 -name "*.html" -type f 2>/dev/null | head -1)
if [ -n "$first_html" ] && [ -f "$first_html" ]; then
test_file="$first_html"
fi
fi
# 方法3: 查找index.php
if [ -z "$test_file" ] && [ -f "$APP_ROOT/index.php" ]; then
test_file="$APP_ROOT/index.php"
fi
# 方法4: 创建专用测试文件(最安全的选择)
if [ -z "$test_file" ]; then
test_file="$APP_ROOT/.permission_test.html"
echo "创建专用权限测试文件"
cat > "$test_file" << 'EOF'
<!DOCTYPE html>
<html>
<head><title>Permission Test</title></head>
<body><h1>Web Server Permission Test File</h1></body>
</html>
EOF
# 设置正确的权限
chown $(whoami):"$WEB_GROUP" "$test_file" 2>/dev/null || true
chmod 664 "$test_file"
fi
# 执行权限测试
if [ -f "$test_file" ]; then
echo "使用测试文件: $test_file"
echo "文件权限: $(stat -c '%a %n' "$test_file")"
echo "文件所有者: $(stat -c '%U:%G' "$test_file")"
# 测试所有Web用户的权限通过组权限
for test_user in "www-data" "www" "apache" "nginx"; do
if id "$test_user" &>/dev/null; then
echo "🔍 测试 $test_user 用户权限(通过组权限):"
# 显示用户组信息(安全的变量处理)
user_groups=$(id -Gn "$test_user" 2>/dev/null | tr '\n' ' ' | sed 's/ *$//')
echo " 📋 所属组: ${user_groups:-}"
# 测试读权限(安全:只读不修改)
if su -s /bin/sh -c "cat '$test_file' >/dev/null 2>&1" "$test_user" 2>/dev/null; then
echo " ✅ 读权限: 通过组权限可读"
else
echo " ❌ 读权限: 不可读"
fi
# 测试写权限(使用临时文件,避免污染原文件)
temp_test_file="${test_file}.write_test_${test_user}"
if su -s /bin/sh -c "echo 'permission_test' > '$temp_test_file' 2>/dev/null" "$test_user" 2>/dev/null; then
echo " ✅ 写权限: 通过组权限可写"
rm -f "$temp_test_file" 2>/dev/null
else
echo " ❌ 写权限: 不可写"
fi
# 测试目录创建权限(使用临时目录)
temp_test_dir="${APP_ROOT}/.perm_test_${test_user}"
if su -s /bin/sh -c "mkdir -p '$temp_test_dir' 2>/dev/null" "$test_user" 2>/dev/null; then
echo " ✅ 创建目录: 通过组权限可创建"
rm -rf "$temp_test_dir" 2>/dev/null
else
echo " ❌ 创建目录: 不可创建"
fi
echo " 🔗 权限来源: 统一Web组 ($WEB_GROUP) 775权限"
break # 只测试第一个可用的用户即可验证效果
fi
done
# 清理专用测试文件(如果是创建的)
if echo "$test_file" | grep -q "\.permission_test\.html$"; then
rm -f "$test_file" 2>/dev/null
echo "🧹 已清理临时测试文件"
fi
else
echo "❌ 无法找到或创建测试文件,跳过权限验证"
fi
# 显示统一组和用户状态
echo "=== 统一Web组状态检查 ==="
if getent group "$WEB_GROUP" &>/dev/null; then
echo "✅ 统一Web组 '$WEB_GROUP' 存在"
echo "组信息: $(getent group "$WEB_GROUP" 2>/dev/null || echo '获取失败')"
# 检查哪些用户在统一组中
echo "统一组成员检查:"
for web_user in "www-data" "www" "apache" "nginx"; do
if id "$web_user" &>/dev/null; then
if id -Gn "$web_user" | grep -q "$WEB_GROUP"; then
echo "$web_user 在统一组 '$WEB_GROUP' 中"
else
echo "$web_user 不在统一组 '$WEB_GROUP' 中"
fi
else
echo "$web_user 用户不存在"
fi
done
else
echo "❌ 统一Web组 '$WEB_GROUP' 不存在"
fi
fi
echo "=== 启动应用 ==="
# 执行原有的启动命令
exec "$@"

View File

@@ -12,19 +12,42 @@ autostart=true
autorestart=true
startretries=3
startsecs=1
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0
stopasgroup=true
killasgroup=true
stdout_logfile=/var/log/supervisor/php-fpm.log
stdout_logfile_maxbytes=10MB
stdout_logfile_backups=10
stderr_logfile=/var/log/supervisor/php-fpm-error.log
stderr_logfile_maxbytes=10MB
stderr_logfile_backups=10
[program:think-cron]
command=php /var/www/html/think cron:schedule
environment=APP_ENV=local
process_name=%(program_name)s_%(process_num)02d
numprocs=1
autostart=true
autorestart=true
startretries=5
startsecs=2
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0
startretries=3
stdout_logfile=/var/log/supervisor/think-cron.log
stdout_logfile_maxbytes=10MB
stdout_logfile_backups=10
stderr_logfile=/var/log/supervisor/think-cron-error.log
stderr_logfile_maxbytes=10MB
stderr_logfile_backups=10
startsecs=3
stopwaitsecs=10
[program:websocket-server]
command=/bin/bash -c "if [ -f /var/www/html/ws_server.php ]; then php ./ws_server.php; else echo 'ws_server.php not found, skipping websocket server'; fi"
workdir=/var/www/html
autostart=true
autorestart=false
startretries=0
stdout_logfile=/var/log/supervisor/websocket-server.log
stdout_logfile_maxbytes=10MB
stdout_logfile_backups=10
stderr_logfile=/var/log/supervisor/websocket-server-error.log
stderr_logfile_maxbytes=10MB
stderr_logfile_backups=10
startsecs=3
stopwaitsecs=10

BIN
docker/php/websocat Normal file

Binary file not shown.

9
docker/redis_data/.gitignore vendored Normal file
View File

@@ -0,0 +1,9 @@
# 忽略所有文件
*
# 只保留指定的 .gitkeep 文件
!.gitignore
!development/.gitkeep
!test/.gitkeep
!production/.gitkeep
!staging/.gitkeep

View File

10
docker/xdebug_logs/.gitignore vendored Normal file
View File

@@ -0,0 +1,10 @@
# 忽略目录下所有文件和子目录
*
# 忽略所有子目录
*/
# 但不忽略 .gitkeep 文件
!.gitkeep
# 不忽略 .gitignore 文件自身
!.gitignore
# 不忽略 development/.gitkeep 文件
!development/.gitkeep

View File

View File

@@ -3,23 +3,22 @@ APP_TRACE = true
[APP]
DEFAULT_TIMEZONE = Asia/Shanghai
ENV_MODE = development
[LANG]
default_lang = zh-cn
[DATABASE]
TYPE = mysql
HOSTNAME = 127.0.0.1
DATABASE = shop_mallnew_dev
USERNAME = root
PASSWORD = root
HOSTNAME = db
DATABASE = shop_mallnew
USERNAME = shop_mallnew
PASSWORD = shop_mallnew
HOSTPORT = 3306
CHARSET = utf8
CHARSET = utf8mb4
DEBUG = true
[redis]
HOST = 127.0.0.1
[REDIS]
HOST = redis
PORT = 6379
PASSWORD = ''
PASSWORD = 'luckyshop123!@#'
EXPIRY = 604800

View File

@@ -10,16 +10,16 @@ default_lang = zh-cn
[DATABASE]
TYPE = mysql
HOSTNAME = production_mysql_host
DATABASE = shop_mallnew_prod
USERNAME = prod_user
PASSWORD = prod_password
HOSTNAME = db
DATABASE = shop_mallnew
USERNAME = shop_mallnew
PASSWORD = shop_mallnew
HOSTPORT = 3306
CHARSET = utf8
CHARSET = utf8mb4
DEBUG = false
[redis]
HOST = production_redis_host
[REDIS]
HOST = redis
PORT = 6379
PASSWORD = production_redis_password
EXPIRY = 86400
PASSWORD = 'luckyshop123!@#'
EXPIRY = 604800

View File

@@ -1,22 +1,24 @@
APP_DEBUG = true
APP_TRACE = true
[APP]
DEFAULT_TIMEZONE = Asia/Shanghai
[LANG]
default_lang = zh-cn
[DATABASE]
TYPE = mysql
HOSTNAME = newshop_mysql
DATABASE = shop_dev
HOSTNAME = db
DATABASE = shop_mallnew
USERNAME = shop_mallnew
PASSWORD = shop_mallnew
HOSTPORT = 3306
CHARSET = utf8
CHARSET = utf8mb4
DEBUG = true
[RRDATABASE]
HOSTNAME = 192.168.2.64
[redis]
HOST = newshop_redis
[REDIS]
HOST = redis
PORT = 6379
PASSWORD = 'luckyshop123!@#'
EXPIRY = 604800

24
src/.env.test Normal file
View File

@@ -0,0 +1,24 @@
APP_DEBUG = true
APP_TRACE = true
[APP]
DEFAULT_TIMEZONE = Asia/Shanghai
[LANG]
default_lang = zh-cn
[DATABASE]
TYPE = mysql
HOSTNAME = db
DATABASE = shop_mallnew
USERNAME = shop_mallnew
PASSWORD = shop_mallnew
HOSTPORT = 3306
CHARSET = utf8mb4
DEBUG = true
[REDIS]
HOST = redis
PORT = 6379
PASSWORD = 'luckyshop123!@#'
EXPIRY = 604800

View File

@@ -1,9 +1,5 @@
<!-- 搜索框 -->
<div class="single-filter-box top">
<div class="single-filter-box">
<div class="layui-form">
<div class="layui-input-inline">
<label class="layui-form-label">发送状态:</label>
@@ -46,7 +42,6 @@
</div>
</script>
<script>
layui.use(['form', 'laytpl'], function() {
var table,
@@ -159,7 +154,7 @@
</tr>
<tr>
<td>通知内容</td>
<td colspan="3">{{d.content}}</td>
<td colspan="3">{{d.content}}{{d.var_parse}}</td>
</tr>
<tr>
<td>返回结果</td>

147
src/config/database.php Normal file
View File

@@ -0,0 +1,147 @@
<?php
use think\facade\Env;
return [
// 默认使用的数据库连接配置
'default' => 'mysql',
// 自定义时间查询规则
'time_query_rule' => [],
// 自动写入时间戳字段
// true为自动识别类型 false关闭
// 字符串则明确指定时间字段类型 支持 int timestamp datetime date
'auto_timestamp' => true,
// 时间字段取出后的默认时间格式
'datetime_format' => 'Y-m-d H:i:s',
// 数据库连接配置信息
'connections' => [
'mysql' => [
// 数据库类型
'type' => 'mysql',
// 服务器地址
'hostname' => env('database.hostname', 'localhost'),
// 数据库名
'database' => env('database.database', 'shop_mallnew'),
// 用户名
'username' => env('database.username', 'shop_mallnew'),
// 密码
'password' => env('database.password', 'shop_mallnew'),
// 端口
'hostport' => env('database.hostport', '3306'),
// 数据库连接参数
'params' => [],
// 数据库编码默认采用utf8
'charset' => env('database.charset', 'utf8mb4'),
// 数据库表前缀
'prefix' => 'lucky_',
// 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)
'deploy' => 0,
// 数据库读写是否分离 主从式有效
'rw_separate' => false,
// 读写分离后 主服务器数量
'master_num' => 1,
// 指定从服务器序号
'slave_no' => '',
// 是否严格检查字段是否存在
'fields_strict' => false,
// 是否需要断线重连
'break_reconnect' => false,
// 监听SQL
'trigger_sql' => true,
// 开启字段缓存
'fields_cache' => false,
// 字段缓存路径
'schema_cache_path' => app()->getRuntimePath() . 'schema' . DIRECTORY_SEPARATOR,
],
'rrdata' => [//旧版人人商城数据库
// 数据库类型
'type' => 'mysql',
/*新服务器*/
'hostname' => env('rrdatabase.hostname', 'localhost'),
/*旧服务器*/
// 'hostname' => '47.110.82.193',
// 数据库名
'database' => '5g',
// 用户名
'username' => '5g',
// 密码
'password' => '123456',
// 端口
'hostport' => '3306',
// 数据库连接参数
'params' => [],
// 数据库编码默认采用utf8
'charset' => 'utf8',
// 数据库表前缀
'prefix' => 'ims_',
// 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)
'deploy' => 0,
// 数据库读写是否分离 主从式有效
'rw_separate' => false,
// 读写分离后 主服务器数量
'master_num' => 1,
// 指定从服务器序号
'slave_no' => '',
// 是否严格检查字段是否存在
'fields_strict' => false,
// 是否需要断线重连
'break_reconnect' => false,
// 监听SQL
'trigger_sql' => false,
// 开启字段缓存
'fields_cache' => false,
// 字段缓存路径
'schema_cache_path' => app()->getRuntimePath() . 'schema' . DIRECTORY_SEPARATOR,
],
/* 'v3' => [
// 数据库类型
'type' => 'mysql',
// 服务器地址
'hostname' => '',
// 数据库名
'database' => '',
// 用户名
'username' => '',
// 密码
'password' => '',
// 端口
'hostport' => '3306',
// 数据库连接参数
'params' => [],
// 数据库编码默认采用utf8
'charset' => 'utf8',
// 数据库表前缀
'prefix' => '',
// 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)
'deploy' => 0,
// 数据库读写是否分离 主从式有效
'rw_separate' => false,
// 读写分离后 主服务器数量
'master_num' => 1,
// 指定从服务器序号
'slave_no' => '',
// 是否严格检查字段是否存在
'fields_strict' => false,
// 是否需要断线重连
'break_reconnect' => false,
// 监听SQL
'trigger_sql' => false,
// 开启字段缓存
'fields_cache' => true,
// 字段缓存路径
'schema_cache_path' => app()->getRuntimePath() . 'schema' . DIRECTORY_SEPARATOR,
],*/
// 更多的数据库配置信息
],
];

View File

@@ -21,12 +21,14 @@ if ($appEnv) {
if (is_file($envFile)) {
$app->env->load($envFile);
}
} else {
echo "⚠️ 警告未设置APP_ENV环境变量默认使用local环境。\n";
// 3. 为了兼容性,如果存在.env.local也加载优先级最高
if (is_file(__DIR__ . '/.env.local')) {
$app->env->load(__DIR__ . '/.env.local');
}
}
// 3. 为了兼容性,如果存在.env.local也加载优先级最高
if (is_file(__DIR__ . '/.env.local')) {
$app->env->load(__DIR__ . '/.env.local');
}
// 应用初始化
$app->console->run();

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
[[{"1613":0,"1616":1,"1621":2}],[{"1557":0,"1611":1,"1612":2,"1614":3,"1615":4,"1617":5,"1618":6,"1619":7,"1620":8,"1623":9,"1626":10,"1648":11,"57990":12,"57991":13,"57992":14,"57993":15,"57994":16,"57995":17,"57996":18,"57997":19}],[{"3768":0,"3769":1}],[{"3784":0,"3785":1,"3786":2,"3787":3,"3788":4,"3789":5}],[{"790":0,"791":1,"792":2,"793":3,"796":4,"797":5,"798":6,"799":7,"800":8,"803":9,"804":10,"805":11,"806":12,"809":13,"810":14,"811":15,"812":16,"813":17,"814":18,"815":19,"816":20,"817":21,"825":22,"826":23,"827":24,"828":25,"839":26,"840":27,"841":28,"845":29,"846":30,"851":31,"858":32},{"768":0,"769":1,"770":2,"771":3,"772":4,"773":5,"774":6,"775":7,"776":8,"777":9,"778":10,"779":11,"780":12,"781":13,"782":14,"783":15,"784":16,"785":17,"829":18,"831":19,"832":20,"833":21,"834":22,"836":23,"838":24,"842":25,"843":26,"844":27,"849":28,"850":29,"855":30,"7620":31,"7621":32,"7622":33,"7623":34,"7624":35,"7625":36,"8400":37,"8401":38,"8406":39,"8407":40,"8411":41,"8412":42,"8417":43,"57895":44,"57896":45,"57897":46,"57898":47,"57899":48,"57900":49,"57901":50,"57902":51,"57903":52,"57904":53,"57905":54,"58088":55}],[{"1456":0,"1457":1,"1458":2,"1459":3,"1460":4,"1461":5,"1462":6,"1463":7,"1464":8,"1467":9,"1469":10,"1479":11,"1613":12,"1616":13,"1621":14}],[{"1456":0,"1457":1,"1458":2,"1459":3,"1460":4,"1461":5,"1462":6,"1463":7,"1464":8,"1467":9,"1469":10,"1479":11,"1613":12,"1616":13,"1621":14,"2034":15}],[{"1468":0}],[{"1471":0,"1557":1,"1611":2,"1612":3,"1614":4,"1615":5,"1617":6,"1618":7,"1619":8,"1620":9,"1623":10,"1626":11,"1648":12,"64286":13,"57990":14,"57991":15,"57992":16,"57993":17,"57994":18,"57995":19,"57996":20,"57997":21}],[{"1471":0,"1557":1,"1611":2,"1612":3,"1614":4,"1615":5,"1617":6,"1618":7,"1619":8,"1620":9,"1623":10,"1626":11,"1648":12,"2027":13,"2028":14,"2029":15,"2030":16,"2031":17,"2032":18,"2033":19,"2035":20,"64286":21,"57990":22,"57991":23,"57992":24,"57993":25,"57994":26,"57995":27,"57996":28,"57997":29}],[{"3768":0,"3769":1,"3772":2}],[{"3761":0,"3764":1,"3765":2,"3766":3,"3767":4,"3771":5,"3784":6,"3785":7,"3786":8,"3787":9,"3788":10,"3789":11}],[{"790":0,"791":1,"792":2,"793":3,"796":4,"797":5,"798":6,"799":7,"800":8,"803":9,"804":10,"805":11,"806":12,"809":13,"810":14,"811":15,"812":16,"813":17,"814":18,"815":19,"816":20,"817":21,"818":22,"819":23,"825":24,"826":25,"827":26,"828":27,"839":28,"840":29,"841":30,"845":31,"846":32,"851":33,"858":34}],[{"65057":0,"65059":1},{"768":0,"769":1},{"807":0},{"790":0,"791":1,"792":2,"793":3,"796":4,"797":5,"798":6,"799":7,"800":8,"803":9,"804":10,"805":11,"806":12,"809":13,"810":14,"811":15,"812":16,"813":17,"814":18,"815":19,"816":20,"817":21,"818":22,"819":23,"825":24,"826":25,"827":26,"828":27,"839":28,"840":29,"841":30,"845":31,"846":32,"851":33,"858":34},{"768":0,"769":1,"770":2,"771":3,"772":4,"773":5,"774":6,"775":7,"776":8,"777":9,"778":10,"779":11,"780":12,"781":13,"782":14,"783":15,"784":16,"785":17,"786":18,"787":19,"788":20,"829":21,"830":22,"831":23,"832":24,"833":25,"834":26,"836":27,"838":28,"842":29,"843":30,"844":31,"849":32,"850":33,"855":34,"1155":35,"1156":36,"1157":37,"1158":38,"1159":39,"7620":40,"7621":41,"7622":42,"7623":43,"7624":44,"7625":45,"8400":46,"8401":47,"8406":48,"8407":49,"8411":50,"8412":51,"8417":52,"57895":53,"57896":54,"57897":55,"57898":56,"57899":57,"57900":58,"57901":59,"57902":60,"57903":61,"57904":62,"57905":63,"58088":64},{"808":0}],[{"45":0,"65":1,"66":2,"67":3,"68":4,"70":5,"71":6,"72":7,"74":8,"75":9,"76":10,"79":11,"80":12,"81":13,"82":14,"83":15,"84":16,"85":17,"86":18,"87":19,"88":20,"89":21,"90":22,"101":23,"102":24,"107":25,"110":26,"111":27,"114":28,"118":29,"119":30,"120":31,"121":32,"171":33,"187":34,"192":35,"193":36,"194":37,"195":38,"196":39,"198":40,"199":41,"208":42,"210":43,"211":44,"212":45,"213":46,"214":47,"217":48,"218":49,"219":50,"220":51,"221":52,"222":53,"223":54,"232":55,"233":56,"234":57,"235":58,"240":59,"241":60,"242":61,"243":62,"244":63,"245":64,"246":65,"253":66,"255":67,"256":68,"258":69,"260":70,"262":71,"268":72,"270":73,"272":74,"283":75,"286":76,"313":77,"317":78,"320":79,"328":80,"340":81,"341":82,"344":83,"345":84,"350":85,"352":86,"356":87,"366":88,"376":89,"381":90,"8208":91,"8220":92,"8222":93,"42788":94,"42816":95,"42817":96}],[{"61185":0,"61186":1,"61187":2,"61188":3,"61189":4,"61191":5,"61192":6,"61193":7,"61194":8,"61195":9,"61197":10,"61198":11,"61199":12,"61200":13,"61201":14,"61203":15,"61204":16,"61205":17,"61206":18,"61207":19}]]

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
{"rtlSUB":{"007CA":{"1":"0E28E","3":"0E28F","2":"0E290"},"007CB":{"1":"0E291","3":"0E292","2":"0E293"},"007CC":{"1":"0E294","3":"0E295","2":"0E296"},"007CD":{"1":"0E297","3":"0E298","2":"0E299"},"007CE":{"1":"0E29A","3":"0E29B","2":"0E29C"},"007CF":{"1":"0E29D","3":"0E29E","2":"0E29F"},"007D0":{"1":"0E2A0","3":"0E2A1","2":"0E2A2"},"007D1":{"1":"0E2A3","3":"0E2A4","2":"0E2A5"},"007D2":{"1":"0E2A6","3":"0E2A7","2":"0E2A8"},"007D3":{"1":"0E2A9","3":"0E2AA","2":"0E2AB"},"007D4":{"1":"0E2AC","3":"0E2AD","2":"0E2AE"},"007D5":{"1":"0E2AF","3":"0E2B0","2":"0E2B1"},"007D6":{"1":"0E2B2","3":"0E2B3","2":"0E2B4"},"007D7":{"1":"0E2B5","3":"0E2B6","2":"0E2B7"},"007D8":{"1":"0E2B8","3":"0E2B9","2":"0E2BA"},"007D9":{"1":"0E2BB","3":"0E2BC","2":"0E2BD"},"007DA":{"1":"0E2BE","3":"0E2BF","2":"0E2C0"},"007DB":{"1":"0E2C1","3":"0E2C2","2":"0E2C3"},"007DC":{"1":"0E2C4","3":"0E2C5","2":"0E2C6"},"007DD":{"1":"0E2C7","3":"0E2C8","2":"0E2C9"},"007DE":{"1":"0E2CA","3":"0E2CB","2":"0E2CC"},"007DF":{"1":"0E2CD","3":"0E2CE","2":"0E2CF"},"007E0":{"1":"0E2D0","3":"0E2D1","2":"0E2D2"},"007E1":{"1":"0E2D3","3":"0E2D4","2":"0E2D5"},"007E2":{"1":"0E2D6","3":"0E2D7","2":"0E2D8"},"007E3":{"1":"0E2D9","3":"0E2DA","2":"0E2DB"},"007E4":{"1":"0E2DC","3":"0E2DD","2":"0E2DE"},"007E5":{"1":"0E2DF","3":"0E2E0","2":"0E2E1"},"007E6":{"1":"0E2E2","3":"0E2E3","2":"0E2E4"},"007E7":{"1":"0E2E5","3":"0E2E6","2":"0E2E7"}},"finals":"0E28E 0E291 0E294 0E297 0E29A 0E29D 0E2A0 0E2A3 0E2A6 0E2A9 0E2AC 0E2AF 0E2B2 0E2B5 0E2B8 0E2BB 0E2BE 0E2C1 0E2C4 0E2C7 0E2CA 0E2CD 0E2D0 0E2D3 0E2D6 0E2D9 0E2DC 0E2DF 0E2E2 0E2E5 ","rphf":[],"half":[],"pref":[],"blwf":[],"pstf":[]}

File diff suppressed because one or more lines are too long

Binary file not shown.

View File

@@ -0,0 +1 @@
{"rangeid":122,"prevcid":126,"prevwidth":754,"interval":false,"range":{"32":[286,360,414,754,572,855,702,247],"40":{"0":351,"1":351,"interval":true},"42":[450,754,286,325,286,303],"48":{"0":572,"1":572,"interval":true,"2":572,"3":572,"4":572,"5":572,"6":572,"7":572,"8":572,"9":572},"58":{"0":303,"1":303,"interval":true},"60":{"0":754,"1":754,"interval":true,"2":754},"63":[478,900,615,617,628,693,568,518,697,677],"73":{"0":265,"1":265,"interval":true},"75":[590,501,776,673,708,542,708,625,571,549,659,615,890,616,549,616,351,303,351,754],"95":{"0":450,"1":450,"interval":true},"97":[551,571,495,571,554,316,571,570],"105":{"0":250,"1":250,"interval":true},"107":[521,250,876,570,550],"112":{"0":571,"1":571,"interval":true},"114":[370,469,353,570,532,736],"120":{"0":532,"1":532,"interval":true},"122":[472,572,303,572,754]}}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
[[{"1613":0,"1616":1,"1621":2}],[{"1557":0,"1611":1,"1612":2,"1614":3,"1615":4,"1617":5,"1618":6,"1619":7,"1620":8,"1623":9,"1626":10,"1648":11,"57974":12,"57975":13,"57976":14,"57977":15,"57978":16,"57979":17,"57980":18,"57981":19}],[{"3768":0,"3769":1}],[{"3784":0,"3785":1,"3786":2,"3787":3,"3788":4,"3789":5}],[{"790":0,"791":1,"792":2,"793":3,"796":4,"797":5,"798":6,"799":7,"800":8,"803":9,"804":10,"805":11,"806":12,"809":13,"810":14,"811":15,"812":16,"813":17,"814":18,"815":19,"816":20,"817":21,"818":22,"819":23,"825":24,"826":25,"827":26,"828":27,"839":28,"840":29,"841":30,"845":31,"846":32,"851":33,"858":34},{"768":0,"769":1,"770":2,"771":3,"772":4,"773":5,"774":6,"775":7,"776":8,"777":9,"778":10,"779":11,"780":12,"781":13,"782":14,"783":15,"784":16,"785":17,"829":18,"831":19,"832":20,"833":21,"834":22,"836":23,"838":24,"842":25,"843":26,"844":27,"849":28,"850":29,"855":30,"7620":31,"7621":32,"7622":33,"7623":34,"7624":35,"7625":36,"8400":37,"8401":38,"8406":39,"8407":40,"8411":41,"8412":42,"8417":43,"57879":44,"57880":45,"57881":46,"57882":47,"57883":48,"57884":49,"57885":50,"57886":51,"57887":52,"57888":53,"57926":54,"58072":55}],[{"1456":0,"1457":1,"1458":2,"1459":3,"1460":4,"1461":5,"1462":6,"1463":7,"1464":8,"1467":9,"1469":10,"1479":11,"1613":12,"1616":13,"1621":14}],[{"1456":0,"1457":1,"1458":2,"1459":3,"1460":4,"1461":5,"1462":6,"1463":7,"1464":8,"1467":9,"1469":10,"1479":11,"1613":12,"1616":13,"1621":14,"2034":15}],[{"1468":0}],[{"1465":0,"1471":1,"1557":2,"1611":3,"1612":4,"1614":5,"1615":6,"1617":7,"1618":8,"1619":9,"1620":10,"1623":11,"1626":12,"1648":13,"64286":14,"57974":15,"57975":16,"57976":17,"57977":18,"57978":19,"57979":20,"57980":21,"57981":22}],[{"1465":0,"1471":1,"1557":2,"1611":3,"1612":4,"1614":5,"1615":6,"1617":7,"1618":8,"1619":9,"1620":10,"1623":11,"1626":12,"1648":13,"2027":14,"2028":15,"2029":16,"2030":17,"2031":18,"2032":19,"2033":20,"2035":21,"64286":22,"57974":23,"57975":24,"57976":25,"57977":26,"57978":27,"57979":28,"57980":29,"57981":30}],[{"3768":0,"3769":1,"3772":2}],[{"3761":0,"3764":1,"3765":2,"3766":3,"3767":4,"3771":5,"3784":6,"3785":7,"3786":8,"3787":9,"3788":10,"3789":11}],[{"65057":0,"65059":1},{"768":0,"769":1},{"807":0},{"790":0,"791":1,"792":2,"793":3,"796":4,"797":5,"798":6,"799":7,"800":8,"803":9,"804":10,"805":11,"806":12,"809":13,"810":14,"811":15,"812":16,"813":17,"814":18,"815":19,"816":20,"817":21,"818":22,"819":23,"825":24,"826":25,"827":26,"828":27,"839":28,"840":29,"841":30,"845":31,"846":32,"851":33,"858":34},{"768":0,"769":1,"770":2,"771":3,"772":4,"773":5,"774":6,"775":7,"776":8,"777":9,"778":10,"779":11,"780":12,"781":13,"782":14,"783":15,"784":16,"785":17,"786":18,"787":19,"788":20,"829":21,"830":22,"831":23,"832":24,"833":25,"834":26,"835":27,"836":28,"838":29,"842":30,"843":31,"844":32,"849":33,"850":34,"855":35,"1155":36,"1156":37,"1157":38,"1158":39,"1159":40,"7620":41,"7621":42,"7622":43,"7623":44,"7624":45,"7625":46,"8400":47,"8401":48,"8406":49,"8407":50,"8411":51,"8412":52,"8417":53,"57879":54,"57880":55,"57881":56,"57882":57,"57883":58,"57884":59,"57885":60,"57886":61,"57887":62,"57888":63,"57926":64,"58072":65},{"808":0}],[{"45":0,"65":1,"66":2,"67":3,"68":4,"70":5,"71":6,"75":7,"76":8,"79":9,"80":10,"81":11,"82":12,"83":13,"84":14,"85":15,"86":16,"87":17,"88":18,"89":19,"90":20,"97":21,"102":22,"107":23,"114":24,"118":25,"119":26,"121":27,"192":28,"193":29,"194":30,"195":31,"196":32,"198":33,"199":34,"208":35,"210":36,"211":37,"212":38,"213":39,"214":40,"216":41,"217":42,"218":43,"219":44,"220":45,"221":46,"224":47,"225":48,"226":49,"227":50,"228":51,"229":52,"253":53,"255":54,"256":55,"258":56,"260":57,"262":58,"264":59,"266":60,"268":61,"270":62,"272":63,"286":64,"313":65,"317":66,"320":67,"321":68,"340":69,"341":70,"344":71,"345":72,"350":73,"352":74,"356":75,"366":76,"376":77,"381":78,"699":79,"8208":80,"8216":81,"8218":82,"8220":83,"8222":84,"42788":85,"42816":86,"42817":87}],[{"61185":0,"61186":1,"61187":2,"61188":3,"61189":4,"61191":5,"61192":6,"61193":7,"61194":8,"61195":9,"61197":10,"61198":11,"61199":12,"61200":13,"61201":14,"61203":15,"61204":16,"61205":17,"61206":18,"61207":19}]]

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
{"rtlSUB":{"007CA":{"1":"0E27E","3":"0E27F","2":"0E280"},"007CB":{"1":"0E281","3":"0E282","2":"0E283"},"007CC":{"1":"0E284","3":"0E285","2":"0E286"},"007CD":{"1":"0E287","3":"0E288","2":"0E289"},"007CE":{"1":"0E28A","3":"0E28B","2":"0E28C"},"007CF":{"1":"0E28D","3":"0E28E","2":"0E28F"},"007D0":{"1":"0E290","3":"0E291","2":"0E292"},"007D1":{"1":"0E293","3":"0E294","2":"0E295"},"007D2":{"1":"0E296","3":"0E297","2":"0E298"},"007D3":{"1":"0E299","3":"0E29A","2":"0E29B"},"007D4":{"1":"0E29C","3":"0E29D","2":"0E29E"},"007D5":{"1":"0E29F","3":"0E2A0","2":"0E2A1"},"007D6":{"1":"0E2A2","3":"0E2A3","2":"0E2A4"},"007D7":{"1":"0E2A5","3":"0E2A6","2":"0E2A7"},"007D8":{"1":"0E2A8","3":"0E2A9","2":"0E2AA"},"007D9":{"1":"0E2AB","3":"0E2AC","2":"0E2AD"},"007DA":{"1":"0E2AE","3":"0E2AF","2":"0E2B0"},"007DB":{"1":"0E2B1","3":"0E2B2","2":"0E2B3"},"007DC":{"1":"0E2B4","3":"0E2B5","2":"0E2B6"},"007DD":{"1":"0E2B7","3":"0E2B8","2":"0E2B9"},"007DE":{"1":"0E2BA","3":"0E2BB","2":"0E2BC"},"007DF":{"1":"0E2BD","3":"0E2BE","2":"0E2BF"},"007E0":{"1":"0E2C0","3":"0E2C1","2":"0E2C2"},"007E1":{"1":"0E2C3","3":"0E2C4","2":"0E2C5"},"007E2":{"1":"0E2C6","3":"0E2C7","2":"0E2C8"},"007E3":{"1":"0E2C9","3":"0E2CA","2":"0E2CB"},"007E4":{"1":"0E2CC","3":"0E2CD","2":"0E2CE"},"007E5":{"1":"0E2CF","3":"0E2D0","2":"0E2D1"},"007E6":{"1":"0E2D2","3":"0E2D3","2":"0E2D4"},"007E7":{"1":"0E2D5","3":"0E2D6","2":"0E2D7"}},"finals":"0E27E 0E281 0E284 0E287 0E28A 0E28D 0E290 0E293 0E296 0E299 0E29C 0E29F 0E2A2 0E2A5 0E2A8 0E2AB 0E2AE 0E2B1 0E2B4 0E2B7 0E2BA 0E2BD 0E2C0 0E2C3 0E2C6 0E2C9 0E2CC 0E2CF 0E2D2 0E2D5 ","rphf":[],"half":[],"pref":[],"blwf":[],"pstf":[]}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
{"rangeid":114,"prevcid":126,"prevwidth":754,"interval":false,"range":{"32":[313,410,469,754,626,901,785,275],"40":{"0":411,"1":411,"interval":true},"42":[470,754,342,374,342,329],"48":{"0":626,"1":626,"interval":true,"2":626,"3":626,"4":626,"5":626,"6":626,"7":626,"8":626,"9":626},"58":{"0":360,"1":360,"interval":true},"60":{"0":754,"1":754,"interval":true,"2":754},"63":[522,900,696,686,660,747],"69":{"0":615,"1":615,"interval":true},"71":[738,753],"73":{"0":334,"1":334,"interval":true},"75":[697,573,896,753,765,659,765,693,648,614,730,696,993,694,651,652,411,329,411,754],"95":{"0":450,"1":450,"interval":true},"97":[607,644,533,644,610,391,644,641],"105":{"0":308,"1":308,"interval":true},"107":[598,308,938,641,618],"112":{"0":644,"1":644,"interval":true},"114":[444,536,430,641,586,831,580,586,523,641,329,641,754]}}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
[[{"3784":0,"3785":1,"3786":2,"3787":3,"3788":4,"3789":5}],[{"3768":0,"3769":1}],[{"792":0,"793":1,"796":2,"797":3,"798":4,"799":5,"805":6,"809":7,"810":8,"812":9,"813":10,"825":11,"826":12,"827":13,"840":14,"851":15,"858":16},{"768":0,"769":1,"770":2,"771":3,"772":4,"773":5,"774":6,"775":7,"776":8,"777":9,"778":10,"779":11,"780":12,"781":13,"782":14,"783":15,"784":16,"785":17,"829":18,"831":19,"832":20,"833":21,"834":22,"836":23,"838":24,"842":25,"843":26,"844":27,"849":28,"850":29,"855":30,"7620":31,"7621":32,"7622":33,"7623":34,"7624":35,"7625":36,"8400":37,"8401":38,"8406":39,"8407":40,"8411":41,"8412":42,"8417":43,"57811":44,"57812":45,"57813":46,"57814":47,"57815":48,"57816":49,"57817":50,"57818":51,"57819":52,"57820":53,"57821":54,"57863":55}],[{"1456":0,"1457":1,"1458":2,"1459":3,"1460":4,"1461":5,"1462":6,"1463":7,"1464":8,"1467":9,"1469":10,"1479":11}],[{"1468":0}],[{"1471":0,"64286":1}],[{"3761":0,"3764":1,"3765":2,"3766":3,"3767":4,"3771":5,"3784":6,"3785":7,"3786":8,"3787":9,"3788":10,"3789":11}],[{"3768":0,"3769":1,"3772":2}],[{"790":0,"791":1,"792":2,"793":3,"796":4,"797":5,"798":6,"799":7,"800":8,"803":9,"804":10,"805":11,"806":12,"809":13,"810":14,"811":15,"812":16,"813":17,"814":18,"815":19,"816":20,"817":21,"818":22,"819":23,"825":24,"826":25,"827":26,"828":27,"839":28,"840":29,"841":30,"845":31,"846":32,"851":33,"858":34}],[{"808":0},{"65057":0,"65059":1},{"768":0,"769":1},{"807":0,"7698":1},{"790":0,"791":1,"792":2,"793":3,"796":4,"797":5,"798":6,"799":7,"800":8,"803":9,"804":10,"805":11,"806":12,"809":13,"810":14,"811":15,"812":16,"813":17,"814":18,"815":19,"816":20,"817":21,"818":22,"819":23,"825":24,"826":25,"827":26,"828":27,"839":28,"840":29,"841":30,"845":31,"846":32,"851":33,"858":34},{"768":0,"769":1,"770":2,"771":3,"772":4,"773":5,"774":6,"775":7,"776":8,"777":9,"778":10,"779":11,"780":12,"781":13,"782":14,"783":15,"784":16,"785":17,"786":18,"787":19,"788":20,"829":21,"830":22,"831":23,"832":24,"833":25,"834":26,"835":27,"836":28,"838":29,"842":30,"843":31,"844":32,"849":33,"850":34,"855":35,"1155":36,"1156":37,"1157":38,"1158":39,"1159":40,"7620":41,"7621":42,"7622":43,"7623":44,"7624":45,"7625":46,"8400":47,"8401":48,"8406":49,"8407":50,"8411":51,"8412":52,"8417":53,"57811":54,"57812":55,"57813":56,"57814":57,"57815":58,"57816":59,"57817":60,"57818":61,"57819":62,"57820":63,"57821":64,"57863":65}],[{"45":0,"65":1,"66":2,"67":3,"70":4,"75":5,"76":6,"79":7,"80":8,"81":9,"83":10,"84":11,"86":12,"87":13,"88":14,"89":15,"90":16,"102":17,"114":18,"118":19,"119":20,"121":21,"192":22,"193":23,"194":24,"195":25,"196":26,"198":27,"199":28,"208":29,"210":30,"211":31,"212":32,"213":33,"214":34,"216":35,"221":36,"222":37,"253":38,"255":39,"256":40,"258":41,"260":42,"262":43,"264":44,"266":45,"268":46,"313":47,"317":48,"321":49,"341":50,"345":51,"350":52,"352":53,"356":54,"376":55,"381":56,"699":57,"8208":58,"8216":59,"8218":60,"8220":61,"8222":62,"42788":63,"42816":64}],[{"61185":0,"61186":1,"61187":2,"61188":3,"61189":4,"61191":5,"61192":6,"61193":7,"61194":8,"61195":9,"61197":10,"61198":11,"61199":12,"61200":13,"61201":14,"61203":15,"61204":16,"61205":17,"61206":18,"61207":19}]]

View File

@@ -0,0 +1 @@
[[{"1506":0}],[{"105":0,"106":1,"303":2,"585":3,"616":4,"669":5,"768":6,"769":7,"770":8,"771":9,"772":10,"773":11,"774":12,"775":13,"776":14,"777":15,"778":16,"779":17,"780":18,"781":19,"782":20,"783":21,"784":22,"785":23,"786":24,"787":25,"788":26,"829":27,"830":28,"831":29,"832":30,"833":31,"834":32,"835":33,"836":34,"838":35,"842":36,"843":37,"844":38,"849":39,"855":40,"1011":41,"1110":42,"1112":43,"1155":44,"1156":45,"1157":46,"1158":47,"7725":48,"7883":49,"8400":50,"8401":51,"8406":52,"8407":53,"8520":54,"8521":55}],[{"741":0,"742":1,"743":2,"744":3,"745":4},{"741":0,"742":1,"743":2,"744":3,"745":4},{"741":0,"742":1,"743":2,"744":3,"745":4},{"741":0,"742":1,"743":2,"744":3,"745":4},{"741":0,"742":1,"743":2,"744":3,"745":4},{"741":0},{"742":0},{"743":0},{"744":0},{"745":0}],[{"1497":0,"1522":1}],[{"1073":0}],[{"330":0}],[{"102":0}],[{"1488":0}],[{"1381":0,"1396":1,"1406":2}],[{"115":0}],[{"383":0}],[{"33":0,"63":1,"70":2,"82":3,"83":4,"84":5,"97":6,"99":7}],[{"1471":0}],[{"1471":0}],[{"910":0,"933":1,"939":2,"946":3,"952":4,"960":5,"966":6}],[{"910":0,"933":1,"939":2,"946":3,"952":4,"960":5,"966":6}],[{"73":0,"74":1,"97":2,"108":3,"330":4}],[{"73":0,"74":1,"97":2,"108":3,"121":4,"330":5}],[{"1506":0}],[{"768":0,"769":1,"770":2,"771":3,"774":4,"775":5,"776":6,"778":7,"779":8,"780":9,"783":10,"785":11}],[{"105":0,"106":1,"303":2,"585":3,"616":4,"669":5,"1011":6,"1110":7,"1112":8,"7725":9,"7883":10,"8520":11,"8521":12}],[{"742":0,"743":1,"744":2,"745":3}],[{"741":0,"742":1,"743":2,"744":3,"745":4}],[{"741":0,"742":1,"743":2,"744":3,"745":4}],[{"741":0,"742":1,"743":2,"744":3,"745":4}],[{"741":0,"742":1,"743":2,"744":3,"745":4}],[{"741":0,"742":1,"743":2,"744":3,"745":4}],[{"161":0,"191":1,"11800":2}]]

View File

@@ -0,0 +1 @@
{"rangeid":122,"prevcid":126,"prevwidth":754,"interval":false,"range":{"32":[286,360,414,754,572,855,702,247],"40":{"0":351,"1":351,"interval":true},"42":[450,754,286,325,286,303],"48":{"0":572,"1":572,"interval":true,"2":572,"3":572,"4":572,"5":572,"6":572,"7":572,"8":572,"9":572},"58":{"0":303,"1":303,"interval":true},"60":{"0":754,"1":754,"interval":true,"2":754},"63":[478,900,615,617,628,693,568,518,697,677],"73":{"0":265,"1":265,"interval":true},"75":[590,501,776,673,708,542,708,625,571,549,659,615,890,616,549,616,351,303,351,754],"95":{"0":450,"1":450,"interval":true},"97":[551,571,495,571,554,316,571,570],"105":{"0":250,"1":250,"interval":true},"107":[521,250,876,570,550],"112":{"0":571,"1":571,"interval":true},"114":[370,469,353,570,532,736],"120":{"0":532,"1":532,"interval":true},"122":[472,572,303,572,754]}}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

View File

@@ -0,0 +1 @@
{"rangeid":1,"prevcid":127,"prevwidth":500,"interval":true,"range":{"1":{"0":500,"1":500,"interval":true,"2":500,"3":500,"4":500,"5":500,"6":500,"7":500,"8":500,"9":500,"10":500,"11":500,"12":500,"13":500,"14":500,"15":500,"16":500,"17":500,"18":500,"19":500,"20":500,"21":500,"22":500,"23":500,"24":500,"25":500,"26":500,"27":500,"28":500,"29":500,"30":500,"31":500,"32":500,"33":500,"34":500,"35":500,"36":500,"37":500,"38":500,"39":500,"40":500,"41":500,"42":500,"43":500,"44":500,"45":500,"46":500,"47":500,"48":500,"49":500,"50":500,"51":500,"52":500,"53":500,"54":500,"55":500,"56":500,"57":500,"58":500,"59":500,"60":500,"61":500,"62":500,"63":500,"64":500,"65":500,"66":500,"67":500,"68":500,"69":500,"70":500,"71":500,"72":500,"73":500,"74":500,"75":500,"76":500,"77":500,"78":500,"79":500,"80":500,"81":500,"82":500,"83":500,"84":500,"85":500,"86":500,"87":500,"88":500,"89":500,"90":500,"91":500,"92":500,"93":500,"94":500,"95":500,"96":500,"97":500,"98":500,"99":500,"100":500,"101":500,"102":500,"103":500,"104":500,"105":500,"106":500,"107":500,"108":500,"109":500,"110":500,"111":500,"112":500,"113":500,"114":500,"115":500,"116":500,"117":500,"118":500,"119":500,"120":500,"121":500,"122":500,"123":500,"124":500,"125":500,"126":500}}}

View File

@@ -0,0 +1 @@
{"name":"Sun-ExtA","type":"TTF","desc":{"CapHeight":684,"XHeight":453,"FontBBox":"[-973 -301 2074 1078]","Flags":4,"Ascent":930,"Descent":-141,"Leading":0,"ItalicAngle":0,"StemV":87,"MissingWidth":1000},"unitsPerEm":256,"up":-86,"ut":47,"strp":254,"strs":47,"ttffile":"D:\\2024project\\myweb\\saas.cn\\vendor\\mpdf\\mpdf\\src\\Config\/..\/..\/ttfonts\/Sun-ExtA.ttf","TTCfontID":0,"originalsize":22993540,"sip":false,"smp":false,"BMPselected":false,"fontkey":"sun-exta","panose":" 0 0 2 1 6 0 3 1 1 1 1 1","haskerninfo":false,"haskernGPOS":false,"hassmallcapsGSUB":false,"fontmetrics":"win","useOTL":0,"rtlPUAstr":"","GSUBScriptLang":[],"GSUBFeatures":[],"GSUBLookups":[],"GPOSScriptLang":[],"GPOSFeatures":[],"GPOSLookups":[],"kerninfo":[]}