Android-Servlet-Mysql 自助点餐系统(含Github自主开源代码),Android-Servlet-Mysql自助点餐系统,开源代码与实现指南

马肤

温馨提示:这篇文章已超过472天没有更新,请注意相关的内容是否还可用!

摘要:,,本自助点餐系统集成了Android、Servlet和Mysql技术,提供流畅的点餐体验。系统通过Android应用作为前端,用户可浏览菜单、选择菜品。后端采用Servlet处理订单请求,与Mysql数据库实时交互,存储客户信息及订单数据。系统包含Github上的自主开源代码,方便开发者学习和改进。整体系统旨在提升餐饮服务质量与效率,适用于各类餐厅和快餐店。

声明:本科大二计算机小白,若在表述过程中存在错误或漏洞,欢迎各位大佬在评论区指正。♥

文章目录

一、项目介绍

        项目基本逻辑

        具体功能描述

二、项目结构解析

        1.前端结构解析

        2.后端结构解析

        3.数据表展示(数据库)

                3.1.userinfo表记录用户注册信息

                3.2.diet表记录想要上传的菜单信息

                3.3.orderinfo记录用户的下单信息

三、App界面

        1.图形化展示

        2.相关功能指引

                2.1.界面延迟实现(图一) WelcomeActivity.java

                2.2. 自动向下滚动(图二)IbtnhomeActivity.java

                2.3.持久化登录实现 IbtninfoActivity.java

                2.4.前端与后端连接关键代码

                        2.4.1.前端部分:AndroidStudio/app//main/javaRegisterActivity.java

                        2.4.2.后端部分 AndroidWebFinal/src/UserInfoDAO.java

注意:后端req.getParameter("XXX") 要与前url中的查询串一一对应。

四、主要问题解决

           1.报错:java.io.IOException: Cleartext HTTP traffic to 192.168.200.1 not permitted

           2.报错:java.net.ConnectException: fail to connect to localhost/127.0.0.1(port 8080): connect failed:ECONNREFUSED….(Codename One App)

五、结语


一、项目介绍

        本项目源于课程《移动应用开发》的课程设计,主要考察Android studio的设计编程能力。自主点餐系统能实现:用户登录、菜单浏览、菜品加入购物车等简单的功能。同时使用前后端分离的开发方式,后端部分使用servlet进行对Mysql中的数据进行读取。

     tips:在代码编写过程中没有进行文件的模块化,使得项目的文件结构较为凌乱,尽情谅解。

        项目基本逻辑

                进入程序后,先引导顾客进行登录(未登录无法进行点餐)。登录后可以进行点餐,点餐完毕在购物车进行结算,结算完成后,保存顾客本次的消费记录。同时,在个人信息界面中能展示个人信息,以及查询本人的历史就餐记录。

        具体功能描述

                1.用户登录(与数据库关联):注册账号、验证账号登录、修改密码、忘记密码(手机号验证)。

                2.点餐系统:通过读取数据库的信息,完成对点餐界面信息的数据读取,通过加号点击,加入购物车。

                3.购物车界面:点击结算,通过扫描二维码进行结算,结算完毕储存消费信息。

                4.个人信息界面:个人登录信息、查询个人历史消费信息。

二、项目结构解析

        1.前端结构解析

                注意:点餐界面中,总共设置了四个小板块,分别是:常规菜品、甜点小吃、饮料酒水和数据测试。编者仅仅在“数据测试”板块完成点菜系统的相关功能,其他三个界面仅供展示。 “数据测试”板块未使用.xml进行文件编写,而其余三个使用.xml类型文件。

                “数据测试”板块的相关功能主要包括:

                        1.点击加号加入购物车。

                        2.实现数据库的连接,用户可以通过增加或者删除数据库的元组,来修改“数据测试”板块的菜品。

                存在问题:

                        1.本程序如今仅支持单次点餐,即点完餐后进入购物车,再重新跳转回到点餐界面,原本购物车中的信息不会保留。若要实现信息的保留,应该可以使用SharedPreferences完成信息保留的相关设置。

                        2.在“数据测试”板块,在通过代码构建前端界面时,在保持点餐界面样式不变的前提下,本人无法将导航栏置于页面底部。(原因似乎是因为RelativeLayout不能同时有两个父类)

Android-Servlet-Mysql 自助点餐系统(含Github自主开源代码),Android-Servlet-Mysql自助点餐系统,开源代码与实现指南 第1张

        2.后端结构解析

                后端是通过Servlet连接数据库,分为三个大模块:登录模块、菜单模块、点餐信息模块。三个模块的大框架基本相同,JavaBean用于封装需求属性,...DAO用于编写含有sql语句的相应的方法,...Servlet用于前后端信息交互。

Android-Servlet-Mysql 自助点餐系统(含Github自主开源代码),Android-Servlet-Mysql自助点餐系统,开源代码与实现指南 第2张

        3.数据表展示(数据库)

                3.1.userinfo表记录用户注册信息

                Android-Servlet-Mysql 自助点餐系统(含Github自主开源代码),Android-Servlet-Mysql自助点餐系统,开源代码与实现指南 第3张

                3.2.diet表记录想要上传的菜单信息

                Android-Servlet-Mysql 自助点餐系统(含Github自主开源代码),Android-Servlet-Mysql自助点餐系统,开源代码与实现指南 第4张

                3.3.orderinfo记录用户的下单信息

                Android-Servlet-Mysql 自助点餐系统(含Github自主开源代码),Android-Servlet-Mysql自助点餐系统,开源代码与实现指南 第5张

三、App界面

        1.图形化展示

Android-Servlet-Mysql 自助点餐系统(含Github自主开源代码),Android-Servlet-Mysql自助点餐系统,开源代码与实现指南 第6张Android-Servlet-Mysql 自助点餐系统(含Github自主开源代码),Android-Servlet-Mysql自助点餐系统,开源代码与实现指南 第7张Android-Servlet-Mysql 自助点餐系统(含Github自主开源代码),Android-Servlet-Mysql自助点餐系统,开源代码与实现指南 第8张Android-Servlet-Mysql 自助点餐系统(含Github自主开源代码),Android-Servlet-Mysql自助点餐系统,开源代码与实现指南 第9张Android-Servlet-Mysql 自助点餐系统(含Github自主开源代码),Android-Servlet-Mysql自助点餐系统,开源代码与实现指南 第10张Android-Servlet-Mysql 自助点餐系统(含Github自主开源代码),Android-Servlet-Mysql自助点餐系统,开源代码与实现指南 第11张

Android-Servlet-Mysql 自助点餐系统(含Github自主开源代码),Android-Servlet-Mysql自助点餐系统,开源代码与实现指南 第12张Android-Servlet-Mysql 自助点餐系统(含Github自主开源代码),Android-Servlet-Mysql自助点餐系统,开源代码与实现指南 第13张Android-Servlet-Mysql 自助点餐系统(含Github自主开源代码),Android-Servlet-Mysql自助点餐系统,开源代码与实现指南 第14张Android-Servlet-Mysql 自助点餐系统(含Github自主开源代码),Android-Servlet-Mysql自助点餐系统,开源代码与实现指南 第15张Android-Servlet-Mysql 自助点餐系统(含Github自主开源代码),Android-Servlet-Mysql自助点餐系统,开源代码与实现指南 第16张Android-Servlet-Mysql 自助点餐系统(含Github自主开源代码),Android-Servlet-Mysql自助点餐系统,开源代码与实现指南 第17张

        2.相关功能指引

                2.1.界面延迟实现(图一) WelcomeActivity.java

                        在欢迎界面(WelcomeActivity.java)延迟 0.5 秒进入界面。

     new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
            @Override
            public void run() {
                Intent intent = new Intent(WelcomeActivity.this, IbtnhomeActivity.class);
                startActivity(intent);
                finish();
            }
        }, 500); // 0.5秒延迟时间

                2.2. 自动向下滚动(图二)IbtnhomeActivity.java

                        实现自动向下滚动展示菜品。

        mHandler = new Handler();
        mRunnable = new Runnable() {
            @Override
            public void run() {
                // 获取当前滚动位置
                int scrollY = scrollView.getScrollY();
                // 计算下一个滚动位置
                int nextScrollY = scrollY + 1000;
                // 执行滚动动画
                ObjectAnimator animator = ObjectAnimator.ofInt(scrollView, "scrollY", nextScrollY);
                animator.setDuration(2000);
                animator.start();
                // 设置延迟时间,控制滚动间隔
                mHandler.postDelayed(this, 1000);
            }
        };
    }
  @Override
    protected void onResume() {
        super.onResume();
        mHandler.postDelayed(mRunnable,2000);
    }
    @Override
    protected void onPause() {
        super.onPause();
        mHandler.removeCallbacks(mRunnable);
    }

                2.3.持久化登录实现 IbtninfoActivity.java

                        在登录后能在个人信息页面长期保存个人信息。 

        Intent intent = getIntent();
        String pusername = intent.getStringExtra("username");
        String pphoneNumber = intent.getStringExtra("phoneNumber");
        if(pusername != null){
            username.setText("用户名:" + pusername);
            phoneNumber.setText("电话:" + pphoneNumber);
            SharedPreferences sharedPreferences = getSharedPreferences("login",MODE_PRIVATE);
            SharedPreferences.Editor editor = sharedPreferences.edit();
            editor.putString("username",pusername);
            editor.putString("phoneNumber",pphoneNumber);
            editor.putBoolean("isLoggedIn",true);
            editor.apply();
        }/*else {
            username.setText("用户名:未登录");
            phoneNumber.setText("电话:未登录" );
        }*/
        SharedPreferences sharedPreferences = getSharedPreferences("login", MODE_PRIVATE);
        String savedUsername = sharedPreferences.getString("username", "未登录");
        String savedPhoneNumber = sharedPreferences.getString("phoneNumber", "未登录");
        boolean isLoggedIn = sharedPreferences.getBoolean("isLoggedIn", false);
        username.setText("用户名:" + savedUsername);
        phoneNumber.setText("电话:" + savedPhoneNumber);

                2.4.前端与后端连接关键代码

                        2.4.1.前端部分:AndroidStudio/app/main/javaRegisterActivity.java

                        我们继承AsyncTask 来实现。具体代码如下:在这段代码中通过GET方法进行连接,将界面中的信息通过查询串的方式传输到后端进行连接。

    public class NetworkTask extends AsyncTask {
        @Override
        protected String doInBackground(String... params) {
            try {
                String urlString = "http://127.0.0.1/save.do?username=" + username + "&password=" + password + "&phonenumber=" + phoneNumber + "&gender=" + gender ;
                URL url = new URL(urlString);
                HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                connection.setRequestMethod("GET");
                connection.connect();
                System.out.println(connection.getResponseCode());

                        利用InputStream读取后端传输的字符串信息。

            if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
                    InputStream inputStream = connection.getInputStream();
                    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
                    result = bufferedReader.readLine();
                    System.out.println(result);
                }

                        result部分会传到onPostExecute(String s)的s中。

        @Override
        protected void onPostExecute(String s) {
            Toast.makeText(RegisterActivity.this, s, Toast.LENGTH_SHORT).show();
        }
                        2.4.2.后端部分 AndroidWebFinal/src/UserInfoDAO.java

                        利用sql语句完成数据存储。

     public String passwordExchange(String username, String newPassword , String phoneNumber, String filepath){
        try {
            Connection conn = this.getConn(filepath);
            String sql = "UPDATE userinfo SET password = ? WHERE username = ? AND phonenumber = ?";
            PreparedStatement stmt = conn.prepareStatement(sql);
            stmt.setString(1, newPassword);
            stmt.setString(2, username);
            stmt.setString(3, phoneNumber);
            int rowsAffected = stmt.executeUpdate(); // rowAffected = 0 表示受影响的行数为 0  则说明电话号码不匹配
            stmt.close();
            conn.close();
            if (rowsAffected == 0) {
                return "phoneNumber is not correct";
            } else {
                return "password has been changed!";
            }
        } catch (Exception e) {
            e.printStackTrace();
            return e.toString();
        }
    }

                 获取前端输入数据。 

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String filePath = req.getSession().getServletContext().getRealPath("") + "/database.txt";
        UserInfoDAO uDAO = new UserInfoDAO();
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        String phonenumber = req.getParameter("phonenumber");
        String gender = req.getParameter("gender");
        String sReturn = uDAO.saveAllUser(username, password, phonenumber, gender,filePath);
        resp.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter writer = resp.getWriter();
        writer.write(sReturn);
        writer.flush();
        writer.close();
    }
注意:后端req.getParameter("XXX") 要与前url中的查询串一一对应。

四、主要问题解决

           1.报错:java.io.IOException: Cleartext HTTP traffic to 192.168.200.1 not permitted

                  解决方法: 在xml中添加network_security_config.xml文件,内容如下。

       Android-Servlet-Mysql 自助点餐系统(含Github自主开源代码),Android-Servlet-Mysql自助点餐系统,开源代码与实现指南 第18张Android-Servlet-Mysql 自助点餐系统(含Github自主开源代码),Android-Servlet-Mysql自助点餐系统,开源代码与实现指南 第19张

           2.报错:java.net.ConnectException: fail to connect to localhost/127.0.0.1(port 8080): connect failed:ECONNREFUSED….(Codename One App)

                解决方法:在C盘中找到对应路径,并打开打开命令行,输入逐步输入后面两行命令,重连虚拟机端口,使其匹配对应Tomcat服务器端口。详情可以参考(stackoverflow)  网址一/网址二。

Android-Servlet-Mysql 自助点餐系统(含Github自主开源代码),Android-Servlet-Mysql自助点餐系统,开源代码与实现指南 第20张

adb root

adb reverse tcp:8080 tcp:8080


五、结语

        本课程设计不仅还存在许多问题,同时还有许多方面值得改进。如果在编写文档的过程中存在知识上的错误,尽心谅解。希望我本次的分享能提供需要Android studio课程设计的同学一点方向,也希望在未来的学习道路上可以与大家一同进步!

        Tips:在连接前后端的过程中,一定要保证两者访问的端口号相同。编者在学习JavaWeb过程中为了方便学习,将Tomcat服务器的端口号改为80,则在Android studio中也需要修改adb使其端口号为相应的端口号。 

        源代码:https://github.com/FLLTT/Android-Servlet-Mysql.git


0
收藏0
文章版权声明:除非注明,否则均为VPS857原创文章,转载或复制请以超链接形式并注明出处。

相关阅读

  • 【研发日记】Matlab/Simulink自动生成代码(二)——五种选择结构实现方法,Matlab/Simulink自动生成代码的五种选择结构实现方法(二),Matlab/Simulink自动生成代码的五种选择结构实现方法详解(二)
  • 超级好用的C++实用库之跨平台实用方法,跨平台实用方法的C++实用库超好用指南,C++跨平台实用库使用指南,超好用实用方法集合,C++跨平台实用库超好用指南,方法与技巧集合
  • 【动态规划】斐波那契数列模型(C++),斐波那契数列模型(C++实现与动态规划解析),斐波那契数列模型解析与C++实现(动态规划)
  • 【C++】,string类底层的模拟实现,C++中string类的模拟底层实现探究
  • uniapp 小程序实现微信授权登录(前端和后端),Uniapp小程序实现微信授权登录全流程(前端后端全攻略),Uniapp小程序微信授权登录全流程攻略,前端后端全指南
  • Vue脚手架的安装(保姆级教程),Vue脚手架保姆级安装教程,Vue脚手架保姆级安装指南,Vue脚手架保姆级安装指南,从零开始教你如何安装Vue脚手架
  • 如何在树莓派 Raspberry Pi中本地部署一个web站点并实现无公网IP远程访问,树莓派上本地部署Web站点及无公网IP远程访问指南,树莓派部署Web站点及无公网IP远程访问指南,本地部署与远程访问实践,树莓派部署Web站点及无公网IP远程访问实践指南,树莓派部署Web站点及无公网IP远程访问实践指南,本地部署与远程访问详解,树莓派部署Web站点及无公网IP远程访问实践详解,本地部署与远程访问指南,树莓派部署Web站点及无公网IP远程访问实践详解,本地部署与远程访问指南。
  • vue2技术栈实现AI问答机器人功能(流式与非流式两种接口方法),Vue2技术栈实现AI问答机器人功能,流式与非流式接口方法探究,Vue2技术栈实现AI问答机器人功能,流式与非流式接口方法详解
  • 发表评论

    快捷回复:表情:
    评论列表 (暂无评论,0人围观)

    还没有评论,来说两句吧...

    目录[+]

    取消
    微信二维码
    微信二维码
    支付宝二维码