温馨提示:这篇文章已超过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不能同时有两个父类)
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 秒进入界面。
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文件,内容如下。
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
还没有评论,来说两句吧...