从10月8号到今天23号,来到工作已经半个月了,这是我人生中真正意义上的一次步入社会,用自己20年的坚持和努力取得的人生第一步,说实话,感觉自己真的是个lucky dog,好像是在眷顾我,所有的事情都是那么顺利,让我没有理由不珍惜现在的所有,谢谢老师,一次次的满足我的请求,这半月我收货到的不管是从为人处世,团队管理,还是技术方面都很多,所以每天晚上睡觉都会一躺就着,因为一睁开眼就会忙碌一天,不过真的真的很充实,下面先说说我从技术上的收获。
最近这段时间一直接触的是后台,咋说呢?最大的感受就是在学校的实践对我的影响是毋庸置疑的,加上后来参加java3.1和4.0,s让我能够比较快的接受现在的框架,说一下我最近做的一个模块:邀请管理。
需求:我们公司是一个理财公司,大家都知道邀请码,如果一个人邀请了另一个人会让被邀请人在注册时输入邀请码,如下图:
那在后来呢,在没有升级之前是没有对邀请人和被邀请人进行关联的,只有一个实体,那就有人给客服打电话说我明明已经输入邀请码了呀,为什么没有显示,那为什么邀请人会这么想要别人输入邀请码呢,因为如果被邀请人投资了,那么邀请人会有提成,所以需求就这么产生了,我们需要添加邀请人和被邀请人的关系,并且可以禁用,但是不可以修改,因为如果可以修改,操作后台的人就发财了,他可以随便把邀请人换成自己,所以这个是不可以的,而且还需要可以导出,其实还是挺简单的。下面我们先来说说查询功能:
MyBatis:
在这里我们需要写入查询语句,这个语句真的很庞大,需要从客户表中查出邀请人和被邀请人的信息,然后去投资表中查出被邀请人投资金额,在邀请人和被邀请人的关系表中查出该邀请人和被邀请人的关系:
T_CUST_USER:客户表;T_LOAN_BID:投资表;T_CUST_USER_INVITE:邀请表
下面看下我的sql语句:
<span style="font-family: Arial, Helvetica, sans-serif;"><sqlMap namespace="<strong>CustomerUserInvite</strong>"></span>
<select id="<strong>queryInviterList</strong>" parameterClass="map" resultClass="java.util.HashMap">
<![CDATA[
SELECT t8.*,T9."NAME" FROM(
SELECT t7.* FROM
(SELECT
t5.USER_ID,
t5.USER_NAME,
t5.INVITE_USER_ID,
t6.USER_NAME AS INVITE_USER_NAME,
t5.BID_AMOUNT,
T5.operator_,
T5.STATUS,
t5.BID_STATUS,
TO_CHAR(T6.CREATE_TIME, 'yyyy-mm-dd hh24:mi:ss') CREATE_TIME,
T5."ID"
FROM
(
SELECT
t3.USER_ID,
T4.USER_NAME,
t3.INVITE_USER_ID,
t3.BID_AMOUNT,
T3.operator_,
t3.BID_STATUS,
T3.STATUS,T3."ID"
FROM
(
SELECT
t1.USER_ID,
t1.INVITE_USER_ID,
t1.OPERATOR_,
t2.BID_AMOUNT,
t2.BID_STATUS,
t1."ID",
T1.STATUS
FROM
T_CUST_USER_INVITE t1
LEFT JOIN T_LOAN_BID t2 ON t1.INVITE_USER_ID = t2.USER_ID
) t3
LEFT JOIN T_CUST_USER t4 ON t3.USER_ID = t4.ID
) t5
LEFT JOIN T_CUST_USER t6 ON t5.INVITE_USER_ID = t6. ID) t7
WHERE 1=1)t8 LEFT JOIN T_USER_USER t9 ON t8.operator_=T9.id
]]>
<isNotEmpty prepend="" property="searchContent">
WHERE (T8.USER_NAME LIKE
'%$searchContent$%'
OR T8.INVITE_USER_NAME LIKE '%$searchContent$%' )
</isNotEmpty>
<![CDATA[
ORDER BY t8.STATUS DESC,t8.CREATE_TIME DESC
]]>
</select>
</sqlMap>
D层:
public class InviterDAO extends AbstractBaseDAO<CustomerUserInviteBean> {
public InviterDAO(SqlMapClient sqlMap) {
super(sqlMap);
}
// 对应xml中的命名空间
@Override
public String getNameSpace() {
return "CustomerUserInvite";
}
// 对应数据表
@Override
public String getTableName() {
return "T_CUST_USER_INVITE";
}
/**
* 查询全部-王丹
*
* @param paramMap
* @return
* @throws Exception
*/
public DataWrap pageQuery(Map paramMap) throws Exception {
return (DataWrap) DataAccessor.query(getNameSpace()
+ ".<strong>queryInviterList</strong>", paramMap, RS_TYPE.PAGED);
}
}
Service:
/**
* 分页查询全部-王丹-2015年10月14日16:43:38
*
* @param paramMap
* @return
* @throws Exception
*/
public DataWrap pagingQuery(Map inputMap) throws Exception {
return new InviterDAO(null).pageQuery(inputMap);
}
controller这儿需要注意一下:
我们不是直接去找controller,而是放到配置文件中,通过name去查,用的是struts:
<!-- 邀请人管理 -->
<service name="InviterService" class="com.voiinnov.puhuilicai.customer.controller.InviterController"></service>
下面看下controller:
public class InviterController extends AService {
private static Logger logger = Logger.getLogger(InviterController.class);
private InviterService inviterService = new InviterService();
@SuppressWarnings({ "unchecked", "rawtypes" })
public void listInviter(Context context) {
List errorList = context.errList;
// 用于存放返回结果,并用json返回到界面
Map outputMap = inviterService.outputMap;
try {
DataWrap dataWarp = this.inviterService
.pagingQuery(context.contextMap);
// 结果集
outputMap.put("dw", dataWarp);
outputMap.put("searchContent",
context.contextMap.get("searchContent"));
} catch (Exception e) {
e.printStackTrace();
errorList.add("系统错误,请联系系统管理员!");
logger.error(this.getClass().getName() + ":", e);
e.printStackTrace();
}
if (context.errList.isEmpty()) {
Output.jspOutput(outputMap, context,
"/puhuilicai/customer/InviterList.jsp");
} else {
outputMap.put("errList", context.errList);
Output.jspOutput(outputMap, context, "/error.jsp");
}
}
jsp中:
<body οnlοad="setAction();">
<form name="form1" id="form1"<strong> action="../servlet/defaultDispatcher"</strong>
method="post">
<input name="__action" value="<strong>InviterService.listInviter</strong>"
type="hidden" /> <input name="statusShow" value="${statusShow }"
type="hidden" />
<!--头部开始-->
<div id="fixedLayer">
<div class="main">
<div class="main_c main_bg">
<div class="main_nav">
<div class="nav_pic">
<a href="javascript:void(0)" title="新增" οnclick="initInviter()"><img
src="${ctx }/commons/images/system/table_create1.gif" /></a>
<a href="javascript:void(0);" title="导出" οnclick="exportInviter()">
<img src="../commons/images/system/ta_download1.jpg"></a>
<ul style="float: right; margin-right: 5px; text-align: left;">
<li><a href="javascript:void(0)" title="启用"
οnclick="updateStatus(0)"> 启 用</a></li>
<li><a href="javascript:void(0)" title="停用"
οnclick="updateStatus(-2)"> 禁 用</a></li>
</ul>
</div>
</div>
</div>
</div>
</div>
<!--头部结束-->
<!-模糊查询开始-->
<div class="margintop40"></div>
<div class="main">
<div class="main_c main_bg">
<!--自适应宽度 -start-->
<div class="table_scroll">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td align="center" valign="top">
<table width="100%" border="0" align="center" cellpadding="0"
cellspacing="0" class="">
<tr align="center" valign="middle">
<td height="35" align="left" valign="middle"
class="table_title_td_bg">
<div style="float: left; line-height: 30px;">
<span class=" margin_left10 font_white"><strong></strong></span>
</div> <%@ include file="/commons/pageControl.jsp"%>
<!-- 搜索和排序 -start-->
<div style="float: right; line-height: 30px; width: 450px;">
<div class="tsearch-panel-fields" style="margin-top: 6px;">
<label for="searchContent">邀请人,被邀请人</label> <input
name="searchContent" id="searchContent" type="text"
class="span3" value="${searchContent }" />
</div>
<input type="image" οnclick="doSearch();"
src="${ctx }/commons/images/system/btn_search.png"
style="width: 50px; height: 23px; margin-top: 6px; margin-left: 5px;" />
</div> <!-- 搜索和排序 -end-->
</tr>
</table>
</td>
</tr>
</table>
</div>
<!-- 查询表格 -->
<table width="100%" border="1" align="center" cellpadding="0"
cellspacing="0" class="table_style table2">
<tr>
<th style="text-align: center;" class="table_th_bg">序号
</td>
<th style="text-align: center;" class="table_th_bg">邀请人</th>
<th style="text-align: center;" class="table_th_bg">被邀请人</th>
<th style="text-align: center;" class="table_th_bg">注册时间</th>
<th style="text-align: center;" class="table_th_bg">操作员</th>
<th style="text-align: center;" class="table_th_bg">投资金额</th>
<th style="text-align: center;" class="table_th_bg">投资状态</th>
<th style="text-align: center;" class="table_th_bg">状态</th>
</tr>
<!-- 遍历查询结果 -->
<c:forEach items="${dw.rs }" var="lists" varStatus="status">
<tr id="${lists.ID}" USER_ID="${lists.USER_ID}"
οnclick="changeTrColor(this);" style="cursor: pointer;"
<c:if test="${status.count % 2 == 0 }">bgcolor="#F5F5F5"</c:if>>
<td style="text-align: center;">${status.count + dw.pageSize * (dw.currentPage - 1)}</td>
<td height="24">${lists.USER_NAME}</td>
<td height="24">${lists.INVITE_USER_NAME}</td>
<td height="26px" >${lists.CREATE_TIME}</td>
<td height="24">${lists.NAME}</td>
<td height="24">
<c:choose>
<c:when test="${empty lists.BID_AMOUNT }">
0
</c:when>
<c:otherwise>
${lists.BID_AMOUNT}
</c:otherwise>
</c:choose>
</td>
<td height="24">
<c:choose>
<c:when test="${lists.BID_STATUS eq -1}">
待付款
</c:when>
<c:when test="${lists.BID_STATUS eq 1}">
投资中
</c:when>
<c:when test="${lists.BID_STATUS eq 2}">
还款中
</c:when>
<c:when test="${lists.BID_STATUS eq 5}">
债权转让
</c:when>
<c:when test="${empty lists.BID_STATUS }">
未投资
</c:when>
<c:otherwise>
未知
</c:otherwise>
</c:choose>
</td>
<td>
<c:choose>
<c:when test="${lists.STATUS eq 0}">
启用
</c:when>
<c:otherwise>
禁用
</c:otherwise>
</c:choose>
</td>
</tr>
</c:forEach>
</table>
<%@ include file="/commons/pageControlBottom.jsp"%>
</div>
</div>
<!--内容结束-->
<div class="space"></div>
</form>
</body>
下面是出来的效果: