当前位置:   article > 正文

Android-Servlet-Mysql 自助点餐系统(含Github自主开源代码)_github 点餐

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不能同时有两个父类)

        2.后端结构解析

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

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

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

                

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

                

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

                

三、App界面

        1.图形化展示

        2.相关功能指引

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

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

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

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

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

  1. mHandler = new Handler();
  2. mRunnable = new Runnable() {
  3. @Override
  4. public void run() {
  5. // 获取当前滚动位置
  6. int scrollY = scrollView.getScrollY();
  7. // 计算下一个滚动位置
  8. int nextScrollY = scrollY + 1000;
  9. // 执行滚动动画
  10. ObjectAnimator animator = ObjectAnimator.ofInt(scrollView, "scrollY", nextScrollY);
  11. animator.setDuration(2000);
  12. animator.start();
  13. // 设置延迟时间,控制滚动间隔
  14. mHandler.postDelayed(this, 1000);
  15. }
  16. };
  17. }
  18. @Override
  19. protected void onResume() {
  20. super.onResume();
  21. mHandler.postDelayed(mRunnable,2000);
  22. }
  23. @Override
  24. protected void onPause() {
  25. super.onPause();
  26. mHandler.removeCallbacks(mRunnable);
  27. }

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

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

  1. Intent intent = getIntent();
  2. String pusername = intent.getStringExtra("username");
  3. String pphoneNumber = intent.getStringExtra("phoneNumber");
  4. if(pusername != null){
  5. username.setText("用户名:" + pusername);
  6. phoneNumber.setText("电话:" + pphoneNumber);
  7. SharedPreferences sharedPreferences = getSharedPreferences("login",MODE_PRIVATE);
  8. SharedPreferences.Editor editor = sharedPreferences.edit();
  9. editor.putString("username",pusername);
  10. editor.putString("phoneNumber",pphoneNumber);
  11. editor.putBoolean("isLoggedIn",true);
  12. editor.apply();
  13. }/*else {
  14. username.setText("用户名:未登录");
  15. phoneNumber.setText("电话:未登录" );
  16. }*/
  17. SharedPreferences sharedPreferences = getSharedPreferences("login", MODE_PRIVATE);
  18. String savedUsername = sharedPreferences.getString("username", "未登录");
  19. String savedPhoneNumber = sharedPreferences.getString("phoneNumber", "未登录");
  20. boolean isLoggedIn = sharedPreferences.getBoolean("isLoggedIn", false);
  21. username.setText("用户名:" + savedUsername);
  22. phoneNumber.setText("电话:" + savedPhoneNumber);

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

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

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

  1. public class NetworkTask extends AsyncTask<String, Void, String> {
  2. @Override
  3. protected String doInBackground(String... params) {
  4. try {
  5. String urlString = "http://127.0.0.1/save.do?username=" + username + "&password=" + password + "&phonenumber=" + phoneNumber + "&gender=" + gender ;
  6. URL url = new URL(urlString);
  7. HttpURLConnection connection = (HttpURLConnection) url.openConnection();
  8. connection.setRequestMethod("GET");
  9. connection.connect();
  10. System.out.println(connection.getResponseCode());

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

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

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

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

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

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

                 获取前端输入数据。 

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

四、主要问题解决

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

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

       

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

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/958400
推荐阅读
相关标签
  

闽ICP备14008679号