Java实战之网上书店管理系统的实现

news2024/10/5 22:24:42
目录
  • 1.效果展示
  • 2.需求功能
  • 3.系统总体设计及部分代码
    • 3.1登录模块设计
    • 3.2新用户的注册
    • 3.3图书添加模块
    • 3.4图书添加事件
    • 3.5买家信息维护
    • 3.6订单管理模块
  • 4.数据库设计
    • 4.1系统数据库设计
    • 4.2系统E-R图设计
  • 5.JDBC连接数据库

1.效果展示

2.需求功能

用户可以进行注册登陆系统,在用户的界面上,其可以进行查看网上书店里的图书类别和所在类别下的图书,根据自己的需求可在订单项目里添加订单购买自己喜欢的图书;

管理员可以通过自己的账号登录到管理员系统对书店进行管理,其可实现对图书的添加,修改,查询,和删除功能,可以查看用户的订单,修改和维护订单。添家客户的信息用以统计数据。

在构造系统时,首先从需求出发构造数据库,然后再由数据库表结合需求划分系统功能模块。这样,就把一个大的系统解成了几个小系统。这里把系统划分为了三个模块:用户登录模块,管理员模块,用户购买模块。模块分别能够实现以下功能:

  • 登录模块:实现登录,注册功能。
  • 管理员模块:实现对图书的添加修改和删除以及对订单的添加修改和删除功能。
  • 用户购买模块:实现对图书的查找以及对所需图书的下单功能。

3.系统总体设计及部分代码

3.1登录模块设计

用户正确输入用户名和密码,连接到数据库,登录成功!

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

private void loginActionPerformed(ActionEvent evt) {

         String userName=this.userNameTxt.getText();

        String password=new String(this.passwordTxt.getPassword());

        if(StringUtil.isEmpty(userName)){

            JOptionPane.showMessageDialog(null, "用户名不能为空!");

            return;

        }

        if(StringUtil.isEmpty(password)){

            JOptionPane.showMessageDialog(null, "密码不能为空!");

            return;

        }

        CUser cuser=new CUser(userName,password);

        Connection con=null;

        try {

            con=dbUtil.getCon();

            CUser currentCUser =cuserDao.login(con,cuser);

            if(currentCUser!=null){

                dispose();

                new CMainFrm().setVisible(true);

            }else{

                JOptionPane.showMessageDialog(null, "用户名或者密码错误!");

            }

         

        } catch (Exception e) {

            // TODO 自动生成的 catch 块

            e.printStackTrace();

        }

3.2新用户的注册

此模块的核心是创建实例化对象。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

private void registrationActionPerformed(ActionEvent evt) {

        String userName=this.userNameTxt.getText();

        String password=this.passwordTxt.getText();

        if(StringUtil.isEmpty(userName)){

            JOptionPane.showMessageDialog(null, "用户名不能为空!");

            return;

        }

        if(StringUtil.isEmpty(password)){

            JOptionPane.showMessageDialog(null, "密码不能为空!");

            return;

        }

        Registration registration= new Registration(userName,password);

        Connection con= null;

        try {

            con=dbUtil.getCon();

            int n= registrationDao.add(con, registration);

            if(n==1){

                JOptionPane.showMessageDialog(null, "注册成功!");

                resetValue();

            }else{

                JOptionPane.showMessageDialog(null, "注册失败!");

            }

        }catch(Exception e) {

        }finally {

            try {

                dbUtil.closeCon(con);

            } catch (Exception e) {

                // TODO 自动生成的 catch 块

                e.printStackTrace();

                JOptionPane.showMessageDialog(null, "注册失败!");

            }

        }

    }

3.3图书添加模块

管理员在此界面上可对系统里的图书进行查询修改和删除。

?

1

2

3

4

5

6

7

8

9

10

11

12

public static void main(String[] args) {

        EventQueue.invokeLater(new Runnable() {

            public void run() {

                try {

                    BookAddInterFrm frame = new BookAddInterFrm();

                    frame.setVisible(true);

                } catch (Exception e) {

                    e.printStackTrace();

                }

            }

        });

    }

3.4图书添加事件

此界面主要实现图书的添加功能。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

/**

*图书添加事件

*/

private void bookAddActionPerformed(ActionEvent evt) {

        String bookName=this.bookNameTxt.getText();

        String author=this.authorTxt.getText();

        String price=this.priceTxt.getText();

        String bookDesc=this.bookDescTxt.getText();

        if(StringUtil.isEmpty(bookName)){

            JOptionPane.showMessageDialog(null, "图书名称不能为空!");

            return;

        }

        if(StringUtil.isEmpty(author)){

            JOptionPane.showMessageDialog(null, "图书作者不能为空!");

            return;

        }

        if(StringUtil.isEmpty(price)){

            JOptionPane.showMessageDialog(null, "图书价格不能为空!");

            return;

        }

        String sex="";

        if(manJrb.isSelected()){

            sex="男";

        }else if(femaleJrb.isSelected()){

            sex="女";

        }

        BookType bookType=(BookType) bookTypeJcb.getSelectedItem();

        int bookTypeId=bookType.getId();

        Book book=new Book(bookName,author, sex, Float.parseFloat(price) , bookTypeId,  bookDesc);

        Connection con=null;

        try{

            con=dbUtil.getCon();

            int addNum=bookDao.add(con, book);

            if(addNum==1){

                JOptionPane.showMessageDialog(null, "图书添加成功!");

                resetValue();

            }else{

                JOptionPane.showMessageDialog(null, "图书添加失败!");

            }

        }catch(Exception e){

            e.printStackTrace();

            JOptionPane.showMessageDialog(null, "图书添加失败!");

        }finally{

            try {

                dbUtil.closeCon(con);

            } catch (Exception e) {

                // TODO Auto-generated catch block

                e.printStackTrace();

            }

        }

    }

    /**

     * 重置表单

     */

    private void resetValue(){

        this.bookNameTxt.setText("");

        this.authorTxt.setText("");

        this.priceTxt.setText("");

        this.manJrb.setSelected(true);

        this.bookDescTxt.setText("");

        if(this.bookTypeJcb.getItemCount()>0){

            this.bookTypeJcb.setSelectedIndex(0);

        }

    }

    /**

     * 初始化图书类别下拉框

     */

    private void fillBookType(){

        Connection con=null;

        BookType bookType=null;

        try{

            con=dbUtil.getCon();

            ResultSet rs=bookTypeDao.list(con, new BookType());

            while(rs.next()){

                bookType=new BookType();

                bookType.setId(rs.getInt("id"));

                bookType.setBookTypeName(rs.getString("bookTypeName"));

                this.bookTypeJcb.addItem(bookType);

            }

        }catch(Exception e){

            e.printStackTrace();

        }finally{

        }

    }

}

3.5买家信息维护

此模块主要用于对买家信息的查找和维护。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

/**

 * 买家信息搜索事件处理

 */

protected void consumerSerachActionPerformed(ActionEvent evt) {

    String s_consumerName= this.s_consumerNameTxt.getText();

    Consumer consumer=new Consumer();

    consumer.setConsumerName(s_consumerName);

    this.fillTable(consumer);

}

private void fillTable(Consumer consumer){

    DefaultTableModel dtm=(DefaultTableModel) consumerTable.getModel();

    dtm.setRowCount(0); // 设置成0行

    Connection con=null;

    try{

        con=dbUtil.getCon();

        ResultSet rs=consumerDao.list(con, consumer);

        while(rs.next()){

            Vector v=new Vector();

            v.add(rs.getString("id"));

            v.add(rs.getString("consumerName"));

            v.add(rs.getString("sex"));

            v.add(rs.getString("age"));

            v.add(rs.getString("number"));

            v.add(rs.getString("bookName"));

            dtm.addRow(v);

        }

    }catch(Exception e){

        e.printStackTrace();

    }finally {

        try {

            dbUtil.closeCon(con);

        } catch (Exception e) {

            // TODO 自动生成的 catch 块

            e.printStackTrace();

        }

    }

}

/**

 * 买家信息修改

 */

private void consumerUpdateActionEvet(ActionEvent evt) {

    String id=idTxt.getText();

    String consumerName=consumerNameTxt.getText();

    String sex=sexTxt.getText();

    String age=ageTxt.getText();

    String number=numberTxt.getText();

    String bookName=bookNameTxt.getText();

    if(StringUtil.isEmpty(id)){

        JOptionPane.showMessageDialog(null, "请选择要修改的记录");

        return;

    }

    if(StringUtil.isEmpty(consumerName)){

        JOptionPane.showMessageDialog(null, "购书者名称不能为空");

        return;

    }

    if(StringUtil.isEmpty(age)){

        JOptionPane.showMessageDialog(null, "年龄不能为空");

        return;

    }

    if(StringUtil.isEmpty(number)){

        JOptionPane.showMessageDialog(null, "联系方式不能为空");

        return;

    }

    if(StringUtil.isEmpty(bookName)){

        JOptionPane.showMessageDialog(null, "图书名称不能为空");

        return;

    }

    if(StringUtil.isEmpty(sex)){

        JOptionPane.showMessageDialog(null, "性别不能为空");

        return;

    }

    Consumer consumer=new Consumer(Integer.parseInt(id),consumerName,sex,age,number,bookName);

    Connection con=null;

    try {

        con=dbUtil.getCon();

        con=dbUtil.getCon();

        int modifyNum=consumerDao.update(con, consumer);

        if(modifyNum==1){

            JOptionPane.showMessageDialog(null, "修改成功");

            this.resetValue();

            this.fillTable(new Consumer());

        }else{

            JOptionPane.showMessageDialog(null, "修改失败");

        }

    }catch(Exception e) {

        e.printStackTrace();

        JOptionPane.showMessageDialog(null, "修改失败");

    }finally {

        try {

            dbUtil.closeCon(con);

        } catch (Exception e) {

            // TODO 自动生成的 catch 块

            e.printStackTrace();

        }

    }

}

3.6订单管理模块

此模块用于图书订单管理,查找,修改,删除等功能的实现。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

/**

 * 订单修改事件

 */

protected void orderUpdateActionPerformed(ActionEvent evt) {

    String id=this.idTxt.getText();

    if(StringUtil.isEmpty(id)){

        JOptionPane.showMessageDialog(null, "请选择要修改的记录");

        return;

    }

    String addressee=this.addresseeTxt.getText();

    String number=this.numberTxt.getText();

    String deliveryMent=this.deliveryMentTxt.getText();

    String paymentMethod=this.paymentMethodTxt.getText();

    String shippingAddress=this.shippingAddressTxt.getText();

    if(StringUtil.isEmpty(addressee)){

        JOptionPane.showMessageDialog(null, "收件人不能为空!");

        return;

    }

    if(StringUtil.isEmpty(number)){

        JOptionPane.showMessageDialog(null, "购买数量不能为空!");

        return;

    }

    if(StringUtil.isEmpty(deliveryMent)){

        JOptionPane.showMessageDialog(null, "运送方式不能为空!");

        return;

    }

    if(StringUtil.isEmpty(paymentMethod)){

        JOptionPane.showMessageDialog(null, "支付方式不能为空!");

        return;

    }

    if(StringUtil.isEmpty(paymentMethod)){

        JOptionPane.showMessageDialog(null, "收件地址不能为空!");

        return;

    }

    Book book=(Book) this.bookNameJcb.getSelectedItem();

    int bookId=book.getId();

    Order order =new Order(Integer.parseInt(id), addressee, number, deliveryMent, paymentMethod, shippingAddress,

            bookId);

    Connection con =null;

    try {

        con=dbUtil.getCon();

        int addNum=orderDao.update(con, order);

        if(addNum==1) {

            JOptionPane.showMessageDialog(null, "订单修改成功!");

            resetValue();

            this.fillTable(new Order());

        }else {

            JOptionPane.showMessageDialog(null, "订单修改失败!");

        }

    }catch(Exception e) {

        e.printStackTrace();

    }finally {

        try {

            dbUtil.closeCon(con);

        } catch (Exception e) {

            // TODO 自动生成的 catch 块

            e.printStackTrace();

            JOptionPane.showMessageDialog(null, "订单添加失败!");

        }

    }

}

4.数据库设计

4.1系统数据库设计

使用sql语句查询项目存储数据用到的数据库表格:

1.管理员信息表

列名数据类型长度主键非空自增
IdInt11
usenamevarchar20
passwordvarchar20

2.图书类型信息表

列名数据类型长度主键非空自增
idInt11
BookTypeNameVarchar20
bookTypeDesVarchar20

3.图书信息表

列名数据类型长度主键非空自增
BooknameInt11
AuthorVarchar20
SexVarchar10
PriceFloat10
bookTypeIdInt11
bookDescVarchar1000

4.订单信息表

列名数据类型长度主键非空自增
BuyidInt11
NameVarchar20
SexVarchar20
BuybooknamtelVarchar20
WayVarchar20
AddressVarchar20

5.买家信息表

列名数据类型长度主键非空自增
IdInt11
ConsumernameVarchar50
SexVarchar50
AgeVarchar50
NumberVarchar50
BooknameVarchar50

4.2系统E-R图设计

5.JDBC连接数据库

一定要安装数据库jdbc驱动包!

代码展示:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

package com.util;

import java.sql.Connection;

import java.sql.DriverManager;

/**

 * 数据库工具类

 */

public class DbUtil {

    private String jdbcName="com.mysql.cj.jdbc.Driver";      // 驱动名称

    数据库连接地址   由于数据库为最新版本  导致驱动名称已改为com.mysql.cj.jdbc.Driver

    //由于时区错乱  执行命令给MySQL服务器设置时区为东八区    serverTimezone=GMT%2B8

    private String dbUrl="jdbc:mysql://localhost:3306/db_book?serverTimezone=GMT%2B8";// 数据库连接地址

    private String dbuserName = "root";                         // 用户名

    private String dbpassWord = "abc123";                         // 密码

    /**

     * 获取数据库连接

     */

    public Connection getCon()throws Exception{

        Class.forName(jdbcName);

        Connection con=DriverManager.getConnection(dbUrl, dbuserName, dbpassWord);

        return con;

    }

    /**

     * 关闭数据库连接

     */

    public void closeCon(Connection con)throws Exception{

        if(con!=null){

            con.close();

        }

    }

    public static void main(String[] args) {

        DbUtil dbUtil=new DbUtil();

        try {

            dbUtil.getCon();

            System.out.println("数据库连接成功!");

        } catch (Exception e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

            System.out.println("数据库连接失败");

        }

    }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/820700.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

文心大模型企业应用私享会·上海站:共话大模型前沿技术与产业应用创新

当前,人工智能已经成为新一轮科技革命和产业变革的重要驱动力量,基于强算法、大算力和大数据的大模型成为人工智能发展的主流方向。 7月28日下午,“文心大模型企业应用私享会-上海站”于百度飞桨(张江)人工智能产业赋能…

如何压缩图片大小?最新图片压缩技巧分享

现在很多平台对于上传的图片大小都有限制,比如不能超过20k,当图片大小超出该值时就需要进行压缩,下面就针对这个问题给大家分享几个简单实用的图片压缩方法,需要的朋友一起来Get吧~ 一、画图工具 画图是Windows系统自带的工具&am…

BugKu CTF(杂项篇MISC)—善用工具

BugKu CTF(杂项篇MISC)—善用工具 描 述: webp。 下载压缩包。解压得到以后3个文件。 一、工具 十六进制编辑工具 010 editor Free_File_Camouflage图片隐写工具 二、解题思路 1.先看看hint.png,发现打不开,用010 editor编辑器打开是乱码。属性也没…

ipad手写笔有必要买苹果原装吗?平价电容笔推荐

目前,市场上的电容笔品牌越来越多,我们在挑选的时候,很容易就会被坑,比如说,我们买到的那些书写时经常会写字断触,或是防误触功能失效。因此我们在购买时一定要擦亮眼睛。至于那些把ipad当成学习工具的人&a…

展销系统springboot vue展会新闻场地管理java源代码mysql

本项目为前几天收费帮学妹做的一个项目,Java EE JSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。 一、项目描述 展销系统springboot vue 系统有3权限:管理…

【Java练习题汇总】《第一行代码JAVA》综合测试三,汇总Java练习题

Java练习题 综合测试三 1️⃣ 综合测试三 1️⃣ 综合测试三 线程的启动方法是( )。 A. run() B. start() C. begin() D. accept() Thread 类提供表示线程优先级的静态常量,代表普通优先级的静态常量是( )。 A. MAX_PRIORITY B. MIN_PRIORITY C. NORMAL_PRIORITY D…

亚马逊怎么样下单风控最低

在下单过程中,亚马逊会使用风控措施以保护用户和平台的安全。这些风控措施可能会随着时间和情况的变化而调整,因此最低风控标准也可能会随之改变。 要确保顺利下单,你可以尝试遵循以下几点建议: 1、使用真实有效的个人信息&#…

限流式保护器在古建筑电气火灾中的应用

安科瑞 华楠 【摘要】针对文物古建筑本身火灾危险性大,并且其内部电气问题较多,增加了火灾危险性的特点,提出了预防电气火灾的措施。 【关键词】古建筑;电气防火;限流式保护器; 文物古建筑是中华民族历史文…

Spring的@Scheduled

Spring的Scheduled的默认线程池数量为1,也就是说定时任务是单线程执行的。这意味着最多同时只有一个任务在执行。当一个任务还在执行时,其他任务会等待其完成,然后按照其预定的执行策略依次执行。 测试代码: 启动类上加注解Enab…

ffmpeg + nginx 实现rtsp视频流转m3u8视频流,转码推流(linux)

FFmpeg即是一款音视频编解码工具,同时也是一组音视频编码开发套件,作为编码开发套件,它为开发者提供了丰富的音视频处理的调用接口。 FFmpeg提供了多种媒体格式的封装和解封装,包括多种音视频编码、多种协议的流媒体、多种多彩格式…

【Spring框架】SpringMVC

目录 什么是Spring MVC实现客户端和程序之间的“连接”1.1 RequestMapping1.2GetMapping1.3PostMapping 获取参数2.1.1 获取单个参数2.1.2 获取多个参数2.1.3 获取对象2.2 后端参数重命名2.3 RequestBody 接收JSON对象2.4 获取URL中参数PathVariable2.5 上传⽂件RequestPart2.6…

机器学习深度学习——数值稳定性和模型化参数(详细数学推导)

👨‍🎓作者简介:一位即将上大四,正专攻机器学习的保研er 🌌上期文章:机器学习&&深度学习——Dropout 📚订阅专栏:机器学习&&深度学习 希望文章对你们有所帮助 这一部…

Leetcode每日一题:141. 环形链表、142. 环形链表 II、143. 重排链表(2023.7.29、30、31 C++)

目录 141. 环形链表 问题描述: 实现代码与解析: 快慢指针: 原理思路: 142. 环形链表 II 问题描述: 实现代码与解析: 快慢指针 原理思路: 143. 重排链表 题目描述: 实现…

Flask简介与基础入门

一、了解框架 Flask作为Web框架,它的作用主要是为了开发Web应用程序。那么我们首先来了解下Web应用程序。Web应用程序 (World Wide Web)诞生最初的目的,是为了利用互联网交流工作文档。 1、一切从客户端发起请求开始。 所有Flask程序都必须创建一个程序…

HW2: LibriSpeech phoneme classification

任务描述 音位分类预测(Phoneme classification),通过语音数据,预测音位。音位(phoneme),是人类某一种语言中能够区别意义的最小语音单位,是音位学分析的基础概念。每种语言都有一套…

【CesiumJS材质】(2)图片横向移动

效果示例 要素说明: 代码 /** Date: 2023-07-19 11:15:22* LastEditors: ReBeX 420659880qq.com* LastEditTime: 2023-07-28 12:08:58* FilePath: \cesium-tyro-blog\src\utils\Material\FlowPictureMaterialProperty.js* Description: 流动纹理/图片材质*/ imp…

PySpark 数据操作(综合案例)

搜索引擎日志分析 要求: 读取文件转换成RDD,并完成: 打印输出:热门搜索时间段(小时精度)Top3打印输出:热门搜索词Top3打印输出:统计黑马程序员关键字在哪个时段被搜索最多将数据转…

02|Oracle学习(数据类型、DDL)

1. 数据类型: 通常为:字符型、数值型、日期型以及大字段型大字段型:存放大数据及文件。 存储大数据时,基本上blob就能满足。 2. DDL(数据库定义语言) 主要包括对数据库对象的创建、删除及修改的操作。…

16. Spring Boot 统一功能处理

目录 1. 用户登录权限校验 1.1 最初用户登录验证 1.2 Spring AOP 用户统一登陆验证 1.3 Spring 拦截器 1.3.1 创建自定义拦截器 1.3.2 将自定义拦截器加入系统配置 1.4 练习:登录拦截器 1.5 拦截器实现原理 1.6 统一访问前缀添加 2. 统一异常处理 3. 统…

Redis篇

文章目录 Redis-使用场景1、缓存穿透2、缓存击穿3、缓存雪崩4、双写一致5、Redis持久化6、数据过期策略7、数据淘汰策略 Redis-分布式锁1、redis分布式锁,是如何实现的?2、redisson实现的分布式锁执行流程3、redisson实现的分布式锁-可重入4、redisson实…