简介
简易的商品管理系统,主要用springboot + mybatis +thymeleaf
注意 链接的mysql数据库是8.0版本 如果自己运行 可能会遇到mysql数据库版本问题造成的影响
此系统 主要是看b战狂神说 springboot实战模仿写的
前端的页面也是搜的模板,只是简单的商品的增删改查。
如果发现错误是啥 谢谢联系我
此系统已被推到 服务器 可以在线访问 地址是:http://120.55.192.105:8080/
账号:admin@123.com
密码: 123456
源码和访问系统
点击获取
有帮助的进入点个星星
系统地址:http://120.55.192.105:8080/
账号:admin@123.com
密码: 123456
页面样式
页面及数据库表结构
由于本系统并不复杂,且库存管理就只有一个展示功能,所以表之间的级联关系几乎没有。此下为其中两个表结构
各模块功能及源码解析
登录功能以及拦截器功能
以下所有代码都只是截取
登录功能,主要是controller文件夹下的loginController.java文件和Mapper文件夹下的UserMapper.java文件。最后是操作数据库的mybatis.mapper下面的userMapper.xml文件
loginController.java
@Controller
/**@Controller 是标记在类LoginController上面的,所以类MyController 就是一个SpringMVC Controller 对象了,然后使用@RequestMapping(“/user/login”) 标记在Controller 方法上,表示当请求/user/login 的时候访问的是LoginController的queryUserByName方法,
这其中的queryUserByName方法就是对在视图层用户输入的username与数据库中的比较,如果有且密码正确,则登录成功
*/
public class LoginController {
@Autowired
private UserMapper userMapper;
@RequestMapping("/user/login")
public String queryUserByName(
@RequestParam("username") String username,
@RequestParam("password") String password,
Model model, HttpSession session
){
if(password.equals(user.getPassword())){
session.setAttribute("loginUser",username);
return "index";
}else{
model.addAttribute("msg","用户名或者密码错误");
return "login";
}
}
}
UserMapper.java //进行一些业务方法,比如查找用户表
@Mapper
@Repository
public interface UserMapper {
List<User> queryUserList();
// User queryUserById(int id);
User queryUserByName(String username);
// int addUser(User user);
// int updateUser(User user);
// int delete(int id);
}
UserMapper.xml 用于对数据库的操作,注意这是mybatis的简单语法
<?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.example.springbootweb.mapper.UserMapper">
<select id="queryUserList" resultType="User">
select * from manager;
</select>
<select id="queryUserByName" resultType="User">
select * from manager where username=#{username};
</select>
</mapper>
登录拦截功能:主要是用于对没用登录的用户是没有权限访问库存管理和商品管理页面。主要处理页面是在config文件夹下LoginHandlerInterceptor文件,和MyMvcconfig文件的addInterceptor方法;
LoginHandlerInterceptor.java
public class LoginHandlerInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 登录成功之后,应该有用户的session
Object loginUser = request.getSession().getAttribute("loginUser");
System.out.println(loginUser);
if(loginUser == null){
request.setAttribute("msg","请先登录才可以进行下列操作 ");
request.getRequestDispatcher("/").forward(request,response);
return false;
}else {
return true;
}
}
}
MyMvcconfig.java
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginHandlerInterceptor())
.addPathPatterns("/**").excludePathPatterns("/","/login.html","/user/login");
}
//上面把除开login.html","/user/login"登录界面的其他界面都拦截了
商品管理功能和价格分析功能
商品增删改查WaresController.javaWaresMapper.java,waresMapper.xml和
Pojo实体类文件的Wares.java中可完成此功能:
/** @Data
@AllArgsConstructor
@NoArgsConstructor
这几个注解是引用了lombok的简写,可以直接引入实体类的get,set方法,和有无参数的构造方法
*/
Wares.java
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Wares {
private Integer id;
private String name;
private Integer price;
private String type;
}
WaresController.java
@Controller
public class WaresController {
@Autowired
private WaresMappper waresMappper;
@RequestMapping("/waresMap")
public String list(Model model){
List<Wares> waresMap = waresMappper.queryWaresList();
model.addAttribute("waresMap",waresMap);
System.out.println(waresMap);
return "responsive_table";
}
@PostMapping("/wares")
public String addWares(Wares wares){
waresMappper.addWares(wares);
return "redirect:waresMap";
}
// 到达修改页面
@GetMapping("/{id}")
public String toModify(@PathVariable("id")Integer id,Model model){
Wares wares = waresMappper.queryWaresById(id);
// 返回商品信息
model.addAttribute("wares",wares);
return "modify";
}
//
商品的信息的修改
@PostMapping("/modify")
public String modify(Wares wares){
waresMappper.updateWares(wares);
return "redirect:waresMap";
}
@GetMapping("/del{id}")
public String del(@PathVariable("id")Integer id){
waresMappper.delete(id);
return "redirect:waresMap";
}
}
WaresMapper.xml //一系列操作数据库的方法
@Mapper
@Repository
public interface WaresMappper {
List<Wares> queryWaresList();
Wares queryWaresById(int id);
List<Wares> queryWaresByType(String type);
Wares queryWaresByName(String name);
Object addWares(Wares wares);
Object updateWares(Wares wares);
Object delete(int id);
}
waresMapper.xml //操作数据库
将后端请求到的同一类的商品的价格用javascript处理,再用echarts渲染
<?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.example.springbootweb.mapper.WaresMappper">
<select id="queryWaresList" resultType="Wares">
select * from ware;
</select>
<select id="queryWaresById" resultType="Wares">
select * from ware where id=#{id}
</select>
<select id="queryWaresByType" resultType="Wares">
select * from ware where type=#{type}
</select>
<select id="queryWaresByName" resultType="Wares">
select * from ware where username=#{username};
</select>
<select id="addWares" parameterType="Wares">
insert into ware (id ,name,price,type) values (#{id},#{name},#{price},#{type})
</select>
<select id="updateWares" parameterType="Wares">
update ware set name=#{name},price=#{price},type=#{type} where id=#{id}
</select>
<select id="delete" parameterType="int">
delete from ware where id=#{id}
</select>
</mapper>
库存管理功能
库存管理和商品管理基本上差不多,处理逻辑相同的,所以这部分内容我并没有在数据库建表,直接在自己用Map建立假数据。代码基本上是在Dao文件下的goodsdao.java和goodsController.java文件。
goodsdao.java
package com.example.springbootweb.Dao;
import com.example.springbootweb.pojo.Department;
import com.example.springbootweb.pojo.Goods;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
//员工dao
@Repository
public class GoodsDao {
// 模拟数据库中的操作
private static Map<Integer, Goods> goodsArr;
// 员工有所属的部门
static{
goodsArr = new HashMap<Integer, Goods>();//
goodsArr.put(1001,new Goods(1,"apple",20,"fruit",1000,20,"熊梓淇"));
goodsArr.put(1002,new Goods(2,"banana",10,"fruit",200,10,"熊梓淇"));
goodsArr.put(1003,new Goods(3,"computer",5000,"e-goods",12000,365,"刘辉"));
goodsArr.put(1004,new Goods(4,"phone",2000,"e-goods",10300,365,"刘辉"));
goodsArr.put(1005,new Goods(5,"keyboard",200,"e-goods",10400,500,"刘辉"));
}
// 主键自增
private static Integer initId = 1006;
// 增加一个员工
public void save(Goods goods){
if(goods.getId()==null){
goods.setId(initId++);
}
goodsArr.put(goods.getId(),goods);
}
// 查询全goodsArr
public Collection<Goods> getAll(){
return goodsArr.values();
}
// 通过id查询员工
public Goods getEmployeeById(Integer id){
return goodsArr.get(id);
}
// 删除员工通过id
public void delete(Integer id){
goodsArr.remove(id);
}
}
GoodsController.java
@Controller
public class GoodsController {
@Autowired
GoodsDao goodsDao;
/** 这里由于实在是业务逻辑处理和商品管理完全相同 所以只有一个查询方法*/
@RequestMapping("/goodsArr")
public String list(Model model){
Collection<Goods> goodsArr = goodsDao.getAll();
model.addAttribute("goodsArr",goodsArr);
System.out.println(goodsArr);
return "basic_table";
}
}