目录
完整项目放在GitHub上了:https://github.com/gjhj030108/guojun112
实体类
package com.guo.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Product implements Serializable {
private Integer id;
private String name; // 产品名称
private Double rate; // 年化利率
private Double amount; // 募集总金额
private Double raised; // 已募集金额
private Integer cycle; // 产品周期
private String endTime; // 募集结束日期
public void setId(Integer id) {
this.id = id;
}
}
dao层
package com.guo.dao;
import com.guo.pojo.Product;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface ProductDao {
//增加产品
void insertProduct(Product product);
//根据id删除一个Product
int deleteProductById(int id);
//通过id查产品,用于更新产品
Product queryProductById(int id);
//更新Product
int updateProduct(Product product);
//获取总交易额
Double selectTurnover(String date);
//查询所有产品
List<Product> selectAllProducts();
//通过name查产品
List<Product> selectProductsByName(String name);
}
xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.guo.dao.ProductDao">
<!--增加产品-->
<insert id="insertProduct">
insert into ssm.product(name,rate,amount,raised,cycle,endTime)
values(#{name},#{rate},#{amount},#{raised},#{cycle},#{endTime})
</insert>
<!--根据id删除一个Product-->
<delete id="deleteProductById" parameterType="int">
delete from ssm.product
where id=#{id}
</delete>
<!--通过id查产品,用于更新产品-->
<select id="queryProductById" resultType="Product">
select * from ssm.product
where id =#{id}
</select>
<!--更新product-->
<update id="updateProduct" parameterType="Product">
update ssm.product
set name = #{name},rate = #{rate},amount = #{amount},raised = #{raised},cycle = #{cycle},endTime = #{endTime}
where id = #{id}
</update>
<!--获取总交易额-->
<select id="selectTurnover" resultType="double">
select SUM(raised)
from ssm.product
where endTime is not null and endTime < #{date}
</select>
<!--查询所有产品-->
<select id="selectAllProducts" resultType="Product">
select id,name,rate,amount,raised,cycle,endTime
from ssm.product
</select>
<!--通过name查产品-->
<select id="selectProductsByName" resultType="Product">
select id,name,rate,amount,raised,cycle,endTime
from ssm.product
where name like '%' #{name} '%'
</select>
</mapper>
service层
package com.guo.service;
import com.guo.pojo.Product;
import java.util.List;
public interface ProductService {
//增加产品
void saveProduct(Product product);
//根据id删除一个Product
int deleteProductById(int id);
//更新Product
int updateProduct(Product product);
//通过id查产品,用于更新产品
Product queryProductById(int id);
//获取总交易额
Double findTurnover();
//查询所有产品
List<Product> findAllProducts();
//通过name查产品
List<Product> findProductsByName(String name);
}
实现类
package com.guo.service.impl;
import com.guo.pojo.Product;
import com.guo.dao.ProductDao;
import com.guo.service.ProductService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.redis.core.BoundValueOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.concurrent.TimeUnit;
@Service
public class ProductServiceImpl implements ProductService {
@Autowired
private ProductDao dao;
/*//总交易额
@Override
@Cacheable(value = "guojun", key = "'turnover'")
public Double findTurnover() {
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
return dao.selectTurnover(sdf.format(date));
}*/
@Autowired
private RedisTemplate<Object, Object> template;
@Override
public Double findTurnover() {
// 获取Redis操作对象
BoundValueOperations<Object, Object> ops = template.boundValueOps("turnover");
// 从缓存获取turnover
Object turnover = ops.get();
// 双重检测锁
if (turnover == null) {
synchronized (this) {
turnover = ops.get();
// 若缓存中没有,则从DB中查询
if (turnover == null) {
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
turnover = dao.selectTurnover(sdf.format(date));
// 将从DB中查询的结果写入到缓存,并指定过期时间
ops.set(turnover, 100, TimeUnit.SECONDS);
}
}
}
return (Double)turnover;
}
//更新产品
@Override
/*清除缓存是清除当前value值空间下的所有缓存数据*/
@CacheEvict(value = "guojun", allEntries = true)
public int updateProduct(Product product) {
return dao.updateProduct(product);
}
//删除产品
@Override
/*清除缓存是清除当前value值空间下的所有缓存数据*/
@CacheEvict(value = "guojun", allEntries = true)
public int deleteProductById(int id) {
return dao.deleteProductById(id);
}
//查找所有产品
@Override
@Cacheable(value = "guojun", key = "'allproducts'")
public List<Product> findAllProducts() {
return dao.selectAllProducts();
}
//根据name查产品
@Override
@Cacheable(value = "guojun", key = "'name'")
public List<Product> findProductsByName(String name) {
return dao.selectProductsByName(name);
}
//插入产品
@Override
/*清除缓存是清除当前value值空间下的所有缓存数据*/
@CacheEvict(value = "guojun", allEntries = true)
public void saveProduct(Product product) {
dao.insertProduct(product);
}
//通过id查找产品
@Override
@Cacheable(value = "guojun", key = "'id'")
public Product queryProductById(int id) {
return dao.queryProductById(id);
}
}
controller
package com.guo.controller;
import com.guo.pojo.Product;
import com.guo.pojo.User;
import com.guo.service.ProductService;
import com.guo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpSession;
import java.util.List;
@Controller
public class ProductController {
@Autowired
private ProductService service;
@Autowired
private UserService userservice;
//主页
@RequestMapping("/product")
public String index(Model model) {
// 查询平台总交易额
Double turnover = service.findTurnover();
model.addAttribute("turnover", turnover);
// 查询所有产品
List<Product> products = service.findAllProducts();
model.addAttribute("allProducts", products);
return "/allProduct.jsp";
}
@RequestMapping("/toAddProduct")
public String toAddProduct() {
return "/addProduct.jsp";
}
// 处理新产品上架请求
@RequestMapping("/addProduct")
public String registerProduct(Product product, Model model) {
// 将新产品写入到数据库
service.saveProduct(product);
// 查询所有产品
List<Product> products = service.findAllProducts();
model.addAttribute("allProducts", products);
return "redirect:/product";
}
// 处理产品删除请求
@RequestMapping("/del/{id}")
public String deleteProduct(@PathVariable("id") int id) {
service.deleteProductById(id);
return "redirect:/toManager";
}
// 处理产品更新请求
@RequestMapping("/toUpdateProduct")
public String toUpdateProduct(Model model, int id) {
Product product = service.queryProductById(id);
model.addAttribute("product", product);
return "/updateProduct.jsp";
}
@RequestMapping("/updateProduct")
public String updateBook(Model model, Product product) {
service.updateProduct(product);
return "redirect:/toManager";
}
// 处理根据产品名称查询请求
@RequestMapping("/product/name")
public String listProducts(String name, Model model) {
// 根据产品名称查询产品
List<Product> result = service.findProductsByName(name);
model.addAttribute("result", result);
model.addAttribute("name", name);
return "/result.jsp";
}
// 管理页面
@RequestMapping("/toManager")
public String manager(Model model) {
// 查询所有产品
List<Product> products = service.findAllProducts();
model.addAttribute("allProducts", products);
return "/manager.jsp";
}
//登录页面
@RequestMapping("/login")
public String login(){
return "/login.jsp";
}
@RequestMapping("/tologin")
public String login(String username, String password, Model model, HttpSession httpSession){
//查询用户,为空则用户名或密码错误,反则正确
User user = userservice.login(username,password);
if (user == null){
//登录失败
model.addAttribute("msg","密码错误");
return "/login";
}
//将user存入session
httpSession.setAttribute("user", user);
return "/product";
}
//处理登出请求
@RequestMapping("/toLoginout")
public String goOut(HttpSession session){
//移除session
session.removeAttribute("user");
return "/login";
}
}
登录拦截器(SpringBoot 实现登录拦截器(实战版) - 腾讯云开发者社区-腾讯云 (tencent.com))参考这个实现了通过session判断过滤请求。
/*
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
HttpSession session = request.getSession();
if(request.getRequestURI().contains("goLogin")) {
return true;
}
if(request.getRequestURI().contains("login")) {
return true;
}
if (session.getAttribute("userLoginInfo") != null) {
return true;
}
request.getRequestDispatcher("/login.jsp").forward(request,response);
return false;
}
}
*/
package com.guo.config;
import com.guo.pojo.User;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class UserLoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
try {
HttpSession session = request.getSession();
//统一拦截(查询当前session是否存在user)
User user = (User) session.getAttribute("user");
if (user != null) {
return true;
}
//为空重新登录
response.sendRedirect("/login");
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
}
/*
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
HttpSession session = request.getSession();
if(request.getRequestURI().contains("goLogin")) {
return true;
}
if(request.getRequestURI().contains("login")) {
return true;
}
if (session.getAttribute("userLoginInfo") != null) {
return true;
}
request.getRequestDispatcher("/login.jsp").forward(request,response);
return false;
}
}
*/
package com.guo.config;
import com.guo.pojo.User;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class UserLoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
try {
HttpSession session = request.getSession();
//统一拦截(查询当前session是否存在user)
User user = (User) session.getAttribute("user");
if (user != null) {
return true;
}
//为空重新登录
response.sendRedirect("/login");
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
}
.yml配置
#配置端口号
server:
port: 8080
servlet:
context-path: /
session:
timeout: 600s
# 配置mybatis
mybatis:
# 注册映射文件
mapper-locations: classpath:com/guo/dao/*.xml
# 注册实体类所在的包,为实体类注册别名(便于xml配置)
type-aliases-package: com.guo.pojo
# 注册数据源
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/ssm?useSSL=false&useUnicode=true&characterEncoding=UTF-8&allowPublicKeyRetrieval=true
username: root
password: gj001212
redis:
host: redisOS7
port: 6379
cache:
# 指定缓存类型
type: redis
# 指定当前应用所使用的缓存空间的名称
cache-names: guojun
logging:
level:
com.guo.dao: debug