美文网首页
SSM单体架构项目 (上)

SSM单体架构项目 (上)

作者: 极速魔法 | 来源:发表于2020-09-30 19:55 被阅读0次

    课程管理模块

    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

    1. 根据接口文档,设置Controller接收参数,调用Service
    2. 返回响应

    Service

    1. 接收Controller传递的参数
    2. 封装对象,补全信息
    3. 调用mapper

    Dao

    通过传递来的参数,编写接口方法和mapper

    更新和添加

    更新和添加放到一个API 接口中,根据传入的参数有无id 区分

    • 添加操作
    • 回显操作,更新的准备
    • 更新操作

    分页查询

    后台 准备的参数

    • 总条数
    • 每页显示的条数
    • 总页数
    • 当前页
    • 分页数据

    mybatis分页插件

    1. 导入依赖
    2. 配置文件中配置pageHelper
    3. 调用数据库方法前调用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)
      给用户分配角色,角色对应权限
      用户和角色多对多,角色和权限 多对多

    权限系统表

    用户表,角色表,权限表,用户角色中间表,角色权限中间表

    权限系统表

    查询父子菜单

    嵌套查询

    1. 顶层菜单 pid = -1,查询出顶层菜单
    2. 顶层菜单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

    1. 获取请求头 token
    2. 获取服务端session中的token
    3. 比较token是否一致
      1. 不一致,响应错误信息
      2. 一致,取出session中的userid

    UserService

    1. 根据用户 id,查询拥有的角色
    2. 获取角色id,保存到 list 集合
    3. 根据角色id 查询父菜单信息
    4. 查询父菜单的子菜单
    5. 获取资源信息
    6. 封装数据

    UserDao

    1. 根据用户 id,查询拥有的所有角色
    2. 根据角色id 查询父菜单信息
    3. 查询父菜单的子菜单
    4. 获取资源信息

    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
    
    

    相关文章

      网友评论

          本文标题:SSM单体架构项目 (上)

          本文链接:https://www.haomeiwen.com/subject/lfdpuktx.html