# BookManageSys **Repository Path**: nakiha_cn/BookManageSys ## Basic Information - **Project Name**: BookManageSys - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-05-24 - **Last Updated**: 2021-06-04 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 关于本项目 BookManageSys 是使用Koltin开发, 使用 MVVM 模式设计的一款安卓APP. 用于进行书籍管理的app的功能验证. 用户的登录过程需要与后端进行数据交互. 能查询的图书数据来自本地的SQLite, SQLite中的数据由APP自行初始化, 图片数据来自豆瓣. ## 使用到的部分外部依赖 - **recyclerview:1.1.0** - **glide:4.5.0** & **glide:compiler:4.5.0** 用于`RecycleView`和`ImageView`的图片加载 - **lifecycle:lifecycle-extensions:2.2.0** & **lifecycle:lifecycle-livedata-ktx:2.2.0** JetPacket提供的MVVM与Kotlin扩展的支持库 - **retrofit2:retrofit:2.6.1** & **retrofit2:converter-gson:2.6.1** 用于与后端进行HTTP通信 - **material:material:1.1.0** ## 项目结构 ~~~shell \---bookmanagesys | ActivityBookDetail.kt | ActivityBookReview.kt | BookManaApplication.kt | +---logic | | LinuxTerminalUtil.kt | | Repository.kt | | | +---database | | DataInitTask.kt | | SysDatabaseHelper.kt | | | +---model | | Book.kt | | User.kt | | | \---network | AppNetwork.kt | LoginService.kt | NetProbeTask.kt | ServiceCreator.kt | \---ui +---book | BookAdapter.kt | BookFragment.kt | BookHolderViewModel.kt | BookViewModelFactory.kt | +---bookdetail | DetailFragment.kt | DetailPagerAdapter.kt | DetailViewModel.kt | DetailViewModelFactory.kt | PageCommentFragment.kt | PageDetailFragment.kt | PageEditFragment.kt | +---login | LoginFragment.kt | UserLoginViewModel.kt | \---user ~~~ ## App登录过程 打开app后,`NetProbTask`会被执行,用于进行局域网服务器探查。 默认向当前局域网广播地址上发送一条接收端口为8084的数据报,内容为`WhereAreYou?`。 该局域网内应有一个服务端使用UDP socket监听 8084 端口。得到内容后立刻回执任意信息。APP获得回执后即可得到服务端的局域网IP,至此IP探查完成。 用户完成用户名和密码输入后,用户端会向`http://${服务端地址}:8083/login/user_name=${用户名}&user_pwd=${密码}`的GET数据。如果正确,服务端应该回执GSON数据,数据应包含用户名和用户类型,例如`{"user_name": "7355608","user_type":0}`,其中用户类型在当前版本中并没有任何意义,保持返回0即可。 app收到gson数据后,进行一次检测,如果用户输入的用户名和服务器回执的用户名一致,登录成功。 下面是一个非常简易的Kotlin后端代码,默认返回用户名为 7355608 ~~~kotlin import java.io.IOException import java.net.DatagramPacket import java.net.DatagramSocket import java.net.ServerSocket import java.util.* import kotlin.concurrent.thread fun main():Unit{ thread { val udpSocket = DatagramSocket(8084) val recvBuf = ByteArray(128) val receivePacket = DatagramPacket(recvBuf, recvBuf.size) while (true){ udpSocket.receive(receivePacket) println(String(receivePacket.data)) val sendBuf = ByteArray(128) val sendPacket = DatagramPacket(sendBuf, sendBuf.size, receivePacket.address, receivePacket.port) sendPacket.data = "I'mHere".toByteArray() udpSocket.send(sendPacket) } } try { val serverSocket = ServerSocket(8083, 10) while (true){ val socket = serverSocket.accept() val inputStream = socket.getInputStream() val bytes = ByteArray(1024) inputStream.read(bytes) println("success: ${String(bytes)}") val outputStream = socket.getOutputStream() outputStream.run { write("HTTP/1.1 200 OK\r\n".toByteArray()) write("Content-Type:text/html;charset=utf-8\r\n".toByteArray()) write("Content-Length:38\r\n".toByteArray()) write("Server:gybs\r\n".toByteArray()) write(("Date:"+ Date() +"\r\n").toByteArray()) write("\r\n".toByteArray()) write("""{"user_name": "7355608","user_type":0}""".toByteArray()) } outputStream.close() } }catch (e:IOException){ e.printStackTrace() } } ~~~