python学习

This commit is contained in:
2019-08-06 15:21:15 +08:00
parent 54761c6262
commit 020f56d2d5
37 changed files with 910 additions and 605 deletions

View File

@@ -1,8 +1,57 @@
# -*- coding: utf-8 -*-
from application import app,db
from flask import Blueprint
from common.libs.Helper import ops_render
from common.libs.Helper import getFormatDate
from common.models.stat.StatDailySite import StatDailySite
import datetime
route_index = Blueprint( 'index_page',__name__ )
@route_index.route("/")
def index():
return ops_render( "index/index.html" )
resp_data = {
'data':{
'finance':{
'today':0,
'month':0
},
'member': {
'today_new': 0,
'month_new': 0,
'total': 0
},
'order': {
'today': 0,
'month': 0
},
'shared': {
'today': 0,
'month': 0
},
}
}
now = datetime.datetime.now()
date_before_30days = now + datetime.timedelta( days = -30 )
date_from = getFormatDate( date = date_before_30days,format = "%Y-%m-%d" )
date_to = getFormatDate( date = now ,format = "%Y-%m-%d")
list = StatDailySite.query.filter( StatDailySite.date >= date_from)\
.filter( StatDailySite.date <= date_to ).order_by( StatDailySite.id.asc() )\
.all()
data = resp_data['data']
if list:
for item in list:
data['finance']['month'] += item.total_pay_money
data['member']['month_new'] += item.total_new_member_count
data['member']['total'] = item.total_member_count
data['order']['month'] += item.total_order_count
data['shared']['month'] += item.total_shared_count
if getFormatDate( date = item.date ,format = "%Y-%m-%d") == date_to:
data['finance']['today'] = item.total_pay_money
data['member']['today_new'] = item.total_new_member_count
data['order']['today'] = item.total_order_count
data['shared']['today'] = item.total_shared_count
return ops_render( "index/index.html",resp_data )

View File

@@ -1,20 +1,183 @@
# -*- coding: utf-8 -*-
from flask import Blueprint
from flask import Blueprint,request
from common.libs.Helper import ops_render
from application import app
from common.libs.Helper import getFormatDate,iPagination,getDictFilterField,selectFilterObj
from common.models.stat.StatDailySite import StatDailySite
from common.models.stat.StatDailyFood import StatDailyFood
from common.models.stat.StatDailyMember import StatDailyMember
from common.models.member.Member import Member
from common.models.food.Food import Food
import datetime
route_stat = Blueprint( 'stat_page',__name__ )
@route_stat.route( "/index" )
def index():
return ops_render( "stat/index.html" )
now = datetime.datetime.now()
date_before_30days = now + datetime.timedelta(days=-30)
default_date_from = getFormatDate(date=date_before_30days, format="%Y-%m-%d")
default_date_to = getFormatDate(date=now, format="%Y-%m-%d")
resp_data = {}
req = request.values
page = int(req['p']) if ('p' in req and req['p']) else 1
date_from = req['date_from'] if 'date_from' in req else default_date_from
date_to = req['date_to'] if 'date_to' in req else default_date_to
query = StatDailySite.query.filter(StatDailySite.date >= date_from) \
.filter(StatDailySite.date <= date_to)
page_params = {
'total': query.count(),
'page_size': app.config['PAGE_SIZE'],
'page': page,
'display': app.config['PAGE_DISPLAY'],
'url': request.full_path.replace("&p={}".format(page), "")
}
pages = iPagination(page_params)
offset = (page - 1) * app.config['PAGE_SIZE']
list = query.order_by(StatDailySite.id.desc()).offset( offset ).limit( app.config['PAGE_SIZE'] ).all()
resp_data['list'] = list
resp_data['pages'] = pages
resp_data['current'] = 'index'
resp_data['search_con'] = {
'date_from':date_from,
'date_to':date_to
}
return ops_render( "stat/index.html",resp_data )
@route_stat.route( "/food" )
def food():
return ops_render( "stat/food.html" )
now = datetime.datetime.now()
date_before_30days = now + datetime.timedelta(days=-30)
default_date_from = getFormatDate(date=date_before_30days, format="%Y-%m-%d")
default_date_to = getFormatDate(date=now, format="%Y-%m-%d")
resp_data = {}
req = request.values
page = int(req['p']) if ('p' in req and req['p']) else 1
date_from = req['date_from'] if 'date_from' in req else default_date_from
date_to = req['date_to'] if 'date_to' in req else default_date_to
query = StatDailyFood.query.filter(StatDailyFood.date >= date_from) \
.filter(StatDailyFood.date <= date_to)
page_params = {
'total': query.count(),
'page_size': app.config['PAGE_SIZE'],
'page': page,
'display': app.config['PAGE_DISPLAY'],
'url': request.full_path.replace("&p={}".format(page), "")
}
pages = iPagination(page_params)
offset = (page - 1) * app.config['PAGE_SIZE']
list = query.order_by(StatDailyFood.id.desc()).offset(offset).limit(app.config['PAGE_SIZE']).all()
date_list = []
if list:
food_map = getDictFilterField(Food, Food.id, "id", selectFilterObj(list, "food_id"))
for item in list:
tmp_food_info = food_map[item.food_id] if item.food_id in food_map else {}
tmp_data = {
"date": item.date,
"total_count": item.total_count,
"total_pay_money": item.total_pay_money,
'food_info': tmp_food_info
}
date_list.append(tmp_data)
resp_data['list'] = date_list
resp_data['pages'] = pages
resp_data['current'] = 'food'
resp_data['search_con'] = {
'date_from': date_from,
'date_to': date_to
}
return ops_render( "stat/food.html",resp_data )
@route_stat.route( "/member" )
def memebr():
return ops_render( "stat/member.html" )
now = datetime.datetime.now()
date_before_30days = now + datetime.timedelta(days=-30)
default_date_from = getFormatDate(date=date_before_30days, format="%Y-%m-%d")
default_date_to = getFormatDate(date=now, format="%Y-%m-%d")
resp_data = {}
req = request.values
page = int(req['p']) if ('p' in req and req['p']) else 1
date_from = req['date_from'] if 'date_from' in req else default_date_from
date_to = req['date_to'] if 'date_to' in req else default_date_to
query = StatDailyMember.query.filter(StatDailyMember.date >= date_from) \
.filter(StatDailyMember.date <= date_to)
page_params = {
'total': query.count(),
'page_size': app.config['PAGE_SIZE'],
'page': page,
'display': app.config['PAGE_DISPLAY'],
'url': request.full_path.replace("&p={}".format(page), "")
}
pages = iPagination(page_params)
offset = (page - 1) * app.config['PAGE_SIZE']
list = query.order_by(StatDailyMember.id.desc()).offset(offset).limit(app.config['PAGE_SIZE']).all()
date_list = []
if list:
member_map = getDictFilterField( Member,Member.id,"id",selectFilterObj( list ,"member_id") )
for item in list:
tmp_member_info = member_map[ item.member_id ] if item.member_id in member_map else {}
tmp_data = {
"date":item.date,
"total_pay_money":item.total_pay_money,
"total_shared_count":item.total_shared_count,
'member_info':tmp_member_info
}
date_list.append( tmp_data )
resp_data['list'] = date_list
resp_data['pages'] = pages
resp_data['current'] = 'member'
resp_data['search_con'] = {
'date_from': date_from,
'date_to': date_to
}
return ops_render( "stat/member.html",resp_data )
@route_stat.route( "/share" )
def share():
return ops_render( "stat/share.html" )
now = datetime.datetime.now()
date_before_30days = now + datetime.timedelta(days=-30)
default_date_from = getFormatDate(date=date_before_30days, format="%Y-%m-%d")
default_date_to = getFormatDate(date=now, format="%Y-%m-%d")
resp_data = {}
req = request.values
page = int(req['p']) if ('p' in req and req['p']) else 1
date_from = req['date_from'] if 'date_from' in req else default_date_from
date_to = req['date_to'] if 'date_to' in req else default_date_to
query = StatDailySite.query.filter(StatDailySite.date >= date_from) \
.filter(StatDailySite.date <= date_to)
page_params = {
'total': query.count(),
'page_size': app.config['PAGE_SIZE'],
'page': page,
'display': app.config['PAGE_DISPLAY'],
'url': request.full_path.replace("&p={}".format(page), "")
}
pages = iPagination(page_params)
offset = (page - 1) * app.config['PAGE_SIZE']
list = query.order_by(StatDailySite.id.desc()).offset(offset).limit(app.config['PAGE_SIZE']).all()
resp_data['list'] = list
resp_data['pages'] = pages
resp_data['current'] = 'food'
resp_data['search_con'] = {
'date_from': date_from,
'date_to': date_to
}
return ops_render( "stat/share.html",resp_data )

99
web/static/js/chart.js Normal file
View File

@@ -0,0 +1,99 @@
;
//画图通用组件,虽然估计很难统一,但是总要走出第一步了
var charts_ops = {
setOption:function(){
Highcharts.setOptions({
chart: {
},
exporting: {
enabled: false
},
legend: {
//enabled:false
},
credits:{
enabled:false
},
colors:['#058DC7', '#50B432', '#ED561B', '#DDDF00',
'#24CBE5', '#64E572', '#FF9655', '#FFF263', '#6AF9C4','#E93EFF'],
title: '',
xAxis: {
tickWidth:0,
lineWidth: 0,
gridLineColor: '#eee',
//gridLineWidth: 1,
crosshair: {
width: 1,
color: '#ebebeb'
}
},
yAxis: {
gridLineColor: '#eee',
gridLineWidth: 1,
title: ''
},
plotOptions: {
column: {
pointPadding: 0.2,
pointWidth: 20,
borderWidth: 0
},
series: {
marker: {
enabled: false
},
},
line: {
lineWidth: 2,
states: {
hover: {
lineWidth: 2
}
}
}
},
tooltip: {
backgroundColor: '#404750',
borderWidth: 0,
shadow: false,
headerFormat: '',
footerFormat: '',
shared: true,
useHTML: true,
style: {
color: '#fff',
padding: '5px'
}
},
lang: {
noData: "暂无数据"
},
noData: {
style: {
fontWeight: 'bold',
fontSize: '15px',
color: '#303030'
}
}
});
},
drawLine:function( target ,data ){//画直线
var chart = target.highcharts({
chart: {
type: 'spline'
},
xAxis: {
categories: data.categories
},
series: data.series,
legend: {
enabled:true,
align: 'right',
verticalAlign: 'top',
x: 0,
y: -15
}
});
return chart;
}
};

View File

@@ -139,7 +139,7 @@ var common_ops = {
scrollTop: target.offset().top - 10
}, 100);
},
buildUrl:function( path ,params ){
buildUrl:function( path ,params ){
var url = "" + path;
var _paramUrl = "";
if( params ){
@@ -150,11 +150,11 @@ var common_ops = {
}
return url + _paramUrl;
},
buildPicUrl:function( img_key ){
buildPicUrl:function( img_key ){
var domain = $(".hidden_layout_wrap input[name=domain]").val();
var prefix_url = $(".hidden_layout_wrap input[name=prefix_url]").val();
return domain + prefix_url + img_key;
}
}
};
$(document).ready( function() {

View File

@@ -0,0 +1,28 @@
;
var dashboard_index_ops = {
init:function(){
this.drawChart();
},
drawChart:function(){
charts_ops.setOption();
$.ajax({
url:common_ops.buildUrl("/chart/dashboard"),
dataType:'json',
success:function( res ){
charts_ops.drawLine( $('#member_order'),res.data )
}
});
$.ajax({
url:common_ops.buildUrl("/chart/finance"),
dataType:'json',
success:function( res ){
charts_ops.drawLine( $('#finance'),res.data )
}
});
}
};
$(document).ready( function(){
dashboard_index_ops.init();
});

View File

View File

@@ -0,0 +1,34 @@
;
var stat_member_ops = {
init:function(){
this.eventBind();
this.datetimepickerComponent();
},
eventBind:function(){
$("#search_form_wrap .search").click( function(){
$("#search_form_wrap").submit();
});
},
datetimepickerComponent:function() {
var that = this;
$.datetimepicker.setLocale('zh');
params = {
scrollInput: false,
scrollMonth: false,
scrollTime: false,
dayOfWeekStart: 1,
lang: 'zh',
todayButton: true,//回到今天
defaultSelect: true,
defaultDate: new Date().Format('yyyy-MM-dd'),
format: 'Y-m-d',//格式化显示
timepicker: false
};
$('#search_form_wrap input[name=date_from]').datetimepicker(params);
$('#search_form_wrap input[name=date_to]').datetimepicker(params);
}
};
$(document).ready( function(){
stat_member_ops.init();
});

View File

@@ -0,0 +1,34 @@
;
var stat_product_ops = {
init:function(){
this.eventBind();
this.datetimepickerComponent();
},
eventBind:function(){
$("#search_form_wrap .search").click( function(){
$("#search_form_wrap").submit();
});
},
datetimepickerComponent:function() {
var that = this;
$.datetimepicker.setLocale('zh');
params = {
scrollInput: false,
scrollMonth: false,
scrollTime: false,
dayOfWeekStart: 1,
lang: 'zh',
todayButton: true,//回到今天
defaultSelect: true,
defaultDate: new Date().Format('yyyy-MM-dd'),
format: 'Y-m-d',//格式化显示
timepicker: false
};
$('#search_form_wrap input[name=date_from]').datetimepicker(params);
$('#search_form_wrap input[name=date_to]').datetimepicker(params);
}
};
$(document).ready( function(){
stat_product_ops.init();
});

View File

@@ -0,0 +1,46 @@
;
var stat_share_ops = {
init:function(){
this.eventBind();
this.drawChart();
this.datetimepickerComponent();
},
eventBind:function(){
$("#search_form_wrap .search").click( function(){
$("#search_form_wrap").submit();
});
},
datetimepickerComponent:function(){
var that = this;
$.datetimepicker.setLocale('zh');
params = {
scrollInput: false,
scrollMonth: false,
scrollTime: false,
dayOfWeekStart: 1,
lang: 'zh',
todayButton: true,//回到今天
defaultSelect: true,
defaultDate: new Date().Format('yyyy-MM-dd'),
format: 'Y-m-d',//格式化显示
timepicker: false
};
$('#search_form_wrap input[name=date_from]').datetimepicker(params);
$('#search_form_wrap input[name=date_to]').datetimepicker(params);
},
drawChart:function(){
charts_ops.setOption();
$.ajax({
url:common_ops.buildUrl("/chart/share"),
dataType:'json',
success:function( res ){
charts_ops.drawLine( $('#container'),res.data )
}
});
}
};
$(document).ready( function(){
stat_share_ops.init();
});

View File

@@ -10,6 +10,7 @@ var user_login_ops = {
common_ops.alert("正在处理!!请不要重复提交~~");
return;
}
var login_name = $(".login_wrap input[name=login_name]").val();
var login_pwd = $(".login_wrap input[name=login_pwd]").val();

View File

@@ -9,16 +9,15 @@
<select name="status" class="form-control inline">
<option value="-1">请选择状态</option>
{% for tmp_key in status_mapping %}
<option value="{{tmp_key}}" {% if tmp_key==search_con['status'] %} selected {% endif %}>{{ status_mapping[ tmp_key] }}</option>
<option value="{{ tmp_key }}" {% if tmp_key == search_con['status'] %} selected {% endif %}>{{ status_mapping[ tmp_key ] }}</option>
{% endfor %}
</select>
</div>
<div class="form-group">
<div class="input-group">
<input type="text" name="mix_kw" placeholder="请输入姓名或者手机号码" class="form-control" value="{{ search_con['mix_kw']}}">
<input type="hidden" name="p" value="{{ search_con['p']}}">
<input type="text" name="mix_kw" placeholder="请输入姓名或者手机号码" class="form-control" value="{{ search_con['mix_kw'] }}">
<input type="hidden" name="p" value="{{ search_con['p'] }}">
<span class="input-group-btn">
<button type="button" class="btn btn-primary search">
<i class="fa fa-search"></i>搜索
@@ -37,7 +36,7 @@
</div>
</div>
</form>
<table class="table table-bordered m-t">
<table class="table table-bordered m-t">
<thead>
<tr>
<th>序号</th>
@@ -81,9 +80,7 @@
{% endif %}
</tbody>
</table>
<!--分页代码已被封装到统一模板文件中-->
<!--分页代码已被封装到统一模板文件中-->
{% include 'common/pagenation.html' %}
</div>
</div>

View File

@@ -8,28 +8,28 @@
<div class="form-group">
<label class="col-lg-2 control-label">姓名:</label>
<div class="col-lg-10">
<input type="text" name="nickname" class="form-control" placeholder="请输入姓名~~" value="{{ info.nickname}}">
<input type="text" name="nickname" class="form-control" placeholder="请输入姓名~~" value="{{ info.nickname }}">
</div>
</div>
<div class="hr-line-dashed"></div>
<div class="form-group">
<label class="col-lg-2 control-label">手机:</label>
<div class="col-lg-10">
<input type="text" name="mobile" class="form-control" placeholder="请输入手机~~" value="{{ info.mobile}}">
<input type="text" name="mobile" class="form-control" placeholder="请输入手机~~" value="{{ info.mobile }}">
</div>
</div>
<div class="hr-line-dashed"></div>
<div class="form-group">
<label class="col-lg-2 control-label">邮箱:</label>
<div class="col-lg-10">
<input type="text" name="email" class="form-control" placeholder="请输入邮箱~~" value="{{ info.email}}">
<input type="text" name="email" class="form-control" placeholder="请输入邮箱~~" value="{{ info.email }}">
</div>
</div>
<div class="hr-line-dashed"></div>
<div class="form-group">
<label class="col-lg-2 control-label">登录名:</label>
<div class="col-lg-10">
<input type="text" name="login_name" class="form-control" autocomplete="off" placeholder="请输入登录名~~" value="{{ info.login_name}}">
<input type="text" name="login_name" class="form-control" autocomplete="off" placeholder="请输入登录名~~" value="{{ info.login_name }}">
</div>
</div>
<div class="hr-line-dashed"></div>
@@ -42,7 +42,7 @@
<div class="hr-line-dashed"></div>
<div class="form-group">
<div class="col-lg-4 col-lg-offset-2">
<input type="hidden" name="id" value="{{ info.uid}}">
<input type="hidden" name="id" value="{{ info.uid }}">
<button class="btn btn-w-m btn-outline btn-primary save">保存</button>
</div>
</div>

View File

@@ -59,7 +59,7 @@
{% for item in list %}
<tr>
<td>{{ item.name }}</td>
<td>{{ cat_mapping[ item.cat_id].name }}</td>
<td>{{ item.name }}</td>
<td>{{ item.price }}</td>
<td>{{ item.stock }}</td>
<td>{{ item.tags }}</td>

View File

@@ -9,8 +9,8 @@
<h5>营收概况</h5>
</div>
<div class="ibox-content">
<h1 class="no-margins">1005.00</h1>
<small>近30日31177.00</small>
<h1 class="no-margins">{{ data.finance.today }}</h1>
<small>近30日{{ data.finance.month }}</small>
</div>
</div>
</div>
@@ -21,8 +21,8 @@
<h5>订单</h5>
</div>
<div class="ibox-content">
<h1 class="no-margins">988</h1>
<small>近30日29383</small>
<h1 class="no-margins">{{ data.order.today }}</h1>
<small>近30日{{ data.order.today }}</small>
</div>
</div>
</div>
@@ -33,9 +33,9 @@
<h5>会员</h5>
</div>
<div class="ibox-content">
<h1 class="no-margins">358</h1>
<small>今日新增:77</small>
<small>近30日新增2454</small>
<h1 class="no-margins">{{ data.member.total }}</h1>
<small>今日新增:{{ data.member.today_new }}</small>
<small>近30日新增{{ data.member.month_new }}</small>
</div>
</div>
</div>
@@ -46,8 +46,8 @@
<h5>分享</h5>
</div>
<div class="ibox-content">
<h1 class="no-margins">1250</h1>
<small>近30日45980</small>
<h1 class="no-margins">{{ data.shared.today }}</h1>
<small>近30日{{ data.shared.month }}</small>
</div>
</div>
</div>
@@ -61,4 +61,9 @@
</div>
</div>
</div>
{% endblock %}
{% block js %}
<script src="{{ buildStaticUrl('/plugins/highcharts/highcharts.js') }}"></script>
<script src="{{ buildStaticUrl('/js/chart.js') }}"></script>
<script src="{{ buildStaticUrl('/js/index/index.js') }}"></script>
{% endblock %}

View File

@@ -1,19 +1,6 @@
{% extends "common/layout_main.html" %}
{% block content %}
<div class="row border-bottom">
<div class="col-lg-12">
<div class="tab_title">
<ul class="nav nav-pills">
<li>
<a href="{{ buildUrl('/member/index') }}">会员列表</a>
</li>
<li class="current">
<a href="{{ buildUrl('/member/comment') }}">会员评论</a>
</li>
</ul>
</div>
</div>
</div>
{% include "common/tab_member.html" %}
<div class="row">
<div class="col-lg-12">
<table class="table table-bordered m-t">
@@ -27,27 +14,29 @@
</tr>
</thead>
<tbody>
{% if list %}
{% for item in list %}
<tr>
<td>
<img alt="image" class="img-circle" src="{{ buildStaticUrl('/images/common/avatar.png') }}" style="width: 40px;height: 40px;">
<img alt="image" class="img-circle" src="{{ item.member_info.avatar }}" style="width: 40px;height: 40px;">
</td>
<td>{{ item.member_info.nickname }}</td>
<td>
编程浪子
{% for item_food in item.foods %}
{{ item_food.name }}、
{% endfor %}
</td>
<td>小鸡炖蘑菇</td>
<td>非常愉快的订餐服务</td>
<td>8</td>
<td>{{ item.content }}</td>
<td>{{ item.score }}</td>
</tr>
{% endfor %}
{% else %}
<tr><td colspan="5">暂无数据</td></tr>
{% endif %}
</tbody>
</table>
<div class="row">
<div class="col-lg-12">
<span class="pagination_count" style="line-height: 40px;">共1条记录 | 每页50条</span>
<ul class="pagination pagination-lg pull-right" style="margin: 0 0 ;">
<li class="active"><a href="javascript:void(0);">1</a></li>
</ul>
</div>
</div>
<!--分页代码已被封装到统一模板文件中-->
{% include 'common/pagenation.html' %}
</div>
</div>
{% endblock %}

View File

@@ -1,19 +1,6 @@
{% extends "common/layout_main.html" %}
{% block content %}
<div class="row border-bottom">
<div class="col-lg-12">
<div class="tab_title">
<ul class="nav nav-pills">
<li class="current">
<a href="{{ buildUrl('/member/index') }}">会员列表</a>
</li>
<li>
<a href="{{ buildUrl('/member/comment') }}">会员评论</a>
</li>
</ul>
</div>
</div>
</div>
{% include "common/tab_member.html" %}
<div class="row">
<div class="col-lg-12">
<form class="form-inline wrap_search">
@@ -22,13 +9,13 @@
<select name="status" class="form-control inline">
<option value="-1">请选择状态</option>
{% for tmp_key in status_mapping %}
<option value="{{ tmp_key }}"{% if tmp_key == search_con['status'] %} selected {% endif %}>{{ status_mapping[ tmp_key ] }}</option>
<option value="{{ tmp_key }}" {% if tmp_key == search_con['status'] %} selected {% endif %}>{{ status_mapping[ tmp_key ] }}</option>
{% endfor %}
</select>
</div>
<div class="form-group">
<div class="input-group">
<input type="text" name="mix_kw" placeholder="请输入关键字" class="form-control" value="{{search_con['mix_kw']}}">
<input type="text" name="mix_kw" placeholder="请输入关键字" class="form-control" value="{{ search_con['mix_kw'] }}">
<input type="hidden" name="p" value="{{ search_con['p'] }}">
<span class="input-group-btn">
<button type="button" class="btn btn-primary search">
@@ -51,7 +38,7 @@
</tr>
</thead>
<tbody>
{% if list %}
{% if list %}
{% for item in list %}
<tr>
<td><img alt="image" class="img-circle" src="{{ item.avatar }}" style="width: 40px;height: 40px;"></td>
@@ -85,10 +72,11 @@
</tbody>
</table>
<!--分页代码已被封装到统一模板文件中-->
{% include 'common/pagenation.html'%}
{% include 'common/pagenation.html' %}
</div>
</div>
{% endblock %}
{% block js %}
{% block js %}
<script src="{{ buildStaticUrl('/js/member/index.js') }}"></script>
{% endblock %}

View File

@@ -1,25 +1,12 @@
{% extends "common/layout_main.html" %}
{% block content %}
<div class="row border-bottom">
<div class="col-lg-12">
<div class="tab_title">
<ul class="nav nav-pills">
<li class="current">
<a href="{{ buildUrl('/member/index') }}">会员列表</a>
</li>
<li>
<a href="{{ buildUrl('/member/comment') }}">会员评论</a>
</li>
</ul>
</div>
</div>
</div>
{% include "common/tab_member.html" %}
<div class="row m-t">
<div class="col-lg-12">
<div class="row">
<div class="col-lg-12">
<div class="m-b-md">
% if info.status ==1 %
{% if info.status == 1 %}
<a class="btn btn-outline btn-primary pull-right" href="{{ buildUrl('/member/set') }}?id={{ info.id }}">
<i class="fa fa-pencil"></i>编辑
</a>
@@ -67,9 +54,18 @@
</tr>
</thead>
<tbody>
{% if pay_order_list %}
{% for item in pay_order_list %}
<tr>
<td colspan="4">暂无订单</td>
<td>{{ item.order_number }}</td>
<td>{{ item.pay_time }}</td>
<td>{{ item.total_price }}</td>
<td>{{ item.status_desc }}</td>
</tr>
{% endfor %}
{% else %}
<td colspan="4">暂无订单</td>
{% endif %}
</tbody>
</table>
</div>
@@ -85,10 +81,17 @@
<tbody>
<tr>
</tr>
{% if comment_list %}
{% for item in comment_list %}
<tr>
<td colspan="3">暂无评论</td>
<td>{{ item.created_time }}</td>
<td>{{ item.score }}</td>
<td>{{ item.content }}</td>
</tr>
{% endfor %}
{% else %}
<td colspan="3">暂无评论</td>
{% endif %}
</tbody>
</table>
</div>

View File

@@ -1,19 +1,6 @@
{% extends "common/layout_main.html" %}
{% block content %}
<div class="row border-bottom">
<div class="col-lg-12">
<div class="tab_title">
<ul class="nav nav-pills">
<li class="current">
<a href="{{ buildUrl('/member/index') }}">会员列表</a>
</li>
<li>
<a href="{{ buildUrl('/member/comment') }}">会员评论</a>
</li>
</ul>
</div>
</div>
</div>
{% include "common/tab_member.html" %}
<div class="row mg-t20 wrap_member_set">
<div class="col-lg-12">
<h2 class="text-center">会员设置</h2>

View File

@@ -1,33 +1,13 @@
{% extends "common/layout_main.html" %}
{% block content %}
<div class="row border-bottom">
<div class="col-lg-12">
<div class="tab_title">
<ul class="nav nav-pills">
<li>
<a href="{{ buildUrl('/stat/index') }}">财务统计</a>
</li>
<li class="current">
<a href="{{ buildUrl('/stat/food') }}">售卖统计</a>
</li>
<li>
<a href="{{ buildUrl('/stat/member') }}">会员消费统计</a>
</li>
<li>
<a href="{{ buildUrl('/stat/share') }}">分享统计</a>
</li>
</ul>
</div>
</div>
</div>
{% include "common/tab_stat.html" %}
<div class="row m-t">
<div class="col-lg-12 m-t">
<form class="form-inline" id="search_form_wrap">
<div class="row p-w-m">
<div class="form-group">
<div class="input-group">
<input type="text" placeholder="请选择开始时间" name="date_from" class="form-control"
value="2018-05-08">
<input type="text" placeholder="请选择开始时间" name="date_from" class="form-control" value="{{ search_con['date_from'] }}">
</div>
</div>
<div class="form-group m-r m-l">
@@ -35,7 +15,7 @@
</div>
<div class="form-group">
<div class="input-group">
<input type="text" placeholder="请选择结束时间" name="date_to" class="form-control" value="2018-06-07">
<input type="text" placeholder="请选择结束时间" name="date_to" class="form-control" value="{{ search_con['date_to'] }}">
</div>
</div>
<div class="form-group">
@@ -54,19 +34,29 @@
</tr>
</thead>
<tbody>
{% if list %}
{% for item in list %}
<tr>
<td colspan="5">暂无数据</td>
<td>{{ item.date }}</td>
<td>{{ item.food_info.name }}</td>
<td>{{ item.total_count }}</td>
<td>{{ item.total_pay_money }}</td>
</tr>
{% endfor %}
{% else %}
<tr><td colspan="2">暂无数据~~</td></tr>
{% endif %}
</tbody>
</table>
<div class="row">
<div class="col-lg-12">
<span class="pagination_count" style="line-height: 40px;">共0条记录 | 每页50条</span>
<ul class="pagination pagination-lg pull-right" style="margin: 0 0 ;">
<li class="active"><a href="javascript:void(0);">1</a></li>
</ul>
</div>
</div>
<!--分页代码已被封装到统一模板文件中-->
{% include 'common/pagenation.html' %}
</div>
</div>
{% endblock %}
{% block css %}
<link href="{{ buildStaticUrl('/plugins/datetimepicker/jquery.datetimepicker.min.css') }}" rel="stylesheet">
{% endblock %}
{% block js %}
<script src="{{ buildStaticUrl('/plugins/datetimepicker/jquery.datetimepicker.full.min.js') }}"></script>
<script src="{{ buildStaticUrl('/js/stat/product.js') }}"></script>
{% endblock %}

View File

@@ -1,25 +1,6 @@
{% extends "common/layout_main.html" %}
{% block content %}
<div class="row border-bottom">
<div class="col-lg-12">
<div class="tab_title">
<ul class="nav nav-pills">
<li class="current">
<a href="{{ buildUrl('/stat/index') }}">财务统计</a>
</li>
<li>
<a href="{{ buildUrl('/stat/food') }}">售卖统计</a>
</li>
<li>
<a href="{{ buildUrl('/stat/member') }}">会员消费统计</a>
</li>
<li>
<a href="{{ buildUrl('/stat/share') }}">分享统计</a>
</li>
</ul>
</div>
</div>
</div>
{% include "common/tab_stat.html" %}
<div class="row m-t">
<div class="col-lg-12" id="container" style="height: 400px;" data-highcharts-chart="0">
图标使用Highchart
@@ -29,8 +10,7 @@
<div class="row p-w-m">
<div class="form-group">
<div class="input-group">
<input type="text" placeholder="请选择开始时间" name="date_from" class="form-control"
value="2018-05-08">
<input type="text" placeholder="请选择开始时间" name="date_from" class="form-control" value="{{ search_con['date_from'] }}">
</div>
</div>
<div class="form-group m-r m-l">
@@ -38,7 +18,7 @@
</div>
<div class="form-group">
<div class="input-group">
<input type="text" placeholder="请选择结束时间" name="date_to" class="form-control" value="2018-06-07">
<input type="text" placeholder="请选择结束时间" name="date_to" class="form-control" value="{{ search_con['date_to'] }}">
</div>
</div>
<div class="form-group">
@@ -55,20 +35,29 @@
</tr>
</thead>
<tbody>
{% if list %}
{% for item in list %}
<tr>
<td>2018-06-07</td>
<td>1007.00</td>
<td>{{ item.date }}</td>
<td>{{ item.total_pay_money }}</td>
</tr>
{% endfor %}
{% else %}
<tr><td colspan="2">暂无数据~~</td></tr>
{% endif %}
</tbody>
</table>
<div class="row">
<div class="col-lg-12">
<span class="pagination_count" style="line-height: 40px;">共1条记录 | 每页50条</span>
<ul class="pagination pagination-lg pull-right" style="margin: 0 0 ;">
<li class="active"><a href="javascript:void(0);">1</a></li>
</ul>
</div>
</div>
<!--分页代码已被封装到统一模板文件中-->
{% include 'common/pagenation.html' %}
</div>
</div>
{% endblock %}
{% block css %}
<link href="{{ buildStaticUrl('/plugins/datetimepicker/jquery.datetimepicker.min.css') }}" rel="stylesheet">
{% endblock %}
{% block js %}
<script src="{{ buildStaticUrl('/plugins/highcharts/highcharts.js') }}"></script>
<script src="{{ buildStaticUrl('/js/chart.js') }}"></script>
<script src="{{ buildStaticUrl('/plugins/datetimepicker/jquery.datetimepicker.full.min.js') }}"></script>
<script src="{{ buildStaticUrl('/js/stat/index.js') }}"></script>
{% endblock %}

View File

@@ -1,33 +1,13 @@
{% extends "common/layout_main.html" %}
{% block content %}
<div class="row border-bottom">
<div class="col-lg-12">
<div class="tab_title">
<ul class="nav nav-pills">
<li>
<a href="{{ buildUrl('/stat/index') }}">财务统计</a>
</li>
<li>
<a href="{{ buildUrl('/stat/food') }}">售卖统计</a>
</li>
<li class="current">
<a href="{{ buildUrl('/stat/member') }}">会员消费统计</a>
</li>
<li>
<a href="{{ buildUrl('/stat/share') }}">分享统计</a>
</li>
</ul>
</div>
</div>
</div>
{% include "common/tab_stat.html" %}
<div class="row m-t">
<div class="col-lg-12 m-t">
<form class="form-inline" id="search_form_wrap">
<div class="row p-w-m">
<div class="form-group">
<div class="input-group">
<input type="text" placeholder="请选择开始时间" name="date_from" class="form-control"
value="2018-05-08">
<input type="text" placeholder="请选择开始时间" name="date_from" class="form-control" value="{{ search_con['date_from'] }}">
</div>
</div>
<div class="form-group m-r m-l">
@@ -35,7 +15,7 @@
</div>
<div class="form-group">
<div class="input-group">
<input type="text" placeholder="请选择结束时间" name="date_to" class="form-control" value="2018-06-07">
<input type="text" placeholder="请选择结束时间" name="date_to" class="form-control" value="{{ search_con['date_to'] }}">
</div>
</div>
<div class="form-group">
@@ -54,25 +34,29 @@
</tr>
</thead>
<tbody>
{% if list %}
{% for item in list %}
<tr>
<td>2018-06-07</td>
<td>
编程浪子
</td>
<td>1003.00</td>
<td>57</td>
<td>{{ item.date }}</td>
<td>{{ item.member_info.nickname }}</td>
<td>{{ item.total_pay_money }}</td>
<td>{{ item.total_shared_count }}</td>
</tr>
{% endfor %}
{% else %}
<tr><td colspan="2">暂无数据~~</td></tr>
{% endif %}
</tbody>
</table>
<!--分页代码已被封装到统一模板文件中-->
<div class="row">
<div class="col-lg-12">
<span class="pagination_count" style="line-height: 40px;">共1条记录 | 每页50条</span>
<ul class="pagination pagination-lg pull-right" style="margin: 0 0 ;">
<li class="active"><a href="javascript:void(0);">1</a></li>
</ul>
</div>
</div>
{% include 'common/pagenation.html' %}
</div>
</div>
{% endblock %}
{% block css %}
<link href="{{ buildStaticUrl('/plugins/datetimepicker/jquery.datetimepicker.min.css') }}" rel="stylesheet">
{% endblock %}
{% block js %}
<script src="{{ buildStaticUrl('/plugins/datetimepicker/jquery.datetimepicker.full.min.js') }}"></script>
<script src="{{ buildStaticUrl('/js/stat/member.js') }}"></script>
{% endblock %}

View File

@@ -1,25 +1,6 @@
{% extends "common/layout_main.html" %}
{% block content %}
<div class="row border-bottom">
<div class="col-lg-12">
<div class="tab_title">
<ul class="nav nav-pills">
<li>
<a href="{{ buildUrl('/stat/index') }}">财务统计</a>
</li>
<li>
<a href="{{ buildUrl('/stat/food') }}">售卖统计</a>
</li>
<li>
<a href="{{ buildUrl('/stat/member') }}">会员消费统计</a>
</li>
<li class="current">
<a href="{{ buildUrl('/stat/share') }}">分享统计</a>
</li>
</ul>
</div>
</div>
</div>
{% include "common/tab_stat.html" %}
<div class="row m-t">
<div class="col-lg-12" id="container" style="height: 400px;" data-highcharts-chart="0">
图标使用Highchart
@@ -29,7 +10,7 @@
<div class="row p-w-m">
<div class="form-group">
<div class="input-group">
<input type="text" placeholder="请选择开始时间" name="date_from" class="form-control" value="2018-05-08">
<input type="text" placeholder="请选择开始时间" name="date_from" class="form-control" value="{{ search_con['date_from'] }}">
</div>
</div>
<div class="form-group m-r m-l">
@@ -37,7 +18,7 @@
</div>
<div class="form-group">
<div class="input-group">
<input type="text" placeholder="请选择结束时间" name="date_to" class="form-control" value="2018-06-07">
<input type="text" placeholder="请选择结束时间" name="date_to" class="form-control" value="{{ search_con['date_to'] }}">
</div>
</div>
<div class="form-group">
@@ -54,20 +35,29 @@
</tr>
</thead>
<tbody>
{% if list %}
{% for item in list %}
<tr>
<td>2018-06-07</td>
<td>1839</td>
<td>{{ item.date }}</td>
<td>{{ item.total_shared_count }}</td>
</tr>
{% endfor %}
{% else %}
<tr><td colspan="2">暂无数据~~</td></tr>
{% endif %}
</tbody>
</table>
<div class="row">
<div class="col-lg-12">
<span class="pagination_count" style="line-height: 40px;">共1条记录 | 每页50条</span>
<ul class="pagination pagination-lg pull-right" style="margin: 0 0 ;">
<li class="active"><a href="javascript:void(0);">1</a></li>
</ul>
</div>
</div>
<!--分页代码已被封装到统一模板文件中-->
{% include 'common/pagenation.html' %}
</div>
</div>
{% endblock %}
{% block css %}
<link href="{{ buildStaticUrl('/plugins/datetimepicker/jquery.datetimepicker.min.css') }}" rel="stylesheet">
{% endblock %}
{% block js %}
<script src="{{ buildStaticUrl('/plugins/highcharts/highcharts.js') }}"></script>
<script src="{{ buildStaticUrl('/js/chart.js') }}"></script>
<script src="{{ buildStaticUrl('/plugins/datetimepicker/jquery.datetimepicker.full.min.js') }}"></script>
<script src="{{ buildStaticUrl('/js/stat/share.js') }}"></script>
{% endblock %}

View File

@@ -9,7 +9,7 @@
<label class="col-lg-2 control-label">手机:</label>
<div class="col-lg-10">
<input type="text" name="mobile" class="form-control" placeholder="请输入手机~~" readonly=""
value="{{ current_user.mobile }}">
value="{{ current_user.mobile }}">
</div>
</div>
<div class="hr-line-dashed"></div>
@@ -17,7 +17,8 @@
<div class="form-group">
<label class="col-lg-2 control-label">姓名:</label>
<div class="col-lg-10">
<input type="text" name="nickname" class="form-control" placeholder="请输入姓名~~" value="{{ current_user.nickname }}"> </div>
<input type="text" name="nickname" class="form-control" placeholder="请输入姓名~~" value="{{ current_user.nickname }}">
</div>
</div>
<div class="hr-line-dashed"></div>
@@ -38,5 +39,6 @@
</div>
{% endblock %}
{% block js %}
<script src="{{buildStaticUrl('/js/user/edit.js')}}"></script>
<script src="{{ buildStaticUrl('/js/user/edit.js') }}"></script>
{% endblock %}

View File

@@ -1,46 +1,54 @@
{% extends "common/layout_user.html" %}
{% block content %}
<div class="loginColumns animated fadeInDown">
<div class="row">
<div class="col-md-6 text-center">
<h2 class="font-bold">{{ config.SEO_TITLE }}</h2>
<p>
<img src="{{ buildStaticUrl('/images/common/mini_qrcode.jpg') }}" width="300px">
</p>
<p class="text-danger">
扫描关注查看Demo
</p>
</div>
<div class="col-md-6">
<div class="ibox-content">
<div class="m-t login_wrap" role="form" >
<div class="form-group text-center">
<h2 class="font-bold">登录</h2>
<div class="loginColumns animated fadeInDown">
<div class="row">
<div class="col-md-6 text-center">
<h3 class="font-bold">{{ config.SEO_TITLE }}</h3>
<div class="row">
<div class="col-xs-6 col-md-6">
<a href="javascript:void(0);" class="thumbnail">
<img src="{{ buildStaticUrl('/images/common/mini_qrcode.jpg') }}" width="200px">
</a>
<p>小程序码</p>
</div>
<div class="col-xs-6 col-md-6">
<a href="javascript:void(0);" class="thumbnail">
<img src="{{ buildStaticUrl('/images/common/qrcode.jpg') }}" width="200px">
</a>
<p>公众号码</p>
</div>
<div class="form-group">
<input type="text" name="login_name" class="form-control" placeholder="请输入登录用户名">
</div>
<div class="form-group">
<input type="password" name="login_pwd" class="form-control" placeholder="请输入登录密码">
</div>
<button type="button" class="btn btn-primary block full-width m-b do-login">登录</button>
</div>
</div>
</div>
</div>
<hr>
<div class="row">
<div class="col-md-6">
{{ config.SEO_TITLE }} <a href="{{ buildUrl('/') }}" target="_blank"> 技术支持 </a>
</div>
<div class="col-md-6 text-right">
<small>© 2018</small>
</div>
</div>
</div>
</div>
<div class="col-md-6">
<div class="ibox-content">
<div class="m-t login_wrap">
<div class="form-group text-center">
<h2 class="font-bold">登录</h2>
</div>
<div class="form-group">
<input type="text" name="login_name" class="form-control" placeholder="请输入登录用户名">
</div>
<div class="form-group">
<input type="password" name="login_pwd" class="form-control" placeholder="请输入登录密码">
</div>
<button type="button" class="btn btn-primary block full-width m-b do-login">登录</button>
<h3>账号和密码请关注左侧公众号码 回复"<span class="text-danger">订餐小程序</span>"获取,每日更新一次 </h3>
</div>
</div>
</div>
</div>
<hr>
<div class="row">
<div class="col-md-6">
{{ config.SEO_TITLE }} <a href="{{ buildUrl('/') }}" target="_blank"> 技术支持 </a>
</div>
<div class="col-md-6 text-right">
<small>© 2018</small>
</div>
</div>
</div>
{% endblock %}
{% block js %}
<script src="{{buildStaticUrl('/js/user/login.js')}}"></script>
<script src="{{ buildStaticUrl('/js/user/login.js') }}"></script>
{% endblock %}