Android使用OKhttp3實(shí)現(xiàn)登錄注冊功能+springboot搭建后端的詳細(xì)過程
新建一個(gè)login的項(xiàng)目,主要的幾個(gè)文件在這里
1、gradle引入OKhttp3依賴
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='用戶名'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='注冊'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ò)請求權(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í)體類
新建entity目錄創(chuàng)建User實(shí)體類。注意這里我是根據(jù)后端數(shù)據(jù)庫的字段創(chuàng)建的,在實(shí)現(xiàn)登錄注冊的時(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 { //同步請求,要放到子線程執(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ù)庫數(shù)據(jù)庫就是簡單的一個(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)目,添加依賴
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用來簡化實(shí)體類:需要安裝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ù)庫連接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ù)庫連接發(fā)現(xiàn)我是使用3310端口,因?yàn)槲业姆?wù)器是使用docker創(chuàng)建數(shù)據(jù)庫的。請自行查看我之前的文章。
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); //生成后是否打開資源管理器gc.setFileOverride(false); //重新生成時(shí)文件是否覆蓋gc.setServiceName('%sService');//去掉Service接口的首字母Igc.setIdType(IdType.ID_WORKER_STR); //主鍵策略gc.setDateType(DateType.ONLY_DATE);//定義生成的實(shí)體類中日期類型gc.setSwagger2(true);//開啟Swagger2模式mpg.setGlobalConfig(gc);// 3、數(shù)據(jù)源配置DataSourceConfig dsc = new DataSourceConfig();//這里的數(shù)據(jù)庫改為自己的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ù)庫的表strategy.setInclude('user');strategy.setNaming(NamingStrategy.underline_to_camel);//數(shù)據(jù)庫表映射到實(shí)體的命名策略strategy.setTablePrefix(pc.getModuleName() + '_'); //生成實(shí)體時(shí)去掉表前綴strategy.setColumnNaming(NamingStrategy.underline_to_camel);//數(shù)據(jù)庫表字段映射到實(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)生成文件
4、添加config目錄
這里的config目錄代碼生成器沒有幫我們生成,我們添加這個(gè)目錄主要是想使用swagger測試(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(); } /** * 分頁插件 */ @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//配置類@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', '[email protected]')).build(); }}
5、Controller層實(shí)現(xiàn) UserController.java
這里我實(shí)現(xiàn)了好多種方法,不僅是登錄注冊,但是Android前段我們只用到登錄注冊和獲取全部用戶
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 { //訪問地址:http://ip:8001/server/user/findAll 最終部署到服務(wù)器時(shí)使用這個(gè)來訪問 //訪問地址:http://localhost:8001/server/user/findAll 這是本地測試地址也是Swagger地址 @Autowired private UserService userService; /** * 查詢所有的用戶 * @return */ @GetMapping('getAllUsers') public List<User> findAllUser(){//調(diào)用方法查詢List<User> list = userService.list(null);return list; } /** * 添加用戶,注冊功能 * @param user * @return */ @PostMapping('addUser') public Boolean addUser(@RequestBody User user){boolean save = userService.save(user);return save; } /** * 獲取所有用戶名 */ @GetMapping('getAllUserName') public List<UserAll> getAllUserName(){List<UserAll> userNamelist = userService.getAllUserName();return userNamelist; } /** * 根據(jù)用戶ID查詢用戶的昵稱 * @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; } /** * 用戶的登錄功能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//生成無參構(gòu)造方法public class MyException extends RuntimeException{ private Integer code;//狀態(tài)碼 private String msg;//異常信息}
5、UserService接口
public interface UserService extends IService<User> { /** * 獲取所有用戶名 * @return */ List<UserAll> getAllUserName(); /** * 修改密碼 * @param userName * @return */ Boolean changePassword(String userName,String password); /** * 用戶的登錄功能 * @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; /** * 獲取所有用戶名 */ @Override public List<UserAll> getAllUserName() {//創(chuàng)建一個(gè)構(gòu)造器QueryWrapper<User> wrapper = new QueryWrapper<>();//查詢所有的userNamewrapper.eq('userName',0);//重新封裝一個(gè)UserAll的類,專門來查詢所有用戶名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; } /** * 用戶的登錄功能PostMapping * @param loginuser * @return */ @Override public String login(loginUser loginuser) {String userName = loginuser.getUserName();String userPassword = loginuser.getUserPassword();//用戶名和密碼非空判斷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ù)庫密碼肯定加密的//把輸入的密碼進(jìn)行加密,再和數(shù)據(jù)庫密碼進(jìn)行比較//加密方式 MD5if(!userPassword.equals(user.getUserPassword())) { return 'wrong Password';}else { return 'success login';} }}
注意:第一個(gè)獲取所有用戶名的方法會(huì)發(fā)現(xiàn)我自己生成一個(gè)實(shí)體類,原因是我的數(shù)據(jù)庫表里面有很多字段,但是我在前端展示的時(shí)候只能顯示幾個(gè)字段,就是起到保護(hù)隱私安全的作用。所以我新建了UserAll類。不影響閱讀這些邏輯。UserAll.java
@Datapublic class UserAll { private String userName;}
7、運(yùn)行springboot
這就是全部代碼,我們運(yùn)行之后啟動(dòng)成功。然后打開swagger測試
這里就可以進(jìn)行接口測試。這里就不進(jìn)行展示了。
四、部署至服務(wù)器我們使用maven打包。點(diǎn)擊package。就可以生成jar包了。
然后上傳至服務(wù)器。
這里我們就使用 java -jar server-0.0.1-SNAPSHOT.jar 命令運(yùn)行起來就可以了。
這樣就跑起來了。
注意:這里有一個(gè)坑,要看服務(wù)器8001的端口有沒有開放,否則是不能通過ip訪問到的。
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
然后打開一個(gè)接口
打開AS ,運(yùn)行APP,打印日志
簡單的登錄注冊基本功能邏輯就已經(jīng)實(shí)現(xiàn)了,大致流程可以走通。接下來就可以繼續(xù)開發(fā)其他了。注:這里只是最基本的登錄注冊,還不完善,比如這里密碼用戶名是明文傳送,很容易被抓包,所以這篇花了一點(diǎn)時(shí)間做的demo,并不完善,后面會(huì)補(bǔ)充完整。
到此這篇關(guān)于Android使用OKhttp3實(shí)現(xiàn)登錄注冊功能+springboot搭建后端的文章就介紹到這了,更多相關(guān)Android后端springboot內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!
相關(guān)文章:
1. python 如何在 Matplotlib 中繪制垂直線2. bootstrap select2 動(dòng)態(tài)從后臺(tái)Ajax動(dòng)態(tài)獲取數(shù)據(jù)的代碼3. ASP常用日期格式化函數(shù) FormatDate()4. python中@contextmanager實(shí)例用法5. html中的form不提交(排除)某些input 原創(chuàng)6. CSS3中Transition屬性詳解以及示例分享7. js select支持手動(dòng)輸入功能實(shí)現(xiàn)代碼8. 如何通過python實(shí)現(xiàn)IOU計(jì)算代碼實(shí)例9. 開發(fā)效率翻倍的Web API使用技巧10. vue使用moment如何將時(shí)間戳轉(zhuǎn)為標(biāo)準(zhǔn)日期時(shí)間格式
