<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>久滴科技 - 开发文档 Blog</title>
        <link>https://docs.jiudi.com/changelog</link>
        <description>久滴科技 - 开发文档 Blog</description>
        <lastBuildDate>Sat, 01 Jun 2024 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>zh-Hans</language>
        <item>
            <title><![CDATA[v3.2.1 版本更新]]></title>
            <link>https://docs.jiudi.com/changelog/2024/06/01/v3.2.1</link>
            <guid>https://docs.jiudi.com/changelog/2024/06/01/v3.2.1</guid>
            <pubDate>Sat, 01 Jun 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[发布日期：2024-06-01]]></description>
            <content:encoded><![CDATA[<p>发布日期：2024-06-01</p>
<p>本次更新主要修复了 v3.2.0 版本中发现的问题，并进行了若干性能优化。</p>
<h2 class="anchor anchorTargetStickyNavbar_O8UO" id="bug-修复">Bug 修复<a href="https://docs.jiudi.com/changelog/2024/06/01/v3.2.1#bug-%E4%BF%AE%E5%A4%8D" class="hash-link" aria-label="Bug 修复的直接链接" title="Bug 修复的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_O8UO" id="认证模块">认证模块<a href="https://docs.jiudi.com/changelog/2024/06/01/v3.2.1#%E8%AE%A4%E8%AF%81%E6%A8%A1%E5%9D%97" class="hash-link" aria-label="认证模块的直接链接" title="认证模块的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>修复微信扫码登录偶现的 Token 重复生成问题</strong>：在高并发场景下，同一用户的扫码回调可能触发多次 Token 生成，导致先前的 Token 失效。现已加入 Redis 分布式锁确保幂等性。</li>
<li class=""><strong>修复 Refresh Token 轮转逻辑异常</strong>：当 Access Token 和 Refresh Token 同时过期时，刷新接口返回 500 错误。现在会正确返回 4010 错误码提示重新登录。</li>
<li class=""><strong>修复开发模式登录的安全校验遗漏</strong>：生产环境下的 <code>/api/auth/dev/login</code> 接口未正确拦截，现已严格校查 Spring Profile。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_O8UO" id="授权模块">授权模块<a href="https://docs.jiudi.com/changelog/2024/06/01/v3.2.1#%E6%8E%88%E6%9D%83%E6%A8%A1%E5%9D%97" class="hash-link" aria-label="授权模块的直接链接" title="授权模块的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>修复授权证书签名偶现乱码</strong>：当授权域名包含中文字符时，签名计算结果不一致。现已统一使用 UTF-8 编码。</li>
<li class=""><strong>修复授权到期检查时区问题</strong>：服务器时区非东八区时，授权到期判断可能提前或延后。现强制使用 <code>Asia/Shanghai</code> 时区。</li>
<li class=""><strong>修复授权列表分页参数越界</strong>：当 <code>page</code> 参数为负数或 <code>size</code> 超过 100 时返回全量数据，现已限制合法范围。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_O8UO" id="前端">前端<a href="https://docs.jiudi.com/changelog/2024/06/01/v3.2.1#%E5%89%8D%E7%AB%AF" class="hash-link" aria-label="前端的直接链接" title="前端的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>修复仪表盘图表数据加载闪烁</strong>：切换日期范围时图表短暂显示旧数据后刷新，现已使用 <code>keep-alive</code> 缓存。</li>
<li class=""><strong>修复侧边栏菜单折叠状态丢失</strong>：页面刷新后侧边栏折叠状态重置，现已持久化到 localStorage。</li>
<li class=""><strong>修复移动端登录页面布局错位</strong>：小屏幕设备上微信二维码超出容器，现已适配响应式布局。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_O8UO" id="性能优化">性能优化<a href="https://docs.jiudi.com/changelog/2024/06/01/v3.2.1#%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96" class="hash-link" aria-label="性能优化的直接链接" title="性�能优化的直接链接" translate="no">​</a></h2>
<ul>
<li class=""><strong>数据库查询优化</strong>：授权列表查询添加复合索引 <code>(user_id, status)</code>，列表加载速度提升 40%</li>
<li class=""><strong>Redis 连接池调优</strong>：调整 Lettuce 连接池参数，减少连接等待时间</li>
<li class=""><strong>前端首屏加载优化</strong>：路由组件懒加载拆分细化，首屏 JS 体积减少 23%</li>
<li class=""><strong>API 响应缓存</strong>：解决方案列表和分类数据增加 Redis 缓存，TTL 5 分钟</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_O8UO" id="升级指南">升级指南<a href="https://docs.jiudi.com/changelog/2024/06/01/v3.2.1#%E5%8D%87%E7%BA%A7%E6%8C%87%E5%8D%97" class="hash-link" aria-label="升级指南的直接链接" title="升级指南的直接链接" translate="no">​</a></h2>
<p>从 v3.2.0 升级到 v3.2.1：</p>
<div class="language-bash codeBlockContainer_Ok5B theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_i9KJ"><pre tabindex="0" class="prism-code language-bash codeBlock_fA72 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_CoyY"><div class="token-line" style="color:#393A34"><span class="token plain"># 拉取最新代码</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">git pull origin main</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">git checkout v3.2.1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 后端升级</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">cd jiudi-server</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">mvn clean package -DskipTests</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 前端升级</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">cd jiudi-admin</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">npm install</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">npm run build</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 数据库更新（如有）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">mysql -u jiudi -p jiudi_platform &lt; sql/upgrade-v3.2.1.sql</span><br></div></code></pre></div></div>
<blockquote>
<p>💡 本次升级无需数据库结构变更，<code>upgrade-v3.2.1.sql</code> 仅包含索引优化脚本。</p>
</blockquote>]]></content:encoded>
            <category>bugfix</category>
            <category>optimization</category>
        </item>
        <item>
            <title><![CDATA[v3.2.0 版本更新]]></title>
            <link>https://docs.jiudi.com/changelog/2024/05/15/v3.2.0</link>
            <guid>https://docs.jiudi.com/changelog/2024/05/15/v3.2.0</guid>
            <pubDate>Wed, 15 May 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[发布日期：2024-05-15]]></description>
            <content:encoded><![CDATA[<p>发布日期：2024-05-15</p>
<p>本次版本更新包含多项新功能和重要改进，是 v3.x 系列的重要里程碑。</p>
<h2 class="anchor anchorTargetStickyNavbar_O8UO" id="新功能">新功能<a href="https://docs.jiudi.com/changelog/2024/05/15/v3.2.0#%E6%96%B0%E5%8A%9F%E8%83%BD" class="hash-link" aria-label="新功能的直接链接" title="新功能的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_O8UO" id="授权证书在线验证">授权证书在线验证<a href="https://docs.jiudi.com/changelog/2024/05/15/v3.2.0#%E6%8E%88%E6%9D%83%E8%AF%81%E4%B9%A6%E5%9C%A8%E7%BA%BF%E9%AA%8C%E8%AF%81" class="hash-link" aria-label="授权证书在线验证的直接链接" title="授权证书在线验证的直接链接" translate="no">​</a></h3>
<p>新增授权证书在线验证接口 <code>GET /api/license/verify</code>，支持：</p>
<ul>
<li class="">授权码合法性验证</li>
<li class="">域名匹配检查</li>
<li class="">有效期校验</li>
<li class="">RSA 签名验证</li>
</ul>
<p>部署在客户服务器上的系统可以定期调用此接口验证授权状态，无需手动检查。</p>
<h3 class="anchor anchorTargetStickyNavbar_O8UO" id="解决方案市场">解决方案市场<a href="https://docs.jiudi.com/changelog/2024/05/15/v3.2.0#%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88%E5%B8%82%E5%9C%BA" class="hash-link" aria-label="解决方案市场的直接链接" title="解决方案市场的直接链接" translate="no">​</a></h3>
<p>全新的解决方案市场功能上线：</p>
<ul>
<li class="">按行业分类浏览解决方案</li>
<li class="">关键词搜索解决方案</li>
<li class="">解决方案详情页展示完整功能介绍</li>
<li class="">支持解决方案标签和推荐标记</li>
</ul>
<p>新增 API 接口：</p>
<ul>
<li class=""><code>GET /api/solution/categories</code> - 获取分类列表</li>
<li class=""><code>GET /api/solution/list</code> - 获取解决方案列表</li>
<li class=""><code>GET /api/solution/{id}</code> - 获取解决方案详情</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_O8UO" id="操作日志审计">操作日志审计<a href="https://docs.jiudi.com/changelog/2024/05/15/v3.2.0#%E6%93%8D%E4%BD%9C%E6%97%A5%E5%BF%97%E5%AE%A1%E8%AE%A1" class="hash-link" aria-label="操作日志审计的直接链接" title="操作日志审计的直接链接" translate="no">​</a></h3>
<p>新增操作日志审计模块：</p>
<ul>
<li class="">记录所有关键业务操作的增删改</li>
<li class="">支持按用户、操作类型、时间范围筛选</li>
<li class="">操作日志保留 180 天</li>
<li class="">支持导出 CSV 格式审计报告</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_O8UO" id="改进项">改进项<a href="https://docs.jiudi.com/changelog/2024/05/15/v3.2.0#%E6%94%B9%E8%BF%9B%E9%A1%B9" class="hash-link" aria-label="改进项的直接链接" title="改进项的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_O8UO" id="认证系统增强">认证系统增强<a href="https://docs.jiudi.com/changelog/2024/05/15/v3.2.0#%E8%AE%A4%E8%AF%81%E7%B3%BB%E7%BB%9F%E5%A2%9E%E5%BC%BA" class="hash-link" aria-label="认证系统增强的直接链接" title="认证系统增强的直接链接" translate="no">​</a></h3>
<ul>
<li class="">Token 刷新机制优化：Refresh Token 支持轮转（Rotation），每次刷新后旧的 Refresh Token 自动失效</li>
<li class="">新增登录设备管理：用户可查看和移除已登录的设备</li>
<li class="">登录安全策略：同一账户最多 5 个活跃会话，超出后最早登录的会话自动下线</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_O8UO" id="后端架构优化">后端架构优化<a href="https://docs.jiudi.com/changelog/2024/05/15/v3.2.0#%E5%90%8E%E7%AB%AF%E6%9E%B6%E6%9E%84%E4%BC%98%E5%8C%96" class="hash-link" aria-label="后端架构优化的直接链接" title="后端架构优化的直接链接" translate="no">​</a></h3>
<ul>
<li class="">统一异常处理完善：新增 <code>BusinessException</code> 和 <code>AuthenticationException</code> 分类处理</li>
<li class="">MyBatis-Plus 逻辑删除支持：所有实体新增 <code>deleted</code> 字段</li>
<li class="">API 响应格式统一：全部接口使用 <code>R&lt;T&gt;</code> 包装响应</li>
<li class="">Knife4j 文档集成：Swagger UI 替换为 Knife4j，支持离线文档导出</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_O8UO" id="前端体验提升">前端体验提升<a href="https://docs.jiudi.com/changelog/2024/05/15/v3.2.0#%E5%89%8D%E7%AB%AF%E4%BD%93%E9%AA%8C%E6%8F%90%E5%8D%87" class="hash-link" aria-label="前端体验提升的直接链接" title="前端体验提升的直接链接" translate="no">​</a></h3>
<ul>
<li class="">全局加载状态优化：接口请求期间显示 Skeleton 骨架屏</li>
<li class="">表格组件增强：支持列设置、行拖拽排序、数据导出</li>
<li class="">主题切换优化：暗色模式配色方案重新设计</li>
<li class="">首页仪表盘数据可视化升级：新增趋势图和实时数据卡片</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_O8UO" id="数据库变更">数据库变更<a href="https://docs.jiudi.com/changelog/2024/05/15/v3.2.0#%E6%95%B0%E6%8D%AE%E5%BA%93%E5%8F%98%E6%9B%B4" class="hash-link" aria-label="数据库变更的直接链接" title="数据库变更的直接链接" translate="no">​</a></h2>
<p>本次更新涉及数据库结构变更，升级时需执行迁移脚本：</p>
<div class="language-sql codeBlockContainer_Ok5B theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_i9KJ"><pre tabindex="0" class="prism-code language-sql codeBlock_fA72 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_CoyY"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">-- 操作日志表</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">CREATE</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">TABLE</span><span class="token plain"> sys_operation_log </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    id </span><span class="token keyword" style="color:#00009f">BIGINT</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">NOT</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">NULL</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">AUTO_INCREMENT</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    user_id </span><span class="token keyword" style="color:#00009f">BIGINT</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">NOT</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">NULL</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    module </span><span class="token keyword" style="color:#00009f">VARCHAR</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">50</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">NOT</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">NULL</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">COMMENT</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'操作模块'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">action</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">VARCHAR</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">50</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">NOT</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">NULL</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">COMMENT</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'操作类型'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    method </span><span class="token keyword" style="color:#00009f">VARCHAR</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">200</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">NOT</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">NULL</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">COMMENT</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'请求方法'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    params </span><span class="token keyword" style="color:#00009f">TEXT</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">COMMENT</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'请求参数'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    ip </span><span class="token keyword" style="color:#00009f">VARCHAR</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">50</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">COMMENT</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'操作IP'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    created_at </span><span class="token keyword" style="color:#00009f">DATETIME</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">NOT</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">NULL</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">DEFAULT</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">CURRENT_TIMESTAMP</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">PRIMARY</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">KEY</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">id</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">KEY</span><span class="token plain"> idx_user_id </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">user_id</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">KEY</span><span class="token plain"> idx_module </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">module</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">KEY</span><span class="token plain"> idx_created_at </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">created_at</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">ENGINE</span><span class="token operator" style="color:#393A34">=</span><span class="token keyword" style="color:#00009f">InnoDB</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">DEFAULT</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">CHARSET</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">utf8mb4 </span><span class="token keyword" style="color:#00009f">COMMENT</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">'操作日志表'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">-- 登录设备表</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">CREATE</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">TABLE</span><span class="token plain"> sys_login_device </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    id </span><span class="token keyword" style="color:#00009f">BIGINT</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">NOT</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">NULL</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">AUTO_INCREMENT</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    user_id </span><span class="token keyword" style="color:#00009f">BIGINT</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">NOT</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">NULL</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    device_id </span><span class="token keyword" style="color:#00009f">VARCHAR</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">100</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">NOT</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">NULL</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    device_name </span><span class="token keyword" style="color:#00009f">VARCHAR</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">100</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    ip </span><span class="token keyword" style="color:#00009f">VARCHAR</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">50</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    last_active_at </span><span class="token keyword" style="color:#00009f">DATETIME</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">NOT</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">NULL</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    refresh_token </span><span class="token keyword" style="color:#00009f">VARCHAR</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">500</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">PRIMARY</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">KEY</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">id</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">UNIQUE</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">KEY</span><span class="token plain"> uk_user_device </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">user_id</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> device_id</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">ENGINE</span><span class="token operator" style="color:#393A34">=</span><span class="token keyword" style="color:#00009f">InnoDB</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">DEFAULT</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">CHARSET</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">utf8mb4 </span><span class="token keyword" style="color:#00009f">COMMENT</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">'登录设备表'</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_O8UO" id="破坏性变更">破坏性变更<a href="https://docs.jiudi.com/changelog/2024/05/15/v3.2.0#%E7%A0%B4%E5%9D%8F%E6%80%A7%E5%8F%98%E6%9B%B4" class="hash-link" aria-label="破坏性变更的直接链接" title="破坏性变更的直接链接" translate="no">​</a></h2>
<ul>
<li class=""><code>POST /api/auth/token/refresh</code> 响应结构新增 <code>refreshToken</code> 字段（Token 轮转）</li>
<li class="">最低 Java 版本要求从 11 提升到 17</li>
<li class="">最低 MySQL 版本要求从 5.7 提升到 8.0</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_O8UO" id="升级指南">升级指南<a href="https://docs.jiudi.com/changelog/2024/05/15/v3.2.0#%E5%8D%87%E7%BA%A7%E6%8C%87%E5%8D%97" class="hash-link" aria-label="升级指南的直接链接" title="升级指南的直接链接" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_Ok5B theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_i9KJ"><pre tabindex="0" class="prism-code language-bash codeBlock_fA72 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_CoyY"><div class="token-line" style="color:#393A34"><span class="token plain"># 1. 备份数据库</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">mysqldump -u root -p jiudi_platform &gt; backup_before_v3.2.0.sql</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 2. 更新代码</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">git pull origin main</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">git checkout v3.2.0</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 3. 执行数据库迁移</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">mysql -u jiudi -p jiudi_platform &lt; sql/upgrade-v3.2.0.sql</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 4. 重新构建部署</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">cd jiudi-server &amp;&amp; mvn clean package -DskipTests</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">cd jiudi-admin &amp;&amp; npm install &amp;&amp; npm run build</span><br></div></code></pre></div></div>]]></content:encoded>
            <category>feature</category>
            <category>improvement</category>
        </item>
        <item>
            <title><![CDATA[v3.1.0 版本更新 - 重大更新]]></title>
            <link>https://docs.jiudi.com/changelog/2024/04/20/v3.1.0</link>
            <guid>https://docs.jiudi.com/changelog/2024/04/20/v3.1.0</guid>
            <pubDate>Sat, 20 Apr 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[发布日期：2024-04-20]]></description>
            <content:encoded><![CDATA[<p>发布日期：2024-04-20</p>
<p>v3.1.0 是久滴科技平台 v3.x 系列的首个正式发布版本，包含全新的架构升级和多项核心功能。本版本相较于 v2.x 系列进行了全面的技术栈升级和架构重构。</p>
<h2 class="anchor anchorTargetStickyNavbar_O8UO" id="架构升级">架构升级<a href="https://docs.jiudi.com/changelog/2024/04/20/v3.1.0#%E6%9E%B6%E6%9E%84%E5%8D%87%E7%BA%A7" class="hash-link" aria-label="架构升级的直接链接" title="架构升级的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_O8UO" id="后端全面升级-spring-boot-3x">后端全面升级 Spring Boot 3.x<a href="https://docs.jiudi.com/changelog/2024/04/20/v3.1.0#%E5%90%8E%E7%AB%AF%E5%85%A8%E9%9D%A2%E5%8D%87%E7%BA%A7-spring-boot-3x" class="hash-link" aria-label="后端全面升级 Spring Boot 3.x的直接链接" title="后端全面升级 Spring Boot 3.x的直接链接" translate="no">​</a></h3>
<p>从 Spring Boot 2.7 升级到 Spring Boot 3.2，主要变化：</p>
<ul>
<li class=""><strong>Java 17 基线</strong>：最低支持 Java 17，利用 Record、Sealed Classes 等新特性</li>
<li class=""><strong>Spring Security 6.x</strong>：安全框架全面升级，使用 Lambda DSL 配置风格</li>
<li class=""><strong>Jakarta EE 命名空间</strong>：从 <code>javax.*</code> 迁移到 <code>jakarta.*</code></li>
<li class=""><strong>原生编译支持</strong>：实验性支持 GraalVM Native Image 编译</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_O8UO" id="前端全面升级-vue-3">前端全面升级 Vue 3<a href="https://docs.jiudi.com/changelog/2024/04/20/v3.1.0#%E5%89%8D%E7%AB%AF%E5%85%A8%E9%9D%A2%E5%8D%87%E7%BA%A7-vue-3" class="hash-link" aria-label="前端全面升级 Vue 3的直接链接" title="前端全面升级 Vue 3的直接链接" translate="no">​</a></h3>
<p>从 Vue 2 + Options API 升级到 Vue 3 + Composition API：</p>
<ul>
<li class=""><strong>Composition API</strong>：全面使用 <code>&lt;script setup&gt;</code> 语法</li>
<li class=""><strong>TypeScript</strong>：100% TypeScript 覆盖，严格模式</li>
<li class=""><strong>Vite 5</strong>：从 Webpack 迁移到 Vite，开发体验显著提升</li>
<li class=""><strong>Pinia</strong>：从 Vuex 迁移到 Pinia 状态管理</li>
<li class=""><strong>Ant Design Vue 4</strong>：升级到最新版组件库</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_O8UO" id="核心新功能">核心新功能<a href="https://docs.jiudi.com/changelog/2024/04/20/v3.1.0#%E6%A0%B8%E5%BF%83%E6%96%B0%E5%8A%9F%E8%83%BD" class="hash-link" aria-label="核心新功能的直接链接" title="核心新功能的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_O8UO" id="微信扫码登录">微信扫码登录<a href="https://docs.jiudi.com/changelog/2024/04/20/v3.1.0#%E5%BE%AE%E4%BF%A1%E6%89%AB%E7%A0%81%E7%99%BB%E5%BD%95" class="hash-link" aria-label="微信扫码登录的直接链接" title="微信扫码登录的直接链接" translate="no">​</a></h3>
<p>全新的无密码认证方案：</p>
<ul>
<li class="">微信开放平台扫码登录</li>
<li class="">二维码动态生成和过期管理</li>
<li class="">轮询检查登录状态</li>
<li class="">JWT 双 Token 认证机制（Access Token + Refresh Token）</li>
<li class="">开发模式模拟登录</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_O8UO" id="rsa-授权管理系统">RSA 授权管理系统<a href="https://docs.jiudi.com/changelog/2024/04/20/v3.1.0#rsa-%E6%8E%88%E6%9D%83%E7%AE%A1%E7%90%86%E7%B3%BB%E7%BB%9F" class="hash-link" aria-label="RSA 授权管理系统的直接链接" title="RSA 授权管理系统的直接链接" translate="no">​</a></h3>
<p>全新的基于 RSA 非对称加密的授权体系：</p>
<ul>
<li class="">授权码自动生成（格式：JD-XXXX-XXXX-XXXX-XXXX）</li>
<li class="">RSA 2048 位私钥签发证书</li>
<li class="">公钥客户端验签</li>
<li class="">支持按域名、时间绑定授权</li>
<li class="">授权类型：standard / professional / enterprise</li>
<li class="">在线授权验证接口</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_O8UO" id="后台管理系统">后台管理系统<a href="https://docs.jiudi.com/changelog/2024/04/20/v3.1.0#%E5%90%8E%E5%8F%B0%E7%AE%A1%E7%90%86%E7%B3%BB%E7%BB%9F" class="hash-link" aria-label="后台管理系统的直接链接" title="后台管理系统的直接链接" translate="no">​</a></h3>
<p>全新的管理后台：</p>
<ul>
<li class="">基于 Ant Design Vue 4 的现代化 UI</li>
<li class="">数据仪表盘（经营数据概览、趋势图表）</li>
<li class="">用户管理（用户列表、角色权限）</li>
<li class="">授权管理（授权申请、列表、证书下载）</li>
<li class="">系统配置（参数管理、字典管理）</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_O8UO" id="技术改进">技术改进<a href="https://docs.jiudi.com/changelog/2024/04/20/v3.1.0#%E6%8A%80%E6%9C%AF%E6%94%B9%E8%BF%9B" class="hash-link" aria-label="技术改进的直接链接" title="技术改进的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_O8UO" id="安全增强">安全增强<a href="https://docs.jiudi.com/changelog/2024/04/20/v3.1.0#%E5%AE%89%E5%85%A8%E5%A2%9E%E5%BC%BA" class="hash-link" aria-label="安全增强的直接链接" title="安全增强的直接链接" translate="no">​</a></h3>
<ul>
<li class="">密码存储升级到 BCrypt（自适应哈希强度 10）</li>
<li class="">CSRF 防护升级为 SameSite Cookie + Token 双重验证</li>
<li class="">XSS 过滤器增强，覆盖所有输入渠道</li>
<li class="">API 接口限流：基于 Redis + 令牌桶算法</li>
<li class="">SQL 注入防护：MyBatis-Plus 全参数化查询</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_O8UO" id="性能优化">性能优化<a href="https://docs.jiudi.com/changelog/2024/04/20/v3.1.0#%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96" class="hash-link" aria-label="性能优化的直接链接" title="性能优化的直接链接" translate="no">​</a></h3>
<ul>
<li class="">数据库连接池优化：HikariCP 替换 Druid</li>
<li class="">Redis 缓存策略优化：分级缓存 + 空值缓存防穿透</li>
<li class="">前端首屏加载：SSG + 懒加载 + 代码分割</li>
<li class="">API 响应压缩：Gzip + Brotli 双压缩</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_O8UO" id="可观测性">可观测性<a href="https://docs.jiudi.com/changelog/2024/04/20/v3.1.0#%E5%8F%AF%E8%A7%82%E6%B5%8B%E6%80%A7" class="hash-link" aria-label="可观测性的直接链接" title="可观测性的直接链接" translate="no">​</a></h3>
<ul>
<li class="">集成 Spring Boot Actuator 健康检查</li>
<li class="">Micrometer 指标采集（JVM、HTTP、数据库）</li>
<li class="">结构化日志输出（JSON 格式）</li>
<li class="">请求链路追踪（Trace ID）</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_O8UO" id="数据库变更">数据库变更<a href="https://docs.jiudi.com/changelog/2024/04/20/v3.1.0#%E6%95%B0%E6%8D%AE%E5%BA%93%E5%8F%98%E6%9B%B4" class="hash-link" aria-label="数据库变更的直接链接" title="数据库变更的直接链接" translate="no">​</a></h2>
<p>v3.1.0 包含大量数据库结构变更，建议全新安装。从 v2.x 升级需执行完整迁移脚本。</p>
<p>核心表结构：</p>
<div class="language-sql codeBlockContainer_Ok5B theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_i9KJ"><pre tabindex="0" class="prism-code language-sql codeBlock_fA72 thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_CoyY"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">-- 用户表（新增微信字段）</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">CREATE</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">TABLE</span><span class="token plain"> sys_user </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    id </span><span class="token keyword" style="color:#00009f">BIGINT</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">NOT</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">NULL</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">AUTO_INCREMENT</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    wx_openid </span><span class="token keyword" style="color:#00009f">VARCHAR</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">64</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">COMMENT</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'微信OpenID'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    wx_unionid </span><span class="token keyword" style="color:#00009f">VARCHAR</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">64</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">COMMENT</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'微信UnionID'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    nickname </span><span class="token keyword" style="color:#00009f">VARCHAR</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">50</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">NOT</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">NULL</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    avatar </span><span class="token keyword" style="color:#00009f">VARCHAR</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">500</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    phone </span><span class="token keyword" style="color:#00009f">VARCHAR</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">20</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    email </span><span class="token keyword" style="color:#00009f">VARCHAR</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">100</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">status</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">TINYINT</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">NOT</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">NULL</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">DEFAULT</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    created_at </span><span class="token keyword" style="color:#00009f">DATETIME</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">NOT</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">NULL</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">DEFAULT</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">CURRENT_TIMESTAMP</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    updated_at </span><span class="token keyword" style="color:#00009f">DATETIME</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">NOT</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">NULL</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">DEFAULT</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">CURRENT_TIMESTAMP</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">ON</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">UPDATE</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">CURRENT_TIMESTAMP</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    deleted </span><span class="token keyword" style="color:#00009f">TINYINT</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">NOT</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">NULL</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">DEFAULT</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">PRIMARY</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">KEY</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">id</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">UNIQUE</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">KEY</span><span class="token plain"> uk_wx_openid </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">wx_openid</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">KEY</span><span class="token plain"> idx_phone </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">phone</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">ENGINE</span><span class="token operator" style="color:#393A34">=</span><span class="token keyword" style="color:#00009f">InnoDB</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">DEFAULT</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">CHARSET</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">utf8mb4</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">-- 授权表</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">CREATE</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">TABLE</span><span class="token plain"> sys_license </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    id </span><span class="token keyword" style="color:#00009f">BIGINT</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">NOT</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">NULL</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">AUTO_INCREMENT</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    license_key </span><span class="token keyword" style="color:#00009f">VARCHAR</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">20</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">NOT</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">NULL</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    user_id </span><span class="token keyword" style="color:#00009f">BIGINT</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">NOT</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">NULL</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    domain </span><span class="token keyword" style="color:#00009f">VARCHAR</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">255</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">NOT</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">NULL</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">type</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">VARCHAR</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">20</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">NOT</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">NULL</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    duration </span><span class="token keyword" style="color:#00009f">INT</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">NOT</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">NULL</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    issued_at </span><span class="token keyword" style="color:#00009f">DATETIME</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">NOT</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">NULL</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    expires_at </span><span class="token keyword" style="color:#00009f">DATETIME</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">NOT</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">NULL</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    certificate </span><span class="token keyword" style="color:#00009f">TEXT</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">status</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">VARCHAR</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">20</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">NOT</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">NULL</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">DEFAULT</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'ACTIVE'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    created_at </span><span class="token keyword" style="color:#00009f">DATETIME</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">NOT</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">NULL</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">DEFAULT</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">CURRENT_TIMESTAMP</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    updated_at </span><span class="token keyword" style="color:#00009f">DATETIME</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">NOT</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">NULL</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">DEFAULT</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">CURRENT_TIMESTAMP</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">ON</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">UPDATE</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">CURRENT_TIMESTAMP</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    deleted </span><span class="token keyword" style="color:#00009f">TINYINT</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">NOT</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">NULL</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">DEFAULT</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">PRIMARY</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">KEY</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">id</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">UNIQUE</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">KEY</span><span class="token plain"> uk_license_key </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">license_key</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">KEY</span><span class="token plain"> idx_domain </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">domain</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">KEY</span><span class="token plain"> idx_user_id </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">user_id</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">ENGINE</span><span class="token operator" style="color:#393A34">=</span><span class="token keyword" style="color:#00009f">InnoDB</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">DEFAULT</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">CHARSET</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">utf8mb4</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_O8UO" id="破坏性变更">破坏性变更<a href="https://docs.jiudi.com/changelog/2024/04/20/v3.1.0#%E7%A0%B4%E5%9D%8F%E6%80%A7%E5%8F%98%E6%9B%B4" class="hash-link" aria-label="破坏性变更的直接链接" title="破坏性变更的直接链接" translate="no">​</a></h2>
<p>以下是 v2.x 升级到 v3.1.0 的主要破坏性变更：</p>
<table><thead><tr><th>变更项</th><th>v2.x</th><th>v3.1.0</th></tr></thead><tbody><tr><td>最低 Java 版本</td><td>11</td><td>17</td></tr><tr><td>最低 MySQL 版本</td><td>5.7</td><td>8.0</td></tr><tr><td>前端框架</td><td>Vue 2</td><td>Vue 3</td></tr><tr><td>状态管理</td><td>Vuex</td><td>Pinia</td></tr><tr><td>构建工具</td><td>Webpack</td><td>Vite</td></tr><tr><td>UI 组件库</td><td>Ant Design Vue 2</td><td>Ant Design Vue 4</td></tr><tr><td>API 响应格式</td><td><code>{ code, msg, data }</code></td><td><code>{ code, message, data }</code></td></tr><tr><td>认证方式</td><td>账号密码</td><td>微信扫码 + JWT</td></tr><tr><td>授权方式</td><td>本地序列号</td><td>RSA 证书</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_O8UO" id="升级建议">升级建议<a href="https://docs.jiudi.com/changelog/2024/04/20/v3.1.0#%E5%8D%87%E7%BA%A7%E5%BB%BA%E8%AE%AE" class="hash-link" aria-label="升级建议的直接链接" title="升级建议的直接链接" translate="no">​</a></h2>
<p>由于 v3.1.0 是重大架构升级，建议：</p>
<ol>
<li class=""><strong>新项目</strong>：直接使用 v3.1.0</li>
<li class=""><strong>v2.x 现有项目</strong>：评估升级成本，建议在新环境部署 v3.1.0 后逐步迁移数据</li>
<li class=""><strong>定制化项目</strong>：联系技术支持获取定制迁移方案</li>
</ol>
<p>完整迁移指南请参考项目仓库中的 <code>MIGRATION-v2-to-v3.md</code> 文档。</p>]]></content:encoded>
            <category>major</category>
            <category>feature</category>
            <category>breaking-change</category>
        </item>
    </channel>
</rss>