From 701a621552513828f09836b735df1ccf33fad12d Mon Sep 17 00:00:00 2001 From: ikmkj <1@qq,com> Date: Tue, 6 Jan 2026 17:58:24 +0800 Subject: [PATCH] =?UTF-8?q?fix(config):=20=E6=9B=B4=E6=96=B0API=E5=9C=B0?= =?UTF-8?q?=E5=9D=80=E5=92=8C=E9=85=8D=E7=BD=AE=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修改前端环境配置文件中的API基础URL地址 - 切换路由模式从history到hash模式以解决部署问题 - 注释掉axios的withCredentials配置避免跨域问题 - 修复后端JWT认证过滤器中的代码注释和逻辑结构 - 更新Docker容器时区设置为上海时区 - 修复笔记编辑器中保存数据时字段缺失的问题 - 添加Vite构建输出目录和资源目录配置 - 恢复后端开发环境数据库路径配置 --- .../JwtAuthenticationTokenFilter.java | 31 ++++++++++++++++++ .../service/impl/UserServiceImpl.java | 11 +++++++ .../src/main/resources/application-dev.yml | 3 +- biji-qianduan/.env.app | 2 +- biji-qianduan/.env.web | 2 +- .../src/components/home/NoteEditor.vue | 10 +++++- biji-qianduan/src/router/index.js | 6 ++-- biji-qianduan/src/utils/axios.js | 2 +- biji-qianduan/vite.config.js | 4 ++- docker/docker-compose.yml | 2 ++ mydatabase.db | Bin 73728 -> 73728 bytes 11 files changed, 63 insertions(+), 10 deletions(-) diff --git a/biji-houdaun/src/main/java/com/test/bijihoudaun/interceptor/JwtAuthenticationTokenFilter.java b/biji-houdaun/src/main/java/com/test/bijihoudaun/interceptor/JwtAuthenticationTokenFilter.java index c7e34be..2e64523 100644 --- a/biji-houdaun/src/main/java/com/test/bijihoudaun/interceptor/JwtAuthenticationTokenFilter.java +++ b/biji-houdaun/src/main/java/com/test/bijihoudaun/interceptor/JwtAuthenticationTokenFilter.java @@ -33,38 +33,69 @@ public class JwtAuthenticationTokenFilter extends OncePerRequestFilter { this.tokenHead = tokenHead; } +/** + * 内部过滤器方法,用于处理请求的认证逻辑 + * @param request HttpServletRequest对象,包含请求信息 + * @param response HttpServletResponse对象,用于响应 + * @param chain FilterChain过滤器链,用于传递请求和响应 + * @throws ServletException 可能抛出的Servlet异常 + * @throws IOException 可能抛出的IO异常 + */ @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException { + // 从请求头中获取认证信息 String authHeader = request.getHeader(this.tokenHeader); + // 检查请求头是否存在且以指定的token前缀开头 if (authHeader != null && authHeader.startsWith(this.tokenHead)) { + // 提取实际的token值(去除前缀) final String authToken = authHeader.substring(this.tokenHead.length()); try { + // 从token中解析出用户名 String username = jwtTokenUtil.getUsernameFromToken(authToken); + // 验证用户名不为空且当前没有已认证的用户 if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) { + // 通过用户名加载用户详情 UserDetails userDetails = this.userDetailsService.loadUserByUsername(username); + // 验证token的有效性 if (jwtTokenUtil.validateToken(authToken, userDetails)) { + // 创建认证对象 UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities()); + // 设置认证详情 authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); + // 将认证信息存入安全上下文 SecurityContextHolder.getContext().setAuthentication(authentication); } } } catch (ExpiredJwtException e) { + // 处理token过期异常 sendErrorResponse(response, ResultCode.TOKEN_EXPIRED); return; } catch (SignatureException e) { + // 处理token签名异常 sendErrorResponse(response, ResultCode.TOKEN_INVALID); return; } } + // 继续过滤器链的处理 chain.doFilter(request, response); } +/** + * 发送错误响应信息 + * @param response HTTP响应对象 + * @param resultCode 结果代码,包含错误信息 + * @throws IOException 可能抛出的IO异常 + */ private void sendErrorResponse(HttpServletResponse response, ResultCode resultCode) throws IOException { + // 设置响应内容类型为JSON,字符编码为UTF-8 response.setContentType("application/json;charset=UTF-8"); + // 设置HTTP状态码为401未授权 response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); + // 创建ObjectMapper实例,用于对象与JSON之间的转换 ObjectMapper mapper = new ObjectMapper(); + // 将失败结果转换为JSON字符串并写入响应输出流 response.getWriter().write(mapper.writeValueAsString(R.fail(resultCode))); } } \ No newline at end of file diff --git a/biji-houdaun/src/main/java/com/test/bijihoudaun/service/impl/UserServiceImpl.java b/biji-houdaun/src/main/java/com/test/bijihoudaun/service/impl/UserServiceImpl.java index 361efe6..de1123d 100644 --- a/biji-houdaun/src/main/java/com/test/bijihoudaun/service/impl/UserServiceImpl.java +++ b/biji-houdaun/src/main/java/com/test/bijihoudaun/service/impl/UserServiceImpl.java @@ -32,12 +32,23 @@ public class UserServiceImpl extends ServiceImpl implements Us @Autowired private UserMapper userMapper; +/** + * 重写Spring Security的loadUserByUsername方法,用于用户认证 + * @param username 用户名 + * @return UserDetails 用户详细信息 + * @throws UsernameNotFoundException 当用户未找到时抛出此异常 + */ @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { + // 根据用户名从数据库查询用户信息 User user = userMapper.findByUsername(username); + // 判断用户是否存在,如果不存在则抛出异常 if (ObjectUtil.isNull(user)) { throw new UsernameNotFoundException("User not found with username: " + username); } + // 返回UserDetails对象,包含用户名、密码和权限列表 + // 这里使用Spring Security提供的User类实现UserDetails接口 + // 参数分别为:用户名,密码,权限集合(这里使用空集合表示无额外权限) return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), new ArrayList<>()); // 账号,密码,权限 } diff --git a/biji-houdaun/src/main/resources/application-dev.yml b/biji-houdaun/src/main/resources/application-dev.yml index ec5da6e..70b646c 100644 --- a/biji-houdaun/src/main/resources/application-dev.yml +++ b/biji-houdaun/src/main/resources/application-dev.yml @@ -1,8 +1,7 @@ spring: datasource: driver-class-name: org.sqlite.JDBC -# url: jdbc:sqlite:C:\it\houtaigunli\biji\mydatabase.db - url: jdbc:sqlite:C:\KAIFA\2\mydatabase.db + url: jdbc:sqlite:C:\it\houtaigunli\biji\mydatabase.db jpa: hibernate: ddl-auto: none diff --git a/biji-qianduan/.env.app b/biji-qianduan/.env.app index 7304f4d..022def7 100644 --- a/biji-qianduan/.env.app +++ b/biji-qianduan/.env.app @@ -1,4 +1,4 @@ VITE_BASE_URL=./ # 在为App构建前,请将这里替换为你的真实后端API公网地址 -VITE_API_BASE_URL=https://api.example.com \ No newline at end of file +VITE_API_BASE_URL=https://biji-houduan.ikmkj.dpdns.org \ No newline at end of file diff --git a/biji-qianduan/.env.web b/biji-qianduan/.env.web index 16fff89..0edde97 100644 --- a/biji-qianduan/.env.web +++ b/biji-qianduan/.env.web @@ -1,2 +1,2 @@ VITE_BASE_URL=/ -VITE_API_BASE_URL=/api \ No newline at end of file +VITE_API_BASE_URL=https://biji-houduan.ikmkj.dpdns.org \ No newline at end of file diff --git a/biji-qianduan/src/components/home/NoteEditor.vue b/biji-qianduan/src/components/home/NoteEditor.vue index 8241b55..89d8c1b 100644 --- a/biji-qianduan/src/components/home/NoteEditor.vue +++ b/biji-qianduan/src/components/home/NoteEditor.vue @@ -83,7 +83,15 @@ const save = async (value) => { const content = typeof value === 'string' ? value : vditor.value.getValue(); try { saveStatus.value = '正在保存...'; - await updateMarkdown({ id: props.editData.id, content: content }); + // 发送完整的笔记对象,确保包含所有必要字段 + await updateMarkdown({ + id: props.editData.id, + content: content, + title: props.editData.title, + groupingId: props.editData.groupingId, + fileName: props.editData.fileName, + isPrivate: props.editData.isPrivate + }); // 保存成功,更新状态 saveStatus.value = '已保存'; emit('update:editData', { ...props.editData, content: content }); diff --git a/biji-qianduan/src/router/index.js b/biji-qianduan/src/router/index.js index cd70176..0fecd5a 100644 --- a/biji-qianduan/src/router/index.js +++ b/biji-qianduan/src/router/index.js @@ -1,4 +1,4 @@ -import { createRouter, createWebHistory } from 'vue-router'; +import { createRouter, createWebHashHistory } from 'vue-router'; import HomePage from '../components/HomePage.vue'; import LoginPage from '../components/LoginPage.vue'; import RegisterPage from '../components/RegisterPage.vue'; @@ -35,7 +35,7 @@ const routes = [ ]; const router = createRouter({ - history: createWebHistory(), + history: createWebHashHistory(), // 改为hash模式 routes }); @@ -50,4 +50,4 @@ router.beforeEach((to, from, next) => { } }); -export default router; +export default router; \ No newline at end of file diff --git a/biji-qianduan/src/utils/axios.js b/biji-qianduan/src/utils/axios.js index b76f6c8..8f1041b 100644 --- a/biji-qianduan/src/utils/axios.js +++ b/biji-qianduan/src/utils/axios.js @@ -6,7 +6,7 @@ import router from '../router' const instance = axios.create({ baseURL: import.meta.env.VITE_API_BASE_URL, // 开发环境使用withCredentials,生产环境关闭 - withCredentials: import.meta.env.DEV, + // withCredentials: import.meta.env.DEV, headers: { 'Content-Type': 'application/json' } diff --git a/biji-qianduan/vite.config.js b/biji-qianduan/vite.config.js index 22dbd66..026e736 100644 --- a/biji-qianduan/vite.config.js +++ b/biji-qianduan/vite.config.js @@ -23,10 +23,12 @@ export default defineConfig(({ mode }) => { } }, build: { + outDir: 'dist', + assetsDir: 'assets', minify: 'esbuild', esbuild: { drop: ['console', 'debugger'], }, } } -}) +}) \ No newline at end of file diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 9ef5ec8..b37ba45 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -28,5 +28,7 @@ services: restart: unless-stopped ports: - "8084:8084" + environment: + TZ: "Asia/Shanghai" # 设置时区为上海时区 volumes: - /docker/biji-houduan/data:/data diff --git a/mydatabase.db b/mydatabase.db index 664648267af9d77bc7e988dc599c354daabda104..66fef4943a24c5d38f863d246ad9e1966549a415 100644 GIT binary patch delta 1090 zcma)*&rcIU6vy{RTk4i|t1VI}iG!fF>cak@+d?GxCKLJ7*iNlAUV7+2BR_` z5hcj05k(qomxWMRiROO$eHSYMTT+SPGj=Twhfymw$tRDNM)*mm&r&jF?*B)DzP zG^>T@obQB-7D*iqYiUD=hL%k9N0TZ_Q@QP~`uaNGQTnVS4)uF#axBq5q{WbZdh66e z)@_oP4mfka$KiI?y7mb6j%&|k27b823v?e@X_a*roJ)EGW>0Kgc97gM!7ZD|zyf#U zI^`hv?%Hk?ZjVI6q9{T^YEz`JBuEM`h`gZmib{thbck|GTS$>Z5m^wR8rKqKB6J8* zEc@V{-Hp|D32qmwedQXwG*AAoM6m=x*tmdM^`()M+H5w$(Pw+x9BQE4L?s6_Z~j~X zSOySm2c4%rQh7=x!P;y!Ii79Lew%;&czG0xC4%AWS2cfiVN=fB9tu1F>?vXL;92nA*aR4C%V|S5`fY>Qoq?Sk{-2hs`NEU*Doz?vJm+L`rAI3&e8U%JG z-UKahG=>*VRIoPTzl?8v7) yq`!etN`qk}eU1EUZ_ODhvI zD?@WVLqj7A0}CSqgT$2F%sjXXLj{-$i0%LPvkE{gcmuTHDZhjWy5YPG3=GWtahus6 zDDv|G*=B69Q1>%{of!9inF1Fxvl;`h74vjvwatzK4NL-z+)ECx_|P(eftP_%UbR_& z`W+!gD^0CswO=>Px#