wmic diskdrive get serialnumber 无效查询_OA系统的分页查询!!!

本文档主要介绍了OA系统中收支管理的相关功能,包括柱状图收入统计、财务审批逻辑、查询收支的SQL编写、饼图展示支出、指定时间段支出显示,以及分页查询的操作。内容涵盖Echarts数据初始化、Json数据转换、数据库查询优化和分页原理及实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对应作业

1. 使用Echarts柱状图显示收入统计信息-业务层和DAO层

(1) 后台如何拼接对应的json字符串?

StringBuilder icType = new StringBuilder("[");//['Mon1', 'Tue2', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']

StringBuilder amount = new StringBuilder("[");//[120, 200, 100, 800, 70, 110, 130] //拼接最外层的[]

for (int i = 0; i < barList.size(); i++) {

Object[] arr= barList.get(i); //[项目开发,四百]

if (i<barList.size()-1) {

icType.append("""+arr[0]+"",");

amount.append(arr[1]+",");

}else{

icType.append("""+arr[0]+""");

amount.append(arr[1]);

}

}

icType.append("]");

amount.append("]");

2. 收支管理-财务添加支出

(1) 当前审批人假如是财务,那么要进行什么操作,简述逻辑。

假如审批人是财务 ,直接通过 ,将下一个审批人设置为null

同时添加支出数据 ,修改审核数据(状态修改为已打款)

(2) 截止到这里,审批报销单功能彻底完成,再次概述整个审批逻辑。

a030767a17fea54cefaa2ffe311a9af0.png

3. 收支管理-查看支出

(1) 到这里,对于查看收支功能实现应该是不陌生了,重点就是查询收支的sql,请问这个sql怎么编写呢?

1. 我们需要查询的数据表来自那些表 ,

2. 将他们用特定条件连接

3. 再去写需要的数据

4.最后插入条件

select item.type,item.amount,item.itemdesc,exp.expid,exp.empid,emp2.realname,pm.payempid, emp1.realname,pm.paytime

from payment pm

join expense exp on pm.expid = exp.expid

join expenseitem item on exp.expid = item.expid

join employee emp1 on pm.payempid = emp1.empid

join employee emp2 on emp2.empid = exp.empid

where 1=1 and type = 5 and

payempid ='lifuying' and to_char(paytime,'YYYY/MM/DD HH24:MI:SS' ) <= '2018/06/19 20:52:01'

4. 收支管理-使用饼图显示支出

(1) 如何使用Echarts完成饼图展示?

1. 初始化Echars

var dom = document.getElementById("container");

var myChart = echarts.init(dom);

var option = {

title : {

text: '尚学堂支出信息统计',

subtext: '报销统计',

x:'center'

},

tooltip : {

trigger: 'item',

formatter: "{a} <br/>{b} : {c} ({d}%)"

},

legend: {

orient: 'vertical',

left: 'left',

data: ['项目开发','其他','学费','报名费','人员外包','外包']//与你需要插入数据的键名相同

},

series : [

{

name: '访问来源',

type: 'pie',

radius : '55%',

center: ['50%', '60%'],

data:arr,//后台查询的json数据

itemStyle: {

emphasis: {

shadowBlur: 10,

shadowOffsetX: 0,

shadowColor: 'rgba(0, 0, 0, 0.5)'

}

}

}

]

};

2. <!-- 为 ECharts 准备一个具备大小(宽高)的 DOM -->

<div id="container" style="height: 100%"></div>

(2) 如何将后台查出来的集合转换成为json字符串?

自己想办法用stringbulider拼接

List<Object[]> barList = pDao.findStatusDate(type);

//将list转换为json

/* String jsonStr ="["+

"{value:335, name:'直接访问'}, "+

"{value:310, name:'邮件营销'}, "+

"{value:234, name:'联盟广告'}, "+

" {value:135, name:'视频广告'}, "+

" {value:1548, name:'搜索引擎'} "+

"]";*/

StringBuilder jsonStr=new StringBuilder("[");

for (int i = 0; i < barList.size(); i++) {

Object[] obj = barList.get(i);

jsonStr.append("{");

jsonStr.append(""value":"+obj[1]+",");

jsonStr.append(""name":'"+obj[0]+"'");

if (i<barList.size()-1) {

jsonStr.append("},");

}else {

jsonStr.append("}");

}

}

jsonStr.append("]");

return jsonStr.toString();

5. 收支管理-使用饼图显示指定时间段的支出

(1) 如何在代码中加入逻辑:显示指定时间段的支出。

//判断传入参数的类型 ,显示不同的数据

StringBuilder sql =new StringBuilder("select item.type,sum(item.amount) "

+ " from payment pm"

+ " join expense exp "

+ " on pm.expid = exp.expid "

+ " join expenseitem item "

+ " on exp.expid = item.expid"

+ " where 1=1");

if(type==1){

sql.append("and to_char(paytime,'YYYY-MM-DD HH:MI:SS') > '"+DateUtil.getNowMonthBeginTime()+"'");

}else if(type==2){

sql.append("and to_char(paytime,'YYYY-MM-DD HH:MI:SS') <= '"+DateUtil.getNowYearEndTime()+"'");

sql.append("and to_char(paytime,'YYYY-MM-DD HH:MI:SS') > '"+DateUtil.getNowYearBeginTime()+"'");

}else if(type==3){

sql.append("and to_char(paytime,'YYYY-MM-DD HH:MI:SS') <= '"+DateUtil.getLastYearEndTime()+"'");

sql.append("and to_char(paytime,'YYYY-MM-DD HH:MI:SS') > '"+DateUtil.getLastYearBeginTime()+"'");

}

sql.append(" group by item.type");

sql.append( " order by item.type")

6. sxtoa项目总结

(1) 项目中大量应用到请求转发和重定向,再次简述请求转发和重定向的区别。

请求转发:

我们知道http有无连接的特点,一次请求到响应结束,连接就销毁,相应的所有数据也销毁,而我们一个sevlet无法处理此次请求,需要其他的servlet一起处理

特点:

请求转发,让一次请求访问多个servlet,在服务器内部跳转,由最后一个servlet做响应 将数据存入request ,让request作为数据流转的载体

一次请求,

Url:请求转发的’/’会自动匹配当前项目的根路径

Request.getRequestDispatcher(“/url”).forward(request,response)

缺点:地址栏不会改变 ,刷新会重发此请求,

重定向:

请求转发人为刷新会导致多次该请求的发送,由此需要重定向(重新发送请求,第一次请求结束后,会告诉浏览器让他再发一个另外请求)

特点:

两次请求 ,可以用cookie和session作为数据流转的载体

Url:重定向的’/’会匹配到服务器根目录

Response.sendRidirect(url)

(2) 简述MVC分层模式,并简述一下分层开发的优点。

MVC

M:model 模型层 Dao Service

V:view 视图层 jsp css html js

C:controller 控制层 servlet

分层开发的优点:

优点:

1、开发人员可以只关注整个结构中的其中某一层;

2、可以很容易的用新的实现来替换原有层次的实现;

3、可以降低层与层之间的依赖;

4、利于各层逻辑的复用。

(3) 总结JSP的四个作用域。

Page

Page作用域 表示只在当前页面有效,当程序跑出了这个页面,就无法访问页面设置的属性值

当你再次访问该页面时,又会重新初始化页面的属性

pageContext.setAttribute("SiteName", "无敌李商隐");

Request

Request作用域表示一次客户端的请求 ,一次请求,到服务器响应 request中属性就无效了,一旦客户端刷新浏览器,重新发送请求,则之前的参数和属性都无效

Session

生命周期:当我们向服务器发送第一次请求开始,只要浏览器不关闭,或session未

过期(默认30分钟),或调用session.invalidate(),session都会存在

Application

代表整个服务器的全局变量 ,所有servlet都可以访问 如果不手动调用removeAttribute函数进行删除,那么application中的属性永远不会删除,如果服务器重启application范围的所有属性都会丢失

(4) 简述 ajax异步请求的步骤

1、XMLHttpRequst的出现才有了异步处理

2、创建XmlHttpRequest对象

var request=new XMLHttpRequest();

注意:如果要兼容IE6以下浏览器则需要编写如下代码

var request;

if(window.XMLRequest){

request=new XMLRequestHttpRequest(); //IE7、IE8、360等

}else{

request=new ActiveXObject("Microsoft.XMLHTTP");//IE5、IE6

}

3、XMLHttpRequest发送请求

(1)open(method,url,async),参数的意义如下

method:GET或者POST请求方法

url:相对地址或者绝对地址

async:true或者false,默认是true,表示异步

(2)send(String)

GET请求无参数,POST请求时一定要有参数

举例A:

request。open("GET",'getDate',true);

request.send();

举例B:

request.open("POST","getDate",true)

//默认是"application/x-www-from"-urlencoden"方式提交,如果是提交文件,则需要修改成为multipart/form-data方式提交

request.setRequestHeader("Content-type","application/x-www-from"-urlencoden");

request.send("name=王二&age=25");

4、XMLHttpRequest取得响应

(1)responseText:获得字符串形式的响应数据

(2)responseXML:获得xml形式的响应数据

(3)status和statusText:以数字和文本形式返回Http转态码

(4)getAllResponseHeader():获得所以得响应报头

(5)getResponseHeader():查询响应中的某个字段的值

(6)readState属性

"0"请求未初始化,open还未调用

"1":服务器连接已经建立,open已调用

"2":请求已接收,也就是接收到头信息了

"3":请求处理中,也就是接收到响应主体了

"4":请求已经完成,且响应就绪,响应完成了

(5) 概述我们在项目中用到过哪些插件?

富文本编辑器 Echars 日历编辑器

(6) 项目整个做下来,最直观的感受是什么?

表也太多了,记不清表的属性,

(7) 在做项目中经常伴随着各种各样的错误,对于程序出错,你有哪些收获?

知道如何使用debug一步步排查,查不出来查百度或问同学 ,搞定不了就问老师

7. 分页意义和实现思路

(1) 为什么需要分页?分页跟增删改查中的哪个操作有关系?

因为数据量太大,将数据分层显示 ,查询rownum

(2) 简述分页的实现思路

调用servlet中的service方法 查询数据库数据的条数 ,加入pageBean

将pageBean作为参数传递 ,在调用dao层的方法查询所有数据的集合

并加入pageBean中的list中 ,最后将pageBean放入request中,用请求转发传递

8. 理解PageBean

(1) PageBean中有哪些属性?作用是什么?

private int size = 5;//每页显示记录 //

private int index = 1;// 当前页号

private int totalCount = 0;// 记录总数 ok

private int totalPageCount = 1;// 总页数 ok

private int[] numbers;//展示页数集合 //ok

protected List<T> list;//要显示到页面的数据集

9. 基本分页的后台操作

(1) 基本分页的后台操作控制层如何处理,业务层如何处理,数据访问层如何处理?控制层

控制层负责获取前端的数据 ,用户的操作数据 将数据存入pageBean中 ,并将pageBean作为参数 ---> service 调用查询数据的总数 放入pageBean 的totalCount ,在查询所有数据 放入pageBean的list数组中

10. 基本分页的前台操作

(1) 基本分页的前台操作,如何处理?贴出代码,并解释代码的含义

<td colspan="7">

<a href="showall?index=1">首页</a>

<a href="javascript:change(${pageBean.index-1 },${pageBean.size})">上一页</a>

//循环打印我们在pageBean中的numbers

<c:forEach items="${pageBean.numbers }" var="num">

<c:if test="${num==pageBean.index }">

[ <a href="javascript:change(${num},${pageBean.size})">${num }</a>]

</c:if>

<c:if test="${num!=pageBean.index }">

<a href="javascript:change(${num},${pageBean.size})">${num }</a>

</c:if>

</c:forEach>

//点击下一页 ,页码加一

<a href="javascript:change(${pageBean.index+1 },${pageBean.size})">下一页</a>

<a href="showall?index=${pageBean.totalPageCount }&size=${pageBean.size}">末页</a>

每页

<select οnchange="changeSize(this.value)">

<c:forEach begin="5" end="25" step="5" var="i">

<c:if test="${i==pageBean.size }">

<option value="${i }" selected="selected">${i } </option>

</c:if>

<c:if test="${i!=pageBean.size }">

<option value="${i }">${i } </option>

</c:if>

</c:forEach>

</select>

直接跳到第

<select οnchange="change(this.value,${pageBean.size})">

//取出totalPageCount 总页数

<c:forEach begin="1" end="${pageBean.totalPageCount }" var="number">

<c:if test="${number==pageBean.index }"> // 当当前显示页号等于pageBean中存入的页号相等就选中

<option var="${number }" selected="selected">${number }</option>

</c:if>

<c:if test="${number!=pageBean.index }">

<option var="${number }">${number }</option>

</c:if>

</c:forEach>

</select>

共${pageBean.totalCount }条记录 //从pageBean中取出totalCount总记录数

</td>

11. 基本分页的完善

(1) 本节课完善了分页的那些功能?是如何实现的,贴出前端代码,后端代码,并写出注释

12. 带查询条件的分页

(1) 带查询条件的分页跟不带查询条件的分页有什么区别?

Sql语句查询的分别

(2) 贴出带查询条件分页的前端代码,后端代码,并写出注释

stmt =conn.createStatement();

StringBuilder sql = new StringBuilder("select stu.* from student stu where 1=1");

if (name !=null && !"".equals(name)) {

sql.append(" and name like '%"+name+"%'");

}

if (minScore !=0) {

sql.append(" and score >"+minScore);

}

sql.append(" order by score desc");//拼接查询条件

String sql2 ="select * from (select rownum rn,stu2.* "

+ "from ("+sql.toString()+" ) stu2 "

+ "where rownum <="+end+" ) "

+ "where rn >"+start;

rs = stmt.executeQuery(sql2);

13. 完善带查询条件的分页

(1) 完善了哪些功能?简述完善的思路.

74f89d625b24f205225b0e138a5d33f4.png

当点击页码或其他查询操作时触发事件 将表单也提交 并附带index和size参数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值