提交 16482300 编写于 作者: 有来技术

refactor: 项目结构优化,添加有来实验室

上级 adf9f850
......@@ -62,7 +62,7 @@
| ![](https://gitee.com/haoxr/image/raw/master/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20210621005349.jpg) | ![](https://gitee.com/haoxr/image/raw/master/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20210621005356.jpg) | ![](https://gitee.com/haoxr/image/raw/master/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20210621005344.jpg) |
### 项目架构流程
### 项目架构图
![](https://gitee.com/haoxr/image/raw/master/default/OAuth2.jpg)
......@@ -76,14 +76,15 @@
| 项目名称 | 源码地址 |项目名称 | 源码地址 |
| ---------- | ------------------------------------------------------------ |---------- | ------------------------------------------------------------ |
| 微服务后台 | [youlai-mall](https://gitee.com/youlaitech/youlai-mall) | 微信小程序 | [youlai-mall-weapp](https://gitee.com/youlaitech/youlai-mall-weapp) |
| 微服务接口 | [youlai-mall](https://gitee.com/youlaitech/youlai-mall) | 微信小程序 | [youlai-mall-weapp](https://gitee.com/youlaitech/youlai-mall-weapp) |
| 管理前端 | [youlai-mall-admin](https://gitee.com/youlaitech/youlai-mall-admin) |APP应用 | [youlai-mall-app](https://gitee.com/youlaitech/youlai-mall-app) |
### 项目结构
``` lua
youlai-mall
├── docs
├── doc
├── diagram -- 框架图解
├── nacos -- Nacos配置文件
├── sql -- mysql数据库脚本
├── mall-oms
......@@ -104,7 +105,8 @@ youlai-mall
├── admin-boot -- 系统管理服务
├── youlai-auth -- 认证中心【OAuth2认证服务器】
├── youlai-common -- 公共模块
└── youlai-gateway -- Gateway网关【OAuth2资源服务器】
├── youlai-gateway -- Gateway网关【OAuth2资源服务器】
└── youlai-loboratory -- 实验室
```
## 项目启动
......@@ -131,7 +133,7 @@ youlai-mall
- 导入配置
浏览器输入 http://localhost:8848/nacos ,输入用户名/密码:nacos/nacos 进入控制台,在 配置管理→配置列表 页面选择项目里的文件`docs/nacos/DEFAULT_GROUP.zip`导入。
浏览器输入 http://localhost:8848/nacos ,输入用户名/密码:nacos/nacos 进入控制台,在 配置管理→配置列表 页面选择项目里的文件`doc/nacos/DEFAULT_GROUP.zip`导入。
![](https://gitee.com/haoxr/image/raw/master/20210623012937.png)
......@@ -145,28 +147,35 @@ youlai-mall
#### 二. 本地环境启动
1. **安装环境**
安装`MySQL`、`Redis`中间件,MySQL的版本5.x和8.x都可以
安装`MySQL`、`Redis`中间件,MySQL的版本5.x和8.x皆可。
2. **创建数据库**
- 新建平台数据库,进入项目`docs/sql`,根据MySQL版本选择,先执行`database.sql`创建数据库,再执行`youlai.sql`、`mall_*.sql`完成表的创建和数据的导入。
2. **数据库创建**
- 新建平台数据库,进入`doc/sql`目录,根据MySQL版本选择,先执行`database.sql`创建数据库,再执行`youlai.sql`、`mall_*.sql`完成表的创建和数据的导入。
- 创建`Nacos`数据库,执行脚本`middleware/nacos/conf/nacos-mysql.sql`完成`Nacos`数据库的初始化。
3. **Nacos 启动和配置**
3. **Nacos 配置和启动**
- 修改`Nacos`数据源,进入配置`middleware/nacos/conf/application.properties`将数据源修改为您自己的环境;
- 启动`Nacos`, IDEA下方工具栏点击Terminal终端命令行,执行`cd middleware/nacos/bin`命令切换到`Nacos`的启动脚本文件夹下,然后执行`startup -m standalone`命令启动`Nacos`服务;
- 修改`Nacos`数据源: 进入`middleware/nacos/conf/application.properties`将数据源修改为您自己的环境;
![image-20211128094228864](https://gitee.com/haoxr/image/raw/master/default/image-20211128094228864.png)
- 启动`Nacos` IDEA下方工具栏点击Terminal终端命令行,执行`cd middleware/nacos/bin`命令切换到`Nacos`的启动脚本文件夹下,然后执行`startup -m standalone`命令启动`Nacos`服务;
- 浏览器输入 http://localhost:8848/nacos ,输入用户名/密码:nacos/nacos 进入控制台,在 配置管理→配置列表 页面选择项目里的文件`docs/nacos/DEFAULT_GROUP.zip`导入。
- 导入配置: 浏览器输入 http://localhost:8848/nacos ,输入用户名/密码:nacos/nacos 进入控制台,在 配置管理→配置列表 页面选择项目里的文件`docs/nacos/DEFAULT_GROUP.zip`导入。
![](https://gitee.com/haoxr/image/raw/master/20210623012937.png)
- 导入`Nacos`配置,在启动`Nacos`服务进入控制台导入`docs/nacos/DEFAULT_GROUP.zip`配置,进入共享配置`youlai-common.yaml`修改MySQL、Redis、RabbitMQ等中间件的信息,默认是`有来技术团队`云服务器环境。
- 修改配置: 进入共享配置`youlai-common.yaml`修改MySQL、Redis、RabbitMQ等中间件的信息,默认是`有来技术团队`云服务器环境。
![](https://gitee.com/haoxr/image/raw/master/default/20210829124804.png)
4. `Nacos`启动完成和MySQL、Redis连接信息修改完成后,分别启动`youlai-gateway`、`youlai-auth`、 `youlai-admin`模块,
启动类分别对应的是GatewayApplication、AuthApplication以及`youlai-admin`的子模块`admin-boot`的AdminApplication类,至此完成整个项目基础服务的启动;
4. **微服务启动**
分别启动`youlai-gateway`、`youlai-auth`、 `youlai-admin`模块,
启动类分别对应的是GatewayApplication、AuthApplication以及`youlai-admin`的子模块`admin-boot`的AdminApplication类,至此完成整个项目基础服务的启动。
5. **启动验证**
访问接口文档: http://localhost:9999/doc.html
### 管理前端启动
......
......@@ -18,6 +18,7 @@
<module>mall-ums</module>
<module>mall-pms</module>
<module>mall-oms</module>
<module>youlai-laboratory</module>
</modules>
<parent>
......
package com.youlai.admin.api;
import com.youlai.admin.pojo.entity.SysOauthClient;
import com.youlai.admin.dto.OAuth2ClientDTO;
import com.youlai.common.result.Result;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestParam;
@FeignClient(value = "youlai-admin", contextId = "oauth-client")
public interface OAuthClientFeignClient {
@GetMapping("/api/v1/oauth-clients/{clientId}")
Result<SysOauthClient> getOAuthClientById(@PathVariable String clientId);
@GetMapping("/api/v1/oauth-clients/getOAuth2ClientById")
Result<OAuth2ClientDTO> getOAuth2ClientById(@RequestParam String clientId);
}
package com.youlai.admin.api;
import com.youlai.admin.api.fallback.UserFeignFallbackClient;
import com.youlai.admin.pojo.dto.UserAuthDTO;
import com.youlai.admin.pojo.entity.SysUser;
import com.youlai.admin.dto.UserAuthDTO;
import com.youlai.common.result.Result;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
......
package com.youlai.admin.api.fallback;
import com.youlai.admin.api.UserFeignClient;
import com.youlai.admin.pojo.entity.SysUser;
import com.youlai.common.result.Result;
import com.youlai.common.result.ResultCode;
import lombok.extern.slf4j.Slf4j;
......
package com.youlai.admin.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 客户端实体
*/
@Data
public class OAuth2ClientDTO {
@ApiModelProperty(value = "客户端ID")
private String clientId;
@ApiModelProperty(value = "客户端密钥")
private String clientSecret;
@ApiModelProperty(value = "资源id列表")
private String resourceIds;
@ApiModelProperty(value = "域")
private String scope;
@ApiModelProperty(value = "授权方式")
private String authorizedGrantTypes;
@ApiModelProperty("回调地址")
private String webServerRedirectUri;
@ApiModelProperty(value = "权限列表")
private String authorities;
@ApiModelProperty(value = "认证令牌时效")
private Integer accessTokenValidity;
@ApiModelProperty(value = "刷新令牌时效")
private Integer refreshTokenValidity;
@ApiModelProperty(value = "扩展信息")
private String additionalInformation;
@ApiModelProperty(value = "是否自动放行")
private String autoapprove;
}
package com.youlai.admin.component;
package com.youlai.admin.component.cache;
import com.youlai.admin.service.ISysPermissionService;
import lombok.AllArgsConstructor;
......@@ -7,6 +7,7 @@ import org.springframework.stereotype.Component;
/**
* 容器启动完成时加载角色权限规则至Redis缓存
* @author haoxr
*/
@Component
@AllArgsConstructor
......
package com.youlai.admin.handler;
package com.youlai.admin.component.handler;
import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.BlockExceptionHandler;
import com.alibaba.csp.sentinel.slots.block.BlockException;
......
package com.youlai.admin.handler;
package com.youlai.admin.component.handler;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.youlai.admin.pojo.vo.UserVO;
......
package com.youlai.admin.listener;
package com.youlai.admin.component.listener;
import cn.hutool.json.JSONUtil;
import com.youlai.admin.service.ISysMenuService;
......
package com.youlai.admin.controller;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.youlai.admin.dto.OAuth2ClientDTO;
import com.youlai.admin.pojo.entity.SysOauthClient;
import com.youlai.admin.service.ISysOauthClientService;
import com.youlai.common.result.Result;
......@@ -33,9 +36,7 @@ public class OauthClientController {
@ApiImplicitParam(name = "clientId", value = "客户端ID", paramType = "query", dataType = "String")
})
@GetMapping
public Result list(Integer page,
Integer limit,
String clientId) {
public Result list(Integer page, Integer limit, String clientId) {
IPage<SysOauthClient> result = iSysOauthClientService.page(
new Page<>(page, limit),
new LambdaQueryWrapper<SysOauthClient>()
......@@ -79,4 +80,15 @@ public class OauthClientController {
boolean status = iSysOauthClientService.removeByIds(Arrays.asList(ids.split(",")));
return Result.judge(status);
}
@ApiOperation(hidden = true, value = "获取 OAuth2 客户端认证信息", notes = "Feign 调用")
@GetMapping("/getOAuth2ClientById")
public Result<OAuth2ClientDTO> getOAuth2ClientById(@RequestParam String clientId) {
SysOauthClient client = iSysOauthClientService.getById(clientId);
Assert.isNull(client, "OAuth2 客户端不存在");
OAuth2ClientDTO oAuth2ClientDTO = new OAuth2ClientDTO();
BeanUtil.copyProperties(client, oAuth2ClientDTO);
return Result.success(oAuth2ClientDTO);
}
}
......@@ -5,7 +5,7 @@ import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.youlai.admin.pojo.dto.RolePermissionDTO;
import com.youlai.admin.dto.RolePermissionDTO;
import com.youlai.admin.pojo.entity.SysRole;
import com.youlai.admin.service.ISysPermissionService;
import com.youlai.admin.service.ISysRoleMenuService;
......
......@@ -5,7 +5,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.youlai.admin.pojo.dto.UserAuthDTO;
import com.youlai.admin.dto.UserAuthDTO;
import com.youlai.admin.pojo.entity.SysUser;
import com.youlai.admin.pojo.entity.SysUserRole;
import com.youlai.admin.pojo.vo.UserVO;
......
package com.youlai.admin.controller.v2;
import com.youlai.admin.pojo.vo.RouteVO;
import com.youlai.admin.service.ISysMenuService;
import com.youlai.common.result.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* 菜单控制器V2版本适配Vue3的vue-next-router
*
* @author <a href="mailto:xianrui0365@163.com">xianrui</a>
* @date 2020/11/28
*/
@Api(tags = "菜单接口(V2)",value = "适配Vue3的vue-next-router")
@RestController
@RequestMapping("/api/v2/menus")
@RequiredArgsConstructor
public class MenuV2Controller {
private final ISysMenuService menuService;
@ApiOperation(value = "菜单路由(Route)层级列表")
@GetMapping("/route")
public Result getRouteList() {
List<RouteVO> routeList = menuService.listRoute();
return Result.success(routeList);
}
}
......@@ -2,7 +2,7 @@ package com.youlai.admin.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.youlai.admin.pojo.dto.UserAuthDTO;
import com.youlai.admin.dto.UserAuthDTO;
import com.youlai.admin.pojo.entity.SysUser;
import org.apache.ibatis.annotations.Mapper;
......
......@@ -6,7 +6,7 @@ import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 客户端信息
* 客户端实体
*/
@Data
public class SysOauthClient {
......
package com.youlai.admin.pojo.vo;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* @author haoxr
* @date 2020-11-06
*/
@Data
@JsonInclude(JsonInclude.Include.NON_EMPTY)
public class NextRouteVO {
private String path;
private String component;
private String redirect;
private boolean alwaysShow;
private String name;
private Boolean hidden;
private Meta meta;
@Data
@NoArgsConstructor
@AllArgsConstructor
public static class Meta {
private String title;
private String icon;
private List<String> roles;
}
private List<NextRouteVO> children;
}
......@@ -2,7 +2,7 @@ package com.youlai.admin.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.youlai.admin.pojo.dto.RolePermissionDTO;
import com.youlai.admin.dto.RolePermissionDTO;
import com.youlai.admin.pojo.entity.SysRolePermission;
import java.util.List;
......
......@@ -4,7 +4,7 @@ package com.youlai.admin.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.youlai.admin.pojo.dto.UserAuthDTO;
import com.youlai.admin.dto.UserAuthDTO;
import com.youlai.admin.pojo.entity.SysUser;
public interface ISysUserService extends IService<SysUser> {
......
......@@ -4,7 +4,7 @@ import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.youlai.admin.mapper.SysRolePermissionMapper;
import com.youlai.admin.pojo.dto.RolePermissionDTO;
import com.youlai.admin.dto.RolePermissionDTO;
import com.youlai.admin.pojo.entity.SysRolePermission;
import com.youlai.admin.service.ISysRolePermissionService;
import org.springframework.stereotype.Service;
......
......@@ -5,7 +5,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.youlai.admin.pojo.dto.UserAuthDTO;
import com.youlai.admin.dto.UserAuthDTO;
import com.youlai.admin.pojo.entity.SysUser;
import com.youlai.admin.mapper.SysUserMapper;
import com.youlai.admin.pojo.entity.SysUserRole;
......
......@@ -32,7 +32,7 @@
deleted
</sql>
<resultMap id="UserAuthMap" type="com.youlai.admin.pojo.dto.UserAuthDTO">
<resultMap id="UserAuthMap" type="com.youlai.admin.dto.UserAuthDTO">
<id property="userId" column="userId" jdbcType="BIGINT"/>
<result property="username" column="username" jdbcType="VARCHAR"/>
<result property="password" column="password" jdbcType="VARCHAR"/>
......
package com.youlai.auth.security.core.clientdetails;
import com.youlai.admin.api.OAuthClientFeignClient;
import com.youlai.admin.pojo.entity.SysOauthClient;
import com.youlai.admin.dto.OAuth2ClientDTO;
import com.youlai.auth.common.enums.PasswordEncoderTypeEnum;
import com.youlai.common.result.Result;
import lombok.RequiredArgsConstructor;
......@@ -26,9 +26,9 @@ public class ClientDetailsServiceImpl implements ClientDetailsService {
@Cacheable(cacheNames = "auth", key = "'oauth-client:'+#clientId")
public ClientDetails loadClientByClientId(String clientId) {
try {
Result<SysOauthClient> result = oAuthClientFeignClient.getOAuthClientById(clientId);
Result<OAuth2ClientDTO> result = oAuthClientFeignClient.getOAuth2ClientById(clientId);
if (Result.success().getCode().equals(result.getCode())) {
SysOauthClient client = result.getData();
OAuth2ClientDTO client = result.getData();
BaseClientDetails clientDetails = new BaseClientDetails(
client.getClientId(),
client.getResourceIds(),
......
package com.youlai.auth.security.core.userdetails.user;
import cn.hutool.core.collection.CollectionUtil;
import com.youlai.admin.pojo.dto.UserAuthDTO;
import com.youlai.admin.dto.UserAuthDTO;
import com.youlai.auth.common.enums.PasswordEncoderTypeEnum;
import com.youlai.common.constant.GlobalConstants;
import lombok.Data;
......
package com.youlai.auth.security.core.userdetails.user;
import com.youlai.admin.api.UserFeignClient;
import com.youlai.admin.pojo.dto.UserAuthDTO;
import com.youlai.admin.dto.UserAuthDTO;
import com.youlai.common.result.Result;
import com.youlai.common.result.ResultCode;
import lombok.RequiredArgsConstructor;
......
### 项目结构
``` lua
youlai-loboratory
├── base 基础设置
├── config -- 公共配置(Swagger配置)
├── seata 分布式事务
└── end
```
\ No newline at end of file
<?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">
<parent>
<artifactId>youlai-mall</artifactId>
<groupId>com.youlai</groupId>
<version>2.0.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>youlai-laboratory</artifactId>
<description>有来实验室</description>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
</project>
\ No newline at end of file
package com.youlai.laboratory.base.config;
/**
* @author <a href="mailto:xianrui0365@163.com">haoxr</a>
* @date 2021/11/28 10:05
*/
public class SwaggerConfiguration {
}
package com.youlai.laboratory.canal;
/**
* @author <a href="mailto:xianrui0365@163.com">haoxr</a>
* @date 2021/11/28 10:06
*/
public class Test {
}
package com.youlai.laboratory.elasticsearch;
/**
* @author <a href="mailto:xianrui0365@163.com">haoxr</a>
* @date 2021/11/28 10:06
*/
public class Test {
}
package com.youlai.laboratory.jvm;
/**
* @author <a href="mailto:xianrui0365@163.com">haoxr</a>
* @date 2021/11/28 10:06
*/
public class Test {
}
package com.youlai.laboratory.mybatis;
/**
* @author <a href="mailto:xianrui0365@163.com">haoxr</a>
* @date 2021/11/28 10:06
*/
public class Test {
}
package com.youlai.laboratory.mysql;
/**
* @author <a href="mailto:xianrui0365@163.com">haoxr</a>
* @date 2021/11/28 10:06
*/
public class Test {
}
package com.youlai.laboratory.netty;
/**
* @author <a href="mailto:xianrui0365@163.com">haoxr</a>
* @date 2021/11/28 10:06
*/
public class Test {
}
package com.youlai.laboratory.rabbitmq;
/**
* @author <a href="mailto:xianrui0365@163.com">haoxr</a>
* @date 2021/11/28 10:06
*/
public class Test {
}
package com.youlai.laboratory.redis;
/**
* @author <a href="mailto:xianrui0365@163.com">haoxr</a>
* @date 2021/11/28 10:06
*/
public class Test {
}
package com.youlai.laboratory.seata;
/**
* @author <a href="mailto:xianrui0365@163.com">haoxr</a>
* @date 2021/11/28 10:06
*/
public class Test {
}
package com.youlai.laboratory.sentinel;
/**
* @author <a href="mailto:xianrui0365@163.com">haoxr</a>
* @date 2021/11/28 10:06
*/
public class Test {
}
package com.youlai.laboratory.spring;
/**
* @author <a href="mailto:xianrui0365@163.com">haoxr</a>
* @date 2021/11/28 10:06
*/
public class Test {
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册