• 顾客点餐系统(1)-------整体项目目标+用户数据表的操作


    项目初心:我们可以让用户更方便的进行使用手机进行在线点菜

    一:针对用户自主点餐:

    基本功能:

    1)注册登录,退出登录

    2)主页面中可以看到当前店家的菜品列表(菜名,价格,是否要进行选餐),

    3)点击要选择的菜品,进行下单,多选勾中,进行进行点击就会选择下单

    4)用户可以自己看到自己历史订单,只能看到自己下的单(序号,用户,状态就是显示订单是否完成,下单时间,还有一个按钮展示详情信息),每一个订单都是一行,表示一个订单

    5)当我们进行点击这个详情按钮的时候,就会弹出一个输入框,显示各种菜单名字,菜单价格

    6)注册功能,弹出一个框,显示注册名字和密码

    二:针对管理员

    基本功能:

    1)只能进行登录

    2)针对菜品列表进行管理(新增菜品(设置菜名和价钱),删除菜品)-------查看菜品页里面有的

    3)针对所有订单进行管理(看到所有用户下的单,并且可以看到订单详情(菜品的名字,菜品的价格,菜品的总价格)

    4)修改订单的完成情况(完成还是未完成,通过修改一个输入按钮))

    5)查看订单页,菜品以及信息

    一:商家可以可以通过系统来进行管理菜品信息(针对菜品进行增删改查)

    二:商家可以通过系统来管理订单信息(查看所有订单,修改订单状态)

    三:顾客可以进行查看菜品列表

    四:顾客选中菜品之后,可以点击下单

    模块:为了解决这个问题,分成了几个部分,这个项目分成了三个模块

    需求分析:模块的细节,用到了什么技术,针对初心进行进一步的阐释

    如何介绍项目?建议先按照总分式介绍----先介绍总体(基本的需求,基本的功能点,要解决什么问题),在介绍各个模块(为了解决这个问题,你分成了几个部分),在介绍一些实现的技术细节

    项目初心:让用户更好地完成点菜操作,让商家可以更好的对菜品进行管理,以及管理订单

    1)用户管理模块:

    注册,登录,注销,我们要分成两种角色:

    消费者用户(普通的用户顾客),管理员用户(商家)

    2)菜品管理模块:系统中可以对菜品进行新增,查看,删除

    不同的用户角色是由不同的操作的

    针对普通用户只能查看菜品

    针对管理员,可以新增,查看,删除菜品

    3)订单管理模块:

    支持新增订单,查看所有订单,查看我的订单,修改订单的完成状态

    针对普通用户,可以新增订单,查看我的订单

    针对管理员,可以查看所有订单,修改订单状态

    二维码:本质上就是一个字符串,我们可以把一个url包装到一个二维码里面,有很多的工具可以完成,所以要把简历写到二维码

    1.数据库设计 

    基本方法:

    1)根据需求找出实体=>名词,一般来说每一个实体对应着一张表

    用户(用户+管理员),菜品,订单

    2)分析实体之间的关系

    1:1

    1:多

    多:多

    用户和菜品没有直接关系

    用户和订单,每一个用户可以下多个订单,一个订单无法对应多个用户(1:多)

    订单和菜品,一个订单会包含多种菜品,一个菜品可以被多个订单所包含

    5)但是我们在这个项目里面,我们主要关心的是一个订单里面有多少菜,而不是关心某一个菜在多少个订单里面出现

    这里面有一些方法来进行区分一对一还是多对多的关系:
    1)咱们之前写的博客系统:实体类是博客和作者
    一篇博客可以对应多篇作者吗?不行
    一个作者可以有多篇博客吗?可以呀
    所以用户和博客之间的关系是一对多
    2)现在咱们写的顾客点餐系统,我们还可以用11的方法来解决.
    先造句:
    一:1个用户只能有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

    1. create database if not exists OrderSystem;
    2. use OrderSystem;
    3. drop table if exists User;
    4. create table User(
    5. UserID int primary key auto_increment,
    6. UserName varchar(400),
    7. PassWord varchar(400),
    8. IsAdmin int
    9. );
    10. drop table if exists Dish;
    11. create table Dish(
    12. DishID int primary key auto_increment,
    13. DishName varchar(800),
    14. DishMoney int
    15. );
    16. drop table if exists Order_User;
    17. create table Order_User(
    18. OrderID int primary key auto_increment,
    19. UserID int,
    20. IsDown int, --1表示订单完结,0表示订单未完结
    21. OrderTime TIMESTAMP,
    22. foreign key(UserID) references User(UserID)
    23. --这张订单用户表中的UserID必须和User中的UserID是相同的
    24. );
    25. drop table if exists Order_Dish;
    26. create table OrderDish(
    27. OrderID int,
    28. --这里面的OrderID也和我们的Order_User表中的OrderID是有外键关系的
    29. DishID int,
    30. --这里面的DishID是和我们的Dish表中的DishID是有一定的关联外健关系的
    31. foreign key(OrderID) references Order_User(OrderID),
    32. foreign key(DishID) references Dish(DishID)
    33. );
    34. //删除数据库中的表的列:
    35. alter table 表名 drop 表的列
    36. //新增数据库表的列:
    37. alter table 表名 add name varchar(50) unique;

    注意着里面谁应该加外健,谁不应该加外健,哪个字段应该加主键,哪一个不应该加主键

    2.创建实体类:在实体类中的每一个字段和数据中的每一张表的对应的字段是相同的

    1. 用户类:
    2. public class User{
    3. private int UserID;
    4. private String UserName;
    5. private String PassWord;
    6. private int IsAdmin;
    7. }
    8. 创建菜品类:
    9. public class Dish{
    10. private int DishID;
    11. private String DishName;
    12. private int DishMoney;
    13. }
    14. 创建订单类:
    15. public class Order {
    16. private int OrderID;//订单ID
    17. private int UserID;//订单谁下的
    18. private int IsDone;//订单是否完结
    19. private Timestamp OrderTime;//订单下单时间
    20. private List list;//订单里面包含哪些菜
    21. }

    1. public class ConnectionMYSQL {
    2. private static volatile DataSource dataSource=null;
    3. private static final String User="root";
    4. private static final String url="jdbc:mysql://127.0.0.1:3306/OrderSystem?characterEncoding=utf-8&useSSL=true";
    5. private static final String password="12503487";
    6. public static DataSource GetDataSource(){
    7. if(dataSource==null){
    8. synchronized(Object.class){
    9. if(dataSource==null){
    10. dataSource=new MysqlDataSource();
    11. ((MysqlDataSource)dataSource).setPassword(password);
    12. ((MysqlDataSource)dataSource).setUser(User);
    13. ((MysqlDataSource)dataSource).setURL(url);
    14. }
    15. }
    16. }
    17. return dataSource;
    18. }
    19. public static Connection GetConnection() throws SQLException {
    20. return dataSource.getConnection();
    21. }
    22. public static void Close(Connection connection, PreparedStatement statement, ResultSet resultSet) throws SQLException {
    23. if(resultSet!=null){
    24. resultSet.close();;
    25. }
    26. if(statement!=null){
    27. statement.close();
    28. }
    29. if(connection!=null){
    30. connection.close();
    31. }
    32. }
    33. }
    34. 修改数据库表名: rename table 旧表名 to 新表名;

     3.创建接口:创建对应的DAO类(操作三组数据),封装数据访问接口:UserDAO,DishDAO,OrderDAO:无非就是增删改查

    1)针对User类来说,我们主要实现三个功能:(自己介绍一下JDBC)

    一:新增用户,在注册的时候进行使用

    二:按照名字来进行查找用户,登陆的时候进行使用(按照名字查找,只能查找到一条记录)

    三:我们根据用户ID来进行查找,我们在展示所有用户信息的状态时候进行使用

    1. JDBC编程的基本流程:通过DataSource和数据库建立连接,在建立连接的时候通过创建MysqlDataSource实例
    2. 1.先要和数据库建立连接:(DataSource),通过Connnection建立连接的时候,如果连接失败,就会抛出java.sql.exception
    3. 2.拼装SQL语句(PrepareStatement)
    4. 3.执行SQL语句(executeQuery,executeUpdate)
    5. 4.关闭连接(如果是查询语句,还需要进行遍历结果集合)(关键词叫做close)

    1. //新增用户
    2. public void addUser(User user) throws SQLException {
    3. //1.与数据库建立连接
    4. Connection connection=ConnectionMYSQL.GetConnection();
    5. //2.拼装SQL语句
    6. String SQL="insert into User values(null,?,?,?)";
    7. //3.执行SQL语句
    8. PreparedStatement statement= connection.prepareStatement(SQL);
    9. statement.setString(1, user.getUserName());
    10. statement.setString(2, user.getPassWord());
    11. statement.setInt(3,user.getIsAdmin());
    12. int len= statement.executeUpdate();
    13. if(len==1){
    14. System.out.println("新增用户成功");
    15. }else{
    16. System.out.println("新增用户失败");
    17. }
    18. }
    1. //根据名字查找用户
    2. public User SelectUserByUserName(String UserName) throws SQLException {
    3. //1.与数据库建立连接
    4. Connection connection=ConnectionMYSQL.GetConnection();
    5. //2.拼装SQL语句
    6. String SQL="select * from User where UserName=?";
    7. //3.执行SQL语句
    8. PreparedStatement statement= connection.prepareStatement(SQL);
    9. statement.setString(1,UserName);
    10. ResultSet resultSet= statement.executeQuery();
    11. while(resultSet.next()){
    12. User user=new User();
    13. user.setUserID(resultSet.getInt("UserID"));
    14. user.setUserName(resultSet.getString("UserName"));
    15. user.setIsAdmin(resultSet.getInt("IsAdmin"));
    16. user.setPassWord(resultSet.getString("PassWord"));
    17. return user;
    18. }
    19. return null;
    20. }
    1. //根据ID来进行查找用户
    2. public User SelectUserByID(int UserID) throws SQLException {
    3. //1.与数据库建立连接
    4. Connection connection=ConnectionMYSQL.GetConnection();
    5. //2.拼装SQL语句
    6. String SQL="select * from User where UserID=?";
    7. //3.执行SQL语句
    8. PreparedStatement statement= connection.prepareStatement(SQL);
    9. statement.setInt(1,UserID);
    10. //4.执行SQL语句
    11. ResultSet resultSet=statement.executeQuery();
    12. while(resultSet.next()){
    13. User user=new User();
    14. user.setUserID(resultSet.getInt("UserID"));
    15. user.setUserName(resultSet.getString("UserName"));
    16. user.setIsAdmin(resultSet.getInt("IsAdmin"));
    17. user.setPassWord(resultSet.getString("PassWord"));
    18. return user;
    19. }
    20. return null;
    21. }
    1. 测试代码:
    2. UserDAO userDAO=new UserDAO();
    3. 1.新增用户验证 User user=new User();
    4. user.setUserName("李佳伟");
    5. user.setPassWord("12503487");
    6. user.setIsAdmin(0);
    7. userDAO.addUser(user);
    8. 2.根据名字查询用户验证 User user=userDAO.SelectUserByUserName("李佳伟");
    9. System.out.println(user);
    10. 3.根据ID查询用户验证
    11. User user= userDAO.SelectUserByID(1);
    12. System.out.println(user);

  • 相关阅读:
    如何在 Vue.js 中使用 Axios
    记录了解php8-JIT
    2023青岛大学计算机考研信息汇总
    北京十大律师事务所排名前十名(8月最新发布)
    单行文字垂直居中
    [软件工具]opencv-svm快速训练助手教程解决opencv C++ SVM模型训练与分类实现任务支持C# python调用
    【毕业设计】深度学习实现行人重识别 - python opencv yolo Reid
    项目成本超支的主要原因以及解决方法
    E - Sugoroku 4(概率dp)
    IMX6ULL移植篇-boot 命令的学习
  • 原文地址:https://blog.csdn.net/weixin_61518137/article/details/126161049