基于JavaSE的淘宝卖鞋后端管理系统的设计与实现

2023-11-09 14:10

本文主要是介绍基于JavaSE的淘宝卖鞋后端管理系统的设计与实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 一、创建数据库
  • 二、创建JavaSE项目
    • 新建实体类
    • 新建Dao类
    • 新建View类
  • 三、模拟页面功能


一、创建数据库

数据库就像盖房子用的地基,所以数据库一定要建好

查看创建数据库及建表语句请点我

DROP TABLE IF EXISTS admin;CREATE TABLE admin -- 管理员表
(id int PRIMARY KEY auto_increment,  -- 管理员IDname VARCHAR(20) NOT NULL UNIQUE,   -- 管理员姓名password VARCHAR(20)	NOT NULL    -- 管理员密码
);DROP TABLE IF EXISTS shop;CREATE TABLE shop -- 商家表
(shopId INT PRIMARY KEY auto_increment,  -- 商家IDshopName    VARCHAR(40) NOT NULL,       -- 商家名shopAddress VARCHAR(50),   -- 商家地址shopExplain VARCHAR(40),   -- 商品鞋子介绍salePrice     DECIMAL(7,2) DEFAULT 0.00,     -- 所售价格deliveryPrice DECIMAL(7,2) DEFAULT 0.00		 -- 快递费
);DROP TABLE IF EXISTS goods;CREATE TABLE goods -- 商品鞋子表
(goodsId INT PRIMARY KEY auto_increment,  -- 鞋子IDgoodsName    VARCHAR(30) NOT NULL,   -- 鞋子名称goodsExplain VARCHAR(30),            -- 鞋子介绍goodsPrice DECIMAL(7,2) NOT NULL,    -- 鞋子价格shopId INT NOT NULL, 	-- 所属商家编号FOREIGN KEY(shopId) REFERENCES shop(shopId)   -- 外键      
);

数据初始化,添加数据,给数据一个初值

-- 管理员数据初始化
INSERT INTO admin (name,PASSWORD)
VALUES('张三','123456'),('admin','123456');  -- 商家数据初始化
INSERT INTO shop(shopName,shopAddress,shopExplain)
VALUES('鞋子专卖店','津海市邮局对过','二哈鞋店');-- 商品鞋子数据初始化
INSERT INTO goods(goodsName,goodsExplain,goodsPrice,shopId)
VALUES('篮球鞋','一对一定制',2500.00,1),('运动鞋','飞一般的感觉',2300.00,1),('雪地靴','鞋子就是最好的代言人',2000.00,1);

二、创建JavaSE项目

打开Java编程工具创建新项目,然后右键创建Model包、Dao包、View包和 util包(用到了JDBC连接,其中代码可以去其专栏查看),所以需要新建lib文件夹存放jar包并将jar包添加至构建路径。

此时应该看到项目的结构:
在这里插入图片描述
项目中各类之间的关系说明


新建实体类

这里实体类取名model

有几个表就新建几个实体类,右键Model包新建类,类名与表名一致,需要大写

实体类是简单的 java对象,用于封装数据
实体类类和数据库中的表对应

下面的四个方法要先写私有属性,其他的没有具体的先后顺序,都是系统自动生成,可以点击此链接查看实体类中快速生成各个方法

①、新建管理员类Admin

建类没有顺序,只要全建完即可,我这里是先新建的Admin类

  1. 先写私有属性,与表中列对应
	private Integer id; //写包装类private String name;private String password;
  1. 两个构造方法(有参、无参)
	public Admin(Integer id, String name, String password) {super();this.id = id;this.name = name;this.password = password;}public Admin() {super();}
  1. getter/setter方法
	public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}
  1. 重写toString

下面代码是系统自动生成的,我们给它改成中文格式方便后续查看数据

	@Overridepublic String toString() {return "Admin [id=" + id + ", name=" + name + ", password=" + password + "]";}

开始的类名删掉,中括号删掉,冒号代替等号,Tab键【\t】代替逗号,字符串中的英文改对应的意思,最后的中括号也删掉

更改格式后:

	@Overridepublic String toString() {return "管理员id:" + id + "\t 管理员名字:" + name + "\t 管理员密码:" + password ;}

②、新建商家类Shop

public class Shop {private Integer shopId;private String shopName;private String shopAddress;private String shopExplain;private Double salePrice;private Double deliveryPrice;public Shop(Integer shopId, String shopName, String shopAddress, String shopExplain, Double salePrice,Double deliveryPrice) {super();this.shopId = shopId;this.shopName = shopName;this.shopAddress = shopAddress;this.shopExplain = shopExplain;this.salePrice = salePrice;this.deliveryPrice = deliveryPrice;}public Shop() {super();// TODO 自动生成的构造函数存根}public Integer getShopId() {return shopId;}public void setShopId(Integer shopId) {this.shopId = shopId;}public String getShopName() {return shopName;}public void setShopName(String shopName) {this.shopName = shopName;}public String getShopAddress() {return shopAddress;}public void setShopAddress(String shopAddress) {this.shopAddress = shopAddress;}public String getShopExplain() {return shopExplain;}public void setShopExplain(String shopExplain) {this.shopExplain = shopExplain;}public Double getSalePrice() {return salePrice;}public void setSalePrice(Double salePrice) {this.salePrice = salePrice;}public Double getDeliveryPrice() {return deliveryPrice;}public void setDeliveryPrice(Double deliveryPrice) {this.deliveryPrice = deliveryPrice;}@Overridepublic String toString() {return "商家编号:" + shopId + "\t 商家名称:" + shopName + "\t 商家地址:" + shopAddress + "\t 商家介绍:"+ shopExplain + "\t 所售价格:" + salePrice + "\t 快递费:" + deliveryPrice ;}}

③、新建商品鞋子类Goods

public class Goods {private Integer goodsId;private String goodsName;private String goodsExplain;private double goodsPrice;private Integer shopId;public Goods(Integer goodsId, String goodsName, String goodsExplain, double goodsPrice, Integer shopId) {super();this.goodsId = goodsId;this.goodsName = goodsName;this.goodsExplain = goodsExplain;this.goodsPrice = goodsPrice;this.shopId = shopId;}public Goods() {super();// TODO 自动生成的构造函数存根}public Integer getGoodsId() {return goodsId;}public void setGoodsId(Integer goodsId) {this.goodsId = goodsId;}public String getGoodsName() {return goodsName;}public void setGoodsName(String goodsName) {this.goodsName = goodsName;}public String getGoodsExplain() {return goodsExplain;}public void setGoodsExplain(String goodsExplain) {this.goodsExplain = goodsExplain;}public double getGoodsPrice() {return goodsPrice;}public void setGoodsPrice(double goodsPrice) {this.goodsPrice = goodsPrice;}public Integer getShopId() {return shopId;}public void setShopId(Integer shopId) {this.shopId = shopId;}@Overridepublic String toString() {return "鞋子编号:" + goodsId + "\t 鞋子名称:" + goodsName + "\t 鞋子介绍:" + goodsExplain+ "\t 鞋子价格:" + goodsPrice + "\t 所属鞋子编号:" + shopId ;}}

新建Dao类

写完model层后写它的调用者dao
一个表对应一个dao类,一个dao类负责一个表的基本的增删改查操作

右键dao包新建dao类,采用驼峰式命名:表名+Dao

同样这里建类也没有顺序,只要全建完即可,我这里是先新建的AdminDao类

AdminDao类只考虑对admin管理员操作,这个项目中只考虑查询,用查询模拟登录

①、新建管理员dao类AdminDao

  1. 定义方法三要素
public boolean login (Admin admin) {   //对应的model类封装//登录就是个查询,结果只有成功或失败,查询用户名和密码是否正确boolean result = false;  //定义返回值,初始值false
}		
  1. 定义JDBC所需变量
	Connection connection = null;  //连接语句PreparedStatement preparedStatement = null;  //预编译语句ResultSet resultSet = null;  //查询语句//1、通过工具类拿到连接connection = JdbcUtil.createConnection();try {//2、创建语句                                      //3、写SQL查询语句,预编译语句中数据全换成?preparedStatement = connection.prepareStatement("select * from admin where name = ? and password = ?");  //try...catch处理异常//4、给?赋值  从1开始,从左到右        varchar类型preparedStatement.setString(1, admin.getName());  //取出用getpreparedStatement.setString(2, admin.getPassword());//5、把结果赋值给结果集           执行resultSet=preparedStatement.executeQuery();//不关注查到的数据,关注的是查没查到//6、if语句判断查没查到resultSet.next()if(resultSet.next()) {result = true;  //查到返回true} catch (SQLException e) {// TODO 自动生成的 catch 块e.printStackTrace();} finally {       //7、最终块关闭结果集、预编译语句、连接JdbcUtil.close(resultSet, preparedStatement, connection);}
  1. 把结果返回
return result;

下面是AdminDao类完整代码:

public class AdminDao {//dao类一般不需要定义属性//dao类一般只定义封装增删改查的数据的方法public boolean login (Admin admin) {//登录就是个查询,结果只有成功或失败,查询用户名和密码是否正确boolean result = false;Connection connection = null;  //连接语句PreparedStatement preparedStatement = null;  //预编译语句ResultSet resultSet = null;  //查询语句//通过工具类拿到连接connection = JdbcUtil.createConnection();try {//创建语句preparedStatement = connection.prepareStatement("select * from admin where name = ? and password = ?");//给?赋值                                 varchar类型preparedStatement.setString(1, admin.getName());preparedStatement.setString(2, admin.getPassword());//把结果赋值给结果集            执行resultSet=preparedStatement.executeQuery();//不关注查到的数据,关注的是查没查到if(resultSet.next()) {result = true;}} catch (SQLException e) {// TODO 自动生成的 catch 块e.printStackTrace();}finally {JdbcUtil.close(resultSet, preparedStatement, connection);}return result;}
}

最后:AdminDao类单元测试

就是看看刚才的代码是否有误

右键项目名新建【源文件夹】,命名test,然后右键test建包建类TestAdminDao

public class TestAdminDao {public static void main(String[] args) {//定义类时如果没定义构造方法,默认提供一个无参空的方法AdminDao dao = new AdminDao();  //测试login()方法,login()方法调用需要传一个Admin admin类型参数调用【AdminDao类第一行】Admin admin = new Admin();//用set方法放数据库中存在的用户名、密码admin.setName("admin");admin.setPassword("123456");//调用login()方法测试,admin是前三行代码中封装好的对象System.out.println(dao.login(admin));}
}  //返回true即为测试成功

②、新建商品鞋子dao类GoodsDao

商品鞋子类要有增删改查

public class GoodsDao {//增加public boolean addGoods(Goods goods) {boolean result = false;Connection connection = null;PreparedStatement preparedStatement = null;connection = JdbcUtil.createConnection();try {preparedStatement = connection.prepareStatement("insert into goods(goodsName,goodsExplain,goodsPrice,shopId) value (?,?,?,?)");preparedStatement.setString(1, goods.getGoodsName());preparedStatement.setString(2, goods.getGoodsExplain());preparedStatement.setDouble(3, goods.getGoodsPrice());preparedStatement.setInt(4, goods.getShopId());int rows = preparedStatement.executeUpdate();result = rows>0?true:false;  //三元运算符} catch (SQLException e) {// TODO 自动生成的 catch 块e.printStackTrace();}finally {JdbcUtil.close(preparedStatement, connection);}return result;}//删除  根据商品鞋子ID删除public boolean deleteGoods(int id) {boolean result = false;Connection connection = null;PreparedStatement preparedStatement = null;connection = JdbcUtil.createConnection();try {preparedStatement = connection.prepareStatement("delete from goods where goodsId=?");preparedStatement.setInt(1, id);int rows = preparedStatement.executeUpdate();if (rows>0) {//result=true;return true;}} catch (SQLException e) {// TODO 自动生成的 catch 块e.printStackTrace();} finally {JdbcUtil.close(preparedStatement, connection);}return result;}//修改   根据商家ID修改public boolean updateGoods(Goods goods) {boolean result =false;Connection connection = null;PreparedStatement preparedStatement = null;connection = JdbcUtil.createConnection();try {//鞋子的商家不能随便换preparedStatement = connection.prepareStatement("update goods set goodsName=?,goodsExplain=?,goodsPrice=? where goodsId=?");preparedStatement.setString(1, goods.getGoodsName());preparedStatement.setString(2, goods.getGoodsExplain());preparedStatement.setDouble(3, goods.getGoodsPrice());preparedStatement.setInt(4, goods.getGoodsId());int rows = preparedStatement.executeUpdate();if (rows>0){result = true;}} catch (SQLException e) {// TODO 自动生成的 catch 块e.printStackTrace();} finally {JdbcUtil.close(preparedStatement, connection);}return result;}}

增删改结构都差不多,代码步骤基本一致,下面是查询用到了集合,麻烦些
这里要把查询到的数据返回到view,用户

//查找       按照鞋子名字进行模糊查询
//集合类在使用时要使用泛型是model类型
//ArrayList适合查询遍历操作,查到一个显示一个public ArrayList<Goods> queryGoods(String goodsName){//创建集合ArrayList<Goods> list = new ArrayList<>();  Connection connection = null;PreparedStatement preparedStatement = null;ResultSet resultSet = null;connection = JdbcUtil.createConnection();try {preparedStatement = connection.prepareStatement("select * from goods where goodsName like ?");preparedStatement.setString(1, "%"+goodsName+"%");resultSet = preparedStatement.executeQuery();while (resultSet.next()) {//查出数据→进行封装Goods goods = new Goods();//调用set方法封装——封装的是取出(get)查询到的真的goods数据goods.setGoodsId(resultSet.getInt("goodsId"));goods.setGoodsName(resultSet.getString("goodsName"));goods.setGoodsExplain(resultSet.getString("goodsExplain"));goods.setGoodsPrice(resultSet.getDouble("goodsPrice"));goods.setShopId(resultSet.getInt("shopId"));//再把它放到集合里list.add(goods);}} catch (SQLException e) {// TODO 自动生成的 catch 块e.printStackTrace();}finally {JdbcUtil.close(resultSet, preparedStatement, connection);}return list;   //返回集合}

最后:GoodsDao类单元测试

单元测试在一个类中进行即可,这里取名是TestGoodsDao

添加测试

	public static void main(String[] args) {//创建Dao类对象GoodsDao dao = new GoodsDao();//创建model实体类对象Goods goods = new Goods();//把测试的数据封装到对象里goods.setGoodsName("足球鞋");goods.setGoodsExplain("尽享极致体验");goods.setGoodsPrice(2800);goods.setShopId(1);  //ID必须是存在的//调用方法测试并输出System.out.println(dao.addGoods(goods));  }

返回true,刷新数据库显示多了行数据
在这里插入图片描述
修改数据

修改数据中不修改商家ID

	public static void main(String[] args) {GoodsDao dao = new GoodsDao();Goods goods = new Goods();goods.setGoodsName("职业足球鞋");goods.setGoodsExplain("一代人的青春,尽心去跑");goods.setGoodsPrice(5000);//这里修改的是新添加的4号数据goods.setGoodsId(4);System.out.println(dao.updateGoods(goods));}

运行后输出true,刷新数据库显示改了4号数据
在这里插入图片描述
查询数据

	public static void main(String[] args) {GoodsDao dao = new GoodsDao();ArrayList<Goods> list = dao.queryGoods("");  //查询所有for(Goods goods2:list) {   //foreach遍历循环 输出System.out.println(goods2);}}

输出结果:
在这里插入图片描述

删除数据

	public static void main(String[] args) {GoodsDao dao = new GoodsDao();//删完后再删除显示falseSystem.out.println(dao.deleteGoods(4));  //删除4号数据}

输出结果:
在这里插入图片描述
②、新建商家dao类ShopDao

public class ShopDao {public boolean addShop(Shop shop) {boolean result = false;Connection connection = null;PreparedStatement preparedStatement = null;connection = JdbcUtil.createConnection();   try {												preparedStatement = connection.prepareStatement("insert into shop(shopName,shopAddress,shopExplain,salePrice,deliveryPrice) "+ "values(?,?,?,?,?)");preparedStatement.setString(1, shop.getShopName());preparedStatement.setString(2, shop.getShopAddress());preparedStatement.setString(3, shop.getShopExplain());preparedStatement.setDouble(4, shop.getSalePrice());preparedStatement.setDouble(5, shop.getDeliveryPrice());int rows = preparedStatement.executeUpdate();if (rows > 0 ) {result=true;}} catch (SQLException e) {// TODO 自动生成的 catch 块e.printStackTrace();}finally {JdbcUtil.close(preparedStatement, connection);}return result;}public boolean deleteShop(int id) {boolean result = false;Connection connection=null;PreparedStatement preparedStatement = null;connection = JdbcUtil.createConnection();try {preparedStatement = connection.prepareStatement("delete from shop where shopId = ?");preparedStatement.setInt(1, id);int rows = preparedStatement.executeUpdate();result = rows>0?true:false;} catch (SQLException e) {// TODO 自动生成的 catch 块e.printStackTrace();}finally {JdbcUtil.close(preparedStatement, connection);}return result;}public boolean updateShop(Shop shop) {boolean result = false;Connection connection = null;PreparedStatement preparedStatement = null;connection = JdbcUtil.createConnection();try {preparedStatement = connection.prepareStatement("update shop set shopName=?, shopAddress=?,shopExplain=?,salePrice=?,deliveryPrice=? where shopId=?");//如果表的列比较多的时候,赋值时序号就比较多,如果想之前的写法那数字部分容易写混//单独定义一个整数变量在前面  index下标索引的意思 int index=1;preparedStatement.setString(index++, shop.getShopName());preparedStatement.setString(index++, shop.getShopAddress());preparedStatement.setString(index++, shop.getShopExplain());preparedStatement.setDouble(index++, shop.getSalePrice());preparedStatement.setDouble(index++, shop.getDeliveryPrice());preparedStatement.setInt(index++, shop.getShopId());int rows = preparedStatement.executeUpdate();result = rows>0?true:false;} catch (SQLException e) {// TODO 自动生成的 catch 块e.printStackTrace();}finally {JdbcUtil.close(preparedStatement, connection);}return result;}//查询public ArrayList<Shop> queryShop (String name){ArrayList<Shop> list = new ArrayList<>();Connection connection = null;PreparedStatement preparedStatement = null;ResultSet resultSet = null;connection=JdbcUtil.createConnection();try {preparedStatement = connection.prepareStatement("select * from shop where shopName like ?");preparedStatement.setString(1, "%"+name+"%");resultSet = preparedStatement.executeQuery();while (resultSet.next()) {		Shop shop = new Shop();shop.setShopId(resultSet.getInt("shopId"));shop.setShopName(resultSet.getString("shopName"));shop.setShopAddress(resultSet.getString("shopAddress"));shop.setShopExplain(resultSet.getString("shopExplain"));shop.setSalePrice(resultSet.getDouble("salePrice"));shop.setDeliveryPrice(resultSet.getDouble("deliveryPrice"));list.add(shop);}		} catch (SQLException e) {// TODO 自动生成的 catch 块e.printStackTrace();}finally {JdbcUtil.close(resultSet, preparedStatement, connection);}return list;}}

最后:ShopDao类单元测试

单元测试在一个类中进行即可,这里取名是TestShopDao

添加测试

	public static void main(String[] args) {ShopDao dao = new ShopDao();Shop shop = new Shop();shop.setShopName("球星签名足球鞋");shop.setShopAddress("粤江市津海区");shop.setShopExplain("当红球星签名,收藏意义重大");shop.setSalePrice(8888.0);shop.setDeliveryPrice(198.0);//增加System.out.println(dao.addShop(shop));}

返回true,刷新数据库显示多了行数据
在这里插入图片描述
修改测试

	public static void main(String[] args) {ShopDao dao = new ShopDao();Shop shop = new Shop();shop.setShopName("签名鞋专卖");shop.setShopAddress("粤江市津海西区");shop.setShopExplain("收藏意义重大");shop.setSalePrice(8888.0);shop.setDeliveryPrice(198.0);//修改shop.setShopId(2);System.out.println(dao.updateShop(shop));}

返回true,刷新数据库显示改了第二条数据
在这里插入图片描述

查询测试

	public static void main(String[] args) {ShopDao dao = new ShopDao();//查询ArrayList<Shop> list = dao.queryShop("");for (Shop shop2 : list) {System.out.println(shop2);}}

输出结果:
在这里插入图片描述

删除测试

	public static void main(String[] args) {ShopDao dao = new ShopDao();		//删除   删完后显示falseSystem.out.println(dao.deleteShop(2));}

输出结果:
在这里插入图片描述

新建View类

视图类的方法和作用:
1、显示信息 输出语句
2、获得用户输入

暂时用输出语句显示内容,用scanner获得输入

①、新建商品鞋子视图GoodsView

public class GoodsView {private GoodsDao dao=new GoodsDao();//方便Dao类使用//视图类的方法和作用://1.显示信息  输出语句//2.获得用户输入public void showAddGoods() {System.out.println("增加鞋子信息");Scanner scanner = new Scanner(System.in);String name,explain;double price;int shopId;System.out.println("请输入鞋子名称");name = scanner.next();System.out.println("请输入鞋子介绍");explain = scanner.next();System.out.println("请输入鞋子价格");price = scanner.nextDouble();System.out.println("请输入鞋子所属商家ID");shopId = scanner.nextInt();//将输入的数据封装到po对象中Goods goods = new Goods();goods.setGoodsName(name);goods.setGoodsExplain(explain);goods.setGoodsPrice(price);goods.setShopId(shopId);//调用Dao类方法,完成数据操作boolean result = dao.addGoods(goods);//将最终的处理结果显示给用户if (result) {System.out.println("增加鞋子信息成功");} else {System.out.println("增加鞋子信息失败");}}public void showDeleteGoods () {System.out.println("删除鞋子信息");Scanner scanner = new Scanner(System.in);int id;System.out.println("请输入要删除的鞋子ID");id = scanner.nextInt();boolean result = dao.deleteGoods(id);if (result) {System.out.println("删除鞋子信息成功");} else {System.out.println("删除鞋子信息失败");}}public void showUpdateGoods() {System.out.println("修改鞋子信息");Scanner scanner = new Scanner(System.in);String name,explian;double price;int id;System.out.println("请输入要修改的鞋子ID");id = scanner.nextInt();System.out.println("请输入修改后的鞋子名称");name = scanner.next();System.out.println("请输入要修改的鞋子信息说明");explian = scanner.next();System.out.println("请输入要修改的鞋子价格");price = scanner.nextDouble();Goods foods = new Goods();foods.setGoodsId(id);foods.setGoodsName(name);foods.setGoodsExplain(explian);foods.setGoodsPrice(price);boolean result = dao.updateGoods(foods);if (result) {System.out.println("修改鞋子信息成功");} else {System.out.println("修改鞋子信息失败");}}public void showQueryGoods() {System.out.println("查询鞋子信息");Scanner scanner = new Scanner(System.in);String name;System.out.println("请输入查询的鞋子名字(支持模糊查询)");//name = scanner.next();  //next()方法输入的数据不允许空和空格name = scanner.nextLine();ArrayList<Goods> list = dao.queryGoods(name);if (list.size()>0) {System.out.println("查询到的鞋子信息如下");for (Goods foods : list) {System.out.println(foods);}} else {System.out.println("未查到满足条件的数据");}}}

最后:对GoodsView类进行单元测试

单元测试在还是在test包中进行即可,这里取名是TestGoodsView

添加商品鞋子视图测试

public static void main(String[] args) {GoodsView view = new GoodsView();//增加view.showAddGoods();
}

输出结果并刷新数据库:
在这里插入图片描述
修改商品鞋子视图测试

public static void main(String[] args) {GoodsView view = new GoodsView();//修改view.showUpdateGoods();
}

输出结果并刷新数据库:
在这里插入图片描述
查询商品鞋子视图测试

public static void main(String[] args) {GoodsView view = new GoodsView();//查询view.showQueryGoods();
}

输出结果:
在这里插入图片描述
删除商品鞋子视图测试

public static void main(String[] args) {GoodsView view = new GoodsView();//删除view.showDeleteGoods();
}

输出结果并刷新数据库:
在这里插入图片描述

②、新建商家视图GoodsView

public class ShopView {
private ShopDao dao = new ShopDao();public void showAddShop() {System.out.println("添加商家信息");Scanner scanner = new Scanner(System.in);String name,address,explain;double sprice,dprice;System.out.println("请输入商家名称");name=scanner.next();System.out.println("请输入商家地址");address=scanner.next();System.out.println("请输入商家介绍");explain=scanner.next();System.out.println("请输入商家所售价格");sprice=scanner.nextDouble();System.out.println("请输入商家快递费");dprice=scanner.nextDouble();Shop shop = new Shop();shop.setShopName(name);shop.setShopAddress(address);shop.setShopExplain(explain);shop.setSalePrice(sprice);shop.setDeliveryPrice(dprice);boolean result = dao.addShop(shop);if (result) {System.out.println("添加商家信息成功");} else {System.out.println("添加商家信息失败");}}public void showDeleteShop () {System.out.println("删除商家信息");Scanner scanner = new Scanner(System.in);int id;System.out.println("请输入要删除的商家ID");id = scanner.nextInt();boolean result = dao.deleteShop(id);if (result) {System.out.println("删除商家信息成功");} else {System.out.println("删除商家信息失败");}}public void showUpdateShop() {System.out.println("修改商家信息");Scanner scanner = new Scanner(System.in);String name,address,explain;double sprice,dprice;int id;System.out.println("请输入要修改的商家ID");id = scanner.nextInt();System.out.println("请输入修改后的商家名字");name=scanner.next();System.out.println("请输入修改后的商家地址");address=scanner.next();System.out.println("请输入修改后的商家介绍");explain=scanner.next();System.out.println("请输入修改后的商家所售价格");sprice=scanner.nextDouble();System.out.println("请输入修改后的商家快递费");dprice=scanner.nextDouble();Shop shop = new Shop();shop.setShopId(id);shop.setShopName(name);shop.setShopAddress(address);shop.setShopExplain(explain);shop.setSalePrice(sprice);shop.setDeliveryPrice(dprice);boolean result = dao.updateShop(shop);if (result) {System.out.println("修改商家信息成功");} else {System.out.println("修改商家信息失败");}}public void showQueryShop() {System.out.println("查询商品鞋子信息");Scanner scanner = new Scanner(System.in);String name;System.out.println("请输入查询的名字(支持模糊查询)");name = scanner.nextLine();ArrayList<Shop> list = dao.queryShop(name);if (list.size()>0) {System.out.println("查询到的商品鞋子信息如下");for (Shop shop : list) {System.out.println(shop);}} else {System.out.println("未查到满足条件的数据");}}}

最后:对ShopView类进行单元测试

单元测试在还是在test包中进行即可,这里取名是TestShopView

添加商家视图测试

public static void main(String[] args) {ShopView view = new ShopView();//增加view.showAddShop();
}

输出结果并刷新数据库:
在这里插入图片描述

修改商家视图测试

public static void main(String[] args) {ShopView view = new ShopView();		//修改view.showUpdateShop();
}

输出结果并刷新数据库:
在这里插入图片描述

查询商家视图测试

public static void main(String[] args) {ShopView view = new ShopView();	//查询view.showQueryShop();
}

输出结果:
在这里插入图片描述
删除商家视图测试

public static void main(String[] args) {ShopView view = new ShopView();	//删除view.showDeleteShop();
}

输出结果并刷新数据库:
在这里插入图片描述
但是这里注意:
商家编号为1的那条数据不能被删除

解释:

因为那个商品表里的各个商品鞋子都有个所属商家编号,他是外键链接,得先把所有的1号商家编号的商品鞋子删掉或改掉,才能再删那个商家编号为1的那条数据

外键约束:FOREIGN KEY

  1. 外键是别的表中的主键

  2. 依赖别人的表称为子表,在这个项目中是商品表依赖的商家表,所以商品表是子表

  3. 被别的表依赖的表称为父表,对比下商家表是父表

  4. 子表数据增加或修改时,数据必须在父表中存在

  5. 父表数据删除或修改时,数据没有被子表使用

所以当删除商家编号为1的那条数据时(shopId=1),商品表(goods表、子表)的外键中不能存在所属商家编号为1的数据
所以当shopId(所属商家编号、商品表外键)=1时,商家编号为1的那条数据不能被删除

三、模拟页面功能

在src内的taobao包下新建一个类,与dao、model、view类同级

大致思路:
首先定义一个主方法,输出欢迎信息并且接收用户输入的用户名和密码。
然后通过AdminDao类调用login方法来验证用户是否存在并且密码是否正确。
如果验证通过,则输出欢迎信息和管理系统的菜单选项,管理员可以根据自己的需要选择对应的菜单选项进行商品鞋子或者商家管理。
如果输入的菜单选项不合法,则提示输入有误,没有此功能菜单,并且让管理员重新选择。
如果验证失败,则提示用户名或密码错误。

public class TaoBaoEntry {public static void main(String[] args) {System.out.println("欢迎使用淘宝卖鞋后端管理系统");//接下来要输入用户名和密码Scanner scanner = new Scanner(System.in);String name,pwd;  //定义两个变量接受System.out.println("请输入用户名");name = scanner.next();  //将输入数据赋给nameSystem.out.println("请输入密码");pwd = scanner.next();//通过AdminDao类调用login方法来验证用户是否存在、密码是否正确AdminDao dao = new AdminDao();//创建admin对象,因为public boolean login(Admin admin) model类adminAdmin admin = new Admin();//调用两个set方法,把刚才输入的名字和密码封装到这对象里admin.setName(name);admin.setPassword(pwd);//调用方法拿到结果,用这个方法验证是否登录成功boolean result = dao.login(admin);//根据结果作出不同的选择进行if else判断if (result ) {//登录成功System.out.println("欢迎"+name+"使用淘宝卖鞋后端管理系统");} else {               //登录失败System.out.println("用户名或密码错误"); //防止恶意登录}					}}

这时候可以先测试下,输入已有的用户名和密码查看是否登录成功

接下来为系统提供一个菜单选择,提示功能操作,这里在登陆成功的地方写输出语句

    //1、写输出语句,提示选择System.out.println("鞋子增加请输入1");System.out.println("鞋子删除请输入2");System.out.println("鞋子修改请输入3");System.out.println("鞋子查询请输入4");System.out.println("商家增加请输入5");System.out.println("商家删除请输入6");System.out.println("商家修改请输入7");System.out.println("商家查询请输入8");//2、让用户获得操作int menu = scanner.nextInt();//3、创建对象视图GoodsView goodsView = new GoodsView();ShopView shopView = new ShopView();//4、做输入的判断switch (menu) {case 1:        //功能对应goodsView.showAddGoods();break;case 2:goodsView.showDeleteGoods();break;case 3:goodsView.showUpdateGoods();break;case 4:goodsView.showQueryGoods();break;case 5:shopView.showAddShop();break;case 6:shopView.showDeleteShop();break;case 7:shopView.showUpdateShop();break;case 8:shopView.showQueryShop();break;default:        //输入意外的提示System.out.println("输入有误,没有此功能菜单");}

但是到这项目还有个问题
在这里插入图片描述
就是项目执行完后自动退出,要想进行下一个功能的实现需要重新登录比较麻烦

那就把上面在登录成功内写的代码选中右键→包围方式→while循环
在这里插入图片描述
然后登录成功内的代码变成:

	while (true) {    //里面加true变成死循环可以一直运行System.out.println("鞋子增加请输入1");System.out.println("鞋子删除请输入2");System.out.println("鞋子修改请输入3");System.out.println("鞋子查询请输入4");System.out.println("商家增加请输入5");System.out.println("商家删除请输入6");System.out.println("商家修改请输入7");System.out.println("商家查询请输入8");int menu = scanner.nextInt();GoodsView goodsView = new GoodsView();ShopView shopView = new ShopView();switch (menu) {case 1:goodsView.showAddGoods();break;case 2:goodsView.showDeleteGoods();break;case 3:goodsView.showUpdateGoods();break;case 4:goodsView.showQueryGoods();break;case 5:shopView.showAddShop();break;case 6:shopView.showDeleteShop();break;case 7:shopView.showUpdateShop();break;case 8:shopView.showQueryShop();break;default:System.out.println("输入有误,没有此功能菜单");}}

现在运行程序后无论使用哪个功能程序都能继续运行下去,而且不会停止,陷入死循环

接下来手动停止该程序,加一个退出功能:

System.out.println("退出系统请输入9");
//在对应的位置加一个静态块
case 9:System.exit(0);  //0代表正常退出break;

运行输出:
在这里插入图片描述

至此整个淘宝卖鞋后端管理系统结束,系统已有功能运行完整

这篇关于基于JavaSE的淘宝卖鞋后端管理系统的设计与实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/376571

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu