Android 电子书管理系统

系列 - Android开发
  1. 熟悉Android软件开发流程;
  2. 理解并运用MVC/State框架开发整个项目;
  3. 熟练运用异步任务、后台服务、进度条交互显示等功能扩展、完善项目功能;
  4. 能够熟练应用各种控件、手机功能、开发框架,编码、实现完整Android项目。
  1. 在实验二的基础上,进一步通过开发框架的合理应用来改进项目的易扩展性;
  2. 通过AsyncTask、Services、Intent、Thread、Handler等技术的合理组合与运用,修改完善原项目,在易用性、交互性上进一步提高。
  3. 进一步加深对程序设计的理解认识,写出自己的心得体会。

详情:

  1. 了解开发框架及相关技术;
  2. 掌握State、MVC框架的构造原理与使用方法;
  3. 运用软件开发思想,通过融合手机功能、后台服务及其它方法、技术,完善整个项目,全方位提升软件质量。
  4. 学会调试Android程序,熟悉调试工具的使用,并写出一份完整的软件开发、测试、功能描述文档,完成整个Android项目文档的整理、修订。

一个简单的电子书管理系统,后端是一个springboot的后端项目,

image.png

image.png

image.png

image.png

image.png

  • Kotlin 是一种跨平台、静态类型、面向对象的编程语言,它是一种现代化的语言,可以帮助开发者编写更简洁、更可读、更易于维护的代码。Kotlin 是一种基于 JVM 的语言,与 Java 兼容,并且可以与 Java 代码无缝集成。Kotlin 也可以编译为 JavaScript 或本地代码,因此可以用于多种应用程序开发,包括 Android 应用程序、Web 应用程序和桌面应用程序。

  • Gson 是 Google 提供的一个用于处理 JSON 数据的 Java 库。它可以将 Java 对象序列化为 JSON 字符串,也可以将 JSON 字符串反序列化为 Java 对象。Gson 支持复杂的对象图、泛型、自定义序列化和反序列化规则等高级特性,使开发人员可以轻松地将 JSON 数据转换为 Java 对象,或将 Java 对象转换为 JSON 数据。

  • Retrofit 是一个用于 Android 和 Java 应用程序的网络请求库。它基于 OkHttp 库构建,可以轻松地进行 HTTP 请求和响应处理。Retrofit 支持多种请求方式,包括 GET、POST、PUT、DELETE 等,还支持自定义请求头、请求参数和请求体。Retrofit 还支持异步请求和 RxJava 响应式编程,使开发人员可以更轻松地处理网络请求和响应。

  • Room 是 Android 中的一个持久性库,可以帮助开发人员轻松地访问 SQLite 数据库。它提供了一个类型安全的 API,可以将 SQLite 查询映射到 Java 对象,从而简化了数据库访问。Room 还提供了编译时检查和代码生成功能,可以帮助开发人员避免常见的 SQLite 错误和运行时异常。

  • Material 2 是 Google 提供的一组用于 Android 应用程序的 UI 组件和设计指南。它提供了一系列标准化的 UI 控件和布局,可以帮助开发人员创建具有一致性和美观性的 Android 应用程序。Material 2 还提供了许多设计指南和最佳实践,可以帮助开发人员创建符合用户体验标准的应用程序。

  • Spring Boot 是 Spring 框架的一个子项目,它提供了一种快速创建基于 Spring 的应用程序的方法。Spring Boot 提供了许多开箱即用的功能,包括自动配置、嵌入式 Web 服务器、安全性、监控和管理等。Spring Boot 还支持许多开发人员常用的技术栈,包括 Spring MVC、JPA、MyBatis、Thymeleaf 等。
  • MyBatis 是一个用于 Java 应用程序的持久性框架,它可以帮助开发人员轻松地访问数据库。MyBatis 提供了一个简单的 SQL 映射器,可以将 SQL 查询映射到 Java 对象,从而简化了数据库访问。MyBatis 还提供了许多高级特性,包括动态 SQL、批量操作、缓存等。

  • Spring Security 是 Spring 框架的一个子项目,它提供了一种安全性框架,可以帮助开发人员保护应用程序免受各种攻击。Spring Security 提供了许多安全性功能,包括身份验证、授权、加密、会话管理等。它还支持许多常见的身份验证和授权机制,包括基于表单、基于 HTTP 基本认证、OAuth 等。

  • MySQL 是一个流行的开源关系型数据库管理系统,它支持多种操作系统和编程语言。MySQL 提供了许多高级特性,包括事务处理、存储过程、触发器、视图等,使开发人员可以轻松地进行数据管理和查询。

  • Redis 是一个高性能的键值存储数据库,它可以将数据存储在内存中,以提高访问速度。Redis 支持多种数据结构,包括字符串、哈希表、列表、集合等,还提供了许多高级特性,包括事务处理、发布/订阅、Lua 脚本等。Redis 通常用于缓存、会话管理、消息队列等场景。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
├─app
│  │  build.gradle.kts
│  │  proguard-rules.pro
│  │
│  └─src
│      ├─androidTest
│      │  └─java
│      │      └─com
│      │          └─lmio
│      │              └─mlib
│      │                      ExampleInstrumentedTest.kt
│      ├─main
│      │  │  AndroidManifest.xml
│      │  ├─java
│      │  │  └─com
│      │  │      └─lmio
│      │  │          └─mlib
│      │  │              │  MainActivity.kt
│      │  │              ├─Dao
│      │  │              ├─entity
│      │  │              ├─services
│      │  │              ├─stores
│      │  │              ├─ui
│      │  │              │  ├─auth
│      │  │              │  ├─home
│      │  │              │  ├─profile
│      │  │              │  └─settings
│      │  │              │
│      │  │              └─utils
│      │  └─res
│      │      ├─drawable
│      │      ├─layout
│      │      ├─menu
│      │      ├─navigation
│      │      ├─raw
│      │      ├─values
│      │      └─xml
│      │              backup_rules.xml
│      │              data_extraction_rules.xml
│      │              root_preferences.xml
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
interface ApiService {
    @FormUrlEncoded
    @POST("/api/auth/login")
    fun login(
        @Field("username") username: String,
        @Field("password") password: String,
        @Field("remember") remember: Boolean
    ): Call<ApiResponse<Account>>

    @FormUrlEncoded
    @POST("/api/auth/valid-register-email")
    fun validateRegisterEmail(
        @Field("email") email: String
    ): Call<ApiResponse<String>>

    @FormUrlEncoded
    @POST("/api/auth/valid-reset-email")
    fun validateResetEmail(
        @Field("email") email: String
    ): Call<ApiResponse<String>>

    @FormUrlEncoded
    @POST("/api/auth/register")
    fun registerUser(
        @Field("username") username: String,
        @Field("password") password: String,
        @Field("email") email: String,
        @Field("code") code: String
    ): Call<ApiResponse<String>>

    @FormUrlEncoded
    @POST("/api/auth/start-reset")
    fun startReset(
        @Field("email") email: String,
        @Field("code") code: String
    ): Call<ApiResponse<String>>

    @FormUrlEncoded
    @POST("/api/auth/do-reset")
    fun resetPassword(
        @Field("password") password: String
    ): Call<ApiResponse<String>>

    @POST("/api/book/search")
    fun searchBooks(@Query("text") text: String): Call<ApiResponse<List<Book>>>
}

接口请求配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
object Requests {
    private const val BASE_URL = "http://10.0.2.2:8080/"
    private lateinit var request: ApiService

    fun getApiService(): ApiService {
        return request
    }

    fun Init() {
        val timeoutSeconds = 20L // 超时时间,以秒为单位

        val cookieManager = CookieManager()
        cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ALL)

        val cookieJar: CookieJar = JavaNetCookieJar(cookieManager)

        val okHttpClient = OkHttpClient.Builder()
            .connectTimeout(timeoutSeconds, TimeUnit.SECONDS)
            .readTimeout(timeoutSeconds, TimeUnit.SECONDS)
            .writeTimeout(timeoutSeconds, TimeUnit.SECONDS)
            .cookieJar(cookieJar)
            .build()

        val retrofit = Retrofit.Builder()
            .baseUrl(BASE_URL)
            .client(okHttpClient) // 设置自定义的 OkHttpClient
            .addConverterFactory(GsonConverterFactory.create())
            .build()

        request =  retrofit.create(ApiService::class.java)
    }

    fun <T> enqueue(call: Call<ApiResponse<T>>, view: View,
                    success: ((String, T?) -> Unit)? = null,
                    failure: ((String, T?) -> Unit)? = null,
                    error: (() -> Unit)? = null) {
        call.enqueue(object : Callback<ApiResponse<T>> {
            override fun onResponse(call: Call<ApiResponse<T>>, response: Response<ApiResponse<T>>) {
                val result: ApiResponse<T>? = response.body()
                result?.let {
                    val message = it.message
                    val data: T = it.data
                    if (it.success) {
                        success?.invoke(message, data) ?: SnackbarUtil.showSuccessMessage(view, message)
                    }else {
                        failure?.invoke(message, data) ?: SnackbarUtil.showWarningMessage(view, message)
                    }
                }
            }

            override fun onFailure(call: Call<ApiResponse<T>>, t: Throwable) {
                error?.invoke() ?: SnackbarUtil.showErrorMessage(view, "请求超时")
            }
        })
    }
}
  • 拉取源代码
1
2
git clone https://github.com/Clear-Love/Mlib-App.git # app
git clone https://github.com/Clear-Love/mlib.git # 后端
  • 初始化数据库

该项目采用了 Kotlin 语言和 MVVM 架构,同时还涉及到了后端技术领域,包括 Spring Boot、MyBatis、Spring Security、MySQL 和 Redis 等技术,并针对 Android 应用程序使用了 Room 数据库的方法。

在学习 Spring Boot 和 MyBatis 时,我深入了解了如何使用 Java 技术栈来构建高效的后端服务,快速创建基于 Spring 的应用程序,并使用 MyBatis 进行数据库访问。另外,我还掌握了如何使用 Spring Security 来保证应用程序的安全。

在学习 Redis 方面,我了解了如何使用 Redis 数据库来提高应用程序的性能和可扩展性。我深入学习了 Redis 的基本概念和数据结构,并了解了如何使用 Redis 来进行缓存、会话管理和消息队列等操作。

在 Android 应用程序方面,我掌握了使用 Room 数据库进行本地数据存储的技术。我深入了解了 Room 的基本概念和使用方法,并学习了如何使用它来进行 CRUD 操作和数据访问。

这些技术和工具的学习和理解,使我能够更好地开发和维护 Android 应用程序和后端服务。我相信,在未来的开发中,这些技术和工具将发挥重要作用,帮助我构建更高效、更可靠、更安全的应用程序。