102
社区成员
发帖
与我相关
我的任务
分享一、实验目的
使用Android Studio开发一个能让人感兴趣的软件,并给出分析和演示。
二、实验要求
使用Android Studio开发一个图书管理系统,能进行注册、登录、借书还书和个人信息修改的操作。
三、实验内容
布局和后端文件


activity_borrow.xml和BorrowActivity.java
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".BorrowActivity"
android:descendantFocusability="blocksDescendants" >
<TextView
android:id="@+id/borrow_tv"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:gravity="center"
android:text="图书馆内现有图书如下:"
android:textSize="30sp"
android:textColor="#516D2C" />
<ListView
android:id="@+id/ls"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="50"
/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_weight="1"
android:gravity="bottom">
<Button
android:id="@+id/borrow_btn"
android:layout_width="wrap_content"
android:layout_height="80dp"
android:layout_weight="1"
android:text="借 书"
android:textSize="20sp"
android:focusable="false"/>
<Button
android:id="@+id/borrow_exit_btn"
android:layout_width="wrap_content"
android:layout_height="80dp"
android:layout_weight="1"
android:text="返 回"
android:textSize="20sp"
android:focusable="false"/>
</LinearLayout>
</LinearLayout>
package lmh.object.big_assignment;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.ComponentName;
import android.content.ContentValues;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Color;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class BorrowActivity extends Activity implements View.OnClickListener{
Help_DB help_db;
SQLiteDatabase db;
ListView listView;
String _id="";
private String[] names = new String[]{"朝前","时间足够你爱","流浪地球","晚熟的人","活着"};
private String[] author = new String[]{"作者:李尚龙","作者:罗伯特.海因莱因","作者:刘慈欣","作者:莫言","作者:余华"};
private String[] ISBN = new String[]{"ISBN:9787559662187","ISBN:9787559457264","ISBN:9787511360809","ISBN:9787020164776","ISBN:9787530221532"};
private String[] cbs = new String[]{"出版社:人民邮电出版社","出版社:江苏凤凰文艺出版社","出版社:中国华侨出版社","出版社:浙江新华书店旗舰店","出版社:北京十月文艺出版社"};
private double[] price = new double[]{52.00,100.00,32.00,32.00,31.00};
private int[] imageIds = new int[]{R.drawable.book_1,R.drawable.book_2,R.drawable.book_3,R.drawable.book_4,R.drawable.book_5};
private String[] pl= new String[]{"简介:躺平和摆烂不难,但坚持到底一定很酷。若你决定灿烂,尽管一路朝前。","简介:我活了两千多年,谈了1001场恋爱,或许领悟了爱的本质。",
"简介:人类科幻史上极具代表性的作品,绽放“中国想象力”。", "简介:从《红高粱》到《晚熟的人》,从历史深处步入现实百态。",
"简介:人是为了活着本身而活着,而:不是为了活着本身之外的任何事物而活着。"};
private int[] b_num= new int[]{5,10,8,14,3};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_borrow);
listView=(ListView) findViewById(R.id.ls);
help_db=new Help_DB(this);
db=help_db.getReadableDatabase();
Button borrow_btn=findViewById(R.id.borrow_btn);
Button borrow_exit_btn=findViewById(R.id.borrow_exit_btn);
borrow_btn.setOnClickListener(this);
borrow_exit_btn.setOnClickListener(this);
for(int i=0;i<5;i++)
{
ContentValues contentValues=new ContentValues();
contentValues.put("b_id",i+1);
contentValues.put("b_num",b_num[i]);
Cursor cursor=db.query("books",null,"b_id=?",new String[]{String.valueOf(i+1)},null,null,null);
if(cursor.getCount()==0)
db.insert("books",null,contentValues);
}
display(listView);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
_id=((TextView)view.findViewById(R.id.id)).getText().toString();
}
});
}
@Override
public void onClick(View view) {
Intent intent = new Intent();
Bundle bundle=new Bundle();
bundle.putString("_id",_id);
intent.putExtras(bundle);
ComponentName componentName=new ComponentName(BorrowActivity.this,BorrowEnquireActivity.class);
intent.setComponent(componentName);
switch (view.getId())
{
case R.id.borrow_btn:{
if (_id.equals("")) {
Toast toast = new Toast(BorrowActivity.this);
toast.setGravity(Gravity.CENTER,0,0);
TextView textView=new TextView(BorrowActivity.this);
textView.setTextSize(18f);
textView.setTextColor(Color.RED);
textView.setText("请选择记录后再进行操作!");
toast.setDuration(Toast.LENGTH_LONG);
toast.setView(textView);
toast.show();
}
else{
startActivity(intent);
}
}
break;
case R.id.borrow_exit_btn: {
Intent intent1=new Intent(BorrowActivity.this,lmh.object.big_assignment.WelcomeActivity.class);
startActivity(intent1);
//finish();
}
break;
}
}
@SuppressLint("Range")
private void display(ListView listView)
{
List<Map<String,Object>> listitem=new ArrayList<>();
for (int i=0;i<5;i++)
{
Map<String,Object> map_list=new HashMap<>();
Cursor cursor=db.query("books",null,"b_id=?",new String[]{String.valueOf(i+1)},null,null,null);
cursor.moveToFirst();
b_num[i]=cursor.getInt(cursor.getColumnIndex("b_num"));
map_list.put("id",String.valueOf(i+1));
map_list.put("header",imageIds[i]);
map_list.put("b_name",names[i]);
map_list.put("b_author",author[i]);
map_list.put("ISBN",ISBN[i]);
map_list.put("b_publisher",cbs[i]);
map_list.put("b_num",b_num[i]);
map_list.put("b_price",price[i]);
map_list.put("b_introduction",pl[i]);
listitem.add(map_list);
}
SimpleAdapter simpleAdapter=new SimpleAdapter(this,listitem,R.layout.activity_borrowbooklist,new String[]{"id","header","b_name", "b_author", "ISBN", "b_publisher", "b_num", "b_price","b_introduction"},new int[]{R.id.id,R.id.header,R.id.b_name,R.id.b_author,R.id.ISBN,R.id.b_publisher,R.id.b_num,R.id.b_price,R.id.b_introduction});
listView.setAdapter(simpleAdapter);
}
}
这是借书界面的布局文件和后端文件,借书界面的布局将会包括“图书馆内现有图书如下:“的字条、图书列表、借书按钮、返回按钮。而后端文件则包含了图书的相关信息、按钮后的变量操作、与数据库的链接和与其它后端文件的链接。借书按钮将会打开BorrowEnquireActivity.java,而返回按钮将会打开WelcomeActivity.java。
activity_borrow_enquire.xml和BorrowEnquire.java
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:padding="20dp"
>
<TextView
android:id="@+id/borrow_enquire"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:text="请问您是否借书!"
android:textColor="#000000"
android:textSize="30sp" />
<Button
android:id="@+id/borrow_enquire_save"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="确 定"
android:textSize="18sp"
android:layout_marginLeft="7dp"
android:layout_marginTop="20dp"
android:layout_below="@+id/borrow_enquire"
/>
<Button
android:id="@+id/borrow_enquire_exit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/borrow_enquire"
android:layout_marginLeft="50dp"
android:layout_marginTop="20dp"
android:layout_toRightOf="@+id/borrow_enquire_save"
android:text="取 消"
android:textSize="18sp" />
</RelativeLayout>
package lmh.object.big_assignment;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.ComponentName;
import android.content.ContentValues;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Color;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.Nullable;
public class BorrowEnquireActivity extends Activity {
Help_DB help_db;
SQLiteDatabase db;
String id="";
Integer num;
@SuppressLint("Range")
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_borrow_enquire);
// TextView b_name=findViewById(R.id.b_name);
// TextView b_author=findViewById(R.id.b_author);
// TextView ISBN=findViewById(R.id.ISBN);
// TextView b_publisher=findViewById(R.id.b_publisher);
// EditText b_num=findViewById(R.id.b_num);
// TextView b_price=findViewById(R.id.b_price);
// TextView b_introduction=findViewById(R.id.b_introduction);
help_db=new Help_DB(this);
db=help_db.getReadableDatabase();
SharedPreferences sharedPreferences=getSharedPreferences("current_user",MODE_PRIVATE);
String sno=sharedPreferences.getString("account","");
Intent intent=getIntent();
Bundle bundle=intent.getExtras();
id=bundle.getString("_id");
if(!id.equals("")){
Cursor cursor=db.query("books",null,"b_id=?",new String[]{id},null,null,null);
cursor.moveToFirst();
num=cursor.getInt(cursor.getColumnIndex("b_num"));
if (num<=0) {
Toast toast = new Toast(BorrowEnquireActivity.this);
toast.setGravity(Gravity.CENTER,0,0);
TextView textView=new TextView(BorrowEnquireActivity.this);
textView.setTextSize(18f);
textView.setTextColor(Color.RED);
textView.setText("图书馆内此书的数量为0,请重新挑选!");
toast.setDuration(Toast.LENGTH_LONG);
toast.setView(textView);
toast.show();
finish();
}
Cursor cursor1=db.query("borrow",null,"sno=?",new String[]{sno},null,null,null);
String flag="no";
Integer id_int = Integer.valueOf(id);
Integer num;
for(cursor1.moveToFirst();!cursor1.isAfterLast();cursor1.moveToNext())
{
num = cursor1.getInt(cursor1.getColumnIndex("b_id"));
if (id_int == num)
{
flag="true";
break;
}
}
if (flag.equals("true")){
Toast toast = new Toast(BorrowEnquireActivity.this);
toast.setGravity(Gravity.CENTER,0,0);
TextView textView=new TextView(BorrowEnquireActivity.this);
textView.setTextSize(18f);
textView.setTextColor(Color.RED);
textView.setText("您已经借走此书,请勿重复再借!");
toast.setDuration(Toast.LENGTH_LONG);
toast.setView(textView);
toast.show();
finish();
}
// cursor.moveToFirst();
// Integer have=cursor.getInt(cursor1.getColumnIndex("b_id"));
// b_name.setText(cursor.getString(cursor.getColumnIndex("b_name")));
// b_author.setText(cursor.getString(cursor.getColumnIndex("b_author")));
// ISBN.setText(cursor.getString(cursor.getColumnIndex("ISBN")));
// b_publisher.setText(cursor.getString(cursor.getColumnIndex("b_publisher")));
// b_num.setText(cursor.getInt(cursor.getColumnIndex("b_num")));
// b_price.setText(cursor.getInt(cursor.getColumnIndex("b_price")));
// b_introduction.setText(cursor.getString(cursor.getColumnIndex("b_introduction")));
}
Button borrow_enquire_save=findViewById(R.id.borrow_enquire_save);
borrow_enquire_save.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
ContentValues contentValues=new ContentValues();
contentValues.put("b_id",id);
contentValues.put("b_num",num-1);
ContentValues contentValues1=new ContentValues();
contentValues1.put("sno",sno);
contentValues1.put("b_id",id);
db.insert("borrow",null,contentValues1);
if (db.update("books",contentValues,"b_id=?",new String[]{id})>0){
ComponentName componentName=new ComponentName(BorrowEnquireActivity.this,BorrowActivity.class);
intent.setComponent(componentName);
startActivity(intent);
}
}
});
Button borrow_enquire_cancel=findViewById(R.id.borrow_enquire_exit);
borrow_enquire_cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
finish();
}
});
}
}
这是在借书界面点击借书按钮后会弹出的确认界面。其布局将会展示”您是否借书“的字条和”确定“、”取消“两个按钮。而后端会链接数据库,若图书数量为0是选择确定,会返回”图书馆内此书数量为0,请重新挑选“的字符串;若同一用户已经借过此书,则返回”您已借走此书,请勿重复再借“的字符串。
Help_DB.java
package lmh.object.big_assignment;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.view.View;
public class Help_DB extends SQLiteOpenHelper {
public Help_DB(Context context){
super(context,"Help_DB.db3",null,3);
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
sqLiteDatabase.execSQL("create table users(sno varchar(20) primary key, password varchar(20) not null)");
sqLiteDatabase.execSQL("create table borrow(sno varchar(20), b_id integer not null,borrowDate datetime default null,returnDate datetime default null, primary key(sno,b_id))");
sqLiteDatabase.execSQL("create table books(b_id integer primary key autoincrement, b_num integer default 10)");
sqLiteDatabase.execSQL("create table users_info(sno varchar(20) primary key, nick varchar(20), name varchar(20), sex varchar(5), phone varchar(20), address varchar(30),image integer)");
//sqLiteDatabase.execSQL("create table books(b_id integer primary key autoincrement, b_name varchar(20) not null, b_author varchar(20) default null, ISBN varchar(20) default null, b_publisher varvhar(30) default null, b_num integer default 10, b_price integer default 0,b_introduction varchar(100) default null,b_image blob)");
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
sqLiteDatabase.execSQL("drop table if exists users");
sqLiteDatabase.execSQL("drop table if exists borrow");
sqLiteDatabase.execSQL("drop table if exists books");
sqLiteDatabase.execSQL("drop table if exists users_info");
onCreate(sqLiteDatabase);
}
}
建库的后端,创建了用户表、借书表、图书表和用户信息表。
activity_login.xml和LoginActivity.java
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center" >
<ImageView
android:layout_width="210dp"
android:layout_height="110dp"
android:src="@mipmap/login_logo"
android:scaleType="centerCrop"
android:layout_gravity="center_horizontal"
android:layout_marginBottom="30dp"
/>
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal">
<TextView
android:id="@+id/student_number_edit"
android:layout_width="wrap_content"
android:layout_height="40dp"
android:text="账号:"
android:textSize="16sp"
android:layout_marginLeft="10dp"
android:gravity="center_vertical"
android:layout_marginTop="20dp"/>
<EditText
android:id="@+id/login_sno"
android:layout_width="300dp"
android:layout_height="40dp"
android:layout_marginTop="20dp"
android:layout_toRightOf="@+id/student_number_edit"
android:hint="请输入账号"
android:inputType="textEmailAddress"
android:singleLine="true" />
<TextView
android:id="@+id/password_edit"
android:layout_width="wrap_content"
android:layout_height="40dp"
android:layout_below="@id/student_number_edit"
android:layout_marginLeft="10dp"
android:layout_marginTop="20dp"
android:gravity="center_vertical"
android:text="密码:"
android:textSize="16sp" />
<EditText
android:id="@+id/login_password"
android:layout_width="300dp"
android:layout_height="40dp"
android:layout_below="@id/login_sno"
android:layout_marginTop="20dp"
android:layout_toRightOf="@+id/password_edit"
android:hint="请输入密码(包含数字、字母和符号)"
android:inputType="textPassword"
android:singleLine="true" />
<CheckBox
android:id="@+id/remember_password"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/password_edit"
android:layout_marginLeft="45dp"
android:text="记住密码"
android:checked="true"/>
<CheckBox
android:id="@+id/admin_login"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="0dp"
android:layout_below="@id/password_edit"
android:layout_toRightOf="@+id/remember_password"
android:layout_marginLeft="80dp"
android:text="管理员登陆" />
<Button
android:id="@+id/login_btn"
android:layout_width="110dp"
android:layout_height="40dp"
android:text="登录"
android:layout_below="@id/remember_password"
android:layout_marginLeft="45dp"
android:layout_marginTop="20dp"/>
<Button
android:id="@+id/register_btn"
android:layout_width="110dp"
android:layout_height="40dp"
android:layout_below="@id/admin_login"
android:layout_marginLeft="55dp"
android:layout_marginTop="20dp"
android:layout_toRightOf="@id/login_btn"
android:text="注册" />
</RelativeLayout>
</LinearLayout>
package lmh.object.big_assignment;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Color;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import java.util.regex.Pattern;
public class LoginActivity extends AppCompatActivity {
Help_DB help_db;
SQLiteDatabase db;
EditText login_sno;
EditText login_password;
CheckBox rp;
CheckBox al;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
Button register_btn = findViewById(R.id.register_btn);
Button login_btn = findViewById(R.id.login_btn);
login_sno = findViewById(R.id.login_sno);
login_password = findViewById(R.id.login_password);
rp = findViewById(R.id.remember_password);
help_db = new Help_DB(this);
db = help_db.getReadableDatabase();
SharedPreferences sharedPreferences = getSharedPreferences("lastlogin", MODE_PRIVATE);
String sn = sharedPreferences.getString("account", "");
String pw = sharedPreferences.getString("password", "");
login_sno.setText(sn);
login_password.setText(pw);
register_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(LoginActivity.this, lmh.object.big_assignment.RegisterActivity.class);
startActivityForResult(intent, 123);
}
});
login_btn.setOnClickListener(new View.OnClickListener() {
@SuppressLint("Range")
@Override
public void onClick(View v) {
String in_sn = String.valueOf(login_sno.getText());
String in_pw = String.valueOf(login_password.getText());
String r_pw = "";
if (in_sn.equals("")) {
Toast toast = new Toast(LoginActivity.this);
toast.setDuration(Toast.LENGTH_LONG);
toast.setText("输入账号为空,请先进行注册!");
toast.show();
} else {
TextView t1 = findViewById(R.id.login_password);
Pattern pattern = Pattern.compile("[_0-9a-zA-Z]+");
boolean tf = pattern.matcher(t1.getText()).matches();
if (!tf) {
Toast toast = new Toast(LoginActivity.this);
toast.setDuration(Toast.LENGTH_LONG);
toast.setText("登陆密码格式错误!");
toast.show();
} else {
Cursor cursor = db.query("users", null, "sno=?", new String[]{in_sn}, null, null, null);
cursor.moveToFirst();
r_pw = cursor.getString(cursor.getColumnIndex("password"));
if (in_pw.equals(r_pw)) {
SharedPreferences sharedPreferences2 = getSharedPreferences("lastlogin", MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences2.edit();
if (rp.isChecked()) {
editor.putString("account", in_sn);
editor.putString("password", in_pw);
editor.commit();
} else {
editor.clear();
editor.commit();
}
Intent intent = new Intent(LoginActivity.this, lmh.object.big_assignment.WelcomeActivity.class);
intent.putExtra("account",in_sn);
startActivity(intent);
} else {
Toast toast = new Toast(LoginActivity.this);
toast.setDuration(Toast.LENGTH_LONG);
toast.setText("用户名或者密码错误!");
toast.show();
}
}
}
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 123 && resultCode == 456) {
Bundle bundle = data.getExtras();
login_sno.setText(bundle.getCharSequence("account"));
login_password.setText(bundle.getCharSequence("password"));
}
}
}
这是登陆界面的布局和后端。页面上将会有图书管理系统的标识、账号框、口令框、记住密码和管理员登陆的选择按钮以及登录按钮和注册按钮。后端文件链接了数据库,调用了用户表,能跳转到注册界面和欢迎界面。
activity_personal.xml和PersonalActivity.java
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:layout_marginTop="20dp">
<TextView
android:id="@+id/person"
android:layout_width="220dp"
android:layout_height="120dp"
android:layout_marginLeft="10dp"
android:layout_marginTop="20dp"
android:hint="个人信息"
android:paddingLeft="25dp"
android:textSize="45sp"
android:textStyle="bold" />
<TextView
android:id="@+id/nick_edit"
android:layout_width="wrap_content"
android:layout_height="40dp"
android:layout_below="@+id/person"
android:gravity="center_vertical"
android:layout_marginLeft="15dp"
android:text="昵称:"
android:textSize="16sp" />
<EditText
android:id="@+id/nick"
android:layout_width="180dp"
android:layout_height="40dp"
android:layout_below="@+id/person"
android:layout_marginLeft="10dp"
android:layout_toRightOf="@+id/nick_edit"
android:hint="请输入用户名"
android:paddingLeft="5dp"
android:singleLine="true" />
<TextView
android:id="@+id/name_edit"
android:layout_width="wrap_content"
android:layout_height="40dp"
android:layout_below="@+id/nick_edit"
android:gravity="center_vertical"
android:layout_marginLeft="15dp"
android:text="姓名:"
android:textSize="16sp" />
<EditText
android:id="@+id/name"
android:layout_width="180dp"
android:layout_height="40dp"
android:layout_below="@+id/nick"
android:layout_marginLeft="10dp"
android:layout_toRightOf="@+id/name_edit"
android:hint="请输入姓名"
android:paddingLeft="5dp"
android:singleLine="true" />
<TextView
android:id="@+id/sno_edit"
android:layout_width="wrap_content"
android:layout_height="40dp"
android:layout_below="@id/name_edit"
android:gravity="center_vertical"
android:text="账号:"
android:textSize="16sp"
android:layout_marginLeft="15dp" />
<TextView
android:id="@+id/sno"
android:layout_width="180dp"
android:layout_height="40dp"
android:layout_below="@id/name"
android:layout_toRightOf="@id/sno_edit"
android:layout_marginTop="5dp"
android:paddingLeft="5dp"
android:textSize="20sp"
android:singleLine="true" />
<TextView
android:id="@+id/sex_edit"
android:layout_width="wrap_content"
android:layout_height="40dp"
android:layout_below="@id/sno_edit"
android:layout_marginLeft="15dp"
android:gravity="center"
android:text="性别:"
android:textSize="16sp" />
<EditText
android:id="@+id/sex"
android:layout_width="180dp"
android:layout_height="40dp"
android:layout_below="@id/sno"
android:layout_marginLeft="10dp"
android:layout_marginTop="0dp"
android:layout_toRightOf="@id/sex_edit"
android:gravity="center_vertical"
android:hint="男/女/保密"
android:paddingLeft="5dp"
android:singleLine="true" />
<TextView
android:id="@+id/phone_edit"
android:layout_width="wrap_content"
android:layout_height="40dp"
android:layout_below="@id/sex_edit"
android:gravity="center_vertical"
android:layout_marginLeft="15dp"
android:text="电话:"
android:textSize="16sp" />
<EditText
android:id="@+id/phone"
android:layout_width="180dp"
android:layout_height="40dp"
android:layout_below="@id/sex"
android:layout_toRightOf="@id/phone_edit"
android:hint="请输入手机号"
android:paddingLeft="5dp"
android:singleLine="true" />
<TextView
android:id="@+id/address_edit"
android:layout_width="wrap_content"
android:layout_height="40dp"
android:layout_below="@id/phone_edit"
android:layout_marginLeft="15dp"
android:gravity="center_vertical"
android:text="地址:"
android:textSize="16sp" />
<EditText
android:id="@+id/address"
android:layout_width="180dp"
android:layout_height="40dp"
android:layout_below="@id/phone"
android:layout_toRightOf="@id/address_edit"
android:hint="请输入家庭住址"
android:paddingLeft="5dp"
android:singleLine="true" />
<Button
android:id="@+id/personal_confirm_btn"
android:layout_width="120dp"
android:layout_height="72dp"
android:layout_below="@+id/address"
android:layout_marginLeft="15dp"
android:layout_marginTop="50dp"
android:textSize="20sp"
android:text="确认修改" />
<Button
android:id="@+id/personal_exit_btn"
android:layout_width="120dp"
android:layout_height="72dp"
android:layout_below="@+id/address"
android:layout_marginLeft="30dp"
android:layout_marginTop="50dp"
android:textSize="20sp"
android:layout_toRightOf="@+id/personal_confirm_btn"
android:paddingLeft="10dp"
android:text="取 消" />
<ImageView
android:id="@+id/icon"
android:layout_width="wrap_content"
android:layout_height="250dp"
android:layout_toRightOf="@+id/person"
android:scaleType="matrix"
android:src="@drawable/icon" />
</RelativeLayout>
</RelativeLayout>
package lmh.object.big_assignment;
import android.app.Activity;
import android.content.ComponentName;
import android.content.ContentValues;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Color;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.Nullable;
public class PersonalActivity extends Activity {
Help_DB help_db;
SQLiteDatabase db;
EditText nick,name,sex,phone,address;
TextView sno;
ImageView imageView;
Button personal_confirm_btn,personal_exit_btn;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_personal);
nick=findViewById(R.id.nick);
name=findViewById(R.id.name);
sex=findViewById(R.id.sex);
phone=findViewById(R.id.phone);
address=findViewById(R.id.address);
sno=findViewById(R.id.sno);
personal_confirm_btn=findViewById(R.id.personal_confirm_btn);
personal_exit_btn=findViewById(R.id.personal_exit_btn);
help_db=new Help_DB(this);
db=help_db.getReadableDatabase();
SharedPreferences sharedPreferences=getSharedPreferences("current_user",MODE_PRIVATE);
String account=sharedPreferences.getString("account","");
sno.setText(account);
imageView=findViewById(R.id.icon);
Cursor cursor1=db.query("users_info",null,"sno=?",new String[]{account},null,null,null);
if (cursor1.moveToFirst()==true)
{
nick.setText(cursor1.getString(cursor1.getColumnIndex("nick")));
name.setText(cursor1.getString(cursor1.getColumnIndex("name")));
sex.setText(cursor1.getString(cursor1.getColumnIndex("sex")));
phone.setText(cursor1.getString(cursor1.getColumnIndex("phone")));
address.setText(cursor1.getString(cursor1.getColumnIndex("address")));
imageView.setImageResource(cursor1.getInt(cursor1.getColumnIndex("image")));
}
imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent=new Intent(PersonalActivity.this,SelectIconActivity.class);
startActivityForResult(intent,123);
}
});
personal_confirm_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
ContentValues contentValues=new ContentValues();
contentValues.put("sno",String.valueOf(sno.getText()));
contentValues.put("nick",String.valueOf(nick.getText()));
contentValues.put("name",String.valueOf(name.getText()));
contentValues.put("sex",String.valueOf(sex.getText()));
contentValues.put("phone",String.valueOf(phone.getText()));
contentValues.put("address",String.valueOf(address.getText()));
contentValues.put("image",Integer.valueOf(String.valueOf(imageView.getTag())));
Cursor cursor=db.query("users_info",null,"sno=?",new String[]{account},null,null,null);
if (cursor.moveToFirst()==false)
{
if (db.insert("users_info",null,contentValues)>0){
showInfo("保存成功!");
}
}
else{
if (db.update("users_info",contentValues,"sno=?",new String[]{account})>0){
showInfo("保存成功!");
}
}
}
});
personal_exit_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
finish();
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
imageView.setImageResource(data.getExtras().getInt("imgsrc"));
imageView.setTag(data.getExtras().getInt("imgsrc"));
}
public void showInfo(String msg)
{
Toast toast = new Toast(PersonalActivity.this);
toast.setGravity(Gravity.CENTER,0,0);
TextView textView=new TextView(PersonalActivity.this);
textView.setTextSize(18f);
textView.setTextColor(Color.RED);
textView.setText(msg);
toast.setDuration(Toast.LENGTH_LONG);
toast.setView(textView);
}
}
这是个人信息界面的布局和后端。个人信息界面包括了个人信息的文本框、可换的头像、昵称栏、姓名栏、账号栏、性别栏、电话栏和地址栏以及确认修改和取消的按钮。后端文件链接了用户信息表依靠页面反馈对表中内容做修改。
activity_register.xml和RegisterActivity.java
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:layout_marginTop="20dp"
>
<TextView
android:id="@+id/account_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginLeft="40dp"
android:gravity="center_horizontal"
android:paddingBottom="30dp"
android:text="用户注册"
android:textSize="40sp"
android:textStyle="bold" />
<TextView
android:id="@+id/register_sno_edit"
android:layout_width="wrap_content"
android:layout_height="40dp"
android:layout_below="@id/account_title"
android:text=" 账 号 :"
android:gravity="center"/>
<EditText
android:id="@+id/register_sno"
android:layout_width="180dp"
android:layout_height="40dp"
android:layout_below="@id/account_title"
android:layout_toRightOf="@id/register_sno_edit"
android:hint="请输入学号"
android:inputType="number"
android:singleLine="true" />
<TextView
android:id="@+id/register_password_edit"
android:layout_width="wrap_content"
android:layout_height="40dp"
android:layout_below="@id/register_sno_edit"
android:text=" 密 码 :"
android:gravity="center"/>
<EditText
android:id="@+id/register_password"
android:layout_width="180dp"
android:layout_height="40dp"
android:hint="请输入预设密码"
android:layout_toRightOf="@id/register_password_edit"
android:layout_below="@id/register_sno"
android:singleLine="true"/>
<TextView
android:id="@+id/register_password_again_edit"
android:layout_width="wrap_content"
android:layout_height="40dp"
android:layout_below="@id/register_password_edit"
android:text="确认密码:"
android:gravity="center"/>
<EditText
android:id="@+id/register_password_again"
android:layout_width="180dp"
android:layout_height="40dp"
android:hint="请再次输入密码"
android:layout_toRightOf="@id/register_password_again_edit"
android:layout_below="@id/register_password"
android:singleLine="true"/>
<Button
android:id="@+id/register_btn"
android:layout_width="100dp"
android:layout_height="40dp"
android:layout_below="@+id/register_password_again_edit"
android:layout_marginTop="10dp"
android:text="注册" />
<Button
android:id="@+id/register_exit_btn"
android:layout_width="100dp"
android:layout_height="40dp"
android:layout_below="@+id/register_password_again_edit"
android:layout_marginLeft="70dp"
android:layout_marginTop="10dp"
android:layout_marginRight="4dp"
android:layout_toRightOf="@+id/register_password_again_edit"
android:text="退出" />
</RelativeLayout>
</RelativeLayout>
package lmh.object.big_assignment;
import android.app.Activity;
import android.content.ComponentName;
import android.content.ContentValues;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegisterActivity extends Activity {
EditText regist_sno,regist_password,regist_password_agaain;
Help_DB help_db;
SQLiteDatabase db;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register);
regist_sno=findViewById(R.id.register_sno);
regist_password=findViewById(R.id.register_password);
regist_password_agaain=findViewById(R.id.register_password_again);
help_db=new Help_DB(this);
db=help_db.getReadableDatabase();
Button register_btn = findViewById(R.id.register_btn);
Button register_exit_btn=findViewById(R.id.register_exit_btn);
register_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String sn = String.valueOf(regist_sno.getText());
String pw = String.valueOf(regist_password.getText());
String pw_a = String.valueOf(regist_password_agaain.getText());
if (!isNumeric(sn)){
showInfo("账号为学号,全是数字,请重新输入!");
}
else{
if (pw.length()>20) {
showInfo("密码太长,请重新设计!");
}
else{
Pattern pattern = Pattern.compile("[_0-9a-zA-Z]+");
boolean tf = pattern.matcher(regist_password.getText()).matches();
if(!tf) {
showInfo("密码格式错误,请重新输入(密码只包含数字、下划线、字母)!");
}
else{
if (!pw.equals(pw_a)){
showInfo("密码与再次输入密码不一致,请重新输入!");
}
else{
ContentValues contentValues=new ContentValues();
contentValues.put("sno",sn);
contentValues.put("password",pw);
if (db.insert("users",null,contentValues)>0){
Bundle bundle=new Bundle();
bundle.putCharSequence("account",regist_sno.getText());
bundle.putCharSequence("password",regist_password.getText());
Intent intent=new Intent();
intent.setClassName("lmh.object.big_assignment","lmh.object.big_assignment.LoginActivity");
intent.putExtras(bundle);
setResult(456,intent);
finish();
}
}
}
}
}
}
});
register_exit_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
finish();
}
});
}
public void showInfo(String msg)
{
Toast toast = new Toast(RegisterActivity.this);
toast.setDuration(Toast.LENGTH_LONG);
toast.setText(msg);
toast.show();
}
public boolean isNumeric(String str){
Pattern pattern = Pattern.compile("[0-9]*");
Matcher isNum = pattern.matcher(str);
if( !isNum.matches() ){
return false;
}
return true;
}
}
这是注册界面的布局和后端。注册界面有账号、口令和确认口令三栏。同时还有确认和退出两个按钮。后端链接到数据库用户表。
activity_ruturn.xml和RuturnActivity。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".ReturnActivity"
android:descendantFocusability="blocksDescendants">
<TextView
android:id="@+id/return_tv"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:gravity="center"
android:text="您所借的书清单如下:"
android:textSize="30sp"
android:textColor="#516D2C" />
<ListView
android:id="@+id/ls_return"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="50"
/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_weight="1"
android:gravity="bottom">
<Button
android:id="@+id/return_btn"
android:layout_width="wrap_content"
android:layout_height="80dp"
android:layout_weight="1"
android:text="还 书"
android:textSize="20sp"
android:focusable="false"/>
<Button
android:id="@+id/return_exit_btn"
android:layout_width="wrap_content"
android:layout_height="80dp"
android:layout_weight="1"
android:text="返 回"
android:textSize="20sp"
android:focusable="false"/>
</LinearLayout>
</LinearLayout>
package lmh.object.big_assignment;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Color;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class ReturnActivity extends Activity implements View.OnClickListener{
Help_DB help_db;
SQLiteDatabase db;
ListView listView;
String _id="";
private String[] names = new String[]{"朝前","时间足够你爱","流浪地球","晚熟的人","活着"};
private String[] author = new String[]{"作者:李尚龙","作者:罗伯特.海因莱因","作者:刘慈欣","作者:莫言","作者:余华"};
private String[] ISBN = new String[]{"ISBN:9787559662187","ISBN:9787559457264","ISBN:9787511360809","ISBN:9787020164776","ISBN:9787530221532"};
private String[] cbs = new String[]{"出版社:人民邮电出版社","出版社:江苏凤凰文艺出版社","出版社:中国华侨出版社","出版社:浙江新华书店旗舰店","出版社:北京十月文艺出版社"};
private double[] price = new double[]{52.00,100.00,32.00,32.00,31.00};
private int[] imageIds = new int[]{R.drawable.book_1,R.drawable.book_2,R.drawable.book_3,R.drawable.book_4,R.drawable.book_5};
private String[] pl= new String[]{"简介:躺平和摆烂不难,但坚持到底一定很酷。若你决定灿烂,尽管一路朝前。","简介:我活了两千多年,谈了1001场恋爱,或许领悟了爱的本质。",
"简介:人类科幻史上极具代表性的作品,绽放“中国想象力”。", "简介:从《红高粱》到《晚熟的人》,从历史深处步入现实百态。",
"简介:人是为了活着本身而活着,而:不是为了活着本身之外的任何事物而活着。"};
private int[] b_num= new int[]{0,0,0,0,0};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_return);
listView=(ListView) findViewById(R.id.ls_return);
help_db=new Help_DB(this);
db=help_db.getReadableDatabase();
Button return_btn=findViewById(R.id.return_btn);
Button return_exit_btn=findViewById(R.id.return_exit_btn);
return_btn.setOnClickListener(this);
return_exit_btn.setOnClickListener(this);
display(listView);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
_id=((TextView)view.findViewById(R.id.id)).getText().toString();
}
});
}
@Override
public void onClick(View view) {
Intent intent = new Intent();
Bundle bundle=new Bundle();
bundle.putString("_id",_id);
intent.putExtras(bundle);
ComponentName componentName=new ComponentName(ReturnActivity.this,ReturnEnquireActivity.class);
intent.setComponent(componentName);
switch (view.getId())
{
case R.id.return_btn:{
if (_id.equals("")) {
Toast toast = new Toast(ReturnActivity.this);
toast.setGravity(Gravity.CENTER,0,0);
TextView textView=new TextView(ReturnActivity.this);
textView.setTextSize(18f);
textView.setTextColor(Color.RED);
textView.setText("请选择记录后再进行操作!");
toast.setDuration(Toast.LENGTH_LONG);
toast.setView(textView);
toast.show();
}
else{
startActivity(intent);
}
}
break;
case R.id.return_exit_btn: {
Intent intent1=new Intent(ReturnActivity.this,lmh.object.big_assignment.WelcomeActivity.class);
startActivity(intent1);
//finish();
}
break;
}
}
@SuppressLint("Range")
private void display(ListView listView)
{
SharedPreferences sharedPreferences=getSharedPreferences("current_user",MODE_PRIVATE);
String sno=sharedPreferences.getString("account","");
Cursor cursor=db.query("borrow",null,"sno=?",new String[]{sno},null,null,null);
Integer num;
List<Map<String,Object>> listitem=new ArrayList<>();
for(cursor.moveToFirst();!cursor.isAfterLast();cursor.moveToNext())
{
num = cursor.getInt(cursor.getColumnIndex("b_id"));
Cursor cursor1=db.query("books",null,"b_id=?",new String[]{String.valueOf(num)},null,null,null);
cursor1.moveToFirst();
Map<String,Object> map_list=new HashMap<>();
map_list.put("id",String.valueOf(num));
map_list.put("header",imageIds[num-1]);
map_list.put("b_name",names[num-1]);
map_list.put("b_author",author[num-1]);
map_list.put("ISBN",ISBN[num-1]);
map_list.put("b_publisher",cbs[num-1]);
map_list.put("b_price",price[num-1]);
map_list.put("b_introduction",pl[num-1]);
listitem.add(map_list);
}
SimpleAdapter simpleAdapter=new SimpleAdapter(this,listitem,R.layout.activity_returnbooklist,new String[]{"id","header","b_name", "b_author", "ISBN", "b_publisher", "b_price","b_introduction"},new int[]{R.id.id,R.id.header,R.id.b_name,R.id.b_author,R.id.ISBN,R.id.b_publisher,R.id.b_price,R.id.b_introduction});
listView.setAdapter(simpleAdapter);
}
}
这是还书界面的布局文件和后端。
activity_welcome.xml和WelcomeActivity.java
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ImageView
android:id="@+id/welcome_img"
android:layout_width="wrap_content"
android:layout_height="400dp"
android:layout_gravity="center_vertical"
android:layout_marginTop="100dp"
android:scaleType="centerInside"
android:src="@drawable/welcome" />
<TextView
android:id="@+id/welcome_nick_edit"
android:layout_width="wrap_content"
android:layout_height="40dp"
android:layout_below="@+id/welcome_img"
android:paddingLeft="60dp"
android:text="用户:"
android:textSize="28sp" />
<TextView
android:id="@+id/welcome_nick"
android:layout_width="wrap_content"
android:layout_height="40dp"
android:textSize="28sp"
android:layout_below="@+id/welcome_img"
android:paddingLeft="10dp"
android:layout_toRightOf="@+id/welcome_nick_edit" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_alignParentBottom="true"
>
<Button
android:id="@+id/welcome_borrow_btn"
android:layout_width="wrap_content"
android:layout_height="60dp"
android:layout_weight="1"
android:text="借 书"
android:textSize="20sp" />
<Button
android:id="@+id/welcome_return_btn"
android:layout_width="wrap_content"
android:layout_height="60dp"
android:layout_weight="1"
android:text="还 书"
android:textSize="20sp" />
<Button
android:id="@+id/welcome_settings_btn"
android:layout_width="wrap_content"
android:layout_height="60dp"
android:layout_weight="1"
android:text="设 置"
android:textSize="20sp" />
</LinearLayout>
</RelativeLayout>
package lmh.object.big_assignment;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
public class WelcomeActivity extends AppCompatActivity {
Button borrow_btn,return_btn,settings_btn;
TextView welcome_nick;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_welcome);
borrow_btn=findViewById(R.id.welcome_borrow_btn);
return_btn=findViewById(R.id.welcome_return_btn);
settings_btn=findViewById(R.id.welcome_settings_btn);
welcome_nick=findViewById(R.id.welcome_nick);
Bundle bundle=getIntent().getExtras();
if (bundle!=null)
{
String nick=bundle.getString("account");
welcome_nick.setText(nick);
SharedPreferences sharedPreferences=getSharedPreferences("current_user",MODE_PRIVATE);
SharedPreferences.Editor editor= sharedPreferences.edit();
editor.putString("account",nick);
editor.commit();
}
borrow_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent=new Intent(WelcomeActivity.this,lmh.object.big_assignment.BorrowActivity.class);
startActivity(intent);
}
});
return_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent=new Intent(WelcomeActivity.this,lmh.object.big_assignment.ReturnActivity.class);
startActivity(intent);
}
});
settings_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent=new Intent(WelcomeActivity.this,lmh.object.big_assignment.SettingsActivity.class);
startActivity(intent);
}
});
}
@Override
protected void onStart() {
super.onStart();
welcome_nick=findViewById(R.id.welcome_nick);
SharedPreferences sharedPreferences=getSharedPreferences("current_user",MODE_PRIVATE);
String sno=sharedPreferences.getString("account","");
welcome_nick.setText(sno);
}
}
这是欢迎界面的布局和后端。布局有借书、还书、设置三个按钮。后端将三个按钮分别连接到BorrowActivity/ReturnActivity和SettingsActivity.
四、演示视频
五、遇到的问题
在实践过程中,我遇到了数据库未能和后端相连接和数据未能在被操作后改动的问题,最后通过优化表和表之间的关系以及重写后端链接数据库的语句解决了这些问题。