P148 nginx动静分离
1. 商城系统首页1.1整合 thymeleaf 渲染首页不在使用前后端分离使用thymeleaf。nginx通过反向代理将数据转发到网关网关在路由到各个服务。页面放在服务中静态资源js/css/img可以放到nginx中做到动静分离。在gulimall-product模块引入thymeleaf依赖dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-thymeleaf/artifactId /dependency注意事项1. html\首页资源\index放到gulimall-product下的static文件夹index.html放在templates下。2. 修改gulimall-product的application.yml关闭thymeleaf缓存便于开发实时看到更新thymeleaf:cache: false3. 将gulimall-product的包名controller改为app表示用于手机端或app端添加web包用来存储thymeleaf相关的controller。4. 重启gulimall-product访问http://localhost:10000可以看到商城首页效果图。静态资源也是可以访问的http://localhost:10000/index/css/GL.css1.2 首页-整合dev-tools渲染一级分类数据/** * author W * createDate 2023/5/18 17:19 * description 商城系统首页 */ Controller public class IndexController { Resource private CategoryService categoryService; GetMapping({/,/index.html}) public String indexPage(Model model){ // 返回三级分类所有的一级分类 ListCategoryEntity categoryEntities categoryService.getLevelOneCategory(); model.addAttribute(categorys,categoryEntities); // 视图解析器进行拼串 // classpath:/templates/返回值.html return index; } }public interface CategoryService extends IServiceCategoryEntity { ... ListCategoryEntity getLevelOneCategory(); }Service(categoryService) public class CategoryServiceImpl extends ServiceImplCategoryDao, CategoryEntity implements CategoryService { Resource private CategoryBrandRelationService categoryBrandRelationService; ... /** * 查询一级分类 * parent_cid0或者cat_level1 * return */ Override public ListCategoryEntity getLevelOneCategory() { // ListCategoryEntity categoryEntities this.baseMapper.selectList(new QueryWrapperCategoryEntity().eq(parent_cid, 0)); return categoryEntities; } }注意事项1. 首页使用thymeleaf在index中添加thymeleaf的名声空间在html标间上加入xmlns:thhttp://www.thymeleaf.orghtml langen xmlns:thhttp://www.thymeleaf.org2. 页面修改不重启服务器实时更新1在gulimall-product中引入dev-toolsdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-devtools/artifactIdoptionaltrue/optional/dependency2修改页面如果刷新不起作用可以对index.html重新编译按ctrlshiftf9前提是要关闭thymeleaf的缓存不然也看不到首页修改效果。3. 遍历IndexController 传过来的categorys循环遍历展示一级数据。ul!--/*thymesVar idcategorys typecom*/--lith:eachcategory : ${categorys}a href# classheader_main_left_a ctg-data3th:attrctg-data${category.catId}bth:text${category.name}家用电器/b/a/li/ul1.3 首页-渲染二级三级分类数据根据static/index/json/catalog.json数据结构创建相应的实体类Catelog2Vo/** * author W * createDate 2023/5/19 * description 根据商城系统首页所需数据类型封装二级实体类 */ NoArgsConstructor AllArgsConstructor Data public class Catelog2Vo { private String catalog1Id; // 父级id一级分类id private ListObject catalog3List; // 三级子分类 private String id; private String name; /** * 三级分类实体 * 以内部类的形式 */ NoArgsConstructor AllArgsConstructor Data public static class Catelog3Vo{ private String catalog2Id; // 父级id二级分类id private String id; private String name; } }获取二级三级分类的数据Controller public class IndexController { Resource private CategoryService categoryService; ... // index/catalog.json ResponseBody GetMapping(/index/catalog.json) public MapString, ListCatelog2Vo getCatalogJson(){ MapString, ListCatelog2Vo catalogJson categoryService.getCatalogJson(); return catalogJson; } }public interface CategoryService extends IServiceCategoryEntity { ... MapString, ListCatelog2Vo getCatalogJson(); }Service(categoryService) public class CategoryServiceImpl extends ServiceImplCategoryDao, CategoryEntity implements CategoryService { Resource private CategoryBrandRelationService categoryBrandRelationService; ... Override public MapString, ListCatelog2Vo getCatalogJson() { // 查出所有的一级分类 ListCategoryEntity level1Category getLevel1Category(); // 封装数据 MapString, ListCatelog2Vo collect level1Category.stream().collect(Collectors.toMap(k - k.getCatId().toString(), v - { // 1. 查询一级分类下的所有二级分类 ListCategoryEntity categoryEntities this.baseMapper.selectList(new QueryWrapperCategoryEntity().eq(parent_cid, v.getCatId())); ListCatelog2Vo level2Category null; if (categoryEntities ! null categoryEntities.size() 0) { level2Category categoryEntities.stream().map(l2 - { Catelog2Vo catelog2Vo new Catelog2Vo(v.getCatId().toString(), null, l2.getCatId().toString(), l2.getName()); // 2. 找二级分类下的所有三级分类 ListCategoryEntity level3Category this.baseMapper.selectList(new QueryWrapperCategoryEntity().eq(parent_cid, l2.getCatId())); if (level3Category ! null level3Category.size() 0) { ListCatelog2Vo.Catelog3Vo catelog3Vos level3Category.stream().map(l3 - { // 封装成指定格式 Catelog2Vo.Catelog3Vo catelog3Vo new Catelog2Vo.Catelog3Vo(l2.getCatId().toString(), l3.getCatId().toString(), l3.getName()); return catelog3Vo; }).collect(Collectors.toList()); catelog2Vo.setCatalog3List(catelog3Vos); } return catelog2Vo; }).collect(Collectors.toList()); } return level2Category; })); return collect; } }2 性能测试2.1性能指标响应时间Response Time: RT: 响应时间指用户从客户端发起一个请求开始 到客户端接收到从服务器端返回的响应结束 整个过程所耗费的时间。HPSHits Per Second 每秒点击次数 单位是次/秒。TPSTransaction per Second 系统每秒处理交易数 单位是笔/秒。QPSQuery per Second 系统每秒处理查询次数 单位是次/秒。最大响应时间Max Response Time 指用户发出请求或者指令到系统做出反应响应的最大时间。最少响应时间Mininum ResponseTime 指用户发出请求或者指令到系统做出反应响应 的最少时间。90%响应时间90% Response Time 是指所有用户的响应时间进行排序 第 90%的响应时间。从外部看 性能测试主要关注如下三个指标吞吐量 每秒钟系统能够处理的请求数、 任务数。吞吐量大并发量大响应时间 服务处理一个请求或一个任务的耗时。响应时间越短接口性能就越好错误率 一批请求中结果出错的请求所占比例。结论 中间件越多性能损失越大大多都损失在网络交互了。3. nginx动静分离为什么动静分离静态资源放到服务端后台不但要处理动态请求还要处理静态请求静态请求耗费了大量后台资源后台大部分性能都用于处理静态资源。为了降低服务器压力可以将js、css、img等静态资源放到nginx静态资源直接由nginx返回后台只处理动态请求。1在nginx的对应映射/mydata/nginx/html文件夹下创建子文件夹 static 并且将 resources\static\index 文件夹上传到 static 中2删除 gulimall-product 中的 resources\static\index3修改index.html的静态资源路径加上static前缀src/static/index/img/img_09.png包括href4修改nginx配置文件 /mydata/nginx/conf/conf.d/gulimall.conf如果遇到有/static为前缀的请求转发至html文件夹vim /mydata/nginx/conf/conf.d/gulimall.conf5重启nginx容器并重启gulimall-product测试

相关新闻

ROFL-Player终极指南:如何解决英雄联盟回放兼容性问题

ROFL-Player终极指南:如何解决英雄联盟回放兼容性问题

ROFL-Player终极指南:如何解决英雄联盟回放兼容性问题 【免费下载链接】ROFL-Player (No longer supported) One stop shop utility for viewing League of Legends replays! 项目地址: https://gitcode.com/gh_mirrors/ro/ROFL-Player 你是否曾因英雄联盟版…

2026/7/14 13:40:06阅读更多 →
iNavFlight飞控固件学习-1《开发环境搭建》

iNavFlight飞控固件学习-1《开发环境搭建》

目录 文章目录 目录 摘要 1.官网 2.形成Linux开发环境工具 2.1 简介 2.2 相关工具 2.2.1 Ubuntu / Debian系统配置命令 2.2.2 Fedora系统配置命令 2.2.3 Fedora系统配置命令 2.3 克隆存储库 2.4 构建工具 2.5 使用cmake 2.6 构建固件 2.7 清除 2.8 cmake 缓存维护 2.9 编译通过…

2026/7/14 13:40:06阅读更多 →
EasyGank常见问题解决:5个最常见的Bug修复与调试技巧

EasyGank常见问题解决:5个最常见的Bug修复与调试技巧

EasyGank常见问题解决:5个最常见的Bug修复与调试技巧 【免费下载链接】EasyGank 💊 The project build framework based on the Rx series and MVP pattern. 项目地址: https://gitcode.com/gh_mirrors/ea/EasyGank EasyGank是一个基于RxJava、…

2026/7/14 13:35:05阅读更多 →
TV Bro电视浏览器终极指南:如何在智能电视上轻松上网冲浪?

TV Bro电视浏览器终极指南:如何在智能电视上轻松上网冲浪?

TV Bro电视浏览器终极指南:如何在智能电视上轻松上网冲浪? 【免费下载链接】tv-bro Simple web browser for android optimized to use with TV remote 项目地址: https://gitcode.com/gh_mirrors/tv/tv-bro 你是否曾经在智能电视上尝试浏览网页&…

2026/7/14 14:40:15阅读更多 →
3步破解教材下载难题:tchMaterial-parser工具全攻略

3步破解教材下载难题:tchMaterial-parser工具全攻略

3步破解教材下载难题:tchMaterial-parser工具全攻略 【免费下载链接】tchMaterial-parser 国家中小学智慧教育平台 电子课本下载工具,帮助您从智慧教育平台中获取电子课本的 PDF 文件网址并进行下载,让您更方便地获取课本内容。 项目地址: …

2026/7/14 14:40:15阅读更多 →
AMD混合推理架构解析:Qwen2.5-7B-Instruct_rai_1.7.1_hybrid如何实现高效推理

AMD混合推理架构解析:Qwen2.5-7B-Instruct_rai_1.7.1_hybrid如何实现高效推理

AMD混合推理架构解析:Qwen2.5-7B-Instruct_rai_1.7.1_hybrid如何实现高效推理 【免费下载链接】Qwen2.5-7B-Instruct_rai_1.7.1_hybrid 项目地址: https://ai.gitcode.com/hf_mirrors/amd/Qwen2.5-7B-Instruct_rai_1.7.1_hybrid Qwen2.5-7B-Instruct_rai_1.…

2026/7/14 14:40:15阅读更多 →
HS2-HF_Patch技术架构解析:游戏增强补丁的系统化实现方案

HS2-HF_Patch技术架构解析:游戏增强补丁的系统化实现方案

HS2-HF_Patch技术架构解析:游戏增强补丁的系统化实现方案 【免费下载链接】HS2-HF_Patch Automatically translate, uncensor and update HoneySelect2! 项目地址: https://gitcode.com/gh_mirrors/hs/HS2-HF_Patch HS2-HF_Patch作为Honey Select 2游戏的核心…

2026/7/14 14:40:15阅读更多 →
如何用DiskInfo实现专业级硬盘健康监控:5个必知技巧

如何用DiskInfo实现专业级硬盘健康监控:5个必知技巧

如何用DiskInfo实现专业级硬盘健康监控:5个必知技巧 【免费下载链接】DiskInfo DiskInfo based on CrystalDiskInfo 项目地址: https://gitcode.com/gh_mirrors/di/DiskInfo 在数字时代,数据安全至关重要,而硬盘健康监控是保护数据的第…

2026/7/14 14:40:15阅读更多 →
革命性超分辨率模型:Real-ESRGAN 128x128-tiles-amdnpu如何实现4倍图像质量飞跃

革命性超分辨率模型:Real-ESRGAN 128x128-tiles-amdnpu如何实现4倍图像质量飞跃

革命性超分辨率模型:Real-ESRGAN 128x128-tiles-amdnpu如何实现4倍图像质量飞跃 【免费下载链接】realesrgan-128x128-tiles-amdnpu 项目地址: https://ai.gitcode.com/hf_mirrors/amd/realesrgan-128x128-tiles-amdnpu 想要将低分辨率图像瞬间提升4倍清晰度…

2026/7/14 14:35:15阅读更多 →
VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异当你在VSCode中启动一个新的TypeScript项目时,第一个技术决策往往从安装方式开始。这个看似简单的选择——全局安装还是项目本地安装——实际上会深刻影响你的开发流程、团队协作和…

2026/7/14 4:56:14阅读更多 →
智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 智慧树刷课插件是一款专为智慧树在线教育平台设计的Chrome浏…

2026/7/14 2:55:05阅读更多 →
Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你是否在GOG或Epic Games Store购买了心仪的游戏…

2026/7/14 6:17:41阅读更多 →
【Cursor数据库安全红线】:自动执行SQL前必须校验的6项权限策略,金融级项目已强制落地

【Cursor数据库安全红线】:自动执行SQL前必须校验的6项权限策略,金融级项目已强制落地

更多请点击: https://intelliparadigm.com 第一章:Cursor数据库安全红线概览 Cursor 作为一款基于 AI 的智能编程助手,其本地数据库(SQLite 存储)承载着用户代码片段、会话历史、自定义规则及敏感上下文信息。理解其安…

2026/7/14 0:03:18阅读更多 →
【Notion AI写作避坑白皮书】:基于127份真实用户失败案例,总结6大致命误用陷阱

【Notion AI写作避坑白皮书】:基于127份真实用户失败案例,总结6大致命误用陷阱

更多请点击: https://codechina.net 第一章:Notion AI写作辅助的底层能力边界认知 Notion AI 并非通用大语言模型的直接封装,而是基于 Llama 系列与自研微调模型构建的轻量化推理服务,其输入上下文窗口严格限制在 8192 token&…

2026/7/14 0:03:18阅读更多 →
AI Agent数据越界行为如何被精准溯源?——基于GDPR/CCPA双合规的5层审计框架实战指南

AI Agent数据越界行为如何被精准溯源?——基于GDPR/CCPA双合规的5层审计框架实战指南

更多请点击: https://kaifayun.com 第一章:AI Agent数据越界行为的合规性挑战与溯源必要性 AI Agent在自主执行任务过程中,可能因提示注入、上下文污染或权限配置缺陷,无意或有意访问、缓存、传输受保护数据(如PII、G…

2026/7/14 0:03:18阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/13 4:21:17阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/14 4:45:36阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/14 2:42:17阅读更多 →