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 學習過程中知識點繁多,難以熟練的應用,不經過很長一段時間很難以熟練地運用自己所學的知識。很多事情不是想象中的那么簡單的,它涉及到的各種實體、屬性、數據流程、數據處理等等。很多時候感覺后面的設計根本無法繼續,感覺像是被前面做的限制了。通過這次課程設計發現這其中需要的很多知識我們沒有接觸過,上網查資料的時候發現我們前邊所學到的僅僅是皮毛,還有很多需要我們掌握的東西我們根本不知道。同時也發現有很多已經學過的東西我們沒有理解到位,不能靈活運用於實際,不能很好的用來解決問題,這就需要我們不斷的大量的實踐,通過不斷的自學,不斷地發現問題,思考問題,進而解決問題。在這個過程中我們將深刻理解所學知識,同時也可以學到不少很實用的東西。課程設計進行的非常艱難,編碼非常不容易,我們要勇於嘗試,才能不斷進步。