Giter Club home page Giter Club logo

elunez / eladmin Goto Github PK

View Code? Open in Web Editor NEW
20.9K 544.0 7.3K 6.99 MB

eladmin jpa 版本:项目基于 Spring Boot 2.6.4、 Jpa、 Spring Security、Redis、Vue的前后端分离的后台管理系统,项目采用分模块开发方式, 权限控制采用 RBAC,支持数据字典与数据权限管理,支持一键生成前后端代码,支持动态路由

Home Page: https://eladmin.vip/demo

License: Apache License 2.0

Java 90.23% FreeMarker 3.93% PLpgSQL 5.84%
spring-boot spring-security jpa redis vue element-ui swagger2 admin eladmin jwt

eladmin's Introduction

ELADMIN 后台管理系统

AUR star GitHub stars GitHub forks

项目简介

一个基于 Spring Boot 2.6.4 、 Spring Boot Jpa、 JWT、Spring Security、Redis、Vue的前后端分离的后台管理系统

现已发布基于 mybatis-plus 版本,项目地址:https://github.com/elunez/eladmin-mphttps://gitee.com/elunez/eladmin-mp

开发文档: https://eladmin.vip

体验地址: https://eladmin.vip/demo

账号密码: admin / 123456

项目源码

后端源码 前端源码
github https://github.com/elunez/eladmin https://github.com/elunez/eladmin-web
码云 https://gitee.com/elunez/eladmin https://gitee.com/elunez/eladmin-web

VPS推荐

使用优惠码: BWHCCNCXVV,可获得 6.81% 的折扣, 查看介绍

主要特性

  • 使用最新技术栈,社区资源丰富。
  • 高效率开发,代码生成器可一键生成前后端代码
  • 支持数据字典,可方便地对一些状态进行管理
  • 支持接口限流,避免恶意请求导致服务层压力过大
  • 支持接口级别的功能权限与数据权限,可自定义操作
  • 自定义权限注解与匿名接口注解,可快速对接口拦截与放行
  • 对一些常用地前端组件封装:表格数据请求、数据字典等
  • 前后端统一异常拦截处理,统一输出异常,避免繁琐的判断
  • 支持在线用户管理与服务器性能监控,支持限制单用户登录
  • 支持运维管理,可方便地对远程服务器的应用进行部署与管理

系统功能

  • 用户管理:提供用户的相关配置,新增用户后,默认密码为123456
  • 角色管理:对权限与菜单进行分配,可根据部门设置角色的数据权限
  • 菜单管理:已实现菜单动态路由,后端可配置化,支持多级菜单
  • 部门管理:可配置系统组织架构,树形表格展示
  • 岗位管理:配置各个部门的职位
  • 字典管理:可维护常用一些固定的数据,如:状态,性别等
  • 系统日志:记录用户操作日志与异常日志,方便开发人员定位排错
  • SQL监控:采用druid 监控数据库访问性能,默认用户名admin,密码123456
  • 定时任务:整合Quartz做定时任务,加入任务日志,任务运行情况一目了然
  • 代码生成:高灵活度生成前后端代码,减少大量重复的工作任务
  • 邮件工具:配合富文本,发送html格式的邮件
  • 七牛云存储:可同步七牛云存储的数据到系统,无需登录七牛云直接操作云数据
  • 支付宝支付:整合了支付宝支付并且提供了测试账号,可自行测试
  • 服务监控:监控服务器的负载情况
  • 运维管理:一键部署你的应用

项目结构

项目采用按功能分模块的开发方式,结构如下

  • eladmin-common 为系统的公共模块,各种工具类,公共配置存在该模块

  • eladmin-system 为系统核心模块也是项目入口模块,也是最终需要打包部署的模块

  • eladmin-logging 为系统的日志模块,其他模块如果需要记录日志需要引入该模块

  • eladmin-tools 为第三方工具模块,包含:邮件、七牛云存储、本地存储、支付宝

  • eladmin-generator 为系统的代码生成模块,支持生成前后端CRUD代码

详细结构

- eladmin-common 公共模块
    - annotation 为系统自定义注解
    - aspect 自定义注解的切面
    - base 提供了Entity、DTO基类和mapstruct的通用mapper
    - config 自定义权限实现、redis配置、swagger配置、Rsa配置等
    - exception 项目统一异常的处理
    - utils 系统通用工具类
- eladmin-system 系统核心模块(系统启动入口)
	- config 配置跨域与静态资源,与数据权限
	    - thread 线程池相关
	- modules 系统相关模块(登录授权、系统监控、定时任务、运维管理等)
- eladmin-logging 系统日志模块
- eladmin-tools 系统第三方工具模块
- eladmin-generator 系统代码生成模块

特别鸣谢

  • 感谢 PanJiaChen 大佬提供的前端模板

  • 感谢 Moxun 大佬提供的前端 Curd 通用组件

  • 感谢 zhy6599 大佬提供的后端运维管理相关功能

  • 感谢 j.yao.SUSE 大佬提供的匿名接口与Redis限流等功能

  • 感谢 d15801543974 大佬提供的基于注解的通用查询方式

项目捐赠

项目的发展离不开你的支持,请作者喝杯咖啡吧☕ Donate

反馈交流

  • QQ交流群:891137268 、947578238、659622532

eladmin's People

Contributors

1797890817 avatar 18331247943 avatar aborn avatar d15801543974 avatar dependabot[bot] avatar edinjohn avatar elunez avatar erichetti avatar everhopingandwaiting avatar imjyz avatar jhpx avatar jiefei30 avatar jinlongliao avatar kdjj2006 avatar l2063610646 avatar lihengcn avatar linlihuiyang avatar lj-zhu avatar lwohvye avatar shanezhiu avatar tiki-77 avatar tsln1998 avatar wtune avatar xiaoyonghaoe avatar yangzongzhuan avatar yuankangli avatar yuchumian avatar yujr1990 avatar zanjs avatar zhy6599 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

eladmin's Issues

我使用你线上演示项目的时候发现了一个bug

如果我把你普通用户角色的权限全部删除,然后我再去登陆,登陆页面就卡住了,然后我看了一下网络信息,发现一直在循环请求登陆接口,应该是你登陆逻辑那块地方有什么问题。

提一个有关角色的建议

我在创建角色时发现以下问题。
我有一个超级管理员,现在见一个普通管理员,赋予普通管理员创建用户
的权限,然后只拥有普通管理员角色的用户在创建角色时可以选择
超级管理员者这个角色。
我在想能不能给角色分配一个level属性。
image
image

insert建议封装批量插入

jap里的 saveAll 其实是一条一条插入的,所以建议封装一个内部使用原生sql的批量插入,提高性能

项目启动报错

Field menuMapper in me.zhengjie.system.service.impl.MenuServiceImpl required a bean of type 'me.zhengjie.system.service.mapper.MenuMapper' that could not be found.

The injection point has the following annotations:
- @org.springframework.beans.factory.annotation.Autowired(required=true)

Action:

Consider defining a bean of type 'me.zhengjie.system.service.mapper.MenuMapper' in your configuration.

条件查询报错

条件查询报错

Unable to locate Attribute with the the given name [test_name] on this ManagedType [me.zhengjie.modules.test.domain.TestInfo]; nested exception is java.lang.IllegalArgumentException: Unable to locate Attribute with the the given name [test_name] on this ManagedType [me.zhengjie.modules.test.domain.TestInfo]

返回结果时间全局格式化

我在application.yml中配置了返回结果全局时间格式化但是没有生效。
spring:
profiles:
active: dev
jackson:
date-format: yyyy-MM-dd'T'HH:mm:ss.SSS'Z'
time-zone: GMT+8
serialization:
write-dates-as-timestamps: false

ould not execute statement; SQL

ould not execute statement; SQL [n/a]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement

启动报错,

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
elAdmin- 2019-03-20 12:03:25 [main] ERROR o.s.b.d.LoggingFailureAnalysisReporter -


APPLICATION FAILED TO START


Description:

Field menuMapper in me.zhengjie.modules.system.service.impl.MenuServiceImpl required a bean of type 'me.zhengjie.modules.system.service.mapper.MenuMapper' that could not be found.

The injection point has the following annotations:
- @org.springframework.beans.factory.annotation.Autowired(required=true)

Action:

Consider defining a bean of type 'me.zhengjie.modules.system.service.mapper.MenuMapper' in your configuration.

定时任务添加Bean 报错

作者你好,我按着你的demo尝试了定时任务,使用了@component然后后台报了No bean named 'OverdueTask' available,OverdueTask是我定义的一个Bean,希望你可以抽空帮我看看,谢谢了
overdue2
overdue4
overdue5

您好,启动插入数据报错,申请加入反馈群提示不允许新成员加入

Log信息如下:



elAdmin- 2019-05-15 12:02:50 [main] INFO  jdbc.sqlonly - create table visits (id bigint not null auto_increment, create_time datetime, date varchar(255), 
ip_counts bigint, pv_counts bigint, week_day varchar(255), primary key (id)) engine=InnoDB 

elAdmin- 2019-05-15 12:02:50 [main] INFO  jdbc.sqlonly - alter table dict drop index UK_801vlclah89ymu7dppibe5flo 

elAdmin- 2019-05-15 12:02:50 [main] ERROR jdbc.sqlonly - 5. Statement.execute(alter table dict drop index UK_801vlclah89ymu7dppibe5flo) alter table dict drop index UK_801vlclah89ymu7dppibe5flo 

java.sql.SQLSyntaxErrorException: Can't DROP 'UK_801vlclah89ymu7dppibe5flo'; check that column/key exists
	at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120)
	at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)
	at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
	at com.mysql.cj.jdbc.StatementImpl.executeInternal(StatementImpl.java:782)
	at com.mysql.cj.jdbc.StatementImpl.execute(StatementImpl.java:666)
	at net.sf.log4jdbc.sql.jdbcapi.StatementSpy.execute(StatementSpy.java:923)
	at com.alibaba.druid.filter.FilterChainImpl.statement_execute(FilterChainImpl.java:2958)
	at com.alibaba.druid.filter.FilterAdapter.statement_execute(FilterAdapter.java:2473)
	at com.alibaba.druid.filter.FilterEventAdapter.statement_execute(FilterEventAdapter.java:188)
	at com.alibaba.druid.filter.FilterChainImpl.statement_execute(FilterChainImpl.java:2956)
	at com.alibaba.druid.proxy.jdbc.StatementProxyImpl.execute(StatementProxyImpl.java:147)
	at com.alibaba.druid.pool.DruidPooledStatement.execute(DruidPooledStatement.java:619)
	at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:54)
	at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.applySqlString(AbstractSchemaMigrator.java:559)
	at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.applySqlStrings(AbstractSchemaMigrator.java:504)
	at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.applyUniqueKeys(AbstractSchemaMigrator.java:374)
	at org.hibernate.tool.schema.internal.GroupedSchemaMigratorImpl.performTablesMigration(GroupedSchemaMigratorImpl.java:85)
	at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.performMigration(AbstractSchemaMigrator.java:207)
	at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.doMigration(AbstractSchemaMigrator.java:114)
	at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:183)
	at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:72)
	at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:310)
	at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:467)
	at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:939)
	at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:57)
	at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:365)
	at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:390)
	at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:377)
	at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:341)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1804)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1741)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:576)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:498)
	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
	at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:367)
	at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:110)
	at org.springframework.beans.factory.support.ConstructorResolver.resolveConstructorArguments(ConstructorResolver.java:660)
	at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:478)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1288)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1127)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:538)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:498)
	at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(BeanDefinitionValueResolver.java:312)
	at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:131)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1648)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1400)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:575)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:498)
	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
	at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:273)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1239)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1166)
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:593)
	at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:90)
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:374)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1378)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:575)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:498)
	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
	at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:273)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1239)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1166)
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:593)
	at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:90)
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:374)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1378)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:575)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:498)
	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
	at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:273)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1239)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1166)
	at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:855)
	at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:758)
	at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:218)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1308)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1154)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:538)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:498)
	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:204)
	at org.springframework.boot.web.servlet.ServletContextInitializerBeans.getOrderedBeansOfType(ServletContextInitializerBeans.java:236)
	at org.springframework.boot.web.servlet.ServletContextInitializerBeans.addAsRegistrationBean(ServletContextInitializerBeans.java:192)
	at org.springframework.boot.web.servlet.ServletContextInitializerBeans.addAsRegistrationBean(ServletContextInitializerBeans.java:187)
	at org.springframework.boot.web.servlet.ServletContextInitializerBeans.addAdaptableBeans(ServletContextInitializerBeans.java:169)
	at org.springframework.boot.web.servlet.ServletContextInitializerBeans.<init>(ServletContextInitializerBeans.java:89)
	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.getServletContextInitializerBeans(ServletWebServerApplicationContext.java:250)
	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.selfInitialize(ServletWebServerApplicationContext.java:237)
	at org.springframework.boot.web.embedded.tomcat.TomcatStarter.onStartup(TomcatStarter.java:54)
	at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5098)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1429)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1419)
	at java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:266)
	at java.util.concurrent.FutureTask.run(FutureTask.java)
	at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
	at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:134)
	at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:944)
	at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:839)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1429)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1419)
	at java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:266)
	at java.util.concurrent.FutureTask.run(FutureTask.java)
	at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
	at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:134)
	at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:944)
	at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:261)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
	at org.apache.catalina.core.StandardService.startInternal(StandardService.java:422)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
	at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:770)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
	at org.apache.catalina.startup.Tomcat.start(Tomcat.java:370)
	at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.initialize(TomcatWebServer.java:106)
	at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.<init>(TomcatWebServer.java:86)
	at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getTomcatWebServer(TomcatServletWebServerFactory.java:414)
	at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getWebServer(TomcatServletWebServerFactory.java:174)
	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.createWebServer(ServletWebServerApplicationContext.java:179)
	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:152)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:540)
	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:140)
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:775)
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:316)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1260)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1248)
	at me.zhengjie.AppRun.main(AppRun.java:20)
elAdmin- 2019-05-15 12:02:50 [main] INFO  jdbc.sqlonly - alter table dict add constraint UK_801vlclah89ymu7dppibe5flo unique (name) 

密码验证问题

成功启动项目后,输入用户名admin密码123456,登录失败,报密码错误异常,info如下,只截取了部分:) :

elAdmin- 2019-04-29 20:28:48 [http-nio-8000-exec-1] ERROR m.z.e.handler.GlobalExceptionHandler - me.zhengjie.exception.BadRequestException: 密码错误
	at me.zhengjie.aspect.DataScopeAspect.logAround(DataScopeAspect.java:51)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:644)
	at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:633)
	at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175)

经debug,发现在AuthenticationController类的login方法中,发现问题,下面是经EncryptUtils.encryptPassword(authorizationUser.getPassword());加密后的用户输入密码:
201904292036
而数据库中admin对应的密码为:
201904292038

erz二者不一致,所以可能encryptPassword更新了加密算法,但数据库未及时更新,望解决。

启动报错

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [com/alibaba/druid/spring/boot/autoconfigure/DruidDataSourceAutoConfigure.class]: Invocation of init method failed; nested exception is java.sql.SQLSyntaxErrorException: Unknown database 'eladmin'
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1745)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:576)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:498)
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:273)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.addCandidateEntry(DefaultListableBeanFactory.java:1455)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1419)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveMultipleBeans(DefaultListableBeanFactory.java:1338)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1197)
at org.springframework.beans.factory.support.DefaultListableBeanFactory$DependencyObjectProvider.getIfAvailable(DefaultListableBeanFactory.java:1868)
at org.springframework.boot.actuate.autoconfigure.jdbc.DataSourceHealthIndicatorAutoConfiguration.(DataSourceHealthIndicatorAutoConfiguration.java:78)
at org.springframework.boot.actuate.autoconfigure.jdbc.DataSourceHealthIndicatorAutoConfiguration$$EnhancerBySpringCGLIB$$7906ebe7.()
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:172)
... 129 common frames omitted
Caused by: java.sql.SQLSyntaxErrorException: Unknown database 'eladmin'
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:835)
at com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:455)
at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:240)
at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:207)
at net.sf.log4jdbc.sql.jdbcapi.DriverSpy.connect(DriverSpy.java:401)
at com.alibaba.druid.filter.FilterChainImpl.connection_connect(FilterChainImpl.java:156)
at com.alibaba.druid.filter.stat.StatFilter.connection_connect(StatFilter.java:218)
at com.alibaba.druid.filter.FilterChainImpl.connection_connect(FilterChainImpl.java:150)
at com.alibaba.druid.pool.DruidAbstractDataSource.createPhysicalConnection(DruidAbstractDataSource.java:1560)
at com.alibaba.druid.pool.DruidAbstractDataSource.createPhysicalConnection(DruidAbstractDataSource.java:1623)
at com.alibaba.druid.pool.DruidDataSource.init(DruidDataSource.java:861)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeCustomInitMethod(AbstractAutowireCapableBeanFactory.java:1870)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1813)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1741)
... 148 common frames omitted

JwtAuthorizationTokenFilter校验token时有一点问题

通过token 获取username
username = jwtTokenUtil.getUsernameFromToken(authToken);
通过username获取用户信息
UserDetails userDetails = this.userDetailsService.loadUserByUsername(username);
校验token是否有效
jwtTokenUtil.validateToken(authToken, userDetails)
判断条件里
JwtUser user = (JwtUser) userDetails;
final String username = getUsernameFromToken(token);
username.equals(user.getUsername())
本来用户信息就是根据token获取的用户名来获取的
然后你又比较这个获取的用户信息内的用户名与token获取的用户名是否相等.....
好像没什么意义

给作者的5个建议。项目很棒!!

给作者几个建议:
1.权限管理和菜单管理不建议分开,因为这样会到时权限和菜单不统一的问题,而且分开配置略多一步;
2.持久层建议用mybatis plus
3.swagger文档建议换成其他版本的,该版本用起来好变扭
4.所有接口的响应,建议采用如下格式:
4.1 非分页响应固定字段,code,message,data
4.2 分页响应固定字段,code,message,data,totalSize
5.登录页面比较普通,有一点low,建议优化,其他页面超级漂亮

总体来说,eladmin,界面超级漂亮,代码逻辑比较优化,给作者100个赞!!继续加油

是否考虑增加一些功能

很棒,现有功能作为管理平台的脚手架已经涵盖了基本功能

是否考虑增加下如下功能:

1、没有给任何权限的菜单是否可以隐藏掉
因为既然不给某菜单的任何权限,那么菜单树上觉得也没有必要看见菜单了;

2、消息通知
例如系统运行中发生了异常,可以发生站内通知,也可以同时发送管理员邮箱;

3、用户在线状态,可踢下线
在用户管理列表中,支持查看用户在线状态,在线的用户,管理员或者有权限的用户可以强制下线;

以上,不知是否合理?

update建议封装一个可以更新不为空的字段的方法

还有这个更新,save也是更新,但是他会更新所有字段,所以现在一般都是查询出原来的,然后set新的值进行更新,建议封装一个更新模型里不为空的字段,很多情况下我们只要更新表里的几个字段

发送邮件bug

假如我第一次配置正确之后,发送邮件成功。然后无论怎么修改配置,依然发送成功。
假如我第一次配置不正确,发送邮件不成功。然后无论怎么修改配置,依然发送失败。

代码生成页面分页显示数据问题

第一页显示没有问题;
第二页开始显示出现问题;
查看了源代码发现:GeneratorServiceImpl页面的getTables方法下语句query.setMaxResults(startEnd[1])有问题,此处的逻辑是设置最大返回记录数的值,应该修改为query.setMaxResults(startEnd[1]-startEnd[0])。

eladmin-qt 前端 公共组件TreeTable报错

eladmin作者,你好。本人在使用eladmin时发现,前端公共组件TreeTable报错,提示缺少row-key,如下:
000

在TreeTable的index.vue中的el-table加上 row-key="id",报错如下:
002

综上,初步怀疑是TreeTable的eval.js处理数据不恰当,希望作者能抽空验证我的猜疑是否正确,并予以回复,感谢!

LoggingRepository sql需要优化一下

mysql5.7版本以上可能会报only_full_group_by的错误。

select count(*) FROM (select * FROM log where createTime between ?1 and ?2 GROUP BY requestIp) as s

建议优化为

select count(*) FROM (select requestIp FROM log where createTime between ?1 and ?2 GROUP BY requestIp) as s

登陆成功后,请求接口问题

楼主,您好。我在登陆成功之后,去请求任何一个接口,都会被拦截,返回 401错误,
"status": 401,
"error": "Unauthorized",
"message": "Full authentication is required to access this resource",
"path": "/api/roles",请问是我请求的有问题吗?每次请求,我都在 token的位置,填写登陆后返回的token,若楼主看到,麻烦回复下,我加您qq群,提示禁止加入了,有劳了。 595985964

密码验证和修改bug

/users/validPass/{pass}
/users/updatePass/{pass}

PATH传输密码
1)不安全
2)如果有特殊字符,会有url解析问题,如密码以?结尾,解析后会丢失

项目很棒,几个建议

1、持久层建议不要更换,很难得国内框架不用Mybatis的。
2、建议增加部门、岗位。对应角色权限可以按照部门来划分范围。岗位可以用于很多流程设计。
3、外链增加框架内显示。

项目很棒。作者加油

建议分页封装一下

建议使用原生sql,分页一般要很多条件,使用JPA的很麻烦,建议进行封装一下

Swagger扫描路径有问题

@ComponentScan(basePackages = {"me.zhengjie.core.rest","me.zhengjie.system.rest","me.zhengjie.system.monitor"})

me.zhengjie.system.monitor这个扫描包路径错误

关于测试的问题

楼主这个单测有点难搞啊,比如说我在其他模块log,tools里面写单测,关系是不是有点乱。我搞了半天没搞出来,在其他模块总会有Could not resolve placeholder 'spring.redis.host' in value "${spring.redis.host}"。

导出的SQL存在问题

DROP TABLE IF EXISTS roles_menus;
CREATE TABLE roles_menus (
role_id bigint(20) NOT NULL COMMENT '角色ID',
menu_id bigint(20) NOT NULL COMMENT '菜单ID',
PRIMARY KEY (menu_id, role_id) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

这样就OK了

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.