课程管理模块
Maven
间接依赖(依赖传递)
依赖冲突
依赖传递导致的:同一个工程 依赖传递 了不同版本的相同jar包
依赖调解
- 第一声明者优先原则:先声明的为准
- 路径近者优先原则:直接依赖 > 间接依赖
- 排除依赖
/pom.xml/
<dependency>
...
<exclusions>
<exclusion>
<groupId>xxx</groupId>
<artifactId>xxx<artifactId>
</exclusion>
</exclusions>
</dependency>
- 锁定版本
/pom.xml/
<properties>
<!-- spring.version自定义标签,抽取共同的版本号-->
<spring.version>5.1.8RELEASE</spring.version
</properties>
<!-- 锁定 jar版本,没有引入jar包 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>xxx</groupId>
<artifactId>xxx<artifactId>
<!--获得properties声明的 版本号 -->
<version>${spring.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
Maven聚合工程(分模块)
拆分方法
- 业务模块拆分
- 按照层拆分。持久层,业务层(servic),表现层
Maven工程继承
子工程继承父工程,可以使用父工程的依赖
父工程 打包方式 <packaging>pom</packaging>
子工程 pom.xml 中 <parent></parent>
Maven 工程聚合
父工程 pom.xml中<modules>
标签 将其他工程聚合一起
依赖关系建立原则:当前项目要用到哪个项目资源,当前项目依赖要用到资源的项目(直接依赖 和间接依赖)
Dao 层 Spring整合 mybastis
- 引入jdbc.properties
- 数据源配置
- sqlSessionFactory
- mapper映射扫描
Service 层
- 开启Service IOC注解扫描
- 引入 applicationContext-dao.xml
<import resource=“classpath: applicationContext-dao.xml”></import>
Web层
/springmvc.xml/
- 注解扫描
<context:component-scan base-package="com.lagou.controller"></context:component-scan>
- 注解增强
- 视图解析器
- 静态资源放行
/applicationContext.xml/
- 引入:applicationContext_service.xml
/web.xml/
- 中文乱码过滤器
- 前端控制器
- 启动监听器 ContextListener
- 跨域过滤器
多条件查询响应
创建实体类 ResponseResult(success,state,message,content)
封装响应结果
CourseVO(View object)
表现层对象,接收前端参数
CourseController
ResponseResult findCourseByCnodition(@ResquestBody CourseVo courseVo);
前端提交参数是post json格式,不能直接转换为courseVo,@ResquestBody 前端参数封装到 courseVo中
图片上传
- 判断上传文件是否为空
- 获取项目部署路径
- 获取原文件名
- 生成新文件名
- 文件上传
- 返回响应
upload文件夹添加从tomact webapp目录中添加到 IDEA tomcat configuration deployment中,否则提示无法访问
新增课程
// 封装课程信息
BeanUtils.copyProperties(course,courseVo);
// 补全课程信息
course.setCreateTime(date);
course.setUpdateTime(date);
//保存课程
courseMapper.saveCourse(course);
// 获取插入数据的id
course.getId();
需求分析步骤
Controller
- 根据接口文档,设置Controller接收参数,调用Service
- 返回响应
Service
- 接收Controller传递的参数
- 封装对象,补全信息
- 调用mapper
Dao
通过传递来的参数,编写接口方法和mapper
更新和添加
更新和添加放到一个API 接口中,根据传入的参数有无id 区分
- 添加操作
- 回显操作,更新的准备
- 更新操作
分页查询
后台 准备的参数
- 总条数
- 每页显示的条数
- 总页数
- 当前页
- 分页数据
mybatis分页插件
- 导入依赖
- 配置文件中配置pageHelper
- 调用数据库方法前调用PageHelper.startPage(当前页,每页显示条数)
/PromotionAdMapper.xml/
<mapper namespace="com.lagou.dao.PromotionAdMapper">
<resultMap id="ad_space" type="com.lagou.domain.PromotionAd">
<id property="id" column="id"></id>
<result property="name" column="name"/>
<result property="spaceId" column="spaceId"/>
...
<result property="img" column="img"/>
<association property="promotionSpace"
select="com.lagou.dao.PromotionSpaceMapper.findPromotionSpaceById"
column="spaceId" javaType="com.lagou.domain.PromotionSpace"></association>
</resultMap>
/applicationContext-dao.xml/
<!--2.sqlSessionFactory-->
<bean id="sqlSessionFactory"
class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="typeAliasesPackage" value="com.lagou.domain"/>
<property name="plugins">
<array>
<bean class="com.github.pagehelper.PageHelper">
<property name="properties">
<value>helperDialect=mysql</value>
</property>
</bean>
</array>
</property>
<!--引入加载mybatis核心配置文件-->
<property name="configLocation" value="classpath:sqlMapConfig.xml">
</property>
</bean>
/PromotionAdService.java/
public PageInfo findAllPromotionAddByPage() {
PageHelper.startPage(currentPage,pageSize);
// 分页查询结果
List<PromotionAd> allPromotionAdPage
PageInfo<PromotionAd> pageInfo = new PageInfo<>(allPromotionAdPage);
return pageInfo;
}
权限控制
权限概念
权利(能做的)和限制(不能做的)
认证:验证用户名和密码是否正确
授权:用户所能访问的资源进行控制
权限控制原理
-
ACL(Access Control Lists)
给用户直接分配权限 -
RBAC(Role-Based Access Control)
给用户分配角色,角色对应权限
用户和角色多对多,角色和权限 多对多
权限系统表
用户表,角色表,权限表,用户角色中间表,角色权限中间表
权限系统表查询父子菜单
嵌套查询
- 顶层菜单 pid = -1,查询出顶层菜单
- 顶层菜单id 作为子菜单的 pid 查询出子菜单
<!-- 一对多: 查找子孙菜单 -->
<select id="findSubMenuListByPid" resultMap="MenuResult">
select * from menu where parent_id = #{pid} </select>
<!--根据pid 查询所有子分类集合-->
<resultMap id="MenuResult" type="com.lagou.domain.Menu">
<id column="id" property="id"></id>
<result column="href" property="href"></result>
<result column="icon" property="icon"></result>
<result column="name" property="name"></result>
<result column="parent_id" property="parentId"></result>
<result column="description" property="description"></result> <result column="orderNum" property="order_num"></result>
<result column="shown" property="shown"></result>
<result column="created_time" property="createdTime"></result>
<result column="updated_time" property="updatedTime"></result>
<result column="created_by" property="createdBy"></result>
<result column="updated_by" property="updatedBy"></result>
<collection property="subMenuList" ofType="com.lagou.domain.Menu"
select="findSubMenuListByPid" column="id" ></collection>
</resultMap>
为 角色分配菜单
向中间表 role_menu 添加关联关系,先把之前角色的菜单清空,再添加
用户登录
MD5
Message Digest Algorithm 5 信息摘要算法
32位的16进制字符串,加密过程不可逆
登录流程
dao层
select * from user where phone=#{phone}
service层
- 查询手机号对应的用户是否存在
- 进而判断加密的密码是否正确
user != null && Md5.verfiy(xxx)
Controller层
- 判断service层返回的用户是否为null,等于直接返回响应
- 登录验证通过,向session中存储用户id,access_token(令牌信息)
- accesson_token userid 转换成json响应格式
动态获取菜单
用户登录成功,获取该用户所具有的权限,展示菜单
- 用户关联角色,角色关联菜单
- 角色关联资源
UserController
- 获取请求头 token
- 获取服务端session中的token
- 比较token是否一致
- 不一致,响应错误信息
- 一致,取出session中的userid
UserService
- 根据用户 id,查询拥有的角色
- 获取角色id,保存到 list 集合
- 根据角色id 查询父菜单信息
- 查询父菜单的子菜单
- 获取资源信息
- 封装数据
UserDao
- 根据用户 id,查询拥有的所有角色
- 根据角色id 查询父菜单信息
- 查询父菜单的子菜单
- 获取资源信息
Git
版本控制类型
- 集中式版本控制工具,版本控制依赖中央服务器,所有操作要联网
- 分布式版本控制工具,本地仓库实现版本控制,协同开发使用git远程仓库
SVN Git 区别:
git存在本地仓库,本地仓库就可以实现版本控制
Git 工作流程
代码冲突
多个人对同一个文件同一行进行了修改操作
Git工作流程基本概念
-
本地仓库
.git隐藏文件夹,存储所有版本代码 -
工作区
和.git同级目录文件 编写的代码,工作区不与任何仓库分支进行关联 -
暂存区
.git中index 文件,从工作区经过add(添加)后与某一个仓库分支进行关联
#查看文件状态
git status -s
# 单行侠士提交记录
git log --pretty=online
#版本回退
git resest --hard 'commit_id'
# 回到未来的提交(相对于回退版本)
git reflog
git resest --hard 'commit_id'
#删除本地仓库文件
git rm xxx
git commit -m ’xxx‘
# 本地仓库检出到工作区
git checkout xxx
分支管理
#查看分支
git branch
# 详细查看本地分支
git branch -v
# 查看包括远程仓库在内的分支信息
git branch -av
#创建分支
git branch dev
#分支切换
git checkout dev
#分支合并
git checkout master
git merge dev
#删除分支
git branch -d dev
远程仓库
#生成公钥,私钥
ssh-keygen -t rsa
# 查看远程仓库
git remote -v
#添加远程仓库,origin 远程仓库名称,可以随意取名remote_git_repo 远程仓库地址
git remote add origin remote_git_repo
# 第一次使用时,带上 -u 参数 ,本地master推送到远程新的 master 分支的同时,还会把本地的 master 分支和远程的 master 分支关联起来。
git push -u origin master
# 仅获取远程仓库的更新内容,不会自动合并
git fetch
# 获取远程仓库的更新内容,自动合并
git pull
# 拉取远程仓库
git pull 远程仓库名称 分支名称
#断开本地仓库和远程仓库链接
git remote rm origin
网友评论