xiugai
This commit is contained in:
commit
4388be95db
|
@ -9,6 +9,7 @@ scratch. This page gets rid of all links and provides the needed markup only.
|
||||||
{% load static %}
|
{% load static %}
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
<meta name="viewport" content="initial-scale=1.0, user-scalable=no">
|
||||||
<title>集团管理分析后台</title>
|
<title>集团管理分析后台</title>
|
||||||
<!-- Tell the browser to be responsive to screen width -->
|
<!-- Tell the browser to be responsive to screen width -->
|
||||||
<meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport">
|
<meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport">
|
||||||
|
@ -23,7 +24,12 @@ scratch. This page gets rid of all links and provides the needed markup only.
|
||||||
page. However, you can choose any other skin. Make sure you
|
page. However, you can choose any other skin. Make sure you
|
||||||
apply the skin class to the body tag so the changes take effect. -->
|
apply the skin class to the body tag so the changes take effect. -->
|
||||||
<link rel="stylesheet" href="{% static 'groups/dist/css/skins/skin-blue.min.css' %}">
|
<link rel="stylesheet" href="{% static 'groups/dist/css/skins/skin-blue.min.css' %}">
|
||||||
|
<!-- jQuery 3 -->
|
||||||
|
<script src="{% static 'groups/bower_components/jquery/dist/jquery.min.js' %}"></script>
|
||||||
|
<!-- Bootstrap 3.3.7 -->
|
||||||
|
<script src="{% static 'groups/bower_components/bootstrap/dist/js/bootstrap.min.js' %}"></script>
|
||||||
|
<!-- AdminLTE App -->
|
||||||
|
<script src="{% static 'groups/dist/js/adminlte.min.js' %}"></script>
|
||||||
<!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
|
<!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
|
||||||
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
|
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
|
||||||
<!--[if lt IE 9]>
|
<!--[if lt IE 9]>
|
||||||
|
@ -110,9 +116,6 @@ desired effect
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<!-- Control Sidebar Toggle Button -->
|
<!-- Control Sidebar Toggle Button -->
|
||||||
<li>
|
|
||||||
<a href="#" data-toggle="control-sidebar"><i class="fa fa-gears"></i></a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</nav>
|
</nav>
|
||||||
|
@ -136,7 +139,7 @@ desired effect
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- search form (Optional) -->
|
<!-- search form (Optional) -->
|
||||||
<form action="#" method="get" class="sidebar-form">
|
<!-- <form action="#" method="get" class="sidebar-form">
|
||||||
<div class="input-group">
|
<div class="input-group">
|
||||||
<input type="text" name="q" class="form-control" placeholder="搜索...">
|
<input type="text" name="q" class="form-control" placeholder="搜索...">
|
||||||
<span class="input-group-btn">
|
<span class="input-group-btn">
|
||||||
|
@ -144,7 +147,7 @@ desired effect
|
||||||
</button>
|
</button>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form> -->
|
||||||
<!-- /.search form -->
|
<!-- /.search form -->
|
||||||
|
|
||||||
<!-- Sidebar Menu -->
|
<!-- Sidebar Menu -->
|
||||||
|
@ -307,12 +310,7 @@ desired effect
|
||||||
|
|
||||||
<!-- REQUIRED JS SCRIPTS -->
|
<!-- REQUIRED JS SCRIPTS -->
|
||||||
|
|
||||||
<!-- jQuery 3 -->
|
|
||||||
<script src="{% static 'groups/bower_components/jquery/dist/jquery.min.js' %}"></script>
|
|
||||||
<!-- Bootstrap 3.3.7 -->
|
|
||||||
<script src="{% static 'groups/bower_components/bootstrap/dist/js/bootstrap.min.js' %}"></script>
|
|
||||||
<!-- AdminLTE App -->
|
|
||||||
<script src="{% static 'groups/dist/js/adminlte.min.js' %}"></script>
|
|
||||||
|
|
||||||
<!-- Optionally, you can add Slimscroll and FastClick plugins.
|
<!-- Optionally, you can add Slimscroll and FastClick plugins.
|
||||||
Both of these plugins are recommended to enhance the
|
Both of these plugins are recommended to enhance the
|
||||||
|
|
|
@ -1,497 +1,176 @@
|
||||||
{% extends "./base.html" %}
|
{% extends "./base.html" %}
|
||||||
|
{% block pagehead %}
|
||||||
|
<h1>
|
||||||
|
本月数据
|
||||||
|
<small>Month Data</small>
|
||||||
|
</h1>
|
||||||
|
<ol class="breadcrumb">
|
||||||
|
<li class="active"><a href="{% url 'groups_index' %}"><i class="fa fa-dashboard"></i> 主页</a></li>
|
||||||
|
</ol>
|
||||||
|
{% endblock %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<!-- Info boxes -->
|
<!-- Info boxes -->
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-3 col-sm-6 col-xs-12">
|
<div class="col-lg-2 col-xs-6">
|
||||||
<div class="info-box">
|
<!-- small box -->
|
||||||
<span class="info-box-icon bg-aqua"><i class="ion ion-ios-gear-outline"></i></span>
|
<div class="small-box bg-yellow">
|
||||||
|
<div class="inner">
|
||||||
|
<h3>{{troublenum}}</h3>
|
||||||
|
|
||||||
<div class="info-box-content">
|
<p>事故隐患</p>
|
||||||
<span class="info-box-text">CPU Traffic</span>
|
|
||||||
<span class="info-box-number">90<small>%</small></span>
|
|
||||||
</div>
|
|
||||||
<!-- /.info-box-content -->
|
|
||||||
</div>
|
|
||||||
<!-- /.info-box -->
|
|
||||||
</div>
|
|
||||||
<!-- /.col -->
|
|
||||||
<div class="col-md-3 col-sm-6 col-xs-12">
|
|
||||||
<div class="info-box">
|
|
||||||
<span class="info-box-icon bg-red"><i class="fa fa-google-plus"></i></span>
|
|
||||||
|
|
||||||
<div class="info-box-content">
|
|
||||||
<span class="info-box-text">Likes</span>
|
|
||||||
<span class="info-box-number">41,410</span>
|
|
||||||
</div>
|
|
||||||
<!-- /.info-box-content -->
|
|
||||||
</div>
|
|
||||||
<!-- /.info-box -->
|
|
||||||
</div>
|
|
||||||
<!-- /.col -->
|
|
||||||
|
|
||||||
<!-- fix for small devices only -->
|
|
||||||
<div class="clearfix visible-sm-block"></div>
|
|
||||||
|
|
||||||
<div class="col-md-3 col-sm-6 col-xs-12">
|
|
||||||
<div class="info-box">
|
|
||||||
<span class="info-box-icon bg-green"><i class="ion ion-ios-cart-outline"></i></span>
|
|
||||||
|
|
||||||
<div class="info-box-content">
|
|
||||||
<span class="info-box-text">Sales</span>
|
|
||||||
<span class="info-box-number">760</span>
|
|
||||||
</div>
|
|
||||||
<!-- /.info-box-content -->
|
|
||||||
</div>
|
|
||||||
<!-- /.info-box -->
|
|
||||||
</div>
|
|
||||||
<!-- /.col -->
|
|
||||||
<div class="col-md-3 col-sm-6 col-xs-12">
|
|
||||||
<div class="info-box">
|
|
||||||
<span class="info-box-icon bg-yellow"><i class="ion ion-ios-people-outline"></i></span>
|
|
||||||
|
|
||||||
<div class="info-box-content">
|
|
||||||
<span class="info-box-text">New Members</span>
|
|
||||||
<span class="info-box-number">2,000</span>
|
|
||||||
</div>
|
|
||||||
<!-- /.info-box-content -->
|
|
||||||
</div>
|
|
||||||
<!-- /.info-box -->
|
|
||||||
</div>
|
|
||||||
<!-- /.col -->
|
|
||||||
</div>
|
</div>
|
||||||
<!-- /.row -->
|
<div class="icon">
|
||||||
|
<i class="fa fa-camera"></i>
|
||||||
<div class="row">
|
|
||||||
<div class="col-md-12">
|
|
||||||
<div class="box">
|
|
||||||
<div class="box-header with-border">
|
|
||||||
<h3 class="box-title">Monthly Recap Report</h3>
|
|
||||||
|
|
||||||
<div class="box-tools pull-right">
|
|
||||||
<button type="button" class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i>
|
|
||||||
</button>
|
|
||||||
<div class="btn-group">
|
|
||||||
<button type="button" class="btn btn-box-tool dropdown-toggle" data-toggle="dropdown">
|
|
||||||
<i class="fa fa-wrench"></i></button>
|
|
||||||
<ul class="dropdown-menu" role="menu">
|
|
||||||
<li><a href="#">Action</a></li>
|
|
||||||
<li><a href="#">Another action</a></li>
|
|
||||||
<li><a href="#">Something else here</a></li>
|
|
||||||
<li class="divider"></li>
|
|
||||||
<li><a href="#">Separated link</a></li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
<button type="button" class="btn btn-box-tool" data-widget="remove"><i class="fa fa-times"></i></button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!-- /.box-header -->
|
|
||||||
<div class="box-body">
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-md-8">
|
|
||||||
<p class="text-center">
|
|
||||||
<strong>Sales: 1 Jan, 2014 - 30 Jul, 2014</strong>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<div class="chart">
|
|
||||||
<!-- Sales Chart Canvas -->
|
|
||||||
<canvas id="salesChart" style="height: 180px;"></canvas>
|
|
||||||
</div>
|
|
||||||
<!-- /.chart-responsive -->
|
|
||||||
</div>
|
|
||||||
<!-- /.col -->
|
|
||||||
<div class="col-md-4">
|
|
||||||
<p class="text-center">
|
|
||||||
<strong>Goal Completion</strong>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<div class="progress-group">
|
|
||||||
<span class="progress-text">Add Products to Cart</span>
|
|
||||||
<span class="progress-number"><b>160</b>/200</span>
|
|
||||||
|
|
||||||
<div class="progress sm">
|
|
||||||
<div class="progress-bar progress-bar-aqua" style="width: 80%"></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!-- /.progress-group -->
|
|
||||||
<div class="progress-group">
|
|
||||||
<span class="progress-text">Complete Purchase</span>
|
|
||||||
<span class="progress-number"><b>310</b>/400</span>
|
|
||||||
|
|
||||||
<div class="progress sm">
|
|
||||||
<div class="progress-bar progress-bar-red" style="width: 80%"></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!-- /.progress-group -->
|
|
||||||
<div class="progress-group">
|
|
||||||
<span class="progress-text">Visit Premium Page</span>
|
|
||||||
<span class="progress-number"><b>480</b>/800</span>
|
|
||||||
|
|
||||||
<div class="progress sm">
|
|
||||||
<div class="progress-bar progress-bar-green" style="width: 80%"></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!-- /.progress-group -->
|
|
||||||
<div class="progress-group">
|
|
||||||
<span class="progress-text">Send Inquiries</span>
|
|
||||||
<span class="progress-number"><b>250</b>/500</span>
|
|
||||||
|
|
||||||
<div class="progress sm">
|
|
||||||
<div class="progress-bar progress-bar-yellow" style="width: 80%"></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!-- /.progress-group -->
|
|
||||||
</div>
|
|
||||||
<!-- /.col -->
|
|
||||||
</div>
|
|
||||||
<!-- /.row -->
|
|
||||||
</div>
|
|
||||||
<!-- ./box-body -->
|
|
||||||
<div class="box-footer">
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-sm-3 col-xs-6">
|
|
||||||
<div class="description-block border-right">
|
|
||||||
<span class="description-percentage text-green"><i class="fa fa-caret-up"></i> 17%</span>
|
|
||||||
<h5 class="description-header">$35,210.43</h5>
|
|
||||||
<span class="description-text">TOTAL REVENUE</span>
|
|
||||||
</div>
|
|
||||||
<!-- /.description-block -->
|
|
||||||
</div>
|
|
||||||
<!-- /.col -->
|
|
||||||
<div class="col-sm-3 col-xs-6">
|
|
||||||
<div class="description-block border-right">
|
|
||||||
<span class="description-percentage text-yellow"><i class="fa fa-caret-left"></i> 0%</span>
|
|
||||||
<h5 class="description-header">$10,390.90</h5>
|
|
||||||
<span class="description-text">TOTAL COST</span>
|
|
||||||
</div>
|
|
||||||
<!-- /.description-block -->
|
|
||||||
</div>
|
|
||||||
<!-- /.col -->
|
|
||||||
<div class="col-sm-3 col-xs-6">
|
|
||||||
<div class="description-block border-right">
|
|
||||||
<span class="description-percentage text-green"><i class="fa fa-caret-up"></i> 20%</span>
|
|
||||||
<h5 class="description-header">$24,813.53</h5>
|
|
||||||
<span class="description-text">TOTAL PROFIT</span>
|
|
||||||
</div>
|
|
||||||
<!-- /.description-block -->
|
|
||||||
</div>
|
|
||||||
<!-- /.col -->
|
|
||||||
<div class="col-sm-3 col-xs-6">
|
|
||||||
<div class="description-block">
|
|
||||||
<span class="description-percentage text-red"><i class="fa fa-caret-down"></i> 18%</span>
|
|
||||||
<h5 class="description-header">1200</h5>
|
|
||||||
<span class="description-text">GOAL COMPLETIONS</span>
|
|
||||||
</div>
|
|
||||||
<!-- /.description-block -->
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!-- /.row -->
|
|
||||||
</div>
|
|
||||||
<!-- /.box-footer -->
|
|
||||||
</div>
|
|
||||||
<!-- /.box -->
|
|
||||||
</div>
|
|
||||||
<!-- /.col -->
|
|
||||||
</div>
|
</div>
|
||||||
<!-- /.row -->
|
<a href="{% url 'groups_trouble' %}" class="small-box-footer">更多分析 <i class="fa fa-arrow-circle-right"></i></a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- ./col -->
|
||||||
|
<div class="col-lg-2 col-xs-6">
|
||||||
|
<!-- small box -->
|
||||||
|
<div class="small-box bg-green">
|
||||||
|
<div class="inner">
|
||||||
|
<h3>{{observenum}}
|
||||||
|
<!-- <sup style="font-size: 20px">%</sup> -->
|
||||||
|
</h3>
|
||||||
|
|
||||||
<!-- Main row -->
|
<p>行为观察</p>
|
||||||
<div class="row">
|
|
||||||
<!-- Left col -->
|
|
||||||
<div class="col-md-8">
|
|
||||||
<!-- MAP & BOX PANE -->
|
|
||||||
<div class="box box-success">
|
|
||||||
<div class="box-header with-border">
|
|
||||||
<h3 class="box-title">Visitors Report</h3>
|
|
||||||
|
|
||||||
<div class="box-tools pull-right">
|
|
||||||
<button type="button" class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i>
|
|
||||||
</button>
|
|
||||||
<button type="button" class="btn btn-box-tool" data-widget="remove"><i class="fa fa-times"></i></button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!-- /.box-header -->
|
|
||||||
<div class="box-body no-padding">
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-md-9 col-sm-8">
|
|
||||||
<div class="pad">
|
|
||||||
<!-- Map will be created here -->
|
|
||||||
<div id="world-map-markers" style="height: 325px;"></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!-- /.col -->
|
|
||||||
<div class="col-md-3 col-sm-4">
|
|
||||||
<div class="pad box-pane-right bg-green" style="min-height: 280px">
|
|
||||||
<div class="description-block margin-bottom">
|
|
||||||
<div class="sparkbar pad" data-color="#fff">90,70,90,70,75,80,70</div>
|
|
||||||
<h5 class="description-header">8390</h5>
|
|
||||||
<span class="description-text">Visits</span>
|
|
||||||
</div>
|
|
||||||
<!-- /.description-block -->
|
|
||||||
<div class="description-block margin-bottom">
|
|
||||||
<div class="sparkbar pad" data-color="#fff">90,50,90,70,61,83,63</div>
|
|
||||||
<h5 class="description-header">30%</h5>
|
|
||||||
<span class="description-text">Referrals</span>
|
|
||||||
</div>
|
|
||||||
<!-- /.description-block -->
|
|
||||||
<div class="description-block">
|
|
||||||
<div class="sparkbar pad" data-color="#fff">90,50,90,70,61,83,63</div>
|
|
||||||
<h5 class="description-header">70%</h5>
|
|
||||||
<span class="description-text">Organic</span>
|
|
||||||
</div>
|
|
||||||
<!-- /.description-block -->
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!-- /.col -->
|
|
||||||
</div>
|
|
||||||
<!-- /.row -->
|
|
||||||
</div>
|
|
||||||
<!-- /.box-body -->
|
|
||||||
</div>
|
|
||||||
<!-- /.box -->
|
|
||||||
<!-- TABLE: LATEST ORDERS -->
|
|
||||||
<div class="box box-info">
|
|
||||||
<div class="box-header with-border">
|
|
||||||
<h3 class="box-title">Latest Orders</h3>
|
|
||||||
|
|
||||||
<div class="box-tools pull-right">
|
|
||||||
<button type="button" class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i>
|
|
||||||
</button>
|
|
||||||
<button type="button" class="btn btn-box-tool" data-widget="remove"><i class="fa fa-times"></i></button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!-- /.box-header -->
|
|
||||||
<div class="box-body">
|
|
||||||
<div class="table-responsive">
|
|
||||||
<table class="table no-margin">
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th>Order ID</th>
|
|
||||||
<th>Item</th>
|
|
||||||
<th>Status</th>
|
|
||||||
<th>Popularity</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
<tr>
|
|
||||||
<td><a href="pages/examples/invoice.html">OR9842</a></td>
|
|
||||||
<td>Call of Duty IV</td>
|
|
||||||
<td><span class="label label-success">Shipped</span></td>
|
|
||||||
<td>
|
|
||||||
<div class="sparkbar" data-color="#00a65a" data-height="20">90,80,90,-70,61,-83,63</div>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td><a href="pages/examples/invoice.html">OR1848</a></td>
|
|
||||||
<td>Samsung Smart TV</td>
|
|
||||||
<td><span class="label label-warning">Pending</span></td>
|
|
||||||
<td>
|
|
||||||
<div class="sparkbar" data-color="#f39c12" data-height="20">90,80,-90,70,61,-83,68</div>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td><a href="pages/examples/invoice.html">OR7429</a></td>
|
|
||||||
<td>iPhone 6 Plus</td>
|
|
||||||
<td><span class="label label-danger">Delivered</span></td>
|
|
||||||
<td>
|
|
||||||
<div class="sparkbar" data-color="#f56954" data-height="20">90,-80,90,70,-61,83,63</div>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td><a href="pages/examples/invoice.html">OR7429</a></td>
|
|
||||||
<td>Samsung Smart TV</td>
|
|
||||||
<td><span class="label label-info">Processing</span></td>
|
|
||||||
<td>
|
|
||||||
<div class="sparkbar" data-color="#00c0ef" data-height="20">90,80,-90,70,-61,83,63</div>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td><a href="pages/examples/invoice.html">OR1848</a></td>
|
|
||||||
<td>Samsung Smart TV</td>
|
|
||||||
<td><span class="label label-warning">Pending</span></td>
|
|
||||||
<td>
|
|
||||||
<div class="sparkbar" data-color="#f39c12" data-height="20">90,80,-90,70,61,-83,68</div>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td><a href="pages/examples/invoice.html">OR7429</a></td>
|
|
||||||
<td>iPhone 6 Plus</td>
|
|
||||||
<td><span class="label label-danger">Delivered</span></td>
|
|
||||||
<td>
|
|
||||||
<div class="sparkbar" data-color="#f56954" data-height="20">90,-80,90,70,-61,83,63</div>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td><a href="pages/examples/invoice.html">OR9842</a></td>
|
|
||||||
<td>Call of Duty IV</td>
|
|
||||||
<td><span class="label label-success">Shipped</span></td>
|
|
||||||
<td>
|
|
||||||
<div class="sparkbar" data-color="#00a65a" data-height="20">90,80,90,-70,61,-83,63</div>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
<!-- /.table-responsive -->
|
|
||||||
</div>
|
|
||||||
<!-- /.box-body -->
|
|
||||||
<div class="box-footer clearfix">
|
|
||||||
<a href="javascript:void(0)" class="btn btn-sm btn-info btn-flat pull-left">Place New Order</a>
|
|
||||||
<a href="javascript:void(0)" class="btn btn-sm btn-default btn-flat pull-right">View All Orders</a>
|
|
||||||
</div>
|
|
||||||
<!-- /.box-footer -->
|
|
||||||
</div>
|
|
||||||
<!-- /.box -->
|
|
||||||
</div>
|
|
||||||
<!-- /.col -->
|
|
||||||
|
|
||||||
<div class="col-md-4">
|
|
||||||
<!-- Info Boxes Style 2 -->
|
|
||||||
<div class="info-box bg-yellow">
|
|
||||||
<span class="info-box-icon"><i class="ion ion-ios-pricetag-outline"></i></span>
|
|
||||||
|
|
||||||
<div class="info-box-content">
|
|
||||||
<span class="info-box-text">Inventory</span>
|
|
||||||
<span class="info-box-number">5,200</span>
|
|
||||||
|
|
||||||
<div class="progress">
|
|
||||||
<div class="progress-bar" style="width: 50%"></div>
|
|
||||||
</div>
|
|
||||||
<span class="progress-description">
|
|
||||||
50% Increase in 30 Days
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
<!-- /.info-box-content -->
|
|
||||||
</div>
|
|
||||||
<!-- /.info-box -->
|
|
||||||
<div class="info-box bg-green">
|
|
||||||
<span class="info-box-icon"><i class="ion ion-ios-heart-outline"></i></span>
|
|
||||||
|
|
||||||
<div class="info-box-content">
|
|
||||||
<span class="info-box-text">Mentions</span>
|
|
||||||
<span class="info-box-number">92,050</span>
|
|
||||||
|
|
||||||
<div class="progress">
|
|
||||||
<div class="progress-bar" style="width: 20%"></div>
|
|
||||||
</div>
|
|
||||||
<span class="progress-description">
|
|
||||||
20% Increase in 30 Days
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
<!-- /.info-box-content -->
|
|
||||||
</div>
|
|
||||||
<!-- /.info-box -->
|
|
||||||
<div class="info-box bg-red">
|
|
||||||
<span class="info-box-icon"><i class="ion ion-ios-cloud-download-outline"></i></span>
|
|
||||||
|
|
||||||
<div class="info-box-content">
|
|
||||||
<span class="info-box-text">Downloads</span>
|
|
||||||
<span class="info-box-number">114,381</span>
|
|
||||||
|
|
||||||
<div class="progress">
|
|
||||||
<div class="progress-bar" style="width: 70%"></div>
|
|
||||||
</div>
|
|
||||||
<span class="progress-description">
|
|
||||||
70% Increase in 30 Days
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
<!-- /.info-box-content -->
|
|
||||||
</div>
|
|
||||||
<!-- /.info-box -->
|
|
||||||
<div class="info-box bg-aqua">
|
|
||||||
<span class="info-box-icon"><i class="ion-ios-chatbubble-outline"></i></span>
|
|
||||||
|
|
||||||
<div class="info-box-content">
|
|
||||||
<span class="info-box-text">Direct Messages</span>
|
|
||||||
<span class="info-box-number">163,921</span>
|
|
||||||
|
|
||||||
<div class="progress">
|
|
||||||
<div class="progress-bar" style="width: 40%"></div>
|
|
||||||
</div>
|
|
||||||
<span class="progress-description">
|
|
||||||
40% Increase in 30 Days
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
<!-- /.info-box-content -->
|
|
||||||
</div>
|
|
||||||
<!-- /.info-box -->
|
|
||||||
<!-- PRODUCT LIST -->
|
|
||||||
<div class="box box-primary">
|
|
||||||
<div class="box-header with-border">
|
|
||||||
<h3 class="box-title">Recently Added Products</h3>
|
|
||||||
|
|
||||||
<div class="box-tools pull-right">
|
|
||||||
<button type="button" class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i>
|
|
||||||
</button>
|
|
||||||
<button type="button" class="btn btn-box-tool" data-widget="remove"><i class="fa fa-times"></i></button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!-- /.box-header -->
|
|
||||||
<div class="box-body">
|
|
||||||
<ul class="products-list product-list-in-box">
|
|
||||||
<li class="item">
|
|
||||||
<div class="product-img">
|
|
||||||
<img src="dist/img/default-50x50.gif" alt="Product Image">
|
|
||||||
</div>
|
|
||||||
<div class="product-info">
|
|
||||||
<a href="javascript:void(0)" class="product-title">Samsung TV
|
|
||||||
<span class="label label-warning pull-right">$1800</span></a>
|
|
||||||
<span class="product-description">
|
|
||||||
Samsung 32" 1080p 60Hz LED Smart HDTV.
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
</li>
|
|
||||||
<!-- /.item -->
|
|
||||||
<li class="item">
|
|
||||||
<div class="product-img">
|
|
||||||
<img src="dist/img/default-50x50.gif" alt="Product Image">
|
|
||||||
</div>
|
|
||||||
<div class="product-info">
|
|
||||||
<a href="javascript:void(0)" class="product-title">Bicycle
|
|
||||||
<span class="label label-info pull-right">$700</span></a>
|
|
||||||
<span class="product-description">
|
|
||||||
26" Mongoose Dolomite Men's 7-speed, Navy Blue.
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
</li>
|
|
||||||
<!-- /.item -->
|
|
||||||
<li class="item">
|
|
||||||
<div class="product-img">
|
|
||||||
<img src="dist/img/default-50x50.gif" alt="Product Image">
|
|
||||||
</div>
|
|
||||||
<div class="product-info">
|
|
||||||
<a href="javascript:void(0)" class="product-title">Xbox One <span
|
|
||||||
class="label label-danger pull-right">$350</span></a>
|
|
||||||
<span class="product-description">
|
|
||||||
Xbox One Console Bundle with Halo Master Chief Collection.
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
</li>
|
|
||||||
<!-- /.item -->
|
|
||||||
<li class="item">
|
|
||||||
<div class="product-img">
|
|
||||||
<img src="dist/img/default-50x50.gif" alt="Product Image">
|
|
||||||
</div>
|
|
||||||
<div class="product-info">
|
|
||||||
<a href="javascript:void(0)" class="product-title">PlayStation 4
|
|
||||||
<span class="label label-success pull-right">$399</span></a>
|
|
||||||
<span class="product-description">
|
|
||||||
PlayStation 4 500GB Console (PS4)
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
</li>
|
|
||||||
<!-- /.item -->
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
<!-- /.box-body -->
|
|
||||||
<div class="box-footer text-center">
|
|
||||||
<a href="javascript:void(0)" class="uppercase">View All Products</a>
|
|
||||||
</div>
|
|
||||||
<!-- /.box-footer -->
|
|
||||||
</div>
|
|
||||||
<!-- /.box -->
|
|
||||||
</div>
|
|
||||||
<!-- /.col -->
|
|
||||||
</div>
|
</div>
|
||||||
<!-- /.row -->
|
<div class="icon">
|
||||||
|
<i class="fa fa-eye"></i>
|
||||||
|
</div>
|
||||||
|
<a href="#" class="small-box-footer">更多分析 <i class="fa fa-arrow-circle-right"></i></a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- ./col -->
|
||||||
|
<div class="col-lg-2 col-xs-6">
|
||||||
|
<!-- small box -->
|
||||||
|
<div class="small-box bg-red">
|
||||||
|
<div class="inner">
|
||||||
|
<h3>{{missnum}}</h3>
|
||||||
|
|
||||||
|
<p>未遂事件</p>
|
||||||
|
</div>
|
||||||
|
<div class="icon">
|
||||||
|
<i class="fa fa-life-ring"></i>
|
||||||
|
</div>
|
||||||
|
<a href="#" class="small-box-footer">更多分析 <i class="fa fa-arrow-circle-right"></i></a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- ./col -->
|
||||||
|
<div class="col-lg-2 col-xs-6">
|
||||||
|
<!-- small box -->
|
||||||
|
<div class="small-box bg-aqua">
|
||||||
|
<div class="inner">
|
||||||
|
<h3>{{trainnum}}</h3>
|
||||||
|
|
||||||
|
<p>教育培训</p>
|
||||||
|
</div>
|
||||||
|
<div class="icon">
|
||||||
|
<i class="fa fa-graduation-cap"></i>
|
||||||
|
</div>
|
||||||
|
<a href="#" class="small-box-footer">更多分析 <i class="fa fa-arrow-circle-right"></i></a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- ./col -->
|
||||||
|
<div class="col-lg-2 col-xs-6">
|
||||||
|
<!-- small box -->
|
||||||
|
<div class="small-box bg-teal">
|
||||||
|
<div class="inner">
|
||||||
|
<h3>{{companynum}}</h3>
|
||||||
|
|
||||||
|
<p>下属公司数</p>
|
||||||
|
</div>
|
||||||
|
<div class="icon">
|
||||||
|
<i class="fa fa-industry"></i>
|
||||||
|
</div>
|
||||||
|
<a href="#" class="small-box-footer">更多分析 <i class="fa fa-arrow-circle-right"></i></a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-lg-2 col-xs-6">
|
||||||
|
<!-- small box -->
|
||||||
|
<div class="small-box bg-orange">
|
||||||
|
<div class="inner">
|
||||||
|
<h3>{{usernum}}</h3>
|
||||||
|
|
||||||
|
<p>下属员工总数</p>
|
||||||
|
</div>
|
||||||
|
<div class="icon">
|
||||||
|
<i class="fa fa-users"></i>
|
||||||
|
</div>
|
||||||
|
<a href="#" class="small-box-footer">更多分析 <i class="fa fa-arrow-circle-right"></i></a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- /.row -->
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
|
||||||
|
<div class="col-md-12">
|
||||||
|
<h3>
|
||||||
|
{{group.groupname}}
|
||||||
|
</h3>
|
||||||
|
<div class="box">
|
||||||
|
<div class="box-header with-border">
|
||||||
|
<h3 class="box-title">公司分布</h3>
|
||||||
|
|
||||||
|
<div class="box-tools pull-right">
|
||||||
|
<button type="button" class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i>
|
||||||
|
</button>
|
||||||
|
<button type="button" class="btn btn-box-tool" data-widget="remove"><i class="fa fa-times"></i></button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- /.box-header -->
|
||||||
|
<div class="box-body">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-12">
|
||||||
|
<!-- <p class="text-center">
|
||||||
|
<strong>Sales: 1 Jan, 2014 - 30 Jul, 2014</strong>
|
||||||
|
</p> -->
|
||||||
|
|
||||||
|
<div id="container" style="height: 800px;width:auto">
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<!-- /.chart-responsive -->
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- /.row -->
|
||||||
|
</div>
|
||||||
|
<!-- ./box-body -->
|
||||||
|
</div>
|
||||||
|
<!-- /.box -->
|
||||||
|
</div>
|
||||||
|
<!-- /.col -->
|
||||||
|
</div>
|
||||||
|
<!-- /.row -->
|
||||||
|
<script src="https://webapi.amap.com/maps?v=1.4.15&key=978fc7c286560aa4cb3f18ef06737f9a"></script>
|
||||||
|
<script>
|
||||||
|
var map = new AMap.Map('container', {
|
||||||
|
resizeEnable: true, //是否监控地图容器尺寸变化
|
||||||
|
zoom: 6, //初始化地图层级
|
||||||
|
center: [116.397428, 39.90923],//初始化地图中心点
|
||||||
|
//viewMode:'3D'//使用3D视图
|
||||||
|
});
|
||||||
|
$.getJSON('/groups/api/positions', function (res) {
|
||||||
|
var x=0,y=0,num=0;
|
||||||
|
for (var i = 0; i < res.data.length; i++) {
|
||||||
|
let podata = res.data[i]
|
||||||
|
if(podata.position !=null){
|
||||||
|
let arrayposition = podata.position.location.split(',')
|
||||||
|
x = x + parseFloat(arrayposition[0])
|
||||||
|
y = y + parseFloat(arrayposition[1])
|
||||||
|
num = num + 1
|
||||||
|
let marker = new AMap.Marker({
|
||||||
|
position: podata.position.location.split(','), // 经纬度对象,也可以是经纬度构成的一维数组[116.39, 39.9]
|
||||||
|
label:{'content':podata.partname,'direction':'bottom'}
|
||||||
|
// title: res.data[i].partname,
|
||||||
|
// bubble:true,
|
||||||
|
// clickable:true
|
||||||
|
});
|
||||||
|
map.add(marker);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
map.setCenter([x/num,y/num])
|
||||||
|
})
|
||||||
|
</script>
|
||||||
{% endblock %}
|
{% endblock %}
|
|
@ -16,6 +16,8 @@ urlpatterns = [
|
||||||
path('tain/', views.job, name='groups_train'),#教育培训统计图
|
path('tain/', views.job, name='groups_train'),#教育培训统计图
|
||||||
path('test/', views.job, name='groups_test'),#在线考试统计图
|
path('test/', views.job, name='groups_test'),#在线考试统计图
|
||||||
path('refresh_captcha/', views.refresh_captcha),
|
path('refresh_captcha/', views.refresh_captcha),
|
||||||
|
path('updateposition/',views.updateposition),
|
||||||
|
path('api/positions',views.apipositions),
|
||||||
path('api/troubleChart',views.troubleChart),
|
path('api/troubleChart',views.troubleChart),
|
||||||
path('api/observeChart',views.observeChart)
|
path('api/observeChart',views.observeChart)
|
||||||
]
|
]
|
||||||
|
|
|
@ -1,19 +1,25 @@
|
||||||
from django.http import HttpResponse
|
from django.http import HttpResponse,JsonResponse
|
||||||
from django.shortcuts import render
|
from django.shortcuts import render
|
||||||
from django.shortcuts import redirect
|
from django.shortcuts import redirect
|
||||||
from .models import Group,GroupUser
|
from .models import Group,GroupUser
|
||||||
from .forms import GroupUserForm
|
from .forms import GroupUserForm
|
||||||
from safesite import models as s_models
|
from safesite import models as s_models
|
||||||
|
from safesite.tasks import gettime
|
||||||
|
import requests
|
||||||
|
import json
|
||||||
import time
|
import time
|
||||||
from datetime import datetime,date,timedelta
|
from datetime import datetime,date,timedelta
|
||||||
from safesite.tasks import send_wechatmsgs,send_wechatmsg,yjjs,gettime,yjjs_px,yjjs_yl,updateTzzs,updateAqzs,yjjs_gc,yjjs_ws
|
|
||||||
from django.db.models import Q
|
|
||||||
from django.core.serializers.json import DjangoJSONEncoder
|
from django.core.serializers.json import DjangoJSONEncoder
|
||||||
from django.db.models import F,Count,Sum
|
from django.db.models import Q,F,Count,Sum
|
||||||
def index(request):
|
|
||||||
if not request.session.get('is_login', None):
|
def check_login(func): # 自定义登录验证装饰器
|
||||||
return redirect('/groups/login/')
|
def warpper(request,*args,**kwargs):
|
||||||
return render(request, 'groups/index.html')
|
is_login = request.session.get('is_login', False)
|
||||||
|
if is_login:
|
||||||
|
return func(request,*args,**kwargs)
|
||||||
|
else:
|
||||||
|
return redirect('/groups/login')
|
||||||
|
return warpper
|
||||||
|
|
||||||
def login(request):
|
def login(request):
|
||||||
# 不允许重复登录
|
# 不允许重复登录
|
||||||
|
@ -44,8 +50,8 @@ def login(request):
|
||||||
return render(request, 'groups/login.html', locals())
|
return render(request, 'groups/login.html', locals())
|
||||||
|
|
||||||
def logout(request):
|
def logout(request):
|
||||||
if not request.session.get('is_login', None):
|
# if not request.session.get('is_login', None):
|
||||||
return redirect('/groups/login')
|
# return redirect('/groups/login')
|
||||||
request.session.flush()
|
request.session.flush()
|
||||||
return redirect('/groups/login')
|
return redirect('/groups/login')
|
||||||
|
|
||||||
|
@ -57,7 +63,7 @@ def refresh_captcha(request):
|
||||||
image_url = captcha_image_url(hashkey)
|
image_url = captcha_image_url(hashkey)
|
||||||
return HttpResponse(json.dumps({'key': hashkey, 'image_url': image_url}), content_type='application/json')
|
return HttpResponse(json.dumps({'key': hashkey, 'image_url': image_url}), content_type='application/json')
|
||||||
|
|
||||||
|
@check_login
|
||||||
def company(request):
|
def company(request):
|
||||||
companys = GroupUser.objects.get(id = request.session['user_id']).group.members.all()
|
companys = GroupUser.objects.get(id = request.session['user_id']).group.members.all()
|
||||||
for i in companys:
|
for i in companys:
|
||||||
|
@ -66,6 +72,48 @@ def company(request):
|
||||||
|
|
||||||
def job(request):
|
def job(request):
|
||||||
return render(request, 'groups/job.html', locals())
|
return render(request, 'groups/job.html', locals())
|
||||||
|
|
||||||
|
@check_login
|
||||||
|
def index(req):
|
||||||
|
first_day,first_day_of_next_month=gettime()
|
||||||
|
group = GroupUser.objects.get(id = req.session['user_id']).group
|
||||||
|
companys = group.members.all()
|
||||||
|
troublenum = s_models.Trouble.objects.filter(deletemark=1,usecomp__in=companys,fxsj__range=(first_day, first_day_of_next_month)).count()
|
||||||
|
observenum = s_models.Observe.objects.filter(deletemark=1,usecomp__in=companys,looktime__range=(first_day, first_day_of_next_month)).count()
|
||||||
|
missnum = s_models.Miss.objects.filter(deletemark=1,usecomp__in=companys,misstime__range=(first_day, first_day_of_next_month)).count()
|
||||||
|
trainnum = s_models.Train.objects.filter(deletemark=1,usecomp__in=companys,starttime__range=(first_day, first_day_of_next_month)).count()
|
||||||
|
companynum = len(companys)
|
||||||
|
usernum = s_models.User.objects.filter(deletemark=1,usecomp__in=companys).count()
|
||||||
|
return render(req, 'groups/index.html', locals())
|
||||||
|
|
||||||
|
|
||||||
|
def updateposition(req):
|
||||||
|
allcompanys = s_models.Partment.objects.filter(deletemark=1,iscompany=1)
|
||||||
|
for i in allcompanys:
|
||||||
|
address = i.partname
|
||||||
|
data = getPosition(address)
|
||||||
|
if data['status'] == '1' and int(data['count'])>0:
|
||||||
|
i.position = data['geocodes'][0]
|
||||||
|
i.save()
|
||||||
|
else:
|
||||||
|
address = i.partname.replace('公司','').replace('责任','').replace('有限','')
|
||||||
|
data = getPosition(address)
|
||||||
|
if data['status'] == '1' and int(data['count'])>0:
|
||||||
|
i.position = data['geocodes'][0]
|
||||||
|
i.save()
|
||||||
|
return JsonResponse({"code":1})
|
||||||
|
|
||||||
|
def getPosition(address):
|
||||||
|
url = 'http://restapi.amap.com/v3/geocode/geo'
|
||||||
|
par = {'address': address, 'key': '86e0993305a427ac2d0b5371ad97f242'}
|
||||||
|
res = requests.get(url, par)
|
||||||
|
json_data = json.loads(res.text)
|
||||||
|
return json_data
|
||||||
|
|
||||||
|
def apipositions(req):
|
||||||
|
companys = GroupUser.objects.get(id = req.session['user_id']).group.members.all()
|
||||||
|
positions = companys.values('position','partname')
|
||||||
|
return JsonResponse({"code":1,"data":list(positions)})
|
||||||
def trouble(request):#隐患排查
|
def trouble(request):#隐患排查
|
||||||
return render(request, 'groups/troublepic.html', locals())
|
return render(request, 'groups/troublepic.html', locals())
|
||||||
def observe(request):#行为观察
|
def observe(request):#行为观察
|
||||||
|
@ -95,6 +143,6 @@ def observeChart(request):#行为观察
|
||||||
hjzj=[]#环境整洁
|
hjzj=[]#环境整洁
|
||||||
first_day,first_day_of_next_month = gettime(datetime(year,month,1))
|
first_day,first_day_of_next_month = gettime(datetime(year,month,1))
|
||||||
companys = GroupUser.objects.get(id = request.session['user_id']).group.members.all()
|
companys = GroupUser.objects.get(id = request.session['user_id']).group.members.all()
|
||||||
|
|
||||||
|
return HttpResponse(json.dumps({'code':1,'data':{'list':list(Observe)},'userfy':userfy,'userwz':userwz,'grfh':grfh,'gjhsb':gjhsb,'cxhbz':cxhbz,'rtgcx':rtgcx,'hjzj':hjzj,}), content_type='application/json')
|
||||||
return HttpResponse(json.dumps({'code':companys}), content_type='application/json')
|
|
||||||
|
|
|
@ -268,10 +268,14 @@ def drusers(companyid,path):
|
||||||
wb = load_workbook(path)
|
wb = load_workbook(path)
|
||||||
sheet = wb.worksheets[0]
|
sheet = wb.worksheets[0]
|
||||||
partdict = {}
|
partdict = {}
|
||||||
|
groupdict = {}
|
||||||
userdict = {}
|
userdict = {}
|
||||||
parts = Partment.objects.filter(partlink__contains=',' + companyid + ',')|Partment.objects.filter(partid=companyid) #获取所有部门
|
parts = Partment.objects.filter(partlink__contains=',' + companyid + ',')|Partment.objects.filter(partid=companyid) #获取所有部门
|
||||||
for i in parts:
|
for i in parts:
|
||||||
partdict[i.partname] = i.partid
|
partdict[i.partname] = i.partid
|
||||||
|
# groups = Group.objects.filter(usecomp__partid=companyid)
|
||||||
|
# for i in groups:
|
||||||
|
# groupdict[i.groupname] = i.groupid
|
||||||
i = 4
|
i = 4
|
||||||
while sheet['C'+str(i)].value !=None:
|
while sheet['C'+str(i)].value !=None:
|
||||||
empid = sheet['A'+str(i)].value
|
empid = sheet['A'+str(i)].value
|
||||||
|
@ -283,7 +287,7 @@ def drusers(companyid,path):
|
||||||
username = sheet['C'+str(i)].value
|
username = sheet['C'+str(i)].value
|
||||||
if isinstance(username,str):
|
if isinstance(username,str):
|
||||||
username = username.replace(' ', '')
|
username = username.replace(' ', '')
|
||||||
partname = sheet['D'+str(i)].value
|
partname = sheet['D'+str(i)].value #部门
|
||||||
if partname != None:
|
if partname != None:
|
||||||
partname = partname.replace(' ', '')
|
partname = partname.replace(' ', '')
|
||||||
if partname not in partdict:
|
if partname not in partdict:
|
||||||
|
@ -293,6 +297,14 @@ def drusers(companyid,path):
|
||||||
a.partlink = Partment.objects.get(partid=companyid).partlink + str(companyid) + ','
|
a.partlink = Partment.objects.get(partid=companyid).partlink + str(companyid) + ','
|
||||||
a.save()
|
a.save()
|
||||||
partdict[partname] = a.partid
|
partdict[partname] = a.partid
|
||||||
|
# groupname = sheet['E'+str(i)].value
|
||||||
|
# groupname = groupname.replace(' ', '') if groupname else None
|
||||||
|
# if groupname and groupname not in groupdict:
|
||||||
|
# obj = Group()
|
||||||
|
# obj.groupname = groupname
|
||||||
|
# obj.usecomp = Partment.objects.get(partid=companyid)
|
||||||
|
# obj.save()
|
||||||
|
# groupdict[groupname] = obj.groupid
|
||||||
if User.objects.filter(username = username).count() == 0:
|
if User.objects.filter(username = username).count() == 0:
|
||||||
a = User()
|
a = User()
|
||||||
a.name = name
|
a.name = name
|
||||||
|
@ -303,6 +315,8 @@ def drusers(companyid,path):
|
||||||
a.usecomp = Partment.objects.get(partid=companyid)
|
a.usecomp = Partment.objects.get(partid=companyid)
|
||||||
a.save()
|
a.save()
|
||||||
Group.objects.get(usecomp__partid=companyid,grouptype=3).users.add(a) #赋权
|
Group.objects.get(usecomp__partid=companyid,grouptype=3).users.add(a) #赋权
|
||||||
|
# if groupname:
|
||||||
|
# Group.objects.get(groupid=groupdict[groupname]).users.add(a)
|
||||||
else:
|
else:
|
||||||
userdict[username]=i
|
userdict[username]=i
|
||||||
i = i + 1
|
i = i + 1
|
||||||
|
|
|
@ -0,0 +1,23 @@
|
||||||
|
# Generated by Django 2.1.5 on 2019-10-22 16:35
|
||||||
|
|
||||||
|
import django.contrib.postgres.fields.jsonb
|
||||||
|
from django.db import migrations
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('safesite', '0278_auto_20191018_1723'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
# migrations.RemoveField(
|
||||||
|
# model_name='companyinfo',
|
||||||
|
# name='liaison_fax',
|
||||||
|
# ),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='partment',
|
||||||
|
name='position',
|
||||||
|
field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, null=True, verbose_name='坐标'),
|
||||||
|
),
|
||||||
|
]
|
|
@ -0,0 +1,32 @@
|
||||||
|
# Generated by Django 2.1.5 on 2019-10-23 17:11
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('safesite', '0279_auto_20191022_1635'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Groupuser2',
|
||||||
|
fields=[
|
||||||
|
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('group', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='safesite.Group')),
|
||||||
|
('part', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='safesite.Partment')),
|
||||||
|
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='safesite.User')),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
# migrations.RemoveField(
|
||||||
|
# model_name='companyinfo',
|
||||||
|
# name='liaison_fax',
|
||||||
|
# ),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='group',
|
||||||
|
name='users2',
|
||||||
|
field=models.ManyToManyField(related_name='userg2', through='safesite.Groupuser2', to='safesite.User'),
|
||||||
|
),
|
||||||
|
]
|
|
@ -17,6 +17,7 @@ class Partment(models.Model):
|
||||||
aqy = models.CharField(max_length=1000,default=',')#安全员
|
aqy = models.CharField(max_length=1000,default=',')#安全员
|
||||||
bmzg = models.CharField(max_length=1000,default=',')#主管
|
bmzg = models.CharField(max_length=1000,default=',')#主管
|
||||||
bsq = models.CharField(max_length=1000,default=',')#授权者
|
bsq = models.CharField(max_length=1000,default=',')#授权者
|
||||||
|
position = JSONField('坐标',null=True,blank=True)
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.partname
|
return self.partname
|
||||||
|
|
||||||
|
@ -281,9 +282,15 @@ class Group(models.Model):#用户组,岗位
|
||||||
groupname = models.CharField(max_length=30,blank=True,null=True)
|
groupname = models.CharField(max_length=30,blank=True,null=True)
|
||||||
grouptype = models.IntegerField(default=4)
|
grouptype = models.IntegerField(default=4)
|
||||||
users = models.ManyToManyField(User,related_name='userg')
|
users = models.ManyToManyField(User,related_name='userg')
|
||||||
|
users2 = models.ManyToManyField(User,related_name='userg2',through='Groupuser2')
|
||||||
usecomp = models.ForeignKey(Partment, on_delete=models.CASCADE,related_name='usecompg',default=1)
|
usecomp = models.ForeignKey(Partment, on_delete=models.CASCADE,related_name='usecompg',default=1)
|
||||||
menulink = models.CharField(max_length=200,default='11')
|
menulink = models.CharField(max_length=200,default='11')
|
||||||
|
|
||||||
|
class Groupuser2(models.Model): #比较好的方式
|
||||||
|
group = models.ForeignKey(Group, on_delete=models.CASCADE)
|
||||||
|
user = models.ForeignKey(User, on_delete=models.CASCADE)
|
||||||
|
part = models.ForeignKey(Partment, on_delete=models.CASCADE,null=True,blank=True)
|
||||||
|
|
||||||
class Menu(models.Model):#菜单
|
class Menu(models.Model):#菜单
|
||||||
menuid = models.AutoField(primary_key=True)
|
menuid = models.AutoField(primary_key=True)
|
||||||
menuname = models.CharField(max_length=30,blank=True,null=True)
|
menuname = models.CharField(max_length=30,blank=True,null=True)
|
||||||
|
|
Binary file not shown.
|
@ -36,6 +36,20 @@
|
||||||
$('#ubelongpart').treegrid('unselect');
|
$('#ubelongpart').treegrid('unselect');
|
||||||
}
|
}
|
||||||
} -->
|
} -->
|
||||||
|
<!-- <div style="margin-bottom:5px">
|
||||||
|
<input id="group" class="easyui-combobox" name="group" style="width:90%"
|
||||||
|
data-options="
|
||||||
|
label:'岗位',
|
||||||
|
url: 'grouphandle?a=list2',
|
||||||
|
multiple:true,
|
||||||
|
valueField:'groupid',
|
||||||
|
textField:'groupname',
|
||||||
|
loadFilter: function (data) {
|
||||||
|
return data.rows;
|
||||||
|
}
|
||||||
|
"
|
||||||
|
editable="false">
|
||||||
|
</select></div> -->
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
<script>
|
<script>
|
||||||
|
@ -62,6 +76,7 @@
|
||||||
}
|
}
|
||||||
function submitFormu() {
|
function submitFormu() {
|
||||||
var form = new FormData(document.getElementById("puffuser"));
|
var form = new FormData(document.getElementById("puffuser"));
|
||||||
|
console.log(form)
|
||||||
$.ajax({
|
$.ajax({
|
||||||
type: "POST",
|
type: "POST",
|
||||||
url: 'userhandle?a=add',
|
url: 'userhandle?a=add',
|
||||||
|
|
|
@ -148,7 +148,7 @@
|
||||||
maximizable: true,
|
maximizable: true,
|
||||||
title: '新增用户',
|
title: '新增用户',
|
||||||
width: 600,
|
width: 600,
|
||||||
height: 300,
|
height: 400,
|
||||||
closed: false,
|
closed: false,
|
||||||
cache: false,
|
cache: false,
|
||||||
href: url,
|
href: url,
|
||||||
|
|
|
@ -485,29 +485,38 @@ def getspr(ubp):
|
||||||
return User.objects.get(ubelongpart=currentpart,issuper=1)
|
return User.objects.get(ubelongpart=currentpart,issuper=1)
|
||||||
return a
|
return a
|
||||||
|
|
||||||
def getsprs(ubp):
|
def getsprs(userid,ubp):
|
||||||
currentpart=ubp
|
currentpart=ubp
|
||||||
a=getsprs_ubp(currentpart)
|
a=getsprs_ubp(userid,currentpart)
|
||||||
while a==False:
|
while a==False:
|
||||||
currentpart=currentpart.parentid #已找不到上级部门
|
currentpart=currentpart.parentid #已找不到上级部门
|
||||||
if currentpart:
|
if currentpart:
|
||||||
a=getsprs_ubp(currentpart)
|
a=getsprs_ubp(userid,currentpart)
|
||||||
else:
|
else:
|
||||||
return User.objects.get(ubelongpart=currentpart,issuper=1)
|
return User.objects.get(ubelongpart=currentpart,issuper=1)
|
||||||
return a
|
return a
|
||||||
|
|
||||||
def getsprs_ubp(ubp):
|
def getsprs_ubp(userid,ubp):
|
||||||
a=ubp
|
a=ubp
|
||||||
if a.aqy !=',':
|
if a.aqy !=',':
|
||||||
aqystr = a.aqy
|
aqystr = a.aqy
|
||||||
aqylist = aqystr.split(',')
|
aqylist = aqystr.split(',')
|
||||||
aqylist = list(map(int, list(filter(None, aqylist))))
|
aqylist = list(map(int, list(filter(None, aqylist))))
|
||||||
return aqylist
|
if userid in aqylist:
|
||||||
|
return [userid]
|
||||||
|
else:
|
||||||
|
if ',' + str(userid) + ',' in a.bmzg:
|
||||||
|
return [userid]
|
||||||
|
else:
|
||||||
|
return aqylist
|
||||||
if a.bmzg !=',':
|
if a.bmzg !=',':
|
||||||
zgstr = a.bmzg
|
zgstr = a.bmzg
|
||||||
zglist = zgstr.split(',')
|
zglist = zgstr.split(',')
|
||||||
zglist = list(map(int, list(filter(None, zglist))))
|
zglist = list(map(int, list(filter(None, zglist))))
|
||||||
return zglist
|
if userid in zglist:
|
||||||
|
return [userid]
|
||||||
|
else:
|
||||||
|
return zglist
|
||||||
else:
|
else:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
@ -1442,6 +1451,12 @@ def grouphandle(req):
|
||||||
a=Group.objects.filter(usecomp__partid = companyid).exclude(grouptype=0).values('groupid','groupname','grouptype')
|
a=Group.objects.filter(usecomp__partid = companyid).exclude(grouptype=0).values('groupid','groupname','grouptype')
|
||||||
total=a.count()
|
total=a.count()
|
||||||
return HttpResponse(transjson(total,a),content_type="application/json")
|
return HttpResponse(transjson(total,a),content_type="application/json")
|
||||||
|
elif req.GET.get('a') =='list2':#排除全体用户组
|
||||||
|
userid = req.session['userid']
|
||||||
|
companyid = getcompany(userid)
|
||||||
|
a=Group.objects.filter(usecomp__partid = companyid).exclude(grouptype=0).exclude(grouptype=3).values('groupid','groupname','grouptype')
|
||||||
|
total=a.count()
|
||||||
|
return HttpResponse(transjson(total,a),content_type="application/json")
|
||||||
elif req.GET.get('a') =='combobox':
|
elif req.GET.get('a') =='combobox':
|
||||||
userid = req.session['userid']
|
userid = req.session['userid']
|
||||||
companyid = getcompany(userid)
|
companyid = getcompany(userid)
|
||||||
|
@ -2116,6 +2131,8 @@ def userhandle(req):
|
||||||
name = req.POST.get('name')
|
name = req.POST.get('name')
|
||||||
empid = req.POST.get('empid')
|
empid = req.POST.get('empid')
|
||||||
ubelongpart=Partment.objects.get(partid=req.POST.get('ubelongpart'))
|
ubelongpart=Partment.objects.get(partid=req.POST.get('ubelongpart'))
|
||||||
|
# if req.POST.getlist('group',None):
|
||||||
|
# a[0].userg.add(*req.POST.getlist('group'))
|
||||||
a.update(name=name,empid=empid,ubelongpart=ubelongpart,username=newname)
|
a.update(name=name,empid=empid,ubelongpart=ubelongpart,username=newname)
|
||||||
return JsonResponse({"code":1})
|
return JsonResponse({"code":1})
|
||||||
else:
|
else:
|
||||||
|
@ -2133,6 +2150,13 @@ def userhandle(req):
|
||||||
companyid = getcompany(a.userid)
|
companyid = getcompany(a.userid)
|
||||||
a.usecomp = Partment.objects.get(partid=companyid)
|
a.usecomp = Partment.objects.get(partid=companyid)
|
||||||
a.save()
|
a.save()
|
||||||
|
# if req.POST.getlist('group',None):
|
||||||
|
# #a.userg.add(*req.POST.getlist('group'))
|
||||||
|
# objs = Group.objects.filter(groupid__in=req.POST.getlist('group'))
|
||||||
|
# for i in objs:
|
||||||
|
# if i.grouptype == 1:
|
||||||
|
|
||||||
|
# i.users.add(a)
|
||||||
Group.objects.get(usecomp__partid=companyid,grouptype=3).users.add(a)
|
Group.objects.get(usecomp__partid=companyid,grouptype=3).users.add(a)
|
||||||
return JsonResponse({"code":1})
|
return JsonResponse({"code":1})
|
||||||
else:
|
else:
|
||||||
|
@ -2963,12 +2987,12 @@ def bwlogin(req):
|
||||||
|
|
||||||
def unbindwechat(req):
|
def unbindwechat(req):
|
||||||
userid=req.session['userid']
|
userid=req.session['userid']
|
||||||
User.objects.filter(userid=userid).update(openid=0,headimgurl=0,nickname=0,mpopenid=0)
|
User.objects.filter(userid=userid).update(openid=None,headimgurl=None,nickname=None,mpopenid=None)
|
||||||
return JsonResponse({"code":1})
|
return JsonResponse({"code":1})
|
||||||
|
|
||||||
def unbindmp(req):
|
def unbindmp(req):
|
||||||
userid=req.session['userid']
|
userid=req.session['userid']
|
||||||
User.objects.filter(userid=userid).update(openid=0,headimgurl=0,nickname=0,mpopenid=0)
|
User.objects.filter(userid=userid).update(openid=None,headimgurl=None,nickname=None,mpopenid=None)
|
||||||
return JsonResponse({"code":1})
|
return JsonResponse({"code":1})
|
||||||
|
|
||||||
def vewechat(req):
|
def vewechat(req):
|
||||||
|
@ -3054,7 +3078,7 @@ def importusers(req):
|
||||||
|
|
||||||
def apicompany(req):
|
def apicompany(req):
|
||||||
a = req.GET.get('a')
|
a = req.GET.get('a')
|
||||||
menurights = '11,1,2,3,4,5,6,7,8,9,10,12,13,15,16,17,18,19,20,21,22,23,24,28,29,32,36'#菜单编码
|
menurights = '11,1,2,3,4,5,6,7,8,9,10,12,13,15,16,17,18,19,20,21,22,23,24,28,29,32,36,46,47,48,50'#菜单编码
|
||||||
if a=='add':
|
if a=='add':
|
||||||
admin = req.GET.get('admin')
|
admin = req.GET.get('admin')
|
||||||
company = req.GET.get('company')
|
company = req.GET.get('company')
|
||||||
|
@ -4212,8 +4236,8 @@ def apioperation(req):
|
||||||
obj.save()
|
obj.save()
|
||||||
splc = []
|
splc = []
|
||||||
splc.append({'jdmc':'作业负责人审批','sprs':[userid]})
|
splc.append({'jdmc':'作业负责人审批','sprs':[userid]})
|
||||||
splc.append({'jdmc':'作业部门审批','sprs':getsprs(obj.zybm)})
|
splc.append({'jdmc':'作业部门审批','sprs':getsprs(userid,obj.zybm)})
|
||||||
splc.append({'jdmc':'属地部门审批','sprs':getsprs(obj.sdbm)})
|
splc.append({'jdmc':'属地部门审批','sprs':getsprs(userid,obj.sdbm)})
|
||||||
for i in Operationspjd.objects.filter(zylx=obj.zylx,usecomp=Partment.objects.get(partid=getcompany(userid))).order_by('id'):
|
for i in Operationspjd.objects.filter(zylx=obj.zylx,usecomp=Partment.objects.get(partid=getcompany(userid))).order_by('id'):
|
||||||
splc.append({'jdmc':i.jdmc,'sprs':i.sprs})
|
splc.append({'jdmc':i.jdmc,'sprs':i.sprs})
|
||||||
obj.zyzt['splc']=splc
|
obj.zyzt['splc']=splc
|
||||||
|
@ -5024,6 +5048,11 @@ def apiexamtestdetail(req):
|
||||||
total = a.count()
|
total = a.count()
|
||||||
startnum,endnum=fenye(req)
|
startnum,endnum=fenye(req)
|
||||||
a = a[startnum:endnum].values('id','examtest__id','examtest__name','examtest__starttime','examtest__endtime','examtest__passscore','examtest__state','examtest__duration')
|
a = a[startnum:endnum].values('id','examtest__id','examtest__name','examtest__starttime','examtest__endtime','examtest__passscore','examtest__state','examtest__duration')
|
||||||
|
for i in a:
|
||||||
|
if i['examtest__endtime']>datetime.now():
|
||||||
|
i['isActive'] = True
|
||||||
|
else:
|
||||||
|
i['isActive'] = False
|
||||||
return HttpResponse(transjson(total,a),content_type="application/json")
|
return HttpResponse(transjson(total,a),content_type="application/json")
|
||||||
elif a=='listyk':
|
elif a=='listyk':
|
||||||
a = ExamTestDetail.objects
|
a = ExamTestDetail.objects
|
||||||
|
|
Loading…
Reference in New Issue