Pārlūkot izejas kodu

MT5交易管理

candy 6 gadi atpakaļ
vecāks
revīzija
5247624610

+ 1 - 0
README.md

@@ -91,6 +91,7 @@ CRM项目多版本并行管理基础版本
 服务层通用配置:
 
     在/service/common/config/db.php中配置数据库相关信息
+	在/service/common/config/mt5db.php 中配置mt5交易管理的数据库信息
 
 四、项目部署
 ==

+ 65 - 0
normandcrm/admin/backend/models/Mt5tradeApi.php

@@ -0,0 +1,65 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: Titan 名字就是密码
+ * Date: 2019/12/31
+ * Time: 17:08
+ */
+
+namespace backend\models;
+/**
+ * mt5管理
+ * Class Mt5tradeApi
+ * @package backend\models
+ */
+
+class Mt5tradeApi extends BaseApi
+{
+    public $apiurl = "mt5";
+
+    /**
+     * 持仓
+     * @param $data
+     * @return array
+     */
+    public function getPostionList($data)
+    {
+        $result = $this->post($this->apiurl."/position-list",$data);
+
+        if($result['code'] == 1){
+            return $this->returnArray(1,$result['data'],"OK");
+        }else{
+            return $this->returnArray(0,[],'FAILED');
+        }
+    }
+
+    /**
+     * 订单
+     * @param $data
+     * @return array
+     */
+    public function getOrderList($data)
+    {
+        $result = $this->post($this->apiurl."/order-list",$data);
+        if($result['code'] == 1){
+            return $this->returnArray(1,$result['data'],"OK");
+        }else{
+            return $this->returnArray(0,[],'FAILED');
+        }
+    }
+
+    /**
+     * 成交
+     * @param $data
+     * @return array
+     */
+    public function getDealList($data)
+    {
+        $result = $this->post($this->apiurl."/deal-list",$data);
+        if($result['code'] == 1){
+            return $this->returnArray(1,$result['data'],"OK");
+        }else{
+            return $this->returnArray(0,[],'FAILED');
+        }
+    }
+}

+ 130 - 0
normandcrm/admin/backend/modules/admin/controllers/Mt5TradesController.php

@@ -0,0 +1,130 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: Titan 名字就是密码
+ * Date: 2019/12/31
+ * Time: 17:05
+ */
+
+namespace backend\modules\admin\controllers;
+use backend\models\Mt5Positions;
+use backend\models\Mt5tradeApi;
+use Yii;
+
+/**
+ * mt5交易管理
+ * Class Mt5Trades
+ * @package backend\modules\admin\controllers
+ */
+class Mt5TradesController extends BaseController
+{
+    public $enableCsrfValidation = false;
+
+    /**
+     * 持仓页面
+     * @return string
+     */
+    public function actionPosition()
+    {
+
+        return $this->render('position');
+    }
+
+    /**
+     * 订单页面
+     * @return string
+     */
+    public function actionOrder()
+    {
+        return $this->render('order');
+    }
+
+    /**
+     * 成交页面
+     * @return string
+     */
+    public function actionDeal()
+    {
+        return $this->render("deal");
+    }
+    /**
+     * ajax 持仓获取数据
+     */
+    public function actionAjaxPosition()
+    {
+
+        $get = Yii::$app->request->get();
+        $orderInt = isset($get['order'][0]['column']) ? (int) $get['order'][0]['column'] : 1;
+        $order = isset($get['columns'][$orderInt]['data']) ? $get['columns'][$orderInt]['data'] : '';
+        $orderBy = isset($get['order'][0]['dir']) ? $get['order'][0]['dir'] : 'desc';
+        $search = isset($get['search']['value']) ? trim($get['search']['value']) : '';
+        $start = isset($get['start']) ? (int) $get['start'] : 0;
+        $length = isset($get['length']) ? (int) $get['length'] : 20;
+        $draw = isset($get['draw']) ? $get['draw'] : 1;
+        $params = [
+            'order' => $order,
+            'orderBy' => $orderBy,
+            'search' => $search,
+            'start' => $start,
+            'length' => $length,
+            'draw' => $draw,
+        ];
+
+        $api = new Mt5tradeApi();
+        $result = $api->getPostionList($params);
+        echo json_encode($result['data']);
+    }
+
+    /**
+     * 获取订单数据
+     */
+    public function actionAjaxOrder()
+    {
+        $get = Yii::$app->request->get();
+        $orderInt = isset($get['order'][0]['column']) ? (int) $get['order'][0]['column'] : 1;
+        $order = isset($get['columns'][$orderInt]['data']) ? $get['columns'][$orderInt]['data'] : '';
+        $orderBy = isset($get['order'][0]['dir']) ? $get['order'][0]['dir'] : 'desc';
+        $search = isset($get['search']['value']) ? trim($get['search']['value']) : '';
+        $start = isset($get['start']) ? (int) $get['start'] : 0;
+        $length = isset($get['length']) ? (int) $get['length'] : 20;
+        $draw = isset($get['draw']) ? $get['draw'] : 1;
+        $params = [
+            'order' => $order,
+            'orderBy' => $orderBy,
+            'search' => $search,
+            'start' => $start,
+            'length' => $length,
+            'draw' => $draw,
+        ];
+
+        $api = new Mt5tradeApi();
+        $result = $api->getOrderList($params);
+        echo json_encode($result['data']);
+    }
+
+    /**
+     * 获取成交数据
+     */
+    public function actionAjaxDeal()
+    {
+        $get = Yii::$app->request->get();
+        $orderInt = isset($get['order'][0]['column']) ? (int) $get['order'][0]['column'] : 1;
+        $order = isset($get['columns'][$orderInt]['data']) ? $get['columns'][$orderInt]['data'] : '';
+        $orderBy = isset($get['order'][0]['dir']) ? $get['order'][0]['dir'] : 'desc';
+        $search = isset($get['search']['value']) ? trim($get['search']['value']) : '';
+        $start = isset($get['start']) ? (int) $get['start'] : 0;
+        $length = isset($get['length']) ? (int) $get['length'] : 20;
+        $draw = isset($get['draw']) ? $get['draw'] : 1;
+        $params = [
+            'order' => $order,
+            'orderBy' => $orderBy,
+            'search' => $search,
+            'start' => $start,
+            'length' => $length,
+            'draw' => $draw,
+        ];
+        $api = new Mt5tradeApi();
+        $result = $api->getDealList($params);
+        echo json_encode($result['data']);
+    }
+}

+ 14 - 3
normandcrm/admin/backend/modules/admin/views/common/_left.php

@@ -64,6 +64,19 @@ use yii\helpers\Url;
             </li>
 
 
+            <li >
+                <a href="#"><i class="fa fa-list-ul"></i> <span class="nav-label">MT5交易管理</span><span class="fa arrow"></span></a>
+                <ul class="nav nav-second-level collapse">
+
+                    <li><a href=<?= Url::to(["/admin/mt5-trades/position"]) ?>>持仓</a></li>
+                    <li><a href=<?= Url::to(["/admin/mt5-trades/order"]) ?>>订单</a></li>
+                    <li><a href=<?= Url::to(["/admin/mt5-trades/deal"]) ?>>成交</a></li>
+
+                </ul>
+            </li>
+
+
+
             <li>
                 <a href=<?= Url::to(["/admin/notice"]) ?>><i class="fa fa-bell-o"></i> <span class="nav-label">公告/帮助管理</span></a>
             </li>
@@ -74,8 +87,6 @@ use yii\helpers\Url;
                     <li><a href=<?= Url::to(["/admin/deposit?type=0"]) ?>>待入金明细</a></li>
                     <li><a href=<?= Url::to(["/admin/deposit?type=1"]) ?>>成功入金明细</a></li>
                     <li><a href=<?= Url::to(["/admin/deposit-config"]) ?>>入金配置</a></li>
-                    <li><a href=<?= Url::to(["/admin/publicaccount"]) ?>>对公配置</a></li>
-                    <li><a href=<?= Url::to(["/admin/privateaccount"]) ?>>对私配置</a></li>
                 </ul>
             </li>
 
@@ -120,7 +131,7 @@ use yii\helpers\Url;
             <li>
                 <a href=<?= Url::to(["/admin/config"]) ?>><i class="fa fa-cogs"></i> <span class="nav-label">系统参数设置</span></a>
             </li>
-            
+
             
         </ul>
 

+ 1 - 0
normandcrm/admin/backend/modules/admin/views/layouts/main.php

@@ -28,6 +28,7 @@ YiiAsset::register($this);
     <link href="<?= STATIC_URL ?>/ui/css/plugins/sweetalert/sweetalert.css" rel="stylesheet">
     <link href="<?= STATIC_URL ?>/ui/css/plugins/iCheck/custom.css" rel="stylesheet">
     <link href="<?= STATIC_URL ?>/ui/css/plugins/select2/select2.min.css" rel="stylesheet">
+	<link href="<?= STATIC_URL ?>/ui/css/plugins/mt5/popup.css" rel="stylesheet">
     <style>
         #datatables tr.selected{
             background:#1ab394;

+ 492 - 0
normandcrm/admin/backend/modules/admin/views/mt5-trades/deal.php

@@ -0,0 +1,492 @@
+<?php
+$this->title = 'Deal';
+?>
+
+
+    <div class="row wrapper border-bottom white-bg page-heading">
+        <div class="col-lg-12">
+            <h2>成交</h2>
+            <ol class="breadcrumb">
+                <li>
+                    <a href="/admin/dashboard">管理首页</a>
+                </li>
+                <li class="active">
+                    <strong>成交</strong>
+                </li>
+            </ol>
+        </div>
+    </div>
+
+    <div class="wrapper wrapper-content" id="main" style="position: relative">
+        <div id="background_div"></div>
+        <div id="content">
+            <div class="row">
+                <div class="col-lg-12">
+                    <div class="ibox float-e-margins">
+
+                        <div class="ibox-content">
+
+                            <div class="table-responsive">
+                                <table id="datatables" class="table table-striped table-bordered table-hover">
+                                    <thead>
+                                    <tr>
+                                        <th>时间</th>
+                                        <th>登录</th>
+                                        <th>成交</th>
+                                        <th>交易品种</th>
+                                        <th>启用</th>
+                                        <th>进入</th>
+                                        <th>交易量</th>
+                                        <th>价格</th>
+                                        <th>S/L</th>
+                                        <th>T/P</th>
+                                        <th>库存费</th>
+                                        <th>盈利</th>
+                                    </tr>
+                                    </thead>
+                                    <tfoot>
+                                    <tr>
+
+                                        <th>时间</th>
+                                        <th>登录</th>
+                                        <th>成交</th>
+                                        <th>交易品种</th>
+                                        <th>启用</th>
+                                        <th>进入</th>
+                                        <th>交易量</th>
+                                        <th>价格</th>
+                                        <th>S/L</th>
+                                        <th>T/P</th>
+                                        <th>库存费</th>
+                                        <th>盈利</th>
+                                    </tr>
+                                    </tfoot>
+                                </table>
+                            </div>
+
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+
+    <div id="eject">
+        <!--做一个点击关闭的按钮-->
+        <div id="close" style="width: 20px;height: 25px; margin-left: 960px;">
+            <span style="font-size: 25px;">X</span>
+        </div>
+        <!--弹出div的内容-->
+
+            <div class="title">详细资料</div>
+            <div style="padding-top:50px;">
+                <div class="number"><div id="deal"></div><div id="position"></div><div id="order"></div></div>
+                <div class="">
+                    <div class="left">
+                        <div id="create_time"></div>
+                        <div id="reason"></div>
+                        <div id="comment"></div>
+                    </div>
+                    <div class="right">
+                        <div id="price"></div>
+                        <div id="pricePosition"></div>
+                        <div id="priceSL"></div>
+                        <div id="PriceTP"></div>
+                        <div id="Commission"></div>
+                        <div id="swap"></div>
+                        <div id="profit"></div>
+                        <div id="ProfitRaw"></div>
+                        <div id="RateProfit"></div>
+                        <div id="RateMargin"></div>
+                        <div id="PriceGateway"></div>
+                    </div>
+                </div>
+            </div>
+
+    </div>
+
+<?php $this->beginBlock('footer_script'); ?>
+    <script>
+        var table;
+        $(document).ready(function() {
+            table = $('#datatables').DataTable({
+                "aLengthMenu": [[20,50,100,500,999999999], [20,50,100,500,"ALL"]],
+                language: {
+                    "sProcessing": "处理中...",
+                    "sLengthMenu": "显示 _MENU_ 项结果",
+                    "sZeroRecords": "没有匹配结果",
+                    "sInfo": "显示第 _START_ 至 _END_ 项结果,共 _TOTAL_ 项",
+                    "sInfoEmpty": "显示第 0 至 0 项结果,共 0 项",
+                    "sInfoFiltered": "(由 _MAX_ 项结果过滤)",
+                    "sInfoPostFix": "",
+                    "sSearch": "搜索:",
+                    "sUrl": "",
+                    "sEmptyTable": "表中数据为空",
+                    "sLoadingRecords": "载入中...",
+                    "sInfoThousands": ",",
+                    "oPaginate": {
+                        "sFirst": "首页",
+                        "sPrevious": "上页",
+                        "sNext": "下页",
+                        "sLast": "末页"
+                    },
+                    "oAria": {
+                        "sSortAscending": ": 以升序排列此列",
+                        "sSortDescending": ": 以降序排列此列"
+                    }
+                },
+                "processing": true,
+                "serverSide": true,
+                "ajax": '/admin/mt5-trades/ajax-deal',
+                "order": [[0, "desc"]],
+                "columns": [{
+                    "data": "Time"
+                },
+                    {
+                        "data": "Login"
+                    },
+                    {
+                        "data": "Deal"
+                    },
+                    {
+                        "data": "Symbol"
+                    },
+                    {
+                        "data": "Action"
+                    },
+                    {
+                        "data": "Entry"
+                    },
+                    {
+                        "data": "Volume"
+                    },
+                    {
+                        "data": "Price"
+                    },
+
+                    {
+                        "data": "PriceSL"
+                    },
+
+                    {
+                        "data": "PriceTP"
+                    },
+
+                    {
+                        "data": "Storage"
+                    },
+                    {
+                        "data": "Profit"
+                    },
+
+                ],
+                columnDefs: [{
+                    targets: 4,
+                    render: function(data, type, row, meta) {
+                        if(data==0){
+                            return 'buy';
+                        }else if (data==1){
+                            return 'sell';
+                        }else if (data==2){
+                            return 'balance';
+                        }else if (data==3){
+                            return 'SELL LIMIT';
+                        }else if (data==4){
+                            return 'BUY STOP';
+                        }else if (data==5){
+                            return 'SELL STOP';
+                        }else if (data==6){
+                            return 'BALANCE';
+                        }else if (data==7){
+                            return 'CREDIT';
+                        }else{
+                            return '';
+                        }
+                    },
+                    "orderable": true
+                },{
+                    targets: 5,
+                    render: function(data, type, row, meta) {
+                        if(data == 0){
+                            return 'in';
+                        }else if(data == 1){
+                            return 'out';
+                        }else if(data == 2){
+                            return 'in/out';
+                        }else if(data == 3){
+                            return 'out by'
+                        }
+                    },
+                    "orderable": true
+                },
+                {
+                    targets: 6,
+                    render: function(data, type, row, meta) {
+                        var num = data/10000;
+                        return num.toFixed(2);
+                    },
+                    "orderable": true
+                },{
+                        targets: 7,
+                        render: function(data, type, row, meta) {
+                            return parseInt(data).toFixed(2);
+                        },
+                        "orderable": true
+                    },{
+                        targets: 8,
+                        render: function(data, type, row, meta) {
+                            return parseInt(data).toFixed(2);
+                        },
+                        "orderable": true
+                    },{
+                        targets: 9,
+                        render: function(data, type, row, meta) {
+                            return parseInt(data).toFixed(2);
+                        },
+                        "orderable": true
+                    },{
+                        targets: 10,
+                        render: function(data, type, row, meta) {
+                            return parseInt(data).toFixed(2);
+                        },
+                        "orderable": true
+                    },{
+                        targets: 11,
+                        render: function(data, type, row, meta) {
+                            return parseInt(data).toFixed(2);
+                        },
+                        "orderable": true
+                    }],
+                "sPaginationType": "full_numbers",
+                dom: '<"html5buttons"B>lTfgitp',
+                buttons: [{
+                    extend: 'copy'
+                },
+                    {
+                        extend: 'csv'
+                    },
+                    {
+                        extend: 'excel'
+                    },
+                    {
+                        extend: 'pdf'
+                    },
+                    {
+                        extend: 'print',
+                        customize: function(win) {
+
+                            $(win.document.body).addClass('white-bg');
+                            $(win.document.body).css('font-size', '10px');
+                            $(win.document.body).find('table').addClass('compact').css('font-size', 'inherit');
+                        }
+                    }]
+
+            });
+            //获取页面的实际高度和宽度
+            var hei = $(document).height();
+            var wid = $(document).width();
+
+            $("#datatables tbody").on('click','tr',function () {
+                var data=table.row(this).data();
+                console.log(data);
+
+
+                center($("#eject"));
+
+                var reason = data['Reason'];
+                switch(reason) {
+                    case 1:
+                        var cause = "Expert";
+                        break;
+                    case 2:
+                        var cause = "Dealer";
+                        break;
+                    case 3:
+                        var cause = "Stop loss";
+                        break;
+                    case 4:
+                        var cause = "Take profit";
+                        break;
+                    case 5:
+                        var cause = "Stop out";
+                        break;
+                    case 6:
+                        var cause = "Rollover";
+                        break;
+                    case 7:
+                        var cause = "External Client";
+                        break;
+                    case 8:
+                        var cause = "Variation margin";
+                        break;
+                    case 9:
+                        var cause = "Gateway";
+                        break;
+                    case 10:
+                        var cause = "Signal";
+                        break;
+                    case 11:
+                        var cause = "Settlement";
+                        break;
+                    case 12:
+                        var cause = "Transfer";
+                        break;
+                    case 13:
+                        var cause = "Synchronization";
+                        break;
+                    case 14:
+                        var cause = "External Service";
+                        break;
+                    case 15:
+                        var cause = "Migration";
+                        break;
+                    case 16:
+                        var cause = "Mobile";
+                        break;
+                    case 17:
+                        var cause = "Web";
+                        break;
+                    case 18:
+                        var cause = "Split";
+                        break;
+                    default:
+                        var cause = "Client";
+                }
+
+                var action = data['Action'];
+
+                if(action == 2){
+                    $("#deal").html("成交:"+data['Deal']);
+                    $("#create_time").html("创建时间:"+data['Time']);
+                    $("#reason").html("原因:"+cause);
+                    $("#comment").html("注释:"+data['Comment']);
+
+                    $("#position").html('');
+                    $("#order").html('');
+                    $("#price").html('');
+                    $("#pricePosition").html('');
+                    $("#priceSL").html('');
+                    $("#PriceTP").html('');
+                    $("#Commission").html('');
+                    $("#swap").html('');
+                    $("#profit").html('');
+                    $("#ProfitRaw").html('');
+                    $("#RateProfit").html('');
+                    $("#RateMargin").html('');
+                    $("#PriceGateway").html('');
+                }else{
+                    $("#deal").html("成交:"+data['Deal']);
+                    $("#position").html("持仓:"+data['PositionID']);
+                    $("#order").html("订单:"+data['Order']);
+                    $("#create_time").html("创建时间:"+data['Time']);
+                    $("#reason").html("原因:"+cause);
+                    $("#comment").html("注释:"+data['Comment']);
+                    $("#price").html("价位:"+data['Price']);
+                    $("#pricePosition").html("持仓价格:"+parseInt(data['PricePosition']).toFixed(2));
+                    $("#priceSL").html("止损:"+parseInt(data['PriceSL']).toFixed(2));
+                    $("#PriceTP").html("止盈:"+parseInt(data['PriceTP']).toFixed(2));
+                    $("#Commission").html("手续费:"+parseInt(data['Commission']).toFixed(2));
+                    $("#swap").html("库存费:"+parseInt(data['Storage']).toFixed(2));
+                    $("#profit").html("盈利:"+parseInt(data['Profit']).toFixed(2));
+                    $("#ProfitRaw").html("原盈利:"+parseInt(data['ProfitRaw']).toFixed(2));
+                    $("#RateProfit").html("盈利比例:"+parseInt(data['RateProfit']).toFixed(8));
+                    $("#RateMargin").html("预付款比例:"+parseInt(data['RateMargin']).toFixed(8));
+                    $("#PriceGateway").html("网关价格:"+parseInt(data['PriceGateway']).toFixed(5));
+
+                }
+
+                $("#eject").show();
+
+            })
+
+            function center(obj) {
+                var screenWidth = $(window).width();
+                screenHeight = $(window).height(); //当前浏览器窗口的 宽高
+                var scrolltop = $(document).scrollTop();//获取当前窗口距离页面顶部高度
+                var objLeft = (screenWidth - obj.width())/2 ;
+                var objTop = (screenHeight - obj.height())/2 + scrolltop;
+                obj.css({left: objLeft + 'px', top: objTop + 'px','display': 'block'});
+//浏览器窗口大小改变时
+                $(window).resize(function() {
+                    screenWidth = $(window).width();
+                    screenHeight = $(window).height();
+                    scrolltop = $(document).scrollTop();
+                    objLeft = (screenWidth - obj.width())/2 ;
+                    objTop = (screenHeight - obj.height())/2 + scrolltop;
+                    obj.css({left: objLeft + 'px', top: objTop + 'px','display': 'block'});
+                });
+//浏览器有滚动条时的操作、
+//                $(window).scroll(function() {
+//                    screenWidth = $(window).width();
+//                    screenHeight = $(window).height();
+//                    scrolltop = $(document).scrollTop();
+//                    objLeft = (screenWidth - obj.width())/2 ;
+//                    objTop = (screenHeight - obj.height())/2 + scrolltop;
+//                    obj.css({left: objLeft + 'px', top: objTop + 'px','display': 'block'});
+//                });
+            }
+
+//			点击弹出一个div框
+            $("#button").click(function(){ //给按钮绑定点击事件
+                $("#background_div").css("width",wid);
+                $("#background_div").css("height",hei);
+                $("#eject").show();
+            });
+//			点击关闭这个div框
+            $("#close").click(function(){
+                $("#background_div").css("width",0);
+                $("#background_div").css("height",0);
+                $("#eject").hide();
+            });
+//			鼠标移动到关闭按钮,按钮变红色,移除变黑色
+            $("#close").mouseover(function(){
+                $("#close span").css("color","red");
+                $("#close span").css("cursor","default");
+            });
+            $("#close").mouseout(function(){
+                $("#close span").css("color","black");
+            });
+
+            $("#eject").mousedown(function(e){
+                //设置移动后的默认位置
+                var endx=0;
+                var endy=0;
+
+                //获取div的初始位置,要注意的是需要转整型,因为获取到值带px
+                var left= parseInt($("#eject").css("left"));
+                var top = parseInt($("#eject").css("top"));
+
+                //获取鼠标按下时的坐标,区别于下面的es.pageX,es.pageY
+                var downx=e.pageX;
+                var downy=e.pageY;     //pageY的y要大写,必须大写!!
+
+                //    鼠标按下时给div挂事件
+                $("#eject").bind("mousemove",function(es){
+
+                    //es.pageX,es.pageY:获取鼠标移动后的坐标
+                    var endx= es.pageX-downx+left;     //计算div的最终位置
+                    var endy=es.pageY-downy+top;
+
+                    //带上单位
+                    $("#eject").css("left",endx+"px").css("top",endy+"px")
+                });
+            })
+
+
+            $("#eject").mouseup(function(){
+                //鼠标弹起时给div取消事件
+                $("#eject").unbind("mousemove")
+            })
+        });
+
+        $('.data').datepicker({
+            startView: 1,
+            todayBtn: "linked",
+            keyboardNavigation: true,
+            forceParse: false,
+            autoclose: true,
+            format: "yyyy-mm-dd"
+        });
+
+    </script>
+<?php $this->endBlock(); ?>

+ 539 - 0
normandcrm/admin/backend/modules/admin/views/mt5-trades/order.php

@@ -0,0 +1,539 @@
+<?php
+$this->title = 'Order';
+?>
+
+    <div class="row wrapper border-bottom white-bg page-heading">
+        <div class="col-lg-12">
+            <h2>订单</h2>
+            <ol class="breadcrumb">
+                <li>
+                    <a href="/admin/dashboard">管理首页</a>
+                </li>
+                <li class="active">
+                    <strong>订单</strong>
+                </li>
+            </ol>
+        </div>
+    </div>
+
+    <div class="wrapper wrapper-content">
+
+        <div class="row">
+            <div class="col-lg-12">
+                <div class="ibox float-e-margins">
+
+                    <div class="ibox-content">
+
+                        <div class="table-responsive">
+                            <table id="datatables" class="table table-striped table-bordered table-hover">
+                                <thead>
+                                <tr>
+
+                                    <th>时间</th>
+                                    <th>登录</th>
+                                    <th>订单</th>
+                                    <th>交易品种</th>
+                                    <th>类型</th>
+                                    <th>交易量</th>
+                                    <th>价格</th>
+                                    <th>S/L</th>
+                                    <th>T/P</th>
+                                    <th>时间</th>
+                                    <th>价格</th>
+                                    <th>原因</th>
+
+
+                                </tr>
+                                </thead>
+                                <tfoot>
+                                <tr>
+
+                                    <th>时间</th>
+                                    <th>登录</th>
+                                    <th>订单</th>
+                                    <th>交易品种</th>
+                                    <th>类型</th>
+                                    <th>交易量</th>
+                                    <th>价格</th>
+                                    <th>S/L</th>
+                                    <th>T/P</th>
+                                    <th>时间</th>
+                                    <th>价格</th>
+                                    <th>原因</th>
+                                </tr>
+                                </tfoot>
+                            </table>
+                        </div>
+
+                    </div>
+                </div>
+            </div>
+        </div>
+
+    </div>
+
+    <div id="eject">
+        <!--做一个点击关闭的按钮-->
+        <div id="close" style="width: 20px;height: 25px; margin-left: 960px;">
+            <span style="font-size: 25px;">X</span>
+        </div>
+        <!--弹出div的内容-->
+
+        <div class="title">详细资料</div>
+        <div style="padding-top:50px;">
+            <div class="number"><div id="Order"></div><div id="PositionID"></div></div>
+            <!--            <div class="div33"><div id="Action"></div><div id="Entry"></div><div  id="Volume"></div><div id="Symbol"></div></div>-->
+
+            <div class="">
+                <div class="orderLeft">
+                    <div id="Reason"></div>
+                    <div id="State"></div>
+                    <div id="Reason"></div>
+                    <div id="TypeFill"></div>
+                    <div id="Comment"></div>
+
+                </div>
+                <div class="center">
+                    <div id="TimeSetup"></div>
+                    <div id="TimeDone"></div>
+                    <div id="TimeExpiration"></div>
+                </div>
+                <div class="orderRight">
+
+                    <div id="PriceOrder"></div>
+                    <div id="PriceCurrent"></div>
+                    <div id="PriceTrigger"></div>
+                    <div id="priceSL"></div>
+                    <div id="priceTP"></div>
+                    <div id="profit"></div>
+                    <div id="RateMargin"></div>
+                </div>
+            </div>
+        </div>
+
+
+
+    </div>
+
+<?php $this->beginBlock('footer_script'); ?>
+    <script>
+        var table;
+        $(document).ready(function() {
+            table = $('#datatables').DataTable({
+                "aLengthMenu": [[20,50,100,500,999999999], [20,50,100,500,"ALL"]],
+                language: {
+                    "sProcessing": "处理中...",
+                    "sLengthMenu": "显示 _MENU_ 项结果",
+                    "sZeroRecords": "没有匹配结果",
+                    "sInfo": "显示第 _START_ 至 _END_ 项结果,共 _TOTAL_ 项",
+                    "sInfoEmpty": "显示第 0 至 0 项结果,共 0 项",
+                    "sInfoFiltered": "(由 _MAX_ 项结果过滤)",
+                    "sInfoPostFix": "",
+                    "sSearch": "搜索:",
+                    "sUrl": "",
+                    "sEmptyTable": "表中数据为空",
+                    "sLoadingRecords": "载入中...",
+                    "sInfoThousands": ",",
+                    "oPaginate": {
+                        "sFirst": "首页",
+                        "sPrevious": "上页",
+                        "sNext": "下页",
+                        "sLast": "末页"
+                    },
+                    "oAria": {
+                        "sSortAscending": ": 以升序排列此列",
+                        "sSortDescending": ": 以降序排列此列"
+                    }
+                },
+                "processing": true,
+                "serverSide": true,
+                "ajax": '/admin/mt5-trades/ajax-order',
+                "order": [[0, "desc"]],
+                "columns": [{
+                    "data": "TimeSetup"
+                },
+                    {
+                        "data": "Login"
+                    },
+                    {
+                        "data": "Order"
+                    },
+                    {
+                        "data": "Symbol"
+                    },
+                    {
+                        "data": "Type"
+                    },
+                    {
+                        "data": "VolumeInitial"
+                    },
+                    {
+                        "data": "PriceOrder"
+                    },
+                    {
+                        "data": "PriceSL"
+                    },
+
+                    {
+                        "data": "PriceTP"
+                    },
+
+                    {
+                        "data": "TimeDone"
+                    },
+
+                    {
+                        "data": "PriceTrigger"
+                    },
+
+                    {
+                        "data": "Reason"
+                    }
+
+                ],
+                columnDefs: [{
+                    targets: 4,
+                    render: function(data, type, row, meta) {
+                        if(data==0){
+                            return 'buy';
+                        }else if (data==1){
+                            return 'sell';
+                        }else if (data==2){
+                            return 'buy limit';
+                        }else if (data==3){
+                            return 'sell limit';
+                        }else if (data==4){
+                            return 'buy stop';
+                        }else if (data==5){
+                            return 'sell stop';
+                        }else if (data==6){
+                            return 'buy stop limit';
+                        }else if (data==7){
+                            return 'close by';
+                        }else{
+                            return '';
+                        }
+                    },
+                    "orderable": true
+                },{
+                    targets: 5,
+                    render: function(data, type, row, meta) {
+                        return (data/10000).toFixed(2);
+                        //return (data/10000).toFixed(2)+"/"+ (row['VolumeInitialExt']/100000000).toFixed(2);
+                    },
+                    "orderable": true
+                },{
+                    targets: 11,
+                    render: function(data, type, row, meta) {
+                        if(data==0){
+                            return 'Client';
+                        }else if (data==1){
+                            return 'Expert';
+                        }else if (data==2){
+                            return 'Dealer';
+                        }else if (data==3){
+                            return 'Stop loss';
+                        }else if (data==4){
+                            return 'Take profit';
+                        }else if (data==5){
+                            return 'Stop out';
+                        }else if (data==6){
+                            return 'Rollover';
+                        }else if (data==7){
+                            return 'External Client';
+                        }else if(data==8){
+                            return "Variation margin";
+                        }else if(data==9){
+                            return "Gateway";
+                        }else if(data==10){
+                            return "Signal";
+                        }else if(data==11){
+                            return "Settlement";
+                        }else if(data==12){
+                            return "Transfer";
+                        }else if(data==13){
+                            return "Synchronization";
+                        }else if(data==14){
+                            return "External Service";
+                        }else if(data==15){
+                            return "Migration";
+                        }else if(data==16){
+                            return "Mobile";
+                        }else if(data==17){
+                            return "Web";
+                        }else if(data==18){
+                            return "Split"
+                        }else{
+                            return '';
+                        }
+                    },
+                    "orderable": true
+                }
+                ,{
+                    targets: 6,
+                    render: function(data, type, row, meta) {
+                        return parseInt(data).toFixed(2);
+                    },
+                    "orderable": true
+                }
+                ,{
+                    targets: 7,
+                    render: function(data, type, row, meta) {
+                        return parseInt(data).toFixed(2);
+                    },
+                    "orderable": true
+                }
+                ,{
+                    targets: 8,
+                    render: function(data, type, row, meta) {
+                        return parseInt(data).toFixed(2);
+                    },
+                    "orderable": true
+                }
+                ,{
+                    targets: 10,
+                    render: function(data, type, row, meta) {
+                        return parseInt(data).toFixed(2);
+                    },
+                    "orderable": true
+                }
+                ],
+                "sPaginationType": "full_numbers",
+                dom: '<"html5buttons"B>lTfgitp',
+                buttons: [{
+                    extend: 'copy'
+                },
+                    {
+                        extend: 'csv'
+                    },
+                    {
+                        extend: 'excel'
+                    },
+                    {
+                        extend: 'pdf'
+                    },
+                    {
+                        extend: 'print',
+                        customize: function(win) {
+                            $(win.document.body).addClass('white-bg');
+                            $(win.document.body).css('font-size', '10px');
+                            $(win.document.body).find('table').addClass('compact').css('font-size', 'inherit');
+                        }
+                    }]
+
+            });
+
+
+
+            //获取页面的实际高度和宽度
+            var hei = $(document).height();
+            var wid = $(document).width();
+
+            $("#datatables tbody").on('click','tr',function () {
+                var data=table.row(this).data();
+                center($("#eject"));
+                $("#Order").html("订单:"+data['Order']);
+                $("#PositionID").html("持仓:"+data['PositionID']);
+                var reason = data['Reason'];
+                var state = data['State'];
+                if(state == 0){
+                    state = "STARTED";
+                }else if(state == 1){
+                    state = "FLACED";
+                }else if(state == 2){
+                    state = "CANCELED";
+                }else if(state == 3){
+                    state = "PARTIAL";
+                }else if(state == 4){
+                    state = "FILLED";
+                }else if(state == 5){
+                    state = "REJECTED";
+                }else if(state == 6){
+                    state = "EXPIRED";
+                }else if(state == 7){
+                    state = "REQUEST ADDING";
+                }else if(state == 8){
+                    state = "REQUEST MODIFYING";
+                }else if(state == 9){
+                    state = "REQUEST CANCELLING";
+                }else{
+                    state = "";
+                }
+                switch(reason) {
+
+                    case '1':
+                        var cause = "Expert";
+                        break;
+                    case '2':
+                        var cause = "Dealer";
+                        break;
+                    case '3':
+                        var cause = "Stop loss";
+                        break;
+                    case '4':
+                        var cause = "Take profit";
+                        break;
+                    case '5':
+                        var cause = "Stop out";
+                        break;
+                    case '6':
+                        var cause = "Rollover";
+                        break;
+                    case '7':
+                        var cause = "External Client";
+                        break;
+                    case '8':
+                        var cause = "Variation margin";
+                        break;
+                    case '9':
+                        var cause = "Gateway";
+                        break;
+                    case '10':
+                        var cause = "Signal";
+                        break;
+                    case '11':
+                        var cause = "Settlement";
+                        break;
+                    case '12':
+                        var cause = "Transfer";
+                        break;
+                    case '13':
+                        var cause = "Synchronization";
+                        break;
+                    case '14':
+                        var cause = "External Service";
+                        break;
+                    case '15':
+                        var cause = "Migration";
+                        break;
+                    case '16':
+                        var cause = "Mobile";
+                        break;
+                    case '17':
+                        var cause = "Web";
+                        break;
+                    case '18':
+                        var cause = "Split";
+                        break;
+                    default:
+                        var cause = "Client";
+                }
+                var fill = data['TypeFill'];
+                if(fill == 0){
+                    fill = "FILL OR KILL";
+                }else if(fill == 1){
+                    fill = "IMMEDIATE OR CANCEL";
+                }else if(fill == 2){
+                    fill = "RETURN";
+                }else{
+                    fill = "";
+                }
+
+                $("#Reason").html("原因:"+cause);
+                $("#State").html("状态:"+state);
+                $("#TypeFill").html("成交指令:"+fill);
+                $("#Comment").html("注释:"+data['Comment']);
+                $("#TimeSetup").html("时间设置:"+data['TimeSetup']);
+                $("#TimeDone").html("完成时间:"+data['TimeDone']);
+                $("#TimeExpiration").html("到期时间:"+data['TimeExpiration']);
+                $("#PriceOrder").html("订单价格:"+parseInt(data['PriceOrder']).toFixed(2));
+                $("#PriceCurrent").html("当前价格:"+data['PriceCurrent']);
+                $("#PriceTrigger").html("触发价格:"+parseInt(data['PriceTrigger']).toFixed(2));
+                $("#priceSL").html("止损:"+parseInt(data['PriceSL']).toFixed(2));
+                $("#priceTP").html("止盈:"+parseInt(data['PriceTP']).toFixed(2));
+                $("#RateMargin").html("预付款比例:"+parseInt(data['RateMargin']).toFixed(8));
+                $("#eject").show();
+
+            })
+
+            function center(obj) {
+                var screenWidth = $(window).width();
+                screenHeight = $(window).height(); //当前浏览器窗口的 宽高
+                var scrolltop = $(document).scrollTop();//获取当前窗口距离页面顶部高度
+                var objLeft = (screenWidth - obj.width())/2 ;
+                var objTop = (screenHeight - obj.height())/2 + scrolltop;
+                obj.css({left: objLeft + 'px', top: objTop + 'px','display': 'block'});
+//浏览器窗口大小改变时
+                $(window).resize(function() {
+                    screenWidth = $(window).width();
+                    screenHeight = $(window).height();
+                    scrolltop = $(document).scrollTop();
+                    objLeft = (screenWidth - obj.width())/2 ;
+                    objTop = (screenHeight - obj.height())/2 + scrolltop;
+                    obj.css({left: objLeft + 'px', top: objTop + 'px','display': 'block'});
+                });
+//浏览器有滚动条时的操作、
+//                $(window).scroll(function() {
+//                    screenWidth = $(window).width();
+//                    screenHeight = $(window).height();
+//                    scrolltop = $(document).scrollTop();
+//                    objLeft = (screenWidth - obj.width())/2 ;
+//                    objTop = (screenHeight - obj.height())/2 + scrolltop;
+//                    obj.css({left: objLeft + 'px', top: objTop + 'px','display': 'block'});
+//                });
+            }
+
+//			点击弹出一个div框
+            $("#button").click(function(){ //给按钮绑定点击事件
+                $("#background_div").css("width",wid);
+                $("#background_div").css("height",hei);
+                $("#eject").show();
+            });
+//			点击关闭这个div框
+            $("#close").click(function(){
+                $("#background_div").css("width",0);
+                $("#background_div").css("height",0);
+                $("#eject").hide();
+            });
+//			鼠标移动到关闭按钮,按钮变红色,移除变黑色
+            $("#close").mouseover(function(){
+                $("#close span").css("color","red");
+                $("#close span").css("cursor","default");
+            });
+            $("#close").mouseout(function(){
+                $("#close span").css("color","black");
+            });
+
+            $("#eject").mousedown(function(e){
+                //设置移动后的默认位置
+                var endx=0;
+                var endy=0;
+
+                //获取div的初始位置,要注意的是需要转整型,因为获取到值带px
+                var left= parseInt($("#eject").css("left"));
+                var top = parseInt($("#eject").css("top"));
+
+                //获取鼠标按下时的坐标,区别于下面的es.pageX,es.pageY
+                var downx=e.pageX;
+                var downy=e.pageY;     //pageY的y要大写,必须大写!!
+
+                //    鼠标按下时给div挂事件
+                $("#eject").bind("mousemove",function(es){
+
+                    //es.pageX,es.pageY:获取鼠标移动后的坐标
+                    var endx= es.pageX-downx+left;     //计算div的最终位置
+                    var endy=es.pageY-downy+top;
+
+                    //带上单位
+                    $("#eject").css("left",endx+"px").css("top",endy+"px")
+                });
+            })
+
+
+            $("#eject").mouseup(function(){
+                //鼠标弹起时给div取消事件
+                $("#eject").unbind("mousemove")
+            })
+        });
+
+        $('.data').datepicker({
+            startView: 1,
+            todayBtn: "linked",
+            keyboardNavigation: true,
+            forceParse: false,
+            autoclose: true,
+            format: "yyyy-mm-dd"
+        });
+
+    </script>
+<?php $this->endBlock(); ?>

+ 400 - 0
normandcrm/admin/backend/modules/admin/views/mt5-trades/position.php

@@ -0,0 +1,400 @@
+<?php
+$this->title = 'position';
+?>
+
+    <div class="row wrapper border-bottom white-bg page-heading">
+        <div class="col-lg-12">
+            <h2>持仓</h2>
+            <ol class="breadcrumb">
+                <li>
+                    <a href="/admin/dashboard">管理首页</a>
+                </li>
+                <li class="active">
+                    <strong>持仓</strong>
+                </li>
+            </ol>
+        </div>
+    </div>
+
+    <div class="wrapper wrapper-content">
+
+        <div class="row">
+            <div class="col-lg-12">
+                <div class="ibox float-e-margins">
+
+                    <div class="ibox-content">
+
+                        <div class="table-responsive">
+                            <table id="datatables" class="table table-striped table-bordered table-hover">
+                                <thead>
+                                <tr>
+                                    <th>时间</th>
+                                    <th>登录</th>
+                                    <th>持仓</th>
+                                    <th>交易品种</th>
+                                    <th>类型</th>
+                                    <th>交易量</th>
+                                    <th>价格</th>
+                                    <th>S/L</th>
+                                    <th>T/P</th>
+                                    <th>价格</th>
+                                </tr>
+                                </thead>
+                                <tfoot>
+                                <tr>
+                                    <th>时间</th>
+                                    <th>登录</th>
+                                    <th>持仓</th>
+                                    <th>交易品种</th>
+                                    <th>类型</th>
+                                    <th>交易量</th>
+                                    <th>价格</th>
+                                    <th>S/L</th>
+                                    <th>T/P</th>
+                                    <th>价格</th>
+                                </tr>
+                                </tfoot>
+                            </table>
+                        </div>
+
+                    </div>
+                </div>
+            </div>
+        </div>
+
+    </div>
+
+    <div id="eject">
+        <!--做一个点击关闭的按钮-->
+        <div id="close" style="width: 20px;height: 25px; margin-left: 960px;">
+            <span style="font-size: 25px;">X</span>
+        </div>
+        <!--弹出div的内容-->
+
+        <div class="title">详细资料</div>
+        <div style="padding-top:50px;">
+            <div class="number"><div id="Position"></div></div>
+<!--            <div class="div33"><div id="Action"></div><div id="Entry"></div><div  id="Volume"></div><div id="Symbol"></div></div>-->
+
+            <div class="div5">
+                <div class="left">
+                    <div id="TimeCreate"></div>
+                    <div id="TimeUpdate"></div>
+                    <div id="Reason"></div>
+                    <div id="Comment"></div>
+                </div>
+                <div class="right">
+                    <div id="PriceOpen"></div>
+                    <div id="PriceCurrent"></div>
+                    <div id="priceSL"></div>
+                    <div id="PriceTP"></div>
+                    <div id="Storage"></div>
+                    <div id="profit"></div>
+                    <div id="RateMargin"></div>
+                </div>
+            </div>
+        </div>
+
+
+
+    </div>
+
+<?php $this->beginBlock('footer_script'); ?>
+    <script>
+        var table;
+        $(document).ready(function() {
+            table = $('#datatables').DataTable({
+                "aLengthMenu": [[20,50,100,500,999999999], [20,50,100,500,"ALL"]],
+                language: {
+                    "sProcessing": "处理中...",
+                    "sLengthMenu": "显示 _MENU_ 项结果",
+                    "sZeroRecords": "没有匹配结果",
+                    "sInfo": "显示第 _START_ 至 _END_ 项结果,共 _TOTAL_ 项",
+                    "sInfoEmpty": "显示第 0 至 0 项结果,共 0 项",
+                    "sInfoFiltered": "(由 _MAX_ 项结果过滤)",
+                    "sInfoPostFix": "",
+                    "sSearch": "搜索:",
+                    "sUrl": "",
+                    "sEmptyTable": "表中数据为空",
+                    "sLoadingRecords": "载入中...",
+                    "sInfoThousands": ",",
+                    "oPaginate": {
+                        "sFirst": "首页",
+                        "sPrevious": "上页",
+                        "sNext": "下页",
+                        "sLast": "末页"
+                    },
+                    "oAria": {
+                        "sSortAscending": ": 以升序排列此列",
+                        "sSortDescending": ": 以降序排列此列"
+                    }
+                },
+                "processing": true,
+                "serverSide": true,
+                "ajax": '/admin/mt5-trades/ajax-position',
+                "order": [[0, "desc"]],
+                "columns": [{
+                    "data": "TimeCreate"
+                    },
+
+                    {
+                        "data": "Login"
+                    },
+                    {
+                        "data": "Position"
+                    },
+
+                    {
+                        "data": "Symbol"
+                    },
+                    {
+                        "data": "Action"
+                    },
+                    {
+                        "data": "Volume"
+                    },
+                    {
+                        "data": "PriceOpen"
+                    },
+                    {
+                        "data": "PriceSL"
+                    },
+                    {
+                        "data": "PriceTP"
+                    },
+                    {
+                        "data": "PriceCurrent"
+                    }],
+                columnDefs: [{
+                    targets: 4,
+                    render: function(data, type, row, meta) {
+                        if(data==0){
+                            return 'BUY';
+                        }else if (data==1){
+                            return 'SELL';
+                        }else{
+                            return '';
+                        }
+                    },
+                    "orderable": true
+                },{
+                    targets: 5,
+                    render: function(data, type, row, meta) {
+                        var num = data/10000;
+                        return num.toFixed(2);
+                    },
+                    "orderable": true
+                },{
+                    targets:7,
+                    render:function ( data,type,row,meta ) {
+                        return parseInt(data).toFixed(2);
+                    }
+                },
+                    {
+                        targets:8,
+                        render:function ( data,type,row,meta ) {
+                            return parseInt(data).toFixed(2);
+                        }
+                    }
+                ],
+                "sPaginationType": "full_numbers",
+                dom: '<"html5buttons"B>lTfgitp',
+                buttons: [{
+                    extend: 'copy'
+                },
+                    {
+                        extend: 'csv'
+                    },
+                    {
+                        extend: 'excel'
+                    },
+                    {
+                        extend: 'pdf'
+                    },
+                    {
+                        extend: 'print',
+                        customize: function(win) {
+                            $(win.document.body).addClass('white-bg');
+                            $(win.document.body).css('font-size', '10px');
+                            $(win.document.body).find('table').addClass('compact').css('font-size', 'inherit');
+                        }
+                    }]
+
+            });
+
+            //获取页面的实际高度和宽度
+            var hei = $(document).height();
+            var wid = $(document).width();
+            console.log($("#datatables"));
+            $("#datatables tbody").on('click','tr',function () {
+                var data=table.row(this).data();
+                center($("#eject"));
+                $("#Position").html("持仓:"+data['Position']);
+                $("#TimeCreate").html("创建时间:"+data['TimeCreate']);
+                $("#TimeUpdate").html("更新时间:"+data['TimeUpdate']);
+                var reason = data['Reason'];
+                switch(reason) {
+                    case '1':
+                        var cause = "Expert";
+                        break;
+                    case '2':
+                        var cause = "Dealer";
+                        break;
+                    case '3':
+                        var cause = "Stop loss";
+                        break;
+                    case '4':
+                        var cause = "Take profit";
+                        break;
+                    case '5':
+                        var cause = "Stop out";
+                        break;
+                    case '6':
+                        var cause = "Rollover";
+                        break;
+                    case '7':
+                        var cause = "External Client";
+                        break;
+                    case '8':
+                        var cause = "Variation margin";
+                        break;
+                    case '9':
+                        var cause = "Gateway";
+                        break;
+                    case '10':
+                        var cause = "Signal";
+                        break;
+                    case '11':
+                        var cause = "Settlement";
+                        break;
+                    case '12':
+                        var cause = "Transfer";
+                        break;
+                    case '13':
+                        var cause = "Synchronization";
+                        break;
+                    case '14':
+                        var cause = "External Service";
+                        break;
+                    case '15':
+                        var cause = "Migration";
+                        break;
+                    case '16':
+                        var cause = "Mobile";
+                        break;
+                    case '17':
+                        var cause = "Web";
+                        break;
+                    case '18':
+                        var cause = "Split";
+                        break;
+                    default:
+                        var cause = "Client";
+                }
+                $("#Reason").html("原因:"+cause);
+                $("#Comment").html("注释:"+data['Comment']);
+                $("#PriceOpen").html("开价:"+data['PriceOpen']);
+                $("#PriceCurrent").html("当前价格:"+data['PriceCurrent']);
+                $("#priceSL").html("止损:"+parseInt(data['PriceSL']).toFixed(2));
+                $("#PriceTP").html("止盈:"+parseInt(data['PriceTP']).toFixed(2));
+                $("#Storage").html("库存费:"+data['Storage']);
+                $("#profit").html("盈利:"+data['Profit']);
+                var RateMargin = parseInt(data['RateMargin']);
+                var RateMargin = RateMargin.toFixed(8);
+                $("#RateMargin").html("预付款比例:"+RateMargin);
+
+                $("#eject").show();
+
+            })
+
+            function center(obj) {
+                var screenWidth = $(window).width();
+                screenHeight = $(window).height(); //当前浏览器窗口的 宽高
+                var scrolltop = $(document).scrollTop();//获取当前窗口距离页面顶部高度
+                var objLeft = (screenWidth - obj.width())/2 ;
+                var objTop = (screenHeight - obj.height())/2 + scrolltop;
+                obj.css({left: objLeft + 'px', top: objTop + 'px','display': 'block'});
+//浏览器窗口大小改变时
+                $(window).resize(function() {
+                    screenWidth = $(window).width();
+                    screenHeight = $(window).height();
+                    scrolltop = $(document).scrollTop();
+                    objLeft = (screenWidth - obj.width())/2 ;
+                    objTop = (screenHeight - obj.height())/2 + scrolltop;
+                    obj.css({left: objLeft + 'px', top: objTop + 'px','display': 'block'});
+                });
+//浏览器有滚动条时的操作、
+//                $(window).scroll(function() {
+//                    screenWidth = $(window).width();
+//                    screenHeight = $(window).height();
+//                    scrolltop = $(document).scrollTop();
+//                    objLeft = (screenWidth - obj.width())/2 ;
+//                    objTop = (screenHeight - obj.height())/2 + scrolltop;
+//                    obj.css({left: objLeft + 'px', top: objTop + 'px','display': 'block'});
+//                });
+            }
+
+//			点击弹出一个div框
+            $("#button").click(function(){ //给按钮绑定点击事件
+                $("#background_div").css("width",wid);
+                $("#background_div").css("height",hei);
+                $("#eject").show();
+            });
+//			点击关闭这个div框
+            $("#close").click(function(){
+                $("#background_div").css("width",0);
+                $("#background_div").css("height",0);
+                $("#eject").hide();
+            });
+//			鼠标移动到关闭按钮,按钮变红色,移除变黑色
+            $("#close").mouseover(function(){
+                $("#close span").css("color","red");
+                $("#close span").css("cursor","default");
+            });
+            $("#close").mouseout(function(){
+                $("#close span").css("color","black");
+            });
+
+            $("#eject").mousedown(function(e){
+                //设置移动后的默认位置
+                var endx=0;
+                var endy=0;
+
+                //获取div的初始位置,要注意的是需要转整型,因为获取到值带px
+                var left= parseInt($("#eject").css("left"));
+                var top = parseInt($("#eject").css("top"));
+
+                //获取鼠标按下时的坐标,区别于下面的es.pageX,es.pageY
+                var downx=e.pageX;
+                var downy=e.pageY;     //pageY的y要大写,必须大写!!
+
+                //    鼠标按下时给div挂事件
+                $("#eject").bind("mousemove",function(es){
+
+                    //es.pageX,es.pageY:获取鼠标移动后的坐标
+                    var endx= es.pageX-downx+left;     //计算div的最终位置
+                    var endy=es.pageY-downy+top;
+
+                    //带上单位
+                    $("#eject").css("left",endx+"px").css("top",endy+"px")
+                });
+            })
+
+
+            $("#eject").mouseup(function(){
+                //鼠标弹起时给div取消事件
+                $("#eject").unbind("mousemove")
+            })
+        });
+
+        $('.data').datepicker({
+            startView: 1,
+            todayBtn: "linked",
+            keyboardNavigation: true,
+            forceParse: false,
+            autoclose: true,
+            format: "yyyy-mm-dd"
+        });
+
+    </script>
+<?php $this->endBlock(); ?>

+ 2 - 2
normandcrm/admin/backend/web/index.php

@@ -1,6 +1,6 @@
 <?php
-//defined('YII_DEBUG') or define('YII_DEBUG', true);
-//defined('YII_ENV') or define('YII_ENV', 'dev');
+defined('YII_DEBUG') or define('YII_DEBUG', true);
+defined('YII_ENV') or define('YII_ENV', 'dev');
 
 require(__DIR__ . '/../../vendor/autoload.php');
 require(__DIR__ . '/../../vendor/yiisoft/yii2/Yii.php');

+ 85 - 0
normandcrm/admin/backend/web/ui/css/plugins/mt5/popup.css

@@ -0,0 +1,85 @@
+/*order css*/
+.orderLeft{
+    display:inline;
+    float:left;
+    width: 220px;
+    margin-left:10%;
+
+}
+.center{
+    display:inline;
+    float:left;
+    margin-left:10%;
+
+}
+.orderRight{
+    float:right;
+    margin-right:10%;
+}
+
+
+.orderLeft>div{
+    margin-bottom:10px;
+}
+
+.orderRight>div{
+    margin-bottom:10px;
+}
+.center>div{
+    margin-bottom:10px;
+}
+
+/*postion deal css*/
+.left{
+    display:inline;
+    float:left;
+    width: 220px;
+    margin-left:10%;
+
+}
+
+.right{
+    float:right;
+    margin-right:20%;
+}
+
+
+.left>div{
+    margin-bottom:10px;
+}
+
+.right>div{
+    margin-bottom:10px;
+}
+
+/*公共部分css*/
+.title{
+    padding-left:400px;
+    margin-bottom:10px;
+    font-size: 20px;
+    color: #0c0c0c;
+}
+.number{
+    margin-bottom:30px;
+}
+
+.number>div{
+    margin-left:100px;
+    display:inline;
+    margin-right:120px;
+}
+
+/*被弹出的div*/
+#eject{
+    border: 1px #B3A9A9 solid;
+    border-radius: 10px;
+    width: 1000px;
+    height: 600px;
+    background-color: white;
+    /*让其浮在最上面*/
+    position: absolute;
+    display: none;
+    /*设置弹出的div窗口位置*/
+    /*left: 40%;*/
+    /*top: 30%;*/
+}

+ 1 - 1
normandcrm/admin/common/config/main-local.php

@@ -5,7 +5,7 @@ return [
             'class' => 'yii\db\Connection',
             'dsn' => 'mysql:host=localhost;dbname=yii2advanced',
             'username' => 'root',
-            'password' => '',
+            'password' => 'root',
             'charset' => 'utf8',
         ],
         'mailer' => [

+ 1 - 0
normandcrm/service/backend/config/main-local.php

@@ -7,6 +7,7 @@ $config = [
             'cookieValidationKey' => 'o83yA7NsYp3sNfG9AjO8hbXq5ejTAvyt',
         ],
         'dbCrm' => require(__DIR__ . '/../../common/config/db.php'),
+		'mt5db' => require(__DIR__ . '/../../common/config/mt5db.php'),//mt5数据库
         'mailer' => [
             'class' => 'yii\swiftmailer\Mailer',
             'useFileTransport' => false,

+ 62 - 0
normandcrm/service/backend/controllers/Mt5Controller.php

@@ -0,0 +1,62 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: Titan 名字就是密码
+ * Date: 2020/1/2
+ * Time: 18:46
+ */
+
+namespace backend\controllers;
+
+
+use backend\models\Mt5Deal;
+use backend\models\Mt5Order;
+use backend\models\Mt5Positions;
+use Yii;
+use yii\web\Controller;
+
+/**
+ * mt5管理
+ * Class Mt5Controller
+ * @package backend\controllers
+ */
+class Mt5Controller extends BaseController
+{
+    public $enableCsrfValidation = false;
+    public function actionPositionList()
+    {
+
+        $model = new Mt5Positions();
+        $result = $model->getPositionList(Yii::$app->request->post());
+        if ($result['code']) {
+            return $this->outJson(1, $result['data']);
+        } else {
+            return $this->outJson(0, [], $result['message']);
+        }
+    }
+
+    public function actionOrderList()
+    {
+        $model = new Mt5Order();
+       // $data = ['order'=>'Order','orderBy'=>"desc",'search'=>"","start"=>0,"length"=>20,'draw'=>1];
+        $result = $model->getOrderList(Yii::$app->request->post());
+        if ($result['code']) {
+            return $this->outJson(1, $result['data']);
+        } else {
+            return $this->outJson(0, [], $result['message']);
+        }
+    }
+
+    public function actionDealList()
+    {
+        $model = new Mt5Deal();
+        //$data = ['order'=>'Order','orderBy'=>"desc",'search'=>"","start"=>0,"length"=>20,'draw'=>1];
+        $result = $model->getDealList(Yii::$app->request->post());
+
+        if ($result['code']) {
+            return $this->outJson(1, $result['data']);
+        } else {
+            return $this->outJson(0, [], $result['message']);
+        }
+    }
+}

+ 76 - 0
normandcrm/service/backend/models/Mt5Deal.php

@@ -0,0 +1,76 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: Titan 名字就是密码
+ * Date: 2020/1/6
+ * Time: 16:05
+ */
+
+namespace backend\models;
+
+
+use common\helpers\Utils;
+use yii\db\ActiveRecord;
+
+class Mt5Deal extends ActiveRecord
+{
+    public static function tableName()
+    {
+        return "mt5_deals";
+    }
+
+    public static function getDb()
+    {
+        return \Yii::$app->get('mt5db');
+    }
+
+    public function getDealList($post)
+    {
+        $result = ['code'=>0,'data'=>[],'message'=>''];
+        $order = isset($post['order']) ? $post['order'] : '';
+        $orderBy = isset($post['orderBy']) ? strtolower($post['orderBy']) : 'desc';
+        $search = isset($post['search']) ? $post['search'] : '';
+        $start = isset($post['start']) ? (int) $post['start'] : 0;
+        $length = isset($post['length']) ? (int) $post['length'] : 20;
+        $draw = isset($post['draw']) ? $post['draw'] : 1;
+        $where = ['and'];
+        if($search) {
+            $where[] = [
+                'or',
+                ['like','Deal',$search],
+                ['like',"Login",$search]
+            ];
+        }
+        $allowOrderColumn = ['Time','Login','Deal','Symbol','Action','Entry','Volume','Price','PriceSL','PriceTP','Storage','Profit'];
+        if(in_array($order,$allowOrderColumn) && in_array($orderBy,['asc','desc'])){
+            if($orderBy == "asc"){
+                $orderCondition = [$order => SORT_ASC];
+            }else{
+                $orderCondition = [$order => SORT_DESC];
+            }
+        }else{
+            $orderCondition = ['Order' => SORT_DESC];
+        }
+        $query = static::find();
+        $query->where($where)
+            ->orderBy($orderCondition);
+        $count = $query->count();
+        $query->offset($start)->limit($length);
+        $list = $query->asArray()->all();
+        if($count){
+            foreach ($list as $k => $v){
+                $list[$k]['Price'] = Utils::formatFloatOrInt($v['Price'],5);
+                $list[$k]['Profit'] = Utils::formatFloatOrInt($v['Profit'],2);
+                $list[$k]['PriceSL'] = Utils::formatFloatOrInt($v['PriceSL'],2);
+                $list[$k]['PriceTP'] = Utils::formatFloatOrInt($v['PriceTP'],2);
+            }
+        }
+        $data['data'] = $list;
+        $data['draw'] = $draw;
+        $data['recordsFiltered'] = $count;
+        $data['recordsTotal'] = $count;
+        $result['data'] = $data;
+        $result['code'] = 1;
+        return $result;
+    }
+}

+ 75 - 0
normandcrm/service/backend/models/Mt5Order.php

@@ -0,0 +1,75 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: Titan 名字就是密码
+ * Date: 2020/1/3
+ * Time: 16:17
+ */
+
+namespace backend\models;
+
+
+use common\helpers\Utils;
+use yii\db\ActiveRecord;
+
+class Mt5Order extends ActiveRecord
+{
+    public static function tableName()
+    {
+        return "mt5_orders_history";
+    }
+
+    public static function getDb()
+    {
+        return \Yii::$app->get('mt5db');
+    }
+
+    public function getOrderList($post)
+    {
+        $result = ['code'=>0,'data'=>[],'message'=>''];
+        $order = isset($post['order']) ? $post['order'] : '';
+        $orderBy = isset($post['orderBy']) ? strtolower($post['orderBy']) : 'desc';
+        $search = isset($post['search']) ? $post['search'] : '';
+        $start = isset($post['start']) ? (int) $post['start'] : 0;
+        $length = isset($post['length']) ? (int) $post['length'] : 20;
+        $draw = isset($post['draw']) ? $post['draw'] : 1;
+        $where = ['and'];
+        if($search) {
+            $where[] = [
+                'or',
+                ['like','Order',$search],
+                ['like',"Login",$search]
+            ];
+        }
+        $allowOrderColumn = ['Login','Order','PositionID','Symbol','Type','VolumeInitial','PriceSL','PriceTP','PriceOrder','TimeSetup','PriceCurrent','PriceTrigger','TimeDone','TimeExpiration','Reason','State','RateMargin','Comment'];
+        if(in_array($order,$allowOrderColumn) && in_array($orderBy,['asc','desc'])){
+            if($orderBy == "asc"){
+                $orderCondition = [$order => SORT_ASC];
+            }else{
+                $orderCondition = [$order => SORT_DESC];
+            }
+        }else{
+            $orderCondition = ['Order' => SORT_DESC];
+        }
+
+        $query = static::find();
+
+        $query->where($where)
+            ->orderBy($orderCondition);
+        $count = $query->count();
+        $query->offset($start)->limit($length);
+        $list = $query->asArray()->all();
+//        if($count){
+//            foreach ($list as $k => $v){
+//                $list[$k][''] = Utils::formatFloatOrInt($v,8);
+//            }
+//        }
+        $data['data'] = $list;
+        $data['draw'] = $draw;
+        $data['recordsFiltered'] = $count;
+        $data['recordsTotal'] = $count;
+        $result['data'] = $data;
+        $result['code'] = 1;
+        return $result;
+    }
+}

+ 80 - 0
normandcrm/service/backend/models/Mt5Positions.php

@@ -0,0 +1,80 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: Titan 名字就是密码
+ * Date: 2020/1/2
+ * Time: 15:55
+ */
+
+namespace backend\models;
+
+
+use common\helpers\Utils;
+use yii\db\ActiveRecord;
+
+class Mt5Positions extends ActiveRecord
+{
+    public static function tableName()
+    {
+        return "mt5_positions";
+    }
+
+    public static function getDb()
+    {
+        return \Yii::$app->get('mt5db');
+    }
+
+    public function getPositionList($post)
+    {
+
+
+        $result = ['code'=>0,'data'=>[],'message'=>''];
+        $order = isset($post['order']) ? $post['order'] : '';
+        $orderBy = isset($post['orderBy']) ? strtolower($post['orderBy']) : 'desc';
+        $search = isset($post['search']) ? $post['search'] : '';
+        $start = isset($post['start']) ? (int) $post['start'] : 0;
+        $length = isset($post['length']) ? (int) $post['length'] : 20;
+        $draw = isset($post['draw']) ? $post['draw'] : 1;
+        $where = ['and'];
+
+        if($search) {
+            $where[] = [
+                'or',
+                ['like','Login',$search],
+                ['like',"Position",$search]
+            ];
+        }
+        $allowOrderColumn = ['Position','Login','Action','Symbol','PriceSL','PriceTP','Volume','PriceOpen','TimeCreate','PriceCurrent','Storage','Profit','Comment'];
+        if(in_array($order,$allowOrderColumn) && in_array($orderBy,['asc','desc'])){
+            if($orderBy == "asc"){
+                $orderCondition = [$order => SORT_ASC];
+            }else{
+                $orderCondition = [$order => SORT_DESC];
+            }
+        }else{
+            $orderCondition = ['Position' => SORT_DESC];
+        }
+
+        $query = static::find();
+
+        $query->where($where)
+            ->orderBy($orderCondition);
+        $count = $query->count();
+        $query->offset($start)->limit($length);
+        $list = $query->asArray()->all();
+        if($count){
+            foreach ($list as $k => $v){
+                $list[$k]['Profit'] = Utils::formatFloatOrInt($v['Profit']);
+                $list[$k]['PriceOpen'] = Utils::formatFloatOrInt($v['PriceOpen']);
+                 $list[$k]['PriceCurrent'] = Utils::formatFloatOrInt($v['PriceCurrent']);
+            }
+        }
+        $data['data'] = $list;
+        $data['draw'] = $draw;
+        $data['recordsFiltered'] = $count;
+        $data['recordsTotal'] = $count;
+        $result['data'] = $data;
+        $result['code'] = 1;
+        return $result;
+    }
+}

+ 449 - 0
normandcrm/service/backend/runtime/logs/app.log

@@ -134,3 +134,452 @@ $_SERVER = [
     'REQUEST_TIME_FLOAT' => 1574597496.9444
     'REQUEST_TIME' => 1574597496
 ]
+2020-01-09 07:21:51 [127.0.0.1][-][-][error][yii\base\UnknownPropertyException] yii\base\UnknownPropertyException: Getting unknown property: backend\models\Member::address1 in D:\code\crm2\CRM\normandcrm\service\vendor\yiisoft\yii2\base\Component.php:147
+Stack trace:
+#0 D:\code\crm2\CRM\normandcrm\service\vendor\yiisoft\yii2\db\BaseActiveRecord.php(285): yii\base\Component->__get('address1')
+#1 D:\code\crm2\CRM\normandcrm\service\vendor\yiisoft\yii2\validators\Validator.php(263): yii\db\BaseActiveRecord->__get('address1')
+#2 D:\code\crm2\CRM\normandcrm\service\vendor\yiisoft\yii2\base\Model.php(358): yii\validators\Validator->validateAttributes(Object(backend\models\Member), Array)
+#3 D:\code\crm2\CRM\normandcrm\service\vendor\yiisoft\yii2\db\ActiveRecord.php(564): yii\base\Model->validate(Array)
+#4 D:\code\crm2\CRM\normandcrm\service\vendor\yiisoft\yii2\db\BaseActiveRecord.php(645): yii\db\ActiveRecord->update(true, NULL)
+#5 D:\code\crm2\CRM\normandcrm\service\backend\controllers\LoginController.php(67): yii\db\BaseActiveRecord->save()
+#6 D:\code\crm2\CRM\normandcrm\service\backend\controllers\LoginController.php(28): backend\controllers\LoginController->checkLoginInfo('admin', '123456', '99', '127.0.0.1')
+#7 [internal function]: backend\controllers\LoginController->actionLoginPost()
+#8 D:\code\crm2\CRM\normandcrm\service\vendor\yiisoft\yii2\base\InlineAction.php(57): call_user_func_array(Array, Array)
+#9 D:\code\crm2\CRM\normandcrm\service\vendor\yiisoft\yii2\base\Controller.php(156): yii\base\InlineAction->runWithParams(Array)
+#10 D:\code\crm2\CRM\normandcrm\service\vendor\yiisoft\yii2\base\Module.php(523): yii\base\Controller->runAction('login-post', Array)
+#11 D:\code\crm2\CRM\normandcrm\service\vendor\yiisoft\yii2\web\Application.php(102): yii\base\Module->runAction('login/login-pos...', Array)
+#12 D:\code\crm2\CRM\normandcrm\service\vendor\yiisoft\yii2\base\Application.php(380): yii\web\Application->handleRequest(Object(yii\web\Request))
+#13 D:\code\crm2\CRM\normandcrm\service\backend\web\index.php(17): yii\base\Application->run()
+#14 {main}
+2020-01-09 07:21:50 [127.0.0.1][-][-][info][application] $_POST = [
+    'ip' => '127.0.0.1'
+    'password' => '123456'
+    'type' => '99'
+    'username' => 'admin'
+    'token' => '6bf46044553c27e3122b7893c6d5b3ba'
+]
+
+$_SERVER = [
+    'PATH' => 'C:\\WINDOWS\\system32;C:\\WINDOWS;C:\\WINDOWS\\System32\\Wbem;C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\;D:\\Program Files\\TortoiseGit\\bin;D:\\phpStudy\\php\\php-5.6.27-nts;D:\\Program Files\\Java\\jdk1.8.0_131\\bin;D:\\Program Files\\Tomcat9\\lib;C:\\Program Files (x86)\\Windows Kits\\10\\Windows Performance Toolkit\\;C:\\WINDOWS\\System32\\OpenSSH\\;D:\\PHPstudy\\PHPTutorial\\php\\php-7.1.13-nts;D:\\ComposerSetup;D:\\Program Files\\Git\\cmd;C:\\Program Files\\Microsoft\\Web Platform Installer\\;C:\\ProgramData\\chocolatey\\bin;D:\\node.js\\;D:\\Program Files\\Redis\\;\"D:\\Program Files\\Java\\jdk-13.0.1\\bin;D:\\Program Files\\Java\\jdk-13.0.1\\jre\\bin;\";\";C:\\Program Files\\Java\\jre1.8.0_131\\bin\";C:\\ProgramData\\ComposerSetup\\bin;C:\\Users\\titan\\AppData\\Local\\Microsoft\\WindowsApps;C:\\Users\\titan\\AppData\\Roaming\\Composer\\vendor\\bin;C:\\Users\\titan\\AppData\\Local\\Programs\\Microsoft VS Code\\bin;C:\\Users\\titan\\AppData\\Local\\Programs\\Python\\Python37;D:\\pycharm\\PyCharm 2019.1.3\\bin;C:\\Users\\titan\\AppData\\Local\\Programs\\Python\\Python37\\Scripts;C:\\Users\\titan\\AppData\\Roaming\\npm'
+    'SYSTEMROOT' => 'C:\\WINDOWS'
+    'COMSPEC' => 'C:\\WINDOWS\\system32\\cmd.exe'
+    'PATHEXT' => '.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC'
+    'WINDIR' => 'C:\\WINDOWS'
+    'PHP_FCGI_MAX_REQUESTS' => '1000'
+    'PHPRC' => 'D:/PHPstudy/PHPTutorial/php/php-7.1.13-nts/'
+    '_FCGI_SHUTDOWN_EVENT_' => '2376'
+    'SCRIPT_NAME' => '/index.php'
+    'REQUEST_URI' => '/login/login-post'
+    'QUERY_STRING' => ''
+    'REQUEST_METHOD' => 'POST'
+    'SERVER_PROTOCOL' => 'HTTP/1.0'
+    'GATEWAY_INTERFACE' => 'CGI/1.1'
+    'REDIRECT_URL' => '/login/login-post'
+    'REMOTE_PORT' => '64292'
+    'SCRIPT_FILENAME' => 'D:/code/crm2/CRM/normandcrm/service/backend/web/index.php'
+    'SERVER_ADMIN' => 'admin@php.cn'
+    'CONTEXT_DOCUMENT_ROOT' => 'D:/code/crm2/CRM/normandcrm/service/backend/web'
+    'CONTEXT_PREFIX' => ''
+    'REQUEST_SCHEME' => 'http'
+    'DOCUMENT_ROOT' => 'D:/code/crm2/CRM/normandcrm/service/backend/web'
+    'REMOTE_ADDR' => '127.0.0.1'
+    'SERVER_PORT' => '80'
+    'SERVER_ADDR' => '127.0.0.1'
+    'SERVER_NAME' => 'crm.service.com'
+    'SERVER_SOFTWARE' => 'Apache/2.4.23 (Win32) OpenSSL/1.0.2j mod_fcgid/2.3.9'
+    'SERVER_SIGNATURE' => ''
+    'SystemRoot' => 'C:\\WINDOWS'
+    'CONTENT_TYPE' => 'application/x-www-form-urlencoded; charset=UTF-8'
+    'CONTENT_LENGTH' => '90'
+    'HTTP_CONNECTION' => 'close'
+    'HTTP_HOST' => 'crm.service.com'
+    'REDIRECT_STATUS' => '200'
+    'FCGI_ROLE' => 'RESPONDER'
+    'PHP_SELF' => '/index.php'
+    'REQUEST_TIME_FLOAT' => 1578554510.8568
+    'REQUEST_TIME' => 1578554510
+]
+2020-01-09 07:22:35 [127.0.0.1][-][-][error][yii\base\UnknownPropertyException] yii\base\UnknownPropertyException: Getting unknown property: backend\models\Member::address1 in D:\code\crm2\CRM\normandcrm\service\vendor\yiisoft\yii2\base\Component.php:147
+Stack trace:
+#0 D:\code\crm2\CRM\normandcrm\service\vendor\yiisoft\yii2\db\BaseActiveRecord.php(285): yii\base\Component->__get('address1')
+#1 D:\code\crm2\CRM\normandcrm\service\vendor\yiisoft\yii2\validators\Validator.php(263): yii\db\BaseActiveRecord->__get('address1')
+#2 D:\code\crm2\CRM\normandcrm\service\vendor\yiisoft\yii2\base\Model.php(358): yii\validators\Validator->validateAttributes(Object(backend\models\Member), Array)
+#3 D:\code\crm2\CRM\normandcrm\service\vendor\yiisoft\yii2\db\ActiveRecord.php(564): yii\base\Model->validate(Array)
+#4 D:\code\crm2\CRM\normandcrm\service\vendor\yiisoft\yii2\db\BaseActiveRecord.php(645): yii\db\ActiveRecord->update(true, NULL)
+#5 D:\code\crm2\CRM\normandcrm\service\backend\controllers\LoginController.php(67): yii\db\BaseActiveRecord->save()
+#6 D:\code\crm2\CRM\normandcrm\service\backend\controllers\LoginController.php(28): backend\controllers\LoginController->checkLoginInfo('admin', '123456', '99', '127.0.0.1')
+#7 [internal function]: backend\controllers\LoginController->actionLoginPost()
+#8 D:\code\crm2\CRM\normandcrm\service\vendor\yiisoft\yii2\base\InlineAction.php(57): call_user_func_array(Array, Array)
+#9 D:\code\crm2\CRM\normandcrm\service\vendor\yiisoft\yii2\base\Controller.php(156): yii\base\InlineAction->runWithParams(Array)
+#10 D:\code\crm2\CRM\normandcrm\service\vendor\yiisoft\yii2\base\Module.php(523): yii\base\Controller->runAction('login-post', Array)
+#11 D:\code\crm2\CRM\normandcrm\service\vendor\yiisoft\yii2\web\Application.php(102): yii\base\Module->runAction('login/login-pos...', Array)
+#12 D:\code\crm2\CRM\normandcrm\service\vendor\yiisoft\yii2\base\Application.php(380): yii\web\Application->handleRequest(Object(yii\web\Request))
+#13 D:\code\crm2\CRM\normandcrm\service\backend\web\index.php(17): yii\base\Application->run()
+#14 {main}
+2020-01-09 07:22:35 [127.0.0.1][-][-][info][application] $_POST = [
+    'ip' => '127.0.0.1'
+    'password' => '123456'
+    'type' => '99'
+    'username' => 'admin'
+    'token' => '6bf46044553c27e3122b7893c6d5b3ba'
+]
+
+$_SERVER = [
+    'PATH' => 'C:\\WINDOWS\\system32;C:\\WINDOWS;C:\\WINDOWS\\System32\\Wbem;C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\;D:\\Program Files\\TortoiseGit\\bin;D:\\phpStudy\\php\\php-5.6.27-nts;D:\\Program Files\\Java\\jdk1.8.0_131\\bin;D:\\Program Files\\Tomcat9\\lib;C:\\Program Files (x86)\\Windows Kits\\10\\Windows Performance Toolkit\\;C:\\WINDOWS\\System32\\OpenSSH\\;D:\\PHPstudy\\PHPTutorial\\php\\php-7.1.13-nts;D:\\ComposerSetup;D:\\Program Files\\Git\\cmd;C:\\Program Files\\Microsoft\\Web Platform Installer\\;C:\\ProgramData\\chocolatey\\bin;D:\\node.js\\;D:\\Program Files\\Redis\\;\"D:\\Program Files\\Java\\jdk-13.0.1\\bin;D:\\Program Files\\Java\\jdk-13.0.1\\jre\\bin;\";\";C:\\Program Files\\Java\\jre1.8.0_131\\bin\";C:\\ProgramData\\ComposerSetup\\bin;C:\\Users\\titan\\AppData\\Local\\Microsoft\\WindowsApps;C:\\Users\\titan\\AppData\\Roaming\\Composer\\vendor\\bin;C:\\Users\\titan\\AppData\\Local\\Programs\\Microsoft VS Code\\bin;C:\\Users\\titan\\AppData\\Local\\Programs\\Python\\Python37;D:\\pycharm\\PyCharm 2019.1.3\\bin;C:\\Users\\titan\\AppData\\Local\\Programs\\Python\\Python37\\Scripts;C:\\Users\\titan\\AppData\\Roaming\\npm'
+    'SYSTEMROOT' => 'C:\\WINDOWS'
+    'COMSPEC' => 'C:\\WINDOWS\\system32\\cmd.exe'
+    'PATHEXT' => '.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC'
+    'WINDIR' => 'C:\\WINDOWS'
+    'PHP_FCGI_MAX_REQUESTS' => '1000'
+    'PHPRC' => 'D:/PHPstudy/PHPTutorial/php/php-7.1.13-nts/'
+    '_FCGI_SHUTDOWN_EVENT_' => '2376'
+    'SCRIPT_NAME' => '/index.php'
+    'REQUEST_URI' => '/login/login-post'
+    'QUERY_STRING' => ''
+    'REQUEST_METHOD' => 'POST'
+    'SERVER_PROTOCOL' => 'HTTP/1.0'
+    'GATEWAY_INTERFACE' => 'CGI/1.1'
+    'REDIRECT_URL' => '/login/login-post'
+    'REMOTE_PORT' => '64338'
+    'SCRIPT_FILENAME' => 'D:/code/crm2/CRM/normandcrm/service/backend/web/index.php'
+    'SERVER_ADMIN' => 'admin@php.cn'
+    'CONTEXT_DOCUMENT_ROOT' => 'D:/code/crm2/CRM/normandcrm/service/backend/web'
+    'CONTEXT_PREFIX' => ''
+    'REQUEST_SCHEME' => 'http'
+    'DOCUMENT_ROOT' => 'D:/code/crm2/CRM/normandcrm/service/backend/web'
+    'REMOTE_ADDR' => '127.0.0.1'
+    'SERVER_PORT' => '80'
+    'SERVER_ADDR' => '127.0.0.1'
+    'SERVER_NAME' => 'crm.service.com'
+    'SERVER_SOFTWARE' => 'Apache/2.4.23 (Win32) OpenSSL/1.0.2j mod_fcgid/2.3.9'
+    'SERVER_SIGNATURE' => ''
+    'SystemRoot' => 'C:\\WINDOWS'
+    'CONTENT_TYPE' => 'application/x-www-form-urlencoded; charset=UTF-8'
+    'CONTENT_LENGTH' => '90'
+    'HTTP_CONNECTION' => 'close'
+    'HTTP_HOST' => 'crm.service.com'
+    'REDIRECT_STATUS' => '200'
+    'FCGI_ROLE' => 'RESPONDER'
+    'PHP_SELF' => '/index.php'
+    'REQUEST_TIME_FLOAT' => 1578554555.4189
+    'REQUEST_TIME' => 1578554555
+]
+2020-01-09 07:23:50 [127.0.0.1][-][-][error][yii\base\UnknownPropertyException] yii\base\UnknownPropertyException: Getting unknown property: backend\models\Member::address1 in D:\code\crm2\CRM\normandcrm\service\vendor\yiisoft\yii2\base\Component.php:147
+Stack trace:
+#0 D:\code\crm2\CRM\normandcrm\service\vendor\yiisoft\yii2\db\BaseActiveRecord.php(285): yii\base\Component->__get('address1')
+#1 D:\code\crm2\CRM\normandcrm\service\vendor\yiisoft\yii2\validators\Validator.php(263): yii\db\BaseActiveRecord->__get('address1')
+#2 D:\code\crm2\CRM\normandcrm\service\vendor\yiisoft\yii2\base\Model.php(358): yii\validators\Validator->validateAttributes(Object(backend\models\Member), Array)
+#3 D:\code\crm2\CRM\normandcrm\service\vendor\yiisoft\yii2\db\ActiveRecord.php(564): yii\base\Model->validate(Array)
+#4 D:\code\crm2\CRM\normandcrm\service\vendor\yiisoft\yii2\db\BaseActiveRecord.php(645): yii\db\ActiveRecord->update(true, NULL)
+#5 D:\code\crm2\CRM\normandcrm\service\backend\controllers\LoginController.php(67): yii\db\BaseActiveRecord->save()
+#6 D:\code\crm2\CRM\normandcrm\service\backend\controllers\LoginController.php(28): backend\controllers\LoginController->checkLoginInfo('admin', '123456', '99', '127.0.0.1')
+#7 [internal function]: backend\controllers\LoginController->actionLoginPost()
+#8 D:\code\crm2\CRM\normandcrm\service\vendor\yiisoft\yii2\base\InlineAction.php(57): call_user_func_array(Array, Array)
+#9 D:\code\crm2\CRM\normandcrm\service\vendor\yiisoft\yii2\base\Controller.php(156): yii\base\InlineAction->runWithParams(Array)
+#10 D:\code\crm2\CRM\normandcrm\service\vendor\yiisoft\yii2\base\Module.php(523): yii\base\Controller->runAction('login-post', Array)
+#11 D:\code\crm2\CRM\normandcrm\service\vendor\yiisoft\yii2\web\Application.php(102): yii\base\Module->runAction('login/login-pos...', Array)
+#12 D:\code\crm2\CRM\normandcrm\service\vendor\yiisoft\yii2\base\Application.php(380): yii\web\Application->handleRequest(Object(yii\web\Request))
+#13 D:\code\crm2\CRM\normandcrm\service\backend\web\index.php(17): yii\base\Application->run()
+#14 {main}
+2020-01-09 07:23:50 [127.0.0.1][-][-][info][application] $_POST = [
+    'ip' => '127.0.0.1'
+    'password' => '123456'
+    'type' => '99'
+    'username' => 'admin'
+    'token' => '6bf46044553c27e3122b7893c6d5b3ba'
+]
+
+$_SERVER = [
+    'PATH' => 'C:\\WINDOWS\\system32;C:\\WINDOWS;C:\\WINDOWS\\System32\\Wbem;C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\;D:\\Program Files\\TortoiseGit\\bin;D:\\phpStudy\\php\\php-5.6.27-nts;D:\\Program Files\\Java\\jdk1.8.0_131\\bin;D:\\Program Files\\Tomcat9\\lib;C:\\Program Files (x86)\\Windows Kits\\10\\Windows Performance Toolkit\\;C:\\WINDOWS\\System32\\OpenSSH\\;D:\\PHPstudy\\PHPTutorial\\php\\php-7.1.13-nts;D:\\ComposerSetup;D:\\Program Files\\Git\\cmd;C:\\Program Files\\Microsoft\\Web Platform Installer\\;C:\\ProgramData\\chocolatey\\bin;D:\\node.js\\;D:\\Program Files\\Redis\\;\"D:\\Program Files\\Java\\jdk-13.0.1\\bin;D:\\Program Files\\Java\\jdk-13.0.1\\jre\\bin;\";\";C:\\Program Files\\Java\\jre1.8.0_131\\bin\";C:\\ProgramData\\ComposerSetup\\bin;C:\\Users\\titan\\AppData\\Local\\Microsoft\\WindowsApps;C:\\Users\\titan\\AppData\\Roaming\\Composer\\vendor\\bin;C:\\Users\\titan\\AppData\\Local\\Programs\\Microsoft VS Code\\bin;C:\\Users\\titan\\AppData\\Local\\Programs\\Python\\Python37;D:\\pycharm\\PyCharm 2019.1.3\\bin;C:\\Users\\titan\\AppData\\Local\\Programs\\Python\\Python37\\Scripts;C:\\Users\\titan\\AppData\\Roaming\\npm'
+    'SYSTEMROOT' => 'C:\\WINDOWS'
+    'COMSPEC' => 'C:\\WINDOWS\\system32\\cmd.exe'
+    'PATHEXT' => '.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC'
+    'WINDIR' => 'C:\\WINDOWS'
+    'PHP_FCGI_MAX_REQUESTS' => '1000'
+    'PHPRC' => 'D:/PHPstudy/PHPTutorial/php/php-7.1.13-nts/'
+    '_FCGI_SHUTDOWN_EVENT_' => '2376'
+    'SCRIPT_NAME' => '/index.php'
+    'REQUEST_URI' => '/login/login-post'
+    'QUERY_STRING' => ''
+    'REQUEST_METHOD' => 'POST'
+    'SERVER_PROTOCOL' => 'HTTP/1.0'
+    'GATEWAY_INTERFACE' => 'CGI/1.1'
+    'REDIRECT_URL' => '/login/login-post'
+    'REMOTE_PORT' => '64418'
+    'SCRIPT_FILENAME' => 'D:/code/crm2/CRM/normandcrm/service/backend/web/index.php'
+    'SERVER_ADMIN' => 'admin@php.cn'
+    'CONTEXT_DOCUMENT_ROOT' => 'D:/code/crm2/CRM/normandcrm/service/backend/web'
+    'CONTEXT_PREFIX' => ''
+    'REQUEST_SCHEME' => 'http'
+    'DOCUMENT_ROOT' => 'D:/code/crm2/CRM/normandcrm/service/backend/web'
+    'REMOTE_ADDR' => '127.0.0.1'
+    'SERVER_PORT' => '80'
+    'SERVER_ADDR' => '127.0.0.1'
+    'SERVER_NAME' => 'crm.service.com'
+    'SERVER_SOFTWARE' => 'Apache/2.4.23 (Win32) OpenSSL/1.0.2j mod_fcgid/2.3.9'
+    'SERVER_SIGNATURE' => ''
+    'SystemRoot' => 'C:\\WINDOWS'
+    'CONTENT_TYPE' => 'application/x-www-form-urlencoded; charset=UTF-8'
+    'CONTENT_LENGTH' => '90'
+    'HTTP_CONNECTION' => 'close'
+    'HTTP_HOST' => 'crm.service.com'
+    'REDIRECT_STATUS' => '200'
+    'FCGI_ROLE' => 'RESPONDER'
+    'PHP_SELF' => '/index.php'
+    'REQUEST_TIME_FLOAT' => 1578554630.6853
+    'REQUEST_TIME' => 1578554630
+]
+2020-01-09 07:25:23 [127.0.0.1][-][-][error][yii\base\UnknownPropertyException] yii\base\UnknownPropertyException: Getting unknown property: backend\models\Member::address1 in D:\code\crm2\CRM\normandcrm\service\vendor\yiisoft\yii2\base\Component.php:147
+Stack trace:
+#0 D:\code\crm2\CRM\normandcrm\service\vendor\yiisoft\yii2\db\BaseActiveRecord.php(285): yii\base\Component->__get('address1')
+#1 D:\code\crm2\CRM\normandcrm\service\vendor\yiisoft\yii2\validators\Validator.php(263): yii\db\BaseActiveRecord->__get('address1')
+#2 D:\code\crm2\CRM\normandcrm\service\vendor\yiisoft\yii2\base\Model.php(358): yii\validators\Validator->validateAttributes(Object(backend\models\Member), Array)
+#3 D:\code\crm2\CRM\normandcrm\service\vendor\yiisoft\yii2\db\ActiveRecord.php(564): yii\base\Model->validate(Array)
+#4 D:\code\crm2\CRM\normandcrm\service\vendor\yiisoft\yii2\db\BaseActiveRecord.php(645): yii\db\ActiveRecord->update(true, NULL)
+#5 D:\code\crm2\CRM\normandcrm\service\backend\controllers\LoginController.php(67): yii\db\BaseActiveRecord->save()
+#6 D:\code\crm2\CRM\normandcrm\service\backend\controllers\LoginController.php(28): backend\controllers\LoginController->checkLoginInfo('admin', '123456', '99', '127.0.0.1')
+#7 [internal function]: backend\controllers\LoginController->actionLoginPost()
+#8 D:\code\crm2\CRM\normandcrm\service\vendor\yiisoft\yii2\base\InlineAction.php(57): call_user_func_array(Array, Array)
+#9 D:\code\crm2\CRM\normandcrm\service\vendor\yiisoft\yii2\base\Controller.php(156): yii\base\InlineAction->runWithParams(Array)
+#10 D:\code\crm2\CRM\normandcrm\service\vendor\yiisoft\yii2\base\Module.php(523): yii\base\Controller->runAction('login-post', Array)
+#11 D:\code\crm2\CRM\normandcrm\service\vendor\yiisoft\yii2\web\Application.php(102): yii\base\Module->runAction('login/login-pos...', Array)
+#12 D:\code\crm2\CRM\normandcrm\service\vendor\yiisoft\yii2\base\Application.php(380): yii\web\Application->handleRequest(Object(yii\web\Request))
+#13 D:\code\crm2\CRM\normandcrm\service\backend\web\index.php(17): yii\base\Application->run()
+#14 {main}
+2020-01-09 07:25:22 [127.0.0.1][-][-][info][application] $_POST = [
+    'ip' => '127.0.0.1'
+    'password' => '123456'
+    'type' => '99'
+    'username' => 'admin'
+    'token' => '6bf46044553c27e3122b7893c6d5b3ba'
+]
+
+$_SERVER = [
+    'PATH' => 'C:\\WINDOWS\\system32;C:\\WINDOWS;C:\\WINDOWS\\System32\\Wbem;C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\;D:\\Program Files\\TortoiseGit\\bin;D:\\phpStudy\\php\\php-5.6.27-nts;D:\\Program Files\\Java\\jdk1.8.0_131\\bin;D:\\Program Files\\Tomcat9\\lib;C:\\Program Files (x86)\\Windows Kits\\10\\Windows Performance Toolkit\\;C:\\WINDOWS\\System32\\OpenSSH\\;D:\\PHPstudy\\PHPTutorial\\php\\php-7.1.13-nts;D:\\ComposerSetup;D:\\Program Files\\Git\\cmd;C:\\Program Files\\Microsoft\\Web Platform Installer\\;C:\\ProgramData\\chocolatey\\bin;D:\\node.js\\;D:\\Program Files\\Redis\\;\"D:\\Program Files\\Java\\jdk-13.0.1\\bin;D:\\Program Files\\Java\\jdk-13.0.1\\jre\\bin;\";\";C:\\Program Files\\Java\\jre1.8.0_131\\bin\";C:\\ProgramData\\ComposerSetup\\bin;C:\\Users\\titan\\AppData\\Local\\Microsoft\\WindowsApps;C:\\Users\\titan\\AppData\\Roaming\\Composer\\vendor\\bin;C:\\Users\\titan\\AppData\\Local\\Programs\\Microsoft VS Code\\bin;C:\\Users\\titan\\AppData\\Local\\Programs\\Python\\Python37;D:\\pycharm\\PyCharm 2019.1.3\\bin;C:\\Users\\titan\\AppData\\Local\\Programs\\Python\\Python37\\Scripts;C:\\Users\\titan\\AppData\\Roaming\\npm'
+    'SYSTEMROOT' => 'C:\\WINDOWS'
+    'COMSPEC' => 'C:\\WINDOWS\\system32\\cmd.exe'
+    'PATHEXT' => '.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC'
+    'WINDIR' => 'C:\\WINDOWS'
+    'PHP_FCGI_MAX_REQUESTS' => '1000'
+    'PHPRC' => 'D:/PHPstudy/PHPTutorial/php/php-7.1.13-nts/'
+    '_FCGI_SHUTDOWN_EVENT_' => '2376'
+    'SCRIPT_NAME' => '/index.php'
+    'REQUEST_URI' => '/login/login-post'
+    'QUERY_STRING' => ''
+    'REQUEST_METHOD' => 'POST'
+    'SERVER_PROTOCOL' => 'HTTP/1.0'
+    'GATEWAY_INTERFACE' => 'CGI/1.1'
+    'REDIRECT_URL' => '/login/login-post'
+    'REMOTE_PORT' => '64507'
+    'SCRIPT_FILENAME' => 'D:/code/crm2/CRM/normandcrm/service/backend/web/index.php'
+    'SERVER_ADMIN' => 'admin@php.cn'
+    'CONTEXT_DOCUMENT_ROOT' => 'D:/code/crm2/CRM/normandcrm/service/backend/web'
+    'CONTEXT_PREFIX' => ''
+    'REQUEST_SCHEME' => 'http'
+    'DOCUMENT_ROOT' => 'D:/code/crm2/CRM/normandcrm/service/backend/web'
+    'REMOTE_ADDR' => '127.0.0.1'
+    'SERVER_PORT' => '80'
+    'SERVER_ADDR' => '127.0.0.1'
+    'SERVER_NAME' => 'crm.service.com'
+    'SERVER_SOFTWARE' => 'Apache/2.4.23 (Win32) OpenSSL/1.0.2j mod_fcgid/2.3.9'
+    'SERVER_SIGNATURE' => ''
+    'SystemRoot' => 'C:\\WINDOWS'
+    'CONTENT_TYPE' => 'application/x-www-form-urlencoded; charset=UTF-8'
+    'CONTENT_LENGTH' => '90'
+    'HTTP_CONNECTION' => 'close'
+    'HTTP_HOST' => 'crm.service.com'
+    'REDIRECT_STATUS' => '200'
+    'FCGI_ROLE' => 'RESPONDER'
+    'PHP_SELF' => '/index.php'
+    'REQUEST_TIME_FLOAT' => 1578554722.9088
+    'REQUEST_TIME' => 1578554722
+]
+2020-01-09 07:25:31 [127.0.0.1][-][-][error][yii\base\UnknownPropertyException] yii\base\UnknownPropertyException: Getting unknown property: backend\models\Member::address1 in D:\code\crm2\CRM\normandcrm\service\vendor\yiisoft\yii2\base\Component.php:147
+Stack trace:
+#0 D:\code\crm2\CRM\normandcrm\service\vendor\yiisoft\yii2\db\BaseActiveRecord.php(285): yii\base\Component->__get('address1')
+#1 D:\code\crm2\CRM\normandcrm\service\vendor\yiisoft\yii2\validators\Validator.php(263): yii\db\BaseActiveRecord->__get('address1')
+#2 D:\code\crm2\CRM\normandcrm\service\vendor\yiisoft\yii2\base\Model.php(358): yii\validators\Validator->validateAttributes(Object(backend\models\Member), Array)
+#3 D:\code\crm2\CRM\normandcrm\service\vendor\yiisoft\yii2\db\ActiveRecord.php(564): yii\base\Model->validate(Array)
+#4 D:\code\crm2\CRM\normandcrm\service\vendor\yiisoft\yii2\db\BaseActiveRecord.php(645): yii\db\ActiveRecord->update(true, NULL)
+#5 D:\code\crm2\CRM\normandcrm\service\backend\controllers\LoginController.php(67): yii\db\BaseActiveRecord->save()
+#6 D:\code\crm2\CRM\normandcrm\service\backend\controllers\LoginController.php(28): backend\controllers\LoginController->checkLoginInfo('admin', '123456', '99', '127.0.0.1')
+#7 [internal function]: backend\controllers\LoginController->actionLoginPost()
+#8 D:\code\crm2\CRM\normandcrm\service\vendor\yiisoft\yii2\base\InlineAction.php(57): call_user_func_array(Array, Array)
+#9 D:\code\crm2\CRM\normandcrm\service\vendor\yiisoft\yii2\base\Controller.php(156): yii\base\InlineAction->runWithParams(Array)
+#10 D:\code\crm2\CRM\normandcrm\service\vendor\yiisoft\yii2\base\Module.php(523): yii\base\Controller->runAction('login-post', Array)
+#11 D:\code\crm2\CRM\normandcrm\service\vendor\yiisoft\yii2\web\Application.php(102): yii\base\Module->runAction('login/login-pos...', Array)
+#12 D:\code\crm2\CRM\normandcrm\service\vendor\yiisoft\yii2\base\Application.php(380): yii\web\Application->handleRequest(Object(yii\web\Request))
+#13 D:\code\crm2\CRM\normandcrm\service\backend\web\index.php(17): yii\base\Application->run()
+#14 {main}
+2020-01-09 07:25:31 [127.0.0.1][-][-][info][application] $_POST = [
+    'ip' => '127.0.0.1'
+    'password' => '123456'
+    'type' => '99'
+    'username' => 'admin'
+    'token' => '6bf46044553c27e3122b7893c6d5b3ba'
+]
+
+$_SERVER = [
+    'PATH' => 'C:\\WINDOWS\\system32;C:\\WINDOWS;C:\\WINDOWS\\System32\\Wbem;C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\;D:\\Program Files\\TortoiseGit\\bin;D:\\phpStudy\\php\\php-5.6.27-nts;D:\\Program Files\\Java\\jdk1.8.0_131\\bin;D:\\Program Files\\Tomcat9\\lib;C:\\Program Files (x86)\\Windows Kits\\10\\Windows Performance Toolkit\\;C:\\WINDOWS\\System32\\OpenSSH\\;D:\\PHPstudy\\PHPTutorial\\php\\php-7.1.13-nts;D:\\ComposerSetup;D:\\Program Files\\Git\\cmd;C:\\Program Files\\Microsoft\\Web Platform Installer\\;C:\\ProgramData\\chocolatey\\bin;D:\\node.js\\;D:\\Program Files\\Redis\\;\"D:\\Program Files\\Java\\jdk-13.0.1\\bin;D:\\Program Files\\Java\\jdk-13.0.1\\jre\\bin;\";\";C:\\Program Files\\Java\\jre1.8.0_131\\bin\";C:\\ProgramData\\ComposerSetup\\bin;C:\\Users\\titan\\AppData\\Local\\Microsoft\\WindowsApps;C:\\Users\\titan\\AppData\\Roaming\\Composer\\vendor\\bin;C:\\Users\\titan\\AppData\\Local\\Programs\\Microsoft VS Code\\bin;C:\\Users\\titan\\AppData\\Local\\Programs\\Python\\Python37;D:\\pycharm\\PyCharm 2019.1.3\\bin;C:\\Users\\titan\\AppData\\Local\\Programs\\Python\\Python37\\Scripts;C:\\Users\\titan\\AppData\\Roaming\\npm'
+    'SYSTEMROOT' => 'C:\\WINDOWS'
+    'COMSPEC' => 'C:\\WINDOWS\\system32\\cmd.exe'
+    'PATHEXT' => '.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC'
+    'WINDIR' => 'C:\\WINDOWS'
+    'PHP_FCGI_MAX_REQUESTS' => '1000'
+    'PHPRC' => 'D:/PHPstudy/PHPTutorial/php/php-7.1.13-nts/'
+    '_FCGI_SHUTDOWN_EVENT_' => '2376'
+    'SCRIPT_NAME' => '/index.php'
+    'REQUEST_URI' => '/login/login-post'
+    'QUERY_STRING' => ''
+    'REQUEST_METHOD' => 'POST'
+    'SERVER_PROTOCOL' => 'HTTP/1.0'
+    'GATEWAY_INTERFACE' => 'CGI/1.1'
+    'REDIRECT_URL' => '/login/login-post'
+    'REMOTE_PORT' => '64518'
+    'SCRIPT_FILENAME' => 'D:/code/crm2/CRM/normandcrm/service/backend/web/index.php'
+    'SERVER_ADMIN' => 'admin@php.cn'
+    'CONTEXT_DOCUMENT_ROOT' => 'D:/code/crm2/CRM/normandcrm/service/backend/web'
+    'CONTEXT_PREFIX' => ''
+    'REQUEST_SCHEME' => 'http'
+    'DOCUMENT_ROOT' => 'D:/code/crm2/CRM/normandcrm/service/backend/web'
+    'REMOTE_ADDR' => '127.0.0.1'
+    'SERVER_PORT' => '80'
+    'SERVER_ADDR' => '127.0.0.1'
+    'SERVER_NAME' => 'crm.service.com'
+    'SERVER_SOFTWARE' => 'Apache/2.4.23 (Win32) OpenSSL/1.0.2j mod_fcgid/2.3.9'
+    'SERVER_SIGNATURE' => ''
+    'SystemRoot' => 'C:\\WINDOWS'
+    'CONTENT_TYPE' => 'application/x-www-form-urlencoded; charset=UTF-8'
+    'CONTENT_LENGTH' => '90'
+    'HTTP_CONNECTION' => 'close'
+    'HTTP_HOST' => 'crm.service.com'
+    'REDIRECT_STATUS' => '200'
+    'FCGI_ROLE' => 'RESPONDER'
+    'PHP_SELF' => '/index.php'
+    'REQUEST_TIME_FLOAT' => 1578554731.8415
+    'REQUEST_TIME' => 1578554731
+]
+2020-01-09 07:52:40 [127.0.0.1][-][-][error][yii\web\HttpException:404] yii\base\InvalidRouteException: Unable to resolve the request "adminL0gin3721". in D:\code\crm2\CRM\normandcrm\service\vendor\yiisoft\yii2\base\Module.php:532
+Stack trace:
+#0 D:\code\crm2\CRM\normandcrm\service\vendor\yiisoft\yii2\web\Application.php(102): yii\base\Module->runAction('adminL0gin3721', Array)
+#1 D:\code\crm2\CRM\normandcrm\service\vendor\yiisoft\yii2\base\Application.php(380): yii\web\Application->handleRequest(Object(yii\web\Request))
+#2 D:\code\crm2\CRM\normandcrm\service\backend\web\index.php(17): yii\base\Application->run()
+#3 {main}
+
+Next yii\web\NotFoundHttpException: 页�未找到。 in D:\code\crm2\CRM\normandcrm\service\vendor\yiisoft\yii2\web\Application.php:114
+Stack trace:
+#0 D:\code\crm2\CRM\normandcrm\service\vendor\yiisoft\yii2\base\Application.php(380): yii\web\Application->handleRequest(Object(yii\web\Request))
+#1 D:\code\crm2\CRM\normandcrm\service\backend\web\index.php(17): yii\base\Application->run()
+#2 {main}
+2020-01-09 07:52:40 [127.0.0.1][-][-][info][application] $_COOKIE = [
+    '_csrf-backend' => '8289e80c00bc4a4ff88a198abfc1f015ea79bb75dbaa53c844d2b8893ed892d1a:2:{i:0;s:13:\"_csrf-backend\";i:1;s:32:\"Lé‘-e\0µGlüØô)˜ì‡dxWᶆ´ïÃÜ\";}'
+    'advanced-backend' => '8l35ukkg30tfifdfqpbmasc2kq'
+]
+
+$_SERVER = [
+    'PATH' => 'C:\\WINDOWS\\system32;C:\\WINDOWS;C:\\WINDOWS\\System32\\Wbem;C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\;D:\\Program Files\\TortoiseGit\\bin;D:\\phpStudy\\php\\php-5.6.27-nts;D:\\Program Files\\Java\\jdk1.8.0_131\\bin;D:\\Program Files\\Tomcat9\\lib;C:\\Program Files (x86)\\Windows Kits\\10\\Windows Performance Toolkit\\;C:\\WINDOWS\\System32\\OpenSSH\\;D:\\PHPstudy\\PHPTutorial\\php\\php-7.1.13-nts;D:\\ComposerSetup;D:\\Program Files\\Git\\cmd;C:\\Program Files\\Microsoft\\Web Platform Installer\\;C:\\ProgramData\\chocolatey\\bin;D:\\node.js\\;D:\\Program Files\\Redis\\;\"D:\\Program Files\\Java\\jdk-13.0.1\\bin;D:\\Program Files\\Java\\jdk-13.0.1\\jre\\bin;\";\";C:\\Program Files\\Java\\jre1.8.0_131\\bin\";C:\\ProgramData\\ComposerSetup\\bin;C:\\Users\\titan\\AppData\\Local\\Microsoft\\WindowsApps;C:\\Users\\titan\\AppData\\Roaming\\Composer\\vendor\\bin;C:\\Users\\titan\\AppData\\Local\\Programs\\Microsoft VS Code\\bin;C:\\Users\\titan\\AppData\\Local\\Programs\\Python\\Python37;D:\\pycharm\\PyCharm 2019.1.3\\bin;C:\\Users\\titan\\AppData\\Local\\Programs\\Python\\Python37\\Scripts;C:\\Users\\titan\\AppData\\Roaming\\npm'
+    'SYSTEMROOT' => 'C:\\WINDOWS'
+    'COMSPEC' => 'C:\\WINDOWS\\system32\\cmd.exe'
+    'PATHEXT' => '.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC'
+    'WINDIR' => 'C:\\WINDOWS'
+    'PHP_FCGI_MAX_REQUESTS' => '1000'
+    'PHPRC' => 'D:/PHPstudy/PHPTutorial/php/php-7.1.13-nts/'
+    '_FCGI_SHUTDOWN_EVENT_' => '2244'
+    'SCRIPT_NAME' => '/index.php'
+    'REQUEST_URI' => '/adminL0gin3721'
+    'QUERY_STRING' => ''
+    'REQUEST_METHOD' => 'GET'
+    'SERVER_PROTOCOL' => 'HTTP/1.1'
+    'GATEWAY_INTERFACE' => 'CGI/1.1'
+    'REDIRECT_URL' => '/adminL0gin3721'
+    'REMOTE_PORT' => '50213'
+    'SCRIPT_FILENAME' => 'D:/code/crm2/CRM/normandcrm/service/backend/web/index.php'
+    'SERVER_ADMIN' => 'admin@php.cn'
+    'CONTEXT_DOCUMENT_ROOT' => 'D:/code/crm2/CRM/normandcrm/service/backend/web'
+    'CONTEXT_PREFIX' => ''
+    'REQUEST_SCHEME' => 'http'
+    'DOCUMENT_ROOT' => 'D:/code/crm2/CRM/normandcrm/service/backend/web'
+    'REMOTE_ADDR' => '127.0.0.1'
+    'SERVER_PORT' => '80'
+    'SERVER_ADDR' => '127.0.0.1'
+    'SERVER_NAME' => 'crm.admin.com'
+    'SERVER_SOFTWARE' => 'Apache/2.4.23 (Win32) OpenSSL/1.0.2j mod_fcgid/2.3.9'
+    'SERVER_SIGNATURE' => ''
+    'SystemRoot' => 'C:\\WINDOWS'
+    'HTTP_COOKIE' => '_csrf-backend=8289e80c00bc4a4ff88a198abfc1f015ea79bb75dbaa53c844d2b8893ed892d1a%3A2%3A%7Bi%3A0%3Bs%3A13%3A%22_csrf-backend%22%3Bi%3A1%3Bs%3A32%3A%22L%E9%01%05%91-e%00%B5Gl%FC%D8%F4%29%1C%98%EC%87dx%06W%18%E1%B6%86%B4%EF%C3%1C%DC%22%3B%7D; advanced-backend=8l35ukkg30tfifdfqpbmasc2kq'
+    'HTTP_ACCEPT_LANGUAGE' => 'zh-CN,zh;q=0.9'
+    'HTTP_ACCEPT_ENCODING' => 'gzip, deflate'
+    'HTTP_REFERER' => 'http://crm.admin.com/admin/dashboard'
+    'HTTP_ACCEPT' => 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3'
+    'HTTP_USER_AGENT' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36'
+    'HTTP_UPGRADE_INSECURE_REQUESTS' => '1'
+    'HTTP_CACHE_CONTROL' => 'max-age=0'
+    'HTTP_CONNECTION' => 'close'
+    'HTTP_HOST' => 'crm.admin.com'
+    'REDIRECT_STATUS' => '200'
+    'FCGI_ROLE' => 'RESPONDER'
+    'PHP_SELF' => '/index.php'
+    'REQUEST_TIME_FLOAT' => 1578556360.3017
+    'REQUEST_TIME' => 1578556360
+]
+2020-01-09 07:53:31 [127.0.0.1][-][-][error][yii\web\HttpException:404] yii\base\InvalidRouteException: Unable to resolve the request "adminlogin". in D:\code\crm2\CRM\normandcrm\service\vendor\yiisoft\yii2\base\Module.php:532
+Stack trace:
+#0 D:\code\crm2\CRM\normandcrm\service\vendor\yiisoft\yii2\web\Application.php(102): yii\base\Module->runAction('adminlogin', Array)
+#1 D:\code\crm2\CRM\normandcrm\service\vendor\yiisoft\yii2\base\Application.php(380): yii\web\Application->handleRequest(Object(yii\web\Request))
+#2 D:\code\crm2\CRM\normandcrm\service\backend\web\index.php(17): yii\base\Application->run()
+#3 {main}
+
+Next yii\web\NotFoundHttpException: 页�未找到。 in D:\code\crm2\CRM\normandcrm\service\vendor\yiisoft\yii2\web\Application.php:114
+Stack trace:
+#0 D:\code\crm2\CRM\normandcrm\service\vendor\yiisoft\yii2\base\Application.php(380): yii\web\Application->handleRequest(Object(yii\web\Request))
+#1 D:\code\crm2\CRM\normandcrm\service\backend\web\index.php(17): yii\base\Application->run()
+#2 {main}
+2020-01-09 07:53:31 [127.0.0.1][-][-][info][application] $_COOKIE = [
+    '_csrf-backend' => '8289e80c00bc4a4ff88a198abfc1f015ea79bb75dbaa53c844d2b8893ed892d1a:2:{i:0;s:13:\"_csrf-backend\";i:1;s:32:\"Lé‘-e\0µGlüØô)˜ì‡dxWᶆ´ïÃÜ\";}'
+    'advanced-backend' => '8l35ukkg30tfifdfqpbmasc2kq'
+]
+
+$_SERVER = [
+    'PATH' => 'C:\\WINDOWS\\system32;C:\\WINDOWS;C:\\WINDOWS\\System32\\Wbem;C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\;D:\\Program Files\\TortoiseGit\\bin;D:\\phpStudy\\php\\php-5.6.27-nts;D:\\Program Files\\Java\\jdk1.8.0_131\\bin;D:\\Program Files\\Tomcat9\\lib;C:\\Program Files (x86)\\Windows Kits\\10\\Windows Performance Toolkit\\;C:\\WINDOWS\\System32\\OpenSSH\\;D:\\PHPstudy\\PHPTutorial\\php\\php-7.1.13-nts;D:\\ComposerSetup;D:\\Program Files\\Git\\cmd;C:\\Program Files\\Microsoft\\Web Platform Installer\\;C:\\ProgramData\\chocolatey\\bin;D:\\node.js\\;D:\\Program Files\\Redis\\;\"D:\\Program Files\\Java\\jdk-13.0.1\\bin;D:\\Program Files\\Java\\jdk-13.0.1\\jre\\bin;\";\";C:\\Program Files\\Java\\jre1.8.0_131\\bin\";C:\\ProgramData\\ComposerSetup\\bin;C:\\Users\\titan\\AppData\\Local\\Microsoft\\WindowsApps;C:\\Users\\titan\\AppData\\Roaming\\Composer\\vendor\\bin;C:\\Users\\titan\\AppData\\Local\\Programs\\Microsoft VS Code\\bin;C:\\Users\\titan\\AppData\\Local\\Programs\\Python\\Python37;D:\\pycharm\\PyCharm 2019.1.3\\bin;C:\\Users\\titan\\AppData\\Local\\Programs\\Python\\Python37\\Scripts;C:\\Users\\titan\\AppData\\Roaming\\npm'
+    'SYSTEMROOT' => 'C:\\WINDOWS'
+    'COMSPEC' => 'C:\\WINDOWS\\system32\\cmd.exe'
+    'PATHEXT' => '.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC'
+    'WINDIR' => 'C:\\WINDOWS'
+    'PHP_FCGI_MAX_REQUESTS' => '1000'
+    'PHPRC' => 'D:/PHPstudy/PHPTutorial/php/php-7.1.13-nts/'
+    '_FCGI_SHUTDOWN_EVENT_' => '2244'
+    'SCRIPT_NAME' => '/index.php'
+    'REQUEST_URI' => '/adminlogin'
+    'QUERY_STRING' => ''
+    'REQUEST_METHOD' => 'GET'
+    'SERVER_PROTOCOL' => 'HTTP/1.1'
+    'GATEWAY_INTERFACE' => 'CGI/1.1'
+    'REDIRECT_URL' => '/adminlogin'
+    'REMOTE_PORT' => '50265'
+    'SCRIPT_FILENAME' => 'D:/code/crm2/CRM/normandcrm/service/backend/web/index.php'
+    'SERVER_ADMIN' => 'admin@php.cn'
+    'CONTEXT_DOCUMENT_ROOT' => 'D:/code/crm2/CRM/normandcrm/service/backend/web'
+    'CONTEXT_PREFIX' => ''
+    'REQUEST_SCHEME' => 'http'
+    'DOCUMENT_ROOT' => 'D:/code/crm2/CRM/normandcrm/service/backend/web'
+    'REMOTE_ADDR' => '127.0.0.1'
+    'SERVER_PORT' => '80'
+    'SERVER_ADDR' => '127.0.0.1'
+    'SERVER_NAME' => 'crm.admin.com'
+    'SERVER_SOFTWARE' => 'Apache/2.4.23 (Win32) OpenSSL/1.0.2j mod_fcgid/2.3.9'
+    'SERVER_SIGNATURE' => ''
+    'SystemRoot' => 'C:\\WINDOWS'
+    'HTTP_COOKIE' => '_csrf-backend=8289e80c00bc4a4ff88a198abfc1f015ea79bb75dbaa53c844d2b8893ed892d1a%3A2%3A%7Bi%3A0%3Bs%3A13%3A%22_csrf-backend%22%3Bi%3A1%3Bs%3A32%3A%22L%E9%01%05%91-e%00%B5Gl%FC%D8%F4%29%1C%98%EC%87dx%06W%18%E1%B6%86%B4%EF%C3%1C%DC%22%3B%7D; advanced-backend=8l35ukkg30tfifdfqpbmasc2kq'
+    'HTTP_ACCEPT_LANGUAGE' => 'zh-CN,zh;q=0.9'
+    'HTTP_ACCEPT_ENCODING' => 'gzip, deflate'
+    'HTTP_ACCEPT' => 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3'
+    'HTTP_USER_AGENT' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36'
+    'HTTP_UPGRADE_INSECURE_REQUESTS' => '1'
+    'HTTP_CONNECTION' => 'close'
+    'HTTP_HOST' => 'crm.admin.com'
+    'REDIRECT_STATUS' => '200'
+    'FCGI_ROLE' => 'RESPONDER'
+    'PHP_SELF' => '/index.php'
+    'REQUEST_TIME_FLOAT' => 1578556411.0322
+    'REQUEST_TIME' => 1578556411
+]

+ 28 - 28
normandcrm/service/backend/web/logininfo.txt

@@ -2,57 +2,57 @@ backend\models\Member Object
 (
     [_attributes:yii\db\BaseActiveRecord:private] => Array
         (
-            [id] => 84560
-            [type] => 1
+            [id] => 1
+            [type] => 99
             [is_enable] => 1
-            [username] => 2647872640@qq.com
+            [username] => admin
             [password] => e10adc3949ba59abbe56e057f20f883e
             [ip] => 127.0.0.1
-            [logins] => 601
-            [name] => 金铭
-            [gender] => 0
+            [logins] => 
+            [name] => 管理员
+            [gender] => 
             [id_no] => 
             [birthday] => 
             [address] => 
-            [mobile] => 
-            [main_login] => 601
+            [mobile] => 13800138000
+            [main_login] => 
             [random_code] => 
             [random_code_time] => 
-            [avatar] => 
-            [ref_id] => 6
-            [ref_path] => 70,75,6,
-            [in_time] => 1562243548781
-            [ib_old_login_name] => normandm-01
+            [avatar] => /upload/avatar-2.jpg
+            [ref_id] => 
+            [ref_path] => 
+            [in_time] => 1513848070669
+            [ib_old_login_name] => 
             [group_sn] => 1
-            [is_delete] => 0
+            [is_delete] => 1
             [address1] => 
         )
 
     [_oldAttributes:yii\db\BaseActiveRecord:private] => Array
         (
-            [id] => 84560
-            [type] => 1
+            [id] => 1
+            [type] => 99
             [is_enable] => 1
-            [username] => 2647872640@qq.com
+            [username] => admin
             [password] => e10adc3949ba59abbe56e057f20f883e
             [ip] => 127.0.0.1
-            [logins] => 601
-            [name] => 金铭
-            [gender] => 0
+            [logins] => 
+            [name] => 管理员
+            [gender] => 
             [id_no] => 
             [birthday] => 
             [address] => 
-            [mobile] => 
-            [main_login] => 601
+            [mobile] => 13800138000
+            [main_login] => 
             [random_code] => 
             [random_code_time] => 
-            [avatar] => 
-            [ref_id] => 6
-            [ref_path] => 70,75,6,
-            [in_time] => 1562243548781
-            [ib_old_login_name] => normandm-01
+            [avatar] => /upload/avatar-2.jpg
+            [ref_id] => 
+            [ref_path] => 
+            [in_time] => 1513848070669
+            [ib_old_login_name] => 
             [group_sn] => 1
-            [is_delete] => 0
+            [is_delete] => 1
             [address1] => 
         )
 

+ 2 - 2
normandcrm/service/common/config/db.php

@@ -1,8 +1,8 @@
 <?php
 return [
     'class' => 'yii\db\Connection',
-    'dsn' => 'mysql:host=localhost;dbname=normandmkt_crm',
+    'dsn' => 'mysql:host=localhost;dbname=crm',
     'username' => 'root',
-    'password' => 'Robin1992',
+    'password' => 'root',
     'charset' => 'utf8',
 ];

+ 1 - 0
normandcrm/service/common/config/main-local.php

@@ -3,6 +3,7 @@ return [
     'components' => [
         'db' => require(__DIR__ . '/db.php'),
         'dbXcrm' => require(__DIR__ . '/db.php'),
+		'mt5db' => require (__DIR__.'/mt5db.php'),//mt5数据库
         'redis' => require(__DIR__ . '/redis.php'),
         'mailer' => [
             'class' => 'yii\swiftmailer\Mailer',

+ 17 - 0
normandcrm/service/common/config/mt5db.php

@@ -0,0 +1,17 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: Titan 名字就是密码
+ * Date: 2020/1/2
+ * Time: 17:52
+ */
+/**
+ * mt5数据库
+ */
+return [
+    'class' => 'yii\db\Connection',
+    'dsn' => 'mysql:host=154.206.44.109;dbname=mt5',
+    'username' => 'root',
+    'password' => 'Titan666!@#',
+    'charset' => 'utf8',
+];