PHP交易详情有感
交易详情
一般都是按月的,
包含,交易日期,交易金额,交易状态(可有可无)
总交易额等等。
如果数据多的话,最好能够分页。
最好能够查询具体的哪一个商户。
1.模拟sql实现查询功能
SELECT a.id as user_id,a.username,b.name as store_name,c.id as order_id,c.price,c.paytime,c.sendtime,c.receivetime FROM sh_user a
LEFT JOIN sh_store b on a.id = b.user_id
LEFT JOIN sh_order c ON b.id = c.store_id
WHERE a.opener_id = 1 and a.`status` = 1 and c.status = 1 ORDER BY c.id desc; SELECT count(b.id) as count ,sum(c.price) as total_price FROM sh_user a
LEFT JOIN sh_store b on a.id = b.user_id
LEFT JOIN sh_order c ON b.id = c.store_id
WHERE a.opener_id = 1 and a.`status` = 1 and c.status = 1;
sql查询出来了,基本上就搞定了,剩下的就是用php,thinkphp实现这个查询功能,加入一些逻辑与条件。
// 商户交易
public function trade(){
if($type = $this->_request('type','trim')){
$s_year = $this->_request('s_year','trim');
$s_month = $this->_request('s_month','trim');
$s_user_id = $this->_request('s_user_id','trim,intval');
$this->assign('s_user_id',$s_user_id);
if($type == 'last'){ // 获取上一月
if($s_month==1){
$useYear = $s_year-1;
$useMonth = 12;
}else{
$useYear = $s_year;
$useMonth = $s_month-1;
}
} if($type == 'next'){ // 获取下一月
if($s_month==12){
$useYear = $s_year+1;
$useMonth = 1;
}else{
$useYear = $s_year;
$useMonth = $s_month+1;
}
} if ($type == 'selectuser'){
$useYear = $s_year;
$useMonth = $s_month;
}
}else{
// 获取当前年 月
$useYear = date('Y');
$useMonth = date('m');
}
$this->assign('s_year',$useYear);
$this->assign('s_month',$useMonth); $b_time = strtotime($useYear.'-'.$useMonth.'-'.'');
$e_time = strtotime($useYear.'-'.$useMonth.'-'.date('t',strtotime($b_time)).' 23:59:59');
if(isset($s_user_id) && $s_user_id > 0){
$where['a.id'] = $s_user_id;
}
$where['a.opener_id'] = $this->opener_id;
$where['a.status'] = 1; // 合法的用户
$where['c.status'] = 1; // 合法的订单
$where['c.paytime'] = array(array('gt',$b_time),array('lt',$e_time),'and');
$count_and_totalprice = M()->table('sh_user a')
->join('sh_store b on a.id = b.user_id')
->join('sh_order c on b.id = c.store_id')
->where($where)
->field('count(b.id) as count ,sum(c.price) as totalprice')
->find();
$count = $count_and_totalprice['count'];
$totalprice = $count_and_totalprice['totalprice'] ? $count_and_totalprice['totalprice'] : 0;
$Page = new Page($count, 10);
$list = M()->table('sh_user a')
->join('sh_store b on a.id = b.user_id')
->join('sh_order c on b.id = c.store_id')
->where($where)
->order('c.id desc')
->limit($Page->firstRow.','.$Page->listRows)
->field('a.id as user_id,a.username,b.name as store_name,c.id as order_id,c.price,c.paytime,c.sendtime,c.receivetime')
->select();
foreach ($list as $k => $v) {
if($v['sendtime'] == 0 && $v['receivetime'] == 0){
$list[$k]['progress'] = ''; // 已付款,待发货
}
if($v['sendtime'] > 0 && $v['receivetime'] == 0){
$list[$k]['progress'] = ''; // 已发货,待签收
}
if($v['sendtime'] > 0 && $v['receivetime'] > 0){
$list[$k]['progress'] = ''; // 交易完成
}
} // 获取拓展员用户
$user_list = M('User')
->where(array('opener_id'=>$this->opener_id))
->field('id,username')
->select();
$this->assign('user_list',$user_list);
$this->assign('totalprice',$totalprice);
$this->assign('page',$Page->show());
$this->assign('list', $list);
$this->display();
}
html部分
<include file="Public:head" title="交易详情" />
<style>
.top {
background-color: #eee;
height: 50px;
line-height: 50px;
font-size: 18px;
border-bottom: #ddd 1px solid;
margin-bottom: -1px;
} .list-group{
border: 1px solid #DDDDDD;
}
.list-group .list-group-item {
text-align: left;
line-height: 25px;
border: none;
background-color: #F9F9F9;
font-size: 14px;
} #select-date {
padding: 0px 10px;
} #select-date .date-txt {
font-size: 18px;
} #total {
width: 140px;
height: 140px;
background-color: #EC6C00;
margin: auto;
} #total .money-txt {
color: white;
padding-top: 10px;
} #datalist {
margin-top: 30px;
} #relief .form-control{
margin-top: 10px;
margin-bottom: 10px;
/*background-color: #FFCE42;*/
} .page{
margin-right: 10px;
margin-bottom: 20px;
} .table th {
color: #C4C4C4;
} .table tbody tr td+td+td {
color: #D3964F;
}
</style>
<script type="text/javascript">
function lastMonth(){
todo('last');
} function nextMonth(){
todo('next');
}
function selectUser(){
todo('selectuser');
}
function todo(type){
var s_year = $('#s_year').val();
var s_month = $('#s_month').val();
var s_user_id = $('#s_user_id').val();
window.location.href="{sh::U('User/trade')}&s_year="+s_year+"&s_month="+s_month+"&s_user_id="+s_user_id+"&type="+type;
}
</script> <body>
<div data-example-id="list-group-btns" class="bs-example">
<div id="select-date">
<ul class="pager">
<li class="previous"><a onclick="lastMonth();"><span aria-hidden="true">←</span> </a></li>
<span class="date-txt"><strong>{sh:$s_year}.{sh:$s_month}</strong>
<present name="paymentData"><span class="glyphicon glyphicon-ok-sign" aria-hidden="true"></span></present>
</span>
<input type="text" id="s_year" value="{sh:$s_year}" hidden="hidden">
<input type="text" id="s_month" value="{sh:$s_month}" hidden="hidden">
<li class="next"><a onclick="nextMonth();"><span aria-hidden="true">→</span></a></li>
</ul>
</div>
<div id="relief">
<select id="s_user_id" onchange="selectUser();" class="form-control btn-success">
<option value="">全部商户</option>
<volist name="user_list" id="vo">
<option value="{sh:$vo.id}" <eq name="vo.id" value="$s_user_id">selected="selected"</eq>>{sh:$vo.username}</option>
</volist>
</select>
</div>
<div id="total" class="img-circle">
<div class="text-center money-txt">
<h3>总交易金额</h3>
<h2>¥{sh:$totalprice}</h2>
</div>
</div>
<div id="datalist">
<table class="table table-striped">
<thead>
<tr>
<th>商户</th>
<th>日期</th>
<th>交易金额</th>
<!-- <th>状态</th> -->
</tr>
</thead>
<tbody>
<empty name="list"><tr><td class="text-center" colspan="4">暂无数据</td></tr></empty>
<volist name="list" id="vo">
<tr>
<td>{sh:$vo.username}</td>
<td>{sh:$vo.paytime|date="Y-m-d H:i",###}</td>
<td>{sh:$vo.price}</td>
<!-- <td>
<if condition="$vo.progress eq 1"><span class="text-primary">待发货</span>
<elseif condition="$vo.progress eq 2"/><span class="text-danger">待签收</span>
<elseif condition="$vo.progress eq 3"/><span class="text-success"><strong>已完成</strong></span>
</if>
</td> -->
</tr>
</volist>
</tbody>
</table>
<div class="page text-right">
{sh:$page}
</div>
</div>
</body> </html>
效果,多看看别人的设计,多学学,最重要的就是界面展示,一切的数据都是基于几面展示,所以先确定好需要什么数据,然后获取他们。

PHP交易详情有感的更多相关文章
- 从小工到专家 ——读《Java程序员职场全攻略》有感
从小工到专家 ——读<Java程序员职场全攻略>有感 <Java程序员职场全攻略>是以故事的形式,向读者介绍Java程序员的职场经验.作者牛开复在北京从事软件开发,已经是一 ...
- 漫谈可视化Prefuse(三)---Prefuse API数据结构阅读有感
前篇回顾:上篇<漫谈可视化Prefuse(二)---一分钟学会Prefuse>主要通过一个Prefuse的具体实例了解了构建一个Prefuse application的具体步骤.一个Pre ...
- 见证历史 -- 2013 NBA 热火夺冠之路有感
见证历史-- 2013 NBA 热火夺冠之路有感今年NBA季后赛从第一轮看起,到最终的热火夺冠,应该看得是最爽的一次.但一些情节和细节,回忆起来,深有感悟. 1. 做人要低调詹宁斯豪言演黑八雄鹿本赛季 ...
- <构建之法>第十三章到十七章有感以及这个项目读后感
<构建之法>第十三章到十七章有感 第13章:软件测试方法有哪些? 主要讲了软件测试方法:要说有什么问题就是哪种效率最高? 第14章:质量保障 软件的质量指标是什么?怎么样能够提升软件的质量 ...
- 段描述符表(GDT+LDT)的有感
[0]写在前面 要知道,在汇编中,代码的装入顺序决定了在内存中的地址位置.所有的代码或者数据都在硬盘上,当调试或者启动的时候,加载到内存:当需要对数据进行处理的时候,我们通过将数据从内存载入到regi ...
- 驱动:中断【2】中断处理程序、中断上下文中处理延时及一些函数的调用规则(调IIC中断驱动有感)
中断处理程序.中断上下文中处理延时及一些函数的调用规则(调IIC中断驱动有感)http://blog.csdn.net/samantha_sun/article/details/6790492 1,中 ...
- 第一次QQ群视频教育有感
标题:第一次QQ群视频教育有感 作者:丁又专, 时间:2014.08.16 教育的目的:启示学生心智,发现个人优势,激发探索欲望. 今天早上看到 中国大学MOOC<文献管理与信息 ...
- 10.读google测试之道有感
(一)读google测试之道有感.
- 重读COM技术内幕(inside com)有感
重读COM技术内幕(inside com)有感 面向对象设计哲学在复杂领域并不能很好地解决问题.参考(http://www.richardlord.net/blog/what-is-an-entity ...
随机推荐
- netty同时支持socket和http
项目需要使用netty做中转服务器,同时支持两种不同协议的客户端,经过几天查询资料终于找到合适的方案了,同时感谢Netty权威指南及论坛问答,开始贴代码 客户端1==>socket public ...
- Eclipse工具栏上android的机器人小图标不见了
可以通过「Window」⇒「Customize Perspective」⇒「Tool Bar Visibility」Tab画面上选择Android SDK and AVD Manager来显示
- Robot Framework(一)
一. 定义 Robot Framework是一款python编写的功能自动化测试框架,具有良好的可扩展性,支持关键字驱动,可以同时测试多种类型的客户端或者接口,可以进行分布式测试执行 二. Robot ...
- MySQL乱码问题及字符集实战
mysql> create database oldboy;Query OK, 1 row affected (0.01 sec) mysql> mysql> mysql> s ...
- mysql-5.7.17的最新安装教程
mysql-5.7.17-winx64是现在最新版本的Mysql,这是免安装的,所以要进行些配置 下载地址:https://cdn.mysql.com//Downloads/MySQL-5.7/mys ...
- 启动代码之开iCache
1.什么是cache,有什么用 cache是一种内存,叫高速缓存.从容量来说:CPU < 寄存器 < cache < DDR从速度来说:CPU > 寄存器 > ca ...
- struts转换器
struts转换器:在B/S应用中,将字符串请求参数转换为相应的数据类型,是MVC框架提供的功能,而Struts2是很好的MVC框架实现者,理所当然,提供了类型转换机制. 一.类型转换的意义 对于一个 ...
- UI- 五种手势识别总结
#pragma mark - 手势 总共有五种手势 分别为 Tap点击 Pan拖拽 LongPress长时间按压 Pinch捏合手势 rotation旋转 1. 定义成员变量 UIImageVie ...
- 【tensorflow:Google】四、深层神经网络
一.深度学习与深层神经网络 1.线性模型局限性 线性模型无论多少层,表达能力是一致的.可以通过激活函数实现非线性. 2.多层网络可以解决异或运算 二.损失函数定义 1.经典损失函数: 分类问题: 二分 ...
- C++复制构造函数的实现
复制构造函数是一种特殊的构造函数,有一般构造函数的特性.它的功能是用一个已知的对象来初始化一个被创建的同类对象.复制构造函数的参数传递方式必须按引用来进行传递,请看实例: #include <i ...