作者 魏强

cash

  1 +<?php
  2 +
  3 +namespace app\admin\controller;
  4 +
  5 +use app\common\controller\Backend;
  6 +
  7 +/**
  8 + * 提现审核管理
  9 + *
  10 + * @icon fa fa-circle-o
  11 + */
  12 +class GetCash extends Backend
  13 +{
  14 +
  15 + /**
  16 + * GetCash模型对象
  17 + * @var \app\admin\model\GetCash
  18 + */
  19 + protected $model = null;
  20 +
  21 + public function _initialize()
  22 + {
  23 + parent::_initialize();
  24 + $this->model = new \app\admin\model\GetCash;
  25 +
  26 + }
  27 +
  28 + /**
  29 + * 默认生成的控制器所继承的父类中有index/add/edit/del/multi五个基础方法、destroy/restore/recyclebin三个回收站方法
  30 + * 因此在当前控制器中可不用编写增删改查的代码,除非需要自己控制这部分逻辑
  31 + * 需要将application/admin/library/traits/Backend.php中对应的方法复制到当前控制器,然后进行修改
  32 + */
  33 +
  34 +
  35 + /**
  36 + * 查看
  37 + */
  38 + public function index()
  39 + {
  40 + //当前是否为关联查询
  41 + $this->relationSearch = true;
  42 + //设置过滤方法
  43 + $this->request->filter(['strip_tags']);
  44 + if ($this->request->isAjax())
  45 + {
  46 + //如果发送的来源是Selectpage,则转发到Selectpage
  47 + if ($this->request->request('keyField'))
  48 + {
  49 + return $this->selectpage();
  50 + }
  51 + list($where, $sort, $order, $offset, $limit) = $this->buildparams();
  52 + $total = $this->model
  53 + ->with(['user'])
  54 + ->where($where)
  55 + ->order($sort, $order)
  56 + ->count();
  57 +
  58 + $list = $this->model
  59 + ->with(['user'])
  60 + ->where($where)
  61 + ->order($sort, $order)
  62 + ->limit($offset, $limit)
  63 + ->select();
  64 +
  65 + foreach ($list as $row) {
  66 + $row->visible(['createtime','fee','paytime']);
  67 + $row->visible(['user']);
  68 + $row->getRelation('user')->visible(['nickname','avatar']);
  69 + }
  70 + $list = collection($list)->toArray();
  71 + $result = array("total" => $total, "rows" => $list);
  72 +
  73 + return json($result);
  74 + }
  75 + return $this->view->fetch();
  76 + }
  77 +}
  1 +<?php
  2 +
  3 +return [
  4 + 'Id' => 'ID',
  5 + 'User_id' => '用户id',
  6 + 'Createtime' => '添加时间',
  7 + 'Fee' => '金额',
  8 + 'Paytime' => '支付时间',
  9 + 'User.nickname' => '昵称',
  10 + 'User.avatar' => '头像'
  11 +];
  1 +<?php
  2 +
  3 +namespace app\admin\model;
  4 +
  5 +use think\Model;
  6 +
  7 +
  8 +class GetCash extends Model
  9 +{
  10 +
  11 +
  12 +
  13 +
  14 +
  15 + // 表名
  16 + protected $name = 'get_cash';
  17 +
  18 + // 自动写入时间戳字段
  19 + protected $autoWriteTimestamp = 'int';
  20 +
  21 + // 定义时间戳字段名
  22 + protected $createTime = 'createtime';
  23 + protected $updateTime = false;
  24 + protected $deleteTime = false;
  25 +
  26 + // 追加属性
  27 + protected $append = [
  28 + 'paytime_text'
  29 + ];
  30 +
  31 +
  32 +
  33 +
  34 +
  35 +
  36 + public function getPaytimeTextAttr($value, $data)
  37 + {
  38 + $value = $value ? $value : (isset($data['paytime']) ? $data['paytime'] : '');
  39 + return is_numeric($value) ? date("Y-m-d H:i:s", $value) : $value;
  40 + }
  41 +
  42 + protected function setPaytimeAttr($value)
  43 + {
  44 + return $value === '' ? null : ($value && !is_numeric($value) ? strtotime($value) : $value);
  45 + }
  46 +
  47 +
  48 + public function user()
  49 + {
  50 + return $this->belongsTo('User', 'user_id', 'id', [], 'LEFT')->setEagerlyType(0);
  51 + }
  52 +}
  1 +<?php
  2 +
  3 +namespace app\admin\validate;
  4 +
  5 +use think\Validate;
  6 +
  7 +class GetCash extends Validate
  8 +{
  9 + /**
  10 + * 验证规则
  11 + */
  12 + protected $rule = [
  13 + ];
  14 + /**
  15 + * 提示消息
  16 + */
  17 + protected $message = [
  18 + ];
  19 + /**
  20 + * 验证场景
  21 + */
  22 + protected $scene = [
  23 + 'add' => [],
  24 + 'edit' => [],
  25 + ];
  26 +
  27 +}
  1 +<form id="add-form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action="">
  2 +
  3 + <div class="form-group">
  4 + <label class="control-label col-xs-12 col-sm-2">{:__('User_id')}:</label>
  5 + <div class="col-xs-12 col-sm-8">
  6 + <input id="c-user_id" data-rule="required" data-source="user/user/index" data-field="nickname" class="form-control selectpage" name="row[user_id]" type="text" value="">
  7 + </div>
  8 + </div>
  9 + <div class="form-group">
  10 + <label class="control-label col-xs-12 col-sm-2">{:__('Fee')}:</label>
  11 + <div class="col-xs-12 col-sm-8">
  12 + <input id="c-fee" data-rule="required" class="form-control" name="row[fee]" type="number" value="0">
  13 + </div>
  14 + </div>
  15 + <div class="form-group">
  16 + <label class="control-label col-xs-12 col-sm-2">{:__('Paytime')}:</label>
  17 + <div class="col-xs-12 col-sm-8">
  18 + <input id="c-paytime" data-rule="required" class="form-control datetimepicker" data-date-format="YYYY-MM-DD HH:mm:ss" data-use-current="true" name="row[paytime]" type="text" value="{:date('Y-m-d H:i:s')}">
  19 + </div>
  20 + </div>
  21 + <div class="form-group layer-footer">
  22 + <label class="control-label col-xs-12 col-sm-2"></label>
  23 + <div class="col-xs-12 col-sm-8">
  24 + <button type="submit" class="btn btn-success btn-embossed disabled">{:__('OK')}</button>
  25 + <button type="reset" class="btn btn-default btn-embossed">{:__('Reset')}</button>
  26 + </div>
  27 + </div>
  28 +</form>
  1 +<form id="edit-form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action="">
  2 +
  3 + <div class="form-group">
  4 + <label class="control-label col-xs-12 col-sm-2">{:__('User_id')}:</label>
  5 + <div class="col-xs-12 col-sm-8">
  6 + <input id="c-user_id" data-rule="required" data-source="user/user/index" data-field="nickname" class="form-control selectpage" name="row[user_id]" type="text" value="{$row.user_id|htmlentities}">
  7 + </div>
  8 + </div>
  9 + <div class="form-group">
  10 + <label class="control-label col-xs-12 col-sm-2">{:__('Fee')}:</label>
  11 + <div class="col-xs-12 col-sm-8">
  12 + <input id="c-fee" data-rule="required" class="form-control" name="row[fee]" type="number" value="{$row.fee|htmlentities}">
  13 + </div>
  14 + </div>
  15 + <div class="form-group">
  16 + <label class="control-label col-xs-12 col-sm-2">{:__('Paytime')}:</label>
  17 + <div class="col-xs-12 col-sm-8">
  18 + <input id="c-paytime" data-rule="required" class="form-control datetimepicker" data-date-format="YYYY-MM-DD HH:mm:ss" data-use-current="true" name="row[paytime]" type="text" value="{:$row.paytime?datetime($row.paytime):''}">
  19 + </div>
  20 + </div>
  21 + <div class="form-group layer-footer">
  22 + <label class="control-label col-xs-12 col-sm-2"></label>
  23 + <div class="col-xs-12 col-sm-8">
  24 + <button type="submit" class="btn btn-success btn-embossed disabled">{:__('OK')}</button>
  25 + <button type="reset" class="btn btn-default btn-embossed">{:__('Reset')}</button>
  26 + </div>
  27 + </div>
  28 +</form>
  1 +<div class="panel panel-default panel-intro">
  2 + {:build_heading()}
  3 +
  4 + <div class="panel-body">
  5 + <div id="myTabContent" class="tab-content">
  6 + <div class="tab-pane fade active in" id="one">
  7 + <div class="widget-body no-padding">
  8 + <div id="toolbar" class="toolbar">
  9 + <a href="javascript:;" class="btn btn-primary btn-refresh" title="{:__('Refresh')}" ><i class="fa fa-refresh"></i> </a>
  10 + <a href="javascript:;" class="btn btn-success btn-add {:$auth->check('get_cash/add')?'':'hide'}" title="{:__('Add')}" ><i class="fa fa-plus"></i> {:__('Add')}</a>
  11 + <a href="javascript:;" class="btn btn-success btn-edit btn-disabled disabled {:$auth->check('get_cash/edit')?'':'hide'}" title="{:__('Edit')}" ><i class="fa fa-pencil"></i> {:__('Edit')}</a>
  12 + <a href="javascript:;" class="btn btn-danger btn-del btn-disabled disabled {:$auth->check('get_cash/del')?'':'hide'}" title="{:__('Delete')}" ><i class="fa fa-trash"></i> {:__('Delete')}</a>
  13 + <a href="javascript:;" class="btn btn-danger btn-import {:$auth->check('get_cash/import')?'':'hide'}" title="{:__('Import')}" id="btn-import-file" data-url="ajax/upload" data-mimetype="csv,xls,xlsx" data-multiple="false"><i class="fa fa-upload"></i> {:__('Import')}</a>
  14 +
  15 + <div class="dropdown btn-group {:$auth->check('get_cash/multi')?'':'hide'}">
  16 + <a class="btn btn-primary btn-more dropdown-toggle btn-disabled disabled" data-toggle="dropdown"><i class="fa fa-cog"></i> {:__('More')}</a>
  17 + <ul class="dropdown-menu text-left" role="menu">
  18 + <li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="status=normal"><i class="fa fa-eye"></i> {:__('Set to normal')}</a></li>
  19 + <li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="status=hidden"><i class="fa fa-eye-slash"></i> {:__('Set to hidden')}</a></li>
  20 + </ul>
  21 + </div>
  22 +
  23 +
  24 + </div>
  25 + <table id="table" class="table table-striped table-bordered table-hover table-nowrap"
  26 + data-operate-edit="{:$auth->check('get_cash/edit')}"
  27 + data-operate-del="{:$auth->check('get_cash/del')}"
  28 + width="100%">
  29 + </table>
  30 + </div>
  31 + </div>
  32 +
  33 + </div>
  34 + </div>
  35 +</div>
不能预览此文件类型
  1 +-----BEGIN CERTIFICATE-----
  2 +MIID8DCCAtigAwIBAgIUXiUo95hBn7aB1cKsDW3ph316sLUwDQYJKoZIhvcNAQEL
  3 +BQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsT
  4 +FFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3Qg
  5 +Q0EwHhcNMTkxMTAzMDcwMjMzWhcNMjQxMTAxMDcwMjMzWjCBgTETMBEGA1UEAwwK
  6 +MTU1ODUxNDE5MTEbMBkGA1UECgwS5b6u5L+h5ZWG5oi357O757ufMS0wKwYDVQQL
  7 +DCTmna3lt57prZTpkpvkv6Hmga/mioDmnK/mnInpmZDlhazlj7gxCzAJBgNVBAYM
  8 +AkNOMREwDwYDVQQHDAhTaGVuWmhlbjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
  9 +AQoCggEBAML63Tg18HeUvOhPzpihHzl20gYjo5C8u/ayz6Y2+V6zhzySztXJB63b
  10 +jI9v/p9tMtwLxpx3LmrM49voiwHV4M8wmMvRaxYAYQE6EmDB6UVHH6NGA3s1HXJV
  11 +2dvRlNbrQWwB5PMG4d+WBwA18kA4S0YnZttu3UfA9ZTz7/+x4wFuU0rVP+mQGsZM
  12 +WSqlZsJ/YLO+exuPNSKhkRwVfGtLvYOAGNen08Zb9hYshjBhgwIP7nFJTd/q6l9m
  13 +LvUVuJbs495Hx4P+bIL90DyK3K+1I6psS1wsFuw+2hwM2J0zrEvzoFvf9JJkgFrK
  14 +E3dkVhvQNjxpnkYpGGS2nwhNOs6iIh8CAwEAAaOBgTB/MAkGA1UdEwQCMAAwCwYD
  15 +VR0PBAQDAgTwMGUGA1UdHwReMFwwWqBYoFaGVGh0dHA6Ly9ldmNhLml0cnVzLmNv
  16 +bS5jbi9wdWJsaWMvaXRydXNjcmw/Q0E9MUJENDIyMEU1MERCQzA0QjA2QUQzOTc1
  17 +NDk4NDZDMDFDM0U4RUJEMjANBgkqhkiG9w0BAQsFAAOCAQEAlLaFysxAAmmpC2hL
  18 +rIj4xvMuF7PlPY9ahX2goEAdagYiuRc76if6rkZG3VWf0x9w0tlfQ2p3GjTmOTI0
  19 +M+ycoEq8O/xAJlNGSEk6lX1+OjzThgo9EZ/Ru16SaOTYEPIRE0HvI/VLBoUSSaEw
  20 +lzDUrBaidvUmyw/Ki16UFBxGTMpVcBVdyIS9CNdKJWz12WK3GlsLuzemUd22WW2A
  21 +eL3LtFwo4zWtLpQc+1tzMIyJt5qOSry0+U7PPrT5mltwANMiLZ5YUi6Klfh1StZY
  22 +zDGt/694ZkDZMrsAR/fg0aZf3LvhqV89WkchJC2Rdf1kietZrJRQGcKyJDIh1dRg
  23 +R3IPxA==
  24 +-----END CERTIFICATE-----
  1 +-----BEGIN PRIVATE KEY-----
  2 +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDC+t04NfB3lLzo
  3 +T86YoR85dtIGI6OQvLv2ss+mNvles4c8ks7VyQet24yPb/6fbTLcC8acdy5qzOPb
  4 +6IsB1eDPMJjL0WsWAGEBOhJgwelFRx+jRgN7NR1yVdnb0ZTW60FsAeTzBuHflgcA
  5 +NfJAOEtGJ2bbbt1HwPWU8+//seMBblNK1T/pkBrGTFkqpWbCf2CzvnsbjzUioZEc
  6 +FXxrS72DgBjXp9PGW/YWLIYwYYMCD+5xSU3f6upfZi71FbiW7OPeR8eD/myC/dA8
  7 +ityvtSOqbEtcLBbsPtocDNidM6xL86Bb3/SSZIBayhN3ZFYb0DY8aZ5GKRhktp8I
  8 +TTrOoiIfAgMBAAECggEAGuv6iZ1hA5Hk94q1cvukTRHr8+8N0ZlNtsV/yGqEyh+t
  9 +x55ZsskcJ1RONyv2k1rHj/yMQuRt409BEwcr0mgOr2z9W/8hcxtASaQUD4oWxHsK
  10 +kkfDiUqPM09JUoHAtGAtW1VzoF7N50pW0x+fwGBFfH1KRXgsU5EAF74K4FpWhsbQ
  11 +FB83FY/Rs+rsXR9StUjW8pLIAYjOcu+4dw/zRoKMwE38uaFTGp3Mzi2C+B9U/1uJ
  12 +GN55s9UEpdMhaGgvUBD+KZ/g033QO7dHyex23cx/RJqqr7u/Ks5oKL7V6v/QxjL+
  13 +gJJv6LLRXPbWQlau+XjaKyWqlYx9Df8XCDgeULYPSQKBgQDxrQgo5/PCQuXao0Sy
  14 +TD6EWCDbZZ0x+Zq4dM20uwxHAsCWLJlx9+h4JlS9GrqICqgqQwGuUgYUf+uxZKW3
  15 +VaDDv9TrB55z6IP5VIhx7+vfEbhNKcl97FxtIVcZXX9b5c86+p0x5xiErU7JmUoI
  16 +OmAxK6AU94ubO36EtaMKVVXz5QKBgQDOiU+Au+Co3ZKQEU1qaKFTFMGCDa3jtWYl
  17 +NqT8xszhGvdwkrmaatCj7nnbbVgTMRpLV0jhUh/HcwTv7VrSxE046YQiS894r/2L
  18 +nqUtfjLfy3x6m1SRg+ZNbmO+HzTJicQwUcJkp/6baVpEbkz2qCeFiEpoJQa2Un2j
  19 +zjur/p6lswKBgCppUC5Fjlx/+vBkiJC1mp8FDDcUXQLBJ+rI7LSTwrLPg9aW2xLK
  20 +C6zSJTrObv+ixyIrgicCU/jS/hyyafaDe2P+zTG1s5PpsQdXU16TWRRberln5OlJ
  21 +SmsIV82mv8vzx2s1QdLZGE9oTpRIZ1qMTAc0/bHQQ1qplSla6tLMaPoVAoGBAJ4V
  22 +N0b/hrt5rJ6cv7Z8k042Cs7yjXBG/gHpy2q290YtD8uYYnuw2jU/aQHstYcrBEc6
  23 +bcwYwb41aUgDUosUOU8gXUSq5ggoHFbrfN5PQ71L0OE/VwFyBaqqnal91TeVPRcG
  24 +3VWRyC1H/BF4o2v/1RA9+0WvYW3XwdbJGZ9R6jhFAoGBAKrTnqmm5HvkFk7LHfmV
  25 +vK4tW8VTlLrY/ipsONYrhrQEX1l9GDGMOGcXk9UQw+tBBzzaq1x8OmOZf9oWI4TE
  26 +2ZODN/XiwZeRSx/MUBQlE7BUbU7hdzdzEJ54Gi172C2n40ALzjjn1e+XzAV7GrTd
  27 +wt/rJ7Z+M7YZ6tgWque/kpuL
  28 +-----END PRIVATE KEY-----
  1 +欢迎使用微信支付!
  2 +附件中的三份文件(证书pkcs12格式、证书pem格式、证书密钥pem格式),为接口中强制要求时需携带的证书文件。
  3 +证书属于敏感信息,请妥善保管不要泄露和被他人复制。
  4 +不同开发语言下的证书格式不同,以下为说明指引:
  5 + 证书pkcs12格式(apiclient_cert.p12)
  6 + 包含了私钥信息的证书文件,为p12(pfx)格式,由微信支付签发给您用来标识和界定您的身份
  7 + 部分安全性要求较高的API需要使用该证书来确认您的调用身份
  8 + windows上可以直接双击导入系统,导入过程中会提示输入证书密码,证书密码默认为您的商户号(如:1900006031)
  9 + 证书pem格式(apiclient_cert.pem)
  10 + 从apiclient_cert.p12中导出证书部分的文件,为pem格式,请妥善保管不要泄漏和被他人复制
  11 + 部分开发语言和环境,不能直接使用p12文件,而需要使用pem,所以为了方便您使用,已为您直接提供
  12 + 您也可以使用openssl命令来自己导出:openssl pkcs12 -clcerts -nokeys -in apiclient_cert.p12 -out apiclient_cert.pem
  13 + 证书密钥pem格式(apiclient_key.pem)
  14 + 从apiclient_cert.p12中导出密钥部分的文件,为pem格式
  15 + 部分开发语言和环境,不能直接使用p12文件,而需要使用pem,所以为了方便您使用,已为您直接提供
  16 + 您也可以使用openssl命令来自己导出:openssl pkcs12 -nocerts -in apiclient_cert.p12 -out apiclient_key.pem
  17 +备注说明:
  18 + 由于绝大部分操作系统已内置了微信支付服务器证书的根CA证书, 2018年3月6日后, 不再提供CA证书文件(rootca.pem)下载
  1 +define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefined, Backend, Table, Form) {
  2 +
  3 + var Controller = {
  4 + index: function () {
  5 + // 初始化表格参数配置
  6 + Table.api.init({
  7 + extend: {
  8 + index_url: 'get_cash/index' + location.search,
  9 + add_url: 'get_cash/add',
  10 + edit_url: 'get_cash/edit',
  11 + del_url: 'get_cash/del',
  12 + multi_url: 'get_cash/multi',
  13 + table: 'get_cash',
  14 + }
  15 + });
  16 +
  17 + var table = $("#table");
  18 +
  19 + // 初始化表格
  20 + table.bootstrapTable({
  21 + url: $.fn.bootstrapTable.defaults.extend.index_url,
  22 + pk: 'id',
  23 + sortName: 'id',
  24 + columns: [
  25 + [
  26 + {checkbox: true},
  27 + {field: 'createtime', title: __('Createtime'), operate:'RANGE', addclass:'datetimerange', formatter: Table.api.formatter.datetime},
  28 + {field: 'fee', title: __('Fee')},
  29 + {field: 'paytime', title: __('Paytime'), operate:'RANGE', addclass:'datetimerange', formatter: Table.api.formatter.datetime},
  30 + {field: 'user.nickname', title: __('User.nickname')},
  31 + {field: 'user.avatar', title: __('User.avatar'), events: Table.api.events.image, formatter: Table.api.formatter.image},
  32 + {field: 'operate', title: __('Operate'), table: table, events: Table.api.events.operate, formatter: Table.api.formatter.operate}
  33 + ]
  34 + ]
  35 + });
  36 +
  37 + // 为表格绑定事件
  38 + Table.api.bindevent(table);
  39 + },
  40 + add: function () {
  41 + Controller.api.bindevent();
  42 + },
  43 + edit: function () {
  44 + Controller.api.bindevent();
  45 + },
  46 + api: {
  47 + bindevent: function () {
  48 + Form.api.bindevent($("form[role=form]"));
  49 + }
  50 + }
  51 + };
  52 + return Controller;
  53 +});