zrd 4 месяцев назад
Родитель
Сommit
7b1714a676
100 измененных файлов с 2582 добавлено и 109 удалено
  1. 112 0
      build-cloud/config/nacos-config.sh
  2. 27 0
      build-cloud/config/registry.conf
  3. 8 0
      build-cloud/docker/DockerXxljob
  4. 8 0
      build-cloud/docker/DockerfileAuth
  5. 8 0
      build-cloud/docker/DockerfileFile
  6. 8 0
      build-cloud/docker/DockerfileGateway
  7. 8 0
      build-cloud/docker/DockerfileGen
  8. 8 0
      build-cloud/docker/DockerfileJob
  9. 8 0
      build-cloud/docker/DockerfileMonitor
  10. 8 0
      build-cloud/docker/DockerfileSystem
  11. 8 0
      build-cloud/docker/DockerfileYudao
  12. 15 0
      build-cloud/dockercompose/config.txt
  13. 106 0
      build-cloud/dockercompose/docker-compose-env.yml
  14. 21 0
      build-cloud/dockercompose/docker-compose.yml
  15. 126 0
      build-cloud/pom.xml
  16. 0 0
      build-cloud/sql/config-20211209.sql
  17. 51 0
      build-cloud/sql/config.sql
  18. 170 0
      build-cloud/sql/quartz.sql
  19. 198 0
      build-cloud/sql/ry-cloud.sql
  20. 169 0
      build-cloud/sql/ry-gen.sql
  21. 119 0
      build-cloud/sql/tables_xxl_job.sql
  22. 16 0
      build-cloud/src/main/java/Test.java
  23. 97 0
      build-cloud/src/main/resources/assembly.xml
  24. 4 0
      build-cloud/vue/Dockerfile
  25. 64 0
      build-cloud/vue/default.conf
  26. 23 7
      pom.xml
  27. 8 3
      yudao-dependencies/pom.xml
  28. 2 2
      yudao-framework/pom.xml
  29. 2 2
      yudao-framework/yudao-common/pom.xml
  30. 2 2
      yudao-framework/yudao-spring-boot-starter-biz-data-permission/pom.xml
  31. 2 2
      yudao-framework/yudao-spring-boot-starter-biz-ip/pom.xml
  32. 2 2
      yudao-framework/yudao-spring-boot-starter-biz-tenant/pom.xml
  33. 2 2
      yudao-framework/yudao-spring-boot-starter-excel/pom.xml
  34. 2 2
      yudao-framework/yudao-spring-boot-starter-job/pom.xml
  35. 2 2
      yudao-framework/yudao-spring-boot-starter-monitor/pom.xml
  36. 2 2
      yudao-framework/yudao-spring-boot-starter-mq/pom.xml
  37. 2 2
      yudao-framework/yudao-spring-boot-starter-mybatis/pom.xml
  38. 2 2
      yudao-framework/yudao-spring-boot-starter-protection/pom.xml
  39. 2 2
      yudao-framework/yudao-spring-boot-starter-redis/pom.xml
  40. 2 2
      yudao-framework/yudao-spring-boot-starter-security/pom.xml
  41. 2 2
      yudao-framework/yudao-spring-boot-starter-test/pom.xml
  42. 2 2
      yudao-framework/yudao-spring-boot-starter-web/pom.xml
  43. 9 5
      yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/banner/core/BannerApplicationRunner.java
  44. 2 2
      yudao-framework/yudao-spring-boot-starter-websocket/pom.xml
  45. 2 2
      yudao-module-ai/pom.xml
  46. 2 2
      yudao-module-ai/yudao-module-ai-api/pom.xml
  47. 2 2
      yudao-module-ai/yudao-module-ai-biz/pom.xml
  48. 2 2
      yudao-module-ai/yudao-spring-boot-starter-ai/pom.xml
  49. 2 2
      yudao-module-bpm/pom.xml
  50. 2 2
      yudao-module-bpm/yudao-module-bpm-api/pom.xml
  51. 2 2
      yudao-module-bpm/yudao-module-bpm-biz/pom.xml
  52. 2 2
      yudao-module-crm/pom.xml
  53. 2 2
      yudao-module-crm/yudao-module-crm-api/pom.xml
  54. 2 2
      yudao-module-erp/pom.xml
  55. 2 2
      yudao-module-erp/yudao-module-erp-api/pom.xml
  56. 2 2
      yudao-module-erp/yudao-module-erp-biz/pom.xml
  57. 23 0
      yudao-module-game/pom.xml
  58. 26 0
      yudao-module-game/yudao-module-game-api/pom.xml
  59. 4 0
      yudao-module-game/yudao-module-game-api/src/main/java/cn/iocoder/yudao/module/game/api/package-info.java
  60. 15 0
      yudao-module-game/yudao-module-game-api/src/main/java/cn/iocoder/yudao/module/game/enums/ErrorCodeConstants.java
  61. 73 0
      yudao-module-game/yudao-module-game-biz/pom.xml
  62. 83 0
      yudao-module-game/yudao-module-game-biz/src/main/java/cn/iocoder/yudao/module/game/adpter/DiftUtils.java
  63. 67 0
      yudao-module-game/yudao-module-game-biz/src/main/java/cn/iocoder/yudao/module/game/adpter/DifyFilesUtils.java
  64. 184 0
      yudao-module-game/yudao-module-game-biz/src/main/java/cn/iocoder/yudao/module/game/adpter/DifyResponse.java
  65. 18 0
      yudao-module-game/yudao-module-game-biz/src/main/java/cn/iocoder/yudao/module/game/adpter/FileResp.java
  66. 32 0
      yudao-module-game/yudao-module-game-biz/src/main/java/cn/iocoder/yudao/module/game/adpter/ResUtils.java
  67. 125 0
      yudao-module-game/yudao-module-game-biz/src/main/java/cn/iocoder/yudao/module/game/controller/admin/characterinfo/CharacterInfoController.java
  68. 34 0
      yudao-module-game/yudao-module-game-biz/src/main/java/cn/iocoder/yudao/module/game/controller/admin/characterinfo/vo/CharacterInfoPageReqVO.java
  69. 39 0
      yudao-module-game/yudao-module-game-biz/src/main/java/cn/iocoder/yudao/module/game/controller/admin/characterinfo/vo/CharacterInfoRespVO.java
  70. 31 0
      yudao-module-game/yudao-module-game-biz/src/main/java/cn/iocoder/yudao/module/game/controller/admin/characterinfo/vo/CharacterInfoSaveReqVO.java
  71. 47 0
      yudao-module-game/yudao-module-game-biz/src/main/java/cn/iocoder/yudao/module/game/dal/dataobject/characterinfo/CharacterInfoDO.java
  72. 29 0
      yudao-module-game/yudao-module-game-biz/src/main/java/cn/iocoder/yudao/module/game/dal/mysql/characterinfo/CharacterInfoMapper.java
  73. 6 0
      yudao-module-game/yudao-module-game-biz/src/main/java/cn/iocoder/yudao/module/game/framework/package-info.java
  74. 44 0
      yudao-module-game/yudao-module-game-biz/src/main/java/cn/iocoder/yudao/module/game/framework/security/config/SecurityConfiguration.java
  75. 4 0
      yudao-module-game/yudao-module-game-biz/src/main/java/cn/iocoder/yudao/module/game/framework/security/core/package-info.java
  76. 24 0
      yudao-module-game/yudao-module-game-biz/src/main/java/cn/iocoder/yudao/module/game/framework/web/config/GameWebConfiguration.java
  77. 4 0
      yudao-module-game/yudao-module-game-biz/src/main/java/cn/iocoder/yudao/module/game/framework/web/package-info.java
  78. 9 0
      yudao-module-game/yudao-module-game-biz/src/main/java/cn/iocoder/yudao/module/game/package-info.java
  79. 56 0
      yudao-module-game/yudao-module-game-biz/src/main/java/cn/iocoder/yudao/module/game/service/characterinfo/CharacterInfoService.java
  80. 84 0
      yudao-module-game/yudao-module-game-biz/src/main/java/cn/iocoder/yudao/module/game/service/characterinfo/CharacterInfoServiceImpl.java
  81. 20 0
      yudao-module-game/yudao-module-game-biz/src/main/resources/mapper/characterinfo/CharacterInfoMapper.xml
  82. 2 2
      yudao-module-infra/pom.xml
  83. 2 2
      yudao-module-infra/yudao-module-infra-api/pom.xml
  84. 2 2
      yudao-module-infra/yudao-module-infra-biz/pom.xml
  85. 2 2
      yudao-module-iot/yudao-module-iot-api/pom.xml
  86. 2 2
      yudao-module-iot/yudao-module-iot-biz/pom.xml
  87. 2 2
      yudao-module-mall/pom.xml
  88. 2 2
      yudao-module-mall/yudao-module-product-api/pom.xml
  89. 2 2
      yudao-module-mall/yudao-module-product-biz/pom.xml
  90. 2 2
      yudao-module-mall/yudao-module-promotion-api/pom.xml
  91. 2 2
      yudao-module-mall/yudao-module-promotion-biz/pom.xml
  92. 2 2
      yudao-module-mall/yudao-module-statistics-api/pom.xml
  93. 2 2
      yudao-module-mall/yudao-module-statistics-biz/pom.xml
  94. 2 2
      yudao-module-mall/yudao-module-trade-api/pom.xml
  95. 2 2
      yudao-module-mall/yudao-module-trade-biz/pom.xml
  96. 2 2
      yudao-module-member/pom.xml
  97. 2 2
      yudao-module-member/yudao-module-member-api/pom.xml
  98. 2 2
      yudao-module-member/yudao-module-member-biz/pom.xml
  99. 2 2
      yudao-module-mp/pom.xml
  100. 2 2
      yudao-module-mp/yudao-module-mp-api/pom.xml

+ 112 - 0
build-cloud/config/nacos-config.sh

@@ -0,0 +1,112 @@
+#!/usr/bin/env bash
+# Copyright 1999-2019 Seata.io Group.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at、
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+while getopts ":h:p:g:t:u:w:" opt
+do
+  case $opt in
+  h)
+    host=$OPTARG
+    ;;
+  p)
+    port=$OPTARG
+    ;;
+  g)
+    group=$OPTARG
+    ;;
+  t)
+    tenant=$OPTARG
+    ;;
+  u)
+    username=$OPTARG
+    ;;
+  w)
+    password=$OPTARG
+    ;;
+  ?)
+    echo " USAGE OPTION: $0 [-h host] [-p port] [-g group] [-t tenant] [-u username] [-w password] "
+    exit 1
+    ;;
+  esac
+done
+
+urlencode() {
+  for ((i=0; i < ${#1}; i++))
+  do
+    char="${1:$i:1}"
+    case $char in
+    [a-zA-Z0-9.~_-]) printf $char ;;
+    *) printf '%%%02X' "'$char" ;;
+    esac
+  done
+}
+
+if [[ -z ${host} ]]; then
+    host=localhost
+fi
+if [[ -z ${port} ]]; then
+    port=8848
+fi
+if [[ -z ${group} ]]; then
+    group="SEATA_GROUP"
+fi
+if [[ -z ${tenant} ]]; then
+    tenant=""
+fi
+if [[ -z ${username} ]]; then
+    username=""
+fi
+if [[ -z ${password} ]]; then
+    password=""
+fi
+
+nacosAddr=$host:$port
+contentType="content-type:application/json;charset=UTF-8"
+
+echo "set nacosAddr=$nacosAddr"
+echo "set group=$group"
+
+failCount=0
+tempLog=$(mktemp -u)
+function addConfig() {
+  curl -X POST -H "${contentType}" "http://$nacosAddr/nacos/v1/cs/configs?dataId=$(urlencode $1)&group=$group&content=$(urlencode $2)&tenant=$tenant&username=$username&password=$password" >"${tempLog}" 2>/dev/null
+  if [[ -z $(cat "${tempLog}") ]]; then
+    echo " Please check the cluster status. "
+    exit 1
+  fi
+  if [[ $(cat "${tempLog}") =~ "true" ]]; then
+    echo "Set $1=$2 successfully "
+  else
+    echo "Set $1=$2 failure "
+    (( failCount++ ))
+  fi
+}
+
+count=0
+for line in $(cat $(dirname "$PWD")/config.txt | sed s/[[:space:]]//g); do
+  (( count++ ))
+	key=${line%%=*}
+    value=${line#*=}
+	addConfig "${key}" "${value}"
+done
+
+echo "========================================================================="
+echo " Complete initialization parameters,  total-count:$count ,  failure-count:$failCount "
+echo "========================================================================="
+
+if [[ ${failCount} -eq 0 ]]; then
+	echo " Init nacos config finished, please start seata-server. "
+else
+	echo " init nacos config fail. "
+fi

+ 27 - 0
build-cloud/config/registry.conf

@@ -0,0 +1,27 @@
+
+registry {
+  # file 、nacos 、eureka、redis、zk、consul、etcd3、sofa
+  # 指定注册中心为nacos
+  type = "nacos"
+
+  nacos {
+    serverAddr = "192.168.0.167:8848"
+    namespace = ""
+    cluster = "default"
+    username="nacos"
+    password="nacos"
+  }
+}
+
+config {
+  # file、nacos 、apollo、zk、consul、etcd3
+  type = "nacos"
+
+  nacos {
+    serverAddr = "192.168.0.167:8848"
+    namespace = ""
+    username="nacos"
+    password="nacos"
+  }
+}
+

+ 8 - 0
build-cloud/docker/DockerXxljob

@@ -0,0 +1,8 @@
+# 基于java镜像创建新镜像
+FROM adoptopenjdk/openjdk8-openj9:alpine-slim
+# 作者
+MAINTAINER Howinfun
+# 将jar包添加到容器中并更名为app.jar
+ADD  lib/xxl-job-3.2.0.jar /home/xxl-job.jar
+# 运行jar包
+ENTRYPOINT java $JAVA_OPTS -Xshareclasses -Xquickstart -jar /home/xxl-job.jar

+ 8 - 0
build-cloud/docker/DockerfileAuth

@@ -0,0 +1,8 @@
+# 基于java镜像创建新镜像
+FROM adoptopenjdk/openjdk8-openj9:alpine-slim
+# 作者
+MAINTAINER Howinfun
+# 将jar包添加到容器中并更名为app.jar
+ADD  lib/ruoyi-auth-3.2.0.jar /home/ruoyi-auth.jar
+# 运行jar包
+ENTRYPOINT java $JAVA_OPTS -Xshareclasses -Xquickstart -jar /home/ruoyi-auth.jar

+ 8 - 0
build-cloud/docker/DockerfileFile

@@ -0,0 +1,8 @@
+# 基于java镜像创建新镜像
+FROM adoptopenjdk/openjdk8-openj9:alpine-slim
+# 作者
+MAINTAINER Howinfun
+# 将jar包添加到容器中并更名为app.jar
+ADD  lib/ruoyi-modules-file-3.2.0.jar /home/ruoyi-modules-file.jar
+# 运行jar包
+ENTRYPOINT java $JAVA_OPTS -Xshareclasses -Xquickstart -jar /home/ruoyi-modules-file.jar

+ 8 - 0
build-cloud/docker/DockerfileGateway

@@ -0,0 +1,8 @@
+# 基于java镜像创建新镜像
+FROM  java:8
+# 作者
+MAINTAINER Howinfun
+# 将jar包添加到容器中并更名为app.jar
+ADD  lib/ruoyi-gateway-3.2.0.jar /home/ruoyi-gateway.jar
+# 运行jar包
+ENTRYPOINT ["nohup","java","-jar","/home/ruoyi-gateway.jar","&"]

+ 8 - 0
build-cloud/docker/DockerfileGen

@@ -0,0 +1,8 @@
+# 基于java镜像创建新镜像
+FROM adoptopenjdk/openjdk8-openj9:alpine-slim
+# 作者
+MAINTAINER Howinfun
+# 将jar包添加到容器中并更名为app.jar
+ADD  lib/ruoyi-modules-gen-3.2.0.jar /home/ruoyi-modules-gen.jar
+# 运行jar包
+ENTRYPOINT java $JAVA_OPTS -Xshareclasses -Xquickstart -jar /home/ruoyi-modules-gen.jar

+ 8 - 0
build-cloud/docker/DockerfileJob

@@ -0,0 +1,8 @@
+# 基于java镜像创建新镜像
+FROM adoptopenjdk/openjdk8-openj9:alpine-slim
+# 作者
+MAINTAINER Howinfun
+# 将jar包添加到容器中并更名为app.jar
+ADD  lib/ruoyi-modules-job-3.2.0.jar /home/ruoyi-modules-job.jar
+# 运行jar包
+ENTRYPOINT java $JAVA_OPTS -Xshareclasses -Xquickstart -jar /home/ruoyi-modules-job.jar

+ 8 - 0
build-cloud/docker/DockerfileMonitor

@@ -0,0 +1,8 @@
+# 基于java镜像创建新镜像
+FROM adoptopenjdk/openjdk8-openj9:alpine-slim
+# 作者
+MAINTAINER Howinfun
+# 将jar包添加到容器中并更名为app.jar
+ADD  lib/ruoyi-visual-monitor-3.2.0.jar /home/ruoyi-visual-monitor.jar
+# 运行jar包
+ENTRYPOINT java $JAVA_OPTS -Xshareclasses -Xquickstart -jar /home/ruoyi-visual-monitor.jar

+ 8 - 0
build-cloud/docker/DockerfileSystem

@@ -0,0 +1,8 @@
+# 基于java镜像创建新镜像
+FROM adoptopenjdk/openjdk8-openj9:alpine-slim
+# 作者
+MAINTAINER Howinfun
+# 将jar包添加到容器中并更名为app.jar
+ADD  lib/ruoyi-modules-system-3.2.0.jar /home/ruoyi-modules-system.jar
+# 运行jar包
+ENTRYPOINT java $JAVA_OPTS -Xshareclasses -Xquickstart -jar /home/ruoyi-modules-system.jar

+ 8 - 0
build-cloud/docker/DockerfileYudao

@@ -0,0 +1,8 @@
+# 基于java镜像创建新镜像
+FROM openjdk:17
+# 作者
+MAINTAINER Howinfun
+# 将jar包添加到容器中并更名为app.jar
+ADD  lib/yudao-server.jar /home/yudao-server.jar
+# 运行jar包
+ENTRYPOINT java  -jar /home/yudao-server.jar

+ 15 - 0
build-cloud/dockercompose/config.txt

@@ -0,0 +1,15 @@
+service.vgroupMapping.ruoyi-system-group=default
+store.mode=db
+store.db.datasource=druid
+store.db.dbType=mysql
+store.db.driverClassName=com.mysql.jdbc.Driver
+store.db.url=jdbc:mysql://172.21.41.195:3306/ry-seata?useUnicode=true
+store.db.user=root
+store.db.password=123456
+store.db.minConn=5
+store.db.maxConn=30
+store.db.globalTable=global_table
+store.db.branchTable=branch_table
+store.db.queryLimit=100
+store.db.lockTable=lock_table
+store.db.maxWait=5000

+ 106 - 0
build-cloud/dockercompose/docker-compose-env.yml

@@ -0,0 +1,106 @@
+# 启动命令
+# docker-compose --compatibility up -d
+version: '3'
+
+services:
+
+  mysql:
+    restart: always
+    image: mysql:5.7.22
+    container_name: 3306mysql
+    ports:
+      - 3306:3306
+    environment:
+      TZ: Asia/Shanghai
+      MYSQL_ROOT_PASSWORD: 123456
+    command:
+      --character-set-server=utf8mb4
+      --collation-server=utf8mb4_general_ci
+      --explicit_defaults_for_timestamp=true
+      --lower_case_table_names=1
+      --max_allowed_packet=128M
+      --sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO"
+    volumes:
+      - ./mysql3306:/var/lib/mysql
+
+  redis:
+    # 指定镜像
+    image: redis:4
+    restart: always
+    container_name: redis6379
+    ports:
+      # 端口映射
+      - 6379:6379
+    volumes:
+      # 目录映射
+      - "./redis/conf:/usr/local/etc/redis"
+      - "./redis/data:/data"
+    command:
+      # 执行的命令
+      redis-server
+
+
+  nacos:
+    image: nacos/nacos-server:2.0.1
+    container_name: cloud-nacos
+    restart: always
+    environment:
+      TZ: Asia/Shanghai
+      PREFER_HOST_MODE: ip #如果支持主机名可以使用hostname,否则使用ip,默认也是ip
+      SPRING_DATASOURCE_PLATFORM: mysql #数据源平台 仅支持mysql或不保存empty
+      MODE: standalone
+      MYSQL_SERVICE_HOST: 192.168.10.129
+      MYSQL_SERVICE_DB_NAME: config
+      MYSQL_SERVICE_PORT: 3306
+      MYSQL_SERVICE_USER: root
+      MYSQL_SERVICE_PASSWORD: root
+      JVM_XMS: 512m
+    volumes:
+      - ./docker/nacos/standalone-logs/:/home/nacos/logs
+
+    ports:
+      - "8848:8848"
+      - "9848:9848"
+      - "9555:9555"
+
+
+  sentinel-dashboard:
+    image: bladex/sentinel-dashboard
+    container_name: sentinel-dashboard
+    restart: always
+    environment:
+      TZ: Asia/Shanghai
+      JAVA_OPTS: "-Dserver.port=8858 -Dcsp.sentinel.dashboard.server=172.21.41.195:8858 -Dproject.name=sentinel-dashboard"
+    ports: #避免出现端口映射错误,建议采用字符串格式 8080端口为Dockerfile中EXPOSE端口
+      - "8719:8719"
+      - "8858:8858"
+    volumes:
+      - ./root/logs:/root/logs
+
+  minio:
+    image: minio/minio:RELEASE.2023-04-28T18-11-17Z
+    container_name: minio
+    ports:
+      - "4000:9000"
+    volumes:
+      - "/data/dockerdata/minio:/data"
+    environment:
+      MINIO_ACCESS_KEY: "admin"
+      MINIO_SECRET_KEY: "admin123"
+    command: server /data
+    restart: always
+    logging:
+      driver: "json-file"
+      options:
+        max-size: "1000m"
+
+  xxl-job-admin:
+    image: xuxueli/xxl-job-admin:2.1.2
+    restart: always
+    container_name: xxl-job-admin
+    environment:
+      PARAMS: '-TZ=Asia/Shanghai --spring.datasource.url=jdbc:mysql://192.168.0.167:3306/xxl_job?Unicode=true&characterEncoding=UTF-8 --spring.datasource.username=root --spring.datasource.password=root'
+    ports:
+      - 7001:8080
+    volumes:
+      - ./data/applogs:/data/applogs

+ 21 - 0
build-cloud/dockercompose/docker-compose.yml

@@ -0,0 +1,21 @@
+version: '3'
+services:
+  server:
+    build:
+      context: docker
+      dockerfile: DockerfileYudao
+    restart: always
+    ports:
+      # 端口映射
+      - 48080:48080
+    environment:
+      TZ: Asia/Shanghai
+
+
+  web:
+    build: vue
+    restart: always
+    environment:
+      TZ: Asia/Shanghai
+    ports:
+      - 8088:80

+ 126 - 0
build-cloud/pom.xml

@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>ruoyi</artifactId>
+        <groupId>com.ruoyi</groupId>
+        <version>3.2.0</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+    <properties>
+
+        <ruoyi.version>3.2.0</ruoyi.version>
+    </properties>
+    <artifactId>build</artifactId>
+
+
+    <dependencies>
+
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>ruoyi-gateway</artifactId>
+
+            <version>${version}</version>
+        </dependency>
+
+
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>ruoyi-auth</artifactId>
+            <version>${version}</version>
+        </dependency>
+
+
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>ruoyi-modules-system</artifactId>
+            <version>${version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>ruoyi-visual-monitor</artifactId>
+            <version>${version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>xxl-job</artifactId>
+            <version>${version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>ruoyi-modules-gen</artifactId>
+            <version>${version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>ruoyi-modules-job</artifactId>
+            <version>${version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>ruoyi-modules-file</artifactId>
+            <version>${version}</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+
+        <finalName>${project.artifactId}</finalName>
+        <plugins>
+
+
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    <fork>true</fork> <!-- 如果没有该配置,devtools不会生效 -->
+                </configuration>
+            </plugin>
+
+
+            <plugin>
+                <!-- 加载打包插件 -->
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-assembly-plugin</artifactId>
+                <version>2.3</version>
+                <configuration>
+                    <!-- 指定配置文件 -->
+                    <descriptors>
+                        <descriptor>src/main/resources/assembly.xml</descriptor>
+                    </descriptors>
+                    <archive>
+
+                    </archive>
+                </configuration>
+                <executions>
+                    <!-- 配置执行器 -->
+                    <execution>
+                        <id>make-assembly</id>
+                        <!-- 绑定到package生命周期阶段上 -->
+                        <phase>package</phase>
+                        <goals>
+                            <!-- 只运行一次 -->
+                            <goal>single</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <!-- 配置跳过单元测试 -->
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <version>2.12</version>
+                <configuration>
+                    <skip>true</skip>
+                    <forkMode>once</forkMode>
+                    <excludes>
+                        <exclude>**/**</exclude>
+                    </excludes>
+                </configuration>
+            </plugin>
+
+        </plugins>
+    </build>
+
+</project>

Разница между файлами не показана из-за своего большого размера
+ 0 - 0
build-cloud/sql/config-20211209.sql


Разница между файлами не показана из-за своего большого размера
+ 51 - 0
build-cloud/sql/config.sql


+ 170 - 0
build-cloud/sql/quartz.sql

@@ -0,0 +1,170 @@
+-- ----------------------------
+-- 1、存储每一个已配置的 jobDetail 的详细信息
+-- ----------------------------
+drop table if exists QRTZ_JOB_DETAILS;
+create table QRTZ_JOB_DETAILS (
+    sched_name           varchar(120)    not null,
+    job_name             varchar(200)    not null,
+    job_group            varchar(200)    not null,
+    description          varchar(250)    null,
+    job_class_name       varchar(250)    not null,
+    is_durable           varchar(1)      not null,
+    is_nonconcurrent     varchar(1)      not null,
+    is_update_data       varchar(1)      not null,
+    requests_recovery    varchar(1)      not null,
+    job_data             blob            null,
+    primary key (sched_name,job_name,job_group)
+) engine=innodb;
+
+-- ----------------------------
+-- 2、 存储已配置的 Trigger 的信息
+-- ----------------------------
+drop table if exists QRTZ_TRIGGERS;
+create table QRTZ_TRIGGERS (
+    sched_name           varchar(120)    not null,
+    trigger_name         varchar(200)    not null,
+    trigger_group        varchar(200)    not null,
+    job_name             varchar(200)    not null,
+    job_group            varchar(200)    not null,
+    description          varchar(250)    null,
+    next_fire_time       bigint(13)      null,
+    prev_fire_time       bigint(13)      null,
+    priority             integer         null,
+    trigger_state        varchar(16)     not null,
+    trigger_type         varchar(8)      not null,
+    start_time           bigint(13)      not null,
+    end_time             bigint(13)      null,
+    calendar_name        varchar(200)    null,
+    misfire_instr        smallint(2)     null,
+    job_data             blob            null,
+    primary key (sched_name,trigger_name,trigger_group),
+    foreign key (sched_name,job_name,job_group) references QRTZ_JOB_DETAILS(sched_name,job_name,job_group)
+) engine=innodb;
+
+-- ----------------------------
+-- 3、 存储简单的 Trigger,包括重复次数,间隔,以及已触发的次数
+-- ----------------------------
+drop table if exists QRTZ_SIMPLE_TRIGGERS;
+create table QRTZ_SIMPLE_TRIGGERS (
+    sched_name           varchar(120)    not null,
+    trigger_name         varchar(200)    not null,
+    trigger_group        varchar(200)    not null,
+    repeat_count         bigint(7)       not null,
+    repeat_interval      bigint(12)      not null,
+    times_triggered      bigint(10)      not null,
+    primary key (sched_name,trigger_name,trigger_group),
+    foreign key (sched_name,trigger_name,trigger_group) references QRTZ_TRIGGERS(sched_name,trigger_name,trigger_group)
+) engine=innodb;
+
+-- ----------------------------
+-- 4、 存储 Cron Trigger,包括 Cron 表达式和时区信息
+-- ---------------------------- 
+drop table if exists QRTZ_CRON_TRIGGERS;
+create table QRTZ_CRON_TRIGGERS (
+    sched_name           varchar(120)    not null,
+    trigger_name         varchar(200)    not null,
+    trigger_group        varchar(200)    not null,
+    cron_expression      varchar(200)    not null,
+    time_zone_id         varchar(80),
+    primary key (sched_name,trigger_name,trigger_group),
+    foreign key (sched_name,trigger_name,trigger_group) references QRTZ_TRIGGERS(sched_name,trigger_name,trigger_group)
+) engine=innodb;
+
+-- ----------------------------
+-- 5、 Trigger 作为 Blob 类型存储(用于 Quartz 用户用 JDBC 创建他们自己定制的 Trigger 类型,JobStore 并不知道如何存储实例的时候)
+-- ---------------------------- 
+drop table if exists QRTZ_BLOB_TRIGGERS;
+create table QRTZ_BLOB_TRIGGERS (
+    sched_name           varchar(120)    not null,
+    trigger_name         varchar(200)    not null,
+    trigger_group        varchar(200)    not null,
+    blob_data            blob            null,
+    primary key (sched_name,trigger_name,trigger_group),
+    foreign key (sched_name,trigger_name,trigger_group) references QRTZ_TRIGGERS(sched_name,trigger_name,trigger_group)
+) engine=innodb;
+
+-- ----------------------------
+-- 6、 以 Blob 类型存储存放日历信息, quartz可配置一个日历来指定一个时间范围
+-- ---------------------------- 
+drop table if exists QRTZ_CALENDARS;
+create table QRTZ_CALENDARS (
+    sched_name           varchar(120)    not null,
+    calendar_name        varchar(200)    not null,
+    calendar             blob            not null,
+    primary key (sched_name,calendar_name)
+) engine=innodb;
+
+-- ----------------------------
+-- 7、 存储已暂停的 Trigger 组的信息
+-- ---------------------------- 
+drop table if exists QRTZ_PAUSED_TRIGGER_GRPS;
+create table QRTZ_PAUSED_TRIGGER_GRPS (
+    sched_name           varchar(120)    not null,
+    trigger_group        varchar(200)    not null,
+    primary key (sched_name,trigger_group)
+) engine=innodb;
+
+-- ----------------------------
+-- 8、 存储与已触发的 Trigger 相关的状态信息,以及相联 Job 的执行信息
+-- ---------------------------- 
+drop table if exists QRTZ_FIRED_TRIGGERS;
+create table QRTZ_FIRED_TRIGGERS (
+    sched_name           varchar(120)    not null,
+    entry_id             varchar(95)     not null,
+    trigger_name         varchar(200)    not null,
+    trigger_group        varchar(200)    not null,
+    instance_name        varchar(200)    not null,
+    fired_time           bigint(13)      not null,
+    sched_time           bigint(13)      not null,
+    priority             integer         not null,
+    state                varchar(16)     not null,
+    job_name             varchar(200)    null,
+    job_group            varchar(200)    null,
+    is_nonconcurrent     varchar(1)      null,
+    requests_recovery    varchar(1)      null,
+    primary key (sched_name,entry_id)
+) engine=innodb;
+
+-- ----------------------------
+-- 9、 存储少量的有关 Scheduler 的状态信息,假如是用于集群中,可以看到其他的 Scheduler 实例
+-- ---------------------------- 
+drop table if exists QRTZ_SCHEDULER_STATE; 
+create table QRTZ_SCHEDULER_STATE (
+    sched_name           varchar(120)    not null,
+    instance_name        varchar(200)    not null,
+    last_checkin_time    bigint(13)      not null,
+    checkin_interval     bigint(13)      not null,
+    primary key (sched_name,instance_name)
+) engine=innodb;
+
+-- ----------------------------
+-- 10、 存储程序的悲观锁的信息(假如使用了悲观锁)
+-- ---------------------------- 
+drop table if exists QRTZ_LOCKS;
+create table QRTZ_LOCKS (
+    sched_name           varchar(120)    not null,
+    lock_name            varchar(40)     not null,
+    primary key (sched_name,lock_name)
+) engine=innodb;
+
+drop table if exists QRTZ_SIMPROP_TRIGGERS;
+create table QRTZ_SIMPROP_TRIGGERS (
+    sched_name           varchar(120)    not null,
+    trigger_name         varchar(200)    not null,
+    trigger_group        varchar(200)    not null,
+    str_prop_1           varchar(512)    null,
+    str_prop_2           varchar(512)    null,
+    str_prop_3           varchar(512)    null,
+    int_prop_1           int             null,
+    int_prop_2           int             null,
+    long_prop_1          bigint          null,
+    long_prop_2          bigint          null,
+    dec_prop_1           numeric(13,4)   null,
+    dec_prop_2           numeric(13,4)   null,
+    bool_prop_1          varchar(1)      null,
+    bool_prop_2          varchar(1)      null,
+    primary key (sched_name,trigger_name,trigger_group),
+    foreign key (sched_name,trigger_name,trigger_group) references QRTZ_TRIGGERS(sched_name,trigger_name,trigger_group)
+) engine=innodb;
+
+commit;

Разница между файлами не показана из-за своего большого размера
+ 198 - 0
build-cloud/sql/ry-cloud.sql


Разница между файлами не показана из-за своего большого размера
+ 169 - 0
build-cloud/sql/ry-gen.sql


+ 119 - 0
build-cloud/sql/tables_xxl_job.sql

@@ -0,0 +1,119 @@
+#
+# XXL-JOB v2.1.2
+# Copyright (c) 2015-present, xuxueli.
+
+CREATE database if NOT EXISTS `xxl_job` default character set utf8mb4 collate utf8mb4_unicode_ci;
+use `xxl_job`;
+
+
+CREATE TABLE `xxl_job_info` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `job_group` int(11) NOT NULL COMMENT '执行器主键ID',
+  `job_cron` varchar(128) NOT NULL COMMENT '任务执行CRON',
+  `job_desc` varchar(255) NOT NULL,
+  `add_time` datetime DEFAULT NULL,
+  `update_time` datetime DEFAULT NULL,
+  `author` varchar(64) DEFAULT NULL COMMENT '作者',
+  `alarm_email` varchar(255) DEFAULT NULL COMMENT '报警邮件',
+  `executor_route_strategy` varchar(50) DEFAULT NULL COMMENT '执行器路由策略',
+  `executor_handler` varchar(255) DEFAULT NULL COMMENT '执行器任务handler',
+  `executor_param` varchar(512) DEFAULT NULL COMMENT '执行器任务参数',
+  `executor_block_strategy` varchar(50) DEFAULT NULL COMMENT '阻塞处理策略',
+  `executor_timeout` int(11) NOT NULL DEFAULT '0' COMMENT '任务执行超时时间,单位秒',
+  `executor_fail_retry_count` int(11) NOT NULL DEFAULT '0' COMMENT '失败重试次数',
+  `glue_type` varchar(50) NOT NULL COMMENT 'GLUE类型',
+  `glue_source` mediumtext COMMENT 'GLUE源代码',
+  `glue_remark` varchar(128) DEFAULT NULL COMMENT 'GLUE备注',
+  `glue_updatetime` datetime DEFAULT NULL COMMENT 'GLUE更新时间',
+  `child_jobid` varchar(255) DEFAULT NULL COMMENT '子任务ID,多个逗号分隔',
+  `trigger_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '调度状态:0-停止,1-运行',
+  `trigger_last_time` bigint(13) NOT NULL DEFAULT '0' COMMENT '上次调度时间',
+  `trigger_next_time` bigint(13) NOT NULL DEFAULT '0' COMMENT '下次调度时间',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+CREATE TABLE `xxl_job_log` (
+  `id` bigint(20) NOT NULL AUTO_INCREMENT,
+  `job_group` int(11) NOT NULL COMMENT '执行器主键ID',
+  `job_id` int(11) NOT NULL COMMENT '任务,主键ID',
+  `executor_address` varchar(255) DEFAULT NULL COMMENT '执行器地址,本次执行的地址',
+  `executor_handler` varchar(255) DEFAULT NULL COMMENT '执行器任务handler',
+  `executor_param` varchar(512) DEFAULT NULL COMMENT '执行器任务参数',
+  `executor_sharding_param` varchar(20) DEFAULT NULL COMMENT '执行器任务分片参数,格式如 1/2',
+  `executor_fail_retry_count` int(11) NOT NULL DEFAULT '0' COMMENT '失败重试次数',
+  `trigger_time` datetime DEFAULT NULL COMMENT '调度-时间',
+  `trigger_code` int(11) NOT NULL COMMENT '调度-结果',
+  `trigger_msg` text COMMENT '调度-日志',
+  `handle_time` datetime DEFAULT NULL COMMENT '执行-时间',
+  `handle_code` int(11) NOT NULL COMMENT '执行-状态',
+  `handle_msg` text COMMENT '执行-日志',
+  `alarm_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '告警状态:0-默认、1-无需告警、2-告警成功、3-告警失败',
+  PRIMARY KEY (`id`),
+  KEY `I_trigger_time` (`trigger_time`),
+  KEY `I_handle_code` (`handle_code`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+CREATE TABLE `xxl_job_log_report` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `trigger_day` datetime DEFAULT NULL COMMENT '调度-时间',
+  `running_count` int(11) NOT NULL DEFAULT '0' COMMENT '运行中-日志数量',
+  `suc_count` int(11) NOT NULL DEFAULT '0' COMMENT '执行成功-日志数量',
+  `fail_count` int(11) NOT NULL DEFAULT '0' COMMENT '执行失败-日志数量',
+  PRIMARY KEY (`id`),
+  UNIQUE KEY `i_trigger_day` (`trigger_day`) USING BTREE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+CREATE TABLE `xxl_job_logglue` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `job_id` int(11) NOT NULL COMMENT '任务,主键ID',
+  `glue_type` varchar(50) DEFAULT NULL COMMENT 'GLUE类型',
+  `glue_source` mediumtext COMMENT 'GLUE源代码',
+  `glue_remark` varchar(128) NOT NULL COMMENT 'GLUE备注',
+  `add_time` datetime DEFAULT NULL,
+  `update_time` datetime DEFAULT NULL,
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+CREATE TABLE `xxl_job_registry` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `registry_group` varchar(50) NOT NULL,
+  `registry_key` varchar(255) NOT NULL,
+  `registry_value` varchar(255) NOT NULL,
+  `update_time` datetime DEFAULT NULL,
+  PRIMARY KEY (`id`),
+  KEY `i_g_k_v` (`registry_group`,`registry_key`,`registry_value`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+CREATE TABLE `xxl_job_group` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `app_name` varchar(64) NOT NULL COMMENT '执行器AppName',
+  `title` varchar(12) NOT NULL COMMENT '执行器名称',
+  `order` int(11) NOT NULL DEFAULT '0' COMMENT '排序',
+  `address_type` tinyint(4) NOT NULL DEFAULT '0' COMMENT '执行器地址类型:0=自动注册、1=手动录入',
+  `address_list` varchar(512) DEFAULT NULL COMMENT '执行器地址列表,多地址逗号分隔',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+CREATE TABLE `xxl_job_user` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `username` varchar(50) NOT NULL COMMENT '账号',
+  `password` varchar(50) NOT NULL COMMENT '密码',
+  `role` tinyint(4) NOT NULL COMMENT '角色:0-普通用户、1-管理员',
+  `permission` varchar(255) DEFAULT NULL COMMENT '权限:执行器ID列表,多个逗号分割',
+  PRIMARY KEY (`id`),
+  UNIQUE KEY `i_username` (`username`) USING BTREE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+CREATE TABLE `xxl_job_lock` (
+  `lock_name` varchar(50) NOT NULL COMMENT '锁名称',
+  PRIMARY KEY (`lock_name`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+
+INSERT INTO `xxl_job_group`(`id`, `app_name`, `title`, `order`, `address_type`, `address_list`) VALUES (1, 'xxl-job-executor-sample', '示例执行器', 1, 0, NULL);
+INSERT INTO `xxl_job_info`(`id`, `job_group`, `job_cron`, `job_desc`, `add_time`, `update_time`, `author`, `alarm_email`, `executor_route_strategy`, `executor_handler`, `executor_param`, `executor_block_strategy`, `executor_timeout`, `executor_fail_retry_count`, `glue_type`, `glue_source`, `glue_remark`, `glue_updatetime`, `child_jobid`) VALUES (1, 1, '0 0 0 * * ? *', '测试任务1', '2018-11-03 22:21:31', '2018-11-03 22:21:31', 'XXL', '', 'FIRST', 'demoJobHandler', '', 'SERIAL_EXECUTION', 0, 0, 'BEAN', '', 'GLUE代码初始化', '2018-11-03 22:21:31', '');
+INSERT INTO `xxl_job_user`(`id`, `username`, `password`, `role`, `permission`) VALUES (1, 'admin', 'e10adc3949ba59abbe56e057f20f883e', 1, NULL);
+INSERT INTO `xxl_job_lock` ( `lock_name`) VALUES ( 'schedule_lock');
+
+commit;
+

+ 16 - 0
build-cloud/src/main/java/Test.java

@@ -0,0 +1,16 @@
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+
+/**
+ * @author zrd
+ * @version 1.0
+ * @date 2020/12/15 16:09
+ */
+public class Test {
+    public static void main(String[] args) {
+        String couponseSeq = "E260";
+        String ss = "{order_no:1,count:30}";
+        JSONObject json = JSONUtil.parseObj(ss);
+        System.out.println(json.get("order_no"));
+    }
+}

+ 97 - 0
build-cloud/src/main/resources/assembly.xml

@@ -0,0 +1,97 @@
+<assembly>
+    <!--这里的id很重要,一定要与maven-assembly-plugin.executions.execution.id保持一致,否则不生效-->
+    <id>assembly</id>
+
+    <!--打包格式,支持dir:文件夹,zip:压缩包,tar.gz:压缩包-->
+    <formats>
+        <format>dir</format>
+        <format>zip</format>
+    </formats>
+
+    <!--是否包含根目录-->
+    <includeBaseDirectory>false</includeBaseDirectory>
+
+    <!--这里打包某些外部依赖的jar包-->
+    <fileSets>
+        <fileSet>
+            <directory>../dependcy</directory>
+            <outputDirectory>./</outputDirectory>
+            <includes>
+                <include>*.*</include>
+            </includes>
+            <fileMode>0644</fileMode>
+        </fileSet>
+
+        <!--这里将target输出到根目录-->
+        <fileSet>
+            <directory>target</directory>
+            <outputDirectory>./</outputDirectory>
+            <includes>
+                <include>*.jar</include>
+            </includes>
+            <fileMode>0755</fileMode>
+        </fileSet>
+
+        <!--这里打包一些启动、关闭的shell脚本-->
+        <fileSet>
+            <directory>bin</directory>
+            <outputDirectory>./bin</outputDirectory>
+            <includes>
+                <include>*.*</include>
+            </includes>
+            <fileMode>0755</fileMode>
+        </fileSet>
+        <!--这里打包一些启动、关闭的sql脚本-->
+        <fileSet>
+            <directory>sql</directory>
+            <outputDirectory>./sql</outputDirectory>
+            <includes>
+                <include>*.*</include>
+            </includes>
+            <fileMode>0755</fileMode>
+        </fileSet>
+        <!--这里docker有关的脚本-->
+        <fileSet>
+            <directory>docker</directory>
+            <outputDirectory>./docker</outputDirectory>
+            <fileMode>0755</fileMode>
+        </fileSet>
+        <fileSet>
+            <directory>vue</directory>
+            <outputDirectory>./vue</outputDirectory>
+            <fileMode>0755</fileMode>
+        </fileSet>
+        <fileSet>
+            <directory>config</directory>
+            <outputDirectory>./config</outputDirectory>
+            <fileMode>0755</fileMode>
+        </fileSet>
+        <fileSet>
+            <directory>dockercompose</directory>
+            <outputDirectory>./</outputDirectory>
+            <includes>
+                <include>*.*</include>
+            </includes>
+            <fileMode>0755</fileMode>
+        </fileSet>
+        <!--这里打包特定目录下的文件,比如多环境支持的目录通过profile来实现不同环境下打包不同配置文件-->
+        <fileSet>
+            <directory>src/main/resources/${package.environment}/</directory>
+            <outputDirectory>./</outputDirectory>
+            <includes>
+                <include>application.properties</include>
+            </includes>
+            <fileMode>0644</fileMode>
+        </fileSet>
+    </fileSets>
+
+    <!--这里将项目依赖包全部输出到lib文件夹中-->
+    <dependencySets>
+        <dependencySet>
+            <outputDirectory>docker/lib</outputDirectory>
+            <includes>
+                <include>com.ruoyi:*</include>
+            </includes>
+        </dependencySet>
+    </dependencySets>
+</assembly>

+ 4 - 0
build-cloud/vue/Dockerfile

@@ -0,0 +1,4 @@
+FROM nginx
+  
+COPY prodist /usr/share/nginx/html/
+COPY default.conf /etc/nginx/conf.d/default.conf

+ 64 - 0
build-cloud/vue/default.conf

@@ -0,0 +1,64 @@
+server {
+
+listen 80;
+
+server_name localhost;
+
+
+
+#charset koi8-r;
+
+access_log /var/log/nginx/host.access.log main;
+
+error_log /var/log/nginx/error.log error;
+
+
+
+location / {
+
+root /usr/share/nginx/html;
+
+index index.html index.htm;
+
+try_files $uri $uri/ /index.html;
+
+}
+
+
+
+
+ 
+
+    location /admin-api/ { ## 后端项目 - 管理后台
+        proxy_pass http://119.29.146.254:48080/admin-api/; ## 重要!!!proxy_pass 需要设置为后端项目所在服务器的 IP
+        proxy_set_header Host $http_host;
+        proxy_set_header X-Real-IP $remote_addr;
+        proxy_set_header REMOTE-HOST $remote_addr;
+        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+    }
+
+    location /app-api/ { ## 后端项目 - 用户 App
+        proxy_pass http://119.29.146.254:48080/app-api/; ## 重要!!!proxy_pass 需要设置为后端项目所在服务器的 IP
+        proxy_set_header Host $http_host;
+        proxy_set_header X-Real-IP $remote_addr;
+        proxy_set_header REMOTE-HOST $remote_addr;
+        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+    }
+
+#error_page 404 /404.html;
+
+
+
+# redirect server error pages to the static page /50x.html
+
+#
+
+error_page 500 502 503 504 /50x.html;
+
+location = /50x.html {
+
+root /usr/share/nginx/html;
+
+}
+
+}

+ 23 - 7
pom.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
     <groupId>cn.iocoder.boot</groupId>
@@ -15,12 +15,14 @@
         <!-- 各种 module 拓展 -->
         <module>yudao-module-system</module>
         <module>yudao-module-infra</module>
-<!--        <module>yudao-module-member</module>-->
+        <module>yudao-module-game</module>
+
+        <module>yudao-module-member</module>
 <!--        <module>yudao-module-bpm</module>-->
 <!--        <module>yudao-module-report</module>-->
 <!--        <module>yudao-module-mp</module>-->
-<!--        <module>yudao-module-pay</module>-->
-<!--        <module>yudao-module-mall</module>-->
+        <module>yudao-module-pay</module>
+        <module>yudao-module-mall</module>
 <!--        <module>yudao-module-crm</module>-->
 <!--        <module>yudao-module-erp</module>-->
 <!--        <module>yudao-module-ai</module>-->
@@ -32,7 +34,7 @@
     <url>https://github.com/YunaiV/ruoyi-vue-pro</url>
 
     <properties>
-        <revision>2.4.1-SNAPSHOT</revision>
+        <revision>2.4.1-RELEASE</revision>
         <!-- Maven 相关 -->
         <java.version>17</java.version>
         <maven.compiler.source>${java.version}</maven.compiler.source>
@@ -134,9 +136,22 @@
                     </execution>
                 </executions>
             </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-deploy-plugin</artifactId>
+            </plugin>
         </plugins>
     </build>
-
+    <distributionManagement>
+        <repository>
+            <id>maven-snapshots</id>
+            <url>http://119.29.146.254:8081/repository/maven-snapshots/</url>
+        </repository>
+        <snapshotRepository>
+            <id>maven-releases</id>
+            <url>http://119.29.146.254:8081/repository/maven-releases/</url>
+        </snapshotRepository>
+    </distributionManagement>
     <!-- 使用 huawei / aliyun 的 Maven 源,提升下载速度 -->
     <repositories>
         <repository>
@@ -168,4 +183,5 @@
         </repository>
     </repositories>
 
+
 </project>

+ 8 - 3
yudao-dependencies/pom.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
 
@@ -14,7 +14,7 @@
     <url>https://github.com/YunaiV/ruoyi-vue-pro</url>
 
     <properties>
-        <revision>2.4.1-SNAPSHOT</revision>
+        <revision>2.4.1-RELEASE</revision>
         <flatten-maven-plugin.version>1.6.0</flatten-maven-plugin.version>
         <!-- 统一依赖管理 -->
         <spring.boot.version>3.4.1</spring.boot.version>
@@ -666,6 +666,11 @@
                     </execution>
                 </executions>
             </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-deploy-plugin</artifactId>
+            </plugin>
+
         </plugins>
     </build>
 

+ 2 - 2
yudao-framework/pom.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
     <parent>

+ 2 - 2
yudao-framework/yudao-common/pom.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
         <groupId>cn.iocoder.boot</groupId>

+ 2 - 2
yudao-framework/yudao-spring-boot-starter-biz-data-permission/pom.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
         <artifactId>yudao-framework</artifactId>

+ 2 - 2
yudao-framework/yudao-spring-boot-starter-biz-ip/pom.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
         <artifactId>yudao-framework</artifactId>

+ 2 - 2
yudao-framework/yudao-spring-boot-starter-biz-tenant/pom.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
         <artifactId>yudao-framework</artifactId>

+ 2 - 2
yudao-framework/yudao-spring-boot-starter-excel/pom.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
         <groupId>cn.iocoder.boot</groupId>

+ 2 - 2
yudao-framework/yudao-spring-boot-starter-job/pom.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
         <groupId>cn.iocoder.boot</groupId>

+ 2 - 2
yudao-framework/yudao-spring-boot-starter-monitor/pom.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
         <groupId>cn.iocoder.boot</groupId>

+ 2 - 2
yudao-framework/yudao-spring-boot-starter-mq/pom.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
         <groupId>cn.iocoder.boot</groupId>

+ 2 - 2
yudao-framework/yudao-spring-boot-starter-mybatis/pom.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
         <groupId>cn.iocoder.boot</groupId>

+ 2 - 2
yudao-framework/yudao-spring-boot-starter-protection/pom.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
         <groupId>cn.iocoder.boot</groupId>

+ 2 - 2
yudao-framework/yudao-spring-boot-starter-redis/pom.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
         <groupId>cn.iocoder.boot</groupId>

+ 2 - 2
yudao-framework/yudao-spring-boot-starter-security/pom.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
         <groupId>cn.iocoder.boot</groupId>

+ 2 - 2
yudao-framework/yudao-spring-boot-starter-test/pom.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
         <groupId>cn.iocoder.boot</groupId>

+ 2 - 2
yudao-framework/yudao-spring-boot-starter-web/pom.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
         <groupId>cn.iocoder.boot</groupId>

+ 9 - 5
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/banner/core/BannerApplicationRunner.java

@@ -15,7 +15,11 @@ import java.util.concurrent.TimeUnit;
  */
 @Slf4j
 public class BannerApplicationRunner implements ApplicationRunner {
-
+    
+    private static boolean isNotPresent(String className) {
+        return !ClassUtils.isPresent(className, ClassUtils.getDefaultClassLoader());
+    }
+    
     @Override
     public void run(ApplicationArguments args) {
         ThreadUtil.execute(() -> {
@@ -34,6 +38,10 @@ public class BannerApplicationRunner implements ApplicationRunner {
             if (isNotPresent("cn.iocoder.yudao.module.report.framework.security.config.SecurityConfiguration")) {
                 System.out.println("[报表模块 yudao-module-report - 已禁用][参考 https://doc.iocoder.cn/report/ 开启]");
             }
+            // 游戏
+            if (isNotPresent("cn.iocoder.yudao.module.game.framework.security.config.GameWebConfiguration")) {
+                System.out.println("[游戏 yudao-module-game - 已禁用][参考 https://doc.iocoder.cn/report/ 开启]");
+            }
             // 工作流
             if (isNotPresent("cn.iocoder.yudao.module.bpm.framework.flowable.config.BpmFlowableConfiguration")) {
                 System.out.println("[工作流模块 yudao-module-bpm - 已禁用][参考 https://doc.iocoder.cn/bpm/ 开启]");
@@ -69,8 +77,4 @@ public class BannerApplicationRunner implements ApplicationRunner {
         });
     }
 
-    private static boolean isNotPresent(String className) {
-        return !ClassUtils.isPresent(className, ClassUtils.getDefaultClassLoader());
-    }
-
 }

+ 2 - 2
yudao-framework/yudao-spring-boot-starter-websocket/pom.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
         <groupId>cn.iocoder.boot</groupId>

+ 2 - 2
yudao-module-ai/pom.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
         <groupId>cn.iocoder.boot</groupId>

+ 2 - 2
yudao-module-ai/yudao-module-ai-api/pom.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
         <groupId>cn.iocoder.boot</groupId>

+ 2 - 2
yudao-module-ai/yudao-module-ai-biz/pom.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
         <groupId>cn.iocoder.boot</groupId>

+ 2 - 2
yudao-module-ai/yudao-spring-boot-starter-ai/pom.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
         <groupId>cn.iocoder.boot</groupId>

+ 2 - 2
yudao-module-bpm/pom.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
         <artifactId>yudao</artifactId>

+ 2 - 2
yudao-module-bpm/yudao-module-bpm-api/pom.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
         <groupId>cn.iocoder.boot</groupId>

+ 2 - 2
yudao-module-bpm/yudao-module-bpm-biz/pom.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
         <groupId>cn.iocoder.boot</groupId>

+ 2 - 2
yudao-module-crm/pom.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
         <groupId>cn.iocoder.boot</groupId>

+ 2 - 2
yudao-module-crm/yudao-module-crm-api/pom.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
         <groupId>cn.iocoder.boot</groupId>

+ 2 - 2
yudao-module-erp/pom.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
         <groupId>cn.iocoder.boot</groupId>

+ 2 - 2
yudao-module-erp/yudao-module-erp-api/pom.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
         <groupId>cn.iocoder.boot</groupId>

+ 2 - 2
yudao-module-erp/yudao-module-erp-biz/pom.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
         <groupId>cn.iocoder.boot</groupId>

+ 23 - 0
yudao-module-game/pom.xml

@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <groupId>cn.iocoder.boot</groupId>
+        <artifactId>yudao</artifactId>
+        <version>${revision}</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+    <modules>
+        <module>yudao-module-game-api</module>
+        <module>yudao-module-game-biz</module>
+    </modules>
+    <artifactId>yudao-module-game</artifactId>
+    <packaging>pom</packaging>
+
+    <name>${project.artifactId}</name>
+    <description>
+        game 模块,主要实现数据可视化报表等功能。
+    </description>
+
+</project>

+ 26 - 0
yudao-module-game/yudao-module-game-api/pom.xml

@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <groupId>cn.iocoder.boot</groupId>
+        <artifactId>yudao-module-game</artifactId>
+        <version>${revision}</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>yudao-module-game-api</artifactId>
+    <packaging>jar</packaging>
+
+    <name>${project.artifactId}</name>
+    <description>
+        game 模块 API,暴露给其它模块调用
+    </description>
+
+    <dependencies>
+        <dependency>
+            <groupId>cn.iocoder.boot</groupId>
+            <artifactId>yudao-common</artifactId>
+        </dependency>
+    </dependencies>
+</project>

+ 4 - 0
yudao-module-game/yudao-module-game-api/src/main/java/cn/iocoder/yudao/module/game/api/package-info.java

@@ -0,0 +1,4 @@
+/**
+ * 占位,避免 api 目录无文件时,git 无法提交
+ */
+package cn.iocoder.yudao.module.game.api;

+ 15 - 0
yudao-module-game/yudao-module-game-api/src/main/java/cn/iocoder/yudao/module/game/enums/ErrorCodeConstants.java

@@ -0,0 +1,15 @@
+package cn.iocoder.yudao.module.game.enums;
+
+import cn.iocoder.yudao.framework.common.exception.ErrorCode;
+
+/**
+ * Game 错误码枚举类
+ * <p>
+ * game 系统,使用 1-003-000-000 段
+ */
+public interface ErrorCodeConstants {
+    
+    // ========== GoView 模块 1-003-000-000 ==========
+    ErrorCode GO_VIEW_PROJECT_NOT_EXISTS = new ErrorCode(1_003_000_000, "GoView 项目不存在");
+    ErrorCode CHARACTER_INFO_NOT_EXISTS = new ErrorCode(1_003_000_001, "游戏角色信息不存在");
+}

+ 73 - 0
yudao-module-game/yudao-module-game-biz/pom.xml

@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <groupId>cn.iocoder.boot</groupId>
+        <artifactId>yudao-module-game</artifactId>
+        <version>${revision}</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>yudao-module-game-biz</artifactId>
+    <packaging>jar</packaging>
+
+    <name>${project.artifactId}</name>
+    <description>
+        game 模块,主要实现数据可视化报表等功能:
+        1. 基于「积木报表」实现,打印设计、报表设计、图形设计、大屏设计等。
+    </description>
+    <dependencies>
+        <dependency>
+            <groupId>cn.iocoder.boot</groupId>
+            <artifactId>yudao-module-game-api</artifactId>
+            <version>${revision}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>cn.iocoder.boot</groupId>
+            <artifactId>yudao-module-system-api</artifactId>
+            <version>${revision}</version>
+        </dependency>
+
+        <!-- 业务组件 -->
+        <dependency>
+            <groupId>cn.iocoder.boot</groupId>
+            <artifactId>yudao-spring-boot-starter-biz-tenant</artifactId>
+        </dependency>
+
+        <!-- Web 相关 -->
+        <dependency>
+            <groupId>cn.iocoder.boot</groupId>
+            <artifactId>yudao-spring-boot-starter-web</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>cn.iocoder.boot</groupId>
+            <artifactId>yudao-spring-boot-starter-security</artifactId>
+        </dependency>
+
+        <!-- DB 相关 -->
+        <dependency>
+            <groupId>cn.iocoder.boot</groupId>
+            <artifactId>yudao-spring-boot-starter-mybatis</artifactId>
+        </dependency>
+
+        <!-- Test 测试相关 -->
+        <dependency>
+            <groupId>cn.iocoder.boot</groupId>
+            <artifactId>yudao-spring-boot-starter-test</artifactId>
+        </dependency>
+
+
+        <dependency>
+            <groupId>cn.iocoder.boot</groupId>
+            <artifactId>yudao-spring-boot-starter-excel</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+        </dependency>
+    </dependencies>
+</project>

+ 83 - 0
yudao-module-game/yudao-module-game-biz/src/main/java/cn/iocoder/yudao/module/game/adpter/DiftUtils.java

@@ -0,0 +1,83 @@
+package cn.iocoder.yudao.module.game.adpter;
+
+import cn.hutool.core.convert.Convert;
+import cn.hutool.http.HttpRequest;
+import cn.hutool.http.HttpResponse;
+import cn.hutool.json.JSONObject;
+import com.alibaba.fastjson.JSON;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class DiftUtils {
+    
+    /**
+     * @param file 文件
+     * @return {@link DifyResponse }
+     */
+    public static DifyResponse getDifyResponse(FileResp file, String user) {
+        DifyResponse difyResponse = new DifyResponse();
+        // 接口地址
+        String url = "http://119.29.146.254:8080/v1/workflows/run";
+        // 替换为你的实际 API Key
+        String apiKey = "app-1LPvO0vSSSnrGAh5cyKHZkAW";
+        
+        
+        // 创建一个 ObjectMapper 实例,用于处理 JSON 转换
+        ObjectMapper objectMapper = new ObjectMapper();
+        
+        // 创建内层的 Map 表示 "{variable_name}" 的值
+        Map<String, Object> variableValue = new HashMap<>();
+        variableValue.put("transfer_method", "local_file");
+        variableValue.put("upload_file_id", file.getId());
+        variableValue.put("type", "image");
+        List<Map<String, Object>> list = List.of(variableValue);
+        // 创建 inputs 的 Map
+        Map<String, Object> inputs = new HashMap<>();
+        inputs.put("images", list);
+        // 构建请求体
+        JSONObject requestBody = new JSONObject();
+        requestBody.put("inputs", inputs);
+        requestBody.put("response_mode", "streaming");
+        requestBody.put("user", user);
+        
+        // 发送 POST 请求
+        HttpResponse response = HttpRequest.post(url)
+                .header("Authorization", "Bearer " + apiKey)
+                .header("Content-Type", "application/json")
+                .body(requestBody.toString())
+                .execute();
+        
+        
+        // 处理响应
+        if (response.isOk()) {
+            // Hutool工具示例
+            String decodedBody = Convert.unicodeToStr(response.body());
+            
+            // 使用 \n\n 分割字符串
+            String[] parts = decodedBody.split("\n\n");
+            
+            // 取最后一条内容
+            String lastPart = parts[parts.length - 1];
+            
+            System.out.println("请求成功,响应内容:");
+            System.out.println(lastPart);
+            // 去除"data: "前缀
+            String jsonStr = lastPart.substring(6);
+            
+            // 转换为DifyResponse实体
+            difyResponse = JSON.parseObject(jsonStr, DifyResponse.class);
+            System.out.println(difyResponse.getData().getOutputs().getText());
+        } else {
+            System.out.println("请求失败,状态码:" + response.getStatus());
+            System.out.println("错误信息:" + response.body());
+        }
+        return difyResponse;
+    }
+    
+    public static void main(String[] args) {
+        
+    }
+}

+ 67 - 0
yudao-module-game/yudao-module-game-biz/src/main/java/cn/iocoder/yudao/module/game/adpter/DifyFilesUtils.java

@@ -0,0 +1,67 @@
+package cn.iocoder.yudao.module.game.adpter;
+
+import cn.hutool.http.HttpRequest;
+import cn.hutool.http.HttpResponse;
+import com.alibaba.fastjson.JSON;
+
+import java.io.File;
+
+
+/**
+ * dify文件utils
+ *
+ * @author Administrator
+ * @date 2025/03/12
+ */
+public class DifyFilesUtils {
+    
+    
+    /**
+     * 上传文件
+     *
+     * @param file 文件
+     * @param user 用户
+     * @return {@link FileResp }
+     */
+    public static FileResp uploadFile(File file, String user) {
+        FileResp fileResp = new FileResp();
+        // 接口地址
+        String url = "http://119.29.146.254:8080/v1/files/upload";
+        // 替换为你的实际 API Key
+        String apiKey = "app-1LPvO0vSSSnrGAh5cyKHZkAW";
+        
+        
+        // 发送 POST 请求进行文件上传
+        HttpResponse response = HttpRequest.post(url)
+                .header("Authorization", "Bearer " + apiKey)
+                .form("file", file)
+                .form("user", user)
+                .execute();
+        
+        // 处理响应
+        if (response.isOk()) {
+            System.out.println("文件上传成功,响应内容:");
+            System.out.println(response.body());
+            fileResp = JSON.parseObject(response.body(), FileResp.class);
+            ;
+        } else {
+            System.out.println("文件上传失败,状态码:" + response.getStatus());
+            System.out.println("错误信息:" + response.body());
+        }
+        return fileResp;
+    }
+    
+    public static void main(String[] args) {
+        // 本地文件路径,替换为实际的文件路径
+        String localFilePath = "G:\\1111.jpg";
+        // 用户标识
+        String user = "abc-123";
+        
+        // 创建文件对象
+        File file = new File(localFilePath);
+        FileResp fileResp = uploadFile(file, user);
+        System.out.println(fileResp);
+        DifyResponse difyResponse = DiftUtils.getDifyResponse(fileResp, user);
+        System.out.println(difyResponse);
+    }
+}

+ 184 - 0
yudao-module-game/yudao-module-game-biz/src/main/java/cn/iocoder/yudao/module/game/adpter/DifyResponse.java

@@ -0,0 +1,184 @@
+package cn.iocoder.yudao.module.game.adpter;
+
+import java.util.List;
+
+public class DifyResponse {
+    
+    /**
+     * event : workflow_finished
+     * workflow_run_id : bad54afd-3650-4b24-86e6-c625fcc600cb
+     * task_id : 15712ca3-3350-4cd7-a0ad-c1d53350c9a5
+     * data : {"id":"bad54afd-3650-4b24-86e6-c625fcc600cb","workflow_id":"26b654ed-c5eb-498a-8f28-c303dcf3349b",
+     * "sequence_number":24,"status":"succeeded","outputs":{"text":"INSERT INTO `ruoyi-vue-pro`.`game_character_info`
+     * (player_name, level, combat_power, profession) VALUES('小杰', '8转216级', 40261, '道士'),('小沐沐', '8转200级', 30111,
+     * '法师'),('天命', '8转199级', 30384, '道士'),('司令', '8转197级', 24999, '法师'),('祖承泽', '7转185级', 21333, '法师'),('tx小道',
+     * '7转168级', 6792, '道士'),('S5563.神经侠侣', '8转188级', 21368, '法师'),('天~虎', '8转196级', 23122, '法师'),('王者', '7转174级',
+     * 15664, '战士'),('平凡爱人', '7转179级', 12249, '法师'),('没穿内裤', '8转225级', 49935, '法师'),('S5596.蜡笔小新', '8转187级', 22172,
+     * '法师'),('S5576.太阳的心', '7转183级', 19011, '法师');"},"error":null,"elapsed_time":16.629782980307937,
+     * "total_tokens":1773,"total_steps":4,"created_by":{"id":"8e1c763e-5dd2-4ccb-a633-eee77b10f9e9","user":"abc-123"
+     * },"created_at":1741768563,"finished_at":1741768580,"exceptions_count":0,"files":[]}
+     */
+    
+    private String event;
+    private String workflow_run_id;
+    private String task_id;
+    private DataBean data;
+    
+    // {"event": "workflow_finished", "workflow_run_id": "bad54afd-3650-4b24-86e6-c625fcc600cb", "task_id":
+    // "15712ca3-3350-4cd7-a0ad-c1d53350c9a5", "data": {"id": "bad54afd-3650-4b24-86e6-c625fcc600cb", "workflow_id":
+    // "26b654ed-c5eb-498a-8f28-c303dcf3349b", "sequence_number": 24, "status": "succeeded", "outputs": {"text":
+    // "INSERT INTO `ruoyi-vue-pro`.`game_character_info` (player_name, level, combat_power, profession) VALUES('小杰',
+    // '8转216级', 40261, '道士'),('小沐沐', '8转200级', 30111, '法师'),('天命', '8转199级', 30384, '道士'),('司令', '8转197级', 24999,
+    // '法师'),('祖承泽', '7转185级', 21333, '法师'),('tx小道', '7转168级', 6792, '道士'),('S5563.神经侠侣', '8转188级', 21368, '法师'),
+    // ('天~虎', '8转196级', 23122, '法师'),('王者', '7转174级', 15664, '战士'),('平凡爱人', '7转179级', 12249, '法师'),('没穿内裤',
+    // '8转225级', 49935, '法师'),('S5596.蜡笔小新', '8转187级', 22172, '法师'),('S5576.太阳的心', '7转183级', 19011, '法师');"},
+    // "error": null, "elapsed_time": 16.629782980307937, "total_tokens": 1773, "total_steps": 4, "created_by":
+    // {"id": "8e1c763e-5dd2-4ccb-a633-eee77b10f9e9", "user": "abc-123"}, "created_at": 1741768563, "finished_at":
+    // 1741768580, "exceptions_count": 0, "files": []}}
+    
+    public String getEvent() {return event;}
+    
+    public void setEvent(String event) {this.event = event;}
+    
+    public String getWorkflow_run_id() {return workflow_run_id;}
+    
+    public void setWorkflow_run_id(String workflow_run_id) {this.workflow_run_id = workflow_run_id;}
+    
+    public String getTask_id() {return task_id;}
+    
+    public void setTask_id(String task_id) {this.task_id = task_id;}
+    
+    public DataBean getData() {return data;}
+    
+    public void setData(DataBean data) {this.data = data;}
+    
+    public static class DataBean {
+        /**
+         * id : bad54afd-3650-4b24-86e6-c625fcc600cb
+         * workflow_id : 26b654ed-c5eb-498a-8f28-c303dcf3349b
+         * sequence_number : 24
+         * status : succeeded
+         * outputs : {"text":"INSERT INTO `ruoyi-vue-pro`.`game_character_info` (player_name, level, combat_power,
+         * profession) VALUES('小杰', '8转216级', 40261, '道士'),('小沐沐', '8转200级', 30111, '法师'),('天命', '8转199级', 30384,
+         * '道士'),('司令', '8转197级', 24999, '法师'),('祖承泽', '7转185级', 21333, '法师'),('tx小道', '7转168级', 6792, '道士'),('S5563
+         * .神经侠侣', '8转188级', 21368, '法师'),('天~虎', '8转196级', 23122, '法师'),('王者', '7转174级', 15664, '战士'),('平凡爱人',
+         * '7转179级', 12249, '法师'),('没穿内裤', '8转225级', 49935, '法师'),('S5596.蜡笔小新', '8转187级', 22172, '法师'),('S5576
+         * .太阳的心', '7转183级', 19011, '法师');"}
+         * error : null
+         * elapsed_time : 16.629782980307937
+         * total_tokens : 1773
+         * total_steps : 4
+         * created_by : {"id":"8e1c763e-5dd2-4ccb-a633-eee77b10f9e9","user":"abc-123"}
+         * created_at : 1741768563
+         * finished_at : 1741768580
+         * exceptions_count : 0
+         * files : []
+         */
+        
+        private String id;
+        private String workflow_id;
+        private int sequence_number;
+        private String status;
+        private OutputsBean outputs;
+        private Object error;
+        private double elapsed_time;
+        private int total_tokens;
+        private int total_steps;
+        private CreatedByBean created_by;
+        private int created_at;
+        private int finished_at;
+        private int exceptions_count;
+        private List<?> files;
+        
+        public String getId() {return id;}
+        
+        public void setId(String id) {this.id = id;}
+        
+        public String getWorkflow_id() {return workflow_id;}
+        
+        public void setWorkflow_id(String workflow_id) {this.workflow_id = workflow_id;}
+        
+        public int getSequence_number() {return sequence_number;}
+        
+        public void setSequence_number(int sequence_number) {this.sequence_number = sequence_number;}
+        
+        public String getStatus() {return status;}
+        
+        public void setStatus(String status) {this.status = status;}
+        
+        public OutputsBean getOutputs() {return outputs;}
+        
+        public void setOutputs(OutputsBean outputs) {this.outputs = outputs;}
+        
+        public Object getError() {return error;}
+        
+        public void setError(Object error) {this.error = error;}
+        
+        public double getElapsed_time() {return elapsed_time;}
+        
+        public void setElapsed_time(double elapsed_time) {this.elapsed_time = elapsed_time;}
+        
+        public int getTotal_tokens() {return total_tokens;}
+        
+        public void setTotal_tokens(int total_tokens) {this.total_tokens = total_tokens;}
+        
+        public int getTotal_steps() {return total_steps;}
+        
+        public void setTotal_steps(int total_steps) {this.total_steps = total_steps;}
+        
+        public CreatedByBean getCreated_by() {return created_by;}
+        
+        public void setCreated_by(CreatedByBean created_by) {this.created_by = created_by;}
+        
+        public int getCreated_at() {return created_at;}
+        
+        public void setCreated_at(int created_at) {this.created_at = created_at;}
+        
+        public int getFinished_at() {return finished_at;}
+        
+        public void setFinished_at(int finished_at) {this.finished_at = finished_at;}
+        
+        public int getExceptions_count() {return exceptions_count;}
+        
+        public void setExceptions_count(int exceptions_count) {this.exceptions_count = exceptions_count;}
+        
+        public List<?> getFiles() {return files;}
+        
+        public void setFiles(List<?> files) {this.files = files;}
+        
+        public static class OutputsBean {
+            /**
+             * text : INSERT INTO `ruoyi-vue-pro`.`game_character_info` (player_name, level, combat_power,
+             * profession) VALUES('小杰', '8转216级', 40261, '道士'),('小沐沐', '8转200级', 30111, '法师'),('天命', '8转199级', 30384,
+             * '道士'),('司令', '8转197级', 24999, '法师'),('祖承泽', '7转185级', 21333, '法师'),('tx小道', '7转168级', 6792, '道士'),
+             * ('S5563.神经侠侣', '8转188级', 21368, '法师'),('天~虎', '8转196级', 23122, '法师'),('王者', '7转174级', 15664, '战士'),
+             * ('平凡爱人', '7转179级', 12249, '法师'),('没穿内裤', '8转225级', 49935, '法师'),('S5596.蜡笔小新', '8转187级', 22172, '法师'),
+             * ('S5576.太阳的心', '7转183级', 19011, '法师');
+             */
+            
+            private String text;
+            
+            public String getText() {return text;}
+            
+            public void setText(String text) {this.text = text;}
+        }
+        
+        public static class CreatedByBean {
+            /**
+             * id : 8e1c763e-5dd2-4ccb-a633-eee77b10f9e9
+             * user : abc-123
+             */
+            
+            private String id;
+            private String user;
+            
+            public String getId() {return id;}
+            
+            public void setId(String id) {this.id = id;}
+            
+            public String getUser() {return user;}
+            
+            public void setUser(String user) {this.user = user;}
+        }
+    }
+}

+ 18 - 0
yudao-module-game/yudao-module-game-biz/src/main/java/cn/iocoder/yudao/module/game/adpter/FileResp.java

@@ -0,0 +1,18 @@
+package cn.iocoder.yudao.module.game.adpter;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@NoArgsConstructor
+@Data
+public class FileResp {
+    
+    
+    private String id;
+    private String name;
+    private int size;
+    private String extension;
+    private String mime_type;
+    private String created_by;
+    private int created_at;
+}

+ 32 - 0
yudao-module-game/yudao-module-game-biz/src/main/java/cn/iocoder/yudao/module/game/adpter/ResUtils.java

@@ -0,0 +1,32 @@
+package cn.iocoder.yudao.module.game.adpter;
+
+import com.alibaba.fastjson.JSON;
+
+public class ResUtils {
+    
+    
+    public static void main(String[] args) {
+// 原始字符串
+        String res = "data: {\"event\": \"workflow_finished\", \"workflow_run_id\": " +
+                "\"bad54afd-3650-4b24-86e6-c625fcc600cb\", \"task_id\": \"15712ca3-3350-4cd7-a0ad-c1d53350c9a5\", " +
+                "\"data\": {\"id\": \"bad54afd-3650-4b24-86e6-c625fcc600cb\", \"workflow_id\": " +
+                "\"26b654ed-c5eb-498a-8f28-c303dcf3349b\", \"sequence_number\": 24, \"status\": \"succeeded\", " +
+                "\"outputs\": {\"text\": \"INSERT INTO ruoyi-vue-pro.game_character_info (player_name, level, " +
+                "combat_power, profession) VALUES('小杰', '8转216级', 40261, '道士'),('小沐沐', '8转200级', 30111, '法师'),('天命', " +
+                "'8转199级', 30384, '道士'),('司令', '8转197级', 24999, '法师'),('祖承泽', '7转185级', 21333, '法师'),('tx小道', " +
+                "'7转168级', 6792, '道士'),('S5563.神经侠侣', '8转188级', 21368, '法师'),('天~虎', '8转196级', 23122, '法师'),('王者', " +
+                "'7转174级', 15664, '战士'),('平凡爱人', '7转179级', 12249, '法师'),('没穿内裤', '8转225级', 49935, '法师'),('S5596" +
+                ".蜡笔小新', '8转187级', 22172, '法师'),('S5576.太阳的心', '7转183级', 19011, '法师');\"}, \"error\": null, " +
+                "\"elapsed_time\": 16.629782980307937, \"total_tokens\": 1773, \"total_steps\": 4, \"created_by\": " +
+                "{\"id\": \"8e1c763e-5dd2-4ccb-a633-eee77b10f9e9\", \"user\": \"abc-123\"}, \"created_at\": " +
+                "1741768563, \"finished_at\": 1741768580, \"exceptions_count\": 0, \"files\": []}}";
+
+// 去除"data: "前缀
+        String jsonStr = res.substring(6);
+
+// 转换为DifyResponse实体
+        DifyResponse difyResponse = JSON.parseObject(jsonStr, DifyResponse.class);
+        System.out.println(difyResponse.getData().getOutputs().getText());
+    }
+    
+}

+ 125 - 0
yudao-module-game/yudao-module-game-biz/src/main/java/cn/iocoder/yudao/module/game/controller/admin/characterinfo/CharacterInfoController.java

@@ -0,0 +1,125 @@
+package cn.iocoder.yudao.module.game.controller.admin.characterinfo;
+
+import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
+import cn.iocoder.yudao.module.game.adpter.DiftUtils;
+import cn.iocoder.yudao.module.game.adpter.DifyFilesUtils;
+import cn.iocoder.yudao.module.game.adpter.DifyResponse;
+import cn.iocoder.yudao.module.game.adpter.FileResp;
+import cn.iocoder.yudao.module.game.controller.admin.characterinfo.vo.CharacterInfoPageReqVO;
+import cn.iocoder.yudao.module.game.controller.admin.characterinfo.vo.CharacterInfoRespVO;
+import cn.iocoder.yudao.module.game.controller.admin.characterinfo.vo.CharacterInfoSaveReqVO;
+import cn.iocoder.yudao.module.game.dal.dataobject.characterinfo.CharacterInfoDO;
+import cn.iocoder.yudao.module.game.service.characterinfo.CharacterInfoService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Parameters;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.Valid;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+import java.util.Objects;
+
+import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
+
+@Tag(name = "管理后台 - 游戏角色信息")
+@RestController
+@RequestMapping("/game/character-info")
+@Validated
+public class CharacterInfoController {
+    
+    @Resource
+    private CharacterInfoService characterInfoService;
+    
+    @PostMapping("/create")
+    @Operation(summary = "创建游戏角色信息")
+    @PreAuthorize("@ss.hasPermission('game:character-info:create')")
+    public CommonResult<Long> createCharacterInfo(@Valid @RequestBody CharacterInfoSaveReqVO createReqVO) {
+        return success(characterInfoService.createCharacterInfo(createReqVO));
+    }
+    
+    @PutMapping("/update")
+    @Operation(summary = "更新游戏角色信息")
+    @PreAuthorize("@ss.hasPermission('game:character-info:update')")
+    public CommonResult<Boolean> updateCharacterInfo(@Valid @RequestBody CharacterInfoSaveReqVO updateReqVO) {
+        characterInfoService.updateCharacterInfo(updateReqVO);
+        return success(true);
+    }
+    
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除游戏角色信息")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('game:character-info:delete')")
+    public CommonResult<Boolean> deleteCharacterInfo(@RequestParam("id") Long id) {
+        characterInfoService.deleteCharacterInfo(id);
+        return success(true);
+    }
+    
+    @GetMapping("/get")
+    @Operation(summary = "获得游戏角色信息")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('game:character-info:query')")
+    public CommonResult<CharacterInfoRespVO> getCharacterInfo(@RequestParam("id") Long id) {
+        CharacterInfoDO characterInfo = characterInfoService.getCharacterInfo(id);
+        return success(BeanUtils.toBean(characterInfo, CharacterInfoRespVO.class));
+    }
+    
+    @GetMapping("/page")
+    @Operation(summary = "获得游戏角色信息分页")
+    @PreAuthorize("@ss.hasPermission('game:character-info:query')")
+    public CommonResult<PageResult<CharacterInfoRespVO>> getCharacterInfoPage(@Valid CharacterInfoPageReqVO pageReqVO) {
+        PageResult<CharacterInfoDO> pageResult = characterInfoService.getCharacterInfoPage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, CharacterInfoRespVO.class));
+    }
+    
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出游戏角色信息 Excel")
+    @PreAuthorize("@ss.hasPermission('game:character-info:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportCharacterInfoExcel(@Valid CharacterInfoPageReqVO pageReqVO,
+                                         HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<CharacterInfoDO> list = characterInfoService.getCharacterInfoPage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "游戏角色信息.xls", "数据", CharacterInfoRespVO.class,
+                BeanUtils.toBean(list, CharacterInfoRespVO.class));
+    }
+    
+    
+    @PostMapping("/import")
+    @Operation(summary = "导入用户")
+    @Parameters({
+            @Parameter(name = "file", description = "Excel 文件", required = true),
+    })
+    @PreAuthorize("@ss.hasPermission('game:character-info:export')")
+    public CommonResult<Boolean> importExcel(@RequestParam("file") MultipartFile mfile
+    ) throws Exception {
+        
+        // 用户标识
+        String user = Objects.requireNonNull(getLoginUserId()).toString();
+        
+        // 创建文件对象
+        File file = File.createTempFile("temp", null);
+        mfile.transferTo(file);
+        FileResp fileResp = DifyFilesUtils.uploadFile(file, user);
+        System.out.println(fileResp);
+        DifyResponse difyResponse = DiftUtils.getDifyResponse(fileResp, user);
+        String req = difyResponse.getData().getOutputs().getText();
+        characterInfoService.bathSave(req);
+        return success(true);
+    }
+}

+ 34 - 0
yudao-module-game/yudao-module-game-biz/src/main/java/cn/iocoder/yudao/module/game/controller/admin/characterinfo/vo/CharacterInfoPageReqVO.java

@@ -0,0 +1,34 @@
+package cn.iocoder.yudao.module.game.controller.admin.characterinfo.vo;
+
+import lombok.*;
+import java.util.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 游戏角色信息分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class CharacterInfoPageReqVO extends PageParam {
+
+    @Schema(description = "玩家名称", example = "张三")
+    private String playerName;
+
+    @Schema(description = "角色等级")
+    private String level;
+
+    @Schema(description = "角色战力")
+    private Integer combatPower;
+
+    @Schema(description = "角色职业")
+    private String profession;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+}

+ 39 - 0
yudao-module-game/yudao-module-game-biz/src/main/java/cn/iocoder/yudao/module/game/controller/admin/characterinfo/vo/CharacterInfoRespVO.java

@@ -0,0 +1,39 @@
+package cn.iocoder.yudao.module.game.controller.admin.characterinfo.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+import com.alibaba.excel.annotation.*;
+
+@Schema(description = "管理后台 - 游戏角色信息 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class CharacterInfoRespVO {
+
+    @Schema(description = "角色 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "24128")
+    @ExcelProperty("角色 ID")
+    private Long id;
+
+    @Schema(description = "玩家名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "张三")
+    @ExcelProperty("玩家名称")
+    private String playerName;
+
+    @Schema(description = "角色等级", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("角色等级")
+    private String level;
+
+    @Schema(description = "角色战力", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("角色战力")
+    private Integer combatPower;
+
+    @Schema(description = "角色职业", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("角色职业")
+    private String profession;
+
+    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+}

+ 31 - 0
yudao-module-game/yudao-module-game-biz/src/main/java/cn/iocoder/yudao/module/game/controller/admin/characterinfo/vo/CharacterInfoSaveReqVO.java

@@ -0,0 +1,31 @@
+package cn.iocoder.yudao.module.game.controller.admin.characterinfo.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import jakarta.validation.constraints.*;
+
+@Schema(description = "管理后台 - 游戏角色信息新增/修改 Request VO")
+@Data
+public class CharacterInfoSaveReqVO {
+
+    @Schema(description = "角色 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "24128")
+    private Long id;
+
+    @Schema(description = "玩家名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "张三")
+    @NotEmpty(message = "玩家名称不能为空")
+    private String playerName;
+
+    @Schema(description = "角色等级", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotEmpty(message = "角色等级不能为空")
+    private String level;
+
+    @Schema(description = "角色战力", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotNull(message = "角色战力不能为空")
+    private Integer combatPower;
+
+    @Schema(description = "角色职业", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotEmpty(message = "角色职业不能为空")
+    private String profession;
+
+}

+ 47 - 0
yudao-module-game/yudao-module-game-biz/src/main/java/cn/iocoder/yudao/module/game/dal/dataobject/characterinfo/CharacterInfoDO.java

@@ -0,0 +1,47 @@
+package cn.iocoder.yudao.module.game.dal.dataobject.characterinfo;
+
+import lombok.*;
+import java.util.*;
+import java.time.LocalDateTime;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.*;
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+
+/**
+ * 游戏角色信息 DO
+ *
+ * @author 芋道源码
+ */
+@TableName("game_character_info")
+@KeySequence("game_character_info_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class CharacterInfoDO extends BaseDO {
+
+    /**
+     * 角色 ID
+     */
+    @TableId
+    private Long id;
+    /**
+     * 玩家名称
+     */
+    private String playerName;
+    /**
+     * 角色等级
+     */
+    private String level;
+    /**
+     * 角色战力
+     */
+    private Integer combatPower;
+    /**
+     * 角色职业
+     */
+    private String profession;
+
+}

+ 29 - 0
yudao-module-game/yudao-module-game-biz/src/main/java/cn/iocoder/yudao/module/game/dal/mysql/characterinfo/CharacterInfoMapper.java

@@ -0,0 +1,29 @@
+package cn.iocoder.yudao.module.game.dal.mysql.characterinfo;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.module.game.controller.admin.characterinfo.vo.CharacterInfoPageReqVO;
+import cn.iocoder.yudao.module.game.dal.dataobject.characterinfo.CharacterInfoDO;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 游戏角色信息 Mapper
+ *
+ * @author 芋道源码
+ */
+@Mapper
+public interface CharacterInfoMapper extends BaseMapperX<CharacterInfoDO> {
+    
+    default PageResult<CharacterInfoDO> selectPage(CharacterInfoPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<CharacterInfoDO>()
+                .likeIfPresent(CharacterInfoDO::getPlayerName, reqVO.getPlayerName())
+                .eqIfPresent(CharacterInfoDO::getLevel, reqVO.getLevel())
+                .eqIfPresent(CharacterInfoDO::getCombatPower, reqVO.getCombatPower())
+                .eqIfPresent(CharacterInfoDO::getProfession, reqVO.getProfession())
+                .betweenIfPresent(CharacterInfoDO::getCreateTime, reqVO.getCreateTime())
+                .orderByDesc(CharacterInfoDO::getId));
+    }
+    
+    void deleteAll();
+}

+ 6 - 0
yudao-module-game/yudao-module-game-biz/src/main/java/cn/iocoder/yudao/module/game/framework/package-info.java

@@ -0,0 +1,6 @@
+/**
+ * 属于 game 模块的 framework 封装
+ *
+ * @author 芋道源码
+ */
+package cn.iocoder.yudao.module.game.framework;

+ 44 - 0
yudao-module-game/yudao-module-game-biz/src/main/java/cn/iocoder/yudao/module/game/framework/security/config/SecurityConfiguration.java

@@ -0,0 +1,44 @@
+package cn.iocoder.yudao.module.game.framework.security.config;
+
+import cn.iocoder.yudao.framework.security.config.AuthorizeRequestsCustomizer;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.configurers.AuthorizeHttpRequestsConfigurer;
+
+/**
+ * Infra 模块的 Security 配置
+ */
+@Configuration(proxyBeanMethods = false, value = "gameSecurityConfiguration")
+public class SecurityConfiguration {
+    
+    @Value("${spring.boot.admin.context-path:''}")
+    private String adminSeverContextPath;
+    
+    @Bean("gameAuthorizeRequestsCustomizer")
+    public AuthorizeRequestsCustomizer authorizeRequestsCustomizer() {
+        return new AuthorizeRequestsCustomizer() {
+            
+            @Override
+            public void customize(AuthorizeHttpRequestsConfigurer<HttpSecurity>.AuthorizationManagerRequestMatcherRegistry registry) {
+                // Swagger 接口文档
+                registry.requestMatchers("/v3/api-docs/**").permitAll()
+                        .requestMatchers("/webjars/**").permitAll()
+                        .requestMatchers("/swagger-ui.html").permitAll()
+                        .requestMatchers("/swagger-ui/**").permitAll();
+                // Spring Boot Actuator 的安全配置
+                registry.requestMatchers("/actuator").permitAll()
+                        .requestMatchers("/actuator/**").permitAll();
+                // Druid 监控
+                registry.requestMatchers("/druid/**").permitAll();
+                // Spring Boot Admin Server 的安全配置
+                registry.requestMatchers(adminSeverContextPath).permitAll()
+                        .requestMatchers(adminSeverContextPath + "/**").permitAll();
+                // 文件读取
+            }
+            
+        };
+    }
+    
+}

+ 4 - 0
yudao-module-game/yudao-module-game-biz/src/main/java/cn/iocoder/yudao/module/game/framework/security/core/package-info.java

@@ -0,0 +1,4 @@
+/**
+ * 占位
+ */
+package cn.iocoder.yudao.module.game.framework.security.core;

+ 24 - 0
yudao-module-game/yudao-module-game-biz/src/main/java/cn/iocoder/yudao/module/game/framework/web/config/GameWebConfiguration.java

@@ -0,0 +1,24 @@
+package cn.iocoder.yudao.module.game.framework.web.config;
+
+import cn.iocoder.yudao.framework.swagger.config.YudaoSwaggerAutoConfiguration;
+import org.springdoc.core.models.GroupedOpenApi;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * game 模块的 web 组件的 Configuration
+ *
+ * @author 芋道源码
+ */
+@Configuration(proxyBeanMethods = false)
+public class GameWebConfiguration {
+    
+    /**
+     * game 模块的 API 分组
+     */
+    @Bean
+    public GroupedOpenApi gameGroupedOpenApi() {
+        return YudaoSwaggerAutoConfiguration.buildGroupedOpenApi("game");
+    }
+    
+}

+ 4 - 0
yudao-module-game/yudao-module-game-biz/src/main/java/cn/iocoder/yudao/module/game/framework/web/package-info.java

@@ -0,0 +1,4 @@
+/**
+ * game 模块的 web 配置
+ */
+package cn.iocoder.yudao.module.game.framework.web;

+ 9 - 0
yudao-module-game/yudao-module-game-biz/src/main/java/cn/iocoder/yudao/module/game/package-info.java

@@ -0,0 +1,9 @@
+/**
+ * game 模块,主要实现数据可视化报表等功能:
+ * 1. 基于「积木报表」实现,打印设计、报表设计、图形设计、大屏设计等。URL 前缀是 /game,表名前缀是 jimu_
+ * <p>
+ * 由于「积木报表」的大屏设计器需要收费,后续会自研,对应的是:
+ * 1. Controller URL:以 /game/ 开头,避免和其它 Module 冲突
+ * 2. DataObject 表名:以 game_ 开头,方便在数据库中区分
+ */
+package cn.iocoder.yudao.module.game;

+ 56 - 0
yudao-module-game/yudao-module-game-biz/src/main/java/cn/iocoder/yudao/module/game/service/characterinfo/CharacterInfoService.java

@@ -0,0 +1,56 @@
+package cn.iocoder.yudao.module.game.service.characterinfo;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.game.controller.admin.characterinfo.vo.CharacterInfoPageReqVO;
+import cn.iocoder.yudao.module.game.controller.admin.characterinfo.vo.CharacterInfoSaveReqVO;
+import cn.iocoder.yudao.module.game.dal.dataobject.characterinfo.CharacterInfoDO;
+import jakarta.validation.Valid;
+
+/**
+ * 游戏角色信息 Service 接口
+ *
+ * @author 芋道源码
+ */
+public interface CharacterInfoService {
+    
+    /**
+     * 创建游戏角色信息
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createCharacterInfo(@Valid CharacterInfoSaveReqVO createReqVO);
+    
+    /**
+     * 更新游戏角色信息
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateCharacterInfo(@Valid CharacterInfoSaveReqVO updateReqVO);
+    
+    /**
+     * 删除游戏角色信息
+     *
+     * @param id 编号
+     */
+    void deleteCharacterInfo(Long id);
+    
+    void bathSave(String resp);
+    
+    /**
+     * 获得游戏角色信息
+     *
+     * @param id 编号
+     * @return 游戏角色信息
+     */
+    CharacterInfoDO getCharacterInfo(Long id);
+    
+    /**
+     * 获得游戏角色信息分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 游戏角色信息分页
+     */
+    PageResult<CharacterInfoDO> getCharacterInfoPage(CharacterInfoPageReqVO pageReqVO);
+    
+}

+ 84 - 0
yudao-module-game/yudao-module-game-biz/src/main/java/cn/iocoder/yudao/module/game/service/characterinfo/CharacterInfoServiceImpl.java

@@ -0,0 +1,84 @@
+package cn.iocoder.yudao.module.game.service.characterinfo;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.module.game.controller.admin.characterinfo.vo.CharacterInfoPageReqVO;
+import cn.iocoder.yudao.module.game.controller.admin.characterinfo.vo.CharacterInfoSaveReqVO;
+import cn.iocoder.yudao.module.game.dal.dataobject.characterinfo.CharacterInfoDO;
+import cn.iocoder.yudao.module.game.dal.mysql.characterinfo.CharacterInfoMapper;
+import com.alibaba.fastjson.JSON;
+import jakarta.annotation.Resource;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+import java.util.List;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.module.game.enums.ErrorCodeConstants.CHARACTER_INFO_NOT_EXISTS;
+
+/**
+ * 游戏角色信息 Service 实现类
+ *
+ * @author 芋道源码
+ */
+@Service
+@Validated
+public class CharacterInfoServiceImpl implements CharacterInfoService {
+    
+    @Resource
+    private CharacterInfoMapper characterInfoMapper;
+    
+    @Override
+    public Long createCharacterInfo(CharacterInfoSaveReqVO createReqVO) {
+        // 插入
+        CharacterInfoDO characterInfo = BeanUtils.toBean(createReqVO, CharacterInfoDO.class);
+        characterInfoMapper.insert(characterInfo);
+        // 返回
+        return characterInfo.getId();
+    }
+    
+    @Override
+    public void updateCharacterInfo(CharacterInfoSaveReqVO updateReqVO) {
+        // 校验存在
+        validateCharacterInfoExists(updateReqVO.getId());
+        // 更新
+        CharacterInfoDO updateObj = BeanUtils.toBean(updateReqVO, CharacterInfoDO.class);
+        characterInfoMapper.updateById(updateObj);
+    }
+    
+    @Override
+    public void deleteCharacterInfo(Long id) {
+        // 校验存在
+        validateCharacterInfoExists(id);
+        // 删除
+        characterInfoMapper.deleteById(id);
+    }
+    
+    @Override
+    public void bathSave(String resp) {
+        List<CharacterInfoDO> list = JSON.parseArray(resp, CharacterInfoDO.class);
+        if (CollUtil.isEmpty(list)) {
+            return;
+        }
+        characterInfoMapper.insertBatch(list);
+        characterInfoMapper.deleteAll();
+    }
+    
+    private void validateCharacterInfoExists(Long id) {
+        if (characterInfoMapper.selectById(id) == null) {
+            throw exception(CHARACTER_INFO_NOT_EXISTS);
+        }
+    }
+    
+    @Override
+    public CharacterInfoDO getCharacterInfo(Long id) {
+        return characterInfoMapper.selectById(id);
+    }
+    
+    @Override
+    public PageResult<CharacterInfoDO> getCharacterInfoPage(CharacterInfoPageReqVO pageReqVO) {
+        return characterInfoMapper.selectPage(pageReqVO);
+    }
+    
+}

+ 20 - 0
yudao-module-game/yudao-module-game-biz/src/main/resources/mapper/characterinfo/CharacterInfoMapper.xml

@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.iocoder.yudao.module.game.dal.mysql.characterinfo.CharacterInfoMapper">
+    <!--
+        一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
+        无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
+        代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
+        文档可见:https://www.iocoder.cn/MyBatis/x-plugins/
+     -->
+    <delete id="deleteAll">
+        DELETE
+        t1
+        FROM game_character_info t1
+        JOIN game_character_info t2
+        ON t1.player_name = t2.player_name
+        AND DATE(t1.create_time) = DATE(t2.create_time)
+        AND t1.create_time &lt; t2.create_time
+
+    </delete>
+</mapper>

+ 2 - 2
yudao-module-infra/pom.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
         <groupId>cn.iocoder.boot</groupId>

+ 2 - 2
yudao-module-infra/yudao-module-infra-api/pom.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
         <groupId>cn.iocoder.boot</groupId>

+ 2 - 2
yudao-module-infra/yudao-module-infra-biz/pom.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
         <groupId>cn.iocoder.boot</groupId>

+ 2 - 2
yudao-module-iot/yudao-module-iot-api/pom.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
         <artifactId>yudao-module-iot</artifactId>

+ 2 - 2
yudao-module-iot/yudao-module-iot-biz/pom.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
         <artifactId>yudao-module-iot</artifactId>

+ 2 - 2
yudao-module-mall/pom.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
         <artifactId>yudao</artifactId>

+ 2 - 2
yudao-module-mall/yudao-module-product-api/pom.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
     <parent>

+ 2 - 2
yudao-module-mall/yudao-module-product-biz/pom.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
         <groupId>cn.iocoder.boot</groupId>

+ 2 - 2
yudao-module-mall/yudao-module-promotion-api/pom.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
         <groupId>cn.iocoder.boot</groupId>

+ 2 - 2
yudao-module-mall/yudao-module-promotion-biz/pom.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
         <groupId>cn.iocoder.boot</groupId>

+ 2 - 2
yudao-module-mall/yudao-module-statistics-api/pom.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
         <groupId>cn.iocoder.boot</groupId>

+ 2 - 2
yudao-module-mall/yudao-module-statistics-biz/pom.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
         <groupId>cn.iocoder.boot</groupId>

+ 2 - 2
yudao-module-mall/yudao-module-trade-api/pom.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
         <groupId>cn.iocoder.boot</groupId>

+ 2 - 2
yudao-module-mall/yudao-module-trade-biz/pom.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
         <groupId>cn.iocoder.boot</groupId>

+ 2 - 2
yudao-module-member/pom.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
         <groupId>cn.iocoder.boot</groupId>

+ 2 - 2
yudao-module-member/yudao-module-member-api/pom.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
         <groupId>cn.iocoder.boot</groupId>

+ 2 - 2
yudao-module-member/yudao-module-member-biz/pom.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
         <groupId>cn.iocoder.boot</groupId>

+ 2 - 2
yudao-module-mp/pom.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
         <artifactId>yudao</artifactId>

+ 2 - 2
yudao-module-mp/yudao-module-mp-api/pom.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
         <artifactId>yudao-module-mp</artifactId>

Некоторые файлы не были показаны из-за большого количества измененных файлов