银行业务管理系统
文章目录
一、功能介绍
1.设备:属性至少3个以上,包括并不限于设备类型、设备名称、初始状态……
2.添加设备
3.删除设备
4.更新设备
5.查找设备(名字),显示查询结果。
6.分页查询
7.排序
二、实现过程
2.1 开发环境与开发工具
1、项目开发工具:IDE - IDEA
1、java运行环境:java jdk20,因为我习惯用这个版本,其他版本也可以用,自行抉择。
2、数据库:远程数据库(腾讯云的)
3、Maven3.1.1
前端:HTML+BootStrap+JavaScript
后端:Springboot +JPA+thymeleaf+MySQL
2.2 创建项目
添加依赖
2.3 工程结构
Maven开发项目结构如下
2.4 model层
存放实体类:有业务者姓名、性别、银行账号、业务状态,一个实体类对应一个数据表,其中的属性对应数据表中的字段。
添加注解@Date主要是帮助解决Setter 和 Getter以及 toString这种重复的无脑工作
加入@Data注解可以直接帮助我们添加实体类相应的Setter 和 Getter以及 toString
需要自己添加jar包或pom依赖。
代码示例:
package com.example.bankaccesssystem.model;
import jakarta.persistence.*;
import lombok.Data;
@Data
@Entity
@Table(name = "banks")
public class Bank {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@Column(name = "book_name") //办业务者名字
private String bookName;
@Column(name = "gender") //办业务者性别
private String gender;
@Column(name = "account") //办业务者银行账号
private String account;
@Column(name = "state") //存钱还是取钱的状态
private String state;
}
2.5 service层
业务层:它负责业务逻辑处理,和我们开发项目的需求息息相关,它有接口和接口实现类。设计功能是获取业务者信息、新增业务者信息、删除指定ID的业务者信息、查询业务者信息、更新业务者信息。
代码示例:
package com.example.bankaccesssystem.service;
import com.example.bankaccesssystem.model.Bank;
import org.springframework.data.domain.Page;
import java.util.List;
public interface BankService {
//获取业务者姓名
List<Bank> getAllBank();
//新增/更新一个业务者信息
void saveBank(Bank bank);
//获取指定ID的业务者
Bank getBankByTd(long id);
//删除指定ID的业务者
void deleteBankById(long id);
//分页
Page<Bank> findPaginated(int pageNo, int pageSize, String sortField, String sortDirection);
//根据业务者姓名查询
List<Bank> findAllByBookName(String bookName);
}
2.5.1 BankServicrImpl类是用来存放接口的实现类
代码示例:
package com.example.bankaccesssystem.service;
import com.example.bankaccesssystem.model.Bank;
import com.example.bankaccesssystem.repository.BankRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Optional;
@Service
public class BankServiceImpl implements BankService{
@Autowired
private BankRepository bankRepository;
@Override
public List<Bank> getAllBank() {
return bankRepository.findAll();
}
@Override
public void saveBank(Bank bank) {
this.bankRepository.save(bank);
}
@Override
public Bank getBankByTd(long id) {
//调用数据访问层查找指定ID的员工,返回Optional对象
Optional< Bank > optional = bankRepository.findById(id);
Bank bank = null;
//如果存在指定id的员工
if (optional.isPresent()) {
//从Optional对象中获取员工对象
bank = optional.get();
} else {
//否则抛出运行时异常
throw new RuntimeException(" 找不到员工ID :: " + id);
}
return bank;
}
@Override
public void deleteBankById(long id) {
this.bankRepository.deleteById(id);
}
@Override
public Page<Bank> findPaginated(int pageNo, int pageSize, String sortField, String sortDirection) {
//设置排序参数,升序ASC/降序DESC?
Sort sort = sortDirection.equalsIgnoreCase(Sort.Direction.ASC.name())
? Sort.by(sortField).ascending()
: Sort.by(sortField).descending();
//根据页号/每页记录数/排序依据返回某指定页面数据。
Pageable pageable = PageRequest.of(pageNo - 1, pageSize, sort);
return this.bankRepository.findAll(pageable);
}
@Override
public List<Bank> findAllByBookName(String bookName) {
List<Bank> name = bankRepository.findAllByBookName(bookName);
return name;
}
}
2.6 repository层
在Spring中有Repository的概念,repository原意指的是仓库,即数据仓库的意思。Repository居于业务层和数据层之间,将两者隔离开来,在它的内部封装了数据查询和存储的逻辑。
代码示例:
package com.example.bankaccesssystem.repository;
import com.example.bankaccesssystem.model.Bank;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import java.util.List;
public interface BankRepository extends JpaRepository<Bank, Long> {
@Query("select b from Bank b where b.bookName like %:bookName%")
List<Bank> findAllByBookName(@Param("bookName") String bookName);
}
2.7 controller层
在MVC(Model-View-Controller)架构中,Controller层是整个Web应用程序的核心,它承担了接收和处理用户请求,调用Service层进行业务处理,然后返回请求结果给前端页面的任务。
代码示例:
package com.example.bankaccesssystem.controller;
import com.example.bankaccesssystem.model.Bank;
import com.example.bankaccesssystem.service.BankService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@Controller
public class BankController {
@Autowired
private BankService bankService;
// display list of employees
// @GetMapping("/")
// public String viewHomePage(Model model) {
// model.addAttribute("listEmployees", employeeService.getAllEmployees());
// return "index";
// }
// 跳转
@GetMapping("/")
public String viewHomePage(Model model) {
return findPaginated(1, "bookName", "asc", model);
}
@GetMapping("/showNewBankForm")
public String showNewBankForm(Model model) {
// create model attribute to bind form data
Bank bank = new Bank();
model.addAttribute("bank", bank);
return "new_bank";
}
@GetMapping("/query{inpname}")
public String query(@PathVariable(value = "inpname") String inpame, Model model) {
List<Bank> listgender = bankService.findAllByBookName(inpame);
model.addAttribute("listBank", listgender);
return "index";
}
//添加
@PostMapping("/saveBank")
public String saveBank(@ModelAttribute("bank") Bank bank) {
// save employee to database
bankService.saveBank(bank);
return "redirect:/";
}
//更新跳转
@GetMapping("/showFormForUpdate/{id}")
public String showFormForUpdate(@PathVariable(value = "id") long id, Model model) {
// get employee from the service
Bank bank = bankService.getBankByTd(id);
// set employee as a model attribute to pre-populate the form
model.addAttribute("bank", bank);
return "update_bank";
}
//删除
@GetMapping("/deleteBank/{id}")
public String deleteBank(@PathVariable(value = "id") long id) {
// call delete employee method
this.bankService.deleteBankById(id);
return "redirect:/";
}
//获取分页数据
@GetMapping("/page/{pageNo}")
public String findPaginated(@PathVariable (value = "pageNo") int pageNo,
@RequestParam("sortField") String sortField,
@RequestParam("sortDir") String sortDir,
Model model) {
int pageSize = 5;
//分页查询
Page<Bank> page = bankService.findPaginated(pageNo, pageSize, sortField, sortDir);
List<Bank> listBank = page.getContent();
model.addAttribute("currentPage", pageNo);
model.addAttribute("totalPages", page.getTotalPages());
model.addAttribute("totalItems", page.getTotalElements());
model.addAttribute("sortField", sortField);
model.addAttribute("sortDir", sortDir);
model.addAttribute("reverseSortDir", sortDir.equals("asc") ? "desc" : "asc");
model.addAttribute("listBank", listBank);
return "index";
}
}
2.8 创建视图
index.html页面代码
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<style>
img{
position: absolute;
top:0;
bottom: 0;
left:0%;
right: 0%;
width: 12%;
}
</style>
<meta charset="UTF-8">
<meta charset="ISO-8859-1">
<title>Bank Management System</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css" integrity="sha384-xOolHFLEh07PJGoPkLv1IbcEPTNtaed2xpHsD9ESMhqIYd0nLMwNLD69Npy4HI+N" crossorigin="anonymous">
</head>
<body>
<div class="container my-2">
<h1 class="text-primary">银行业务管理系统</h1>
<br/>
<!--存储业务者信息-->
<nav class="navbar navbar-light bg-light">
<a th:href = "@{/showNewBankForm}" class="btn btn-primary btn-sm mb-3"> 操作页面 </a>
<!--根据业务者姓名查询业务者状态-->
<form id="query-form" action="/query" method="get">
<h6 class="text-secondary">信息查询</h6><input type="text" id="name-input" name="inpname" placeholder="姓名">
<button type="button" class="btn btn-primary"onclick="queryBank()">搜索</button>
</form>
<script>
function queryBank() {
<!--将输入框输入的内容上传到url-->
var bookName = document.getElementById("name-input").value;
var url = "/query" + encodeURIComponent(bookName);
window.location.href = url;
}
</script>
</nav>
<table border="1" class = "table table-striped table-responsive-md">
<thead>
<tr class="table-primary">
<th>
<a th:href="@{'/page/' + ${currentPage} + '?sortField=bookName&sortDir=' + ${reverseSortDir}}">
业务者姓名</a>
</th>
<th>
<a th:href="@{'/page/' + ${currentPage} + '?sortField=gender&sortDir=' + ${reverseSortDir}}">
业务者性别</a>
</th>
<th>
<a th:href="@{'/page/' + ${currentPage} + '?sortField=account&sortDir=' + ${reverseSortDir}}">
业务者银行账号</a>
</th>
<th>
<a th:href="@{'/page/' + ${currentPage} + '?sortField=state&sortDir=' + ${reverseSortDir}}">
状态</a>
</th>
<th> 业务信息 </th>
</tr>
</thead>
<tbody>
<tr th:each="bank : ${listBank}">
<td th:text="${bank.bookName}"></td>
<td th:text="${bank.gender}"></td>
<td th:text="${bank.account}"></td>
<td th:text="${bank.state}"></td>
<td> <a th:href="@{/showFormForUpdate/{id}(id=${bank.id})}" class="btn btn-primary">更新</a>
<a th:href="@{/deleteBank/{id}(id=${bank.id})}" class="btn btn-danger">删除</a>
</td>
</tr>
</tbody>
</table>
<div th:if = "${totalPages > 1}">
<div class = "row col-sm-10">
<div class = "col-sm-3">
Total Rows: [[${totalItems}]]
</div>
<div class = "col-sm-5">
<span th:each="i: ${#numbers.sequence(1, totalPages)}">
<a th:if="${currentPage != i}" th:href="@{'/page/' + ${i}+ '?sortField=' + ${sortField} + '&sortDir=' + ${sortDir}}">[[${i}]]</a>
<span th:unless="${currentPage != i}">[[${i}]]</span>
</span>
</div>
<div class = "col-sm-1">
<a th:if="${currentPage < totalPages}" th:href="@{'/page/' + ${currentPage + 1}+ '?sortField=' + ${sortField} + '&sortDir=' + ${sortDir}}">上一页</a>
<span th:unless="${currentPage < totalPages}">上一页</span>
</div>
<div class="col-sm-1">
<a th:if="${currentPage < totalPages}" th:href="@{'/page/' + ${totalPages}+ '?sortField=' + ${sortField} + '&sortDir=' + ${sortDir}}">下一页</a>
<span th:unless="${currentPage < totalPages}">返回上一页</span>
</div>
</div>
</div>
</div>
</body>
</html>
2.9 效果展示
1、网页首界面
2、新增业务者信息
新增一个业务者信息并保存
再在页面看有没有刚才新增的业务者信息。
3、删除业务者信息
我们把一开始表格中就有的李四信息删掉,再查询李四的信息是否存在,如不存在则说明删除成功,存在则说明项目做的不符合要求。这里是查询不到李四的信息了,说明成功了。
4、更新业务信息
更新“小丽”的业务状态,把“取钱”更新为“存钱”。
5、查询业务信息
查询名为“小全”的信息,查询到了就说明这个功能是符合要求的。
6、分页查询
三、总结
在写代码地时候记得看仔细,看方法有没有被调用,我中间就出现过这样的错误,导致一直没运行成功。