一:针对用户自主点餐:
基本功能:
1)注册登录,退出登录
2)主页面中可以看到当前店家的菜品列表(菜名,价格,是否要进行选餐),
3)点击要选择的菜品,进行下单,多选勾中,进行进行点击就会选择下单
4)用户可以自己看到自己历史订单,只能看到自己下的单(序号,用户,状态就是显示订单是否完成,下单时间,还有一个按钮展示详情信息),每一个订单都是一行,表示一个订单
5)当我们进行点击这个详情按钮的时候,就会弹出一个输入框,显示各种菜单名字,菜单价格
6)注册功能,弹出一个框,显示注册名字和密码
二:针对管理员
基本功能:
1)只能进行登录
2)针对菜品列表进行管理(新增菜品(设置菜名和价钱),删除菜品)-------查看菜品页里面有的
3)针对所有订单进行管理(看到所有用户下的单,并且可以看到订单详情(菜品的名字,菜品的价格,菜品的总价格)
4)修改订单的完成情况(完成还是未完成,通过修改一个输入按钮))
5)查看订单页,菜品以及信息
一:商家可以可以通过系统来进行管理菜品信息(针对菜品进行增删改查)
二:商家可以通过系统来管理订单信息(查看所有订单,修改订单状态)
三:顾客可以进行查看菜品列表
四:顾客选中菜品之后,可以点击下单
模块:为了解决这个问题,分成了几个部分,这个项目分成了三个模块
需求分析:模块的细节,用到了什么技术,针对初心进行进一步的阐释
如何介绍项目?建议先按照总分式介绍----先介绍总体(基本的需求,基本的功能点,要解决什么问题),在介绍各个模块(为了解决这个问题,你分成了几个部分),在介绍一些实现的技术细节
项目初心:让用户更好地完成点菜操作,让商家可以更好的对菜品进行管理,以及管理订单
1)用户管理模块:
注册,登录,注销,我们要分成两种角色:
消费者用户(普通的用户顾客),管理员用户(商家)
2)菜品管理模块:系统中可以对菜品进行新增,查看,删除
不同的用户角色是由不同的操作的
针对普通用户只能查看菜品
针对管理员,可以新增,查看,删除菜品
3)订单管理模块:
支持新增订单,查看所有订单,查看我的订单,修改订单的完成状态
针对普通用户,可以新增订单,查看我的订单
针对管理员,可以查看所有订单,修改订单状态
二维码:本质上就是一个字符串,我们可以把一个url包装到一个二维码里面,有很多的工具可以完成,所以要把简历写到二维码
基本方法:
1)根据需求找出实体=>名词,一般来说每一个实体对应着一张表
用户(用户+管理员),菜品,订单
2)分析实体之间的关系
1:1
1:多
多:多
用户和菜品没有直接关系
用户和订单,每一个用户可以下多个订单,一个订单无法对应多个用户(1:多)
订单和菜品,一个订单会包含多种菜品,一个菜品可以被多个订单所包含
5)但是我们在这个项目里面,我们主要关心的是一个订单里面有多少菜,而不是关心某一个菜在多少个订单里面出现
这里面有一些方法来进行区分一对一还是多对多的关系:
1)咱们之前写的博客系统:实体类是博客和作者
一篇博客可以对应多篇作者吗?不行
一个作者可以有多篇博客吗?可以呀
所以用户和博客之间的关系是一对多
2)现在咱们写的顾客点餐系统,我们还可以用11的方法来解决.
先造句:
一:1个用户只能有1个订单吗?不是呀,1个订单只能对应一个用户吗?对的,一个用户是可以有多个订单的,所以是1对多的关系;
二:一个订单只能有一个菜品吗?不是呀,一个订单可以有多个菜品;
那么一个菜品只能对应一个订单吗?不是呀,一个菜品可以出现在多个订单里面;
一:菜品表:
1)菜品的身份标识:DishID
2)菜的名称:DishTitle(不可以重复)
3)菜的钱:DishMoney(decimal或者是int),使用int进行精确到分,还是不建议使用小数double和float计算是存在误差
二:用户表:1)用户的唯一身份标识:UserID
2)用户名:username(不可以重复)
3)密码:password
4)是否是管理员:isAdmin ,int 1表示管理员,0表示普通用户
三:订单表:(多对多的关系一般是通过一张中间表来进行连接的),但此时是订单和菜品用户都有关联关系,所以我们要拆成两部分,我们把订单分成两张表:
c1)订单----用户表
订单ID(是自增主键):
用户ID(这个属性要和User表中的UserID有关联关系)
下单时间:
是否完结(1表示订单完结,0表示订单没有完结)
比如说在这里面有一条记录:100,1,2002-08-01,false;
101,2,2002-08-02,false;
c2)订单-----菜品表(一个订单中包含多个菜品,就需要用额外的一张表来进行表示,这一张表的每一条记录就对应着一个订单和菜品之间的关联关系)
订单ID:菜品ID(他们俩都不是自增主键)
100,1001
100,1002
100,1003
101,1001
101,1004
在Java里面:Timestamp time对应的包是import java.sql.Timestamp
还有在数据库类型里面:time datetime
create database if not exists OrderSystem; use OrderSystem; drop table if exists User; create table User( UserID int primary key auto_increment, UserName varchar(400), PassWord varchar(400), IsAdmin int ); drop table if exists Dish; create table Dish( DishID int primary key auto_increment, DishName varchar(800), DishMoney int ); drop table if exists Order_User; create table Order_User( OrderID int primary key auto_increment, UserID int, IsDown int, --1表示订单完结,0表示订单未完结 OrderTime TIMESTAMP, foreign key(UserID) references User(UserID) --这张订单用户表中的UserID必须和User中的UserID是相同的 ); drop table if exists Order_Dish; create table OrderDish( OrderID int, --这里面的OrderID也和我们的Order_User表中的OrderID是有外键关系的 DishID int, --这里面的DishID是和我们的Dish表中的DishID是有一定的关联外健关系的 foreign key(OrderID) references Order_User(OrderID), foreign key(DishID) references Dish(DishID) ); //删除数据库中的表的列: alter table 表名 drop 表的列 //新增数据库表的列: alter table 表名 add name varchar(50) unique;注意着里面谁应该加外健,谁不应该加外健,哪个字段应该加主键,哪一个不应该加主键
- 用户类:
- public class User{
- private int UserID;
- private String UserName;
- private String PassWord;
- private int IsAdmin;
- }
- 创建菜品类:
- public class Dish{
- private int DishID;
- private String DishName;
- private int DishMoney;
- }
- 创建订单类:
- public class Order {
- private int OrderID;//订单ID
- private int UserID;//订单谁下的
- private int IsDone;//订单是否完结
- private Timestamp OrderTime;//订单下单时间
- private List
list;//订单里面包含哪些菜 - }
- public class ConnectionMYSQL {
- private static volatile DataSource dataSource=null;
- private static final String User="root";
- private static final String url="jdbc:mysql://127.0.0.1:3306/OrderSystem?characterEncoding=utf-8&useSSL=true";
- private static final String password="12503487";
- public static DataSource GetDataSource(){
- if(dataSource==null){
- synchronized(Object.class){
- if(dataSource==null){
- dataSource=new MysqlDataSource();
- ((MysqlDataSource)dataSource).setPassword(password);
- ((MysqlDataSource)dataSource).setUser(User);
- ((MysqlDataSource)dataSource).setURL(url);
- }
- }
- }
- return dataSource;
- }
- public static Connection GetConnection() throws SQLException {
- return dataSource.getConnection();
- }
- public static void Close(Connection connection, PreparedStatement statement, ResultSet resultSet) throws SQLException {
- if(resultSet!=null){
- resultSet.close();;
- }
- if(statement!=null){
- statement.close();
- }
- if(connection!=null){
- connection.close();
- }
- }
- }
- 修改数据库表名: rename table 旧表名 to 新表名;
1)针对User类来说,我们主要实现三个功能:(自己介绍一下JDBC)
一:新增用户,在注册的时候进行使用
二:按照名字来进行查找用户,登陆的时候进行使用(按照名字查找,只能查找到一条记录)
三:我们根据用户ID来进行查找,我们在展示所有用户信息的状态时候进行使用
JDBC编程的基本流程:通过DataSource和数据库建立连接,在建立连接的时候通过创建MysqlDataSource实例 1.先要和数据库建立连接:(DataSource),通过Connnection建立连接的时候,如果连接失败,就会抛出java.sql.exception 2.拼装SQL语句(PrepareStatement) 3.执行SQL语句(executeQuery,executeUpdate) 4.关闭连接(如果是查询语句,还需要进行遍历结果集合)(关键词叫做close)
//新增用户 public void addUser(User user) throws SQLException { //1.与数据库建立连接 Connection connection=ConnectionMYSQL.GetConnection(); //2.拼装SQL语句 String SQL="insert into User values(null,?,?,?)"; //3.执行SQL语句 PreparedStatement statement= connection.prepareStatement(SQL); statement.setString(1, user.getUserName()); statement.setString(2, user.getPassWord()); statement.setInt(3,user.getIsAdmin()); int len= statement.executeUpdate(); if(len==1){ System.out.println("新增用户成功"); }else{ System.out.println("新增用户失败"); } }
//根据名字查找用户 public User SelectUserByUserName(String UserName) throws SQLException { //1.与数据库建立连接 Connection connection=ConnectionMYSQL.GetConnection(); //2.拼装SQL语句 String SQL="select * from User where UserName=?"; //3.执行SQL语句 PreparedStatement statement= connection.prepareStatement(SQL); statement.setString(1,UserName); ResultSet resultSet= statement.executeQuery(); while(resultSet.next()){ User user=new User(); user.setUserID(resultSet.getInt("UserID")); user.setUserName(resultSet.getString("UserName")); user.setIsAdmin(resultSet.getInt("IsAdmin")); user.setPassWord(resultSet.getString("PassWord")); return user; } return null; }
//根据ID来进行查找用户 public User SelectUserByID(int UserID) throws SQLException { //1.与数据库建立连接 Connection connection=ConnectionMYSQL.GetConnection(); //2.拼装SQL语句 String SQL="select * from User where UserID=?"; //3.执行SQL语句 PreparedStatement statement= connection.prepareStatement(SQL); statement.setInt(1,UserID); //4.执行SQL语句 ResultSet resultSet=statement.executeQuery(); while(resultSet.next()){ User user=new User(); user.setUserID(resultSet.getInt("UserID")); user.setUserName(resultSet.getString("UserName")); user.setIsAdmin(resultSet.getInt("IsAdmin")); user.setPassWord(resultSet.getString("PassWord")); return user; } return null; }
测试代码: UserDAO userDAO=new UserDAO(); 1.新增用户验证 User user=new User(); user.setUserName("李佳伟"); user.setPassWord("12503487"); user.setIsAdmin(0); userDAO.addUser(user); 2.根据名字查询用户验证 User user=userDAO.SelectUserByUserName("李佳伟"); System.out.println(user); 3.根据ID查询用户验证 User user= userDAO.SelectUserByID(1); System.out.println(user);