赞
踩
声明:本科大二计算机小白,若在表述过程中存在错误或漏洞,欢迎各位大佬在评论区指正。♥
2.1.界面延迟实现(图一) WelcomeActivity.java
2.2. 自动向下滚动(图二)IbtnhomeActivity.java
2.3.持久化登录实现 IbtninfoActivity.java
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
本项目源于课程《移动应用开发》的课程设计,主要考察Android studio的设计编程能力。自主点餐系统能实现:用户登录、菜单浏览、菜品加入购物车等简单的功能。同时使用前后端分离的开发方式,后端部分使用servlet进行对Mysql中的数据进行读取。
tips:在代码编写过程中没有进行文件的模块化,使得项目的文件结构较为凌乱,尽情谅解。
进入程序后,先引导顾客进行登录(未登录无法进行点餐)。登录后可以进行点餐,点餐完毕在购物车进行结算,结算完成后,保存顾客本次的消费记录。同时,在个人信息界面中能展示个人信息,以及查询本人的历史就餐记录。
1.用户登录(与数据库关联):注册账号、验证账号登录、修改密码、忘记密码(手机号验证)。
2.点餐系统:通过读取数据库的信息,完成对点餐界面信息的数据读取,通过加号点击,加入购物车。
3.购物车界面:点击结算,通过扫描二维码进行结算,结算完毕储存消费信息。
4.个人信息界面:个人登录信息、查询个人历史消费信息。
注意:点餐界面中,总共设置了四个小板块,分别是:常规菜品、甜点小吃、饮料酒水和数据测试。编者仅仅在“数据测试”板块完成点菜系统的相关功能,其他三个界面仅供展示。 “数据测试”板块未使用.xml进行文件编写,而其余三个使用.xml类型文件。
“数据测试”板块的相关功能主要包括:
1.点击加号加入购物车。
2.实现数据库的连接,用户可以通过增加或者删除数据库的元组,来修改“数据测试”板块的菜品。
存在问题:
1.本程序如今仅支持单次点餐,即点完餐后进入购物车,再重新跳转回到点餐界面,原本购物车中的信息不会保留。若要实现信息的保留,应该可以使用SharedPreferences完成信息保留的相关设置。
2.在“数据测试”板块,在通过代码构建前端界面时,在保持点餐界面样式不变的前提下,本人无法将导航栏置于页面底部。(原因似乎是因为RelativeLayout不能同时有两个父类)
后端是通过Servlet连接数据库,分为三个大模块:登录模块、菜单模块、点餐信息模块。三个模块的大框架基本相同,JavaBean用于封装需求属性,...DAO用于编写含有sql语句的相应的方法,...Servlet用于前后端信息交互。
在欢迎界面(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秒延迟时间
实现自动向下滚动展示菜品。
- 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);
- }
在登录后能在个人信息页面长期保存个人信息。
- 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);
我们继承AsyncTask<String, Void, String> 来实现。具体代码如下:在这段代码中通过GET方法进行连接,将界面中的信息通过查询串的方式传输到后端进行连接。
- public class NetworkTask extends AsyncTask<String, Void, String> {
- @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();
- }
利用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();
- }
解决方法: 在xml中添加network_security_config.xml文件,内容如下。
解决方法:在C盘中找到对应路径,并打开打开命令行,输入逐步输入后面两行命令,重连虚拟机端口,使其匹配对应Tomcat服务器端口。详情可以参考(stackoverflow) 网址一/网址二。
adb root
adb reverse tcp:8080 tcp:8080
本课程设计不仅还存在许多问题,同时还有许多方面值得改进。如果在编写文档的过程中存在知识上的错误,尽心谅解。希望我本次的分享能提供需要Android studio课程设计的同学一点方向,也希望在未来的学习道路上可以与大家一同进步!
Tips:在连接前后端的过程中,一定要保证两者访问的端口号相同。编者在学习JavaWeb过程中为了方便学习,将Tomcat服务器的端口号改为80,则在Android studio中也需要修改adb使其端口号为相应的端口号。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。