银行业务管理系统

银行业务管理系统

一、功能介绍

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>  &nbsp; &nbsp;
					</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、分页查询
在这里插入图片描述

三、总结

在写代码地时候记得看仔细,看方法有没有被调用,我中间就出现过这样的错误,导致一直没运行成功。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

db_qyt_2024

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值