Compare commits
2 Commits
38fb2ec4d5
...
749241f19b
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
749241f19b | ||
|
|
f69eca39ff |
@@ -4,7 +4,8 @@ on:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build_and_deploy:
|
build_and_deploy:
|
||||||
runs-on: ubuntu-latest
|
runs-on: java21
|
||||||
|
|
||||||
outputs:
|
outputs:
|
||||||
build_status: ${{ job.status }}
|
build_status: ${{ job.status }}
|
||||||
build_url: ${{ gitea.server_url }}/${{ gitea.repository.owner.name }}/${{ gitea.repository.name }}/actions/runs/${{ gitea.run_id }}
|
build_url: ${{ gitea.server_url }}/${{ gitea.repository.owner.name }}/${{ gitea.repository.name }}/actions/runs/${{ gitea.run_id }}
|
||||||
@@ -26,52 +27,20 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
ref: master
|
ref: master
|
||||||
|
|
||||||
- name: 2.Set up JDK 21
|
|
||||||
uses: actions/setup-java@v5
|
- name: 3.缓存 Maven 依赖
|
||||||
|
uses: actions/cache@v5
|
||||||
with:
|
with:
|
||||||
java-version: '21'
|
path: ~/.m2/repository
|
||||||
distribution: 'temurin'
|
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
|
||||||
|
restore-keys: |
|
||||||
|
${{ runner.os }}-maven-
|
||||||
|
|
||||||
- name: 3.设置JAVA Maven 环境
|
- name: 4.构建项目
|
||||||
run: |
|
run: |
|
||||||
# 适配root/普通用户
|
java -version
|
||||||
SUDO=""
|
|
||||||
[ "$(id -u)" != "0" ] && SUDO="sudo"
|
|
||||||
|
|
||||||
# 安装依赖
|
|
||||||
$SUDO apt update && $SUDO apt install -y wget tar --no-install-recommends
|
|
||||||
|
|
||||||
# 下载Maven
|
|
||||||
MAVEN_VERSION="3.9.11"
|
|
||||||
MAVEN_TAR="apache-maven-${MAVEN_VERSION}-bin.tar.gz"
|
|
||||||
MAVEN_URL="https://archive.apache.org/dist/maven/maven-3/${MAVEN_VERSION}/binaries/${MAVEN_TAR}"
|
|
||||||
wget --no-verbose -O /tmp/${MAVEN_TAR} ${MAVEN_URL}
|
|
||||||
|
|
||||||
# 解压+软链接
|
|
||||||
$SUDO tar -xzf /tmp/${MAVEN_TAR} -C /usr/local/
|
|
||||||
$SUDO ln -sf /usr/local/apache-maven-${MAVEN_VERSION} /usr/local/maven
|
|
||||||
|
|
||||||
# 配置PATH
|
|
||||||
echo "/usr/local/maven/bin" >> $GITHUB_PATH
|
|
||||||
export PATH="/usr/local/maven/bin:$PATH"
|
|
||||||
|
|
||||||
# 验证
|
|
||||||
mvn -v
|
mvn -v
|
||||||
|
mvn clean package -DskipTests
|
||||||
- name: 4.构建jar包
|
|
||||||
run: |
|
|
||||||
echo "===== 开始构建JAR包 ====="
|
|
||||||
# 新增:打印当前构建分支(两种方式双重确认)
|
|
||||||
echo "当前工作目录分支:$(git branch --show-current)"
|
|
||||||
echo "Gitea检出分支:${{ github.ref_name }}"
|
|
||||||
echo "预期构建分支: master"
|
|
||||||
echo "========================"
|
|
||||||
mvn -B clean install -DskipTests -Pdev 2>&1
|
|
||||||
# 检查构建是否成功
|
|
||||||
if [ $? -ne 0 ]; then
|
|
||||||
echo "JAR包构建失败!"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: 5.生成Dockerfile
|
- name: 5.生成Dockerfile
|
||||||
run: |
|
run: |
|
||||||
@@ -103,49 +72,40 @@ jobs:
|
|||||||
- ./uploads:/temp/uploads
|
- ./uploads:/temp/uploads
|
||||||
ports:
|
ports:
|
||||||
- '10093:10093'
|
- '10093:10093'
|
||||||
networks:
|
|
||||||
- aida_java_net
|
|
||||||
restart: always
|
restart: always
|
||||||
networks:
|
|
||||||
aida_java_net:
|
|
||||||
external: true
|
|
||||||
name: aida_java_net
|
|
||||||
EOF
|
EOF
|
||||||
# 验证docker-compose.yml生成
|
# 验证docker-compose.yml生成
|
||||||
echo "docker-compose.yml内容:"
|
echo "docker-compose.yml内容:"
|
||||||
cat docker-compose.yml
|
cat docker-compose.yml
|
||||||
|
|
||||||
- name: 7.安装SSH工具
|
- name: 7.上传jar到远程服务器
|
||||||
run: |
|
uses: appleboy/scp-action@master
|
||||||
$SUDO apt install -y sshpass openssh-client --no-install-recommends
|
with:
|
||||||
# 配置SSH免密
|
host: ${{ secrets.SERVER_HOST }}
|
||||||
mkdir -p ~/.ssh
|
port: 22
|
||||||
echo "${{ secrets.SSH_KEY }}" > ~/.ssh/id_rsa
|
username: ${{ secrets.SERVER_USER }}
|
||||||
chmod 600 ~/.ssh/id_rsa
|
key: ${{ secrets.SSH_KEY }}
|
||||||
ssh-keyscan -H ${{ secrets.SERVER_HOST }} >> ~/.ssh/known_hosts
|
source: "target/*.jar,Dockerfile,docker-compose.yml"
|
||||||
|
target: ${{ env.REMOTE_DEPLOY_PATH }}
|
||||||
|
preserve_host_directory_structure: false
|
||||||
|
|
||||||
- name: 8.同步文件到远程服务器
|
- name: 8. 重启 Docker 服务
|
||||||
run: |
|
uses: appleboy/ssh-action@master # 👈 专门执行命令的 action
|
||||||
echo "===== 同步文件到远程服务器 ====="
|
with:
|
||||||
# 使用scp同步文件
|
host: ${{ secrets.SERVER_HOST }}
|
||||||
scp -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \
|
username: ${{ secrets.SERVER_USER }}
|
||||||
./target/*.jar ./Dockerfile ./docker-compose.yml \
|
key: ${{ secrets.SSH_KEY }}
|
||||||
${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }}:${{ env.REMOTE_DEPLOY_PATH }} 2>&1
|
key_base64: true
|
||||||
|
script: |
|
||||||
- name: 9.部署和运行服务
|
echo "========= 进入部署目录 ========="
|
||||||
run: |
|
|
||||||
echo "===== 开始部署服务 ====="
|
|
||||||
# SSH执行部署命令
|
|
||||||
ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \
|
|
||||||
${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }} << 'EOF_SSH'
|
|
||||||
cd ${{ env.REMOTE_DEPLOY_PATH }}
|
cd ${{ env.REMOTE_DEPLOY_PATH }}
|
||||||
echo "停止旧容器..."
|
ls -l
|
||||||
docker compose down || true
|
|
||||||
echo "构建镜像..."
|
echo "========= 停止旧服务 ========="
|
||||||
docker compose build --no-cache
|
docker compose down
|
||||||
echo "启动服务..."
|
|
||||||
docker compose up -d
|
echo "========= 启动新服务 ========="
|
||||||
echo "验证容器状态..."
|
docker compose up -d --build
|
||||||
|
|
||||||
|
echo "========= 查看运行状态 ========="
|
||||||
docker compose ps
|
docker compose ps
|
||||||
echo "部署完成!"
|
|
||||||
EOF_SSH
|
|
||||||
@@ -29,7 +29,7 @@ public class OrderItemEntity implements Serializable {
|
|||||||
|
|
||||||
/** 商品ID */
|
/** 商品ID */
|
||||||
@JsonSerialize(using = ToStringSerializer.class)
|
@JsonSerialize(using = ToStringSerializer.class)
|
||||||
private Long productId;
|
private Long listingId;
|
||||||
|
|
||||||
/** 商品名称 */
|
/** 商品名称 */
|
||||||
private String productName;
|
private String productName;
|
||||||
@@ -40,9 +40,6 @@ public class OrderItemEntity implements Serializable {
|
|||||||
/** 成交单价(HK$) */
|
/** 成交单价(HK$) */
|
||||||
private BigDecimal price;
|
private BigDecimal price;
|
||||||
|
|
||||||
/** 购买数量 */
|
|
||||||
private Integer quantity;
|
|
||||||
|
|
||||||
/** 创建时间 */
|
/** 创建时间 */
|
||||||
@TableField(fill = FieldFill.INSERT)
|
@TableField(fill = FieldFill.INSERT)
|
||||||
private LocalDateTime createTime;
|
private LocalDateTime createTime;
|
||||||
|
|||||||
@@ -108,7 +108,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfoEnti
|
|||||||
List<OrderItemEntity> items = itemsMap.getOrDefault(order.getId(), new ArrayList<>());
|
List<OrderItemEntity> items = itemsMap.getOrDefault(order.getId(), new ArrayList<>());
|
||||||
List<OrderVO.ItemVO> itemVOs = items.stream().map(item -> {
|
List<OrderVO.ItemVO> itemVOs = items.stream().map(item -> {
|
||||||
OrderVO.ItemVO itemVO = new OrderVO.ItemVO();
|
OrderVO.ItemVO itemVO = new OrderVO.ItemVO();
|
||||||
itemVO.setProductId(item.getProductId());
|
itemVO.setProductId(item.getListingId());
|
||||||
itemVO.setProductName(item.getProductName());
|
itemVO.setProductName(item.getProductName());
|
||||||
itemVO.setThumbnailUrl(minioUtil.processMinioResource(item.getThumbnailUrl(), CommonConstants.MINIO_PATH_TIMEOUT));
|
itemVO.setThumbnailUrl(minioUtil.processMinioResource(item.getThumbnailUrl(), CommonConstants.MINIO_PATH_TIMEOUT));
|
||||||
return itemVO;
|
return itemVO;
|
||||||
|
|||||||
@@ -30,5 +30,3 @@ minio:
|
|||||||
default-bucket: aida-user
|
default-bucket: aida-user
|
||||||
|
|
||||||
logging:
|
logging:
|
||||||
level:
|
|
||||||
com.aida: debug
|
|
||||||
|
|||||||
@@ -69,7 +69,6 @@ CREATE TABLE seller_orders (
|
|||||||
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '下单时间',
|
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '下单时间',
|
||||||
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||||
deleted INT(1) DEFAULT 0 COMMENT '是否删除:0-否,1-是',
|
deleted INT(1) DEFAULT 0 COMMENT '是否删除:0-否,1-是',
|
||||||
INDEX idx_order_id (order_id),
|
|
||||||
INDEX idx_seller_id (seller_id),
|
INDEX idx_seller_id (seller_id),
|
||||||
INDEX idx_deleted (deleted),
|
INDEX idx_deleted (deleted),
|
||||||
INDEX idx_create_time (create_time)
|
INDEX idx_create_time (create_time)
|
||||||
@@ -79,14 +78,13 @@ CREATE TABLE seller_orders (
|
|||||||
CREATE TABLE seller_order_item (
|
CREATE TABLE seller_order_item (
|
||||||
id BIGINT PRIMARY KEY COMMENT '主键ID',
|
id BIGINT PRIMARY KEY COMMENT '主键ID',
|
||||||
order_id VARCHAR(50) NOT NULL COMMENT '订单ID',
|
order_id VARCHAR(50) NOT NULL COMMENT '订单ID',
|
||||||
product_id BIGINT NOT NULL COMMENT '商品ID',
|
listing_id BIGINT NOT NULL COMMENT '商品ID',
|
||||||
product_name VARCHAR(255) COMMENT '商品名称',
|
product_name VARCHAR(255) COMMENT '商品名称',
|
||||||
thumbnail_url VARCHAR(200) COMMENT '商品缩略图URL',
|
thumbnail_url VARCHAR(200) COMMENT '商品缩略图URL',
|
||||||
price DECIMAL(10,2) COMMENT '成交单价(HK$)',
|
price DECIMAL(10,2) COMMENT '成交单价(HK$)',
|
||||||
quantity INT NOT NULL COMMENT '购买数量',
|
|
||||||
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||||
deleted INT(1) DEFAULT 0 COMMENT '是否删除:0-否,1-是',
|
deleted INT(1) DEFAULT 0 COMMENT '是否删除:0-否,1-是',
|
||||||
INDEX idx_order_id (order_id),
|
INDEX idx_order_id (order_id),
|
||||||
INDEX idx_product_id (product_id),
|
INDEX idx_listing_id (listing_id),
|
||||||
INDEX idx_deleted (deleted)
|
INDEX idx_deleted (deleted)
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单商品明细表';
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单商品明细表';
|
||||||
|
|||||||
67
src/main/resources/logback-spring.xml
Normal file
67
src/main/resources/logback-spring.xml
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<configuration>
|
||||||
|
<include resource="org/springframework/boot/logging/logback/defaults.xml" />
|
||||||
|
|
||||||
|
<!-- 日志存放路径(可通过环境变量覆盖) -->
|
||||||
|
<property name="log.path" value="${LOG_PATH:-./log}" />
|
||||||
|
<!-- 各服务独立文件名 -->
|
||||||
|
<property name="log.file.name" value="aida-seller" />
|
||||||
|
|
||||||
|
<property name="log.pattern.console" value="${CONSOLE_LOG_PATTERN:-%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}" />
|
||||||
|
<property name="log.pattern.file" value="${FILE_LOG_PATTERN:-%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%15t] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}" />
|
||||||
|
|
||||||
|
<!-- 控制台输出 -->
|
||||||
|
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
|
||||||
|
<encoder>
|
||||||
|
<pattern>${log.pattern.console}</pattern>
|
||||||
|
</encoder>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<!-- Info 日志文件 -->
|
||||||
|
<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
||||||
|
<file>${log.path}/${log.file.name}-info.log</file>
|
||||||
|
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
|
||||||
|
<fileNamePattern>${log.path}/${log.file.name}-info.%d{yyyy-MM-dd}.log</fileNamePattern>
|
||||||
|
<maxHistory>60</maxHistory>
|
||||||
|
</rollingPolicy>
|
||||||
|
<encoder>
|
||||||
|
<pattern>${log.pattern.file}</pattern>
|
||||||
|
</encoder>
|
||||||
|
<filter class="ch.qos.logback.classic.filter.LevelFilter">
|
||||||
|
<level>ERROR</level>
|
||||||
|
<onMatch>DENY</onMatch>
|
||||||
|
<onMismatch>ACCEPT</onMismatch>
|
||||||
|
</filter>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<!-- Error 日志文件 -->
|
||||||
|
<appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
||||||
|
<file>${log.path}/${log.file.name}-error.log</file>
|
||||||
|
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
|
||||||
|
<fileNamePattern>${log.path}/${log.file.name}-error.%d{yyyy-MM-dd}.log</fileNamePattern>
|
||||||
|
<maxHistory>60</maxHistory>
|
||||||
|
</rollingPolicy>
|
||||||
|
<encoder>
|
||||||
|
<pattern>${log.pattern.file}</pattern>
|
||||||
|
</encoder>
|
||||||
|
<filter class="ch.qos.logback.classic.filter.LevelFilter">
|
||||||
|
<level>ERROR</level>
|
||||||
|
<onMatch>ACCEPT</onMatch>
|
||||||
|
<onMismatch>DENY</onMismatch>
|
||||||
|
</filter>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<!-- 服务日志级别控制(由 Nacos 的 logging.level 统一管理,此处仅作兜底) -->
|
||||||
|
<logger name="com.aida" level="${LOG_LEVEL_SELLER:-info}" />
|
||||||
|
<!-- MyBatis-Plus 日志 -->
|
||||||
|
<logger name="com.aida.seller.mapper" level="warn" />
|
||||||
|
<!-- Spring 框架日志 -->
|
||||||
|
<logger name="org.springframework" level="warn" />
|
||||||
|
|
||||||
|
<root level="${LOG_LEVEL_ROOT:-info}">
|
||||||
|
<appender-ref ref="console" />
|
||||||
|
<appender-ref ref="file_info" />
|
||||||
|
<appender-ref ref="file_error" />
|
||||||
|
</root>
|
||||||
|
|
||||||
|
</configuration>
|
||||||
Reference in New Issue
Block a user