JSP 图书销售管理系统

1.系统简介

本JSP项目是一个图书销售管理系统,其主要目的是帮助书店管理员有效地管理书籍进出货流程、销售过程和库存情况,从而提高书店的业务流程效率和管理水平。该系统包括进货、退货、统计和销售四个主要功能总体来说,本项目是一个实用、易用和可扩展的系统,能够有效地帮助书店管理员进行图书销售管理,并提高书店的业务流程效率和管理水平。

2.系统开发工具及相关技术介绍

2.1 JSP 技术

JSP(Java Server Pages)技术是Java Web开发中比较常用的一种技术。JSP本质上是一种视图技术,它允许开发人员通过将java代码嵌套在HTML页面中,生成动态的网页。

JSP页面的开发可以使用常见的HTML标签、JavaScript和CSS等前端技术,并且还可以使用Java作为后端的服务,通过JavaBean等类来处理业务逻辑。JSP页面和Java控制器之间通过Servlet完成交互,使JSP页面可以动态地生成页面内容。

JSP技术的优点包括:

1. 界面设计方便:JSP允许使用HTML来设计用户界面,便于开发人员进行网页设计。

2. 可读性好:JSP页面中的Java代码可以被嵌入到HTML中,因此JSP页面具有很好的可读性,也便于维护。

3. 隐藏实现逻辑:通过JSP页面将Java服务和生成的HTML页面分离,将实现逻辑隐藏起来,提高了代码的安全性和重用性。

4. 数据库集成:JSP可以方便地集成数据库和其他Java后端服务,实现数据库访问、业务逻辑处理、业务流程控制等功能。

所以,JSP技术是非常实用和广泛应用的技术之一,可以用来开发各种复杂的Web应用程序。

2.2 JDBC

JDBC (Java Database Connectivity)是Java语言中用来操作关系型数据库(如MySQL、Oracle等)的API。JDBC API提供了一系列访问关系型数据库的Java类和接口,使得Java开发人员可以在自己的Java应用程序中与关系型数据库进行交互。

JDBC技术的核心是Java中的java.sql包和javax.sql包,这两个包分别提供了JDBC API所需的类和接口。使用JDBC API,Java程序员可以连接和请求任何数据库服务器,无论其是否位于本地计算机上或基于Web。

JDBC可以完全独立于数据库的类型和厂商,也可以使用JDBC的元数据来检索数据库的结构和其他详细信息。开发人员可以使用JDBC从数据库中检索和更新数据、执行存储过程、执行指定的SQL语句等操作,并与数据库系统进行交互,例如,执行SQL语句、访问和修改数据等。

JDBC API的最大好处之一是它在Java中提供了对多个关系型数据库的访问,允许Java程序员轻松地访问多个不同厂商提供的数据库。此外,JDBC也可以考虑到提供良好的性能和可扩展性,提高Java程序与数据库之间交互的效率。

2.3 MySQL

MySQL是一种常用的关系型数据库管理系统MySQL是一款轻量、高速、可靠的关系型数据库系统,在Linux、Windows和Mac OS等大部分操作系统上运行良好,并且被广泛应用于Web应用程序中。

MySQL数据库的主要特点包括: 轻量级和高速可靠性可扩展性免费和开源

 容易学习和使用由于其与PHP语言的无缝集成,以及上述的众多特点,MySQL被广泛应用于各类Web应用程序的数据存储和管理,成为当今世界上使用最广泛的网站和应用程序的数据库之一。

2.4 Tomcat

Tomcat是一个开源的Java Servlet容器,可以执行标准Java Servlet和JavaServer Pages技术规范的Web应用程序。它由Apache软件基金会开发,可以在Windows、Mac OS和Linux等操作系统中运行。

Tomcat的主要功能包括:

1. Web容器:Tomcat负责管理和执行Web应用程序,包括HTTP请求监听、请求处理、Servlet容器等功能,支持Java Servlet和JavaServer Pages等Web应用程序。

2. 部署:Tomcat可以轻松地部署Web应用程序,无需复杂的安装和配置。

3. 安全性:Tomcat提供了完善的安全机制,支持SSL、密码保护、访问控制等多种安全特性

4. 集成:Tomcat容器可以与多种其他Java组件进行集成,包括Apache HTTP服务器集成、Web框架结合等。

5. 扩展性:Tomcat支持多线程操作,可以轻松地扩展Web容器。同时,Tomcat还可以通过多个可插拔模块实现高级扩展功能。

Tomcat是一个广泛使用的Java Servlet容器,在企业级Web应用程序和Java开发领域中发挥着重要的作用。它对托管多个Web应用程序提供基本的支持,是大多数Web应用程序部署的首选容器之一。

2.5 Eclipse

Eclipse是一个开源的集成开发环境(IDE),可用于多种编程语言的开发,包括Java、C、Python和PHP等等。Eclipse提供了强大的工具和插件,可以帮助开发人员在开发过程中提高效率和准确性,并简化代码的编写、调试和测试等任务。Eclipse是非常受欢迎的开发环境之一,特别是在Java开发领域,由于它的可扩展性、灵活性和强大的功能,Eclipse已经在全球范围内得到了广泛的应用

3.系统分析

3.1 系统的可行性分析

可行性分析是在进行初步调查后所进行的对系统开发必要性和可能性的研究,所以也称 为可行性研究。信息系统也应从技术可行性, 经济可行性和社会可行性三方面来论证。 通过长时间的观察与实践,我认为图书馆管理系统的可行性分析如下:

3.1.1 经济可行性分析

JSP图书销售管理系统的开发成本相对较低,而且拓展性强,可以满足不断变化的业务需求。此外,JSP容易维护和管理,也能够节约相应的开发和维护成本。因此,从经济的角度来看,使用JSP技术进行图书销售管理系统的开发是可行的。

3.1.2 技术可行性分析

Java是跨平台的编程语言,可以在各种操作系统上运行。因此,使用Jsp技术实现本图书销售管理系统是技术上可行的。JSP技术是Java Web技术的一种,因此它具有良好的跨平台性和兼容性,能够在各种操作系统上运行。同时,JSP技术还有着很好的模块化和灵活性,可以提高软件开发效率和可维护性。因此,使用JSP技术开发图书销售管理系统是技术上可行的

3.1.3 社会可行性分析

社会可行性分析指的是考虑该系统的开发、使用是否符合社会公众的利益和需求。下面从几个方面对Jsp图书销售管理系统的社会可行性进行分析:

1. 服务公众需求:随着商业环境的变化,图书销售体验日益重要。使用Java Web技术开发图书销售管理系统,在满足用户需求、提升消费者体验等方面具有很高的社会可行性,能够满足用户对快速、便捷、准确的服务需求。

2. 维护公平竞争:使用图书销售管理系统可以方便地维护市场公平竞争,防止一些商家以低价销售商品,挤压其他商家的生存空间。这符合市场发展的要求,并得到社会公众的广泛认可

3. 促进经济发展:图书销售管理系统的应用可以提高图书店管理效率,节省成本,对于促进经济发展有积极的推动作用,受到广泛关注。

4. 维护数据安全:使用软件开发可以可靠地保护消费者信息、库存、财务报表等关键数据,增强企业与消费者间的信任,有利于维护社会稳定和公共安全。

综上所述,Jsp图书销售管理系统在服务公众、维护公平竞争、促进经济发展、维护数据安全等方面都具有相当的社会可行性,能够满足社会公众对相关服务和利益的需求和要求。

3.2 系统的需求分析

系统需求分析是确定系统功能和性能的过程。下面是该图书销售管理系统的需求分析:

1. 用户需求分析:

(1)用户角色:管理员、员工

(2)管理员:能够使用系统进行数据录入、维护库存、销售统计等管理工作。

(3)员工:能够查询库存信息、操作销售、退货、生成销售相关单据等。

2. 功能需求分析

(1)进货功能:包括根据库存量及销售情况确定进货数量,选择供应商进行进货,生成进货单并自动修改库存量,并把进货信息添加到进货表中。

(2)退货功能:包括顾客退还商品,生成退货单并自动修改库存量,并把退货信息添加到退货表中。

(3)统计功能:根据销售情况,生成统计报表,包括每月的销售总额、销售总量,以及排行榜等相关信息。

(4)销售功能:输入顾客购买信息,根据系统库存判断是否有货,打印销售单并自动修改库存量,同时把销售信息添加到日销售表中。

(5)库存管理功能:包括卖出、进货、退货自动更新库存量,提醒管理员进行库存警戒值的设定和修改。

3. 性能需求分析

(1)系统可靠性:能够保证系统的连续性、可靠性、稳定性,减少崩溃和故障发生的概率,并及时地进行数据备份和恢复。

(2)系统响应速度:系统响应速度应该快速,对于轻客户负荷的访问和请求应该能够快速做出反应,提高用户体验感。

(3)系统安全级别:考虑到系统中的敏感数据,需要建立严格、安全的用户身份验证与授权机制来保护数据的安全。

(4)扩展性:应该进行良好的扩展设计,使系统能够适应不断变化的业务需求和系统环境,并保证扩展性与灵活性。

以上是JSP/Java Web图书销售管理系统的需求分析,内容包括用户需求分析、功能需求分析和性能需求分析等,为后续系统开发提供了指导和支持。

3.3 系统的功能需求

根据前面的分析,JSP/Java Web图书销售管理系统应该具有以下功能需求:

1. 进货管理功能

(1)能够根据库存量和销售情况确定进货数量。

(2)能够选择供应商进行进货,并根据报价选择最优供应商。

(3)能够生成进货单并自动修改库存量、添加进货信息到进货表中。

2. 退货管理功能

(1)能够根据顾客的退货请求生成退货单,并自动修改库存量。

(2)能够把退货的信息添加到退货表中。

3. 统计管理功能

(1)能够生成销售统计报表,包括每月的销售总额和销售总量等信息。

(2)能够生成图书排行榜等相关信息。

4. 销售管理功能

(1)能够输入顾客购买信息,并自动判断库存数量是否足够。

(2)能够打印销售单并自动修改库存量、添加销售信息到销售表中

5. 库存管理功能

(1)能够自动更新库存量,包括卖出、进货、退货等操作。

(2)能够提醒管理员进行库存警戒值的设定和修改。

6. 用户管理功能

(1)能够根据管理员、销售员、供应商和顾客不同角色,分配不同的权限进行访问。

(2)能够对用户进行添加、删除和修改等操作。

7. 数据备份与恢复功能

(1)能够自动备份所有数据,以避免数据丢失。

(2)当系统发生故障时,能够快速恢复备份数据。

8. 安全性管理功能

(1)能够建立严格、安全的用户身份验证与授权机制来保护数据的安全。

(2)能够保护用户数据不被未经授权的访问。

9. 通知管理功能

(1)能够自动向管理员和供应商发送通知,以提醒他们进行各种操作。

(2)能够自动向顾客发送通知,以提醒他们进行付款、收货等操作。

综上所述,JSP/Java Web图书销售管理系统应该具有进货管理、退货管理、统计管理、销售管理、库存管理、用户管理、数据备份与恢复、安全性管理和通知管理等9种功能。

3.4 数据要求

为了保证JSP/Java Web图书销售管理系统的正常运行和数据的准确性,需要满足以下数据要求:

1. 数据库:系统需要一个可靠的数据库来存储各种信息,包括书籍信息、销售信息、进货信息、退货信息和用户信息。

2. 数据库建模:需要进行数据库建模,设计数据库的表结构和字段,如书籍信息表、销售信息表、进货信息表、退货信息表、用户信息表等。

3. 备份与恢复:系统需要具备数据备份机制,以避免数据丢失,并且获取备份数据时,可以快速地进行数据恢复。

4. 数据输入:系统需要有可靠的数据处理机制,以保证数据输入正确性。对于大量数据的输入,应该有批量导入功能。

5. 数据输出:系统需要有良好的数据输出机制,能够快速、可靠地输出各类报表、单据和管理信息等。

6. 数据安全:系统需要确保各种数据的保密性和完整性,并具有用户身份认证、数据权限管理和数据备份等安全措施,防止非法访问和数据泄露。

综上所述,JSP/Java Web图书销售管理系统的数据要求包括:数据库、数据库建模、备份与恢复、数据输入、数据输出和数据安全。必须确保系统数据的完整性、安全性和准确性,以保证系统的可靠性和用户体验感。

4.概念设计

系统功能模块图:

4.1登录流程图

主数据流:

4. 数据字典设计

数据项编号

数据项名

数据项含义

存储结构

1

yuangonggonghao

员工工号

Varchar(20)

2

mima

密码

Varchar(200)

3

yuangongxingming

员工姓名

Varchar(200)

4

xinbie

性别

Varchar(200)

5

lianxidianhua

联系电话

Varchar(200)

6

youxiang

邮箱

Varchar(200)

7

jiatingzhuzhi

家庭住址

Varchar(200)

8

addtime

登记时间

timestamp

9

kehubianhao

客户编号

Varchar(20)

10

kehuxingming

客户姓名

Varchar(200)

11

lianxifangshi

联系方式

Varchar(200)

12

beizhu

备注

Varchar(200)

13

gongyingshangbianhao

供应商编号

Varchar(20)

14

gongyingshangdizhi

供应商地址

Varchar(200)

15

gongyingshangxingming

供应商姓名

Varchar(200)

16

kuaidigongsi

快递公司

Varchar(200)

17

gongsibianhao

公司编号

Varchar(200)

18

gongsimingcheng

公司名称

Varchar(200)

19

gongsidizhi

公司地址

Varchar(200)

20

fahuodizhi

发货地址

Varchar(200)

21

dingdanbianhao

订单编号

Varchar(200)

22

tushubianhao

图书编号

Varchar(200)

23

tushumingcheng

图书名称

Varchar(200)

24

shuliang

数量

Varchar(200)

25

chengjiaojine

成交金额

Varchar(200)

26

fahuoshijian

发货时间

timestamp

27

caigouushijian

采购时间

timestamp

28

rukushijian

入库时间

timestamp

29

chukushijian

出库时间

timestamp

30

tuihuoshijian

退货时间

timestamp

4.1分E-R图

图书信息E-R图

员工信息实体E-R图

客户信息实体E-R图​​​​​​​

供应商信息实体E-R图

快递信息实体E-R图

4.2总E-R图

数据流图:

图书入库:

图书出库:

图书采购:

图书销售:

统计数据:

4.3 关系模式

图书信息图书编号,图书名称,作者,图书类别,出版社,数量

供应商供应商编号供应商地址供应商姓名联系地址

快递公司快递公司编号联系方式公司名称,公司地址

客户(客户编号,客户地址,客户姓名,联系方式)

入库(图书编号,图书名称,数量,入库时间,图书类别)

库(图书编号,图书名称,数量,库时间,图书类别)

订单信息(订单编号,图书编号,图书名称,图书类别,数量,成交金额,购买时间,客户编号,员工工号,员工姓名)

订单发货(订单编号,图书编号,图书名称,图书类别,数量,成交金额,发货时间,客户编号,快递公司,员工工号员工姓名)

订单退货(订单编号,图书编号,图书名称,图书类别,数量,成交金额,退货时间,客户编号,快递公司,员工工号员工姓名)

统计盘点(图书编号,图书名称,图书类别,销售数量,登记日期)

部分数据库代码:

CREATE TABLE `yuangong` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `yuangonggonghao` varchar(200) NOT NULL COMMENT '员工工号',
  `mima` varchar(200) NOT NULL COMMENT '密码',
  `yuangongxingming` varchar(200) NOT NULL COMMENT '员工姓名',
  `xingbie` varchar(200) DEFAULT NULL COMMENT '性别',
  `lianxidianhua` varchar(200) DEFAULT NULL COMMENT '联系电话',
  `youxiang` varchar(200) DEFAULT NULL COMMENT '邮箱',
  `jiatingzhuzhi` varchar(200) DEFAULT NULL COMMENT '家庭住址',
  PRIMARY KEY (`id`),
  UNIQUE KEY `yuangonggonghao` (`yuangonggonghao`)
) ENGINE=InnoDB AUTO_INCREMENT=1648354673812 DEFAULT CHARSET=utf8 COMMENT='员工';



CREATE TABLE `kehu` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `kehubianhao` varchar(200) DEFAULT NULL COMMENT '客户编号',
  `kehudizhi` varchar(200) DEFAULT NULL COMMENT '客户地址',
  `kehuxingming` varchar(200) DEFAULT NULL COMMENT '客户姓名',
  `lianxifangshi` varchar(200) DEFAULT NULL COMMENT '联系方式',
  `beizhu` varchar(200) DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1648354775493 DEFAULT CHARSET=utf8 COMMENT='客户';


CREATE TABLE `gongyingshang` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `gongyingshangbianhao` varchar(200) DEFAULT NULL COMMENT '供应商编号',
  `gongyingshangdizhi` varchar(200) DEFAULT NULL COMMENT '供应商地址',
  `gongyingshangxingming` varchar(200) DEFAULT NULL COMMENT '供应商姓名',
  `lianxifangshi` varchar(200) DEFAULT NULL COMMENT '联系方式',
  `beizhu` varchar(200) DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1648354788845 DEFAULT CHARSET=utf8 COMMENT='供应商';


CREATE TABLE `kuaidigongsi` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `gongsibianhao` varchar(200) DEFAULT NULL COMMENT '公司编号',
  `gongsimingcheng` varchar(200) DEFAULT NULL COMMENT '公司名称',
  `gongsidizhi` varchar(200) DEFAULT NULL COMMENT '公司地址',
  `lianxifangshi` varchar(200) DEFAULT NULL COMMENT '联系方式',
  `beizhu` varchar(200) DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1648354804882 DEFAULT CHARSET=utf8 COMMENT='快递公司';


CREATE TABLE `tushuxinxi` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `tushubianhao` varchar(200) DEFAULT NULL COMMENT '图书编号',
  `tushumingcheng` varchar(200) DEFAULT NULL COMMENT '图书名称',
  `tushuleibie` varchar(200) DEFAULT NULL COMMENT '图书类别',
  `zuozhe` varchar(200) DEFAULT NULL COMMENT '作者',
  `chubanshe` varchar(200) DEFAULT NULL COMMENT '出版社',
  `danjia` float DEFAULT NULL COMMENT '单价',
  `shuliang` int(11) DEFAULT NULL COMMENT '数量',
  `neirongjianjie` longtext COMMENT '内容简介',
  `tushufengmian` varchar(200) DEFAULT NULL COMMENT '图书封面',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1648354836730 DEFAULT CHARSET=utf8 COMMENT='图书信息';



CREATE TABLE `users` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `username` varchar(100) NOT NULL COMMENT '用户名',
  `password` varchar(100) NOT NULL COMMENT '密码',
  `role` varchar(100) DEFAULT '管理员' COMMENT '角色',
  `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '新增时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='用户表';


系统设计

5.1系统概要

本图书销售管理系统的系统概要如下:

 本图书销售管理系统旨在为图书销售商家提供一个全面管理销售过程的平台,实现图书的进货、销售、退货和库存管理等功能,并提供销售统计信息,以便商家进行业务决策。前台提供了一个登录系统,后台写了一系列模块来便于管理员管理。比如员工管理,客户管理,供应商管理,快递公司管理模块,还有各种图书管理模块等等。

5.2 设计思想

本图书销售管理系统的设计思想是基于MVC(Model-View-Controller)架构模式,即将系统分为模型层(Model)、视图层(View)和控制层(Controller)三部分,以实现系统的灵活可扩展性、可维护性和可重用性。

具体设计思想如下:

1. 模型层:模型层负责处理系统中的业务逻辑,主要包括对数据库的读写操作、数据处理和业务规则的实现等。模型层使用JavaBean和DAO模式,来实现数据访问层和业务逻辑层分离的目的,同时也为系统提供了良好的可扩展性和可维护性。

2. 视图层:视图层负责系统中页面的显示和用户的交互,主要通过JSP和JavaScript实现,同时也充分考虑了用户体验,以提高系统的易用性和用户满意度。

3. 控制层:控制层是整个系统的核心,负责处理用户请求、数据响应和调用模型层完成具体的业务处理。控制层使用Servlet来实现,通过对请求参数的解析和调用业务逻辑层处理后,将结果返回给前端页面。

在以上基础上,还采用了以下设计思想:

1. 数据库设计的规范化:采用规范化的数据库设计,包括实体间的关系和关联等,以保证数据的一致性和完整性,同时也便于系统的数据管理和查询。

2. 代码的可读性和可维护性:将代码按照一定的规范进行编写,注重代码的可读性和可维护性,通过代码的分层、重用和抽象等技术,使得系统具备更高的灵活度和扩展性。

3. 用户体验的提升:系统中的前端页面采用了响应式设计、CSS框架、AJAX等技术,以提高用户体验和交互效果,同时也符合现代Web开发的趋势。

综上所述,本图书销售管理系统的设计思想主要是基于MVC架构,采用了规范化的数据库设计和代码的可读性、可维护性等方面的技术,同时还注重了用户体验方面的优化。

5.3.1.SpringMVC 框架设计步骤

(1)web.xm

<!-- 加载Spring配置文件 -->
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:spring/spring.xml</param-value>
</context-param>

<!-- 字符集 过滤器 -->
<filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>


<!-- Spring监听器 -->
   <listener>
       <description>Spring监听器</description>
       <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
   </listener>
   <!-- 防止Spring内存溢出监听器 -->
   <listener>
       <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
   </listener>

   <!-- Spring MVC -->
   <servlet>
       <servlet-name>SpringMVC</servlet-name>
       <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
       <init-param>
           <description>SpringMVC</description>
           <param-name>contextConfigLocation</param-name>
           <param-value>classpath:spring/spring-mvc.xml</param-value>
       </init-param>
       <load-on-startup>1</load-on-startup>
   </servlet>

     <servlet-mapping>
       <servlet-name>default</servlet-name>
       <url-pattern>*.js</url-pattern>
       <url-pattern>*.css</url-pattern>
       <url-pattern>*.html</url-pattern>
       <url-pattern>/upload/*</url-pattern>
   </servlet-mapping>
   
   <servlet-mapping>
       <servlet-name>SpringMVC</servlet-name>
       <url-pattern>/</url-pattern>
   </servlet-mapping>

   <!-- Session超时时间 -->
   <!-- <session-config>
       <session-timeout>15</session-timeout>
   </session-config> -->



Spring-mvc.xml

<mvc:default-servlet-handler/>

<!-- Controller包(自动注入) -->
<context:component-scan base-package="com.controller"/>
<!-- FastJson注入 -->
<mvc:annotation-driven>
</mvc:annotation-driven>
<!-- 静态资源配置 -->
<mvc:resources mapping="/resources/**" location="/resources/"/>
<!-- 对模型视图名称的解析,即在模型视图名称添加前后缀 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/pages/"/>
    <property name="suffix" value=".jsp"/>
</bean>
<!-- 拦截器配置 -->
<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <mvc:exclude-mapping path="/upload"/>
        <bean class="com.interceptor.AuthorizationInterceptor"/>
    </mvc:interceptor>
</mvc:interceptors>
<!-- 上传限制 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <!-- 上传文件大小限制为300M,300*1024*1024 -->
    <property name="maxUploadSize" value="314572800"/>
</bean>

Spring-mybatis.xml

<!-- 配置数据源 -->
   <bean name="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
       <property name="url" value="${jdbc_url}"/>
       <property name="username" value="${jdbc_username}"/>
       <property name="password" value="${jdbc_password}"/>

       <!-- 初始化连接大小 -->
       <property name="initialSize" value="0"/>
       <!-- 连接池最大使用连接数量 -->
       <property name="maxActive" value="20"/>
       <!-- 连接池最大空闲 -->
       <property name="maxIdle" value="20"/>
       <!-- 连接池最小空闲 -->
       <property name="minIdle" value="0"/>
       <!-- 获取连接最大等待时间 -->
       <property name="maxWait" value="60000"/>

       <property name="validationQuery" value="${validationQuery}"/>
       <property name="testOnBorrow" value="false"/>
       <property name="testOnReturn" value="false"/>
       <property name="testWhileIdle" value="true"/>

    
       <property name="timeBetweenEvictionRunsMillis" value="60000"/>
   
       <property name="minEvictableIdleTimeMillis" value="25200000"/>

     
       <property name="removeAbandoned" value="true"/>
     
       <property name="removeAbandonedTimeout" value="1800"/>
  
       <property name="logAbandoned" value="true"/>

       <!-- 监控数据库 -->
       <property name="filters" value="mergeStat"/>
   </bean>

   <bean id="sqlSessionFactory" class="com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean">
       <property name="dataSource" ref="dataSource"/>
  
       <property name="mapperLocations" value="classpath:mapper/*.xml"/>
       <property name="configLocation" value="classpath:mybatis/mybatis-config.xml"/>
       <property name="typeAliasesPackage" value="com..model.*"/>
       <property name="typeEnumsPackage" value="com.model.enums"/>
       <property name="plugins">
           <array>
               <!-- 分页插件配置 -->
               <bean id="paginationInterceptor" class="com.baomidou.mybatisplus.plugins.PaginationInterceptor">
               </bean>
           </array>
       </property>
    <!-- 全局配置注入 -->
    <property name="globalConfig" ref="globalConfig" />
</bean>
<bean id="globalConfig" class="com.baomidou.mybatisplus.entity.GlobalConfiguration">
    <property name="idType" value="2" />
       <property name="metaObjectHandler">
           <bean class="com.config.MyMetaObjectHandler" />
       </property>
</bean>

   <!-- MyBatis 动态扫描  -->
   <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
       <property name="basePackage" value="com.dao"/>
   </bean>

   <!-- 配置事务管理 -->
   <bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
       <property name="dataSource" ref="dataSource"/>
   </bean>

6.

管理员登录模块

在浏览器输入http://localhost:8080/jspmzr954/jsp/login.jsp就会出现如图登录页面输入用户名和密码然后选择管理员按钮就可以登录

<html>
<head>
<meta charset="utf-8">
<title>登陆</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="">
<meta name="author" content="">

<!-- Le styles -->
<script type="text/javascript"
   src="${pageContext.request.contextPath}/resources/assets2/js/jquery.min.js"></script>
function login() {
         
         $("#loginForm")
               .ajaxForm(
                     function(res) {
                        if (role == "" || role == null) {
                           alert("请选择角色后再登录");
                        } else {
                           if (res.code == 0) {
                              alert("登录成功");
                              var username = $('#username').val();
                              window.sessionStorage.setItem('accountTableName',accountTableName)
                              window.sessionStorage.setItem('username',username);
                              window.sessionStorage.setItem('token',
                                    res.token);
                              window.sessionStorage.setItem('role',
                                    role);
                              http(accountTableName+'/session','GET',{},(res2)=>{
                                 if(res2.code == 0){
                                    window.sessionStorage.setItem('userid',res2.data.id);
                                      window.location.href = "${pageContext.request.contextPath}/index.jsp";
                                 }
                              });
                           } else {
                              alert(res.msg);
                           }
                        }

                     });
      }
      function ready() {
         setRoleOption();
         //$('form').attr('action',baseUrl + 'users/login');
      }
      document.addEventListener("DOMContentLoaded", ready);
      
      function randomString() {
         var len = 4;
         var chars = [
           'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k',
           'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
           'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G',
           'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R',
           'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '0', '1', '2',
           '3', '4', '5', '6', '7', '8', '9'
         ]
         var colors = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f']
         var sizes = ['14', '15', '16', '17', '18']
         
         var output = []
         for (var i = 0; i < len; i++) {
           // 随机验证码
           var key = Math.floor(Math.random() * chars.length)
           codes[i].num = chars[key]
           // 随机验证码颜色
           var code = '#'
           for (var j = 0; j < 6; j++) {
             var key = Math.floor(Math.random() * colors.length)
             code += colors[key]
           }
           codes[i].color = code
           // 随机验证码方向
           var rotate = Math.floor(Math.random() * 30)
           var plus = Math.floor(Math.random() * 2)
           if (plus == 1) rotate = '-' + rotate
           codes[i].rotate = 'rotate(' + rotate + 'deg)'
           // 随机验证码字体大小
           var size = Math.floor(Math.random() * sizes.length)
           codes[i].size = sizes[size] + 'px'
         }
         
         var str = ''
         for(var i = 0;i<codes.length;i++) {
            str += '<span style="color:' + codes[i].color + ';transform:' + codes[i].rotate + ';fontSize:' + codes[i].size + ';padding: 0 3px;display:inline-block">'+codes[i].num+'</span>'
         }
         $('#nums').html('').append(str);
      }
      
      randomString();
   </script>

</body>

</html>

6.1图书采购管理

<html lang="zh-cn">
<head>
   <%@ include file="../../static/head.jsp"%>
   <!-- font-awesome -->
   <link rel="stylesheet" href="${pageContext.request.contextPath}/resources/css/font-awesome.min.css">
</head>
<style>

</style>

<body>
<div class="container mt-0">
   <div class="row breadcrumb-bar">
      <div class="col-md-6">
         <h3 class="block-title">图书采购管理</h3>
      </div>
      <div class="col-md-6">
         <ol class="breadcrumb">
            <li class="breadcrumb-item">
               <a href="${pageContext.request.contextPath}/index.jsp">
                  <span class="ti-home"></span>
               </a>
            </li>
            <li class="breadcrumb-item"><span>图书采购管理</span></li>
            <li class="breadcrumb-item active"><span>图书采购列表</span></li>
         </ol>
      </div>
   </div>
</div>

<div class="container">

   <div class="row">
      <!-- Widget Item -->
      <div class="col-md-12">
         <div class="widget-area-2 lochana-box-shadow">
            <h3 class="widget-title">图书采购列表</h3>                     
            <div class="table-responsive mb-3" id="tableDiv">
               <div class="col-sm-12">
                  <label>
                     图书编号
                  </label>
                  <input type="text" id="tushubianhaoSearch" class="form-control form-control-sm" placeholder="请输入图书编号" aria-controls="tableId">
                  <label>
                     图书名称
                  </label>
                  <input type="text" id="tushumingchengSearch" class="form-control form-control-sm" placeholder="请输入图书名称" aria-controls="tableId">
                  <label>
                     图书类别
                  </label>
                  <input type="text" id="tushuleibieSearch" class="form-control form-control-sm" placeholder="请输入图书类别" aria-controls="tableId">
                  <button onclick="search()" type="button" class="btn btn-primary">查询</button>
                  <button onclick="add()" type="button" class="btn btn-success 新增">添加</button>
                  <button onclick="deleteMore()" type="button" class="btn btn-danger 删除">批量删除</button>
               </div>
               <table id="tableId" class="table table-bordered table-striped">
                  <thead>
                     <tr>
                        <th class="no-sort" style="min-width: 35px;">
                           <div class="custom-control custom-checkbox">
                              <input class="custom-control-input" type="checkbox" id="select-all" onclick="chooseAll()">
                              <label class="custom-control-label" for="select-all"></label>
                           </div>
                        </th>
                        <th onclick="sort('tushubianhao')">图书编号<i id="tushubianhaoIcon" class="fa fa-sort"></i></th>
                        <th onclick="sort('tushumingcheng')">图书名称<i id="tushumingchengIcon" class="fa fa-sort"></i></th>
                        <th onclick="sort('tushuleibie')">图书类别<i id="tushuleibieIcon" class="fa fa-sort"></i></th>
                        <th onclick="sort('caigoushuliang')">采购数量<i id="caigoushuliangIcon" class="fa fa-sort"></i></th>
                        <th onclick="sort('caigoushijian')">采购时间<i id="caigoushijianIcon" class="fa fa-sort"></i></th>
                        <th onclick="sort('beizhu')">备注<i id="beizhuIcon" class="fa fa-sort"></i></th>
                        <th onclick="sort('gongyingshang')">供应商<i id="gongyingshangIcon" class="fa fa-sort"></i></th>
                        <th onclick="sort('yuangonggonghao')">员工工号<i id="yuangonggonghaoIcon" class="fa fa-sort"></i></th>
                        <th onclick="sort('yuangongxingming')">员工姓名<i id="yuangongxingmingIcon" class="fa fa-sort"></i></th>
                        <th onclick="sort('sfsh')">是否审核<i id="sfshIcon" class="fa fa-sort"></i></th>
                        <th>审核回复</th>
                        <th>操作</th>
                     </tr>
                  </thead>
                  <tbody>
                  </tbody>
               </table>
</body>

</html>

6.2 退货信息

部分代码:

<html lang="zh-cn">
<head>
   <%@ include file="../../static/head.jsp"%>
   <!-- font-awesome -->
   <link rel="stylesheet" href="${pageContext.request.contextPath}/resources/css/font-awesome.min.css">
</head>
<style>

</style>
<body>
   <!-- Pre Loader -->
   <div class="loading">
      <div class="spinner">
         <div class="double-bounce1"></div>
         <div class="double-bounce2"></div>
      </div>
   </div>
   <!--/Pre Loader -->
   <div class="wrapper">
      <!-- Page Content -->
      <div id="content">
            <!-- Top Navigation -->
            <%@ include file="../../static/topNav.jsp"%>
            <!-- Menu -->
            <div class="container menu-nav">
               <nav class="navbar navbar-expand-lg lochana-bg text-white">
                  <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent"
                   aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
                     <span class="ti-menu text-white"></span>
                  </button>
                  <div class="collapse navbar-collapse" id="navbarSupportedContent">
                     <!-- <div class="z-navbar-nav-title">$template2.back.menu.title.text</div> -->
                     <ul id="navUl" class="navbar-nav mr-auto">                
                     </ul>
                  </div>
               </nav>
            </div>
            <!-- /Menu -->
            <!-- Breadcrumb -->
            <!-- Page Title -->
            <div class="container mt-0">
               <div class="row breadcrumb-bar">
                  <div class="col-md-6">
                     <h3 class="block-title">退货信息管理</h3>
                  </div>
                  <div class="col-md-6">
                     <ol class="breadcrumb">
                        <li class="breadcrumb-item">
                           <a href="${pageContext.request.contextPath}/index.jsp">
                              <span class="ti-home"></span>
                           </a>
                        </li>
                        <li class="breadcrumb-item"><span>退货信息管理</span></li>
                        <li class="breadcrumb-item active"><span>退货信息列表</span></li>
                     </ol>
                  </div>
               </div>
            </div>
         <!-- /Page Title -->

         <!-- /Breadcrumb -->
         <!-- Main Content -->
         <div class="container">

            <div class="row">
               <!-- Widget Item -->
               <div class="col-md-12">
                  <div class="widget-area-2 lochana-box-shadow">
                     <h3 class="widget-title">退货信息列表</h3>                     
                     <div class="table-responsive mb-3" id="tableDiv">
                        <div class="col-sm-12">
                           <label>
                              订单编号
                           </label>
                           <input type="text" id="dingdanbianhaoSearch" class="form-control form-control-sm" placeholder="请输入订单编号" aria-controls="tableId">
                           <label>
                              图书编号
                           </label>
                           <input type="text" id="tushubianhaoSearch" class="form-control form-control-sm" placeholder="请输入图书编号" aria-controls="tableId">
                           <button onclick="search()" type="button" class="btn btn-primary">查询</button>
                           <button onclick="add()" type="button" class="btn btn-success 新增">添加</button>
                           <button onclick="deleteMore()" type="button" class="btn btn-danger 删除">批量删除</button>
                        </div>
                        <table id="tableId" class="table table-bordered table-striped">
                           <thead>
                              <tr>
                                 <th class="no-sort" style="min-width: 35px;">
                                    <div class="custom-control custom-checkbox">
                                       <input class="custom-control-input" type="checkbox" id="select-all" onclick="chooseAll()">
                                       <label class="custom-control-label" for="select-all"></label>
                                    </div>
                                 </th>
                                 <th onclick="sort('dingdanbianhao')">订单编号<i id="dingdanbianhaoIcon" class="fa fa-sort"></i></th>
                                 <th onclick="sort('tushubianhao')">图书编号<i id="tushubianhaoIcon" class="fa fa-sort"></i></th>
                                 <th onclick="sort('tushumingcheng')">图书名称<i id="tushumingchengIcon" class="fa fa-sort"></i></th>
                                 <th onclick="sort('tushuleibie')">图书类别<i id="tushuleibieIcon" class="fa fa-sort"></i></th>
                                 <th onclick="sort('shuliang')">数量<i id="shuliangIcon" class="fa fa-sort"></i></th>
                                 <th onclick="sort('kehubianhao')">客户编号<i id="kehubianhaoIcon" class="fa fa-sort"></i></th>
                                 <th onclick="sort('tuihuoshijian')">退货时间<i id="tuihuoshijianIcon" class="fa fa-sort"></i></th>
                                 <th onclick="sort('tuihuoyuanyin')">退货原因<i id="tuihuoyuanyinIcon" class="fa fa-sort"></i></th>
                                 <th onclick="sort('yuangonggonghao')">员工工号<i id="yuangonggonghaoIcon" class="fa fa-sort"></i></th>
                                 <th onclick="sort('yuangongxingming')">员工姓名<i id="yuangongxingmingIcon" class="fa fa-sort"></i></th>
                                 <th>操作</th>
                              </tr>
                           </thead>
                           <tbody>
                           </tbody>
                        </table>

</body>

</html>

6.3统计盘点模块

部分代码:

<html lang="zh-cn">

<head>
   <%@ include file="../../static/head.jsp"%>
   <!-- font-awesome -->
   <link rel="stylesheet" href="${pageContext.request.contextPath}/resources/css/font-awesome.min.css">
</head>
<style>

</style>
<body>
   <!-- Pre Loader -->
   <div class="loading">
      <div class="spinner">
         <div class="double-bounce1"></div>
         <div class="double-bounce2"></div>
      </div>
   </div>
   <!--/Pre Loader -->
   <div class="wrapper">
      <!-- Page Content -->
      <div id="content">
            <!-- Top Navigation -->
            <%@ include file="../../static/topNav.jsp"%>
            <!-- Menu -->
            <div class="container menu-nav">
               <nav class="navbar navbar-expand-lg lochana-bg text-white">
                  <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent"
                   aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
                     <span class="ti-menu text-white"></span>
                  </button>
                  
                        <!-- Widget Item -->
               <div class="col-md-12">
                  <div class="widget-area-2 lochana-box-shadow">
                     <h3 class="widget-title">统计盘点列表</h3>                     
                     <div class="table-responsive mb-3" id="tableDiv">
                        <div class="col-sm-12">
                           <label>
                              图书编号
                           </label>
                           <input type="text" id="tushubianhaoSearch" class="form-control form-control-sm" placeholder="请输入图书编号" aria-controls="tableId">
                           <label>
                              图书名称
                           </label>
                           <input type="text" id="tushumingchengSearch" class="form-control form-control-sm" placeholder="请输入图书名称" aria-controls="tableId">
                           <button onclick="search()" type="button" class="btn btn-primary">查询</button>
                           <button onclick="add()" type="button" class="btn btn-success 新增">添加</button>
                           <button onclick="deleteMore()" type="button" class="btn btn-danger 删除">批量删除</button>
                           <button onclick="graph()" type="button" class="btn btn-info 报表">统计</button>
                        </div>
                        <table id="tableId" class="table table-bordered table-striped">
                           <thead>
                                  }      

      // 查询
      function search(){
         searchForm = { key: ""};
         if($('#tushubianhaoSearch').val() != null && $('#tushubianhaoSearch').val() != ''){
            searchForm.tushubianhao ="%" +  $('#tushubianhaoSearch').val() + "%";
         }
         
         if($('#tushumingchengSearch').val() != null && $('#tushumingchengSearch').val() != ''){
            searchForm.tushumingcheng ="%" +  $('#tushumingchengSearch').val() + "%";
         }
         
         getDataList();
      }     
      // 获取数据列表
        function getDataList() {
         http("tongjipandian/page","GET",{
            page: pageIndex,
            limit: pageSize,
            sort: sortColumn,
            order: sortOrder,
            tushubianhao : searchForm.tushubianhao,    
            tushumingcheng : searchForm.tushumingcheng,    
         },(res)=>{
            if(res.code == 0){
               clear();
               dataList = res.data.list;
               totalPage = res.data.totalPage;
               //var tbody = document.getElementById('tbMain');
               for(var i = 0;i < dataList.length; i++){ //遍历一下表格数据  
                  var trow = setDataRow(dataList[i],i); //定义一个方法,返回tr数据 
                  $('tbody').append(trow);
               }
               pagination(); //渲染翻页组件
               getRoleButtons();// 权限按钮控制
            }
         });
        }     
    
         //每行按钮
         var btnGroup = document.createElement('td');


             // 是否显示 前一页 按钮
         if(pageIndex>1){
            $('#tableId_previous').show();
         }else{
            $('#tableId_previous').hide();
         }
               // 是否显示 下一页 按钮
         if(pageIndex < totalPage){
            $('#tableId_next').show();
            $('#tableId_next a').attr('data-dt-idx',endIndex+1);
         }else{
            $('#tableId_next').hide();
         }
         var pageNumInfo = "当前第 "+ pageIndex + " 页,共 "+ totalPage + " 页";
         $('#tableId_info').html(pageNumInfo);
      }     
      // 跳转到指定页
      function toThatPage(){
         //var index = document.getElementById('pageIndexInput').value;
         if(index<0 || index>totalPage){
            alert('请输入正确的页码');
         }else {
            pageNumChange(index);
         }
      }     
      // 全选/全不选
           // 删除
        function remove(id) {
            var mymessage = confirm("真的要删除吗?");
            if (mymessage == true) {
            var paramArray = [];
            if (id == ids){
               paramArray = id;
            }else{
               paramArray.push(id);
            }             
            httpJson("tongjipandian/delete","POST",paramArray,(res)=>{
               if(res.code == 0){
                  getDataList();    
                  alert('删除成功');
               }
            });         
            }
            else {
                alert("已取消操作");
            }
        }        
  

</body>

</html>

统计盘点:

代码:

<html lang="zh-cn">

<head>
   <%@ include file="../../static/head.jsp"%>
   <script src="${pageContext.request.contextPath}/resources/js/echarts.min.js"></script>
   <script src="${pageContext.request.contextPath}/resources/js/macarons.js"></script>
</head>
<style>
   .graph{
      margin: 10px auto;
   }
</style>
<body>
   <!-- Pre Loader -->
   <div class="loading">
      <div class="spinner">
         <div class="double-bounce1"></div>
         <div class="double-bounce2"></div>
      </div>
   </div>
   <!--/Pre Loader -->
   <div class="wrapper">
      <!-- Page Content -->
      <div id="content">
            <!-- Top Navigation -->
            <%@ include file="../../static/topNav.jsp"%>
            <!-- Menu -->
            <div class="container menu-nav">
               <nav class="navbar navbar-expand-lg lochana-bg text-white">
                  <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent"
                   aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
                     <span class="ti-menu text-white"></span>
                  </button>
            
                  <div class="collapse navbar-collapse" id="navbarSupportedContent">
                     <!-- <div class="z-navbar-nav-title">$template2.back.menu.title.text</div> -->
                     <ul class="navbar-nav mr-auto" id="navUl">
                        
                     </ul>
                  </div>
               </nav>
            </div>
            <!-- /Menu -->
            <!-- Breadcrumb -->
            <!-- Page Title -->
            <div class="container mt-0">
               <div class="row breadcrumb-bar">
                  <div class="col-md-6">
                     <h3 class="block-title">统计盘点统计</h3>
                  </div>
                  <div class="col-md-6">
                     <ol class="breadcrumb">
                        <li class="breadcrumb-item">
                           <a href="${pageContext.request.contextPath}/index.jsp">
                              <span class="ti-home"></span>
                           </a>
                        </li>
                        <li class="breadcrumb-item"><span>统计盘点管理</span></li>
                        <li class="breadcrumb-item active"><span>统计盘点统计</span></li>
                     </ol>
                  </div>
               </div>
            </div>
         
         <!-- /Breadcrumb -->
         <!-- Main Content -->
         <div class="container">             
            <!-- Main Content -->
            <div class="row">
               <div class="col-md-12">
                  <div class="widget-area-2 lochana-box-shadow min-h200">
                     <h3 class="widget-title"></h3>
                     <!--
                     Your Content goes Here
                     -->
                     <!--<div id="main" style="width: 900px;height:600px;"></div>-->
                     <div id="tushumingchengMain" class="graph" style="width: 900px;height:600px;"></div>
                  </div>
               </div>
            </div>
         </div>
         <!-- /Main Content -->
         <!--Copy Rights-->
         <div class="container">
            <div class="d-sm-flex justify-content-center">
              
            </div>
         </div>
         <!-- /Copy Rights-->
      </div>
      <!-- /Page Content -->
   </div>
   <!-- Back to Top -->
   <a id="back-to-top" href="#" class="back-to-top">
         <span class="ti-angle-up"></span>
   </a>
   <!-- /Back to Top -->
   <%@ include file="../../static/foot.jsp"%>

   <script>
   <%@ include file="../../utils/menu.jsp"%>
   <%@ include file="../../static/setMenu.js"%>
   <%@ include file="../../utils/baseUrl.jsp"%>      
   var tableName = "tongjipandian";
   var pageType = "graph";

   var xColumnName = 'tushumingcheng';
   var tushumingchengValArr = [];
   var tushumingchengNameArr = [];
   var tushumingchengMapList = [];
   var yColumnName = 'xiaoshoujine';
   var yColumnCnName = '销售金额';
   var valueArr = []
      var graphType = "bar";

   var tushumingchengVal = '';
   var xiaoshoujineVal = '';

   $(document).ready(function() {

      //设置右上角用户名
      $('.dropdown-menu h5').html(window.sessionStorage.getItem('username'))
      //设置项目名
      $('.sidebar-header h3 a').html(projectName)
      setMenu();
      getDetails();
      //draw();
      <%@ include file="../../static/myInfo.js"%>
   });

   function draw(){
      // 基于准备好的dom,初始化echarts实例
      var myChart = echarts.init(document.getElementById('main'),'macarons');

      // 指定图表的配置项和数据
      var option = {
         title: {text : '统计盘点'},
         tooltip: {},
         legend: {},
         xAxis: {
            data : nameArr
         },
         yAxis: {
         },
         series: [{
            type: graphType,
            data: [
            ]
         }]
      };
      // 使用刚指定的配置项和数据显示图表。
      myChart.setOption(option);

   }
   // 需要调group的字段,一个字段一个统计图
   function tushumingchengDraw(){
      // 基于准备好的dom,初始化echarts实例
      var myChart = echarts.init(document.getElementById('tushumingchengMain'),'macarons');

      // 指定图表的配置项和数据
      var option = {
            title: {
                  text: yColumnCnName,
            },
         tooltip: {},
         legend: {},
         xAxis: {
            data : tushumingchengNameArr
         },
         yAxis: {
         },
         series: [{
            type: graphType,
            data: tushumingchengValArr
         }]
      };
      // 使用刚指定的配置项和数据显示图表。
      myChart.setOption(option);
   }
   function getDetails(){
            byVal();
   }
   // 值 字段 数据绑定
   function dataBindByValue(list){
            for(var i=0;i<list.length;i++){
               tushumingchengNameArr.push(list[i].tushumingcheng);
               tushumingchengValArr.push(list[i].total.toFixed(2));
            }
         tushumingchengDraw();
   }

   //按值统计
   function byVal(){
   $.ajax({
      type: "GET",
      //url: baseUrl+"value/tongjipandian/"+xColumnName+'/'+yColumnName,
      url: baseUrl+"tongjipandian/value/"+xColumnName+'/'+yColumnName,
      data:{ },
      beforeSend: function(xhr) {
         xhr.setRequestHeader("token", window.sessionStorage.getItem('token'));
      },
      success: function(res){                
         if(res.code == 0){
            console.log(res.data)
            if(res.data != null){
               dataBindByValue(res.data);
            }
         }else if(res.code == 401){
            <%@ include file="../../static/toLogin.jsp"%>         
         }else{
            alert(res.msg);
         }
      },
   });
   }

   function group(colName){
      $.ajax({
         type: "GET",
         //url: baseUrl+"group/tongjipandian/"+colName,
         url: baseUrl+"tongjipandian/group/"+colName,
         data:{ tableName: "tongjipandian",
               columnName: colName
               },
         beforeSend: function(xhr) {
            xhr.setRequestHeader("token", window.sessionStorage.getItem('token'));
         },
         success: function(res){                
            if(res.code == 0){
               console.log(res.data)
               if(res.data != null){
                  groupDataBind(res.data,colName);
               }
            }else if(res.code == 401){
               <%@ include file="../../static/toLogin.jsp"%>         
            }else{
               alert(res.msg);
            }
         },
      });
   }
   // 类字段的数据处理
   function groupDataBind(list,colName){
      
   }
   // 用户登出
   <%@ include file="../../static/logout.jsp"%>
   </script>
</body>

</html>

7.代码目录结构及Controller目录

​​​​​​​

7.1web页面目录

8.课设心得

在完成JSP/Java Web图书销售管理系统的项目过程中,我深刻地体会到了软件开发的复杂性和实践的重要性。以下是我的心得体会:

设计很重要:在项目开发的初期,我花了很多时间进行模块设计、数据库设计和UI设计等方面的工作。这些设计的质量直接关系到系统的易用性、可扩展性和可维护性。在设计过程中,我们需要充分考虑实际需求和用户体验,同时也要考虑到代码的可读性和可维护性,这是非常重要的。自我学习能力:在项目开发过程中,我遇到了许多新的问题和挑战,包括技术难点、调试问题和文档撰写等方面。这就需要及时积累相关知识和技能,提高自己的学习能力,从而更快地解决问题,提高项目工作的效率。不断提升:JSP/Java Web图书销售管理系统的完成只是一个开始,实际上我们需要不断地完善和提升该系统,更好地满足用户的需求。这需要我们对系统进行监控和改进,发现系统中存在的问题和不足,并及时进行优化和改进。只有不断提升,才能让我们的系统更加适应不断变化的市场需求。综上所述,完成这个项目是一次不断学习和实践的过程,通过实践、团队协作和思考等,我对软件开发的流程和方法有了更深入的了解。同时也让我深刻地认识到,在软件开发的过程中,既要注重细节,又要把握整体,才能将项目开发得更加成功。

9.存在的问题

在设计和实现图书销售管理系统的过程中,我发现以下问题需要改进和解决:

1. 用户需求分析不足:在项目启动和需求分析阶段,我对用户需求分析得不够深入。这导致一些功能的开发过程中存在些许问题,需要重新修正。我需要提高用户需求分析的能力,让项目满足用户的实际需求。

2. 代码可读性和可维护性有待提高:在项目的实现过程中,我们需要更好地组织代码,注重代码的规范和清晰,便于后期维护和升级。

3. 系统性能有待提高:针对性能问题,我们需要对系统的各个模块进行性能测试、优化和改进。

4. 文档和维护计划不完善:在项目的实施和交付过程中,我们没有做好足够的文档和维护计划。这导致一些问题的维护和升级过程中缺乏有效参考。我们需要更加注重文档的编写和维护计划的制定,以便于后续的维护和升级工作。

基于以上问题,我有以下建议:

1. 充分进行用户需求分析:在项目需求分析阶段,我们需要充分了解用户实际需求,并与用户进行深入的沟通和交流,以确保项目的设计和实现能够真正满足用户的需求。

2. 优化代码质量和可维护性:在项目的实现中,我们需要加强对代码的规范、清晰和规范化的实现,从而提高代码的可读性和可维护性,便于项目后期的维护和升级。

3. 强化系统性能和安全性的保障:在项目的实施和运行过程中,我们需要加强对系统性能和安全性的测试和调试,提高系统的可靠性和稳定性。

4. 加强文档编写和维护计划的制定:在项目交付过程中,我们需要做好系统文档和维护计划的编写和制定,便于后续的维护和升级工作。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值