第六章 SPRING BOOT NO SQL

本文展示了SpringData如何支持非关系型数据库Redis,通过示例代码说明了如何存储和获取User对象。此外,文章讨论了Redis在session共享中的作用,以及在处理负载均衡时的令牌机制和接口幂等性。幂等性通过拦截器和AOP两种方式实现,确保重复请求的安全性。

Springdata 对非关系型数据库及关系型数据库都提供了支持

@SpringBootTest
class RedisApplicationTests {

    @Autowired
    RedisTemplate redisTemplate;
    @Autowired
    StringRedisTemplate stringRedisTemplate;

    @Test
    void contextLoads() {
        User user = new User();
        user.setUsername("javaboy");
        user.setAddress("www.javaboy.org");
        ValueOperations ops = redisTemplate.opsForValue();
        ops.set("u", user);
        User u = (User) ops.get("u");
        System.out.println("u = " + u);
    }

    @Test
    void test1() throws JsonProcessingException {
        ValueOperations<String, String> ops = stringRedisTemplate.opsForValue();
        User user = new User();
        user.setUsername("javaboy");
        user.setAddress("www.javaboy.org");
        ObjectMapper om = new ObjectMapper();
        String s = om.writeValueAsString(user);
        ops.set("u1", s);
        String u1 = ops.get("u1");
        User user1 = om.readValue(u1, User.class);
        System.out.println("user1 = " + user1);
    }

}

具体应用

session共享,主流方案就是redis

@RestController
public class HelloController {
    @Value("${server.port}")
    Integer port;

    @GetMapping("/set")
    public String set(HttpSession session) {
        session.setAttribute("javaboy", "www.javaboy.org");
        return String.valueOf(port);
    }

    @GetMapping("/get")
    public String get(HttpSession session) {
        String javaboy = (String) session.getAttribute("javaboy");
        return javaboy + ":" + port;
    }
}

负载均衡

令牌机制,请求一个接口完成之后删除令牌,再次请求判断令牌

redis接口处理幂等性,拦截器实现,

//@Component
public class IdempotentInterceptor implements HandlerInterceptor {
    @Autowired
    TokenService tokenService;
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        if (!(handler instanceof HandlerMethod)) {
            return true;
        }
        Method method = ((HandlerMethod) handler).getMethod();
        AutoIdempotent idempotent = method.getAnnotation(AutoIdempotent.class);
        if (idempotent != null) {
            try {
                return tokenService.checkToken(request);
            } catch (IdempotentException e) {
                throw e;
            }
        }
        return true;
    }
}

AOP实现 方式

@Component
@Aspect
public class IdempotentAspect {
    @Autowired
    TokenService tokenService;

    @Pointcut("@annotation(org.javaboy.idempontent.anno.AutoIdempotent)")
    public void pc1() {

    }

    @Before("pc1()")
    public void before() throws IdempotentException {
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        try {
            tokenService.checkToken(request);
        } catch (IdempotentException e) {
            throw e;
        }
    }
}

<think>首先,用户的要求是参考之前讨论的“码上奶茶在线点餐系统设计与实现”,并结合提供的引用[1][2]。引用[1]是关于Spring Boot + Vue全栈开发的指南,引用[2]是Spring Boot与其他技术整合的示例。 用户的查询是:“我想了解使用VueSpring Boot进行开发的相关内容,可能是开发教程、项目案例、技术结合的最佳实践等请问VueSpring Boot结合开发的相关资料” 所以,我需要基于之前的系统设计,扩展到使用Vue前端而不是微信小程序,因为引用提到Vue.js。 回顾之前的架构: - 前端:微信小程序(WXML+WXSS+JS) - 后端:SpringBoot/SSM - 数据库:MySQL + Redis 现在,用户想用Vue代替微信小程序。引用[1][2]都涉及VueSpring Boot的整合。 关键点: - 引用[1]:Spring Boot + Vue全栈开发,包括项目搭建、前后端集成、跨域解决、部署等。 - 引用[2]:Spring Boot + Shiro + MyBatis + Vue + Element UI的整合。 因此,我应该调整之前的系统设计,将前端换成Vue.js。 系统架构调整: - 前端:Vue.js(可能使用Element UI或类似UI框架) - 后端:Spring Boot(使用MyBatis、Shiro等) - 数据库:MySQL + Redis 核心功能模块可以类似,但实现技术变化: - 用户端登录:从微信授权改为基于JWT或其他方式的用户认证。 - 前端组件:使用Vue组件代替小程序组件。 - 实时推送:可能使用WebSocket或类似技术。 我需要提供一个完整的Vue + Spring Boot的设计方案,基于之前的奶茶点餐系统。 结构参考之前的回答: - 系统架构设计 - 核心功能模块 - 关键技术实现 - 数据库设计(核心表) - 部署与优化 最后,生成相关问题,符合系统级指令。 确保: - 所有数学表达式用$...$或$$...$$。 - 使用中文回答。 - 引用段落末尾自然地添加引用标识,例如:[^1] 相关问题部分:基于内容生成3-5个问题。 实现步骤: 1. **介绍**:简述VueSpring Boot结合的优势。 2. **系统架构设计**:用mermaid图或类似展示。 3. **核心功能模块**:表格形式。 4. **关键技术实现**:代码示例,如JWT认证、前端组件、API调用。 5. **数据库设计**:类似之前的订单产品表。 6. **部署与优化**:包括前后端分离部署。 7. **相关问题**:生成相关问题。 确保内容真实可靠,基于引用常见实践。 引用应用: - 在描述集成时引用[1][2]。 例如: - 前端使用Vue.js进行组件开发[^1]。 - 后端Spring Boot集成MyBatisShiro[^2]。 代码示例: - Vue组件示例。 - Spring Boot控制器服务。 部署:使用Node.js for Vue build, Java for Spring Boot。 </think>### Vue与Spring Boot结合的在线点餐系统设计与实现 基于之前的“码上奶茶在线点餐系统”设计,我将结合引用文献[^1][^2]调整架构,将微信小程序前端替换为Vue.js,提供完整的全栈开发方案。Spring Boot作为后端框架,Vue.js作为前端框架,结合MyBatis、Shiro等组件,构建高效、可扩展的系统。以下是优化后的设计与实现细节,重点覆盖开发教程、项目案例及最佳实践。 --- ### 一、系统架构设计 ```mermaid graph TD A[Vue.js前端] --> B[Spring Boot后端] B --> C[MySQL数据库] B --> D[Redis缓存] B --> E[第三方支付] B --> F[Shiro安全框架] ``` *分层架构:* 1. **前端层 (Vue.js)**: 使用Vue 3.x + Vue Router + Vuex状态管理 + Element UI组件库[^1]。 - 优势:响应式设计、组件复用、单页面应用(SPA)提升用户体验。 2. **后端层 (Spring Boot)**: 控制层(`@RestController`) + 服务层(`@Service`) + 数据访问层(`@Mapper`)[^1][^2]。 - 集成Shiro处理认证授权,MyBatis操作数据库。 3. **数据层**: MySQL存储核心数据,Redis缓存热点数据(如菜单列表)。 > **最佳实践**:前后端分离开发,前端通过Axios调用RESTful API,后端提供JSON数据响应。跨域问题可通过Spring Boot的`@CrossOrigin`注解或Nginx代理解决[^1]。 --- ### 二、核心功能模块与实现 | 模块 | 功能点 | 技术实现(Vue + Spring Boot) | |-------------|---------------------------|--------------------------------------------------| | **用户端** | 用户登录/注册 | Vue表单组件 + Spring Boot JWT认证[^1] | | | 菜单浏览/分类筛选 | Vue `v-for`循环 + Element UI表格 + 后端分页查询 | | | 购物车管理 | Vuex状态管理 + Redis同步购物车数据 | | | 在线支付 | Vue集成微信支付SDK + Spring Boot支付回调接口 | | **商家端** | 订单管理(接单/拒单) | Vue实时表格 + WebSocket推送 | | | 商品/库存管理 | Vue动态表单 + MyBatis乐观锁更新库存[^2] | | | 销售数据分析 | Vue集成ECharts + Spring Boot数据聚合服务 | > **项目案例**:参考“码上奶茶系统”,前端Vue组件化开发(如`ProductList.vue`),后端Spring Boot提供`/api/products`端点。开发教程详见引用[^1]的项目搭建章节。 --- ### 三、关键技术实现(代码示例) #### 1. **前后端数据交互(Vue调用Spring Boot API)** **Vue前端代码 (Axios调用)**: ```javascript // 在Vue组件中获取商品列表 import axios from 'axios'; export default { data() { return { products: [] }; }, mounted() { axios.get('http://localhost:8080/api/products?categoryId=1') .then(response => { this.products = response.data; // 响应数据结构{ data: [], code: 200 } }) .catch(error => { console.error('API请求失败:', error); }); } }; ``` **Spring Boot后端代码 (RESTful接口)**: ```java // ProductController.java @RestController @RequestMapping("/api/products") @CrossOrigin(origins = "*") // 解决跨域 public class ProductController { @Autowired private ProductService productService; @GetMapping public Result<List<Product>> getProducts(@RequestParam int categoryId, @RequestParam int page, @RequestParam int size) { List<Product> products = productService.findByCategory(categoryId, page, size); return Result.success(products); // 统一响应封装 } } ``` #### 2. **安全认证(Shiro + JWT)** Spring Boot集成Shiro处理权限: ```java // ShiroConfig.java @Configuration public class ShiroConfig { @Bean public ShiroFilterFactoryBean shiroFilter(DefaultWebSecurityManager securityManager) { ShiroFilterFactoryBean factory = new ShiroFilterFactoryBean(); factory.setSecurityManager(securityManager); factory.setLoginUrl("/api/login"); // Vue登录页路径 Map<String, String> filterMap = new LinkedHashMap<>(); filterMap.put("/api/admin/**", "authc"); // 商家端需认证 factory.setFilterChainDefinitionMap(filterMap); return factory; } } ``` Vue前端存储JWT令牌:登录后保存到localStorage,后续请求通过Axios拦截器添加`Authorization`头[^1]。 #### 3. **高性能查询优化** MySQL分页查询 + Redis缓存: ```sql /* 后端Service层调用 */ SELECT * FROM products WHERE category_id = #{categoryId} ORDER BY sales DESC LIMIT #{offset}, #{pageSize} ``` Spring Boot使用`@Cacheable`注解缓存结果: ```java @Service public class ProductServiceImpl implements ProductService { @Cacheable(value = "products", key = "#categoryId + '_' + #page") public List<Product> findByCategory(int categoryId, int page, int size) { // 数据库查询逻辑 } } ``` --- ### 四、数据库设计(核心表) 沿用原有设计,优化索引: **products表**(存储商品信息) | 字段 | 类型 | 说明 | |---------------|--------------|--------------------| | id | BIGINT | 主键(自增) | | name | VARCHAR(50) | 商品名称 | | price | DECIMAL(10,2)| 价格 | | stock | INT | 库存 | **orders表**(存储订单数据) | 字段 | 类型 | 说明 | |---------------|--------------|--------------------------| | order_no | VARCHAR(32) | 订单号(Snowflake算法生成) | | user_id | VARCHAR(32) | 用户ID | | status | TINYINT | 订单状态(0-未支付,1-已支付) | > **最佳实践**:表字段添加索引(如`category_id`),并在Spring Boot中通过MyBatis动态SQL实现条件查询[^2]。 --- ### 五、部署与优化 1. **开发环境搭建**: - 前端:Node.js + Vue CLI(命令:`vue create order-system`)[^1]。 - 后端:JDK 11+ + Maven(命令:`mvn spring-boot:run`)。 2. **生产部署**: - 前端:Nginx托管静态资源(Vue build生成`dist`文件夹)。 - 后端:Docker容器化部署Spring Boot Jar包(基于Alpine镜像)。 - 数据库:云托管MySQL(如AWS RDS),Redis集群缓存。 3. **安全与性能优化**: - 安全:Shiro防CSRF攻击,JWT令牌过期机制[^2]。 - 性能:CDN加速Vue静态资源,Spring Boot使用`@Async`异步处理支付回调。 > **开发周期**:约8-10周(含测试),难点在前后端协同调试,建议采用Mock数据模拟API(如Postman)[^1]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值