Files
FT546MWS/ruoyi-license/CHANGES.md
2026-07-24 08:51:42 +08:00

6.5 KiB

授权码模块集成改动说明

本文档记录引入 ruoyi-license 授权码模块时,对原有项目文件的所有改动(不含 ruoyi-license 模块本身及 SysLicenseController)。


1. 根模块 pom.xml

文件路径: wms/pom.xml

改动内容:

  1. <modules> 中注册 ruoyi-license 子模块:
<modules>
    <module>ruoyi-admin</module>
    <module>ruoyi-framework</module>
    <module>ruoyi-system</module>
    <module>ruoyi-quartz</module>
    <module>ruoyi-generator</module>
    <module>ruoyi-common</module>
    <module>ruoyi-license</module>  <!-- 新增 -->
</modules>
  1. <dependencyManagement> 中声明 ruoyi-license 依赖版本:
<!-- 授权码模块 -->
<dependency>
    <groupId>com.ruoyi</groupId>
    <artifactId>ruoyi-license</artifactId>
    <version>${ruoyi.version}</version>
</dependency>

2. ruoyi-admin/pom.xml

文件路径: wms/ruoyi-admin/pom.xml

改动内容:

引入 ruoyi-license 依赖,使授权拦截器和配置能被 Spring Boot 扫描加载:

<!-- 授权码模块 -->
<dependency>
    <groupId>com.ruoyi</groupId>
    <artifactId>ruoyi-license</artifactId>
</dependency>

3. SecurityConfig.java

文件路径: wms/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java

改动内容:

在 Spring Security 匿名白名单中加入 /system/license/active,允许未登录用户调用激活授权码接口:

// 改动前
requests.antMatchers("/login", "/register", "/captchaImage").permitAll()

// 改动后
requests.antMatchers("/login", "/register", "/captchaImage", "/system/license/active").permitAll()

4. 前端 api/license.js(新建)

文件路径: wms/ui/src/api/license.js

改动内容:

新建文件,封装授权码相关接口:

import request from '@/utils/request'

// 激活授权码(无需登录)
export function activeLicense(licenseCode) {
  return request({
    url: '/system/license/active',
    method: 'post',
    params: { licenseCode }
  })
}

// 查询当前授权信息(需登录)
export function getLicenseInfo() {
  return request({
    url: '/system/license/info',
    method: 'get'
  })
}

5. 登录页 login.vue

文件路径: wms/ui/src/views/login.vue

改动内容:

5.1 模板部分

在登录按钮下方新增"激活授权码"按钮,以及激活弹窗:

<!-- 激活授权码按钮 -->
<el-form-item style="width:100%;">
  <el-button
    size="medium"
    type="warning"
    style="width:100%;"
    @click.native.prevent="openLicenseDialog"
  >激活授权码</el-button>
</el-form-item>

<!-- 激活授权码弹窗 -->
<el-dialog title="激活授权码" :visible.sync="licenseDialogVisible" width="420px" append-to-body>
  <el-input v-model="licenseCode" type="textarea" :rows="4" placeholder="请输入授权码" />
  <span slot="footer">
    <el-button @click="licenseDialogVisible = false">取 消</el-button>
    <el-button type="primary" :loading="licenseLoading" @click="handleActiveLicense">激 活</el-button>
  </span>
</el-dialog>

5.2 Script 部分

新增 import、data 字段和方法:

// 新增 import
import { activeLicense } from "@/api/license"

// 新增 data 字段
licenseDialogVisible: false,
licenseCode: '',
licenseLoading: false

// 新增方法
openLicenseDialog() {
  this.licenseCode = ''
  this.licenseDialogVisible = true
},
handleActiveLicense() {
  if (!this.licenseCode.trim()) {
    this.$message.warning('请输入授权码')
    return
  }
  this.licenseLoading = true
  activeLicense(this.licenseCode.trim()).then(res => {
    if (res.code === 200) {
      this.$message.success(res.msg || '授权码激活成功')
      this.licenseDialogVisible = false
    } else {
      this.$message.error(res.msg || '授权码激活失败')
    }
  }).catch(() => {
    this.$message.error('授权码激活失败')
  }).finally(() => {
    this.licenseLoading = false
  })
}

6. 顶部导航栏 Navbar.vue

文件路径: wms/ui/src/layout/components/Navbar.vue

改动内容:

6.1 模板部分

在 navbar 中间插入授权到期警告条(剩余不足 30 天时显示):

<div v-if="licenseWarning" class="license-warning">
  <i class="el-icon-warning-outline" />
  系统授权将于 {{ licenseExpireText }} 后过期,请及时联系管理员续期
</div>

6.2 Script 部分

// 新增 import
import { getLicenseInfo } from '@/api/license'

// 新增 data 字段
licenseWarning: false,
licenseExpireText: '',
licenseTimer: null

// 新增生命周期钩子
mounted() {
  this.checkLicenseExpire()
  this.licenseTimer = setInterval(() => this.checkLicenseExpire(), 60 * 1000)
},
beforeDestroy() {
  if (this.licenseTimer) clearInterval(this.licenseTimer)
},

// 新增方法
checkLicenseExpire() {
  getLicenseInfo().then(res => {
    if (res.code === 200 && res.data && res.data.expireTime) {
      const expireTime = new Date(res.data.expireTime).getTime()
      const now = Date.now()
      const diffMs = expireTime - now
      const diffDays = Math.ceil(diffMs / (1000 * 60 * 60 * 24))
      if (diffMs > 0 && diffDays <= 30) {
        this.licenseWarning = true
        if (diffMs < 1000 * 60 * 60 * 24) {
          const hours = Math.floor(diffMs / (1000 * 60 * 60))
          const minutes = Math.floor((diffMs % (1000 * 60 * 60)) / (1000 * 60))
          this.licenseExpireText = hours > 0 ? `${hours} 小时 ${minutes} 分钟` : `${minutes} 分钟`
        } else if (diffDays < 7) {
          this.licenseExpireText = diffDays + ' 天'
        } else {
          this.licenseExpireText = Math.ceil(diffDays / 7) + ' 周'
        }
      }
    }
  }).catch(() => {})
}

6.3 样式部分

.license-warning {
  position: absolute;
  left: 50%;
  transform: translateX(-50%);
  top: 0;
  height: 50px;
  line-height: 50px;
  font-size: 13px;
  color: #e6a23c;
  font-weight: 500;
  pointer-events: none;
  i { margin-right: 4px; }
}

改动文件汇总

文件 类型 说明
wms/pom.xml 修改 注册模块 + 声明依赖版本
wms/ruoyi-admin/pom.xml 修改 引入 ruoyi-license 依赖
ruoyi-framework/.../SecurityConfig.java 修改 白名单加入激活授权码接口
ui/src/api/license.js 新建 封装激活和查询授权信息接口
ui/src/views/login.vue 修改 新增激活授权码按钮和弹窗
ui/src/layout/components/Navbar.vue 修改 新增授权到期倒计时警告条