Compare commits
30 Commits
dev
...
test/weixi
| Author | SHA1 | Date | |
|---|---|---|---|
| 8a8e11414f | |||
| 46135002f9 | |||
| 72f6b341a1 | |||
| 0cb2dfa647 | |||
| 0443cc46ec | |||
| 85cf52b0e4 | |||
| c7aaa1bd16 | |||
| 0519879ebb | |||
| f461fe93f0 | |||
| 2eb98efe61 | |||
| 866ca8d938 | |||
| 267cfa12a2 | |||
| d7df9293bb | |||
| 604917b56c | |||
| 840ce860ea | |||
| 04e1735028 | |||
| ba829c4f53 | |||
| b266023afc | |||
| 23abd0496b | |||
| dffb2563be | |||
| 80998fba70 | |||
| 1f65bb61dd | |||
| 9e044672ee | |||
| 989494af6d | |||
| 5d8c3ba4ce | |||
| a973ce720e | |||
| 218d405f56 | |||
| 2d07082b81 | |||
| 15720c6a62 | |||
| 224c2a3117 |
3
.env
3
.env
@@ -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
24
.env.development
Normal 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
|
||||
|
||||
13
.env.example
13
.env.example
@@ -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
24
.env.production
Normal 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
24
.env.staging
Normal 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
24
.env.test
Normal 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
3
.gitignore
vendored
@@ -18,6 +18,9 @@ __pycache__
|
||||
.idea
|
||||
.vscode
|
||||
|
||||
# 环境变量
|
||||
.env
|
||||
|
||||
# 源码结构
|
||||
debug.txt
|
||||
.travis.yml
|
||||
|
||||
138
README.md
Normal file
138
README.md
Normal 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
100
deploy.sh
Normal 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"
|
||||
@@ -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
@@ -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
9
docker/mysql_db_data/.gitignore
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
# 忽略所有文件
|
||||
*
|
||||
|
||||
# 只保留指定的 .gitkeep 文件
|
||||
!.gitignore
|
||||
!development/.gitkeep
|
||||
!test/.gitkeep
|
||||
!production/.gitkeep
|
||||
!staging/.gitkeep
|
||||
0
docker/mysql_db_data/.gitkeep
Normal file
0
docker/mysql_db_data/.gitkeep
Normal 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;"]
|
||||
14
docker/nginx/conf.c/enable-websocket.conf
Normal file
14
docker/nginx/conf.c/enable-websocket.conf
Normal 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;
|
||||
}
|
||||
18
docker/nginx/entrypoint.sh
Normal file
18
docker/nginx/entrypoint.sh
Normal 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 "$@"
|
||||
@@ -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
|
||||
|
||||
@@ -1,10 +0,0 @@
|
||||
# 使用官方PHP镜像
|
||||
FROM php:7.4.33-fpm-dev-newshop
|
||||
|
||||
# 设置工作目录
|
||||
WORKDIR /var/www/html
|
||||
|
||||
# 暴露端口
|
||||
EXPOSE 9000 9003
|
||||
|
||||
CMD ["php-fpm"]
|
||||
@@ -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
344
docker/php/entrypoint.sh
Normal 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 "$@"
|
||||
@@ -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
BIN
docker/php/websocat
Normal file
Binary file not shown.
9
docker/redis_data/.gitignore
vendored
Normal file
9
docker/redis_data/.gitignore
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
# 忽略所有文件
|
||||
*
|
||||
|
||||
# 只保留指定的 .gitkeep 文件
|
||||
!.gitignore
|
||||
!development/.gitkeep
|
||||
!test/.gitkeep
|
||||
!production/.gitkeep
|
||||
!staging/.gitkeep
|
||||
0
docker/redis_data/.gitkeep
Normal file
0
docker/redis_data/.gitkeep
Normal file
10
docker/xdebug_logs/.gitignore
vendored
Normal file
10
docker/xdebug_logs/.gitignore
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
# 忽略目录下所有文件和子目录
|
||||
*
|
||||
# 忽略所有子目录
|
||||
*/
|
||||
# 但不忽略 .gitkeep 文件
|
||||
!.gitkeep
|
||||
# 不忽略 .gitignore 文件自身
|
||||
!.gitignore
|
||||
# 不忽略 development/.gitkeep 文件
|
||||
!development/.gitkeep
|
||||
0
docker/xdebug_logs/.gitkeep
Normal file
0
docker/xdebug_logs/.gitkeep
Normal 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
|
||||
@@ -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
|
||||
@@ -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
24
src/.env.test
Normal 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
|
||||
@@ -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
147
src/config/database.php
Normal 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,
|
||||
],*/
|
||||
// 更多的数据库配置信息
|
||||
],
|
||||
];
|
||||
|
||||
10
src/think
10
src/think
@@ -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();
|
||||
1
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/dejavusanscondensed.GDEFdata.json
vendored
Normal file
1
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/dejavusanscondensed.GDEFdata.json
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/dejavusanscondensed.GPOSdata.json
vendored
Normal file
1
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/dejavusanscondensed.GPOSdata.json
vendored
Normal 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}]]
|
||||
1
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/dejavusanscondensed.GSUB.arab.DFLT.json
vendored
Normal file
1
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/dejavusanscondensed.GSUB.arab.DFLT.json
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/dejavusanscondensed.GSUB.arab.KUR .json
vendored
Normal file
1
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/dejavusanscondensed.GSUB.arab.KUR .json
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/dejavusanscondensed.GSUB.arab.SND .json
vendored
Normal file
1
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/dejavusanscondensed.GSUB.arab.SND .json
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/dejavusanscondensed.GSUB.arab.URD .json
vendored
Normal file
1
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/dejavusanscondensed.GSUB.arab.URD .json
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/dejavusanscondensed.GSUB.nko .DFLT.json
vendored
Normal file
1
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/dejavusanscondensed.GSUB.nko .DFLT.json
vendored
Normal 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":[]}
|
||||
BIN
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/dejavusanscondensed.GSUBGPOStables.dat
vendored
Normal file
BIN
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/dejavusanscondensed.GSUBGPOStables.dat
vendored
Normal file
Binary file not shown.
1
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/dejavusanscondensed.GSUBdata.json
vendored
Normal file
1
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/dejavusanscondensed.GSUBdata.json
vendored
Normal file
File diff suppressed because one or more lines are too long
BIN
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/dejavusanscondensed.cw.dat
vendored
Normal file
BIN
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/dejavusanscondensed.cw.dat
vendored
Normal file
Binary file not shown.
1
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/dejavusanscondensed.cw127.json
vendored
Normal file
1
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/dejavusanscondensed.cw127.json
vendored
Normal 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]}}
|
||||
BIN
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/dejavusanscondensed.gid.dat
vendored
Normal file
BIN
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/dejavusanscondensed.gid.dat
vendored
Normal file
Binary file not shown.
1
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/dejavusanscondensed.mtx.json
vendored
Normal file
1
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/dejavusanscondensed.mtx.json
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/dejavusanscondensedB.GDEFdata.json
vendored
Normal file
1
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/dejavusanscondensedB.GDEFdata.json
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/dejavusanscondensedB.GPOSdata.json
vendored
Normal file
1
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/dejavusanscondensedB.GPOSdata.json
vendored
Normal 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}]]
|
||||
1
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/dejavusanscondensedB.GSUB.arab.DFLT.json
vendored
Normal file
1
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/dejavusanscondensedB.GSUB.arab.DFLT.json
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/dejavusanscondensedB.GSUB.arab.KUR .json
vendored
Normal file
1
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/dejavusanscondensedB.GSUB.arab.KUR .json
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/dejavusanscondensedB.GSUB.arab.SND .json
vendored
Normal file
1
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/dejavusanscondensedB.GSUB.arab.SND .json
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/dejavusanscondensedB.GSUB.arab.URD .json
vendored
Normal file
1
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/dejavusanscondensedB.GSUB.arab.URD .json
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/dejavusanscondensedB.GSUB.nko .DFLT.json
vendored
Normal file
1
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/dejavusanscondensedB.GSUB.nko .DFLT.json
vendored
Normal 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":[]}
|
||||
BIN
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/dejavusanscondensedB.GSUBGPOStables.dat
vendored
Normal file
BIN
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/dejavusanscondensedB.GSUBGPOStables.dat
vendored
Normal file
Binary file not shown.
1
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/dejavusanscondensedB.GSUBdata.json
vendored
Normal file
1
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/dejavusanscondensedB.GSUBdata.json
vendored
Normal file
File diff suppressed because one or more lines are too long
BIN
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/dejavusanscondensedB.cw.dat
vendored
Normal file
BIN
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/dejavusanscondensedB.cw.dat
vendored
Normal file
Binary file not shown.
1
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/dejavusanscondensedB.cw127.json
vendored
Normal file
1
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/dejavusanscondensedB.cw127.json
vendored
Normal 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]}}
|
||||
BIN
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/dejavusanscondensedB.gid.dat
vendored
Normal file
BIN
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/dejavusanscondensedB.gid.dat
vendored
Normal file
Binary file not shown.
1
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/dejavusanscondensedB.mtx.json
vendored
Normal file
1
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/dejavusanscondensedB.mtx.json
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/dejavusanscondensedI.GDEFdata.json
vendored
Normal file
1
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/dejavusanscondensedI.GDEFdata.json
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/dejavusanscondensedI.GPOSdata.json
vendored
Normal file
1
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/dejavusanscondensedI.GPOSdata.json
vendored
Normal 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}]]
|
||||
BIN
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/dejavusanscondensedI.GSUBGPOStables.dat
vendored
Normal file
BIN
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/dejavusanscondensedI.GSUBGPOStables.dat
vendored
Normal file
Binary file not shown.
1
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/dejavusanscondensedI.GSUBdata.json
vendored
Normal file
1
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/dejavusanscondensedI.GSUBdata.json
vendored
Normal 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}]]
|
||||
BIN
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/dejavusanscondensedI.cw.dat
vendored
Normal file
BIN
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/dejavusanscondensedI.cw.dat
vendored
Normal file
Binary file not shown.
1
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/dejavusanscondensedI.cw127.json
vendored
Normal file
1
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/dejavusanscondensedI.cw127.json
vendored
Normal 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]}}
|
||||
BIN
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/dejavusanscondensedI.gid.dat
vendored
Normal file
BIN
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/dejavusanscondensedI.gid.dat
vendored
Normal file
Binary file not shown.
1
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/dejavusanscondensedI.mtx.json
vendored
Normal file
1
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/dejavusanscondensedI.mtx.json
vendored
Normal file
File diff suppressed because one or more lines are too long
BIN
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/dejavuserifcondensed.cw.dat
vendored
Normal file
BIN
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/dejavuserifcondensed.cw.dat
vendored
Normal file
Binary file not shown.
0
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/dejavuserifcondensed.gid.dat
vendored
Normal file
0
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/dejavuserifcondensed.gid.dat
vendored
Normal file
1
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/dejavuserifcondensed.mtx.json
vendored
Normal file
1
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/dejavuserifcondensed.mtx.json
vendored
Normal file
File diff suppressed because one or more lines are too long
BIN
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/sun-exta.cw.dat
vendored
Normal file
BIN
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/sun-exta.cw.dat
vendored
Normal file
Binary file not shown.
1
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/sun-exta.cw127.json
vendored
Normal file
1
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/sun-exta.cw127.json
vendored
Normal 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}}}
|
||||
0
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/sun-exta.gid.dat
vendored
Normal file
0
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/sun-exta.gid.dat
vendored
Normal file
1
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/sun-exta.mtx.json
vendored
Normal file
1
src/vendor/mpdf/mpdf/tmp/mpdf/ttfontdata/sun-exta.mtx.json
vendored
Normal 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":[]}
|
||||
Reference in New Issue
Block a user