亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Android使用OKhttp3實(shí)現(xiàn)登錄注冊(cè)功能+springboot搭建后端的詳細(xì)過(guò)程

瀏覽:86日期:2023-02-09 10:35:50
目錄一、Android前端實(shí)現(xiàn)二、數(shù)據(jù)庫(kù)三、SpringBoot后端搭建四、部署至服務(wù)器五、運(yùn)行測(cè)試一、Android前端實(shí)現(xiàn)

新建一個(gè)login的項(xiàng)目,主要的幾個(gè)文件在這里

Android使用OKhttp3實(shí)現(xiàn)登錄注冊(cè)功能+springboot搭建后端的詳細(xì)過(guò)程

1、gradle引入OKhttp3依賴(lài)

implementation ’com.squareup.okhttp3:okhttp:3.14.7’ implementation ’com.squareup.okio:okio:1.17.5’

2、activity_main.xml布局文件

<?xml version='1.0' encoding='utf-8'?><androidx.constraintlayout.widget.ConstraintLayout 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' tools:context='.MainActivity'> <EditTextandroid: android:layout_width='wrap_content'android:layout_height='wrap_content'android:hint='用戶(hù)名'android:textSize='34sp'app:layout_constraintBottom_toBottomOf='parent'app:layout_constraintEnd_toEndOf='parent'app:layout_constraintStart_toStartOf='parent'app:layout_constraintTop_toTopOf='parent'app:layout_constraintVertical_bias='0.051' /> <EditTextandroid: android:layout_width='wrap_content'android:layout_height='wrap_content'android:hint='密碼'android:textSize='34sp'app:layout_constraintBottom_toBottomOf='parent'app:layout_constraintEnd_toEndOf='parent'app:layout_constraintStart_toStartOf='parent'app:layout_constraintTop_toBottomOf='@+id/username'app:layout_constraintVertical_bias='0.067' /> <Buttonandroid: android:layout_width='wrap_content'android:layout_height='wrap_content'android:onClick='register'android:text='注冊(cè)'android:textSize='24sp'app:backgroundTint='#E91E63'app:layout_constraintBottom_toBottomOf='parent'app:layout_constraintEnd_toEndOf='parent'app:layout_constraintHorizontal_bias='0.501'app:layout_constraintStart_toStartOf='parent'app:layout_constraintTop_toBottomOf='@+id/password'app:layout_constraintVertical_bias='0.058' /> <Buttonandroid: android:layout_width='wrap_content'android:layout_height='wrap_content'android:onClick='getUser'android:text='獲取'android:textSize='24sp'app:backgroundTint='#E91E63'app:layout_constraintBottom_toBottomOf='parent'app:layout_constraintEnd_toEndOf='parent'app:layout_constraintHorizontal_bias='0.501'app:layout_constraintStart_toStartOf='parent'app:layout_constraintTop_toBottomOf='@+id/button3'app:layout_constraintVertical_bias='0.174' /> <Buttonandroid: android:layout_width='wrap_content'android:layout_height='wrap_content'android:text='登錄'android:textSize='24sp'app:backgroundTint='#E91E63'android:onClick='login'app:layout_constraintBottom_toBottomOf='parent'app:layout_constraintEnd_toEndOf='parent'app:layout_constraintHorizontal_bias='0.501'app:layout_constraintStart_toStartOf='parent'app:layout_constraintTop_toBottomOf='@+id/button'app:layout_constraintVertical_bias='0.113' /></androidx.constraintlayout.widget.ConstraintLayout>

3、AndroidManifest.xml配置文件

這里需要加上網(wǎng)絡(luò)請(qǐng)求權(quán)限,添加網(wǎng)絡(luò)權(quán)限的時(shí)候注意:在res目錄下新建xml目錄,創(chuàng)建network_security_config.xml文件

<?xml version='1.0' encoding='utf-8'?><network-security-config> <base-config cleartextTrafficPermitted='true' /></network-security-config>

并在配置文件中加入這行代碼:

android:networkSecurityConfig='@xml/network_security_config'

完整的AndroidManifest.xml文件如下

<?xml version='1.0' encoding='utf-8'?><manifest xmlns:android='http://schemas.android.com/apk/res/android' package='com.example.login'> <uses-permission android:name='android.permission.INTERNET'/> <uses-permission android:name='android.permission.WRITE_EXTERNAL_STORAGE' /> <uses-permission android:name='android.permission.READ_EXTERNAL_STORAGE' /> <applicationandroid:allowBackup='true'android:icon='@mipmap/ic_launcher'android:label='@string/app_name'android:roundIcon='@mipmap/ic_launcher_round'android:networkSecurityConfig='@xml/network_security_config'android:supportsRtl='true'android:theme='@style/Theme.Login'><activity android:name='.MainActivity'> <intent-filter><action android:name='android.intent.action.MAIN' /><category android:name='android.intent.category.LAUNCHER' /> </intent-filter></activity> </application></manifest>

4、創(chuàng)建User實(shí)體類(lèi)

新建entity目錄創(chuàng)建User實(shí)體類(lèi)。注意這里我是根據(jù)后端數(shù)據(jù)庫(kù)的字段創(chuàng)建的,在實(shí)現(xiàn)登錄注冊(cè)的時(shí)候只需要id,username,password 幾個(gè)基礎(chǔ)的字段就行,這里我比較多,讀者可以自行忽略。User.java

package com.example.login.entity;public class User { private Integer userId; private String userName; private String userPassword; private String currentVersion; private String latestVersion; private String updateDescription; private String headPortrait; private String nickName; private String vipTime; private String userCategory; private String registerDate; public User(Integer userId, String userName, String userPassword, String currentVersion, String latestVersion, String updateDescription, String headPortrait, String nickName, String vipTime, String userCategory, String registerDate) {this.userId = userId;this.userName = userName;this.userPassword = userPassword;this.currentVersion = currentVersion;this.latestVersion = latestVersion;this.updateDescription = updateDescription;this.headPortrait = headPortrait;this.nickName = nickName;this.vipTime = vipTime;this.userCategory = userCategory;this.registerDate = registerDate; } public User() { } public Integer getUserId() {return userId; } public void setUserId(Integer userId) {this.userId = userId; } public String getUserName() {return userName; } public void setUserName(String userName) {this.userName = userName; } public String getUserPassword() {return userPassword; } public void setUserPassword(String userPassword) {this.userPassword = userPassword; } public String getCurrentVersion() {return currentVersion; } public void setCurrentVersion(String currentVersion) {this.currentVersion = currentVersion; } public String getLatestVersion() {return latestVersion; } public void setLatestVersion(String latestVersion) {this.latestVersion = latestVersion; } public String getUpdateDescription() {return updateDescription; } public void setUpdateDescription(String updateDescription) {this.updateDescription = updateDescription; } public String getHeadPortrait() {return headPortrait; } public void setHeadPortrait(String headPortrait) {this.headPortrait = headPortrait; } public String getNickName() {return nickName; } public void setNickName(String nickName) {this.nickName = nickName; } public String getVipTime() {return vipTime; } public void setVipTime(String vipTime) {this.vipTime = vipTime; } public String getUserCategory() {return userCategory; } public void setUserCategory(String userCategory) {this.userCategory = userCategory; } public String getRegisterDate() {return registerDate; } public void setRegisterDate(String registerDate) {this.registerDate = registerDate; }}

LoginUser.java

public class LoginUser { private String userName; private String userPassword; public LoginUser(String userName, String userPassword) {this.userName = userName;this.userPassword = userPassword; } public LoginUser() { } public String getUserName() {return userName; } public void setUserName(String userName) {this.userName = userName; } public String getUserPassword() {return userPassword; } public void setUserPassword(String userPassword) {this.userPassword = userPassword; }}

5、MainActivity.java

package com.example.login;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.EditText;import android.widget.TextView;import android.widget.Toast;import com.example.login.entity.User;import org.json.JSONException;import org.json.JSONObject;import java.io.IOException;import okhttp3.Call;import okhttp3.Callback;import okhttp3.MediaType;import okhttp3.OkHttpClient;import okhttp3.Request;import okhttp3.RequestBody;import okhttp3.Response;public class MainActivity extends AppCompatActivity { private EditText username; private EditText password; private User user; @Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);username = findViewById(R.id.username);password = findViewById(R.id.password); } public void register(View view) {user = new User();user.setUserName(username.getText().toString());user.setUserPassword(password.getText().toString());Log.d('whqusername',username.getText().toString());Log.d('whqpassword',password.getText().toString());new Thread(new Runnable() { @Override public void run() {MediaType JSON = MediaType.parse('application/json;charset=utf-8');JSONObject jsonObject = new JSONObject();OkHttpClient httpClient = new OkHttpClient();try { jsonObject.put('userId',10); jsonObject.put('userName',user.getUserName()); jsonObject.put('userPassword',user.getUserPassword()); jsonObject.put('currentVersion',null); jsonObject.put('latestVersion',null); jsonObject.put('updateDescription',null); jsonObject.put('headPortrait',null); jsonObject.put('nickName',user.getUserName()); jsonObject.put('vipTime',null); jsonObject.put('userCategory',null); jsonObject.put('registerDate',null);} catch (JSONException e) { e.printStackTrace();}RequestBody requestBody = RequestBody.create(JSON, String.valueOf(jsonObject));String url = 'http://ip:8001/server/user/addUser/';Request request = new Request.Builder().url(url).post(requestBody).build();Call call = httpClient.newCall(request);call.enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) {Log.d('whq','失敗了'); } @Override public void onResponse(Call call, Response response) throws IOException {Log.d('whq',response.toString()+'------------------');Log.d('whq',response.body().toString()+'------------------'); }}); }}).start(); } public void getUser(View view) {OkHttpClient httpClient = new OkHttpClient();String url = 'http://ip:8001/server/user/getAllUserName';Request getRequest = new Request.Builder().url(url).get().build();Call call = httpClient.newCall(getRequest);new Thread(new Runnable() { @Override public void run() {try { //同步請(qǐng)求,要放到子線程執(zhí)行 Response response = call.execute(); Log.i('whq+getAllUserName', 'okHttpGet run: response:'+ response.body().string());} catch (IOException e) { e.printStackTrace();} }}).start(); } public void login(View view) {loginUser = new LoginUser();loginUser.setUserName(username.getText().toString());loginUser.setUserPassword(password.getText().toString());new Thread(new Runnable() { @Override public void run() {MediaType JSON = MediaType.parse('application/json;charset=utf-8');JSONObject jsonObject = new JSONObject();OkHttpClient httpClient = new OkHttpClient();try { jsonObject.put('userName',loginUser.getUserName()); jsonObject.put('userPassword',MD5.encrypt(loginUser.getUserPassword()));} catch (JSONException e) { e.printStackTrace();}RequestBody requestBody = RequestBody.create(JSON, String.valueOf(jsonObject));String url = 'http://ip:8001/server/user/login';Request request = new Request.Builder().url(url).post(requestBody).build();Call call = httpClient.newCall(request);call.enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) {Log.d('whq登錄','失敗了'); } @Override public void onResponse(Call call, Response response) throws IOException {String MyResult = response.body().string();Log.d('whq登錄',response+'---------response---------');Log.d('whq登錄',response.message()+'---------message---------');Log.d('whq登錄',response.body().toString()+'------------------');Log.d('whq登錄',MyResult+'-----------MyResult-------'); }}); }}).start(); }}

到這里就實(shí)現(xiàn)了Android的前端實(shí)現(xiàn)。

二、數(shù)據(jù)庫(kù)

數(shù)據(jù)庫(kù)就是簡(jiǎn)單的一個(gè)user表

SET NAMES utf8mb4;SET FOREIGN_KEY_CHECKS = 0;-- ------------------------------ Table structure for user-- ----------------------------DROP TABLE IF EXISTS `user`;CREATE TABLE `user` ( `userId` int(11) NOT NULL AUTO_INCREMENT, `userName` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, `userPassword` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `currentVersion` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `latestVersion` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `updateDescription` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `headPortrait` mediumblob NULL, `nickName` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `vipTime` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `userCategory` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT ’normal’, `registerDate` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, PRIMARY KEY (`userId`, `userName`) USING BTREE) ENGINE = InnoDB AUTO_INCREMENT = 13 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;SET FOREIGN_KEY_CHECKS = 1;三、SpringBoot后端搭建

后端搭建用到的是SSM框架

1、新建一個(gè)springboot項(xiàng)目,添加依賴(lài)

pom.xml文件。這里有mybatis-plus+swagger+velocity,使用了代碼生成器

<properties><java.version>1.8</java.version><mybatis-plus.version>3.0.5</mybatis-plus.version><swagger.version>2.7.0</swagger.version><jodatime.version>2.10.1</jodatime.version><poi.version>3.17</poi.version><httpclient.version>4.5.1</httpclient.version><gson.version>2.8.2</gson.version><velocity.version>2.0</velocity.version> </properties><dependencies> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId> </dependency> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope> </dependency> <!--Spring Cloud--> <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Hoxton.RELEASE</version><type>pom</type><scope>import</scope> </dependency> <!--mybatis-plus 持久層--> <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>${mybatis-plus.version}</version> </dependency> <!-- velocity 模板引擎, Mybatis Plus 代碼生成器需要 --> <dependency><groupId>org.apache.velocity</groupId><artifactId>velocity-engine-core</artifactId><version>${velocity.version}</version> </dependency> <!--swagger--> <dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>${swagger.version}</version> </dependency> <!--swagger ui--> <dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId><version>${swagger.version}</version> </dependency> <!--日期時(shí)間工具--> <dependency><groupId>joda-time</groupId><artifactId>joda-time</artifactId><version>${jodatime.version}</version> </dependency> <!--mysql--> <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId> </dependency> <!--lombok用來(lái)簡(jiǎn)化實(shí)體類(lèi):需要安裝lombok插件--> <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId> </dependency> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId> </dependency></dependencies>

2、application.properties文件

# 服務(wù)端口server.port=8001# 服務(wù)名spring.application.name=heartrate# 環(huán)境設(shè)置:dev、test、prodspring.profiles.active=dev# mysql數(shù)據(jù)庫(kù)連接spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driverspring.datasource.url=jdbc:mysql://ip:3310/heartrate?serverTimezone=GMT%2B8&useSSL=falsespring.datasource.username=rootspring.datasource.password=123456#返回json的全局時(shí)間格式spring.jackson.date-format=yyyy-MM-dd HH:mm:ssspring.jackson.time-zone=GMT+8##mybatis日志//要使用logback日志,就需要注釋掉#mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl#配置mapper xml文件的路徑mybatis-plus.mapper-locations=classpath:com/atguigu/eduservice/mapper/xml/*.xml

這里的數(shù)據(jù)庫(kù)連接發(fā)現(xiàn)我是使用3310端口,因?yàn)槲业姆?wù)器是使用docker創(chuàng)建數(shù)據(jù)庫(kù)的。請(qǐng)自行查看我之前的文章。

3、CodeGenerator.java代碼生成器

import com.baomidou.mybatisplus.annotation.DbType;import com.baomidou.mybatisplus.annotation.IdType;import com.baomidou.mybatisplus.generator.AutoGenerator;import com.baomidou.mybatisplus.generator.config.DataSourceConfig;import com.baomidou.mybatisplus.generator.config.GlobalConfig;import com.baomidou.mybatisplus.generator.config.PackageConfig;import com.baomidou.mybatisplus.generator.config.StrategyConfig;import com.baomidou.mybatisplus.generator.config.rules.DateType;import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;import org.junit.Test;/** * @author ahuwhq * @since 2021/7/27 */public class CodeGenerator { @Test public void run() {// 1、創(chuàng)建代碼生成器AutoGenerator mpg = new AutoGenerator();// 2、全局配置GlobalConfig gc = new GlobalConfig();String projectPath = System.getProperty('user.dir');//這里改成自己的目錄gc.setOutputDir('E:LaboratoryCodeserviceserver' + '/src/main/java');gc.setAuthor('ahuwhq');gc.setOpen(false); //生成后是否打開(kāi)資源管理器gc.setFileOverride(false); //重新生成時(shí)文件是否覆蓋gc.setServiceName('%sService');//去掉Service接口的首字母Igc.setIdType(IdType.ID_WORKER_STR); //主鍵策略gc.setDateType(DateType.ONLY_DATE);//定義生成的實(shí)體類(lèi)中日期類(lèi)型gc.setSwagger2(true);//開(kāi)啟Swagger2模式mpg.setGlobalConfig(gc);// 3、數(shù)據(jù)源配置DataSourceConfig dsc = new DataSourceConfig();//這里的數(shù)據(jù)庫(kù)改為自己的dsc.setUrl('jdbc:mysql://ip:3310/heartrate?serverTimezone=GMT%2B8');dsc.setDriverName('com.mysql.cj.jdbc.Driver');dsc.setUsername('root');dsc.setPassword('123456');dsc.setDbType(DbType.MYSQL);mpg.setDataSource(dsc);// 4、包配置PackageConfig pc = new PackageConfig();pc.setParent('com.message');pc.setModuleName('server'); //模塊名pc.setController('controller');pc.setEntity('entity');pc.setService('service');pc.setMapper('mapper');mpg.setPackageInfo(pc);// 5、策略配置StrategyConfig strategy = new StrategyConfig();//這里是對(duì)應(yīng)的數(shù)據(jù)庫(kù)的表strategy.setInclude('user');strategy.setNaming(NamingStrategy.underline_to_camel);//數(shù)據(jù)庫(kù)表映射到實(shí)體的命名策略strategy.setTablePrefix(pc.getModuleName() + '_'); //生成實(shí)體時(shí)去掉表前綴strategy.setColumnNaming(NamingStrategy.underline_to_camel);//數(shù)據(jù)庫(kù)表字段映射到實(shí)體的命名策略strategy.setEntityLombokModel(true); // lombok 模型 @Accessors(chain = true) setter鏈?zhǔn)讲僮鱯trategy.setRestControllerStyle(true); //restful api風(fēng)格控制器strategy.setControllerMappingHyphenStyle(true); //url中駝峰轉(zhuǎn)連字符mpg.setStrategy(strategy);// 6、執(zhí)行mpg.execute(); }}

點(diǎn)擊運(yùn)行就會(huì)自動(dòng)生成文件

Android使用OKhttp3實(shí)現(xiàn)登錄注冊(cè)功能+springboot搭建后端的詳細(xì)過(guò)程

4、添加config目錄

這里的config目錄代碼生成器沒(méi)有幫我們生成,我們添加這個(gè)目錄主要是想使用swagger測(cè)試(SwaggerConfig),并且代碼生成器生成文件之后,我們需要配置一下能掃描到mapper文件(ServerConfig)

ServerConfig.java

package com.message.server.config;import com.baomidou.mybatisplus.core.injector.ISqlInjector;import com.baomidou.mybatisplus.extension.injector.LogicSqlInjector;import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;import org.mybatis.spring.annotation.MapperScan;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;@Configuration@MapperScan('com.message.server.mapper')public class ServerConfig { /** * 邏輯刪除插件 */ @Bean public ISqlInjector sqlInjector() {return new LogicSqlInjector(); } /** * 分頁(yè)插件 */ @Bean public PaginationInterceptor paginationInterceptor() {return new PaginationInterceptor(); }}

SwaggerConfig.java

import com.google.common.base.Predicates;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import springfox.documentation.builders.ApiInfoBuilder;import springfox.documentation.builders.PathSelectors;import springfox.documentation.service.ApiInfo;import springfox.documentation.service.Contact;import springfox.documentation.spi.DocumentationType;import springfox.documentation.spring.web.plugins.Docket;import springfox.documentation.swagger2.annotations.EnableSwagger2;@Configuration//配置類(lèi)@EnableSwagger2//swagger2注解public class SwaggerConfig { @Bean public Docket webApiConfig(){return new Docket(DocumentationType.SWAGGER_2).groupName('webApi').apiInfo(webApiInfo()).select()//.paths(Predicates.not(PathSelectors.regex('/admin/.*'))).paths(Predicates.not(PathSelectors.regex('/error.*'))).build(); } private ApiInfo webApiInfo(){return new ApiInfoBuilder().title('網(wǎng)站-課程中心API文檔').description('本文檔描述了課程中心微服務(wù)接口定義').version('1.0').contact(new Contact('java', 'http://ahuwhq.com', 'ahuwhq@163.com')).build(); }}

5、Controller層實(shí)現(xiàn) UserController.java

這里我實(shí)現(xiàn)了好多種方法,不僅是登錄注冊(cè),但是Android前段我們只用到登錄注冊(cè)和獲取全部用戶(hù)

import com.message.server.entity.User;import com.message.server.entity.vo.UserAll;import com.message.server.service.UserService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.*;import java.util.List;/** * <p> * 前端控制器 * </p> * * @author ahuwhq * @since 2021-07-27 */@RestController@RequestMapping('/server/user')public class UserController { //訪問(wèn)地址:http://ip:8001/server/user/findAll 最終部署到服務(wù)器時(shí)使用這個(gè)來(lái)訪問(wèn) //訪問(wèn)地址:http://localhost:8001/server/user/findAll 這是本地測(cè)試地址也是Swagger地址 @Autowired private UserService userService; /** * 查詢(xún)所有的用戶(hù) * @return */ @GetMapping('getAllUsers') public List<User> findAllUser(){//調(diào)用方法查詢(xún)List<User> list = userService.list(null);return list; } /** * 添加用戶(hù),注冊(cè)功能 * @param user * @return */ @PostMapping('addUser') public Boolean addUser(@RequestBody User user){boolean save = userService.save(user);return save; } /** * 獲取所有用戶(hù)名 */ @GetMapping('getAllUserName') public List<UserAll> getAllUserName(){List<UserAll> userNamelist = userService.getAllUserName();return userNamelist; } /** * 根據(jù)用戶(hù)ID查詢(xún)用戶(hù)的昵稱(chēng) * @param id * @return */ @GetMapping('getUserNickname/{id}') public String getUserNickname(@PathVariable Integer id){User user = userService.getById(id);String nickName = user.getNickName();return nickName; } /** *修改密碼 * @param userName * @return */ @PostMapping('changePassword/{userName}/{password}') public Boolean changePassword(@PathVariable String userName, @PathVariable String password){Boolean result = userService.changePassword(userName,password);return result; } /** * 用戶(hù)的登錄功能PostMapping * @param loginuser * @return */ @PostMapping('login') public R login(@RequestBody loginUser loginuser){String token = userService.login(loginuser);if (token == 'wrong Password'){ return R.error().data('result',token);}else{ return R.ok().data('result',token);} }}

這里用到了幾個(gè)文件R.java,ResultCode.java,MyException.javaR.java

//統(tǒng)一返回結(jié)果import io.swagger.annotations.ApiModelProperty;import lombok.Data;import java.util.HashMap;import java.util.Map;@Datapublic class R { @ApiModelProperty(value = '是否成功') private Boolean success; @ApiModelProperty(value = '返回碼') private Integer code; @ApiModelProperty(value = '返回消息') private String message; @ApiModelProperty(value = '返回?cái)?shù)據(jù)') private Map<String, Object> data = new HashMap<String, Object>(); //構(gòu)造方法私有化 private R(){} //鏈?zhǔn)骄幊? //成功靜態(tài)方法 public static R ok(){R r = new R();r.setSuccess(true);r.setCode(ResultCode.SUCCESS);r.setMessage('成功');return r; } //失敗靜態(tài)方法 public static R error(){R r = new R();r.setSuccess(false);r.setCode(ResultCode.ERROR);r.setMessage('失敗');return r; } public R success(Boolean success){this.setSuccess(success);return this; } public R message(String message){this.setMessage(message);return this; } public R code(Integer code){this.setCode(code);return this; } public R data(String key, Object value){this.data.put(key, value);return this; } public R data(Map<String, Object> map){this.setData(map);return this; }}

ResultCode.java

public interface ResultCode { public static Integer SUCCESS = 20000;//成功 public static Integer ERROR = 20001;//失敗}

MyException.java

import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;@Data@AllArgsConstructor//生成有參構(gòu)造方法@NoArgsConstructor//生成無(wú)參構(gòu)造方法public class MyException extends RuntimeException{ private Integer code;//狀態(tài)碼 private String msg;//異常信息}

5、UserService接口

public interface UserService extends IService<User> { /** * 獲取所有用戶(hù)名 * @return */ List<UserAll> getAllUserName(); /** * 修改密碼 * @param userName * @return */ Boolean changePassword(String userName,String password); /** * 用戶(hù)的登錄功能 * @param userName * @param password * @return */ Boolean login(String userName, String password);}

6、UserServiceImpl.java

public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService { @Autowired private UserService userService; /** * 獲取所有用戶(hù)名 */ @Override public List<UserAll> getAllUserName() {//創(chuàng)建一個(gè)構(gòu)造器QueryWrapper<User> wrapper = new QueryWrapper<>();//查詢(xún)所有的userNamewrapper.eq('userName',0);//重新封裝一個(gè)UserAll的類(lèi),專(zhuān)門(mén)來(lái)查詢(xún)所有用戶(hù)名List<User> users = baseMapper.selectList(wrapper);List<UserAll> userAlls = new ArrayList<>();for (int i = 0; i < users.size(); i++) { User user = users.get(i); String userName = user.getUserName(); UserAll userAll = new UserAll(); userAll.setUserName(userName); userAlls.add(userAll);}return userAlls ; } /** * 修改密碼 * @param userName * @param password * @return */ @Override public Boolean changePassword(String userName,String password) {QueryWrapper<User> wrapper = new QueryWrapper<>();wrapper.eq('userName',userName);User user = baseMapper.selectOne(wrapper);if (user == null){ return false;}user.setUserPassword(password);boolean save = userService.update(user,null);return save; } /** * 用戶(hù)的登錄功能PostMapping * @param loginuser * @return */ @Override public String login(loginUser loginuser) {String userName = loginuser.getUserName();String userPassword = loginuser.getUserPassword();//用戶(hù)名和密碼非空判斷if(org.springframework.util.StringUtils.isEmpty(userName) || org.springframework.util.StringUtils.isEmpty(userPassword)) { return 'wrong Password';}//判斷手機(jī)號(hào)是否正確QueryWrapper<User> wrapper = new QueryWrapper<>();wrapper.eq('userName',userName);User user = baseMapper.selectOne(wrapper);//判斷密碼//因?yàn)榇鎯?chǔ)到數(shù)據(jù)庫(kù)密碼肯定加密的//把輸入的密碼進(jìn)行加密,再和數(shù)據(jù)庫(kù)密碼進(jìn)行比較//加密方式 MD5if(!userPassword.equals(user.getUserPassword())) { return 'wrong Password';}else { return 'success login';} }}

注意:第一個(gè)獲取所有用戶(hù)名的方法會(huì)發(fā)現(xiàn)我自己生成一個(gè)實(shí)體類(lèi),原因是我的數(shù)據(jù)庫(kù)表里面有很多字段,但是我在前端展示的時(shí)候只能顯示幾個(gè)字段,就是起到保護(hù)隱私安全的作用。所以我新建了UserAll類(lèi)。不影響閱讀這些邏輯。Android使用OKhttp3實(shí)現(xiàn)登錄注冊(cè)功能+springboot搭建后端的詳細(xì)過(guò)程UserAll.java

@Datapublic class UserAll { private String userName;}

7、運(yùn)行springboot

這就是全部代碼,我們運(yùn)行之后啟動(dòng)成功。然后打開(kāi)swagger測(cè)試

Android使用OKhttp3實(shí)現(xiàn)登錄注冊(cè)功能+springboot搭建后端的詳細(xì)過(guò)程

這里就可以進(jìn)行接口測(cè)試。這里就不進(jìn)行展示了。

四、部署至服務(wù)器

我們使用maven打包。點(diǎn)擊package。就可以生成jar包了。

Android使用OKhttp3實(shí)現(xiàn)登錄注冊(cè)功能+springboot搭建后端的詳細(xì)過(guò)程

然后上傳至服務(wù)器。

Android使用OKhttp3實(shí)現(xiàn)登錄注冊(cè)功能+springboot搭建后端的詳細(xì)過(guò)程

這里我們就使用 java -jar server-0.0.1-SNAPSHOT.jar 命令運(yùn)行起來(lái)就可以了。

Android使用OKhttp3實(shí)現(xiàn)登錄注冊(cè)功能+springboot搭建后端的詳細(xì)過(guò)程

這樣就跑起來(lái)了。

注意:這里有一個(gè)坑,要看服務(wù)器8001的端口有沒(méi)有開(kāi)放,否則是不能通過(guò)ip訪問(wèn)到的。

firewall-cmd --list-portfirewall-cmd --zone=public --add-port=8001/tcp --permanentfirewall-cmd --reloadfirewall-cmd --query-port=8001/tcp

firewall-cmd --zone=public --remove-port=8001/tcp --permanent # 刪除netstat -anp|grep 8001

Android使用OKhttp3實(shí)現(xiàn)登錄注冊(cè)功能+springboot搭建后端的詳細(xì)過(guò)程

然后打開(kāi)一個(gè)接口

Android使用OKhttp3實(shí)現(xiàn)登錄注冊(cè)功能+springboot搭建后端的詳細(xì)過(guò)程

五、運(yùn)行測(cè)試

打開(kāi)AS ,運(yùn)行APP,打印日志

Android使用OKhttp3實(shí)現(xiàn)登錄注冊(cè)功能+springboot搭建后端的詳細(xì)過(guò)程

簡(jiǎn)單的登錄注冊(cè)基本功能邏輯就已經(jīng)實(shí)現(xiàn)了,大致流程可以走通。接下來(lái)就可以繼續(xù)開(kāi)發(fā)其他了。注:這里只是最基本的登錄注冊(cè),還不完善,比如這里密碼用戶(hù)名是明文傳送,很容易被抓包,所以這篇花了一點(diǎn)時(shí)間做的demo,并不完善,后面會(huì)補(bǔ)充完整。

到此這篇關(guān)于Android使用OKhttp3實(shí)現(xiàn)登錄注冊(cè)功能+springboot搭建后端的文章就介紹到這了,更多相關(guān)Android后端springboot內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 日韩在线视频网 | 8x永久免费观看成人影院 | 国产又色又粗又黄又爽免费 | 欧美精品一区二区三区四区 | 在线观看视频一区二区三区 | 49pao强力免费打造在线高清 | 国产婷婷一区二区在线观看 | 亚洲国产精品综合久久一线 | 中文一区| 黄色片视频在线播放 | 国产羞羞视频在线观看 | 黄色成人在线播放 | 国产日本久久久久久久久婷婷 | 最近在线更新中文字幕3 | 国产码一区二区三区 | 风间由美中文字幕亚洲一区 | 欧美日韩在线观看一区二区 | 尤物视频网站在线观看 | 无需付费大片免费在线观看 | 亚洲综合精品一二三区在线 | 巨臀中文字幕一区二区视频 | 亚洲免费网站 | 毛片网在线 | 在线看片欧美 | 特级全黄一级毛片视频 | 欧美一级毛片久久精品 | 国产一区二区精品久久91 | 国产亚洲精品va在线 | 91在线在线啪永久地址 | 成人在线免费视频 | 97青青青国产在线播放 | 91精品国产免费久久久久久 | 视频一区二区在线播放 | 国产精品久久久久三级 | 婷婷丁香在线观看 | 91青青视频| 国产破处在线 | 中文一级国产特级毛片视频 | 在线观看网址入口2020国产 | 爱爱激情视频 | 欧美日韩在线精品一区二区三区 |