DESKTOP-3Q5PM1M\896986 5 dagar sedan
förälder
incheckning
33e696bb0e

+ 72 - 0
complaint-admin/src/main/resources/application-dev.yml

@@ -0,0 +1,72 @@
+# ==================== 开发环境配置 ====================
+# 激活方式:--spring.profiles.active=dev(默认)
+
+# 数据源配置
+spring:
+    datasource:
+        type: com.alibaba.druid.pool.DruidDataSource
+        driverClassName: dm.jdbc.driver.DmDriver
+        druid:
+            # 主库数据源(开发/测试数据库)
+            master:
+                url: jdbc:dm://39.106.85.55:5236
+                username: COMPLAINT
+                password: Complaint@2026
+            # 从库数据源
+            slave:
+                enabled: false
+                url:
+                username:
+                password:
+            # 初始连接数
+            initialSize: 5
+            # 最小连接池数量
+            minIdle: 10
+            # 最大连接池数量
+            maxActive: 20
+            # 配置获取连接等待超时的时间
+            maxWait: 60000
+            # 配置连接超时时间
+            connectTimeout: 30000
+            # 配置网络超时时间
+            socketTimeout: 60000
+            # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
+            timeBetweenEvictionRunsMillis: 60000
+            # 配置一个连接在池中最小生存的时间,单位是毫秒
+            minEvictableIdleTimeMillis: 300000
+            # 配置一个连接在池中最大生存的时间,单位是毫秒
+            maxEvictableIdleTimeMillis: 900000
+            # 配置检测连接是否有效
+            validationQuery: SELECT 1 FROM DUAL
+            testWhileIdle: true
+            testOnBorrow: false
+            testOnReturn: false
+            webStatFilter:
+                enabled: true
+            statViewServlet:
+                enabled: true
+                allow:
+                url-pattern: /druid/*
+                login-username: ruoyi
+                login-password: 123456
+            filter:
+                stat:
+                    enabled: true
+                    log-slow-sql: true
+                    slow-sql-millis: 1000
+                    merge-sql: false
+                wall:
+                    config:
+                        db-type: dm
+                        multi-statement-allow: true
+
+# 文件上传路径(开发环境Windows)
+ruoyi:
+    profile: D:/complaint/uploadPath
+
+# 日志级别(开发环境debug)
+logging:
+    level:
+        com.ruoyi: debug
+        com.complaint: debug
+        org.springframework: warn

+ 220 - 0
complaint-admin/src/main/resources/application-prod.yml

@@ -0,0 +1,220 @@
+# ==================== 生产环境配置(麒麟V10 + 达梦试用版) ====================
+# 激活方式:--spring.profiles.active=prod
+# ⚠️ 部署前请检查所有标注【必须修改】的配置项
+
+# ==================== 1. 数据源配置 ====================
+spring:
+    datasource:
+        type: com.alibaba.druid.pool.DruidDataSource
+        driverClassName: dm.jdbc.driver.DmDriver
+        druid:
+            # 主库数据源【必须修改:生产数据库地址、账号、密码】
+            master:
+                url: jdbc:dm://39.106.85.55:5236
+                username: COMPLAINT
+                password: Complaint@123
+            # 从库数据源(暂不启用)
+            slave:
+                enabled: false
+                url:
+                username:
+                password:
+            # ========== 达梦试用版连接池保守配置 ==========
+            initialSize: 2
+            minIdle: 3
+            maxActive: 10                    # 【重要】达梦试用版连接数限制,如实际限制更小请调低
+            maxWait: 60000
+            connectTimeout: 30000
+            socketTimeout: 60000
+            timeBetweenEvictionRunsMillis: 60000
+            minEvictableIdleTimeMillis: 300000
+            maxEvictableIdleTimeMillis: 600000
+            validationQuery: SELECT 1 FROM DUAL
+            testWhileIdle: true
+            testOnBorrow: false
+            testOnReturn: false
+            # ========== 连接泄漏回收(防止连接耗尽) ==========
+            removeAbandoned: true
+            removeAbandonedTimeout: 180
+            logAbandoned: true
+            webStatFilter:
+                enabled: true
+            statViewServlet:
+                enabled: true
+                allow: 127.0.0.1              # 【安全】生产环境仅允许本地访问Druid控制台
+                url-pattern: /druid/*
+                login-username: admin          # 【必须修改】Druid控制台用户名
+                login-password: Complaint@2026 # 【必须修改】Druid控制台密码
+            filter:
+                stat:
+                    enabled: true
+                    log-slow-sql: true
+                    slow-sql-millis: 2000
+                    merge-sql: false
+                wall:
+                    config:
+                        db-type: dm
+                        multi-statement-allow: true
+
+    # ==================== 2. Redis配置 ====================
+    data:
+        redis:
+            host: localhost                   # 【必须修改】生产Redis地址
+            port: 6379
+            database: 0
+            password:                          # 【必须修改】生产Redis密码(如有)
+            timeout: 10s
+            lettuce:
+                pool:
+                    min-idle: 0
+                    max-idle: 8
+                    max-active: 8
+                    max-wait: -1ms
+
+    # ==================== 3. 文件上传 ====================
+    servlet:
+        multipart:
+            max-file-size: 10MB
+            max-request-size: 20MB
+
+    # ==================== 4. 关闭Swagger(生产环境建议关闭) ====================
+springdoc:
+    api-docs:
+        path: /v3/api-docs
+        enabled: false                       # 【安全】生产环境关闭API文档
+    swagger-ui:
+        enabled: false
+        path: /swagger-ui.html
+
+# ==================== 5. 文件上传路径 ====================
+ruoyi:
+    profile: /opt/complaint/uploadPath       # 【必须修改】生产环境文件上传目录
+    addressEnabled: false
+    captchaType: math
+
+# ==================== 6. Token配置(安全) ====================
+token:
+    header: Authorization
+    secret: abcdefghijklmnopqrstuvwxyz     # 【必须修改】生产环境Token密钥,必须改成随机长字符串
+    expireTime: 30                           # Token有效期(分钟)
+
+# ==================== 7. 日志配置 ====================
+logging:
+    level:
+        com.ruoyi: info
+        com.complaint: info
+        org.springframework: warn
+
+# ==================== 8. 微信公众号配置 ====================
+# ⚠️ 涉密配置:生产环境建议用外部配置文件覆盖,勿硬编码在jar包中
+wechat:
+    appid: wxc0601b88a9fcfd92              # 【必须修改】公众号AppID
+    secret: c2c6d55737319fad07b713d4890b503  # 【必须修改】公众号AppSecret
+    oauth-redirect: https://你的域名/h5/    # 【必须修改】网页授权回调地址(正式域名)
+    session-ttl-minutes: 120
+
+# ==================== 9. 统一通讯平台(消息推送) ====================
+ums:
+    sms:
+        enabled: true
+        wsdl: https://www.whjyyun.cn/tp_mp/service/SmsService
+        tp-name: jytspt
+        sys-id: mp
+        module-id: sms
+        secret-key-raw: a4tfSrXgg6uTyi66S/OmWFOcU5o=  # 【涉密】短信密钥
+        interface-method: sms
+        operator-unit-id: 4d99b438044d4238bc240b3a15a66bf
+        operator-unit-name: ''
+        send-sys-name: 投诉平台系统
+        send-priority: 2                    # 东软放开业务通知后改为3
+    wechat:
+        enabled: true
+        wsdl: https://www.whjyyun.cn/tp_mp/service/WechatOAService
+        tp-name: jytspt
+        sys-id: mp
+        module-id: wechatOA
+        secret-key-raw: a4tfSrXgg6uTyi66S/OmWFOcU5o=  # 【涉密】公众号密钥
+        interface-method: saveWechatOAInfo
+        templet-id: rPqN-9T5xdnsL8-BhDUOQrMWHIrKs2TI41XnEMSzpdA
+        send-sys-name: 乌海解忧
+        send-priority: 3
+    retry:
+        max-attempts: 3
+        backoff-ms: 1000
+
+# ==================== 10. 东软数据平台(学校/教职工数据同步) ====================
+ds:
+    base-url: https://data.whjyyun.cn/share/dop.odata
+    client-id: 0c585c5ebaae49ae82d40ac2d9e51e75     # 【涉密】东软凭证
+    client-secret: ab84f4e8710442edacf83f0f6801db7f  # 【涉密】东软凭证
+    aes-secret-key: neusofteducationplatform
+    rsa-private-key: ''
+    server-pub-key: ''
+    sync:
+        school-dwlx: 11,21,31,34,36
+        page-size: 100
+        init-on-startup: false
+
+# ==================== 11. 投诉业务配置 ====================
+complaint:
+    token-expire-hours: 72
+    attachment:
+        max-size-mb: 5
+        citizen-max: 5
+        review-max: 3
+    phone-mask: true
+    h5-base-url: https://你的域名/h5/       # 【必须修改】群众端入口域名(生成二维码/推送链接用)
+    demo-data:
+        enabled: false                        # 【重要】生产环境必须关闭演示数据
+    msg-template:
+        sms-new-workorder: '【乌教解忧】{name}您好,{school}有一条新的投诉工单({no}),处置链接:{link}'
+        sms-citizen-closed: '【乌教解忧】您投诉的{school}工单{no}已办结,结论:{conclusion}'
+        sms-citizen-rejected: '【乌教解忧】您投诉的{school}工单{no}已驳回,理由:{reason}'
+        sms-citizen-review-result: '【乌教解忧】您的工单{no}复核结果:{result}'
+        wx-new-workorder: '您有一条新的投诉工单待处理,请及时处置。处置链接:{link}'
+        wx-closed: '您提交的教育投诉已办结,处置结论:{conclusion}'
+        wx-rejected: '您提交的教育投诉已被驳回,理由:{reason}'
+        wx-review-result: '您提交的异议复核已有处理结果:{result}'
+
+# ==================== 12. 防盗链配置 ====================
+referer:
+    enabled: false                           # 【安全】如需要防盗链请开启并配置允许域名
+    allowed-domains: localhost,127.0.0.1,你的域名
+
+# ==================== 13. XSS防护 ====================
+xss:
+    enabled: true
+    excludes: "*,/v2/**,/admin/**,/**/api/**,/test/**,/test2/**,/upload/**,**/static/**"
+    urlPatterns: "/*"
+
+# ==================== 14. Actuator安全配置(修复未授权访问漏洞) ====================
+management:
+    endpoints:
+        enabled-by-default: false          # 【安全】默认关闭所有端点
+        web:
+            exposure:
+                include: health             # 【安全】只暴露health端点
+    endpoint:
+        health:
+            enabled: true
+            show-details: never             # 【安全】health不显示详细信息
+        info:
+            enabled: false
+        env:
+            enabled: false
+        beans:
+            enabled: false
+        configprops:
+            enabled: false
+        heapdump:
+            enabled: false
+        mappings:
+            enabled: false
+        metrics:
+            enabled: false
+        shutdown:
+            enabled: false
+        threaddump:
+            enabled: false
+    server:
+        port: -1                             # 【安全】禁用Actuator独立端口,使用应用端口但受端点控制

+ 5 - 6
complaint-admin/src/main/resources/application.yml

@@ -6,9 +6,8 @@ ruoyi:
   version: 3.9.2
   # 版权年份
   copyrightYear: 2026
-  # 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath)(测试/生产目录切换)
-  #  profile: /home/complaint/uploadPath # 生产环境
-  profile: D:/complaint/uploadPath    # 测试环境
+  # 文件路径(具体路径在 application-dev.yml / application-prod.yml 中配置)
+  # profile: D:/complaint/uploadPath    # 已移至环境配置文件
   # 获取ip地址开关
   addressEnabled: false
   # 验证码类型 math 数字计算 char 字符验证
@@ -33,10 +32,10 @@ server:
       # Tomcat启动初始化的线程数,默认值10
       min-spare: 100
 
-# 日志配置
+# 日志配置(具体级别在 application-dev.yml / application-prod.yml 中配置)
 logging:
   level:
-    com.ruoyi: debug
+    com.ruoyi: info
     org.springframework: warn
 
 # 用户配置
@@ -68,7 +67,7 @@ spring:
     # 国际化资源文件路径
     basename: i18n/messages
   profiles:
-    active: druid
+    active: dev
   # 文件上传
   servlet:
     multipart:

+ 2 - 0
complaint-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java

@@ -104,6 +104,8 @@ public class SecurityConfig
                     // 静态资源,可匿名访问
                     .requestMatchers(HttpMethod.GET, "/", "/*.html", "/**.html", "/**.css", "/**.js", "/profile/**").permitAll()
                     .requestMatchers("/swagger-ui.html", "/v3/api-docs/**", "/swagger-ui/**", "/druid/**").permitAll()
+                    // Actuator端点:生产环境拒绝访问(修复未授权访问漏洞扫描告警)
+                    .requestMatchers("/actuator/**").denyAll()
                     // 除上面外的所有请求全部需要鉴权认证
                     .anyRequest().authenticated();
             })

+ 10 - 1
complaint-workorder/src/main/java/com/complaint/workorder/controller/web/ComplaintController.java

@@ -466,7 +466,16 @@ public class ComplaintController extends BaseController
     public AjaxResult syncSchool()
     {
         unitSyncService.syncAll();
-        return AjaxResult.success("同步任务已执行");
+        return AjaxResult.success("全量同步任务已执行");
+    }
+
+    @PreAuthorize("@ss.hasPermi('complaint:school:sync')")
+    @Log(title = "机构数据每日增量同步", businessType = BusinessType.OTHER)
+    @PostMapping("/school/sync/daily")
+    public AjaxResult syncSchoolDaily()
+    {
+        unitSyncService.syncDaily();
+        return AjaxResult.success("每日增量同步任务已执行");
     }
 
     @PreAuthorize("@ss.hasPermi('complaint:school:sync')")

+ 1 - 1
h5-app/vite.config.js

@@ -4,7 +4,7 @@ import vue from '@vitejs/plugin-vue'
 // 群众端 H5:/h5 路径部署;/api 代理到后端
 export default defineConfig({
   plugins: [vue()],
-  base: '/',
+  base: '/h5/',
   server: {
     port: 11022,
     proxy: {

+ 27 - 1
ruoyi-ui/src/api/complaint/school.js

@@ -1,10 +1,36 @@
 import request from '@/utils/request'
 
-// 查询学校列表
+// 查询学校列表(分页,学校管理页面用)
 export function listSchool(query) {
+  return request({
+    url: '/complaint/school/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询学校选项列表(不分页,下拉框用)
+export function listSchoolOptions(query) {
   return request({
     url: '/complaint/school/options',
     method: 'get',
     params: query
   })
 }
+
+// 手动触发每日增量同步
+export function syncSchoolDaily() {
+  return request({
+    url: '/complaint/school/sync/daily',
+    method: 'post'
+  })
+}
+
+// 查询同步日志列表
+export function listSyncLog(query) {
+  return request({
+    url: '/complaint/sync/log/list',
+    method: 'get',
+    params: query
+  })
+}

+ 2 - 2
ruoyi-ui/src/views/complaint/staff/index.vue

@@ -124,7 +124,7 @@
 import { ref, reactive, onMounted } from 'vue'
 import { UploadFilled } from '@element-plus/icons-vue'
 import { listStaff, getStaff, delStaff, syncStaff, importStaff } from '@/api/complaint/staff'
-import { listSchool } from '@/api/complaint/school'
+import { listSchoolOptions } from '@/api/complaint/school'
 
 const { proxy } = getCurrentInstance()
 
@@ -235,7 +235,7 @@ function handleExport() {
 
 /** 加载学校选项 */
 function loadSchoolOptions() {
-  listSchool().then(response => {
+  listSchoolOptions().then(response => {
     schoolOptions.value = response.data || []
   }).catch(() => {})
 }