Android移动应用开发
课程设计报告
(2019-2020学年第一学期)
菜谱大全应用系统
系 别 信息与控制工程
专 业 计算机科学与技术
班 级 计算机1702
学 号 173230201
姓 名 王子瑞
指导教师 郭丹
完成时间 2019.12.5
评定成绩
目录
1. 背景 3
2.系统需求分析 3
2.1用例分析 3
1 用例名称:登录 3
2 用例名称:注册 3
3 用例名称:今日推荐 4
4 用例名称:菜谱列表 4
5 用例名称:我的菜谱 4
6 用例名称:联系我们 4
2.2数据逻辑模型 4
3.系统总体设计 5
3.1系统总体设计图 5
3.2系统UI设计图 6
4.数据库设计 7
5.系统实现 7
5.1初始界面 7
5.2注册 8
5.3登录 9
5.4首页 10
5.5今日推荐界面 12
5.6菜谱列表界面 12
5.7我的菜谱界面 14
5.8联系我们界面 18
6. 系统测试 19
7.总结体会 20
- 背景
“民以食为天”这是一个亘古不变的真理,人们的所有的社会活动必须建立在食的基础上。随着经济的猛速发展和人民生活水平的日益提高。人们对于食也有着更高的要求。使用菜谱大全学做菜,不用天天发愁吃什么,不会可以跟着学。所以这样一款应用可以帮助一些对食物有一定要求但是自己又不会做的人是很有必要的。
2.系统需求分析
2.1用例分析
用例分析图如图2.1所示
图2.1菜谱大全应用系统用例图
1 用例名称:登录
说明:系统的登录功能
先决条件:用户
请求结果:以用户身份使用功能
使用频率高
2 用例名称:注册
说明:拥有使用APP身份的功能
先决条件:无
请求结果:拥有身份
使用频率:高
3 用例名称:今日推荐
执行者:用户
说明:系统推荐的今日特色菜品
先决条件:无
请求结果:显示今日推荐菜的做法
使用频率:中
4 用例名称:菜谱列表
执行者:用户
说明:系统里菜谱的列表
先决条件:用户
请求结果:显示所有的菜品
使用频率:高
5 用例名称:我的菜谱
执行者:用户
说明:对每位食客的菜谱进行增删改查的编辑
先决条件:无
请求结果:增删改查菜品
使用频率:中
6 用例名称:联系我们
执行者:用户
说明: 对本产品系统的问题进行反馈
先决条件:用户
请求结果:记录并提交问题反馈
使用频率:低
2.2数据逻辑模型
如图2.2所示
图1.2菜谱大全应用系统E-R图
如图2.2所示,主要的表为用户。用户可先进行输入账号,密码登录。我的菜谱由已验证的用户进行管理,进行添加,删除,查询,修改等一系列表操作。
3.系统总体设计
3.1系统总体设计图
如图3.1
图3.1菜谱大全应用系统系统流程图
本应用可以先使无身份用户注册,然后以验证用户身份登录进入。用户进入可以对该系统进行一些操作。进入首页后能查看今日推荐和菜谱列表与自己上传的不同食客的食谱,并且用户可以对数据库中的数据进行操作。用户还可以通过联系我们及时地反馈本产品在使用过程中出现的问题。
3.2系统UI设计图
4.数据库设计
登陆注册
字段名 |
数据类型 |
长度 |
主键 |
索引 |
外键 |
可空 |
说明 |
Name |
int |
20 |
否 |
|
否 |
否 |
账号 |
Password |
Int |
20 |
否 |
|
否 |
否 |
密码 |
菜品名
字段名 |
数据类型 |
长度 |
主键 |
索引 |
外键 |
可空 |
说明 |
Name |
Varchar |
20 |
是 |
|
否 |
否 |
用户名 |
Dish |
Varchar |
20 |
是 |
|
否 |
否 |
菜品名 |
5.系统实现
5.1初始界面
代码实现如下:
package com.example.keshe1;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void test(View view) {
switch (view.getId()) {
case R.id.button2:
Intent intent1 = new Intent();
intent1.setClass(MainActivity.this, denglu.class);
startActivity(intent1);//跳转登录界面//
break;
case R.id.button3:
Intent intent2 = new Intent();
intent2.setClass(MainActivity.this, zhuce.class);
startActivity(intent2);//跳转注册界面//
}
}
}
5.2注册
代码实现如下:
package com.example.keshe1;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
public class zhuce extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_zhuce);
}
public void test(View view) {
switch (view.getId()) {
case R.id.btn2:
Intent intent4 = new Intent();
intent4.setClass(zhuce.this, denglu.class);
startActivity(intent4);//注册结束,跳转到登录界面//
}
}
}
5.3登录
代码实现如下:
package com.example.keshe1;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Button;
import android.widget.Toast;
public class denglu extends AppCompatActivity {
private Button btn1;
EditText account = null;
EditText code = null;
EditText t1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_denglu);
t1 = (EditText) findViewById(R.id.edt1);
account = (EditText) findViewById(R.id.edt1);
code = (EditText) findViewById(R.id.edt2);
btn1 = (Button) findViewById(R.id.btn1);
btn1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
String username = ((EditText) findViewById(R.id.edt1)).getText().toString();
String pwd = ((EditText) findViewById(R.id.edt2)).getText().toString();
if (view.getId() == R.id.btn1) {
if (username.equals("123456") && pwd.equals("123456")) {
Intent intent3 = new Intent();
intent3.setClass(denglu.this, Main2Activity.class);
startActivity(intent3);
Toast.makeText(denglu.this, "登陆成功", Toast.LENGTH_SHORT).show();
}else {
t1.setText("账号或密码错误请重新输入");
Toast.makeText(denglu.this, "登陆失败", Toast.LENGTH_SHORT).show();
}
}
}
});
}
}
5.4首页
此界面使用了按钮和图片按钮的跳转。
代码实现如下:
package com.example.keshe1;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
public class Main2Activity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
}
public void test(View view) {
switch (view.getId()) {
case R.id.imageButton:
Intent intent5 = new Intent();
intent5.setClass(Main2Activity.this, qiezi.class);
startActivity(intent5);
break;//跳转到今日推荐界面//
case R.id.button6:
Intent intent6 = new Intent();
intent6.setClass(Main2Activity.this, contact.class);
startActivity(intent6);
break;//跳转到联系我们界面//
case R.id.button4:
Intent intent7 = new Intent();
intent7.setClass(Main2Activity.this, caipu.class);
startActivity(intent7);
break;//跳转到菜谱列表界面//
case R.id.button5:
Intent intent8 = new Intent();
intent8.setClass(Main2Activity.this, wode.class);
startActivity(intent8);//跳转到我的推荐界面//
}
}
}
5.5今日推荐界面
代码实现如下:
package com.example.keshe1;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
public class qiezi extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_qiezi);
}
}
5.6菜谱列表界面
此界面使用了List View功能
代码实现如下:
package com.example.keshe1;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import org.w3c.dom.Text;
public class caipu extends AppCompatActivity {
private ListView listView;
private String arr[]={"可乐鸡翅","糖醋排骨","地三鲜","土豆炖牛肉","麻婆豆腐","清蒸鱼","木耳炒山药","西兰花炒虾球"};
private int icons[] = new int[]{R.drawable.p1, R.drawable.p2, R.drawable.p3, R.drawable.p4, R.drawable.p5, R.drawable.p6, R.drawable.p7, R.drawable.p8};//插入相应的图片//
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_caipu);
listView=findViewById(R.id.listView);//获取List View中的内容//
MyBaseAdapter myBaseAdapter=new MyBaseAdapter();
listView.setAdapter(myBaseAdapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Toast.makeText(caipu.this,"你点击的是第" (position 1) "个条目", Toast.LENGTH_SHORT).show();
}
});
}
protected class MyBaseAdapter extends BaseAdapter {
@Override
public int getCount() {
return arr.length;
}
@Override
public Object getItem(int position) {
return arr[position];
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view=View.inflate(caipu.this,R.layout.list_item,null);
ImageView imageView=view.findViewById(R.id.iv);
TextView textView=view.findViewById(R.id.Text);
imageView.setBackgroundResource(icons[position]);
textView.setText(arr[position]);
return view;
}
}
}
5.7我的菜谱界面
此界面使用了sqlite数据库的增删改查
代码实现如下:
package com.example.keshe1;
import com.example.keshe1.R;
import android.app.Activity;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
public class wode extends Activity implements View.OnClickListener {
MyHelper myHelper;
private EditText mEtName;
private EditText mEtDish;
private TextView mTvShow;
private Button mBtnAdd;
private Button mBtnQuery;
private Button mBtnUpdate;
private Button mBtnDelete;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_wode);
myHelper=new MyHelper(this);
init();
}
private void init(){
mEtName=(EditText)findViewById(R.id.et3);
mEtDish=(EditText)findViewById(R.id.et4);
mTvShow=(TextView)findViewById(R.id.tv1);
mBtnAdd=(Button)findViewById(R.id.bt5);
mBtnQuery=(Button)findViewById(R.id.bt6);
mBtnUpdate=(Button)findViewById(R.id.bt7);
mBtnDelete=(Button)findViewById(R.id.bt8);
mBtnAdd.setOnClickListener(this);
mBtnQuery.setOnClickListener(this);
mBtnUpdate.setOnClickListener(this);
mBtnDelete.setOnClickListener(this);
}
public void onClick(View view){
String name,dish;
SQLiteDatabase db;
ContentValues values;
switch (view.getId()){
case R.id.bt5:
name=mEtName.getText().toString();
dish=mEtDish.getText().toString();
db=myHelper.getWritableDatabase();
values=new ContentValues();
values.put("name",name);
values.put("dish",dish);
db.insert("information",null,values);
Toast.makeText(this,"信息已添加",Toast.LENGTH_LONG).show();
db.close();
break;
case R.id.bt6:
db=myHelper.getReadableDatabase();
Cursor cursor=db.query("information",null,null,null,null,null,null);
if (cursor.getCount()==0){
mTvShow.setText("");
Toast.makeText(this,"没有数据",Toast.LENGTH_LONG).show();
}else {
cursor.moveToFirst();
mTvShow.setText("Name:" cursor.getString(1) "Dish:" cursor.getString(2));
}
while (cursor.moveToNext()){
mTvShow.append("n" "Name:" cursor.getString(1) "Dish:" cursor.getString(2));
}
cursor.close();
db.close();
break;
case R.id.bt7:
db=myHelper.getWritableDatabase();
values=new ContentValues();
values.put("dish",dish=mEtDish.getText().toString());
db.update("information",values,"name=?",new String[]{mEtName.getText().toString()});
Toast.makeText(this,"信息已修改",Toast.LENGTH_LONG).show();
db.close();
break;
case R.id.bt8:
db=myHelper.getWritableDatabase();
db.delete("information","name=?",new String[]{mEtName.getText().toString()});
Toast.makeText(this,"信息已删除",Toast.LENGTH_LONG).show();
mTvShow.setText("");
db.close();
break;
}
}
class MyHelper extends SQLiteOpenHelper{
public MyHelper(Context context){
super(context,"itcast.db",null,1);
}
public void onCreate(SQLiteDatabase db){
db.execSQL("CREATE TABLE information(_id INTEGER PRIMARY KEY AUTOINCREMENT,name VARCHAR(20),dish VARCHAR(20))");
}
public void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion){
}
}
}
5.8联系我们界面
此界面使用了File储存
代码实现如下:
package com.example.keshe1;
import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class contact extends Activity implements OnClickListener {
private EditText et_account;
private Button btn;
private SharedPreferences sp;
private FileInputStream fi;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_contact);
et_account = findViewById(R.id.editText);
btn = findViewById(R.id.button);//获取控件内容//
btn.setOnClickListener(this);//设计点击事件//
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button:
String s1 = et_account.getText().toString();
if (TextUtils.isEmpty(s1)) {
Toast.makeText(this, "请输入", Toast.LENGTH_LONG).show();
} else {
sp = getSharedPreferences("data.txt", MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
String saveinfo = et_account.getText().toString().trim();
FileOutputStream fos;
try {
fos = openFileOutput("data.txt", Context.MODE_APPEND);
fos.write(saveinfo.getBytes());
fos.close();//储存到data文件中//
} catch (Exception e) {
e.printStackTrace();
}
editor.putString("s1", null);
editor.commit();
Toast.makeText(this, "提交成功n保存成功", Toast.LENGTH_LONG).show();
String s3 = sp.getString("s1", "");
}
}
}
}
- 系统测试
软件能在Android studio里用模拟机正常打开。
初始界面能正常打开运行。
注册界面能正常打开运行。
登录界面能正常打开运行。
首页界面能正常打开运行。
今日推荐界面能正常打开运行。
菜谱列表界面能正常打开运行。
我的菜谱界面能正常打开运行。
联系我们界面能正常打开运行。
7.总结体会
Android Studio是Google在I/O大会上发布的一个新的集成开发环境,可以让Android开发变的更简单。Android Studio有一些优点特性:1. 颜色、图片在布局和代码中可以实时预览2. string可以实时预览3. 多屏预览、截图带有设备框,可随时录制模拟器视频4. 可以直接打开文件所在位置5. 跨工程移动、搜索、跳转6. 自动保存,无需一直Ctrl S 7. 即使文件关闭依然可以回退N个历史8. 智能重构、智能预测报错9. 每一行文件编辑历史,可追溯到人10. 各种插件:例如ADB、.gitignore、sql、markdown、11. 图片可直接转.9图片,并且自带.9编辑12. 在gradle编译时使用aar依赖超级方便13. Android studio是专业针对android开发。在最初学习阶段,通常会遇到很多问题,Andorid 学习过程中知识点繁多,难以熟练的应用,不经过很长一段时间很难以熟练地运用自己所学的知识。很多事情不是想象中的那么简单的,它涉及到的各种实体、属性、数据流程、数据处理等等。很多时候感觉后面的设计根本无法继续,感觉像是被前面做的限制了。通过这次课程设计发现这其中需要的很多知识我们没有接触过,上网查资料的时候发现我们前边所学到的仅仅是皮毛,还有很多需要我们掌握的东西我们根本不知道。同时也发现有很多已经学过的东西我们没有理解到位,不能灵活运用于实际,不能很好的用来解决问题,这就需要我们不断的大量的实践,通过不断的自学,不断地发现问题,思考问题,进而解决问题。在这个过程中我们将深刻理解所学知识,同时也可以学到不少很实用的东西。课程设计进行的非常艰难,编码非常不容易,我们要勇于尝试,才能不断进步。