Giter Site home page Giter Site logo

yunaiv / yudao-cloud Goto Github PK

View Code? Open in Web Editor NEW
15.8K 334.0 3.8K 38.8 MB

ruoyi-vue-pro 全新 Cloud 版本,优化重构所有功能。基于 Spring Cloud Alibaba + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城、CRM、ERP 等功能。你的 ⭐️ Star ⭐️,是作者生发的动力!

Home Page: https://cloud.iocoder.cn

License: MIT License

Java 66.44% PLpgSQL 26.04% TSQL 7.24% Dockerfile 0.08% Python 0.20% Shell 0.01%
dubbo springcloud springboot rocketmq zookeeper mysql redis skywalking elasticsearch sharding-sphere

yudao-cloud's Issues

网关日志日志功能创建的LinkedHashMap对象没有指定初始长度,可以指定以提高性能

基本信息

  • ruoyi-vue-pro 版本:4.0.0
  • 操作系统:无
  • 数据库:无

你猜测可能的原因

浏览代码时,发现网关日志日志打印时候用的是无默认大小初始化值的linkhashmap对象,而打印网关日志代码为固定在map中放置15个项目,所以可以在新建对象的时候指定初始化map中对象个数为15,以节省内存和提高性能。

复现步骤

Uploading image.png…
AccessLogFilter.java
private void writeAccessLog(AccessLog gatewayLog) {
Map<String, Object> values = new LinkedHashMap<>(); // 手工拼接,保证排序
values.put("userId", gatewayLog.getUserId());
values.put("userType", gatewayLog.getUserType());
values.put("routeId", gatewayLog.getRoute() != null ? gatewayLog.getRoute().getId() : null);
values.put("schema", gatewayLog.getSchema());
values.put("requestUrl", gatewayLog.getRequestUrl());
values.put("queryParams", gatewayLog.getQueryParams().toSingleValueMap());
values.put("requestBody", JsonUtils.isJson(gatewayLog.getRequestBody()) ? // 保证 body 的展示好看
JSONUtil.parse(gatewayLog.getRequestBody()) : gatewayLog.getRequestBody());
values.put("requestHeaders", JsonUtils.toJsonString(gatewayLog.getRequestHeaders().toSingleValueMap()));
values.put("userIp", gatewayLog.getUserIp());
values.put("responseBody", JsonUtils.isJson(gatewayLog.getResponseBody()) ? // 保证 body 的展示好看
JSONUtil.parse(gatewayLog.getResponseBody()) : gatewayLog.getResponseBody());
values.put("responseHeaders", gatewayLog.getResponseHeaders() != null ?
JsonUtils.toJsonString(gatewayLog.getResponseHeaders().toSingleValueMap()) : null);
values.put("httpStatus", gatewayLog.getHttpStatus());
values.put("startTime", DateUtil.format(gatewayLog.getStartTime(), NORM_DATETIME_MS_FORMAT));
values.put("endTime", DateUtil.format(gatewayLog.getEndTime(), NORM_DATETIME_MS_FORMAT));
values.put("duration", gatewayLog.getDuration() != null ? gatewayLog.getDuration() + " ms" : null);
log.info("[writeAccessLog][网关日志:{}]", JsonUtils.toJsonPrettyString(values));
}

报错信息

多个committer代码规范不统一

首先感谢作者,这是一个非常好的springboot综合项目实例,能从工程中学到springboot,dubbo,微服务的知识。应用分层这篇文章中讲到项目结构的时候,讲到service层和controller层的入参都是DTO,但是实际代码中出现了PO的概念,例如UserAddressAddPO,在这里,应该和DTO是一个意思,建议统一一下

生成代码时,报错:Cause: java.sql.SQLException: Field 'table_id' doesn't have a default value,疑似mybatis-plus插入数据后,未返回主键

基本信息

  • yudao-cloud:
  • 操作系统:win10 ltsc 2021 64bit
  • 数据库:mysql 8.0

你猜测可能的原因

插入数据后未返回table.id
codegenTableMapper.insert(table);
导致下一步table.id无值可用

       // 构建 CodegenColumnDO 数组,插入到 DB 中
        List<CodegenColumnDO> columns = codegenBuilder.buildColumns(table.getId(), tableInfo.getFields());
        // 如果没有主键,则使用第一个字段作为主键
        if (!tableInfo.isHavePrimaryKey()) {
            columns.get(0).setPrimaryKey(true);
        }
        codegenColumnMapper.insertBatch(columns);

复现步骤

第一步,进入后台管理系统,选择左侧“基础设施”菜单

第二步,选择“代码生成”

第三步,点击“导入”按钮,选择表后确定

报错信息

系统异常
图片

Cause: java.sql.SQLException: Field 'table_id' doesn't have a default value

; Field 'table_id' doesn't have a default value; nested exception is java.sql.SQLException: Field 'table_id' doesn't have a default value
at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:251)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:70)
at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:91)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:441)
at com.sun.proxy.$Proxy205.insert(Unknown Source)
at org.mybatis.spring.SqlSessionTemplate.insert(SqlSessionTemplate.java:272)
at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:59)
at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:148)
at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89)
at com.sun.proxy.$Proxy232.insert(Unknown Source)
at java.util.ArrayList.forEach(ArrayList.java:1259)

master分支项目整体编译无法通过

1、很多模块的pom中依赖了system-sdk、user-sdk,但是项目已经没有这两个模块
2、各子项目中service-impl模块中的dataobject中的实体类集成的BaseDO或DeletableDO引入的还是cn.iocoder.common.framework.dataobject包下,这个类似乎已经已经移动到cn.iocoder.mall.mybatis.dataobject,导致很多模块都是编译报错的

待确认修复的逻辑问题

fork 的代码,梳理逻辑时,发现三个问题:
1:
AdminServiceImpl.java
updateAdmin() 方法
password参数未encodePassword存储,账号修改后无法登陆
2:
updateAdminStatus()
DISABLE 时会将当前用户token失效,应该是被更新的用户token失效,参数传错了
3:
AdminErrorCodeEnum.java
账号被禁用 与 账号已经存在 状态码相同

swagger功能还是有问题

yudao-cloud已更新最新程序(1113日),并写了一个demo,demo正常访问没问题,也屏蔽了tanent_id和配置了gateway路由,但是仍然报“租户的请求未传递,请进行排查”,急急急!
1
2
3
4
5

功能增加-不是bug

碰到问题,请在 https://github.com/YunaiV/yudao-cloud/issues 搜索是否存在相似的 issue。

不按照模板提交的 issue,会被系统自动删除。

基本信息

我在自己的项目中,实现了一个字段级别权限管理,这个项目中是否需要添加进来

相关设计
知识库权限业务设计.pdf

  • ruoyi-vue-pro 版本:
  • 操作系统:
  • 数据库:

你猜测可能的原因

系统功能增加

复现步骤

报错信息

【欢迎贡献】yudao项目版本号问题

基本信息
ruoyi-vue-pro 版本:1.7.1-snapshot
操作系统:macOS
数据库:mysql

问题
<spring.cloud.alibaba.version>2021.0.1.0</spring.cloud.alibaba.version>
使用当前版本 nacos配置的 server-addr 使用域名可以正常访问,
当版本切换为<spring.cloud.alibaba.version>2021.0.4.0</spring.cloud.alibaba.version>
会导致nacos服务连接不上

发送邮件,rocketmq上的topic没绑定消费者

基本信息

  • ruoyi-vue-pro 版本:1.7.1-snapshot
  • 操作系统:macOS
  • 数据库:mysql

你猜测可能的原因

(必填)我花费了 2-4 小时自查,发现可能的原因是:rocketmq消费者和topic没有绑定

复现步骤

第一步,调用邮件中发送邮件的接口, rocketmq上有相应的消息,和消费者,但是并没有绑定

image

image

image

配置信息
image

贡献参与

cloud版本进度怎么样了,想加入版本开发

将配置放至Nacos后报错Unable to find instance for xxx

把applicaton-local.yaml里的配置移动到Nacos后,gateway就一直报Unable to find instance for xxx,无论是新创建的服务,还是自带的system、infra服务,请大家指导下哪里有错误或者缺少什么步骤

基本信息
ruoyi-vue-pro 版本:1.6.5
操作系统:CentOS 7
数据库:MySQL5.7
你猜测可能的原因
(必填)我花费了 2-4 小时自查,发现可能的原因是:未知

复现步骤
第一步,我新建的namespace,创建了 lighting-server配置(lighting-server是spring.application.name),里面的配置是把application-local.yaml里的配置复制进来,和system服务的配置基本一样
image

第二步,在bootstrap-local.yaml里修改namespace为创建的namesapce的id
修改bootstrap-local.yaml里Nacos的namespace

第三步,把原来本地的application-local.yaml的内容清空掉

第四步,把脚本deploy.sh里的启动命令的--spring.profiles.active改为-Dspring.profiles.active
image

第五步,gateway服务配置里的route加上lighting-server的配置
image

报错信息
Unable to find instance for lighting-server
image

maven打包打的都是快照

碰到问题,请在 https://github.com/YunaiV/yudao-cloud/issues 搜索是否存在相似的 issue。

不按照模板提交的 issue,会被系统自动删除。

基本信息

  • ruoyi-vue-pro 版本:
  • 操作系统:
  • 数据库:

你猜测可能的原因

(必填)我花费了 2-4 小时自查,发现可能的原因是:xxxxxx

复现步骤

第一步,

第二步,

第三步,

报错信息

带上必要的截图

Unable to find instance for system-server

碰到问题,请在 https://github.com/YunaiV/yudao-cloud/issues 搜索是否存在相似的 issue。

不按照模板提交的 issue,会被系统自动删除。

基本信息

  • ruoyi-vue-pro 版本:最新版
  • 操作系统:Windows11
  • 数据库:5.7

项目启动出现问题

  • 在gateway,system,infra以及前端都启动之后,浏览器登录界面出现“Unable to find instance for system-server”

但是在nacos服务列表中有system-server,不知道是什么原因

你猜测可能的原因

(必填)我花费了 2-4 小时自查,发现可能的原因是:xxxxxx

复现步骤

第一步,

第二步,

第三步,

报错信息

带上必要的截图
Snipaste_2023-04-24_18-18-27

租户的请求未传递,请进行排查

碰到问题,请在 https://github.com/YunaiV/yudao-cloud/issues 搜索是否存在相似的 issue。

不按照模板提交的 issue,会被系统自动删除。

基本信息

  • ruoyi-vue-pro 版本:1.6.6-snapshot
  • 操作系统:win10
  • 数据库:mysql

你猜测可能的原因

(必填)我花费了 2-4 小时自查,发现可能的原因是:一直没有发现问题在哪里。断点调式了

我按文档新建了一个模块。新增了demo/test
image
这里也添加了过滤
image
用postman通过网关请求也没有问题。但是后台却报一下错误
image
image
我在TenantSecurityWebFilter->isIgnoreUrl 方法中添加了日志。request.getRequestURI()的值不是我请求的app-api/demo/test/get url,而是 /rpc-api/infra/api-access-log/create 这个不知道为什么。
image

IP 域名映射

所有的 配置文件里边的 ip 都可以替换成域名,比如说 127.0.0.1 替换成 zookeeper.onemall.com
这样,开发者配置 Host ,就可以不用更改源码就可以进行调试了。

查询自己的站内信信息异常提示 “获取不到数据库的类型”

基本信息

  • yudao-cloud版本:1.6.6-snapshot
  • 操作系统:win11
  • 数据库:mysql8.0

你猜测可能的原因

使用nacos配置中心,mybatis组件IdTypeEnvironmentPostProcessor比拉取配置中心先执行,获取不到 DbType,初始化 SQL 静态变量为空,在使用QueryWrapperX的limitN方法的时候 提示,Assert.notNull(SqlConstants.DB_TYPE, "获取不到数据库的类型");

复现步骤

第一步,
使用nacos配置中心
第二步,
点击个人的站内信按钮,报系统异常

报错信息

image

image

image

token方案是否存在问题

package:

cn.iocoder.mall.systemservice.service.oauth.refreshAccessToken

code

`

OAuth2RefreshTokenDO refreshTokenDO = oauth2RefreshTokenMapper.selectById(refreshAccessTokenDTO.getRefreshToken());

    // 校验刷新令牌是否合法
    if (refreshTokenDO == null) { // 不存在
        throw ServiceExceptionUtil.exception(OAUTH2_REFRESH_TOKEN_NOT_FOUND);
    }
    if (refreshTokenDO.getExpiresTime().getTime() < System.currentTimeMillis()) { // 已过期
        throw ServiceExceptionUtil.exception(OAUTH_REFRESH_TOKEN_EXPIRED);
    }

    // 标记 refreshToken 对应的 accessToken 都不合法
    // 这块的实现,参考了 Spring Security OAuth2 的代码
    List<OAuth2AccessTokenDO> accessTokenDOs = oauth2AccessTokenMapper.selectListByRefreshToken(refreshAccessTokenDTO.getRefreshToken());
    accessTokenDOs.forEach(accessTokenDO -> deleteOAuth2AccessToken(accessTokenDO.getId()));

    // 创建访问令牌
    OAuth2AccessTokenDO oauth2AccessTokenDO = createOAuth2AccessToken(refreshTokenDO, refreshAccessTokenDTO.getCreateIp());
    // 返回访问令牌
    return OAuth2Convert.INSTANCE.convert(oauth2AccessTokenDO);

`

上述代码中对refreshToken对应的accessToken进行了移除,并重新创建了accessToken,但是并未刷新refreshToken的过期时间,

当refreshToken过期时间到达,会导致refreh-token接口错误

发现有好些todo,项目好久没有更新了,还会后续更新吗

读了这个项目后,这里发现一些问题,以供参考:

前端相关:

  1. 增加品牌时候,不发出请求
  2. 增加子种类的时候,点击上传图片就跳过.
  3. Invalid Host header,这个问题,请求商城子项目,部署到云上时候
  4. 发布商品时候,规格明细那里,产生数量和价格的条目数,应该是商品规格属性的排列组合,不能有重复,现在出现重复,前端页面生成数据bug
  5. 优惠券,折扣卷那里,会崩

后端相关,主要是好一些todo还没做,看起来还是有些不完善,少量问题自己阅读时候发现:
todo 系列:

  1. 下订单,没减库存
  2. 订单过期逻辑还没有
  3. 退货相关,重新入库的好像没加(不知道是不是需要手动入库比较合理,这样的考虑?)
  4. 还有一些其他todo
  5. 还有一个支付成功通知逻辑,代码注释写的是
    定时任务,扫描 nextNotifyTime < lastExecuteTime 的任务
    感觉不用这个lastExecuteTime,加上感觉疑惑,是不是 nextNotifyTime < now()时候就可以执行通知逻辑了

【欢迎贡献】多租户工具类

image

多租户的情情况下,子线程是不是就获取不到主线程中的关于租户的一些设置,threadLocal变量是不共享的,这个TenantUtils是不是有点小问题呢,还是我理解的片面了

提问

mapstruct的convert类的方法用convert1,convert2这样排可不可以换成名字全部convert,因为方法重载调用的时候已经很明确调的是哪个转换器,除非特殊情况下,转换的源和目标类型不一样,此时用1,2区分下,不过这样极端情况应该不会太多

无token时如何进行的认证?

碰到问题,请在 https://github.com/YunaiV/yudao-cloud/issues 搜索是否存在相似的 issue。

不按照模板提交的 issue,会被系统自动删除。

基本信息

  • yudao-cloud 版本:1.6.2-snapshot
  • 操作系统:windows
  • 数据库:mysql

请问如果请求头不携带token请求时,是如何鉴权的,我看这两个filter里面,cn.iocoder.yudao.gateway.filter.security.TokenAuthenticationFilter,cn.iocoder.yudao.framework.security.core.filter.TokenAuthenticationFilter,如果没有token都是直接过了,那不相当于没有认证也可以调用接口了吗?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.