springboot+花生壳内网映射 实现自定义Android网络API

2023年 10月 15日 32.8k 0

前言

时间: 23/10/15

开发语言: Kotlin springboot 版本: 3.1.4 开发工具:IDEA 2023.2.1 (Ultimate Edition) jdk17

按照正常思路来讲,我们写springboot后端一般都是使用 maven + java 来完成的,但是由于最近一直在用Kotlin写 Android,所以我就尝试了一下使用 Gradle-kotlin + Kotlin 来完成这次的服务端代码编写。

写这篇文章的是为了解决前一篇 Android MVVM demo 的网络请求的链接问题

构建springboot项目

在 IDEA 中新建项目,选择 Spring Initalizr,Server URL:start.springboot.io

image-20231015044833660

项目名称和路径自定义,语言选择 Kotlin,Type选择 Gradle - Kotlin。点击Next,来到依赖添加页面。

本项目还是用到了 Mybatis-plus,所以需要勾选。还有一个就是 SQL 连接中的 MySQL Driver。

image-20231015050447413

点击 Create 就建立好了一个新的springboot项目。

结构说明

项目结构图

image-20231015051019890

  • build.gradle.kts

    同 Android 项目,这个是添加 springboot 依赖的文件,如果在创建项目时,少添加了依赖,可以在这个文件进行添加

  • application.properties

    同 maven-java 结构一样,这是配置 springboot 的文件,包括 服务端口、数据库连接、mybatis配置等。

  • mapper

    这是 mybatis 所需要的 Mapper.xml 存放的位置,文件相对路径在 application.properties 中定义。

创建 User 包以及相关内容

在 Application 类(即启动类)同级文件夹中创建一个包名为 user 的包。给它添加 controller、entity、mapper和service四个包。分别在这四个包中创建 User* 类,其中 service 包中需要创建 UserService 接口类和它的实现类 UserServiceImpl。

  • entity 类

    class User {
        var id = 0
        var username: String? = null
        var password: String? = null
        var userStatus = 0
    }
    
  • controller 类

    package com.may.library.user.controller
    
    import com.may.library.base.ApiResult
    import com.may.library.user.entity.User
    import com.may.library.user.service.UserService
    import jakarta.annotation.Resource
    import org.springframework.stereotype.Controller
    import org.springframework.web.bind.annotation.PostMapping
    import org.springframework.web.bind.annotation.RequestBody
    import org.springframework.web.bind.annotation.RequestMapping
    import org.springframework.web.bind.annotation.ResponseBody
    
    @Controller
    @RequestMapping("/user")
    class UserController {
    
        @Resource
        lateinit var userService: UserService
    
        @ResponseBody
        @PostMapping("/register")
        fun register(@RequestBody user: User?): ApiResult? {
            return userService.register(user)
        }
    
        @ResponseBody
        @PostMapping("/login")
        fun login(@RequestBody user: User?): ApiResult? {
            return userService.login(user)
        }
    
    }
    

    给这个类添加 @Controller 和 @RequestMapping("/user") 注解,@Controller 注解能让 springboot 识别到这是个 Controller 类,而 @RequestMapping 则是定义的一级 url,("/user") 表示一级 url 为 /user

    UserService 全局变量 添加了 @Resource 注解,这个注解就是依赖注入。

    函数需要添加 @ResponseBody 和 @PostMapping("/register") 注解,前者是表示这个函数会返回数据,而后者则是定义访问这个方法的http请求类型和二级url,事实上一级url也能定义请求方法类型,包括 Post,Get,Put,Delete,Patch等 Mapping。而这些请求类型区别请自行百度,其中 @RequestMapping 表示所有类型都能接受。

  • mapper

    interface UserMapper {
    
        fun register(user: User?): Int
    
        fun login(user: User?): User?
        
        fun findUserByUsername(username: String?): User?
    
        fun reduceUserStatus(id: Int, newStatus: Int): Int
    }
    

    同controller,Mapper类也需要添加注解来使 springboot 识别,可以像在 controller 类一样添加 @Mapper 注解在类中,也可以添加 mybatis 库中的 @MapperScan("com.may.library.*.mapper") 注解到 启动类 中。

    @SpringBootApplication
    @MapperScan("com.may.library.*.mapper")//对应包名,它会自动扫描所有同级包中的mapper包
    public class LibraryApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(LibraryApplication.class, args);
        }
    
    }
    
  • service

    //接口类
    @Service
    interface UserService {

    fun register(user: User?): ApiResult

    fun login(user: User?): ApiResult

    fun alterName(id: Int, newName: String?): ApiResult

    fun alterPassword(id: Int, newPass: String?): ApiResult

    fun delete(id: Int): ApiResult
    }
    //实现类
    @Service
    class UserServiceImpl : UserService {
    @Resource
    lateinit var userMapper: UserMapper

    override fun register(user: User?): ApiResult {
    if (user != null && !user.username.isNullOrEmpty() && !user.password.isNullOrEmpty()) {
    val exists: User? = findUserByUsername(user.username!!)
    if (exists != null) {
    return ApiHandler.fail(403, "该用户名已存在!")
    }
    user.userStatus = 5
    val uid: Int = userMapper.register(user)
    if (uid < 1) {
    println("user = [${user}]")
    return ApiHandler.failServerError()
    }
    return ApiHandler.success(user)
    }
    return ApiHandler.fail(403, "数据异常!")
    }

    override fun login(user: User?): ApiResult {
    if (user != null) {
    val tempUser = findUserByUsername(user.username!!)
    if (tempUser != null) {
    println(tempUser)
    if (tempUser.userStatus

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论