搜索框模糊搜索数据并判断如果是空则不执行 where里面的内容
<mapper namespace="com.cy.pj.sys.dao.SysLogDao">指定数据为dao层
    <!-- resultType返回值去记录总数 -->
    
    <select id="getRowCount" resultType="int"><!-- 返回值是int类型 -->
        select count(*) from sys_logs
    <where>
        <if test="username!=null and username!=''"><!-- 搜索数据如果为 null就不执行where了 -->
        username like concat("%",#{username},"%")<!-- 模糊搜索数据 -->
        </if>
    </where>
    </select>
</mapper>
这是一种逻辑思维 以后业务就要这样去写的
//基于条件查询用户行为日志记录总数
    //@param username 查询条件()用户名-基于此用户名进行模糊查询)
    //@return 查询到的记录总数
    int getRowCont(String username);//这是一个搜索框,根据用户名查询的总记录数
    List<SysLog> findPageObjects(String username,查询条件
            Integer startIndex, 起始位置
            Integer pageSize);这个是分页面的大小每页最多显示多少条数据
    <sql id="abcd">使用sql封装总数据提取共性 
    from sys_logs
    <where>
        <if test="username!=null and username!=''"><!-- 搜索数据如果为 null就不执行where了 -->
        username like concat("%",#{username},"%")<!-- 模糊搜索数据 -->
        </if>
    </where>
    </sql>
    <!-- resultType返回值去记录总数 -->
    <select id="findPageObjects" resultType="com.cy.pj.sys.pojo.SysLog"><!-- 返回值直接返回包名 -->
    分页查询
    select *
    <include refid="abcd"/>调用sql里的共性数据
    order by createdTime desc
    limit #{startIndex},#{pageSize}
    </select>
    总记录数据
    <select id="getRowCount" resultType="int"><!-- 返回值是int类型 -->
        select count(*)
        <include refid="abcd"/>调用sql里的共性数据sql自定义的id值
    </select>
//service 层分页业务;
public interface SysLogService {
    //用户名
    //分页查询
    //返回值 封装了查询和计算结果的一个分页对象
    pageObject<SysLog> findPageObjects(String username,Integer pageCurrent);
} 
02这个是定义的一个类 pojo层的类
和下面对应 
public class pageObject<T> implements Serializable{
    private static final long serialVersionUID = 7372326137711610989L;//实现序列化接口
    //总数数
    private Integer rowCount;//池化思想
    //当前页记录
    private List<T> records;//加《T》是为了其他模块 以后使用分页 分享共性
    //总页数
    private Integer pageCount;
    //页面大小(每页最多显示多少条记录)
    private Integer pageSize;
    //当前页码值
    private Integer pageCurrent;
    public pageObject(Integer rowCount, List<T> records, Integer pageSize, Integer pageCurrent) {
        super();
        //根据业务需求近进行判断所需要的数据;
        this.rowCount = rowCount;//总数数
        this.records = records;//当前页记录
        this.pageCount = pageCount;//总页数
        this.pageSize = pageSize;//页面大小(每页最多显示多少条记录)
        this.pageCurrent = pageCurrent;//当前页码值
        //计算pageCount的值,方法2
        this.pageCount=(this.rowCount-1)/pageSize+1;
    }
}
Serviceimpl层业务 业务层 业务层
@Service
public class SysLogServiceImpl implements SysLogService {
    @Autowired 
    private SysLogDao sysLogDao;
    @Override
    public pageObject<SysLog> findPageObjects(String username, Integer pageCurrent) {
        // TODO Auto-generated method stub
        if(pageCurrent==null||pageCurrent<1)
            throw new IllegalArgumentException("当前页码值无效");
        //判断值
        int rowCount=sysLogDao.getRowCont(username);
        if(rowCount==0)
        throw new ServiceException("没有找到对应结果");自己定义的异常 使用这个异常要类继承 RuntimeException这个类是运行异常
        //查询当前页数据
        int pageSize=5;//这个值也可以从页面传递到服务器显示数据
        int startIndex=(pageCurrent-1)*pageSize;
        List<SysLog> records=sysLogDao.findPageObjects(username, startIndex, pageSize);
        return new pageObject<SysLog>(rowCount, records, pageSize, pageCurrent);
    }

}
Controller层处理异常  ,  处理异常语句 
@Controller
@RequestMapping("/log/")//这个以后如果用户传个——1则会报500这个错误所以最好还是 添加一个状态 
public class SysLogController {
    @Autowired
    private SysLogService sysLogService;
    @RequestMapping("doFindPageObjects")
    @ResponseBody//以json字符串返回数据
    public JsonResult doFindPageObjects(String username,Integer pageCurrent){
//        try {
        pageObject<SysLog> pageObject=sysLogService.findPageObjects(username, pageCurrent);
        
        return new JsonResult(pageObject);//没有错误就返回 正确的值
//        } catch (Exception e) {//可以不用这个 以为这个以后如果还有异常怎么办哪?
        //所以 需要一个全局的处理异常;
//        return new JsonResult(e);//如果有错误就返回状态就返回0
            // TODO: handle exception
        }
    
    
    }
这个就写js函数吧 以后 在完善吧!
<script type="text/javascript">
    //这个是控制分页 总分页 反正都有用
    function doSetPagination(page) {
        //1.始化数据
        $(".rowCount").html("总记录数(" + page.rowCount + ")");
        $(".pageCount").html("总页数(" + page.pageCount + ")");
        $(".pageCurrent").html("当前页(" + page.pageCurrent + ")");
        //存储当前页码值 data函数用于在指定dom对象上存储数据去数据其基本语法为data(key,[value]);
        $("#pageId").data("pageCurrent", page.pageCurrent);//假如只有k则表示取值 data 属性必须 有值 才能用data
        $("#pageId").data("pageCount", page.pageCount);
    }
    //事件注册 //在pageId对应的对象上技能型click事件注册点击妻子元素first....等等执行doJUmpToPage
    $(function() {//on使用地方动态按键 
        $("#pageId").on("click", ".first,.pre,.next,.last", doJumpToPage);
    });//on语法 click
    //定义doJumpToPage方法通过此方法实现当前数据查询
    function doJumpToPage() {
        //1.获取点击对象的class值
        //prop是jquery中的一个操作属性的函数即泵语法prop(属性名【属性值】)
        var cls = $(this).prop("class");//prop用于获取dom对象属性值或赋值prop只取标准属性如class,id 或者 java有的语言值
        //2.基于点击的对象执行pageCurrent值的修改
        //2.1获取pageCurrent,pageCount的当前值 这个值最好还是不要用 全局变量 
        var pageCurrent = $("#pageId").data("pageCurrent"); //当前页
        var pageCount = $("#pageId").data("pageCount");//总页数
        //2.2修改pageCurrent的值
        if (cls == "first") {//首页
            pageCurrent = 1;
        } else if (cls == "pre" && pageCurrent > 1) {//上一页
            pageCurrent--;
        } else if (cls == "next" && pageCurrent < pageCount) {//下一页
            pageCurrent++;
        } else if (cls == "last") {//最后一页
            pageCurrent = pageCount;
        } else {
            return;//其他情况什么也不做
        }
        //3.对pageCurrent值进行重新绑定
        $("#pageId").data("pageCurrent", pageCurrent);//重洗刷新页面
        doGetObjects();//此函数定义在了类标页面
    }
分页加查询语句。。。
<!-- load加载方法注入方法 -->
<script type="text/javascript">
    //第一步 分页页面加载完成 向服务端发起异步请求
    $(function() {//此函数所有东西加载完最后执行;如果把js函数写在最下面也可以不写这个函数
        $("#pageId").load("doPageUI")//把doPageUI加载到pageId
        doGetObjects();//刷新这个方法
        //查询方法 查询方法 查询方法
        $(".input-group-btn").on("click",".btn-search",doQueryObjects);//查询日志按钮进行注册
    })
    //查询方法 
    function doQueryObjects(){
        //如果这里不初始化 为1如果在某个页面 就会搜索不出来结果 忘了可以删除试试 
        //当前页码初始化
        $("#pageId").data("pageCurrent",1);
         //为什么要调用doGetObjects函数?
         //重用js代码,简化jS代码编写。
         doGetObjects();
         }
    //第二步定义异步请求处理函数 
    function doGetObjects() {
        //定义url和参数
        var url = "log/doFindPageObjects"
            var pageCurrent=$("#pageId").data("pageCurrent");
        if(!pageCurrent) pageCurrent=1;//默认值
        var params = {"pageCurrent" :pageCurrent};//默认页码值 是第一页
         //基于用户名查询试获取用户名这个参数值
         var username=$("#searchNameId").val();
         //这个值一定和数据库里的值一样 不能乱写
         if(username) params.username=username;//查询时需要
        //2.发起异步请求
        //ajax请求的回调函数参数名可以是任意吗?可以必须符合表示符的规范
        $.getJSON(url, params, function(result) {
            //请问result是一个字符串还是json格式的js对象?对象
            doHandleQueryResponseResult(result);

        });//特殊的ajax函数        
    }
    //第三步 定义回调函数处理服务端的响应结果
    function doHandleQueryResponseResult(result) {//JsonResult
        if (result.state == 1) {//定义状态信息 
            //更新table中tbody内部的数据   // records当前页记录
            //这个其实也相当于调用方法
            doSetTableBodyRows(result.data.records);//将数据呈现在页面上这个也算刷新数据了
            //更新页面page.html分页数据
            doSetPagination(result.data); //将这个函数读取到page.html中
        }else{
            alert(result.message);
        }
    }
    function doSetTableBodyRows(records){
        //1.获取tbody对象 ,并清空原有内容
        var tBody=$("#tbodyId");
        tBody.empty();//清空原有的内容
        //2迭代 result,将活动信息追加到tbody中
        records.forEach((item)=>{//代表数组的某个元素
            //将原有的数据替换掉更新新的数据 //使用了模板字符拼接方法
            tBody.append(
                `<tr>
                <td><input type='checkbox'value=${item.id}></td>/*模板字符拼接 */
                <td>${item.username}</td>
                <td>${item.operation}</td>
                <td>${item.method}</td>
                <td>${item.params}</td> 
                <td>${item.time}</td>
                <td>${item.ip}</td>
                </tr>`    
                );
        });
    }
删除操作单删除明天在改
.on("click",".btn-delete",doDeleteObjects);//这个函数还可以这样写
    })
    //input-group-btn查询事件
    //btn-delete 删除事件
    //btn-search 这个是分页事件
    //删除操作事件处理
    function doDeleteObjects(){
        //1.获取选中的id值
        var ids=doGetCheckedIds();
        if(ids.length==0){
            alert("至少选择一个");//弹出一个框
            return;
        }
    var url="log/doDeleteObjects";
    var params={"ids":ids.toString()};
    $.post(url,params,function(result){//post提交方式
        if(result.state==1){
            alert(result.message);//弹框
            doGetObjects();
        }else{
            alert(result.message);//弹框
        }    
    });
    
    }
    function doGetCheckedIds(){
        //定义一个数组,用于存储选中的checkbox的id值
        var array=[];
        //获取tbody中所有类型为checkbox的input元素
        $("#tbodyId input[type=checkbox]").
        each(function(){
            //假如此元素的checked属性的值为true
            if($(this).prop("checked")){
                //调用数组对象的push方法将选中的值存储到数组中
                array.push($(this).val());
            }
        });
        return array;//返回

CV战士
7 声望1 粉丝