Android Studio实现一个点餐系统

news2025/7/19 7:45:02

点餐系统

  • 作业要求
  • 效果
    • 登录注册
    • 欢迎页
    • 用户管理
    • 菜品种类管理
    • 菜品管理
    • 订单查询
    • 点餐
  • 源码导读
    • 手把手编写注册、用户管理板块
        • 新建实体类User
        • 新建User服务
        • 新建注册活动
        • 用户管理

作业要求

功能:
1.数据管理
菜品类别:凉菜;热菜;汤菜;主食;酒水
菜品管理:菜品的编号;名称;价格;所属类别;备注
餐桌管理:桌号;人数
2.点餐
新开桌:桌号->点餐
加菜:桌号->点餐
3.结账
根据桌号结单(可显示点餐明细与价格)
4.流水查阅
根据时间段查阅销售额(某段时间的午餐、晚餐)
某段时间菜品销量排序
5.其他要求
5.0 要求启动活动界面,启动活动居住显示:***点餐系统;学号+姓名
5.1有界面的地方,标题栏:学号+姓名
5.2界面逻辑设计合理漂亮
5.3严禁抄袭,如有发现俩人都不及格

效果

登录注册

登录
在这里插入图片描述

注册
在这里插入图片描述

欢迎页

在这里插入图片描述

用户管理

在这里插入图片描述

菜品种类管理

在这里插入图片描述

菜品管理

在这里插入图片描述

订单查询

在这里插入图片描述

点餐

在这里插入图片描述

源码导读

activity
BaseActivity 封装基础活动,方便对活动进行统一管理
FoodList 菜品活动
FoodTypeList 菜品分类或欧东
Home 主页面活动
Login 登录页活动
OrderList 点菜活动
OrderShow 订单展示活动
Regist 注册活动
UserList 用户管理活动
adapter
FoodAdapter 菜品适配器
FoodOrderAdapter 订单页中的菜品适配器
FoodSpinnerAdapter 菜品下拉适配器
FoodTypeAdapter 菜品分类适配器
OrderAdapter 订单适配器
UserAdapter 用户适配器
UserSpinnerAdapter 用户下拉适配器
model 实体类
Food
FoodType
Orders
User
service 服务
FoodService
FoodTypeService
OrderService
UserService
utils 工具类
ActivityCollector 活动控制器
Result 结果集

手把手编写注册、用户管理板块

新建实体类User

package com.example.test_01.model;

import org.litepal.crud.LitePalSupport;

import java.util.Date;
import java.util.List;

public class User extends LitePalSupport {
    private int id;
    private String username;
    private String nickname;
    private String password;
    private Date createTime;
    private Date updateTime;
    private int status;
    private List<Orders> ordersList;	// 用户跟订单是一对多
    // get、set方法省略(可以通过alt+insert快速添加,附下图)
}

在这里插入图片描述

新建User服务

User服务中编写数据库操作

UserService接口

public interface UserService{
    /**
     * @param user
     * @return 登录
     */
    public Result login(User user);

    /**
     * @param user
     * @return 注册
     */
    public Result regist(User user);

    /**
     * @return 用户列表
     */
    public List<User> list();

    /**
     * @param id
     * @return 根据用户Id删除用户
     */
    public Result delUserById(int id);
    /**
     * @param id 用户id
     * @return
     * @desc  列表
     */
    public User getUserById(int id);
    /**
     * @param username 用户名
     * @param pwd 密码
     * @return
     * @desc  列表
     */
    public List<User> getUserByUserNameAndPwd(String username,String pwd);
}

UserServiceImpl实现类

/**
 * @Desc  用户相关服务实现
 */
public class UserServiceImpl implements UserService{
    /**
     * @param user 用户
     * @return  登录成功与否
     */
    public Result login(User user){
        boolean isExited = LitePal.isExist(User.class,"username = ? and password = ?",user.getUsername(),user.getPassword());
        if(isExited)
            return Result.SUCCESS;
        else
            return Result.ERROR;
    }

    /**
     * @param user
     * @return 注册
     */
    public Result regist(User user){
        user.save();
        return Result.SUCCESS;
    }

    @Override
    public List<User> list() {
        List<User> userList = LitePal.findAll(User.class);
        for(int i = 0; i < userList.size();i++){
            Log.d(TAG, "list: User信息" + userList.get(i).toString());
        }
        return userList;
    }

    @Override
    public Result delUserById(int id) {
        LitePal.delete(User.class,id);
        return Result.SUCCESS;
    }

    @Override
    public User getUserById(int id) {
        return LitePal.find(User.class,id);
    }

    @Override
    public List<User> getUserByUserNameAndPwd(String username, String pwd) {
        return LitePal.where("username = ? and password = ?",username,pwd).find(User.class);
    }
}

新建注册活动

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

新建完成后生成.java(功能代码)和.xml(样式)文件

在这里插入图片描述
在这里插入图片描述

编写样式文件,添加控件,可以通过Design模式直观看到控件并加以调整,也可以托拉拽生成控件并赋值属性,还是挺方便的

在这里插入图片描述

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:orientation="vertical">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="昵称" />
    <EditText
        android:id="@+id/input_nickname"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:inputType="textPersonName" />
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="用户名" />
    <EditText
        android:id="@+id/input_username"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:inputType="textPersonName" />
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="密码" />
    <EditText
        android:id="@+id/input_password"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:inputType="textPassword" />
    <Button
        android:id="@+id/btn_regist"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="注册"/>

</LinearLayout>

编写功能代码

public class Regist extends BaseActivity implements View.OnClickListener {
		// 声明控件
    EditText InputUsername;
    EditText InputNickname;
    EditText InputPassword;
    Button BtnRegist;
    UserService userService = new UserServiceImpl();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_regist);
        // 控件实例化
        InputUsername = findViewById(R.id.input_username);
        InputPassword = findViewById(R.id.input_password);
        InputNickname = findViewById(R.id.input_nickname);
        // 控件添加监听
        BtnRegist = findViewById(R.id.btn_regist);
        BtnRegist.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
    		// 处理监听事件
        switch (view.getId()){
            case R.id.btn_regist:
            		// 获取控件值
                String Username = InputUsername.getText().toString();
                String Password = InputPassword.getText().toString();
                String Nickname = InputNickname.getText().toString();
                // 新建并赋值用户实例
                User user = new User();
                user.setUsername(Username);
                user.setPassword(Password);
                user.setNickname(Nickname);
                user.setCreateTime(new Date());
                // 调用用户注册服务
                Result rec = userService.regist(user);
                if(rec == Result.SUCCESS){
                    // 注册成功
                    Toast.makeText(this,"注册成功",Toast.LENGTH_SHORT).show();
                    // 结束活动
                    finish();
                }
        }
    }
}

用户管理

活动新建、xml文件的编写同上述注册活动,不再过多赘述。用户列表展示用到了RecyclerView,之前总结过RecyclerView的使用,参考这篇博文:https://blog.csdn.net/lzl980111/article/details/106988364
这里直接上功能代码并进行注释解释

UserList.java


public class UserList extends BaseActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_user_list);
			 // 实例化 recyclerView 并添加配置器
        RecyclerView recyclerView = findViewById(R.id.rv_user_list);
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(linearLayoutManager);
        UserAdapter userAdapter = new UserAdapter();
        recyclerView.setAdapter(userAdapter);
    }

}

UserAdapter.java适配器的代码

package com.example.test_01.adapter;

import static android.content.ContentValues.TAG;

import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.example.test_01.R;
import com.example.test_01.model.User;
import com.example.test_01.service.UserService;
import com.example.test_01.service.UserServiceImpl;

import java.util.List;

public class UserAdapter extends RecyclerView.Adapter <UserAdapter.ViewHolder> {

		// userList用于存储RecyclerView中的数据信息
    private List<User> userList;
    private UserService userService = new UserServiceImpl();

		// 声明并实例化控件信息
    static class ViewHolder extends RecyclerView.ViewHolder{
        TextView Username;
        Button BtnDel;
        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            Username = itemView.findViewById(R.id.text_user_item_name);
            BtnDel = itemView.findViewById(R.id.btn_user_item_del);
        }
    }

    private void listUser(){
        userList = userService.list();
    }
	 // 构造函数中直接赋值数据信息
    public UserAdapter() {
        listUser();
    }

    /**
     * @param parent
     * @param viewType
     * @return
     * @desc  用户点击删除事件
     */
    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    	// 声明一个新的布局并赋值给 RecyclerView 的 item(每一项)
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.user_item,parent,false);
        ViewHolder holder = new ViewHolder(view);
        // 设置按钮点击事件
        holder.BtnDel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                int position = holder.getAdapterPosition();
                User user = userList.get(position);
                userService.delUserById(user.getId());

                // 删除后刷新显示
                userList = userService.list();
                notifyDataSetChanged();
            }
        });
        return holder;
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        User user = userList.get(position);
        // 这里的Username是上面声明的控件
        holder.Username.setText(user.getUsername());
    }

    @Override
    public int getItemCount() {
        return userList.size();
    }
}

user_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <TextView
        android:id="@+id/text_user_item_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:gravity="center_horizontal"
        android:text="测试"
        android:layout_weight="1"
        android:textColor="#000000"
        android:textSize="20sp" />
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/btn_user_item_del"
        android:text="删除"></Button>
</LinearLayout>

在这里插入图片描述

xml是新建的用于UserList的RecyclerView的每一项的布局,建在layout中了

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

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

相关文章

投资组合优化的人工蜂群算法(Matlab代码实现)

&#x1f352;&#x1f352;&#x1f352;欢迎关注&#x1f308;&#x1f308;&#x1f308; &#x1f4dd;个人主页&#xff1a;我爱Matlab &#x1f44d;点赞➕评论➕收藏 养成习惯&#xff08;一键三连&#xff09;&#x1f33b;&#x1f33b;&#x1f33b; &#x1f34c;希…

力扣(LeetCode)1732. 找到最高海拔(C++)

前缀和 这道题&#xff0c;很容易看出&#xff0c;gaingaingain (海拔高度差) 是海拔高度的一个差分&#xff0c;对 gaingaingain 用前缀和&#xff0c;就能求出每个点的海拔了。题目要求我们&#xff0c;找最高海拔&#xff0c;那么只需要维护一个变量 ansansans &#xff0c…

【NLP】使用 BERT 和 PyTorch Lightning 进行多标签文本分类

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

【论文精读5】MVSNet系列论文详解-Point-MVSNet

Point-MVSNet全文名称&#xff1a;Point-Based Multi-View Stereo Network&#xff0c;是2019提出的使用coarse-to-fine方法来优化深度图推断过程的网络结构&#xff0c;与上一篇CVP-MVSNet都是迭代优化的思想&#xff0c;不同的是Point-MVSNet在点云上进行操作&#xff0c;而C…

基于51单片机的二氧化碳(CO2)气体浓度监测报警系统

基于51单片机的二氧化碳&#xff08;CO2&#xff09;气体浓度监测报警系统( proteus仿真程序演示视频&#xff09; 仿真图proteus 8.9 程序编译器&#xff1a;keil 4/keil 5 编程语言&#xff1a;C语言 设计编号&#xff1a;C0073 这里写目录标题基于51单片机的二氧化碳&am…

【数据结构】栈和队列的实现

文章目录一、栈的实现二、队列的实现一、栈的实现 栈是一种特殊的线性表&#xff0c;只允许在固定的一端进行插入和删除元素的操作&#xff0c;进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈低。栈遵循数据后进先出的原则。 创建一个栈&#xff1a; typedef …

就是一整个爱住,你们大胆飞,我就是最坚强的后盾——Java面试突击宝典

前言 马老师说过&#xff0c;员工的离职原因很多&#xff0c;只有两点最真实&#xff1a; 钱&#xff0c;没给到位 心&#xff0c;受委屈了 当然&#xff0c;我是想换个平台&#xff0c;换个方向&#xff0c;想清楚为什么要跳槽&#xff0c;如果真的要跳槽&#xff0c;想要拿…

75.【JavaWeb-03】

JavaWeb(十五)、JavaBean(十六)、MVC三层框架1.早些年:2.三层架构:(十七)、Filter(过滤器)1加入依赖2.基本步骤3.出现500错误的话4.案列演示(十八)、Listener(监听器)1.利用监听实现在线人数的统计(十九)、小结对18之前的(二十)、过滤器、监听器常见应用1.过滤器注册和注销操作…

一起Talk Android吧(第四百一十八回:制作时钟)

文章目录整体思路准备画布绘制表盘绘制刻度绘制指针示例代码各位看官们大家好&#xff0c;上一回中咱们说的例子是"解决Glide不能加载网络图片的方法",这一回咱们介绍的例子是"制作时钟"。闲话休提&#xff0c;言归正转&#xff0c;让我们一起Talk Android…

向毕业妥协系列之深度学习笔记:神经网络深度学习(一)

目录 一.神经网络杂记 二.计算图&#xff08;反向传播求导几个实例&#xff09; 1.普通式子反向传播求导 2.逻辑回归中的梯度下降 3.m个样本的梯度下降 三.向量化 深度学习系列的文章也可以结合下面的笔记来看&#xff1a; 深度学习笔记-目录 一.神经网络杂记 这个系列…

不知道word压缩文件怎么弄?简单三步轻松实现

如果你是学生&#xff0c;那么你的作业、论文应该都是以word文档格式上交的吧&#xff1f; 如果你是打工人&#xff0c;应该也经常需要编辑一些文档&#xff0c;例如通知、工作安排等等&#xff0c;给上司或其他同事查阅。 那么久而久之积累下来&#xff0c;word文件就会占据电…

TIA博途_通过PEEK指令在TP900触摸屏上实现监控所有IO地址的具体方法示例

TIA博途_通过PEEK指令在TP900触摸屏上实现监控所有IO地址的具体方法示例 如下图所示,首先,新建一个项目,添加一个DB块,这里以DB276为例进行说明,在该DB块中添加如图所示变量, 如下图所示,添加一个FB,用于读取IO点的值,具体程序可参考下图, 如下图所示,在OB1中调…

使用马尔可夫链构建文本生成器

本文中将介绍一个流行的机器学习项目——文本生成器&#xff0c;你将了解如何构建文本生成器&#xff0c;并了解如何实现马尔可夫链以实现更快的预测模型。 文本生成器简介 文本生成在各个行业都很受欢迎&#xff0c;特别是在移动、应用和数据科学领域。甚至新闻界也使用文本生…

PyTorch中的matmul函数详解

PyTorch中的两个张量的乘法可以分为两种&#xff1a; 两个张量对应的元素相乘&#xff08;element-wise&#xff09;&#xff0c;在PyTorch中可以通过torch.mul函数&#xff08;或者∗*∗运算符&#xff09;实现 两个张量矩阵相乘&#xff08;Matrix product&#xff09;&…

Day07--生命周期的概念与分类

文字概述&#xff1a; 1.啥子是生命周期呢&#xff1f; ***********************************************************************************************************************************************************************************************************…

[附源码]Python计算机毕业设计毕业生就业信息管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

EasyExcel对大数据量表格操作导入导出

前言 最近有个项目里面中有大量的Excel文档导入导出需求&#xff0c;数据量最多的文档有上百万条数据&#xff0c;之前的导入导出都是用apache的POI&#xff0c;于是这次也决定使用POI&#xff0c;结果导入一个四十多万的文档就GG了&#xff0c;内存溢出... 于是找到EasyExce…

上采样,下采样,卷积,反卷积,池化,反池化,双线性插值【基本概念分析】

上采样,下采样,卷积,反卷积,池化,反池化,双线性插值【基本概念分析】】一、上采样1.概念2.原理二、下采样1.概念2.原理三、卷积与反卷积四、池化五、反池化六、双线性插值1.意义2.作用3.单线性插值4.双线性插值的公式5.双线性插值的例子一、上采样 1.概念 上采样&#xff08;…

前端页面全新的写法(第七课)Vue中的组件

VueCli框架的实操内容(第七课)Vue中的组件 组件是可复用的 Vue 实例, 把一些公共的模块抽取出来&#xff0c;然后写成单独的的工具组件或者页面&#xff0c;在需要的页面中就直接引入即可那么我们可以将其抽出为一个组件进行复用。例如 页面头部、侧边、内容区&#xff0c;尾部…

电脑里重要文件用什么备份,电脑如何备份主要数据

保护好数据安全是很重要的&#xff0c;能够给我们减少很多麻烦或者说是损失&#xff0c;所以&#xff0c;我们是有必要通过一些手段来保护好重要数据的。电脑里重要文件用什么备份&#xff1f;提前对数据进行备份无疑是最好的方法之一。 一、如何备份数据&#xff1f; 我们可以…