使用ssm搭建简易教务系统,使用mybatisplus简化操作数据库代码,前端使用thymeleaf进行数据回显,后端返回json数据,与前端ajax进行数据交互,实现页面异步刷新
登陆界面
点击没有账号,则进入注册界面,对学号进入重复检测,使用ajax更新红字部分
点击登录进入首页
信息查询功能包括个人信息查看以及修改
课程信息部分分三个功能
1.课程查询,通过使用mybatisplus插件进行分页
2.教材查询,通过学生所选课程匹配对应的教材,加入购物车功能通过controller返回json数据,前端ajax进行异步刷新,同时使用mybatisplus进行分页
教材查询中点击购物车,则进入购物车界面,该界面可以对订单删除,单个订单支付以及一次支付所有
3.选修课选取部分,通过其数据库保存的上课时间,前端进行判断,打印到相应位置上,同时使用ajax异步刷新选取选修课
点击已选选修课查询,进入选修课查询界面
部分代码展示
购物车代码controller层功能
package com.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.pojo.Cart;
import com.service.BookService;
import com.service.CartService;
import org.apache.ibatis.type.Alias;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.filter.OncePerRequestFilter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@RestController
public class CartController {
@Autowired
private CartService cartService;
@Autowired
private BookService bookService;
//加入购物车操作
@RequestMapping (value = "/add",produces = "text/html;charset=UTF-8")
public String add(Integer bookId,Integer stuId,Integer count){
if (count==null){
return "添加失败,请输入数量";
}
//通过bookid查找book
String bookName = bookService.queryById(bookId).getBookName();
//查询所有购物车订单
for (Cart cart : cartService.getCarts(stuId)) {
//判读订单是否支付,0未支付
if (cart.getState()==0){
if (cart.getBookName().equals(bookName)){
//修改该订单数量
cart.setNumber(cart.getNumber()+count);
cartService.updateCart(cart);
return cart.getBookName();
}
}
}
cartService.insertCart(stuId,bookId,count);
return bookName;
}
//从购物车删除
//返回map时,produces中不能设置为text/html
@RequestMapping(value = "/deleteCart",produces = "application/json;charset=UTF-8")
public Map<String, Object> deleteCart(Integer id, Integer stuId, Integer pageNow){
//创建结合存放键值对返回前端
Map<String, Object> map=new HashMap<>();
//获取删除书名
String bookName="";
if (id!=null){
bookName = cartService.queryCartById(id).getBookName();
}
//删除书本信息
cartService.deleteCart(id);
//获该学生取所订单数据,并分页
Page<Cart> all = cartService.getAll(stuId, pageNow);
//查询订单总数量
Integer count = cartService.getCount(stuId);
//计算所有订单总金额
int priceTotal=0;
List<Cart> carts = cartService.getCarts(stuId);
for (Cart record : carts) {
if(record.getState()!=1){
priceTotal=priceTotal+record.getPrice()*record.getNumber();
}
}
map.put("bookName",bookName);
map.put("cart",all.getRecords());
map.put("count",count);
map.put("priceTotal",priceTotal);
map.put("stuId",stuId);
return map;
}
//单个订单支付功能
@RequestMapping(value = "/pay",produces = "application/json;charset=UTF-8")
public Map<String, Object> pay(Integer id, Integer stuId, Integer pageNow){
//查找要修改的订单
Cart cart = cartService.queryCartById(id);
//根据时间生成支付编号
Long l = System.currentTimeMillis();
//将stat改为1,表示已经支付
cart.setState(1);
//添加支付订单号
cart.setOrderId((int) -l);
//修改订单信息
cartService.updateCart(cart);
//查询订单总数量
Integer count = cartService.getCount(stuId);
//计算所有订单总金额
int priceTotal=0;
List<Cart> carts = cartService.getCarts(stuId);
for (Cart record : carts) {
if(record.getState()!=1){
priceTotal=priceTotal+record.getPrice()*record.getNumber();
}
}
//获该学生取所订单数据,并分页
Page<Cart> all = cartService.getAll(stuId, pageNow);
Map<String,Object> maps=new HashMap<>();
maps.put("cart",all.getRecords());
maps.put("count",count);
maps.put("priceTotal",priceTotal);
maps.put("bookName",cart.getBookName());
maps.put("orderId",(int) -l);
return maps;
}
//支付所有订单
@RequestMapping("/payAll")
public List<Cart> payAll(Integer stuId,Integer pageNow){
//将该学生所有订单的state赋值为1,并添加orderId
for (Cart cart : cartService.getCarts(stuId)) {
if(cart.getState()!=1){
cart.setState(1);
long l = System.currentTimeMillis();
cart.setOrderId((int) -l);
cartService.updateCart(cart);
}
}
//获该学生取所订单数据,并分页
List<Cart> records = cartService.getAll(stuId, pageNow).getRecords();
return records;
}
}
购物车模块前段代码
<!DOCTYPE html>
<html lang="cn" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" type="text/css" th:href="@{/static/bookstrap/css/bootstrap.min.css}">
<script type="text/javascript" th:src="@{/static/js/jquery-3.6.0.js}"></script>
<script th:inline="javascript">
function deleteCart(id,stuId,current) {
$.post("http://localhost:8080/ssm_studentPlus/deleteCart",{"id":id,"stuId":stuId,"pageNow":current},function (data) {
if(data.toString()!=null){
var bookName=data["bookName"]
var count=data["count"]
var priceTotal=data["priceTotal"]
$("#div2").html("成功删除"+bookName+"商品")
$("#div").html("未支付订单数量共"+count+"单,总价格为"+priceTotal+"元")
//更新订单信息
var cart=data["cart"]
var html=""
for(var i in cart){
if(cart[i].state==1){
html+="<tr>\n" +
" <td class="td" >"+cart[i].bookName+"</td>\n" +
" <td class="td" >"+cart[i].number+"本</td>\n" +
" <td class="td">"+cart[i].price+"元</td>\n" +
" <td class="td">"+cart[i].number*cart[i].price+"元</td>\n" +
" <td class="td">"+cart[i].orderId+"</td>\n" +
" </tr>"
}else{
html+="<tr>\n" +
" <td class="td" >"+cart[i].bookName+"</td>\n" +
" <td class="td" >"+cart[i].number+"本</td>\n" +
" <td class="td">"+cart[i].price+"元</td>\n" +
" <td class="td">"+cart[i].number*cart[i].price+"元</td>\n" +
" <td class="td"><button class="btn btn-outline-secondary" onclick="deleteCart("+cart[i].id+","+stuId+","+current+")">删除</button> <button class="btn btn-outline-secondary">支付</button> </td>\n" +
" </tr>"
}
}
$("#context").html(html)
}
})
}
//支付功能
function pay(id,stuId,current) {
$.post("http://localhost:8080/ssm_studentPlus/pay",{"id":id,"stuId":stuId,"pageNow":current},function (data) {
if(data.toString()!=null){
var cart=data["cart"]
var orderId=data["orderId"]
var count=data["count"]
var priceTotal=data["priceTotal"]
var bookName=data["bookName"]
$("#div2").html("成功支付"+bookName+"商品")
$("#div").html("未支付订单数量共"+count+"单,总价格为"+priceTotal+"元")
var html=""
for (var i in cart){
if (cart[i].state==1){
html+="<tr>\n" +
" <td class="td">"+cart[i].bookName+"</td>\n" +
" <td class="td">"+cart[i].number+"本</td>\n" +
" <td class="td">"+cart[i].price+"元</td>\n" +
" <td class="td">"+cart[i].number*cart[i].price+"元</td>\n" +
" <td class="td">"+cart[i].orderId+"</td>\n" +
" </tr>"
}else {
html+="<tr>\n" +
" <td class="td">"+cart[i].bookName+"</td>\n" +
" <td class="td">"+cart[i].number+"本</td>\n" +
" <td class="td">"+cart[i].price+"元</td>\n" +
" <td class="td">"+cart[i].number*cart[i].price+"元</td>\n" +
" <td class="td"><button class="btn btn-outline-secondary" onclick="deleteCart("+cart[i].id+","+stuId+","+current+")">删除</button> <button onclick="pay("+cart[i].id+","+stuId+","+current+")" class="btn btn-outline-secondary">支付</button> </td>\n" +
" </tr>"
}
}
$("#context").html(html)
}
})
}
$(function () {
//支付所有订单
$("#payall").click(function () {
$.post("http://localhost:8080/ssm_studentPlus/payAll",{"stuId":$("#stu").val(),"pageNow":$("#current").val()},function (data) {
var html=""
for (var i=0;i<data.length;i++){
html+="<tr>\n" +
" <td class="td">"+data[i].bookName+"</td>\n" +
" <td class="td">"+data[i].number+"本</td>\n" +
" <td class="td">"+data[i].price+"元</td>\n" +
" <td class="td">"+data[i].number*data[i].price+"元</td>\n" +
" <td class="td">"+data[i].orderId+"</td>\n" +
" </tr>"
}
$("#context").html(html)
$("#div2").html("成功支付所有商品")
$("#div").html("未支付订单数量共0单,总价格为0元")
})
})
})
</script>
<style>
body{
background-image: url("http://localhost:8080/ssm_studentPlus/static/img/school.jpg");
background-size: 100% 100%;
background-attachment: fixed;
}
#box1{
background: rgba(255,255,255,0.8);
width: 100%;
height: 100vh;
position: absolute;
top: 0;
left: 0;
}
#box2{
background:lightgray;
box-shadow: 5px 5px 10px gray;
width: 80%;
height: 80vh;
position: absolute;
top: 10%;
left: 10%;
}
.td{
width: 170px;
height: 50px;
text-align: center;
font-size: 1.2pc;
border: 1.3px black solid;
}
#box3{
position: absolute;
top: 90%;
left: 38%;
}
#div{
position: absolute;
top: 73%;
left: 3%;
font-size: 1.5pc;
color: red;
}
#div2{
position: absolute;
top: 73%;
left: 76%;
font-size: 1.5pc;
color: red;
}
</style>
</head>
<body>
<div id="box1">
<div id="box2">
<div style="font-size: 1.8pc;text-align: center">购物车</div>
<table border="1" cellspacing="0" align="center" style="margin-top: 2%;">
<tr>
<td class="td">书名</td>
<td class="td">数量</td>
<td class="td">单价</td>
<td class="td">总价</td>
<td class="td">操作</td>
</tr>
<tbody id="context">
<tr th:each="cart:${page.records}">
<td class="td" th:text="${cart.bookName}"></td>
<td class="td" >[[${cart.number}]]本</td>
<td class="td">[[${cart.price}]]元</td>
<td class="td">[[${cart.number*cart.price}]]元</td>
<td class="td" th:if="${cart.state==1}">[[${cart.orderId}]]</td>
<td class="td" th:if="${cart.state==0}"><button class="btn btn-outline-secondary" th:onclick="deleteCart([[${cart.id}]],[[${stuId}]],[[${page.current}]])">删除</button> <button th:onclick="pay([[${cart.id}]],[[${stuId}]],[[${page.current}]])" class="btn btn-outline-secondary">支付</button> </td>
</tr>
</tbody>
<tr>
<td class="td" colspan="5"><button id="payall" class="btn btn-outline-secondary">支付所有订单</button> </td>
</tr>
</table>
<input type="hidden" th:value="${stuId}" id="stu">
<input type="hidden" th:value="${page.current}" id="current">
<div id="div">未支付订单数量为[[${count}]]单,总价格为[[${totalPrice}]]元</div>
<div id="div2"></div>
<!-- 分页-->
<div th:replace="common::#box3"></div>
</div>
</div>
</body>
</html>
购物车sevice层代码
package com.service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.mapper.BookMapper;
import com.mapper.CartMapper;
import com.mapper.CoursesMapper;
import com.pojo.Book;
import com.pojo.Cart;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class CartServiceImpl implements CartService{
@Autowired
private BookMapper bookMapper;
@Autowired
private CartMapper cartMapper;
@Override
public Page<Cart> getAll(Integer id,Integer pageNow) {
QueryWrapper<Cart> cartQueryWrapper = new QueryWrapper<>();
cartQueryWrapper.eq("stuId",id);
if (pageNow==null){
pageNow=1;
}
Page<Cart> cartPage = new Page<>(pageNow,3);
Page<Cart> cartPage1 = cartMapper.selectPage(cartPage, cartQueryWrapper);
return cartPage1;
}
@Override
public Integer getCount(Integer id) {
QueryWrapper<Cart> cartQueryWrapper = new QueryWrapper<>();
cartQueryWrapper.eq("stuId", id);
cartQueryWrapper.eq("state",0);
return cartMapper.selectCount(cartQueryWrapper);
}
@Override
public List<Cart> getCarts(Integer stuId) {
QueryWrapper<Cart> wrapper = new QueryWrapper<>();
wrapper.eq("stuId",stuId);
return cartMapper.selectList(wrapper);
}
@Override
public void insertCart(Integer stuId, Integer bookId, Integer count) {
Book book = bookMapper.selectById(bookId);
Cart cart = new Cart(null, book.getBookName(), count, book.getPrice(), 0, stuId, 0);
cartMapper.insert(cart);//自动生成id
}
//修改订单
@Override
public void updateCart(Cart cart) {
cartMapper.updateById(cart);
}
@Override
public void deleteCart(Integer id) {
cartMapper.deleteById(id);
}
@Override
public Cart queryCartById(Integer id) {
Cart cart = cartMapper.selectById(id);
return cart;
}
}
购物车实体类
package com.pojo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
public class Cart {
@TableId(type = IdType.AUTO)
private Integer id;
private String bookName;
private Integer number;
private Integer price;
private Integer state;//支付状态,0表示未支付,1表示已支付
private Integer stuId;
private Integer orderId;//支付成功的订单号
public Cart(Integer id, String bookName, Integer number, Integer price, Integer state, Integer stuId, Integer orderId) {
this.id = id;
this.bookName = bookName;
this.number = number;
this.price = price;
this.state = state;
this.stuId = stuId;
this.orderId = orderId;
}
@Override
public String toString() {
return "CartController{" +
"id=" + id +
", bookName='" + bookName + ''' +
", number=" + number +
", price=" + price +
", state=" + state +
", stuId=" + stuId +
", orderId=" + orderId +
'}';
}
public Integer getOrderId() {
return orderId;
}
public void setOrderId(Integer orderId) {
this.orderId = orderId;
}
public Integer getStuId() {
return stuId;
}
public void setStuId(Integer stuId) {
this.stuId = stuId;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public Integer getNumber() {
return number;
}
public void setNumber(Integer number) {
this.number = number;
}
public Integer getPrice() {
return price;
}
public void setPrice(Integer price) {
this.price = price;
}
public Integer getState() {
return state;
}
public void setState(Integer state) {
this.state = state;
}
public Cart() {
}
}
购物车mapper层
package com.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.pojo.Cart;
import org.springframework.stereotype.Repository;
@Repository
public interface CartMapper extends BaseMapper<Cart> {
}