feat: 重构项目结构并新增微信小程序认证模块

This commit is contained in:
Ray.Hao
2026-03-24 07:52:05 +08:00
parent 465e63c99d
commit 8188c82c3d
158 changed files with 1342 additions and 1562 deletions

View File

@@ -85,8 +85,7 @@ security:
- /api/v1/auth/sms/code # 发送登录短信验证码
- /api/v1/auth/refresh-token # 刷新令牌接口
- /api/v1/wechat/miniapp/auth/** # 微信小程序认证接口(静默登录/手机号快捷登录/绑定手机号)
- /api/v1/statistics/** # 统计分析接口(访问趋势/访问概览)
- /ws/** # WebSocket接口
- /api/v1/logs/** # 日志接口(访问日志列表)
# 非安全端点路径,完全绕过 Spring Security 的过滤器
unsecured-urls:
- ${springdoc.swagger-ui.path}
@@ -157,8 +156,8 @@ springdoc:
packages-to-scan: # 扫描的 Controller 包,限制只生成指定包的接口文档
- com.youlai.boot.auth.controller
- com.youlai.boot.system.controller
- com.youlai.boot.file.controller
- com.youlai.boot.tool.codegen.controller
- com.youlai.boot.module.file.controller
- com.youlai.boot.module.codegen.controller
default-flat-param-object: true # 将对象参数扁平化显示在文档中
# knife4j 配置

View File

@@ -83,7 +83,7 @@ security:
- /api/v1/auth/captcha # 验证码获取接口
- /api/v1/auth/refresh-token # 刷新令牌接口
- /api/v1/wechat/miniapp/auth/** # 微信小程序认证接口(静默登录/手机号快捷登录/绑定手机号)
- /ws/** # WebSocket接口
- /api/v1/logs/** # 日志接口(访问日志列表)
# 非安全端点路径,完全绕过 Spring Security 的过滤器
unsecured-urls:
- ${springdoc.swagger-ui.path}
@@ -154,8 +154,8 @@ springdoc:
packages-to-scan: # 扫描的 Controller 包,限制只生成指定包的接口文档
- com.youlai.boot.auth.controller
- com.youlai.boot.system.controller
- com.youlai.boot.file.controller
- com.youlai.boot.tool.codegen.controller
- com.youlai.boot.module.file.controller
- com.youlai.boot.module.codegen.controller
default-flat-param-object: true # 将对象参数扁平化显示在文档中
# knife4j 配置

View File

@@ -10,26 +10,34 @@
SELECT
t1.id,
t1.module,
t1.action_type AS actionType,
t1.title,
t1.content,
t1.request_uri,
t1.operator_id AS operatorId,
t1.operator_name AS operatorName,
t1.request_uri AS requestUri,
t1.request_method AS requestMethod,
t1.ip,
CONCAT(t1.province," ", t1.city) AS region,
t1.execution_time,
CONCAT(t1.browser," ", t1.browser_version) AS browser,
CONCAT(t1.province, " ", t1.city) AS region,
t1.device,
t1.os,
t1.create_time,
t2.nickname AS operator
t1.browser,
t1.status,
t1.execution_time AS executionTime,
t1.error_msg AS errorMsg,
t1.create_time AS createTime
FROM
sys_log t1
LEFT JOIN sys_user t2 ON t1.create_by = t2.id
<where>
<if test="queryParams.keywords != null and queryParams.keywords != ''">
AND (
t1.title LIKE concat('%',#{queryParams.keywords},'%')
OR
t1.content LIKE concat('%',#{queryParams.keywords},'%')
OR
t1.ip LIKE concat('%',#{queryParams.keywords},'%')
OR
t2.nickname LIKE concat('%',#{queryParams.keywords},'%')
t1.operator_name LIKE concat('%',#{queryParams.keywords},'%')
)
</if>
<if test="queryParams.createTime != null and queryParams.createTime.size > 0">
@@ -48,7 +56,7 @@
</select>
<!-- 获取访问量日统计列表 -->
<select id="getPvCounts" resultType="com.youlai.boot.system.model.bo.VisitCountBO">
<select id="getPvCounts" resultType="com.youlai.boot.system.model.dto.VisitCountDTO">
SELECT
COUNT(1) AS count,
DATE_FORMAT(create_time,'%Y-%m-%d') AS date
@@ -61,7 +69,7 @@
</select>
<!-- 获取IP日统计列表-->
<select id="getIpCounts" resultType="com.youlai.boot.system.model.bo.VisitCountBO">
<select id="getIpCounts" resultType="com.youlai.boot.system.model.dto.VisitCountDTO">
SELECT
COUNT(DISTINCT ip) AS count,
DATE_FORMAT(create_time, '%Y-%m-%d') AS date
@@ -74,10 +82,10 @@
</select>
<!-- 获取访问量(PV)统计数据 mysql版本-->
<select id="getPvStats" resultType="com.youlai.boot.system.model.bo.VisitStatsBO" databaseId="mysql">
<select id="getPvStats" resultType="com.youlai.boot.system.model.vo.VisitOverviewVO" databaseId="mysql">
SELECT
COUNT(CASE WHEN DATE(create_time) = CURDATE() THEN 1 END) AS todayCount,
COUNT(*) AS totalCount,
COUNT(CASE WHEN DATE(create_time) = CURDATE() THEN 1 END) AS todayPvCount,
COUNT(*) AS totalPvCount,
ROUND(
CASE
WHEN COUNT(CASE WHEN DATE(create_time) = CURDATE() - INTERVAL 1 DAY AND TIME(create_time) &lt;= TIME(NOW()) THEN 1 END) = 0 THEN 0
@@ -86,16 +94,16 @@
COUNT(CASE WHEN DATE(create_time) = CURDATE() - INTERVAL 1 DAY AND TIME(create_time) &lt;= TIME(NOW()) THEN 1 END)) /
COUNT(CASE WHEN DATE(create_time) = CURDATE() - INTERVAL 1 DAY AND TIME(create_time) &lt;= TIME(NOW()) THEN 1 END)
END,
2) AS growthRate
2) AS pvGrowthRate
FROM
sys_log
</select>
<!-- 获取IP统计数据 mysql版本-->
<select id="getUvStats" resultType="com.youlai.boot.system.model.bo.VisitStatsBO" databaseId="mysql">
<select id="getUvStats" resultType="com.youlai.boot.system.model.vo.VisitOverviewVO" databaseId="mysql">
SELECT
COUNT(DISTINCT CASE WHEN DATE(create_time) = CURDATE() THEN ip END) AS todayCount,
COUNT(DISTINCT ip) AS totalCount,
COUNT(DISTINCT CASE WHEN DATE(create_time) = CURDATE() THEN ip END) AS todayUvCount,
COUNT(DISTINCT ip) AS totalUvCount,
ROUND(
CASE
WHEN COUNT(DISTINCT CASE WHEN DATE(create_time) = CURDATE() - INTERVAL 1 DAY AND TIME(create_time) &lt;= TIME(NOW()) THEN ip END) = 0 THEN 0
@@ -104,9 +112,10 @@
COUNT(DISTINCT CASE WHEN DATE(create_time) = CURDATE() - INTERVAL 1 DAY AND TIME(create_time) &lt;= TIME(NOW()) THEN ip END)) /
COUNT(DISTINCT CASE WHEN DATE(create_time) = CURDATE() - INTERVAL 1 DAY AND TIME(create_time) &lt;= TIME(NOW()) THEN ip END)
END,
2) AS growthRate
2) AS uvGrowthRate
FROM
sys_log
</select>
</mapper>

View File

@@ -3,7 +3,7 @@
<mapper namespace="com.youlai.boot.system.mapper.NoticeMapper">
<!-- 获取通知公告分页列表 -->
<select id="getNoticePage" resultType="com.youlai.boot.system.model.bo.NoticeBO">
<select id="getNoticePage" resultType="com.youlai.boot.system.model.vo.NoticePageVO">
SELECT
t1.id,
t1.title,
@@ -42,7 +42,7 @@
</select>
<!-- 获取通知公告详情 -->
<select id="getNoticeDetail" resultType="com.youlai.boot.system.model.bo.NoticeBO">
<select id="getNoticeDetail" resultType="com.youlai.boot.system.model.vo.NoticeDetailVO">
SELECT
t1.id,
t1.title,

View File

@@ -16,7 +16,7 @@
</select>
<!-- 权限和拥有权限的角色的映射 -->
<resultMap id="PremRolesMap" type="com.youlai.boot.system.model.bo.RolePermsBO">
<resultMap id="PremRolesMap" type="com.youlai.boot.system.model.dto.RolePermsDTO">
<result property="roleCode" column="role_code"/>
<collection property="perms" ofType="string" javaType="java.util.Set">
<result column="perm"/>

View File

@@ -6,7 +6,7 @@
<mapper namespace="com.youlai.boot.system.mapper.UserMapper">
<!-- 用户分页列表 mysql版本-->
<select id="getUserPage" resultType="com.youlai.boot.system.model.bo.UserBO" databaseId="mysql">
<select id="getUserPage" resultType="com.youlai.boot.system.model.vo.UserPageVO" databaseId="mysql">
SELECT
u.id,
u.username,
@@ -34,7 +34,7 @@
INNER JOIN sys_role r ON sur.role_id = r.id
WHERE
sur.user_id = u.id
AND r.code = '${@com.youlai.boot.common.constant.SystemConstants@ROOT_ROLE_CODE}'
AND r.code = '${@com.youlai.boot.shared.constant.SystemConstants@ROOT_ROLE_CODE}'
)
<if test='queryParams.keywords!=null and queryParams.keywords.trim() neq ""'>
AND (
@@ -118,7 +118,7 @@
</select>
<!-- 用户认证信息映射 -->
<resultMap id="AuthCredentialsMap" type="com.youlai.boot.security.model.UserAuthInfo">
<resultMap id="AuthCredentialsMap" type="com.youlai.boot.framework.security.model.UserAuthInfo">
<id property="userId" column="userId" jdbcType="BIGINT"/>
<result property="username" column="username" jdbcType="VARCHAR"/>
<result property="password" column="password" jdbcType="VARCHAR"/>
@@ -165,7 +165,7 @@
</select>
<!-- 获取用户导出列表 -->
<select id="listExportUsers" resultType="com.youlai.boot.system.model.dto.UserExportDTO">
<select id="listExportUsers" resultType="com.youlai.boot.system.model.vo.UserExportVO">
SELECT
u.username,
u.nickname,
@@ -186,7 +186,7 @@
INNER JOIN sys_role r ON sur.role_id = r.id
WHERE
sur.user_id = u.id
AND r.code = '${@com.youlai.boot.common.constant.SystemConstants@ROOT_ROLE_CODE}'
AND r.code = '${@com.youlai.boot.shared.constant.SystemConstants@ROOT_ROLE_CODE}'
)
<if test='keywords!=null and keywords.trim() neq ""'>
AND (u.username LIKE CONCAT('%',#{keywords},'%')
@@ -204,7 +204,7 @@
</select>
<!-- 根据用户ID获取用户详情 mysql版本-->
<select id="getUserProfile" resultType="com.youlai.boot.system.model.bo.UserBO" databaseId="mysql">
<select id="getUserProfile" resultType="com.youlai.boot.system.model.vo.UserProfileVO" databaseId="mysql">
SELECT
u.id,
u.username,

View File

@@ -5,7 +5,7 @@
<mapper namespace="com.youlai.boot.system.mapper.UserSocialMapper">
<!-- 用户认证信息映射 -->
<resultMap id="AuthCredentialsMap" type="com.youlai.boot.security.model.UserAuthInfo">
<resultMap id="AuthCredentialsMap" type="com.youlai.boot.framework.security.model.UserAuthInfo">
<id property="userId" column="userId" jdbcType="BIGINT"/>
<result property="username" column="username" jdbcType="VARCHAR"/>
<result property="nickname" column="nickname" jdbcType="VARCHAR"/>