uniapp-含有后端的登录注册页面编写

£神魔★判官ぃ 2024-03-22 15:36 192阅读 0赞

uniapp-含有后端的登录注册页面编写

创建数据库

数据库结构

表名:user































列名 数据类型 描述
id int 自增ID
username varchar 用户名
password varchar 密码
nickname varchar 昵称

这个方案只保留了id、username、password和nickname四个字段,以最简单的方式存储用户基本信息。需要注意的是,密码应该进行安全处理(如加密),避免泄露敏感信息。如果后续有新增信息需求,则可以随时更改表结构,添加相应的列即可。

数据库代码

  1. -- 创建 usertable 数据库
  2. CREATE DATABASE IF NOT EXISTS usertable;
  3. -- 切换至 usertable 数据库
  4. USE usertable;
  5. -- 创建 user
  6. CREATE TABLE IF NOT EXISTS user (
  7. id INT(11) NOT NULL AUTO_INCREMENT,
  8. username VARCHAR(100) NOT NULL UNIQUE,
  9. password VARCHAR(100) NOT NULL,
  10. nickname VARCHAR(100) NOT NULL,
  11. PRIMARY KEY (id)
  12. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
  13. -- 添加一些测试数据
  14. INSERT INTO user (username, password, nickname) VALUES ('user1', 'password1', '张三');
  15. INSERT INTO user (username, password, nickname) VALUES ('user2', 'password2', '李四');
  16. INSERT INTO user (username, password, nickname) VALUES ('user3', 'password3', '王五');

这段SQL代码用于创建一个名为user的表格,并且添加了一些简单的测试数据。其中,id列使用了自增主键约束,保证数据的唯一性。username列使用了unique约束,确保用户名的唯一性。请注意,utf8mb4是一种更高效和更通用的字符编码,支持更广泛的Unicode字符集,所以它比utf-8更推荐使用。

后端编写

创建项目(准备工作)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <parent>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-parent</artifactId>
  8. <version>2.7.11</version>
  9. <relativePath/> <!-- lookup parent from repository -->
  10. </parent>
  11. <groupId>com.example</groupId>
  12. <artifactId>userTable</artifactId>
  13. <version>0.0.1-SNAPSHOT</version>
  14. <name>userTable</name>
  15. <description>userTable</description>
  16. <properties>
  17. <java.version>1.8</java.version>
  18. </properties>
  19. <dependencies>
  20. <dependency>
  21. <groupId>org.springframework.boot</groupId>
  22. <artifactId>spring-boot-starter-web</artifactId>
  23. <version>2.7.6</version>
  24. </dependency>
  25. <dependency>
  26. <groupId>org.springframework.data</groupId>
  27. <artifactId>spring-data-jpa</artifactId>
  28. <version>2.5.6</version>
  29. </dependency>
  30. <dependency>
  31. <groupId>org.hibernate</groupId>
  32. <artifactId>hibernate-core</artifactId>
  33. <version>5.6.3.Final</version>
  34. </dependency>
  35. <dependency>
  36. <groupId>javax.persistence</groupId>
  37. <artifactId>javax.persistence-api</artifactId>
  38. <version>2.2</version>
  39. </dependency>
  40. <dependency>
  41. <groupId>org.mybatis.spring.boot</groupId>
  42. <artifactId>mybatis-spring-boot-starter</artifactId>
  43. <version>2.3.0</version>
  44. </dependency>
  45. <dependency>
  46. <groupId>org.mybatis.spring.boot</groupId>
  47. <artifactId>mybatis-spring-boot-starter</artifactId>
  48. <version>2.3.0</version>
  49. </dependency>
  50. <dependency>
  51. <groupId>com.mysql</groupId>
  52. <artifactId>mysql-connector-j</artifactId>
  53. <scope>runtime</scope>
  54. </dependency>
  55. <dependency>
  56. <groupId>org.projectlombok</groupId>
  57. <artifactId>lombok</artifactId>
  58. <optional>true</optional>
  59. </dependency>
  60. <dependency>
  61. <groupId>org.springframework.boot</groupId>
  62. <artifactId>spring-boot-starter-test</artifactId>
  63. <scope>test</scope>
  64. </dependency>
  65. <dependency>
  66. <groupId>com.baomidou</groupId>
  67. <artifactId>mybatis-plus-boot-starter</artifactId>
  68. <version>3.4.2</version>
  69. </dependency>
  70. <dependency>
  71. <groupId>org.apache.shiro</groupId>
  72. <artifactId>shiro-core</artifactId>
  73. <version>1.8.0</version>
  74. </dependency>
  75. <dependency>
  76. <groupId>io.jsonwebtoken</groupId>
  77. <artifactId>jjwt-api</artifactId>
  78. <version>0.11.2</version>
  79. </dependency>
  80. <!-- 如果要使用 jjwt 的实现,还需要添加以下依赖 -->
  81. <dependency>
  82. <groupId>io.jsonwebtoken</groupId>
  83. <artifactId>jjwt-impl</artifactId>
  84. <version>0.11.2</version>
  85. <scope>runtime</scope>
  86. </dependency>
  87. <dependency>
  88. <groupId>io.jsonwebtoken</groupId>
  89. <artifactId>jjwt-jackson</artifactId>
  90. <version>0.11.2</version>
  91. <scope>runtime</scope>
  92. </dependency>
  93. <!-- Hibernate Validator -->
  94. <dependency>
  95. <groupId>org.springframework.boot</groupId>
  96. <artifactId>spring-boot-starter-validation</artifactId>
  97. </dependency>
  98. <dependency>
  99. <groupId>org.apache.shiro</groupId>
  100. <artifactId>shiro-core</artifactId>
  101. <version>1.8.0</version>
  102. </dependency>
  103. </dependencies>
  104. <build>
  105. <plugins>
  106. <plugin>
  107. <groupId>org.springframework.boot</groupId>
  108. <artifactId>spring-boot-maven-plugin</artifactId>
  109. <configuration>
  110. <excludes>
  111. <exclude>
  112. <groupId>org.projectlombok</groupId>
  113. <artifactId>lombok</artifactId>
  114. </exclude>
  115. </excludes>
  116. </configuration>
  117. </plugin>
  118. </plugins>
  119. </build>
  120. </project>

application.properties

  1. # ?????
  2. spring.datasource.url=jdbc:mysql://localhost:3306/usertable?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
  3. spring.datasource.username=root
  4. spring.datasource.password=123456
  5. spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
  6. # ???????
  7. server.port=8081
  8. # MyBatis-Plus ??
  9. mybatis-plus.mapper-locations=classpath:/mapper/*.xml
  10. mybatis-plus.type-aliases-package=com.example.demo.entity
  11. mybatis-plus.global-config.db-config.id-type=auto
  12. mybatis-plus.configuration.map-underscore-to-camel-case=true
  13. mybatis-plus.configuration.use-generated-keys=true
  14. mybatis-plus.configuration.map-enum-as-ordinal=false
  15. mybatis-plus.configuration.enum-handler=com.baomidou.mybatisplus.extension.handlers.MybatisEnumTypeHandler

Bean

User
  1. import com.baomidou.mybatisplus.annotation.TableName;
  2. import lombok.AllArgsConstructor;
  3. import lombok.Data;
  4. import lombok.NoArgsConstructor;
  5. @Data
  6. @AllArgsConstructor
  7. @NoArgsConstructor
  8. @TableName("user") // 声明对应的数据库表名(user)
  9. public class User {
  10. private Long id;
  11. private String username;
  12. private String password;
  13. private String nickname;
  14. }
Result
  1. import lombok.AllArgsConstructor;
  2. import lombok.Builder;
  3. import lombok.Data;
  4. import lombok.NoArgsConstructor;
  5. @Data
  6. @Builder
  7. @AllArgsConstructor
  8. @NoArgsConstructor
  9. public class Result {
  10. private Integer code; // 状态码
  11. private String message; // 状态信息
  12. private Object data; // 数据
  13. }

config

CorsConfig
  1. import org.springframework.context.annotation.Bean;
  2. import org.springframework.context.annotation.Configuration;
  3. import org.springframework.web.servlet.config.annotation.CorsRegistry;
  4. import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
  5. import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
  6. @Configuration
  7. public class CorsConfig {
  8. @Bean
  9. public WebMvcConfigurer corsConfigurer() {
  10. return new WebMvcConfigurerAdapter() {
  11. @Override
  12. public void addCorsMappings(CorsRegistry registry) {
  13. // 允许来自本地的8080端口发起的跨域请求
  14. registry.addMapping("/api/**")
  15. .allowedOrigins("*")
  16. .allowedMethods("GET", "POST", "PUT", "DELETE")
  17. .allowCredentials(true).maxAge(3600);
  18. }
  19. };
  20. }
  21. }

Mapper

UserMapper
  1. import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  2. import com.example.usertable.Bean.User;
  3. import org.apache.ibatis.annotations.Mapper;
  4. @Mapper
  5. public interface UserMapper extends BaseMapper<User> {
  6. }

Service

UserService
  1. import com.baomidou.mybatisplus.core.metadata.IPage;
  2. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  3. import com.baomidou.mybatisplus.extension.service.IService;
  4. import com.example.usertable.Bean.User;
  5. public interface UserService extends IService<User> {
  6. /**
  7. * 分页查询用户列表
  8. */
  9. IPage<User> selectPage(Page<User> page);
  10. /**
  11. * 用户注册
  12. */
  13. boolean register(User user);
  14. /**
  15. * 用户登录
  16. */
  17. User login(String username, String password);
  18. }

ServiceImpl

UserServiceImpl
  1. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  2. import com.baomidou.mybatisplus.core.metadata.IPage;
  3. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  4. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  5. import com.example.usertable.Bean.User;
  6. import com.example.usertable.Mapper.UserMapper;
  7. import com.example.usertable.Service.UserService;
  8. import lombok.AllArgsConstructor;
  9. import org.springframework.stereotype.Service;
  10. import org.springframework.util.StringUtils;
  11. @Service
  12. @AllArgsConstructor
  13. public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
  14. @Override
  15. public IPage<User> selectPage(Page<User> page) {
  16. return baseMapper.selectPage(page, null);
  17. }
  18. /**
  19. * 注册新用户(需先检查用户名是否已被使用)
  20. */
  21. @Override
  22. public boolean register(User user) {
  23. String username = user.getUsername();
  24. // 根据用户名查询用户
  25. User u = this.getOne(new QueryWrapper<User>().eq("username", username));
  26. if (u != null) {
  27. // 用户名已存在
  28. return false;
  29. } else {
  30. // 将用户保存到数据库
  31. return this.save(user);
  32. }
  33. }
  34. /**
  35. * 用户登录(根据用户名和密码查询用户)
  36. */
  37. @Override
  38. public User login(String username, String password) {
  39. if (StringUtils.isEmpty(username) || StringUtils.isEmpty(password)) {
  40. // 用户名和密码不能为空
  41. return null;
  42. }
  43. return this.getOne(new QueryWrapper<User>()
  44. .eq("username", username)
  45. .eq("password", password));
  46. }
  47. }

Controller

UserController
  1. import com.baomidou.mybatisplus.core.metadata.IPage;
  2. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  3. import com.example.usertable.Bean.Result;
  4. import com.example.usertable.Bean.User;
  5. import com.example.usertable.Service.UserService;
  6. import lombok.AllArgsConstructor;
  7. import org.springframework.validation.annotation.Validated;
  8. import org.springframework.web.bind.annotation.*;
  9. @AllArgsConstructor
  10. @RestController
  11. @RequestMapping("/users")
  12. public class UserController {
  13. private final UserService userService;
  14. /**
  15. * 获取用户列表(分页)
  16. */
  17. @GetMapping("/")
  18. public Result list(@RequestParam(defaultValue = "1") Integer pageNum,
  19. @RequestParam(defaultValue = "10") Integer pageSize) {
  20. // 构建分页对象
  21. Page<User> page = new Page<>(pageNum, pageSize);
  22. // 分页查询用户数据
  23. IPage<User> userPage = userService.page(page, null);
  24. return Result.builder()
  25. .code(200)
  26. .message("获取成功")
  27. .data(userPage)
  28. .build();
  29. }
  30. /**
  31. * 根据 ID 获取用户信息
  32. */
  33. @GetMapping("/{id}")
  34. public Result detail(@PathVariable Long id) {
  35. // 查询用户信息
  36. User user = userService.getById(id);
  37. if (user != null) {
  38. return Result.builder()
  39. .code(200)
  40. .message("获取成功")
  41. .data(user)
  42. .build();
  43. } else {
  44. return Result.builder()
  45. .code(404)
  46. .message("用户不存在")
  47. .build();
  48. }
  49. }
  50. /**
  51. * 注册
  52. */
  53. @PostMapping("/register")
  54. public Result register(@RequestBody @Validated User user) {
  55. boolean success = userService.register(user);
  56. if (success) {
  57. return Result.builder()
  58. .code(200)
  59. .message("注册成功")
  60. .data(user)
  61. .build();
  62. } else {
  63. return Result.builder()
  64. .code(500)
  65. .message("用户名已存在")
  66. .build();
  67. }
  68. }
  69. /**
  70. * 登录
  71. */
  72. @PostMapping("/login")
  73. public Result login(@RequestBody User user) {
  74. String username = user.getUsername();
  75. String password = user.getPassword();
  76. // 查询用户
  77. User loginUser = userService.login(username, password);
  78. if (loginUser != null) {
  79. return Result.builder()
  80. .code(200)
  81. .message("登录成功")
  82. .data(loginUser)
  83. .build();
  84. } else {
  85. return Result.builder()
  86. .code(401)
  87. .message("用户名或密码错误")
  88. .build();
  89. }
  90. }
  91. /**
  92. * 新增用户
  93. */
  94. @PostMapping("/")
  95. public Result add(@RequestBody @Validated User user) {
  96. boolean success = userService.save(user);
  97. if (success) {
  98. return Result.builder()
  99. .code(200)
  100. .message("新增成功")
  101. .data(user)
  102. .build();
  103. } else {
  104. return Result.builder()
  105. .code(500)
  106. .message("新增失败")
  107. .data(user)
  108. .build();
  109. }
  110. }
  111. /**
  112. * 更新用户信息
  113. */
  114. @PutMapping("/{id}")
  115. public Result update(@PathVariable Long id, @RequestBody @Validated User user) {
  116. user.setId(id);
  117. boolean success = userService.updateById(user);
  118. if (success) {
  119. return Result.builder()
  120. .code(200)
  121. .message("更新成功")
  122. .data(user)
  123. .build();
  124. } else {
  125. return Result.builder()
  126. .code(500)
  127. .message("更新失败")
  128. .data(user)
  129. .build();
  130. }
  131. }
  132. /**
  133. * 删除用户
  134. */
  135. @DeleteMapping("/{id}")
  136. public Result delete(@PathVariable Long id) {
  137. boolean success = userService.removeById(id);
  138. if (success) {
  139. return Result.builder()
  140. .code(200)
  141. .message("删除成功")
  142. .build();
  143. } else {
  144. return Result.builder()
  145. .code(500)
  146. .message("删除失败")
  147. .build();
  148. }
  149. }
  150. }

Postman测试

测试所有的接口
以下是基于8081端口号的 Postman 测试:

1. 获取用户列表(分页)

请求地址:http://localhost:8081/users/

请求方法:GET

请求参数:



























参数名称 参数类型 是否必须 默认值 参数说明
pageNum Integer 1 当前页码
pageSize Integer 10 每页记录数

成功响应:

  1. {
  2. "code": 200,
  3. "message": "获取成功",
  4. "data": {
  5. "records": [
  6. {
  7. "id": 1,
  8. "username": "user1",
  9. "password": "password1",
  10. "nickname": "张三"
  11. },
  12. {
  13. "id": 2,
  14. "username": "user2",
  15. "password": "password2",
  16. "nickname": "李四"
  17. },
  18. {
  19. "id": 3,
  20. "username": "user3",
  21. "password": "password3",
  22. "nickname": "王五"
  23. }
  24. ],
  25. "total": 0,
  26. "size": 10,
  27. "current": 1,
  28. "orders": [],
  29. "optimizeCountSql": true,
  30. "hitCount": false,
  31. "countId": null,
  32. "maxLimit": null,
  33. "searchCount": true,
  34. "pages": 0
  35. }
  36. }

2. 根据 ID 获取用户信息

请求地址:http://localhost:8081/users/{id}

请求方法:GET

请求路径参数:




















参数名称 参数类型 是否必须 示例值 参数说明
id Long 1 用户 ID

成功响应:

  1. {
  2. "code": 200,
  3. "message": "获取成功",
  4. "data": {
  5. "id": 1,
  6. "username": "user1",
  7. "password": "password1",
  8. "nickname": "张三"
  9. }
  10. }

3. 注册

请求地址:http://localhost:8081/users/register

请求方法:POST

请求参数:


































参数名称 参数类型 是否必须 示例值 参数说明
username String user-11 用户名
password String pass-11 密码
nickname String lihua 昵名

请求示例:

  1. {
  2. "username": "user-11",
  3. "password": "pass-11",
  4. "nickname":"lihua"
  5. }

成功响应:

  1. {
  2. "code": 200,
  3. "message": "注册成功",
  4. "data": {
  5. "id": 4,
  6. "username": "user-11",
  7. "password": "pass-11",
  8. "nickname": "lihua"
  9. }
  10. }

失败响应:

  1. {
  2. "code": 500,
  3. "message": "用户名已存在"
  4. }

4. 登录

请求地址:http://localhost:8081/users/login

请求方法:POST

请求参数:



























参数名称 参数类型 是否必须 示例值 参数说明
username String user-1 用户名
password String pass-1 密码

请求示例:

  1. {
  2. "username": "user2",
  3. "password": "password2"
  4. }

成功响应:

  1. {
  2. "code": 200,
  3. "message": "登录成功",
  4. "data": {
  5. "password": "password2",
  6. "nickname": "李四",
  7. "id": 2,
  8. "username": "user2"
  9. }
  10. }

失败响应:

  1. {
  2. "code": 401,
  3. "message": "用户名或密码错误",
  4. "data": null
  5. }

5. 新增用户

请求地址:http://localhost:8081/users/

请求方法:POST

请求参数:


































参数名称 参数类型 是否必须 示例值 参数说明
username String user-12 用户名
password String pass-12 密码
nickname String 小李 昵名

请求示例:

  1. {
  2. "username": "user-12",
  3. "password": "pass-12",
  4. "nickname": "小李"
  5. }

成功响应:

  1. {
  2. "code": 200,
  3. "message": "新增成功",
  4. "data": {
  5. "id": 5,
  6. "username": "user-12",
  7. "password": "pass-12",
  8. "nickname": "小李"
  9. }
  10. }

失败响应:

  1. {
  2. "code": 500,
  3. "message": "新增失败"
  4. }

6. 更新用户信息

请求地址:http://localhost:8081/users/{id}

请求方法:PUT

请求路径参数:









































参数名称 参数类型 是否必须 示例值 参数说明
username String user-12-update 用户名
password String pass-12-update 密码
email String user-12-update@example.com 邮箱
phone String 12345678901 手机号

请求示例:

  1. {
  2. "username": "user-13",
  3. "password": "pass-13",
  4. "nickname": "小李"
  5. }

成功响应:

  1. {
  2. "code": 200,
  3. "message": "更新成功",
  4. "data": {
  5. "id": 1,
  6. "username": "user-13",
  7. "password": "pass-13",
  8. "nickname": "小李"
  9. }
  10. }

失败响应:

  1. {
  2. "code": 500,
  3. "message": "更新失败"
  4. }

7. 删除用户

请求地址:http://localhost:8081/users/{id}

请求方法:DELETE

请求路径参数:




















参数名称 参数类型 是否必须 示例值 参数说明
id Long 12 用户 ID

成功响应:

  1. {
  2. "code": 200,
  3. "message": "删除成功"
  4. }

失败响应:

  1. {
  2. "code": 500,
  3. "message": "删除失败"
  4. }

前端编写

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

页面编写

效果展示

在这里插入图片描述
在这里插入图片描述

文件目录

在这里插入图片描述

pages.json

在这里插入图片描述

manifest.json

  1. {
  2. "name": "LoginAndRegister",
  3. "appid" : "",
  4. "description" : "",
  5. "versionName" : "1.0.0",
  6. "versionCode" : "100",
  7. "transformPx" : false,
  8. /* 5+App特有相关 */
  9. "app-plus" : {
  10. "usingComponents" : true,
  11. "nvueStyleCompiler" : "uni-app",
  12. "compilerVersion" : 3,
  13. "splashscreen" : {
  14. "alwaysShowBeforeRender" : true,
  15. "waiting" : true,
  16. "autoclose" : true,
  17. "delay" : 0
  18. },
  19. /* 模块配置 */
  20. "modules" : {
  21. },
  22. /* 应用发布信息 */
  23. "distribute" : {
  24. /* android打包配置 */
  25. "android" : {
  26. "permissions" : [
  27. "<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
  28. "<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
  29. "<uses-permission android:name=\"android.permission.VIBRATE\"/>",
  30. "<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
  31. "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
  32. "<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
  33. "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
  34. "<uses-permission android:name=\"android.permission.CAMERA\"/>",
  35. "<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
  36. "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
  37. "<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
  38. "<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
  39. "<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
  40. "<uses-feature android:name=\"android.hardware.camera\"/>",
  41. "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
  42. ]
  43. },
  44. /* ios打包配置 */
  45. "ios" : {
  46. },
  47. /* SDK配置 */
  48. "sdkConfigs" : {
  49. }
  50. }
  51. },
  52. /* 快应用特有相关 */
  53. "quickapp" : {
  54. },
  55. /* 小程序特有相关 */
  56. "mp-weixin" : {
  57. "appid" : "",
  58. "setting" : {
  59. "urlCheck" : false
  60. },
  61. "usingComponents" : true
  62. },
  63. "mp-alipay" : {
  64. "usingComponents" : true
  65. },
  66. "mp-baidu" : {
  67. "usingComponents" : true
  68. },
  69. "mp-toutiao" : {
  70. "usingComponents" : true
  71. },
  72. "uniStatistics" : {
  73. "enable" : false
  74. },
  75. "vueVersion" : "2",
  76. "h5" : {
  77. "devServer" : {
  78. "port" : 8080, //浏览器运行端口
  79. "disableHostCheck" : true, //设置跳过host检查
  80. "proxy" : {
  81. "/api" : {
  82. "target" : "http://localhost:8081", //目标接口域名
  83. "changeOrigin" : true, //是否跨域
  84. "secure" : false, // 设置支持https协议的代理
  85. "pathRewrite":{
  86. "^/api":""}
  87. }
  88. }
  89. }
  90. }
  91. }

index.vue

  1. <template>
  2. <view class="content">
  3. <image class="logo" src="/static/logo.png"></image>
  4. <view class="text-area">
  5. <text class="title">{
  6. {title}}</text>
  7. <button @click="handleClick">点击我</button>
  8. </view>
  9. </view>
  10. </template>
  11. <script>
  12. export default {
  13. data() {
  14. return {
  15. title: 'Hello'
  16. }
  17. },
  18. onLoad() {
  19. },
  20. methods: {
  21. handleClick() {
  22. console.log('您点击了该按钮!')
  23. }
  24. }
  25. }
  26. </script>
  27. <style>
  28. .content {
  29. display: flex;
  30. flex-direction: column;
  31. align-items: center;
  32. justify-content: center;
  33. }
  34. .logo {
  35. height: 200rpx;
  36. width: 200rpx;
  37. margin-top: 200rpx;
  38. margin-left: auto;
  39. margin-right: auto;
  40. margin-bottom: 50rpx;
  41. }
  42. .text-area {
  43. display: flex;
  44. justify-content: center;
  45. }
  46. .title {
  47. font-size: 36rpx;
  48. color: #8f8f94;
  49. }
  50. </style>

login.vue

  1. <template>
  2. <view class="login">
  3. <image class="logo" src="/static/logo.png"></image>
  4. <view class="input-item">
  5. <input type="text" v-model="username" placeholder="请输入用户名">
  6. </view>
  7. <view class="input-item">
  8. <input type="password" v-model="password" placeholder="请输入密码">
  9. </view>
  10. <button @click="login" class="login-btn">登录</button>
  11. <button @click="goToRegister" class="register-btn">注册</button>
  12. </view>
  13. </template>
  14. <script>
  15. import axios from 'axios'
  16. export default {
  17. data() {
  18. return {
  19. username: '',
  20. password: ''
  21. }
  22. },
  23. methods: {
  24. login() {
  25. if (!this.username || !this.password) {
  26. uni.showToast({
  27. title: '请填写用户名和密码',
  28. icon: 'none'
  29. })
  30. return
  31. }
  32. // 发送请求验证用户
  33. axios.post('/api/users/login', {
  34. username: this.username,
  35. password: this.password
  36. }).then(res => {
  37. console.log(res.data.code)
  38. if (res.data.code === 200) {
  39. // 将用户信息保存到客户端本地缓存中
  40. uni.setStorageSync('userInfo', {
  41. id: res.data.data.id,
  42. username: res.data.data.username,
  43. password: res.data.data.password,
  44. nickname: res.data.data.nickname
  45. })
  46. // 跳转到首页
  47. uni.navigateTo({
  48. url: '/pages/index/index'
  49. })
  50. } else {
  51. uni.showToast({
  52. title: res.data.message,
  53. icon: 'none'
  54. })
  55. }
  56. }).catch(err => {
  57. uni.showToast({
  58. title: '网络请求失败,请重试',
  59. icon: 'none'
  60. })
  61. })
  62. },
  63. goToRegister() {
  64. uni.navigateTo({
  65. url: '/pages/register/register'
  66. })
  67. }
  68. }
  69. }
  70. </script>
  71. <style scoped>
  72. .login {
  73. display: flex;
  74. flex-direction: column;
  75. justify-content: center;
  76. align-items: center;
  77. margin-top: 100rpx;
  78. }
  79. .logo {
  80. width: 200rpx;
  81. height: 200rpx;
  82. margin-bottom: 20rpx;
  83. }
  84. .login-form {
  85. width: 90%;
  86. padding: 40rpx;
  87. background-color: #fff;
  88. border-radius: 5rpx;
  89. }
  90. .input-item {
  91. width: 80%;
  92. margin: 10rpx 0;
  93. border-bottom: 1rpx solid #ddd;
  94. }
  95. input {
  96. width: 100%;
  97. height: 50rpx;
  98. padding: 10rpx;
  99. font-size: 16rpx;
  100. outline: none;
  101. border: none;
  102. }
  103. .login-btn {
  104. display: block;
  105. margin: 30rpx auto 0;
  106. width: 80%;
  107. height: 80rpx;
  108. line-height: 80rpx;
  109. text-align: center;
  110. background-color: #007aff;
  111. color: #fff;
  112. border-radius: 5rpx;
  113. font-size: 20rpx;
  114. }
  115. .register-btn {
  116. margin-top: 20rpx;
  117. color: #007aff;
  118. width: 60%;
  119. height: 80rpx;
  120. }
  121. </style>

register.vue

  1. <template>
  2. <view class="register">
  3. <image class="logo" src="/static/logo.png"></image>
  4. <form class="register-form">
  5. <view class="input-item">
  6. <input type="text" v-model="nickname" placeholder="请输入昵称">
  7. </view>
  8. <view class="input-item">
  9. <input type="text" v-model="username" placeholder="请输入用户名">
  10. </view>
  11. <view class="input-item">
  12. <input type="password" v-model="password" placeholder="请输入密码">
  13. </view>
  14. <view class="input-item">
  15. <input type="password" v-model="confirmPassword" placeholder="请确认密码">
  16. </view>
  17. <button type="button" class="register-btn" @click="register">注册</button>
  18. </form>
  19. <button class="back-btn" @click="goBack">返回</button>
  20. </view>
  21. </template>
  22. <script>
  23. import axios from 'axios';
  24. export default {
  25. data() {
  26. return {
  27. username: '',
  28. password: '',
  29. confirmPassword: '',
  30. nickname: ''
  31. };
  32. },
  33. methods: {
  34. async register() {
  35. if(!this.username || !this.password || !this.nickname) {
  36. uni.showToast({
  37. title: '请填写完整信息',
  38. icon: 'none'
  39. });
  40. return;
  41. }
  42. if(this.password !== this.confirmPassword) {
  43. uni.showToast({
  44. title: '两次输入密码不一致',
  45. icon: 'none'
  46. });
  47. return;
  48. }
  49. try {
  50. const response = await axios.post('/api/users/register', {
  51. username: this.username,
  52. password: this.password,
  53. nickname: this.nickname
  54. });
  55. const responseData = response.data;
  56. if(responseData.code === 200) {
  57. uni.showToast({
  58. title: responseData.message,
  59. icon: 'success'
  60. });
  61. uni.navigateTo({
  62. url: '/pages/login/login'
  63. });
  64. } else {
  65. uni.showToast({
  66. title: responseData.message,
  67. icon: 'none'
  68. });
  69. }
  70. } catch (error) {
  71. let errorMessage = '注册失败,请稍后再试';
  72. if(error.response) {
  73. if(error.response.status === 500) {
  74. errorMessage = error.response.data.message;
  75. }
  76. }
  77. uni.showToast({
  78. title: errorMessage,
  79. icon: 'none'
  80. });
  81. }
  82. },
  83. goBack() {
  84. uni.navigateBack();
  85. }
  86. }
  87. };
  88. </script>
  89. <style scoped>
  90. .register {
  91. display: flex;
  92. flex-direction: column;
  93. justify-content: center;
  94. align-items: center;
  95. margin-top: 100rpx;
  96. }
  97. .logo {
  98. width: 200rpx;
  99. height: 200rpx;
  100. margin-bottom: 20rpx;
  101. }
  102. .register-form {
  103. width: 90%;
  104. padding: 40rpx;
  105. background-color: #fff;
  106. border-radius: 5rpx;
  107. }
  108. .input-item {
  109. margin: 10rpx 0;
  110. border-bottom: 1rpx solid #ddd;
  111. }
  112. input {
  113. width: 100%;
  114. height: 50rpx;
  115. padding: 10rpx;
  116. font-size: 16rpx;
  117. outline: none;
  118. border: none;
  119. }
  120. .register-btn {
  121. display: block;
  122. margin: 30rpx auto 0;
  123. width: 90%;
  124. height: 80rpx;
  125. line-height: 80rpx;
  126. text-align: center;
  127. background-color: #007aff;
  128. color: #fff;
  129. border-radius: 5rpx;
  130. font-size: 20rpx;
  131. }
  132. .back-btn {
  133. margin-top: 20rpx;
  134. color: #007aff;
  135. width: 60%;
  136. height: 80rpx;
  137. }
  138. </style>

发表评论

表情:
评论列表 (有 0 条评论,192人围观)

还没有评论,来说两句吧...

相关阅读