美文网首页
SAAS-HRM-day3

SAAS-HRM-day3

作者: 程序员Darker | 来源:发表于2019-09-30 08:20 被阅读0次

    1. 分页+高级查询+关联查询

    1.1 步骤分析

    1. 准备分页插件配置
    2. controller为自己的方法
    3. service的impl
    4. mapper
    5. mapper.xml

    1.2 步骤实现

    1. 准备分页插件配置
    package cn.wangningbo.hrm.config;
    
    import com.baomidou.mybatisplus.plugins.PaginationInterceptor;
    import org.mybatis.spring.annotation.MapperScan;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.transaction.annotation.EnableTransactionManagement;
    
    //Spring boot方式:配置分页插件
    @EnableTransactionManagement
    @Configuration
    @MapperScan(" cn.itsource.hrm.mapper")
    public class MybatisPlusConfig {
    
        @Bean
        public PaginationInterceptor paginationInterceptor() {
            return new PaginationInterceptor();
        }
    }
    
    1. controller为自己的方法
        /**
         * 分页查询数据
         *
         * @param query 查询对象
         * @return PageList 分页对象
         */
        @RequestMapping(value = "/json", method = RequestMethod.POST)
        public PageList<CourseType> json(@RequestBody CourseTypeQuery query) {
            return courseTypeService.selectPageList(query);
        }
    
    1. service的impl
        public PageList<CourseType> selectPageList(CourseTypeQuery query) {
            Page page = new Page(query.getPage(), query.getRows());
            List<CourseType> list = courseTypeMapper.loadListPage(page, query);
            return new PageList<>(page.getTotal(), list);
        }
    
    1. mapper
    public interface CourseTypeMapper extends BaseMapper<CourseType> {
    
        List<CourseType> loadListPage(Pagination page, @Param("query") CourseTypeQuery query);
    }
    
    1. mapper.xml
        <select id="loadListPage" parameterType="CourseTypeQuery" resultMap="CourseTypeMap">
            SELECT
                ct.*, pct.id ppid,
                pct. NAME pname
            FROM
                t_course_type ct
            LEFT JOIN t_course_type pct ON ct.pid = pct.id
            <include refid="whereSql"></include>
        </select>
        <sql id="whereSql">
          <where>
              <if test="query.keyword!=null and query.keyword!=''">
                  AND (ct.name like concat('%',#{query.keyword},'%')) or (ct.description like concat('%',#{query.keyword},'%'))
              </if>
          </where>
        </sql>
        <resultMap id="CourseTypeMap" type="CourseType">
            <id column="id" property="id" />
            <result column="createTime" property="createTime" />
            <result column="updateTime" property="updateTime" />
            <result column="name" property="name" />
            <result column="pid" property="pid" />
            <result column="logo" property="logo" />
            <result column="description" property="description" />
            <result column="sortIndex" property="sortIndex" />
            <result column="path" property="path" />
            <result column="totalCount" property="totalCount" />
            <association property="parent" javaType="CourseType">
                <id column="ppid" property="id"></id>
                <result column="pname" property="name"></result>
            </association>
        </resultMap>
    

    2. 日志集成

    2.1 步骤分析

    因为springboot默认使用日志框架是logback,我也要使用这个,所以我只需要自定义一些配置就行了!写个配置文件,取固定的名字即可!名字有两种选择方式logback-spring.xml和logback.xml!logback-spring.xml这个名字更牛逼一点!

    在每个项目的服务那里都配置一下日志

    1. 在每个服务下面的resources下都弄一个logback的配置文件名字为logback-spring.xml

    2.2 步骤实现

    logback-spring.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!--
    scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。
    scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒当scan为true时,此属性生效。默认的时间间隔为1分钟。
    debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。
    -->
    <configuration scan="false" scanPeriod="60 seconds" debug="false">
        <!-- 定义日志的根目录 -->
        <property name="LOG_HOME" value="/hrm/" />
        <!-- 定义日志文件名称 -->
        <property name="appName" value="hrm-sysmanage"></property>
        <!-- ch.qos.logback.core.ConsoleAppender 表示控制台输出 -->
        <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
            <!--
            日志输出格式:
                %d表示日期时间,
                %thread表示线程名,
                %-5level:级别从左显示5个字符宽度
                %logger{50} 表示logger名字最长50个字符,否则按照句点分割。 
                %msg:日志消息,
                %n是换行符
            -->
            <layout class="ch.qos.logback.classic.PatternLayout">
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            </layout>
        </appender>
    
        <!-- 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件 -->  
        <appender name="appLogAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <!-- 指定日志文件的名称
               /hrm/hrm-course/hrm-course.log
            -->
            <file>${LOG_HOME}/${appName}/${appName}.log</file>
            <!--
            当发生滚动时,决定 RollingFileAppender 的行为,涉及文件移动和重命名
            TimeBasedRollingPolicy: 最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责出发滚动。
            -->
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <!--
                滚动时产生的文件的存放位置及文件名称 %d{yyyy-MM-dd}:按天进行日志滚动 
                %i:当文件大小超过maxFileSize时,按照i进行文件滚动
                -->
                <fileNamePattern>${LOG_HOME}/${appName}/${appName}-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
                <!-- 
                可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件。假设设置每天滚动,
                且maxHistory是365,则只保存最近365天的文件,删除之前的旧文件。注意,删除旧文件是,
                那些为了归档而创建的目录也会被删除。
                -->
                <MaxHistory>365</MaxHistory>
                <!-- 
                当日志文件超过maxFileSize指定的大小是,根据上面提到的%i进行日志文件滚动 注意此处配置SizeBasedTriggeringPolicy是无法实现按文件大小进行滚动的,必须配置timeBasedFileNamingAndTriggeringPolicy
                -->
                <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                    <maxFileSize>100MB</maxFileSize>
                </timeBasedFileNamingAndTriggeringPolicy>
            </rollingPolicy>
            <!-- 日志输出格式: -->     
            <layout class="ch.qos.logback.classic.PatternLayout">
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [ %thread ] - [ %-5level ] [ %logger{50} : %line ] - %msg%n</pattern>
            </layout>
        </appender>
    
        <!-- 
            logger主要用于存放日志对象,也可以定义日志类型、级别
            name:表示匹配的logger类型前缀,也就是包的前半部分
            level:要记录的日志级别,包括 TRACE < DEBUG < INFO < WARN < ERROR
            additivity:作用在于children-logger是否使用 rootLogger配置的appender进行输出,
            false:表示只用当前logger的appender-ref,true:
            表示当前logger的appender-ref和rootLogger的appender-ref都有效
        -->
        <!-- hibernate logger -->
        <logger name="cn.wangningbo" level="debug" />
        <!-- Spring framework logger -->
        <logger name="org.springframework" level="debug" additivity="false"></logger>
    
    
    
        <!-- 
        root与logger是父子关系,没有特别定义则默认为root,任何一个类只会和一个logger对应,
        要么是定义的logger,要么是root,判断的关键在于找到这个logger,然后判断这个logger的appender和level。 
        -->
        <root level="info">
            <appender-ref ref="stdout" />
            <appender-ref ref="appLogAppender" />
        </root>
    </configuration> 
    

    3. 机构管理

    4. 机构入驻

    如果操作的domain涉及到了关联查询,就要在那个domain里面加入新的关联对象,并且在关联对象上面打上注解@TableField(exist=false)

    4.1 步骤分析

    1. domain处理
    2. 前台根据指定格式传递过来参数
    3. 由于中间表没有自己的mapper增删改查方法,所以我在TenantMapper里面自己写方法实现
    4. 后台覆写service的实现使用自己的方式进行保存、修改、删除

    4.2 步骤实现

    1. domain处理
        //接收或者做关联查询,数据库中没有的字段
        @TableField(exist = false)
        private Employee adminUser;
        @TableField(exist = false)
        List<Meal> meals = new ArrayList<>();
    
        // 处理中间表
        public List<Map<String,Long>> getMealsMap(){
            List<Map<String,Long>> maps = new ArrayList<>();
            if (meals.size()>0){
                for (Meal meal : meals) {
                    Map<String,Long> map = new HashMap<>();
                    map.put("tenantId",this.getId());
                    map.put("mealId",meal.getId());
                    maps.add(map);
                }
            }
            return maps;
        }
    
    1. 前台根据指定格式传递过来参数
    2. 由于中间表没有自己的mapper增删改查方法,所以我在TenantMapper里面自己写方法实现
    public interface TenantMapper extends BaseMapper<Tenant> {
    
        //保存中间表信息
        void saveTenantMeals(List<Map<String, Long>> mealsMap);
    
        //删除中间表信息
        void removeTenantMeal(Serializable id)
    }
    
        <!--// 添加中间表void saveTenantMeals(List<Map<String, Long>> mealsMap);-->
        <insert id="saveTenantMeals" parameterType="arrayList">
            insert into t_tenant_meal(tenant_id,meal_id) VALUES
            <foreach collection="list" separator="," item="item">
                (#{item.tenantId},#{item.mealId})
            </foreach>
        </insert>
    
        <!--// 删除中间表 void removeTenantMeal(Serializable id);-->
        <delete id="removeTenantMeal" parameterType="long">
            DELETE  from t_tenant_meal where tenant_id =#{id}
        </delete>
    
    1. 后台覆写service的实现使用自己的方式进行保存、修改、删除
    @Service
    public class TenantServiceImpl extends ServiceImpl<TenantMapper, Tenant> implements ITenantService {
        //注入租户
        @Autowired
        private TenantMapper tenantMapper;
        //注入用户
        @Autowired
        private EmployeeMapper employeeMapper;
    
        @Override
        public boolean insert(Tenant tenant) {
            //添加机构
            tenant.setRegisterTime(new Date());
            tenant.setState(false);
            tenantMapper.insert(tenant);
            System.out.println("添加后返回的id:"+tenant.getId());
            //添加管理员
            Employee adminUser = tenant.getAdminUser();
            adminUser.setInputTime(new Date());
            adminUser.setTenantId(tenant.getId());
            adminUser.setType(true);//是否是租户管理员
            adminUser.setState(0);
            employeeMapper.insert(adminUser);
            //添加套餐中间表
            tenantMapper.saveTenantMeals(tenant.getMealsMap());
            return true;
        }
    
        @Override
        public boolean deleteById(Serializable id) {
            //删除机构
            tenantMapper.deleteById(id);
            //删除管理员 //根据条件删除
            Wrapper<Employee> wapper = new EntityWrapper<>();
            wapper.eq("tenant_id",id);
            employeeMapper.delete(wapper);
            //删除中间表
            tenantMapper.removeTenantMeal(id);
            return true;
        }
    
        @Override
        public boolean updateById(Tenant tenant) {
            //修改机构
            tenantMapper.updateById(tenant);
            //修改管理员
            employeeMapper.updateById(tenant.getAdminUser());
            //修改中间表 //这里采用先删除后添加的方式
            tenantMapper.removeTenantMeal(tenant.getId());
            tenantMapper.saveTenantMeals(tenant.getMealsMap());
            return true;
        }
    }
    

    5. logo图片处理见SAAS-HRM-day4

    相关文章

      网友评论

          本文标题:SAAS-HRM-day3

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