JeeSite学习记录

JeeSite学习笔记

开发环境

  • java 1.8.0

在这里插入图片描述

  • Maven 3.6.2 --D:\apache-maven-3.6.2

在这里插入图片描述

  • Intellij IDEA
  • Mysql 8.0
  • Git – ToroiseGit

本地运行测试

  • 执行脚本/web/bin/run-tomcat.bat
  • 访问 http://127.0.0.1:8980/js/ 账号 system 密码 admin

开发环境部署

导入到IDEA

  1. 获取源码
  2. 拷贝web文件夹,到工作目录,重命名为:jeesite-test
  3. 打开pom.xml文件,找到jeesite-web的artifactId元素,修改为jeesite-test
  4. Eclipse:菜单 File -> Import,然后选择 Maven -> Existing Maven Projects,点击 Next> 按钮,选择第2步的 jeesite-test 文件夹,然后点击 Finish 按钮,即可成功导入。
  5. IDEA:点击 Open 或 Import Project,选择 pom.xml 文件(若包含所有源码包,你需要选择 jeesite/root/pom.xml 文件),点击 Next 按钮,选择 Import Maven projects automatically 复选框,然后一直点击 Next 按钮,直到点击 Finish 按钮,即可成功导入。
问题
  • 错误1(IDEA)
Could not transfer artifact xxx from/to maven-default-http-blocker (http://0.0.0.0/)
  • 解决方法
手动删除 settings.xml 里的 id 为 maven-default-http-blocker 镜像,因为 maven 3.8 版本后增加了这个镜像,导致的请求错误;IDEA 下请打开 IDEA 所在安装目录,找到 \plugins\maven\lib\maven3\conf\settings.xml 文件,并删除 maven-default-http-blocker 镜像配置。
  • 未解决为题:(pom.xml)
    1. Cannot resolve directory ‘parent’
    2. Plugin ‘org.apache.maven.plugins:maven-war-plugin:’ not found
    3. Plugin ‘org.apache.maven.plugins:maven-eclipse-plugin:’ not found

初始化数据库

  1. 配置JDBC链接 /src/main/resources/config/application.yml
## 产品或项目名称、软件开发公司名称
productName: 修改为你的产品名称
companyName: 修改为你的公司名全称

## 产品版本、版权年份
productVersion: V4.3
copyrightYear: 2022

## 数据库连接
jdbc: 

  # MySql 数据库配置(提示:v4.2 及之后使用 MySql 8.x 驱动类的配置方法)
  type: mysql
  driver: com.mysql.cj.jdbc.Driver
  url: jdbc:mysql://127.0.0.1:3306/jeesite?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=CONVERT_TO_NULL&serverTimezone=UTC
  username: root
  password: 123456
  testSql: SELECT 1

  ## MySql 数据库配置(提示:v4.1 及之前使用 MySql 5.x 驱动类的配置方法)
  type: mysql
  driver: com.mysql.jdbc.Driver
  url: jdbc:mysql://127.0.0.1:3306/jeesite?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull
  username: jeesite
  password: jeesite
  testSql: SELECT 1
  1. 初始化数据库/web/bin/init-data.bat

启动服务

  1. Eclipse:找到 Application.java(专业版:ProApplication.java)启动文件并打开,然后在空白处右键,点击 Debug As -> Java Application 即可启动服务。
  2. IDEA:右上选择 Application(专业版:ProApplication)运行配置,点击 Debug 图标,启动服务。如果启动的时候提示 NoClassDefFoundError: javax/servlet/ServletOutputStream 错误,请修改 web 项目下的 pom.xml,注释掉 spring-boot-starter-tomcat<scope>provided</scope> 即可。

运行测试

  1. 访问http://127.0.0.1:8980/js
  2. 账号:system 密码:admin
  3. [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3qHvWWlo-1678673430427)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\image-20221220140355858.png)]

清理Demo数据

DELETE FROM js_sys_post;
DELETE FROM js_sys_office;
DELETE FROM js_sys_company;
DELETE FROM js_sys_employee;
DELETE FROM js_sys_employee_post;
DELETE FROM js_sys_role WHERE role_code NOT IN ('corpAdmin','default');
DELETE FROM js_sys_role_data_scope;
DELETE FROM js_sys_user WHERE user_code NOT IN ('system','admin');
DELETE FROM js_sys_user_data_scope;
DELETE FROM js_sys_user_role;
DELETE FROM js_sys_log;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4EoMhrgF-1678673430433)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\image-20221220140739258.png)]

新建模块工程

进入菜单:系统管理 -> 系统设置 -> 模块管理,新建一个模块:

  • 模块名称: 测试模块
  • 模块编码:test
  • 生成基础路径:D:\JeeSite_workspace
  • 代码生成模板:生成模块代码

点击“保存并生成代码”

打开/root/pom.xml文件,拷贝…/modules/core到新的一行,修改为模块名如:…/modules/test

在需要用到的项目引入新的模块,如在web项目下使用,则打开/web/pom.xml文件加入:

<dependency>
	<groupId>com.jeesite</groupId>
	<artifactId>jeesite-module-test</artifactId>
	<version>${project.parent.version}</version>
</dependency>

IDEA 会自动检测 root 模块的依赖,并自动导入

创建模块结束

问题

  1. 创建模块之后的用法----->

建表以及ErMaster的使用

ErMaster安装方式

  1. 下载Eclipse的ErMaster插件安装包:https://gitee.com/thinkgem/ermasterr
  2. 找到plugins中的jar包:D:\JeeSite\ermasterr-master.zip\ermasterr-master\dropins\ermasterr\eclipse\plugins

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0thYxIdX-1678673501329)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\image-20221223133418906.png)]

  1. 复制到Eclipse的plugins中,启动Eclipse

ErMaster使用以及建表

  1. 打开表的模板

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XD3C64kE-1678673501330)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\image-20221223222614537.png)]

  1. 打开table,双击表视图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A7QoD1AI-1678673501332)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\image-20221223222655606.png)]

  1. 添加字段

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KwZqatpm-1678673501333)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\image-20221223222817750.png)]

  1. 内置字段组

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EPvyinPK-1678673501335)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\image-20221223222949372.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VEwwJFYw-1678673501338)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\image-20221223223002800.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-prZwC8lq-1678673501339)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\image-20221223223019248.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7wrQfxsW-1678673501343)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\image-20221223223032551.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YersVqCG-1678673501344)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\image-20221223223058705.png)]

  1. 新增公共字段

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TOtJmXqW-1678673501347)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\image-20221223223435424.png)]

img

img

img

  1. 导出表

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oaGEp24g-1678673501350)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\image-20221223223555890.png)]

菜单权限、功能权限、资源权限、按钮权限、Shiro

用户身份认证

验证用户身份的合法性:

最常用的用户身份验证的方法:

  1. 用户名、密码方式:通过登录界面进入系统
  2. 用户名、安全密钥方式:通过SSO接口或OAuth2接口进入系统
  3. 基于硬件或证书验证方法:通过特定的硬件或证书进入系统

也就是说,系统验证用户身份合法,用户方可访问系统的资源。

  • 主体对象(Subject):理解为用户,可能是程序,都要去访问系统的资源,系统需要对subject进行身份认证,获取方法:UserUtils.getSubject()
  • 身份信息(Principal):通常是唯一的,一个主体还有多个身份信息,但是都有一个主身份信息(Primary principal),获取方法:UserUtils.getLoginInfo()

用户权限授权

是对用户身份认证的细化。可简单理解为访问控制,在用户身份认证通过后,系统对用户访问菜单或按钮进行控制。也就是说,该用户有身份进入系统了,但他不一定能访问系统里的所有菜单或按钮,而他只能访问管理员给他分配的权限菜单或按钮。

主要包括:

  • Permission(权限标识、权限字符串):针对系统访问资源的权限标识,如:用户添加、用户修改、用户删除,判断方法:UserUtils.getSubject().isPermitted(permissions);
  • Role (角色):可以理解为权限组,也就是说角色下可以访问和点击哪些菜单、访问哪些权限标识。

权限标识或权限字符串校验规则:

  • 权限字符串:指定权限串必须和菜单中的权限标识匹配才可访问
  • 权限字符串命名规范为:模块:功能:操作,例如:sys:user:edit
  • 使用冒号分隔,对授权资源进行分类,如 sys:user:edit 代表 系统模块:用户功能:编辑操作
  • 设定的功能指定的权限字符串与当前用户的权限字符串进行匹配,若匹配成功说明当前用户有该功能权限
  • 还可以使用简单的通配符,如 sys:user:*,建议省略为 sys:user(分离前端不能使用星号写法)
  • 举例1 sys:user 将于 sys:usersys:user: 开头的所有权限字符串匹配成功
  • 举例2 sys 将于 syssys: 开头的所有权限字符串匹配成功

权限管理模型

JeeSite 中的权限管理关键数据模型如下:

  • 用户:登录账号、密码、用户类型
  • 角色:角色名称、归属用户类型
  • 菜单:菜单名称、菜单URL、权限标识
  • 用户角色关系:用户编码、角色编码
  • 角色菜单关系:角色编码、菜单编码

关系图如下:

【用户】  <---多对多--->  【角色】  <---多对多--->  【菜单/权限】

权限配置步骤

  1. 进入菜单管理:新增菜单和权限。其中权限类型的菜单,也可理解为系统资源,不会显示到用户菜单树中。
  2. 菜单中的 “权限标识” 即 Permission 是控制权限的关键字段,系统根据该权限标识 与 Controller 内指定的 @RequiresPermissions 注解进行对应,匹配成功后才可以访问该 URL 地址,此例是注解式验证。另外还有编程式、视图页面、URI控制方式,详见下文。
  3. 菜单配置完成后,进入角色管理:新增并给角色的功能权限,勾选对应的菜单和权限,建立角色菜单的关系。
  4. 角色配置完成后,进入机构管理及用户管理,创建机构,创建用户,选择相应角色,建立用户和角色关系。
  5. 这样整个权限体系建立完成,用户登录系统后,就可以通过用户关联的角色,获取菜单/权限了。
  6. 若提示“403 - 您的操作权限不足”,说明对应的 URL 当前用户没有权限访问,检查 Controller 的映射方法上的 @RequiresPermissions 注解,是否在 “菜单管理” 里的 “权限字符串” 中配置了,并且当前用户对应的角色是否拥有该权限菜单。

管理员类型

  • 超级管理员:主要为开发者使用的最高级别管理员,主要用于开发和调试,有些修改会直接影响系统的正常运行。
  • 系统管理员:主要为客户方使用的管理员,用于一些基础数据配置,如机构、用户、权限、用户字典等,默认账号为admin。
  • 二级管理员,是由系统管理员指定的,可以分担系统管理员的工作,可以管理用户、分配菜单权限和操作权限一种特殊角色,但它仅具备系统管理员指定范围的管理数据。

菜单权重

菜单权重是指什么样的用户或管理员可以操作或访问什么级别的菜单,对菜单的权重级别进行划分,比如:比较重要敏感的菜单,只有管理员才可以拥有。如下:

  1. 超级管理员可以访问二级管理员、系统管理员、超级管理员权重的菜单,但不允许访问默认权限(业务菜单);
  2. 系统管理员可以访问超级管理员指定给他的系统管理员及以下权限的部分菜单;
  3. 二级管理员可以访问超级或系统管理员指定给他的二级管理员及以下的部分菜单;
  4. 普通用户只能访问管理员指定给他的默认权重的菜单。

菜单权重的设置,会影响角色授权菜单的时候,列出的菜单和权限列表:

  1. 如果当前用户管理身份为二级管理员,则列出的是二级管理员菜单权重以下的菜单;
  2. 如果当前用户管理员身份是系统管理,则列出的是系统管理员菜单权重以下的菜单;
  3. 如果当前用户管理员身份是超级管理员,则列出的是超级管理员菜单权重下的菜单。

此举是为了更好的提高授权安全,不能越级授权,权限互相牵制等。

四种授权方式

  • 编程式:通过 if/else 代码块来完成。
  • 注解式:通过在执行的方法上放置相应的注解来完成,没有权限则抛出相应异常。
  • 视图页面: 在视图页面(Beetl/JSP)通过相应的标签完成。
  • 基于URI拦截:根据URI匹配,决定访问权限。
编程式

场景:编辑和审核共用一个资源,可以在资源内判断是否有审核权限,然后再去执行对应操作

Subject subject = UserUtils.getSubject();
subject.isAuthenticated();            // 是否身份验证授权通过
subject.isPermitted(permission);      // 验证权限字符串
subject.isPermittedAll(permissions);  // 验证权限字符串全部通过
subject.hasRole(roleIdentifier);      // 验证是否有角色权限

例如:

if (subject.isPermitted("sys:user:edit")){
    System.out.pirntln("当前用户有编辑用户权限");
}
注解式

场景:对 URL 资源、按钮 等操作进行权限过滤,如果用户跳过了界面验证,直接去访问 URL 地址也需要经过授权验证的。

在Controller的方法上指定如下注解:

  • @RequiresPermissions (value={“sys:user:view”, “sys:user:edit”}, logical= Logical.OR):表示当前 Subject 需要权限 user:view 或 user:edit。
  • @RequiresRoles(value={“admin”, “user”}, logical=Logical.AND):表示当前 Subject 需要角色 admin 和 user
  • @RequiresAuthentication:表示当前Subject已经通过login进行了身份验证;
  • @RequiresUser:表示当前 Subject 已经身份验证或者通过记住我登录的。
  • @RequiresGuest:表示当前Subject没有身份验证或通过记住我登录过,即是游客身份。

例如:

@RequiresPermissions(value="sys:user:edit")
@PostMapping(value = "save")
@ResponseBody
public String save(@Validated User user, HttpServletRequest request) {
}
视图页

场景:在视图上通过权限字符串,控制某个按钮或某个信息是否显示,提高用户体验。

判断是否有该权限:

  • 单个权限验证:${hasPermi(‘sys:user:edit’)}
  • 多个AND关系:${hasPermi(‘sys:user:view,sys:user:edit’, ‘and’)}
  • 多个OR关系:${hasPermi(‘sys:user:view,sys:user:edit’, ‘or’)}

例如:

<% if(hasPermi('sys:user:edit')){ %>
	<a href="${ctx}/sys/user/form" class="btn btn-default btnTool"
	    title="新增用户"><i class="fa fa-plus"></i> 新增</a>
<% } %>

判断是否有某角色:

  • 单个权限验证:${hasRole(‘ceo’)}
  • 多个AND关系:${hasRole(‘ceo,dept’, ‘and’)}
  • 多个OR关系:${hasRole(‘ceo,dept’, ‘or’)}

例如:

<% if(hasRole('ceo')){ %>
	<span>ceo</span>
<% } %>
基于RUI拦截

场景:当不方便利用编程式、注解式等方式过滤权限时,可以使用 URI 控制权限,或全局控制某个 URI 地址的权限

application.yml(4.0.x:jeesite.yml):

shiro:
  # URI 权限过滤器定义
  filterChainDefinitions: |
    /ReportServer/** = user
    ${adminPath}/** = user

格式:

URI地址及通配符 = 过滤器名称(支持多个,用英文逗号分隔并加双引号)

以上权限过滤器定义配置,是依照由上到下的第一次匹配优先原则,优先匹配成功的URI优先受用,支持通配符。

URI通配符:

?  :匹配一个字符。
*  :匹配零个或多个字符串。
** :匹配路径中的零个或多个路径。

认证过滤器名称:

  • anon: 例如 /a/file/**=anon 没有参数,表示不需要登录,就可以访问资源
  • user: 例如 /a/sys/user/**=user 没有参数,表示必须用户登录后才能访问资源,当登入操作时不做检查
  • authc: 例如 /a/login=authc 没有参数,表示需要登录认证才能访问资源,一般用于登录接口

授权过滤器名称:

  • perms:例如/a/sys/user/**=perms[user:add:*],参数可以写多个,多个时必须加上引号,并且参数之间用逗号分割,例如/a/sys/user/**=perms["user:add:*,user:modify:*"],当有多个参数时必须每个参数都通过才通过,想当于isPermitedAll()方法。
  • roles:例如/a/sys/user/**=roles[admin],参数可以写多个,多个时必须加上引号,并且参数之间用逗号分割,当有多个参数时,例如/a/sys/user/**=roles["admin,guest"],每个参数通过才算通过,相当于hasAllRoles()方法。

**注意事项:**增加新的过滤器的时候,不要删掉默认的过滤器,顺序从上到下依次匹配,先符合条件的优先使用。如果默认的过滤器被删除,会话超时后,将不会跳转到登录页,则直接返回403页面。

我的测试

增加一个用户管理模块

  1. 启动服务

  2. 登录–http://127.0.0.1:8980/js

  3. 账号:system 密码:admin

  4. 用户管理[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4Cjm71M7-1678673501353)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\image-20221231135927353.png)]

  5. 建表

    1. 在eclipse中找到core.erm(jeesite官方提供的表模板)在这里插入图片描述

    2. 找到用户表的模板用户表

    3. 导出表

    4. 在数据库中导入新的表在这里插入图片描述

  6. 使用研发工具中–代码生成工具
    在这里插入图片描述

    1. 找到刚刚导入的表在这里插入图片描述

    2. 新增的信息–基本信息–字段信息–生成信息
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

    3. 点击下一步–保存并生成代码在这里插入图片描述
      在这里插入图片描述

    4. 在这里插入图片描述

  7. 查看生成的代码在这里插入图片描述

  8. 将新模块添加到系统中

    1. 在这里插入图片描述

    2. 在后台的管理菜单面板中找到系统设置->菜单管理->组织管理->用户管理在这里插入图片描述

    3. 进入用户管理页面在这里插入图片描述

    4. 在用户管理中新增下级菜单在这里插入图片描述
      新增的下级菜单

    5. 为系统管理员添加权限
      在这里插入图片描述
      在这里插入图片描述

    6. 重启服务,即可。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Jeesite Vue是一个基于Jeesite和Vue.js的前后端分离开发框架。通过使用Jeesite Vue,开发者可以快速构建现代化的Web应用程序。Jeesite Vue提供了一系列学习资源和工具,可以帮助开发者更好地使用该框架。 在学习Jeesite Vue时,你可以参考以下学习网站和工具: - Jeesite官网:https://jeesite.com/docs/ 提供了详细的Jeesite文档,包括Jeesite Vue的使用指南和示例代码。 - Uniapp官网:https://uniapp.dcloud.io/ 是一个跨平台的开发框架,可以用于开发Jeesite Vue的前端部分。 - Uview官网:https://www.uviewui.com/components/intro.html 是一个基于Vue.js的UI组件库,可以帮助你快速构建漂亮的界面。 - Uniapp插件市场官网:https://ext.dcloud.net.cn/ 提供了丰富的Uniapp插件,可以扩展Jeesite Vue的功能。 - 白话Uniapp:https://ask.dcloud.net.cn/article/35657 是一个适合前端有基础的人学习Uniapp的教程。 - Flex布局:https://www.runoob.com/w3cnote/flex-grammar.html 是一个介绍Flex布局的教程,可以帮助你更好地布局Jeesite Vue的界面。 希望以上资源能够帮助你学习和使用Jeesite Vue。如果你有任何进一步的问题,请随时提问。 #### 引用[.reference_title] - *1* *2* [Jeesite-uniapp框架学习篇一(版本说明、工具网站、学习网站)](https://blog.csdn.net/zhouoxinxin/article/details/126221626)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [jeesite免登陆,及vue跨域访问jeeSite项目设置](https://blog.csdn.net/qq_36833168/article/details/89919399)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值