1.创建项目
1级项目
kmall2109
2级项目
kmall2109-common(公共资源)
kmall2109-registry(注册中心)
kmall2109-user-service(服务消费)
kmall2109-gateway(网关)
3. kmall2109添加依赖 删除src目录
<packaging>pom</packaging> <properties> <cloud.version>Hoxton.SR12</cloud.version> <common.version>1.0-SNAPSHOT</common.version> </properties> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.12.RELEASE</version> </parent> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>cn.kgc</groupId> <artifactId>kmall2109-common</artifactId> <version>${common.version}</version> </dependency> </dependencies> </dependencyManagement>
4.kmall2109-registry添加依赖
<dependencies> <!--eureka client--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> </dependencies>
4.1 yml配置
server: port: 7001 spring: application: name: kmall-registry eureka: client: service-url: defaultZone: http://localhost:7001/eureka/ register-with-eureka: true fetch-registry: false
4.2 启动类
@SpringBootApplication @EnableEurekaServer
5. kmall2109-user-service 添加依赖
<dependencies> <!--kmall common--> <dependency> <groupId>cn.kgc</groupId> <artifactId>kmall2109-common</artifactId> </dependency> <!--web--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--eureka client--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <!--mysql--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!--mybatis plus--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.1</version> </dependency> <!--test--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <!--作用域测试的时候才会使用--> <scope>test</scope> </dependency> <!--mybatis plus--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> <version>3.5.2</version> </dependency> <!--freemaart--> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> </dependency> <!--redis--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <!--redis应用连接池--> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.73</version> </dependency> </dependencies>
5.2 yml配置
server: port: 10000 spring: application: name: kmall-user-service datasource: username: root password: 1234 url: jdbc:mysql:///kmalldb jackson: date-format: yyyy-MM-dd time-zone: GMT+8 redis: host: localhost port: 6379 eureka: client: service-url: defaultZone: http://localhost:7001/eureka/ register-with-eureka: true fetch-registry: true #服务列表获取别的服务列表 logging: level: cn.kgc: debug
5.3 启动类
@SpringBootApplication @EnableEurekaClient @MapperScan("cn.kgc.*.mapper")
5.4 mybatis-plus代码生成类
String url = "jdbc:mysql:///kmalldb"; String username = "root"; String password = "1234"; String author = "kgc"; String outputDir = "D:\\java2109springclound\\kmall2109\\kmall2109-user-service\\src\\main\\java"; String parent = "cn.kgc"; String moduleName = "user"; String outputFile = "D:\\java2109springclound\\kmall2109\\kmall2109-user-service\\src\\main\\resources\\mapper\\" + moduleName; List<String> tables = Arrays.asList("kmall_user","kmall_role","kmall_menu","kmall_role_menu"); String prefix = "kmall_"; FastAutoGenerator.create(url, username, password) .globalConfig(builder -> { builder.author(author) // 设置作者 //.enableSwagger() // 开启 swagger 模式 //.fileOverride() // 覆盖已生成文件 .outputDir(outputDir); // 指定输出目录 }) .packageConfig(builder -> { builder.parent(parent) // 设置父包名 .moduleName(moduleName) // 设置父包模块名 .pathInfo(Collections.singletonMap(OutputFile.xml, outputFile)); // 设置mapperXml生成路径 }) .strategyConfig(builder -> { builder.addInclude(tables) // 设置需要生成的表名 .addTablePrefix(prefix); // 设置过滤表前缀 }) .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板 .execute();
5.4.1 表里加个字段avatar
5.5 UserController层
@RestController @Slf4j @RequestMapping("/user") public class UserController { @Autowired private IUserService userService; @GetMapping("/list") public Result<List<User>> getUserList(){ List<User> list = userService.list(); return Result.success(list); } @PostMapping("/login") public Result<Map<String,Object>> login(@RequestBody User param){ return userService.login(param); } @GetMapping("/info") public Result<Map<String,Object>> getUserInfoByToken(@RequestParam("token") String token){ // 通过token 到redis里面获取值(user) Result result = userService.getUserInfoByToken(token); /* Map<String,Object> data = new HashMap<>(); data.put("roles", Arrays.asList("admin")); data.put("avatar","https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif"); data.put("name","admin");*/ return result; } @PostMapping("/logout") public Result<String> logout(@RequestHeader("X-Token")String token){ // 非前后端的传统项目,这里需要清空session // 清楚redis中的登录信息 //userService.login(token); userService.logout(token); return Result.success(); } }
5.5.1 config.RedisConfig redis配置
@Configuration public class RedisConfig { @Bean public RedisTemplate redisTemplate(RedisConnectionFactory factory){ RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(factory); redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<Object>(Object.class)); return redisTemplate; } }
5.6 UserServiceImpl实现类
@Service @Slf4j public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService { @Autowired private RedisTemplate redisTemplate; @Override public Result<Map<String,Object>> login(User param) { QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.eq("username",param.getUsername()); wrapper.eq("password",param.getPassword()); User user = this.baseMapper.selectOne(wrapper); if(user == null){ return Result.fail(20002,"用户名或密码错误"); } // 登录成功,将用户信息写入redis String key = "user:"+UUID.randomUUID()+""; user.setPassword(null); //时间 单位分支 一共60分钟 redisTemplate.opsForValue().set(key,user,60L, TimeUnit.MINUTES); Map<String,Object> data = new HashMap<>(); data.put("token", key);//先随机产生一个字符串 return Result.success(data); } @Override public Result getUserInfoByToken(String token) { // 通过从redis中获取登录用户信息 Object obj = redisTemplate.opsForValue().get(token); if(obj == null){ return Result.fail(20003,"登录凭证无效,请重新登录"); } log.debug("--------------->"+obj); log.debug("#################>"+JSON.toJSONString(obj)); User user = JSON.parseObject(JSON.toJSONString(obj),User.class); Map<String,Object> data = new HashMap<>(); data.put("roles", Arrays.asList(user.getRoleId()+"")); data.put("avatar",user.getAvatar()); data.put("name",user.getUsername()); return Result.success(data); } @Override public void logout(String token) { redisTemplate.delete(token); } }
return Result.success(data);
6.0 kmall2109-gateway
6.1 添加依赖
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> <dependency> <groupId>cn.kgc</groupId> <artifactId>kmall2109-common</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> </dependencies>
6.2 yml配置
server: port: 9999 spring: application: name: kmall-gateway cloud: gateway: globalcors: corsConfigurations: '[/**]': allowCredentials: true #设置允许访问携带cookie allowedOrigins: "http://localhost:8888" #可以填写多个域名,用","隔开, "*"代表允许所有 allowedMethods: "*" #所有方法 allowedHeaders: "*" #所有请求头信息 discovery: locator: enabled: true #按微服务名称转发 lower-case-service-id: true eureka: client: service-url: defaultZone: http://localhost:7001/eureka/ register-with-eureka: true fetch-registry: true logging: level: cn.kgc: debug
6.3 启动类
@SpringBootApplication @EnableEurekaClient