3.11
3.10号失败的原因 Mapper接口没加@mapper
实体层未set get
Pom加依赖,properties配置,实体层
Mapper层
增删改查
Mapper层主要想 参数和返回值
查:返回值Student类型 参数为int或者无 查询多条语句时 要用list<>
增、删、改:返回值一般为int 参数为Student类型的
增:public int insert(Student student)— studentMapper. insert>0 (boolean)
删: public int delete(integer id);—studentMapper.delete>0(boolean)
改:public int update(Student student)—studntMapper.update>0(boolean)
查:public list selectall();
public student selectById(integer id);
Controller层
@RestController @Resources或者@Autowired 表单一般用Post
增:返回用Objiect,用Request.getParameter(“name”).trim();接受用户传来的参数
注入到Student对象中,调用Service方法,用boolean接受,验证成功与否
(常用的json对象 jsonObject 用于传回给请求结果)
删:接受id,调用service方法,boolean类型接受
改:用Request.getParameter("").trim接受用户传参,用jsonObject返回
查:直接调用StudentService.allStudent
增删改查都用Object,public Object …(){ }
缺乏的知识:
Controller 更新歌手图片
public Object updateStudentPic(@RequestParam(“file”) MultipartFile avatorFile
,@RequestParam(“id”)int id) {}
对于查来说结果类型比较重要:resultType=Student
insert into student
id
update student
name=#{name}
where id = #{id}
根据性别查询
select name,age from student where sex = #{sex}
根据歌手名字模糊查询列表
select name,age from student where name like #{name}
3.12 Vue环境配置 配置linux Docker Linux redis shiro Git SpringCloud
jar包运行到linux
到镜像
Docker学习笔记:容器 仓库 镜像
服务器包含多个仓库,每个仓库又包含多个镜像,每个镜像有不同的标签(tag)
由镜像生成docker容器,一种容器运行一种服务
1.是什么
一次构建 处处运行
前提:熟悉linux命令和相关背景知识
Git相关知识
2.能干啥
Java工程师离不开linux系统
3.15 看anfangpingtai项目,熟悉项目
AfSequenceController逻辑
1.真实项目的业务
web层通用数据处理 BaseController
日期格式的字符串Date数据转换、设置请求分页数据、设置请求排序数据、
获取request、获取response、获取session、响应请求分页数据
AfAcspointtableController
@RequiresPermission(“system:acspointtable:view”)
2.缺乏知识
Thymeleaf应用:是一个跟Velocity、FreeMarker类似的模板引擎,可以完全的替代jsp
th标签整理 ${…}
用Swagger框架:1.接口的文档在线自动生成 2.功能测试
核心模块:com.ruoyi
shiro权限管理
3.Controlle方法上:
查询序列(分页 BaseController和TableDataInfo):@RequiresPermissions(“system:sequence:list”)权限
@PostMapping("/list")Post方式
@ResponseBody json数据转换
导出序列列表:@Log(…) 获取日志
查询序列列表用TableDateInfo(接受)–返回BaseController.getDataInfo(list) (储存数据) 从而完成响应请求(查询)和分页数据
(此项目接受数据和返回数据都是自己定义的实体和方法)
新增序列--新增保存序列(AjaxResult接受数据和BaseController):return toAjax(service.isnertAfSequence(afSequence))
protected AjaxResult toAjax(int rows){ return row>0?success():error(); }
用户点击--/add--/system/sequence/add(这一步才是真正的操作数据库)"
toAjax(................(int rows))
以AjaxRsult做返回给用户的消息类 操作中增删改 用BaseController.tpAjax(返回值必须是AjaxRsult类型)来判定是否操作成功。
AjaxResult(与用户交涉的返回值):操作消息提醒,里面包含 状态码 返回内容 数据对象 enum
BaseController.toAjax(一个判断):Mapper执行之后返回一个数值num,然后根据num是否大于零来返回success或者error(return rows > 0 ? success() : error();)
删除序列:用户点击删除,BaseController.toAjax(serviec.delete......................)判断并返回,AjaxResult显示操作结果。
修改序列(先根据seqName进行查找,数据报存到ModelMap)--修改报存序列(AjaxResult接受 BaseController.toAjax判断,需要时先查询修改的名字是否存在,再进行判断能否保存):
用户点击修改首先进行查找序列数据存储到ModelMap对象中,然后再进行数据库操作
查 增 删 改----BaseController(toAjax,getDataTable) AjaxResult TableDataInfo
(实际要操作数据库的方法上面都有@RequiresPermissions(" ") ,shiro进行验证 );
3.16 熟悉git,并尝试编写一个表的功能
修改和新增一般都是两个(一个@GetMapping(用于显示操作页面)一个@PostMapping)
删除增加修改 @Log(title = “sk”,businessType = BusinessType.DELETE)
AjaxResult交互 toAjax判断
git add.
git commit
git push
Ajax:onreadystatechange=function(){
}
异步对象的属性:readstate 表示异步对象请求的状态变化
创建--初始请求--发送请求--得到数据--数据处理完成
01234
异步对象的status属性,表示网络请求的状况的
3.17 熟悉若依框架
1.熟悉ruoyi
2.一个一个的看controller
KaTeX parse error: Expected '}', got 'EOF' at end of input: … if((this).width()<769){
paneHidden = true;
}
KaTeX parse error: Expected 'EOF', got '}' at position 145: …); }̲); 以….(ID名)即可。
(
"
a
)
.
c
l
i
c
k
(
f
u
n
c
t
i
o
n
(
)
)
标
签
选
择
器
("a).click(function(){}) 标签选择器
("a).click(function())标签选择器(‘p)、类选择器
(
′
.
m
y
C
l
a
s
s
′
)
、
i
d
选
择
器
('.myClass')、id选择器
(′.myClass′)、id选择器(’#myId’)
可以将URL中的/{xxx}通过@PathVariable(“xxx”)绑定到操作方法的入参中,区别于URL用?号传参。
shiro:拿到安全管理器(SecurityManager),简单易用 CacheManager 只会第一次调用数据库赋予权限,并存储到CacheManager
关键对象(subject) 主体 就是应用程序,用户
身份信息(Principal):具有唯一性,用户名、手机号、邮箱地址,一个主体必须有一个主身份。
凭证信息(credential):凭证信息,只有主体自己知道的安全信息,如密码、证书
认证的开发: 结合web项目使用。
shrio的配置文件:.ini结尾文件
流程:1.构建shiro.ini(用来学习shiro书写我们系统中相关权限数据)[users]
认证(创建一个类)
//创建安全管理器对象
Securitymanage securitymanage = new DefaultSecurityManage();
//给安全管理器设置realm
securitymanage.setReaalm(new IniRealm(""))
//SecurityUtils给全局安全工具类设置安全管理器
SecurityUtils.setSecurityManager(defaultSecurityManagee);
//关键对象 subject主体
new UsernamePasswordToken("","");
//创建令牌
subject.login(token);
7.自定义realm:将认证/授权数据的来源转为数据库的实现 extends AuthorizingRealm
AuthenticatingRealm 认证 realm doGetAuthenticationInfo
AuthorizingRealm 授权 realm doGetAuthorizationInfos
8.MD5和Salt的简介和执行流程说明
MD5:作用:一般用来加密或者签名
特点:MD5算法不可逆,无论内容相同无论执行多少次md5生成的结果始终是一致。
"123"========>fe1234542df.................穷举算法
生成结果:始终是一个36尽职32位长度的字符串
MD5操作:让自己的密码完成加密要在业务层(Service)做。
为了防止用户的密码(123456)被穷举算法计算出来,所以Service是Salt(盐)+MD5(123456+X*oq)
--1.根据用户名查询 2.比较密码 md5(123456+X*oq)
注册时生成随机盐,登录时先根据用户名查询盐(盐要存储)
9.shiro中MD5+Salt的实现
MD5Hash mh=new Md5Hash();
md5Hash.setBytes("".getBytes());
String s=md5Hash.toHex();
正常的使用MD5: MD5Hash mh=new Md5Hash("123");
使用MD5+salt处理
Md5Hash md5Hash1=new Md5Hash("123","C=X0*7ps");
使用MD5+salt+hash散列
Md5Hash md5Hash1=new Md5Hash("123","C=X0*7ps",1024);
使用算法(配置使用Md5算法)+认证中使用salt(在自定义clam中使用)+ hash散列(配置使散列)
-----认证流程完毕-----
10.shrio中的授权
授权可理解who(主体Subject)对what(which 资源Resource)进行how操作 ,三W对象。
有权限就有资源(认证之后 授权过程)
授权方式:(1) 基于角色的访问控制 (2)基于资源的访问控制
if(subject.hasRole("admin)){ 操作什么资源 } if(subject.isPermission("user:find:*")){ }(资源类型) (user:*:01 资源实例)
权限字符串:权限字符串的规则是:资源标识符:操作:资源实例标识符
用户创建权限:user:create,或user:create:* 用户修改实例001的权限:user:update:001 用户实例001的所有权限:user:*:001
11.shiro的授权实现(TestCustomerRealmAuthenticato和CustomerTealm配合使用)
在TestCustomerRealmAuthenticator(另一个CustomerMd5Realm、CustomerTealm)中,认证之下写授权
if(subject.isAuthenticated()){ 基于角色授权
基于多角色权限控制
是否具有其中一个角色
}
根据身份信息 用户名 获取 当前用户的角色信息,以及权限信息
基于权限字符串的访问控制 资源标识符:操作:资源类型
12.shiro整合springboot整合思路
ShiroFilter处理所有请求(认证授权)
ShiroFilter--SecurityManage--Realm认证通过之后然后才可访问
13. shiro整合springboot之环境搭配
配置系统受限资源
配置系统公共资源
15.shiro整合springboot实现项目中认证和退出(shiro配置、使用、自制Realm---UserController、*CustomerRealm*、ShiroConfig、login.jsp、index.jsp---一个过滤器)
常见过滤器
anno、authc
使用shiro,先获取主体对象
Subject subject = SecurityUtils.getSubject();
<from action="${pageContext.request.contestPate}/user/login" method="post"></from>
16.shiro连接数据库完成基于MD5+Salt的注册功能
重要步骤:在service层中调用工具类(Saltutiles 生成盐),然后运用user.Setsalt(salt);
Md5Hash md5Hash= new Md5Hash(user.getPassword,salt,hashIterations:1024);
然后保存到数据库,即完成连接,完成用户注册
17.连接数据库认证功能
Realm根据用户名查询认证方法:
3.18 thymeleaf和项目熟悉
Springboot返回视图和参数:string 返回视图,ModelAndView :return ModelAndView(“success”),@ResponseBody:返回json数据,ModeAndView:return mv 返回视图与参数
(1) thymeleaf:
1
张三
zhangsan
20
<td th:text="
u
s
e
r
.
s
e
x
"
=
=
1
?
′
男
′
:
′
女
′
>
男
<
/
t
d
>
<
t
d
t
h
:
t
e
x
t
=
"
{user.sex}"==1?'男':'女'>男</td> <td th:text="
user.sex"==1?′男′:′女′>男</td><tdth:text="{#dates.format{user.birthday,‘yyyy-MM-dd’}}">1980-02-30
如果user.id有值会覆盖1,如果没有则是默认值
(2) 常用标签:
标签 作用 示例
th:id 替换id
th:text 文本替换
bigsai
th:utext 支持html的文本替换
content
th:object 替换对象
th:value 替换值
th:each 迭代
th:href 替换超链接 超链接
th:src 替换资源
(3)链接表达式:@{。。。。}
引入css:<link rel="stylesheet" th:href="@{index.css}">
引入JavaScript:<script type="text/javascript" th:src="@{index.js}"></script>
超链接:<a th:href="@{index.html)">超链接</a>
(request.setAttribute("","")传到前台参 request.getRequestDispatcher(url).forward(request,reponser)专向
model.addAttribute("","") 传到前台参数
音乐思路:request.getParameter("name").trim();接受参数 返回jsonObject
anfingpingtai思路: 修改保存接口参数AfSktest afsktest;)
JavaScript复习: 1.1 定义:可以不经过定义直接使用
1.2 变量类型:数字型、布尔型、字符串、数组
document.getElementById(id).style.property=new style.
3.19 总结自己增加Test功能和继续学习shiro
前期准备:在菜单管理上加入目录----加入菜单----加入按钮
1.在类上方加入@RequsetMapping(“system/sktest”)设置前缀
2.定义一个String prifix=" [前缀] "
3.设定view,GetMapping(),定义一个方法返回视图(String),并且返回 peifix+"/sktest"
lsit、add、edit、remove
查询(List):List<AfSktest> 返回类型TableDataInfo,return getDataTable(list);
sktest.html:
新增:先定义一个GetMapping("/add") 主要作用返回增加页面视图,后新增保存@PostMapping("/add")
,toAjax判断,AjaxResult接受
修改:先定义一个GetMapping("/edit/{id}) 接口参数 id,ModelMap modelMap(用户接受并传递根据id查询到的数据),
修改保存数据,调用service操作。
删除:mapper: deleteSktestByIds(string[] ids),
mapper.xml:<delete id="">
delete from af_sktest id in
<froeach clooection="array" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
service:调用Mapper时,要进行强制转换 Convert.toStrArray(ids)
cotroller:@PostMappings
Shiro学习
17.shiro:连接数据库并认证
给realm注入工厂(因为不能直接用service,需要在工厂中获取service),ApplicationContextUtils implements ApplicationContextAware
然后SimpleAuthenticationInfo(user.getUsername,密码,盐)
在shrio配置中,修改凭证效验匹配器,加上盐和散列错误。
18.shiro:授权(shiro配置、使用、自制Realm---UserController、*CustomerRealm*、ShiroConfig、login.jsp、index.jsp---ApplicationContextUtils一个过滤器)
在CustomerRealm中配置认证:获取身份信息--AuthorizationInfo
**在html中引入shiro标签,使用shiro标签:<shiro:hasRole name="admin"><shiro:hasRole>
多种权限<shiro:hasAnyRoles></shiro:hasAnyRoles>
通过hasPermission(权限字符串的管理) user:*:* user下的所有资源,所有操作
@RequiresRoles("")同时具有 @RequiesPermissions("")
19.授权数据的数据库获取(一)
设计
用户------》角色-------》权限-------》资源(常用)
用户------》角色
用户------》权限
用户------》角色
用户------》权限
设计数据库:用户表 角色表 权限表
用户与角色与权限表都是多对多的关系,用户表 和 角色表 ------》中间表 用户角色表
角色表 和 权限表------》中间表 角色权限表
select u.* ,r.* from t_user u left join t_user_role ur on u.id=ur.userid
left join t_role r on ur.roleid=r.id
where u.username='xiaochen'(查询xiaochen 的user表中的全部信息 和 其对应的 角色,,,先通过中间表查询到对应的roleid集合, 再通过roleid查询到 role表中对应的id和name)
20.授权数据的数据库获取(二)
用户中实体中定义角色集合,角色实体类中定义权限集合
根据角色的id拿到不同的权限集合 UserDao://根据用户名查询所有角色 //根据角色id查询权限集合
select p.id,p.name,p.url,r.name from t_role r left join t_role_perms rp on r.id=rp.id
join t_perms p on rp.id=p.id
where r.id='';(根据中间表 查询到角色对应的权限id集合 然后在权限表中查询出来)
拿到角色之后查询权限信息(CustomerRealm)
在AuthorizationInfo doGetAuthorizationInfo配置类中配置
认证和授权基本流程完毕
21.shiro整合SpringBoot缓存之Ehcahe使用
缓存:计算机内存中的一段数据。 作用:用来减轻DB的访问压力,从而提高系统的查询效率
哪些数据适合加入缓存,哪些数据不适合放入缓存
企业一般用redies做缓存,做成分布式缓存。
**引入依赖--ShiroConfig开启缓存管理(开启全局缓存、开启认证的缓存、指定名字、开启授权缓存、指定名字)
22.shiro整合SpringBoot使用Redis作为缓存实现
**引入依赖--properties配置--创建RedisCacheManage--RedisCache
24.shiro整合springboot之图片验证
25.shiro整合thymeleaf
**引入依赖--shiroConfig--CustomerRealms--
th:action="@{/user/login}" th:src=@{///} th:href=@{///]