目录
一、项目演示
网络资源模板--图书借阅App
二、项目测试环境
三、项目详情
首页
这段代码是一个 Android 应用的 `MainActivity` 类,功能简要总结如下:
- **界面设置**:
-
在 `onCreate` 方法中,设置活动的布局为 `activity_main.xml`。
-
通过 `bindView` 方法初始化两个按钮:`btnUserEnter` 和 `btnAdminEnter`。
- **按钮点击事件**:
- 为 `btnUserEnter` 和 `btnAdminEnter` 设置点击监听器,点击任一按钮都会启动 `LoginActivity`。
- **权限请求**:
-
在 `requestPermissions` 方法中,使用 `XXPermissions` 库请求读写外部存储权限。
-
如果权限被授予,调用 `DataUtils.init()` 进行初始化。
-
如果权限被拒绝,弹出一个 Toast 提示用户。
这个活动的主要功能是提供用户和管理员进入登录界面的按钮,并在应用启动时请求所需的存储权限。
java
private void initView() {
btnUserEnter.setOnClickListener(v->{
startActivity(new Intent(MainActivity.this, LoginActivity.class));
});
btnAdminEnter.setOnClickListener(v -> {
startActivity(new Intent(MainActivity.this, LoginActivity.class));
});
}
登录注册页面
这段代码包含两个活动:`LoginActivity` 和 `RegisterActivity`,它们一起实现了用户登录和注册的功能。以下是它们的功能简要总结:
`LoginActivity` 功能:
- **用户界面初始化**:
- 设置布局并初始化界面元素(用户名、密码输入框、登录按钮、记住我复选框和注册链接)。
- **记住用户信息**:
- 从 `CurrentUserUtils` 获取当前用户信息,并填充用户名和密码(如果选中"记住我"复选框)。
- **登录功能**:
-
用户点击登录按钮时,首先检查用户名和密码是否为"admin"。
-
如果是,则跳转到 `BookManageActivity`。
-
如果不是,则调用 `UserDB.login()` 方法进行登录,处理返回的结果。
-
登录成功后,将用户信息存储并跳转到 `NavActivity`;否则,弹出错误消息。
- **注册链接**:
- 点击注册链接时,启动 `RegisterActivity` 并等待结果。
- **处理注册结果**:
- 如果注册成功,将注册的用户信息填充到输入框中。
`RegisterActivity` 功能:
- **用户界面初始化**:
- 设置布局并初始化界面元素(用户名、密码输入框、再次输入密码按钮和返回按钮)。
- **返回按钮**:
- 点击返回按钮关闭当前活动。
- **注册功能**:
-
用户点击注册按钮时,获取输入的用户名和密码,并创建 `User` 对象。
-
调用 `UserDB.register()` 方法进行注册,处理返回的结果。
-
如果注册成功,将用户信息返回到 `LoginActivity` 并关闭当前活动;否则,弹出消息提示注册结果。
总结:
整体上,这段代码实现了用户的登录和注册功能,包括记住用户信息、处理注册和登录逻辑,以及相应的界面交互。用户可以在登录页面输入信息,若未注册可通过链接跳转到注册页面。注册完成后,信息会返回至登录页面以便快速登录。
java
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE_REGISTER && resultCode == RESULT_OK) {
if (data != null) {
User user = (User) data.getSerializableExtra("user");
etUsername.setText(user.getUsername());
etPassword.setText(user.getPassword());
}
}
}
this.btn_register.setOnClickListener(v -> {
String obj = RegisterActivity.this.etUsername.getText().toString();
String obj2 = RegisterActivity.this.etPassword.getText().toString();
String obj3 = RegisterActivity.this.etPasswordAgain.getText().toString();
User user = new User();
user.setUsername(obj);
user.setPassword(obj2);
BusinessResult<User> register = UserDB.register(user, obj3);
Toast.makeText(RegisterActivity.this, register.getMessage(), Toast.LENGTH_SHORT).show();
if (register.isSuccess()) {
Intent intent = new Intent();
intent.putExtra("user", user);
RegisterActivity.this.setResult(-1, intent);
RegisterActivity.this.finish();
}
});
图书管理页面
这段代码定义了 `BookManageActivity` 类,主要功能如下:
功能总结:
- **界面设置**:
- 在 `onCreate` 方法中,初始化活动的布局和界面元素,包括 RecyclerView(书籍管理列表)、添加书籍的文本视图和返回按钮。
- **书籍管理**:
-
使用 `BookManageAdapter` 来管理 RecyclerView 中的书籍数据。
-
设置点击事件,允许用户查看书籍详情或编辑书籍信息。
- **添加书籍**:
- 点击添加书籍文本时,启动 `BookEditActivity` 以添加新书籍。
- **返回功能**:
- 点击返回图标时,结束当前活动并返回到上一个界面。
- **刷新书籍列表**:
- 在 `onResume` 方法中,调用 `BookDB.getAllBooks()` 更新书籍列表,确保显示最新数据。
总体而言,`BookManageActivity` 提供了书籍管理的基本界面和交互功能,用户可以查看、编辑书籍或添加新书籍。
java
private void bindView() {
this.rvBookManage = (RecyclerView) findViewById(R.id.rv_book_manage);
this.tvAdd = (TextView) findViewById(R.id.tv_add);
this.ivBack = (ImageView) findViewById(R.id.iv_back);
}
private void initView() {
this.ivBack.setOnClickListener(view -> finish());
this.tvAdd.setOnClickListener(view ->
startActivity(new Intent(BookManageActivity.this, BookEditActivity.class))
);
BookManageAdapter bookManageAdapter = new BookManageAdapter();
this.adapter = bookManageAdapter;
bookManageAdapter.setOnItemClickListener(new BookManageAdapter.OnItemClickListener() {
@Override
public void onItemDetailClick(int position, Book book) {
Intent intent = new Intent(BookManageActivity.this, BookDetailActivity.class);
intent.putExtra("book", book);
startActivity(intent);
}
@Override
public void onItemEditClick(int position, Book book) {
Intent intent = new Intent(BookManageActivity.this, BookEditActivity.class);
intent.putExtra("book", book);
startActivity(intent);
}
});
this.rvBookManage.setAdapter(this.adapter);
this.rvBookManage.setLayoutManager(new LinearLayoutManager(this));
}
添加修改图书页面
这段代码实现了 `BookEditActivity` 类,主要用于编辑或添加书籍信息,功能如下:
功能总结:
- **界面初始化**:
- 在 `onCreate` 方法中,设置布局并初始化各个视图元素,包括返回按钮、书籍信息输入框、图片选择和提交按钮。
- **数据处理**:
- 从意图中获取书籍对象。如果存在,则填充书籍信息并显示编辑选项;否则,准备添加新书籍。
- **用户交互**:
-
用户可以通过点击返回按钮关闭活动。
-
点击书籍图片或选择文本框可打开相册选择书籍封面。
-
提交按钮根据是否编辑更新或添加书籍,使用 `BookDB` 进行数据库操作,并通过 Toast 显示操作结果。
- **删除功能**:
- 提供删除书籍的选项,调用数据库方法删除书籍并反馈结果。
- **处理相册选择结果**:
- 在 `onActivityResult` 中处理用户选择的图片路径,并更新书籍封面。
整体而言,`BookEditActivity` 提供了完整的书籍信息编辑和添加功能,允许用户更新现有书籍信息或添加新书籍,同时提供了删除书籍的选项。
java
private void initView() {
tvTitle.setText(isEdit ? "编辑图书" : "添加图书");
ivBack.setOnClickListener(view -> finish());
ivBookImg.setOnClickListener(view -> AlbumUtils.openAlbum(BookEditActivity.this));
tvSelect.setOnClickListener(view -> AlbumUtils.openAlbum(BookEditActivity.this));
btnSubmit.setOnClickListener(view -> {
book.setName(etBookName.getText().toString());
book.setAuthor(etBookAuthor.getText().toString());
book.setDesc(etBookDesc.getText().toString());
book.setTotal(Integer.parseInt(etBookTotal.getText().toString()));
BusinessResult<Book> businessResult = isEdit ? BookDB.updateBook(book) : BookDB.addBook(book);
Toast.makeText(BookEditActivity.this, businessResult.getMessage(), Toast.LENGTH_SHORT).show();
if (businessResult.isSuccess()) {
finish();
}
});
tvDelete.setOnClickListener(view -> {
BusinessResult<Void> deleteBook = BookDB.deleteBook(book.getId().intValue());
Toast.makeText(BookEditActivity.this, deleteBook.getMessage(), Toast.LENGTH_SHORT).show();
if (deleteBook.isSuccess()) {
finish();
}
});
}
图书详情页
这段代码实现了 `BookDetailActivity` 类,用于显示书籍详细信息,功能总结如下:
功能总结:
- **界面设置**:
- 在 `onCreate` 方法中,设置活动的布局并从意图中获取书籍对象。
- **信息展示**:
- 使用 Glide 加载书籍封面图片,并显示书名、作者、描述以及剩余数量和总数。
- **返回功能**:
- 设置返回按钮的点击事件,允许用户返回到前一个界面。
整体而言,`BookDetailActivity` 提供了简单明了的界面,展示了书籍的详细信息,确保用户能方便地查看书籍内容。
XML
<?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"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<FrameLayout
android:layout_width="fill_parent"
android:layout_height="54.0dip"
android:background="@color/main">
<androidx.appcompat.widget.AppCompatImageView
android:id="@id/iv_back"
android:layout_width="54.0dip"
android:layout_height="54.0dip"
android:gravity="center"
android:padding="12.0dip"
android:src="@drawable/ic_back"
android:text="返回"
android:textColor="@color/white" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="详情"
android:textColor="@color/white"
android:textSize="18.0sp"
android:textStyle="bold" />
</FrameLayout>
<androidx.core.widget.NestedScrollView
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_margin="16.0dip"
android:orientation="vertical">
<com.google.android.material.imageview.ShapeableImageView
android:id="@id/iv_book_img"
android:layout_width="120.0dip"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:src="@drawable/book1"
app:shapeAppearanceOverlay="@style/RoundedCorner" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@id/tv_book_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16.0dip"
android:ellipsize="end"
android:gravity="start"
android:maxLines="1"
android:text="思辨力35讲:像辩手一样思考"
android:textColor="@color/black"
android:textSize="15.0sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/tv_book_detail"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@id/tv_book_num"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="剩余:6 总数:10"
android:textColor="@color/main"
android:textSize="10.0sp" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@id/tv_book_author"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16.0dip"
android:text="庞颖"
android:textColor="#ffb0b0b0"
android:textSize="12.0sp" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@id/tv_book_desc"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="bottom"
android:text="本书是一套帮助你识破逻辑陷阱,迅速提升分析、表达问题的实用指南。"
android:textColor="#ffb0b0b0"
android:textSize="12.0sp" />
</LinearLayout>
</androidx.core.widget.NestedScrollView>
</LinearLayout>
图书列表
借阅信息
四、完整的项目源码
👇👇👇👇👇快捷获取方式👇👇👇👇👇