refactor: 重构项目目录结构和打包配置
1. 配置文件不包含 *example 文件 2. scripts 目录迁移到项目根目录 3. env.properties 迁移到 scripts 目录 4. MAIN_CLASS 参数迁移到 service.properties 5. assembly.xml 更新脚本和配置文件路径 6. 添加前端打包脚本: - build-web.sh: 管理后台打包 - build-mobile.sh: 移动端H5打包 - build-all.sh: 全量打包 7. 更新 .gitignore 忽略配置
This commit is contained in:
parent
d627b19976
commit
814265d88e
6
.gitignore
vendored
6
.gitignore
vendored
@ -49,8 +49,8 @@ application-prod.yml
|
|||||||
bootstrap.yml
|
bootstrap.yml
|
||||||
|
|
||||||
# 实际配置文件(敏感信息,仅模板提交)
|
# 实际配置文件(敏感信息,仅模板提交)
|
||||||
src/main/resources/env.properties
|
scripts/env.properties
|
||||||
src/main/resources/service.properties
|
worklog-api/src/main/resources/service.properties
|
||||||
|
|
||||||
# 数据库备份
|
# 数据库备份
|
||||||
*.sql.backup
|
*.sql.backup
|
||||||
@ -59,6 +59,8 @@ db_backup/
|
|||||||
# ==================== Assembly 打包输出 ====================
|
# ==================== Assembly 打包输出 ====================
|
||||||
deploy/worklog-api/
|
deploy/worklog-api/
|
||||||
deploy/worklog-api.tar.gz
|
deploy/worklog-api.tar.gz
|
||||||
|
deploy/worklog-web/
|
||||||
|
deploy/worklog-mobile/
|
||||||
|
|
||||||
# ==================== 上传文件 ====================
|
# ==================== 上传文件 ====================
|
||||||
uploads/
|
uploads/
|
||||||
|
|||||||
81
scripts/build-all.sh
Executable file
81
scripts/build-all.sh
Executable file
@ -0,0 +1,81 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# ====================================================
|
||||||
|
# 工作日志服务平台 - 全量打包脚本
|
||||||
|
# ====================================================
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
PROJECT_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)"
|
||||||
|
DEPLOY_DIR="${PROJECT_ROOT}/deploy"
|
||||||
|
|
||||||
|
# 颜色定义
|
||||||
|
RED='\033[0;31m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
BLUE='\033[0;34m'
|
||||||
|
NC='\033[0m' # No Color
|
||||||
|
|
||||||
|
echo -e "${BLUE}=========================================${NC}"
|
||||||
|
echo -e "${BLUE}工作日志服务平台 - 全量打包${NC}"
|
||||||
|
echo -e "${BLUE}=========================================${NC}"
|
||||||
|
|
||||||
|
# 清理 deploy 目录下的旧构建产物
|
||||||
|
echo -e "${YELLOW}清理旧构建产物...${NC}"
|
||||||
|
rm -rf ${DEPLOY_DIR}/worklog-api
|
||||||
|
rm -rf ${DEPLOY_DIR}/worklog-api.tar.gz
|
||||||
|
rm -rf ${DEPLOY_DIR}/worklog-web
|
||||||
|
rm -rf ${DEPLOY_DIR}/worklog-mobile
|
||||||
|
|
||||||
|
# 1. 打包后端 API
|
||||||
|
echo ""
|
||||||
|
echo -e "${GREEN}[1/3] 打包后端 API...${NC}"
|
||||||
|
cd "${PROJECT_ROOT}/worklog-api"
|
||||||
|
mvn clean package -DskipTests -q
|
||||||
|
|
||||||
|
# 检查后端打包结果
|
||||||
|
if [ ! -f "${DEPLOY_DIR}/worklog-api.tar.gz" ]; then
|
||||||
|
echo -e "${RED}ERROR: 后端打包失败${NC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
API_SIZE=$(du -sh ${DEPLOY_DIR}/worklog-api.tar.gz | cut -f1)
|
||||||
|
echo -e "${GREEN}后端打包完成: ${API_SIZE}${NC}"
|
||||||
|
|
||||||
|
# 2. 打包管理后台前端
|
||||||
|
echo ""
|
||||||
|
echo -e "${GREEN}[2/3] 打包管理后台前端...${NC}"
|
||||||
|
"${SCRIPT_DIR}/build-web.sh"
|
||||||
|
|
||||||
|
# 部署到 deploy 目录
|
||||||
|
mkdir -p ${DEPLOY_DIR}/worklog-web
|
||||||
|
cp -r ${PROJECT_ROOT}/worklog-web/dist/* ${DEPLOY_DIR}/worklog-web/
|
||||||
|
WEB_SIZE=$(du -sh ${DEPLOY_DIR}/worklog-web | cut -f1)
|
||||||
|
echo -e "${GREEN}管理后台打包完成: ${WEB_SIZE}${NC}"
|
||||||
|
|
||||||
|
# 3. 打包移动端 H5
|
||||||
|
echo ""
|
||||||
|
echo -e "${GREEN}[3/3] 打包移动端H5前端...${NC}"
|
||||||
|
"${SCRIPT_DIR}/build-mobile.sh"
|
||||||
|
|
||||||
|
# 部署到 deploy 目录
|
||||||
|
mkdir -p ${DEPLOY_DIR}/worklog-mobile
|
||||||
|
cp -r ${PROJECT_ROOT}/worklog-mobile/dist/* ${DEPLOY_DIR}/worklog-mobile/
|
||||||
|
MOBILE_SIZE=$(du -sh ${DEPLOY_DIR}/worklog-mobile | cut -f1)
|
||||||
|
echo -e "${GREEN}移动端H5打包完成: ${MOBILE_SIZE}${NC}"
|
||||||
|
|
||||||
|
# 输出汇总
|
||||||
|
echo ""
|
||||||
|
echo -e "${GREEN}=========================================${NC}"
|
||||||
|
echo -e "${GREEN}全量打包完成!${NC}"
|
||||||
|
echo -e "${GREEN}=========================================${NC}"
|
||||||
|
echo -e "输出目录: ${DEPLOY_DIR}/"
|
||||||
|
echo ""
|
||||||
|
echo -e "产物列表:"
|
||||||
|
echo -e " - worklog-api.tar.gz (${API_SIZE})"
|
||||||
|
echo -e " - worklog-web/ (${WEB_SIZE})"
|
||||||
|
echo -e " - worklog-mobile/ (${MOBILE_SIZE})"
|
||||||
|
echo ""
|
||||||
|
echo -e "部署命令示例:"
|
||||||
|
echo -e " scp ${DEPLOY_DIR}/worklog-api.tar.gz user@server:/opt/worklog/"
|
||||||
|
echo -e " scp -r ${DEPLOY_DIR}/worklog-web user@server:/opt/worklog/"
|
||||||
|
echo -e " scp -r ${DEPLOY_DIR}/worklog-mobile user@server:/opt/worklog/"
|
||||||
63
scripts/build-mobile.sh
Executable file
63
scripts/build-mobile.sh
Executable file
@ -0,0 +1,63 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# ====================================================
|
||||||
|
# 工作日志服务平台 - 移动端H5前端打包脚本
|
||||||
|
# ====================================================
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
PROJECT_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)"
|
||||||
|
MOBILE_DIR="${PROJECT_ROOT}/worklog-mobile"
|
||||||
|
DEPLOY_DIR="${PROJECT_ROOT}/deploy"
|
||||||
|
|
||||||
|
# 颜色定义
|
||||||
|
RED='\033[0;31m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
NC='\033[0m' # No Color
|
||||||
|
|
||||||
|
echo -e "${GREEN}=========================================${NC}"
|
||||||
|
echo -e "${GREEN}打包移动端H5前端 (worklog-mobile)${NC}"
|
||||||
|
echo -e "${GREEN}=========================================${NC}"
|
||||||
|
|
||||||
|
# 检查项目目录
|
||||||
|
if [ ! -d "${MOBILE_DIR}" ]; then
|
||||||
|
echo -e "${RED}ERROR: 找不到项目目录 ${MOBILE_DIR}${NC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
cd "${MOBILE_DIR}"
|
||||||
|
|
||||||
|
# 检查 node_modules
|
||||||
|
if [ ! -d "node_modules" ]; then
|
||||||
|
echo -e "${YELLOW}安装依赖...${NC}"
|
||||||
|
npm install
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 清理旧的构建产物
|
||||||
|
echo -e "${YELLOW}清理旧的构建产物...${NC}"
|
||||||
|
rm -rf dist
|
||||||
|
|
||||||
|
# 构建
|
||||||
|
echo -e "${YELLOW}构建生产版本...${NC}"
|
||||||
|
npm run build
|
||||||
|
|
||||||
|
# 检查构建结果
|
||||||
|
if [ ! -d "dist" ]; then
|
||||||
|
echo -e "${RED}ERROR: 构建失败,找不到 dist 目录${NC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 计算 dist 目录大小
|
||||||
|
DIST_SIZE=$(du -sh dist | cut -f1)
|
||||||
|
DIST_FILES=$(find dist -type f | wc -l)
|
||||||
|
|
||||||
|
echo -e "${GREEN}=========================================${NC}"
|
||||||
|
echo -e "${GREEN}构建完成!${NC}"
|
||||||
|
echo -e "${GREEN}=========================================${NC}"
|
||||||
|
echo -e "输出目录: ${MOBILE_DIR}/dist"
|
||||||
|
echo -e "总大小: ${DIST_SIZE}"
|
||||||
|
echo -e "文件数量: ${DIST_FILES}"
|
||||||
|
echo ""
|
||||||
|
echo -e "部署目录: ${DEPLOY_DIR}/worklog-mobile/"
|
||||||
|
echo -e "部署命令: cp -r dist/* ${DEPLOY_DIR}/worklog-mobile/"
|
||||||
63
scripts/build-web.sh
Executable file
63
scripts/build-web.sh
Executable file
@ -0,0 +1,63 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# ====================================================
|
||||||
|
# 工作日志服务平台 - 管理后台前端打包脚本
|
||||||
|
# ====================================================
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
PROJECT_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)"
|
||||||
|
WEB_DIR="${PROJECT_ROOT}/worklog-web"
|
||||||
|
DEPLOY_DIR="${PROJECT_ROOT}/deploy"
|
||||||
|
|
||||||
|
# 颜色定义
|
||||||
|
RED='\033[0;31m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
NC='\033[0m' # No Color
|
||||||
|
|
||||||
|
echo -e "${GREEN}=========================================${NC}"
|
||||||
|
echo -e "${GREEN}打包管理后台前端 (worklog-web)${NC}"
|
||||||
|
echo -e "${GREEN}=========================================${NC}"
|
||||||
|
|
||||||
|
# 检查项目目录
|
||||||
|
if [ ! -d "${WEB_DIR}" ]; then
|
||||||
|
echo -e "${RED}ERROR: 找不到项目目录 ${WEB_DIR}${NC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
cd "${WEB_DIR}"
|
||||||
|
|
||||||
|
# 检查 node_modules
|
||||||
|
if [ ! -d "node_modules" ]; then
|
||||||
|
echo -e "${YELLOW}安装依赖...${NC}"
|
||||||
|
npm install
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 清理旧的构建产物
|
||||||
|
echo -e "${YELLOW}清理旧的构建产物...${NC}"
|
||||||
|
rm -rf dist
|
||||||
|
|
||||||
|
# 构建
|
||||||
|
echo -e "${YELLOW}构建生产版本...${NC}"
|
||||||
|
npm run build
|
||||||
|
|
||||||
|
# 检查构建结果
|
||||||
|
if [ ! -d "dist" ]; then
|
||||||
|
echo -e "${RED}ERROR: 构建失败,找不到 dist 目录${NC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 计算 dist 目录大小
|
||||||
|
DIST_SIZE=$(du -sh dist | cut -f1)
|
||||||
|
DIST_FILES=$(find dist -type f | wc -l)
|
||||||
|
|
||||||
|
echo -e "${GREEN}=========================================${NC}"
|
||||||
|
echo -e "${GREEN}构建完成!${NC}"
|
||||||
|
echo -e "${GREEN}=========================================${NC}"
|
||||||
|
echo -e "输出目录: ${WEB_DIR}/dist"
|
||||||
|
echo -e "总大小: ${DIST_SIZE}"
|
||||||
|
echo -e "文件数量: ${DIST_FILES}"
|
||||||
|
echo ""
|
||||||
|
echo -e "部署目录: ${DEPLOY_DIR}/worklog-web/"
|
||||||
|
echo -e "部署命令: cp -r dist/* ${DEPLOY_DIR}/worklog-web/"
|
||||||
@ -8,7 +8,6 @@ APP_NAME="worklog-api"
|
|||||||
APP_JAR="worklog-api-1.0.0.jar"
|
APP_JAR="worklog-api-1.0.0.jar"
|
||||||
APP_HOME="/opt/worklog/${APP_NAME}"
|
APP_HOME="/opt/worklog/${APP_NAME}"
|
||||||
APP_JAR_PATH="${APP_HOME}/lib/${APP_JAR}"
|
APP_JAR_PATH="${APP_HOME}/lib/${APP_JAR}"
|
||||||
MAIN_CLASS="com.wjbl.worklog.WorklogApplication"
|
|
||||||
|
|
||||||
# Classpath 配置(lib 目录下所有 JAR + conf 目录)
|
# Classpath 配置(lib 目录下所有 JAR + conf 目录)
|
||||||
CLASSPATH="${APP_HOME}/lib/*:${APP_HOME}/conf"
|
CLASSPATH="${APP_HOME}/lib/*:${APP_HOME}/conf"
|
||||||
@ -41,6 +40,9 @@ load_properties "${APP_HOME}/conf/env.properties"
|
|||||||
# 2. 加载服务个性化配置(覆盖同名参数)
|
# 2. 加载服务个性化配置(覆盖同名参数)
|
||||||
load_properties "${APP_HOME}/conf/service.properties"
|
load_properties "${APP_HOME}/conf/service.properties"
|
||||||
|
|
||||||
|
# 主启动类(从 service.properties 读取,默认值)
|
||||||
|
MAIN_CLASS=${MAIN_CLASS:-com.wjbl.worklog.WorklogApplication}
|
||||||
|
|
||||||
# JVM 配置(从环境变量读取,如果未设置则使用默认值)
|
# JVM 配置(从环境变量读取,如果未设置则使用默认值)
|
||||||
JVM_XMS=${JVM_XMS:-512m}
|
JVM_XMS=${JVM_XMS:-512m}
|
||||||
JVM_XMX=${JVM_XMX:-1024m}
|
JVM_XMX=${JVM_XMX:-1024m}
|
||||||
@ -31,7 +31,7 @@
|
|||||||
|
|
||||||
<!-- 启动脚本输出到 bin 目录 -->
|
<!-- 启动脚本输出到 bin 目录 -->
|
||||||
<fileSet>
|
<fileSet>
|
||||||
<directory>${project.basedir}/../deploy/scripts</directory>
|
<directory>${project.basedir}/../scripts</directory>
|
||||||
<outputDirectory>bin</outputDirectory>
|
<outputDirectory>bin</outputDirectory>
|
||||||
<includes>
|
<includes>
|
||||||
<include>start.sh</include>
|
<include>start.sh</include>
|
||||||
@ -43,17 +43,24 @@
|
|||||||
<lineEnding>unix</lineEnding>
|
<lineEnding>unix</lineEnding>
|
||||||
</fileSet>
|
</fileSet>
|
||||||
|
|
||||||
<!-- 配置文件输出到 conf 目录 -->
|
<!-- 环境配置文件(从 scripts 目录) -->
|
||||||
|
<fileSet>
|
||||||
|
<directory>${project.basedir}/../scripts</directory>
|
||||||
|
<outputDirectory>conf</outputDirectory>
|
||||||
|
<includes>
|
||||||
|
<include>env.properties</include>
|
||||||
|
</includes>
|
||||||
|
</fileSet>
|
||||||
|
|
||||||
|
<!-- 应用配置文件(从 resources 目录,不包含 example 文件) -->
|
||||||
<fileSet>
|
<fileSet>
|
||||||
<directory>${project.basedir}/src/main/resources</directory>
|
<directory>${project.basedir}/src/main/resources</directory>
|
||||||
<outputDirectory>conf</outputDirectory>
|
<outputDirectory>conf</outputDirectory>
|
||||||
<includes>
|
<includes>
|
||||||
<include>application.yml</include>
|
<include>application.yml</include>
|
||||||
<include>application.yml.example</include>
|
|
||||||
<include>bootstrap.yml</include>
|
<include>bootstrap.yml</include>
|
||||||
<include>logback-spring.xml</include>
|
<include>logback-spring.xml</include>
|
||||||
<include>env.properties.example</include>
|
<include>service.properties</include>
|
||||||
<include>service.properties.example</include>
|
|
||||||
</includes>
|
</includes>
|
||||||
</fileSet>
|
</fileSet>
|
||||||
</fileSets>
|
</fileSets>
|
||||||
|
|||||||
@ -1,86 +0,0 @@
|
|||||||
# ====================================================
|
|
||||||
# 工作日志服务平台 - 统一环境配置
|
|
||||||
# 说明:所有服务共用的环境配置,包括数据库、缓存、注册中心等
|
|
||||||
# ====================================================
|
|
||||||
|
|
||||||
# ==================== 数据库配置 ====================
|
|
||||||
DB_HOST=localhost
|
|
||||||
DB_PORT=3306
|
|
||||||
DB_NAME=worklog
|
|
||||||
DB_USERNAME=worklog
|
|
||||||
DB_PASSWORD=Wlog@123
|
|
||||||
DB_URL=jdbc:mysql://${DB_HOST}:${DB_PORT}/${DB_NAME}?useUnicode=true&characterEncoding=utf8mb4&serverTimezone=Asia/Shanghai&useSSL=false&allowPublicKeyRetrieval=true
|
|
||||||
|
|
||||||
# 连接池配置
|
|
||||||
DB_POOL_MIN_IDLE=5
|
|
||||||
DB_POOL_MAX_SIZE=20
|
|
||||||
DB_POOL_CONNECTION_TIMEOUT=30000
|
|
||||||
DB_POOL_IDLE_TIMEOUT=600000
|
|
||||||
DB_POOL_MAX_LIFETIME=1800000
|
|
||||||
|
|
||||||
# ==================== Redis 配置 ====================
|
|
||||||
REDIS_HOST=localhost
|
|
||||||
REDIS_PORT=6379
|
|
||||||
REDIS_PASSWORD=zjf@123456
|
|
||||||
REDIS_DATABASE=0
|
|
||||||
REDIS_TIMEOUT=5000
|
|
||||||
|
|
||||||
# Redis 连接池配置
|
|
||||||
REDIS_POOL_MAX_ACTIVE=8
|
|
||||||
REDIS_POOL_MAX_WAIT=-1
|
|
||||||
REDIS_POOL_MAX_IDLE=8
|
|
||||||
REDIS_POOL_MIN_IDLE=0
|
|
||||||
|
|
||||||
# ==================== Nacos 配置 ====================
|
|
||||||
NACOS_SERVER_ADDR=localhost:8848
|
|
||||||
NACOS_NAMESPACE=worklog-dev
|
|
||||||
NACOS_GROUP=DEFAULT_GROUP
|
|
||||||
NACOS_USERNAME=nacos
|
|
||||||
NACOS_PASSWORD=nacos
|
|
||||||
|
|
||||||
# ==================== 文件上传配置 ====================
|
|
||||||
FILE_UPLOAD_MAX_SIZE=50MB
|
|
||||||
FILE_UPLOAD_MAX_REQUEST_SIZE=100MB
|
|
||||||
FILE_STORAGE_PATH=./uploads
|
|
||||||
|
|
||||||
# ==================== 腾讯云 COS 配置 ====================
|
|
||||||
COS_ENABLED=false
|
|
||||||
COS_APP_ID=1308258046
|
|
||||||
COS_SECRET_ID=AKIDukKfkY5LK2SbU6QTM7csugCSSDjzyiDS
|
|
||||||
COS_SECRET_KEY=0lHXYIn20jDRP7ZlhNnyub3GEwObZHjw
|
|
||||||
COS_BUCKET_NAME=test-1308258046
|
|
||||||
COS_BUCKET_HOST=https://test-1308258046.cos.ap-beijing.myqcloud.com
|
|
||||||
COS_REGION=ap-beijing
|
|
||||||
|
|
||||||
# ==================== 日志配置 ====================
|
|
||||||
# 日志路径(扁平目录结构,无子目录)
|
|
||||||
LOG_PATH=./logs
|
|
||||||
|
|
||||||
# 日志级别
|
|
||||||
LOG_LEVEL_ROOT=INFO
|
|
||||||
LOG_LEVEL_APP=DEBUG
|
|
||||||
|
|
||||||
# 日志文件配置
|
|
||||||
LOG_FILE_MAX_SIZE=100MB
|
|
||||||
LOG_FILE_MAX_HISTORY=30
|
|
||||||
|
|
||||||
# ==================== JVM 配置 ====================
|
|
||||||
JVM_XMS=512m
|
|
||||||
JVM_XMX=1024m
|
|
||||||
JVM_METASPACE_SIZE=128m
|
|
||||||
JVM_MAX_METASPACE_SIZE=256m
|
|
||||||
|
|
||||||
# GC 配置
|
|
||||||
JVM_GC_TYPE=G1GC
|
|
||||||
JVM_MAX_GC_PAUSE_MILLIS=200
|
|
||||||
|
|
||||||
# ==================== 业务配置 ====================
|
|
||||||
# Token 配置
|
|
||||||
TOKEN_EXPIRE_TIME=86400
|
|
||||||
TOKEN_PREFIX=auth:token:
|
|
||||||
|
|
||||||
# 日志内容限制
|
|
||||||
WORKLOG_MAX_CONTENT_LENGTH=2000
|
|
||||||
|
|
||||||
# 允许的上传文件扩展名
|
|
||||||
UPLOAD_ALLOWED_EXTENSIONS=jpg,jpeg,png,gif,pdf,doc,docx,xls,xlsx
|
|
||||||
@ -13,6 +13,10 @@ INSTANCE_NAME=${APP_NAME}
|
|||||||
# 租户标识(多租户场景使用,用于路由,单租户留空)
|
# 租户标识(多租户场景使用,用于路由,单租户留空)
|
||||||
TENANT_ID=
|
TENANT_ID=
|
||||||
|
|
||||||
|
# ==================== 服务启动配置 ====================
|
||||||
|
# 主启动类(瘦JAR模式必须配置)
|
||||||
|
MAIN_CLASS=com.wjbl.worklog.WorklogApplication
|
||||||
|
|
||||||
# ==================== 服务端口配置 ====================
|
# ==================== 服务端口配置 ====================
|
||||||
# 服务端口(可覆盖 application.yml 中配置)
|
# 服务端口(可覆盖 application.yml 中配置)
|
||||||
SERVER_PORT=8080
|
SERVER_PORT=8080
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user