首页 > 编程语言 >Java网络商城项目 SpringBoot+SpringCloud+Vue 网络商城(SSM前后端分离项目)十九(用户中心)

Java网络商城项目 SpringBoot+SpringCloud+Vue 网络商城(SSM前后端分离项目)十九(用户中心)

时间:2024-09-22 09:23:03浏览次数:10  
标签:Vue Java String 网络商城 leyou user org import data

(4)创建mapper路径

在这里插入图片描述

(5)编写配置文件

在这里插入图片描述

在这里插入图片描述

server:

port: 8088

spring:

application:

name: user-service

datasource:

url: jdbc:mysql://127.0.0.1:3306/yun6

username: root

password: root

driver-class-name: com.mysql.jdbc.Driver

eureka:

client:

service-url:

defaultZone: http://127.0.0.1:10086/eureka

instance:

prefer-ip-address: true

ip-address: 127.0.0.1

instance-id: e u r e k a . i n s t a n c e . i p − a d d r e s s . {eureka.instance.ip-address}. eureka.instance.ip−address.{server.port}

lease-renewal-interval-in-seconds: 3

lease-expiration-duration-in-seconds: 10

mybatis:

type-aliases-package: com.leyou.item.pojo

(6)创建pojo

在这里插入图片描述

(7)添加网关路由

我们修改ly-gateway,添加路由规则,对ly-user-service进行路由:

在这里插入图片描述

user-service: /user/**

二、后台功能准备


1、数据结构

CREATE TABLE tb_user (

id bigint(20) NOT NULL AUTO_INCREMENT,

username varchar(50) NOT NULL COMMENT ‘用户名’,

password varchar(32) NOT NULL COMMENT ‘密码,加密存储’,

phone varchar(20) DEFAULT NULL COMMENT ‘注册手机号’,

created datetime NOT NULL COMMENT ‘创建时间’,

salt varchar(32) NOT NULL COMMENT ‘密码加密的salt值’,

PRIMARY KEY (id),

UNIQUE KEY username (username) USING BTREE

) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8 COMMENT=‘用户表’;

数据结构比较简单,因为根据用户名查询的频率较高,所以我们给用户名创建了索引

2、基本代码

实体类

注意:为了安全考虑。这里对password和salt添加了注解@JsonIgnore,这样在json序列化时,就不会把password和salt返回。

ly-user-interface添加依赖

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns=“http://maven.apache.org/POM/4.0.0”

xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”

xsi:schemaLocation=“http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd”>

ly-user

com.leyou.service

1.0.0-SNAPSHOT

4.0.0

ly-user-interface

javax.persistence

persistence-api

1.0

com.fasterxml.jackson.core

jackson-databind

tk.mybatis

mapper-core

1.0.4

在这里插入图片描述

在这里插入图片描述

package com.leyou.item.pojo;

import com.fasterxml.jackson.annotation.JsonIgnore;

import lombok.Data;

import javax.persistence.GeneratedValue;

import javax.persistence.GenerationType;

import javax.persistence.Id;

import javax.persistence.Table;

import java.util.Date;

@Data

@Table(name = “tb_user”)

public class User {

@Id

@GeneratedValue(strategy = GenerationType.IDENTITY)

private Long id;

private String username;// 用户名

@JsonIgnore

private String password;// 密码

private String phone;// 电话

private Date created;// 创建时间

@JsonIgnore

private String salt;// 密码的盐值

}

mapper

在这里插入图片描述

在这里插入图片描述

public interface UserMapper extends Mapper {

}

Service

在这里插入图片描述

在这里插入图片描述

@Service

public class UserService {

@Autowired

private UserMapper userMapper;

}

3.数据验证功能

(1)接口说明:

实现用户数据的校验,主要包括对:手机号、用户名的唯一性校验。

接口路径

GET /check/{data}/{type}

参数说明:

| 参数 | 说明 | 是否必须 | 数据类型 | 默认值 |

| — | — | — | — | — |

| data | 要校验的数据 | 是 | String | 无 |

| type | 要校验的数据类型:1,用户名;2,手机; | 否 | Integer | 1 |

返回结果:

返回布尔类型结果:

  • true:可用

  • false:不可用

状态码:

  • 200:校验成功

  • 400:参数有误

  • 500:服务器内部异常

(2)controller

在这里插入图片描述

在这里插入图片描述

package com.leyou.user.web;

import com.leyou.user.service.UserService;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.web.bind.annotation.RestController;

@RestController

public class UserController {

@Autowired

private UserService userService;

}

因为有了接口,我们可以不关心页面,所有需要的东西都一清二楚:

  • 请求方式:GET

  • 请求路径:/check/{param}/{type}

  • 请求参数:param,type

  • 返回结果:true或false

在这里插入图片描述

package com.leyou.user.web;

import com.leyou.user.service.UserService;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.http.ResponseEntity;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.PathVariable;

import org.springframework.web.bind.annotation.RestController;

@RestController

public class UserController {

@Autowired

private UserService userService;

/**

  • 校验数据是否可用

  • @param data

  • @param type

  • @return

*/

@GetMapping(“/check/{data}/{type}”)

public ResponseEntity checkData(@PathVariable(“data”) String data,

@PathVariable(“type”) Integer type) {

return ResponseEntity.ok(userService.checkData(data,type));

}

}

(3)Service

在这里插入图片描述

在这里插入图片描述

package com.leyou.user.service;

import com.leyou.item.pojo.User;

import com.leyou.user.mapper.UserMapper;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Service;

import org.springframework.util.CollectionUtils;

@Service

public class UserService {

@Autowired

private UserMapper userMapper;

public Boolean checkData(String data, Integer type) {

User user = new User();

//判断数据类型

switch (type){

case 1:

user.setUsername(data);

break;

case 2:

user.setPhone(data);

break;

default:

return null;

}

return userMapper.selectCount(user) == 0;

}

}

(4)测试

在这里插入图片描述

我们在数据库插入一条假数据:

在这里插入图片描述

然后在浏览器调用接口,测试:

http://localhost:8088/check/admin/1

在这里插入图片描述

4.发送短信功能

短信微服务已经准备好,我们就可以继续编写用户中心接口了。

(1)接口说明

在这里插入图片描述

这里的业务逻辑是这样的:

  • 1)我们接收页面发送来的手机号码

  • 2)生成一个随机验证码

  • 3)将验证码保存在服务端(redis)

  • 4)发送短信,将验证码发送到用户手机

(2)controller

在这里插入图片描述

/*

发送短信

*/

@PostMapping(“code”)

public ResponseEntity sendCode(@RequestParam(“phone”) String phone){

userService.sendCode(phone);

return ResponseEntity.status(HttpStatus.NO_CONTENT).build();

}

(3)service

这里的逻辑会稍微复杂:

  • 生成随机验证码

  • 将验证码保存到Redis中,用来在注册的时候验证

  • 发送验证码到ly-sms-service服务,发送短信

在这里插入图片描述

因此,我们需要引入AMQP:

在这里插入图片描述

因此,我们需要引入AMQP:

org.springframework.boot

spring-boot-starter-amqp

添加RabbitMQ和Redis配置:

在这里插入图片描述

spring:

redis:

host: 192.168.206.66

rabbitmq:

host: 192.168.206.66

username: leyou

password: leyou

virtual-host: /leyou

template:

retry:

enabled: true

initial-interval: 10000ms

max-interval: 210000ms

multiplier: 2

publisher-confirms: true

另外还要用到工具类,生成6位随机码,这个我们封装到了ly-common中,因此需要引入依赖:

在这里插入图片描述

引入common

com.leyou.common

ly-common

${leyou.latest.version}

引入Redis

在这里插入图片描述

org.springframework.boot

spring-boot-starter-data-redis

Service代码:

在这里插入图片描述

在这里插入图片描述

package com.leyou.user.service;

import com.leyou.common.utils.NumberUtils;

import com.leyou.item.pojo.User;

import com.leyou.user.mapper.UserMapper;

import org.springframework.amqp.core.AmqpTemplate;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.data.redis.core.StringRedisTemplate;

import org.springframework.stereotype.Service;

import org.springframework.util.CollectionUtils;

import tk.mybatis.mapper.annotation.KeySql;

import java.util.HashMap;

import java.util.Map;

import java.util.concurrent.TimeUnit;

@Service

public class UserService {

@Autowired

private UserMapper userMapper;

@Autowired

private AmqpTemplate amqpTemplate;

@Autowired

private StringRedisTemplate redisTemplate;

private static final String KEY_PREFIX = “user:verify☎️”;

public Boolean checkData(String data, Integer type) {

User user = new User();

//判断数据类型

switch (type){

case 1:

user.setUsername(data);

break;

case 2:

user.setPhone(data);

break;

default:

return null;

}

return userMapper.selectCount(user) == 0;

}

public void sendCode(String phone) {

//生成key

String key = KEY_PREFIX +phone;

//生成验证码

String code = NumberUtils.generateCode(6);

Map<String ,String> msg = new HashMap<>();

msg.put(“phone”,phone);

msg.put(“code”,code);

//发送验证码

amqpTemplate.convertAndSend(“ly.sms.exchange”,“sms.verify.code”,msg);

//保存验证码

redisTemplate.opsForValue().set(key,code,5, TimeUnit.MINUTES);

}

}

(4)测试

在这里插入图片描述

在这里插入图片描述

发送成功

在这里插入图片描述

5.注册功能

(1)接口说明

在这里插入图片描述

(2)controller

在这里插入图片描述

@PostMapping(“register”)

public ResponseEntity register(User user,@RequestParam(“code”) String code){

Boolean bool = userService.register(user,code);

if(bool == null || !bool){

return ResponseEntity.status(HttpStatus.BAD_REQUEST).build();

}

return new ResponseEntity<>(HttpStatus.CREATED);

}

(3)service

基本逻辑:

  • 1)校验短信验证码

  • 2)生成盐

  • 3)对密码加密

  • 4)写入数据库

  • 5)删除Redis中的验证码

1)在ly-common创建CodecUtils工具类

引入依赖

在这里插入图片描述

commons-codec

commons-codec

创建CodecUtils

在这里插入图片描述

package com.leyou.common.utils;

import org.apache.commons.codec.digest.DigestUtils;

import org.apache.commons.lang3.StringUtils;

import java.util.UUID;

public class CodecUtils {

public static String md5Hex(String data,String salt) {

if (StringUtils.isBlank(salt)) {

salt = data.hashCode() + “”;

}

return DigestUtils.md5Hex(salt + DigestUtils.md5Hex(data));

}

public static String shaHex(String data, String salt) {

if (StringUtils.isBlank(salt)) {

salt = data.hashCode() + “”;

}

return DigestUtils.sha512Hex(salt + DigestUtils.sha512Hex(data));

}

public static String generateSalt(){

return StringUtils.replace(UUID.randomUUID().toString(), “-”, “”);

}

}

2)完善

在这里插入图片描述

在这里插入图片描述

public Boolean register(User user, String code) {

String key = KEY_PREFIX + user.getPhone();

//从redis获取验证码

String codeCache = redisTemplate.opsForValue().get(key);

if(!code.equals(codeCache)){

return false;

}

user.setId(null);

user.setCreated(new Date());

//生成盐

String salt = CodecUtils.generateSalt();

user.setSalt(salt);

//对密码进行加密

user.setPassword(CodecUtils.md5Hex(user.getPassword(),salt));

//写入数据库

Boolean boo = userMapper.insertSelective(user) == 1;

if(boo){

try {

redisTemplate.delete(key);

}catch (Exception e){

}

}

return boo;

}

(4)测试

在这里插入图片描述

先发送验证码

在这里插入图片描述

在这里插入图片描述

注册成功

在这里插入图片描述

6.根据用户名和密码查询用户

(1)接口说明
功能说明

查询功能,根据参数中的用户名和密码查询指定用户

接口路径

GET /query

参数说明:

form表单格式

| 参数 | 说明 | 是否必须 | 数据类型 | 默认值 |

| — | — | — | — | — |

| username | 用户名,格式为4~30位字母、数字、下划线 | 是 | String | 无 |

| password | 用户密码,格式为4~30位字母、数字、下划线 | 是 | String | 无 |

返回结果:

用户的json格式数据

{

“id”: 6572312,

“username”:“test”,

“phone”:“13688886666”,

“created”: 1342432424

}

状态码:

  • 200:注册成功

  • 400:用户名或密码错误

  • 500:服务器内部异常,注册失败

(2)controller

在这里插入图片描述

/**

  • 根据用户名和密码查询用户

  • @param username

  • @param password

  • @return

*/

@GetMapping(“query”)

public ResponseEntity queryUser(

@RequestParam(“username”) String username,

@RequestParam(“password”) String password

) {

User user = this.userService.queryUser(username, password);

if (user == null) {

return ResponseEntity.status(HttpStatus.BAD_REQUEST).build();

}

return ResponseEntity.ok(user);

}

标签:Vue,Java,String,网络商城,leyou,user,org,import,data
From: https://blog.csdn.net/vx_vip204888/article/details/142431623

相关文章

  • 基于小程序/安卓的调查问卷管理系统uniapp/JAVA.VUE【数据库设计、论文、毕设源码、开
      博主介绍:......
  • 【最新原创毕设】基于SpringBoot的乐山市景区旅游攻略网+49117(免费领源码)可做计算机毕
    目 录摘要1绪论1.1选题背景与意义1.2开发现状1.3论文结构与章节安排2 乐山市景区旅游攻略网站系统分析2.1可行性分析2.1.1技术可行性分析2.1.2 经济可行性分析2.1.3法律可行性分析2.2系统功能分析2.2.1功能性分析2.2.2非功能性分析2.3......
  • 最新毕设-Node.js-游戏网站-031726(免费领项目)可做计算机毕业设计JAVA、PHP、爬虫、APP
    游戏网站的设计摘 要基于网络游戏的蓬勃发展,游戏网站发挥着吸引玩家和提高玩家之间的互动性的重要作用,因而,建设了一个以游戏为中心的游戏官网。 该游戏提供了一个大型的玩家交流互动平台,包括用户管理、游戏社区、游戏信息、分类信息、游戏资讯、论坛分类列表、新闻分类列......
  • 在 C# 和 JavaScript 之间选择进行网页抓取
    简单了解C#和JavaScript网页抓取的区别C#作为编译型语言,提供了丰富的库和框架,如HtmlAgilityPack、HttpClient等,方便实现复杂的网页爬取逻辑,并且代码简洁高效,具有较强的调试和错误处理能力能力。同时C#具有良好的跨平台支持,适用于多种操作系统。不过C#的学习曲线可能比较陡峭,需要一......
  • 在 JavaScript 中使用最小和最大堆管理流数据:数字运动员健康技术视角
    数据管理在健康技术中至关重要。无论是跟踪运动员的表现指标还是监控运动员的恢复时间,有效地组织数据都可以对洞察的获取方式产生重大影响。在这种情况下管理数据的一种强大工具是堆,特别是最小堆和最大堆。在这篇文章中,我们将使用与运动员数据管理相关的实际示例,探索如何在javasc......
  • 在 JavaScript 中掌握日期
    今天的重点是理解和操作javascript中的日期。日期是许多应用程序的一个基本方面,javascript提供了一组强大的工具来处理它们。1.理解javascript日期javascript日期是从1970年1月1日开始计算的,这被称为unix纪元。自那时起,它们通常以毫秒表示。以下是创建和查看......
  • note.js与vue.js常用基本命令
    Note.js基本命令1、安装Node.js包npminstall<package-name>2、全局安装包npminstall-g<package-name>3、查看已安装的包npmlist4、初始化项目并创建package.json文件npminit5、更新包到最新版本npmupdate<package-name>6、卸载包npmuninstall<pack......
  • 初学者 JavaScript
    JavaScript是一种高级编程语言,广泛应用于Web开发。它由BrendanEich于1995年创建,现已成为世界上最流行的编程语言之一。JavaScript主要用于前端Web开发,用于创建交互式用户界面和动态网页。它还可以在Node.js的帮助下用于后端Web开发,Node.js是一个运行时环境,允许开......
  • 利用 JavaScript 的集合和映射实现高效的内容管理系统
    javascript提供了几种强大的数据结构来处理数据集合。其中,map和set对于某些类型的任务特别有用。在本博客中,我们将探讨使用map和set解决常见编程问题的现实示例。理解地图和集合在深入示例之前,让我们快速回顾一下javascript中的map和set是什么。地图map是键值对......
  • 动态编程变得简单:带有 JavaScript 示例的初学者指南
    通过javascript中的动态编程释放高效解决问题的能力。介绍您想提高编程中解决问题的能力吗?动态规划(dp)是一种强大的技术,可以帮助您高效地解决复杂问题。本初学者指南将通过javascript示例向您介绍动态编程,使其易于掌握并应用于实际场景。您将学到什么:动态规划的基本概念......