dever 7 年 前
コミット
995d9330c0
12 ファイル変更1461 行追加0 行削除
  1. 10 0
      config/base.php
  2. 125 0
      config/wechat.php
  3. 133 0
      database/msg.php
  4. 121 0
      database/msg_form.php
  5. 169 0
      database/msg_log.php
  6. 132 0
      database/msg_send.php
  7. 218 0
      database/total_base.php
  8. 7 0
      index.php
  9. 54 0
      src/Auth.php
  10. 37 0
      src/Code.php
  11. 295 0
      src/Msg.php
  12. 160 0
      src/Total.php

+ 10 - 0
config/base.php

@@ -0,0 +1,10 @@
+<?php
+
+# 一些基本配置
+$config['base'] = array
+(
+	# 后台头部菜单
+	'top' => 'main/project_id-3',
+);
+
+return $config;

+ 125 - 0
config/wechat.php

@@ -0,0 +1,125 @@
+<?php
+# 小程序基本配置
+$config['type'] = 3;
+
+$config['token'] = array
+(
+	'name' => '获取小程序的token',
+	'method' => 'get',
+	'json' => false,
+	'url' => 'https://api.weixin.qq.com/cgi-bin/token?',
+	'param' => array
+	(
+		'appid' => 'appid',
+		'secret' => 'secret',
+		'grant_type' => 'client_credential',
+	),
+	//针对一些返回的名称,做转换
+	'response' => array
+	(
+		'access_token' => 'token',
+		'expires_in' => 'expires_in',
+	),
+);
+
+$config['send_msg'] = array
+(
+	'name' => '发送模板消息',
+	'method' => 'post',
+	'json' => true,
+	'url' => 'https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?',
+	'param' => array
+	(
+		'access_token' => 'token',
+		'touser' => 'touser',
+		'template_id' => 'template_id',
+		'page' => 'page',
+		'form_id' => 'form_id',
+		'data' => 'data',
+		'emphasis_keyword' => 'emphasis_keyword',
+	),
+	//针对一些返回的名称,做转换
+	'response' => array
+	(
+		
+	),
+);
+
+$config['get_msg'] = array
+(
+	'name' => '获取帐号下已存在的模板列表',
+	'method' => 'post',
+	'json' => true,
+	'url' => 'https://api.weixin.qq.com/cgi-bin/wxopen/template/list?',
+	'param' => array
+	(
+		'access_token' => 'token',
+		'offset' => '0',
+		'count' => '20',
+	),
+	//针对一些返回的名称,做转换
+	'response' => array
+	(
+		
+	),
+);
+
+$config['total_base'] = array
+(
+	'name' => '概况趋势',
+	'method' => 'post',
+	'json' => true,
+	'url' => 'https://api.weixin.qq.com/datacube/getweanalysisappiddailysummarytrend?',
+	'param' => array
+	(
+		'access_token' => 'token',
+		'end_date' => 'end_date',
+		'begin_date' => 'begin_date',
+	),
+	//针对一些返回的名称,做转换
+	'response' => array
+	(
+		
+	),
+);
+
+$config['total_visit'] = array
+(
+	'name' => '访问趋势',
+	'method' => 'post',
+	'json' => true,
+	'url' => 'https://api.weixin.qq.com/datacube/getweanalysisappiddailyvisittrend?',
+	'param' => array
+	(
+		'access_token' => 'token',
+		'end_date' => 'end_date',
+		'begin_date' => 'begin_date',
+	),
+	//针对一些返回的名称,做转换
+	'response' => array
+	(
+		
+	),
+);
+
+$config['code'] = array
+(
+	'name' => '获取小程序码',
+	'method' => 'post',
+	'json' => true,
+	'url' => 'https://api.weixin.qq.com/wxa/getwxacodeunlimit?',
+	'param' => array
+	(
+		'access_token' => 'token',
+		'scene' => 'param',
+		'page' => 'path',
+		'width' => 'width',
+	),
+	//针对一些返回的名称,做转换
+	'response' => array
+	(
+		'img' => true,
+	),
+);
+
+return $config;

+ 133 - 0
database/msg.php

@@ -0,0 +1,133 @@
+<?php
+
+return array
+(
+	# 表名
+	'name' => 'msg',
+	# 显示给用户看的名称
+	'lang' => '模板消息列表',
+	'order' => 100,
+	'desc' => Dever::markdown('发送模板消息接口:'.Dever::url("wechat_applet/msg.send").'
+
+		key:消息key
+		project_id:项目id
+		touser:用户openid
+		page:页面路径
+		data:内容
+		form_id:表单id
+	'),
+	# 数据结构
+	'struct' => array
+	(
+		'id' 		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> 'ID',
+			'default' 	=> '',
+			'desc' 		=> '',
+			'match' 	=> 'is_numeric',
+			'search'	=> 'order',
+			//'list'		=> true,
+		),
+
+		'project_id'		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> '项目ID',
+			'default' 	=> '',
+			'desc' 		=> '请输入项目',
+			'match' 	=> 'is_numeric',
+			'list'		=> true,
+		),
+		
+		'name'		=> array
+		(
+			'type' 		=> 'varchar-120',
+			'name' 		=> '模板标题',
+			'default' 	=> '',
+			'desc' 		=> '模板标题',
+			'match' 	=> 'is_string',
+			'update'	=> 'text',
+			'list'		=> true,
+		),
+
+		'key'		=> array
+		(
+			'type' 		=> 'varchar-20',
+			'name' 		=> '模板消息key-通过key值搜索数据',
+			'default' 	=> '',
+			'desc' 		=> '模板消息key-通过key值搜索数据',
+			'match' 	=> 'is_string',
+			'update'	=> 'text',
+			'list'		=> true,
+			'edit'		=> true,
+		),
+
+		'template_id'		=> array
+		(
+			'type' 		=> 'varchar-120',
+			'name' 		=> '模板id',
+			'default' 	=> '',
+			'desc' 		=> '模板id',
+			'match' 	=> 'is_string',
+			'update'	=> 'text',
+			//'list'		=> true,
+		),
+
+		'content'		=> array
+		(
+			'type' 		=> 'varchar-600',
+			'name' 		=> '模板内容',
+			'default' 	=> '',
+			'desc' 		=> '模板内容',
+			'match' 	=> 'option',
+			'update'	=> 'textarea',
+			'list'		=> true,
+		),
+
+		'example'		=> array
+		(
+			'type' 		=> 'varchar-600',
+			'name' 		=> '模板样例',
+			'default' 	=> '',
+			'desc' 		=> '模板样例',
+			'match' 	=> 'option',
+			'update'	=> 'textarea',
+			'list'		=> true,
+			'modal'		=> '点此查看',
+		),
+		
+		'state'		=> array
+		(
+			'type' 		=> 'tinyint-1',
+			'name' 		=> '状态',
+			'default' 	=> '1',
+			'desc' 		=> '请选择状态',
+			'match' 	=> 'is_numeric',
+		),
+		
+		'cdate'		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> '更新时间',
+			'match' 	=> array('is_numeric', time()),
+			'desc' 		=> '',
+			'default' 	=> '',
+			'list'		=> 'date("Y-m-d H:i:s", {cdate})',
+		),
+	),
+
+	'top' => Dever::config('base', 'applet')->top,
+
+	'manage' => array
+	(
+		//'delete' => false,
+		'insert' => false,
+		'edit' => false,
+
+		'button' => array
+		(
+			'同步模板' => 'wechat_applet/msg.sync',
+		),
+	),
+);

+ 121 - 0
database/msg_form.php

@@ -0,0 +1,121 @@
+<?php
+
+$time = time()+(3600*24*7);
+return array
+(
+	# 表名
+	'name' => 'msg_form',
+	# 显示给用户看的名称
+	'lang' => '模板form_id收集表',
+	'menu' => false,
+	# 数据结构
+	'struct' => array
+	(
+		'id' 		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> 'ID',
+			'default' 	=> '',
+			'desc' 		=> '',
+			'match' 	=> 'is_numeric',
+			'search'	=> 'order',
+			'list'		=> true,
+		),
+
+		'project_id'		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> '项目',
+			'default' 	=> '',
+			'desc' 		=> '请输入项目',
+			'match' 	=> 'is_numeric',
+			'list'		=> true,
+		),
+
+		'openid'		=> array
+		(
+			'type' 		=> 'varchar-120',
+			'name' 		=> '用户openid',
+			'default' 	=> '',
+			'desc' 		=> '用户openid',
+			'match' 	=> 'is_string',
+			'search'	=> 'fulltext',
+			'update'	=> 'text',
+			'list'		=> true,
+		),
+		
+		'form_id'		=> array
+		(
+			'type' 		=> 'varchar-200',
+			'name' 		=> 'form_id',
+			'default' 	=> '',
+			'desc' 		=> 'form_id',
+			'match' 	=> 'is_string',
+			'update'	=> 'text',
+			'search'	=> 'fulltext',
+			'list'		=> true,
+		),
+		
+		'state'		=> array
+		(
+			'type' 		=> 'tinyint-1',
+			'name' 		=> '状态',
+			'default' 	=> '1',
+			'desc' 		=> '请选择状态',
+			'match' 	=> 'is_numeric',
+		),
+		
+		'cdate'		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> '更新时间',
+			'match' 	=> array('is_numeric', time()),
+			'desc' 		=> '',
+			'default' 	=> '',
+			'list'		=> 'date("Y-m-d H:i:s", {cdate})',
+		),
+	),
+
+	'top' => Dever::config('base', 'wechat_applet')->top,
+
+	'manage' => array
+	(
+		//'delete' => false,
+		'insert' => false,
+		'edit' => false,
+	),
+
+	'request' => array
+	(
+		'getAll' => array
+		(
+			# 匹配的正则或函数 选填项
+			'option' => array
+			(
+				'project_id' => 'yes',
+				'openid' => 'yes',
+				'cdate' => array($time, '<='),
+				'state' => 1,
+			),
+			'type' => 'all',
+			'order' => array('cdate' => 'desc'),
+			'limit' => '0,100',
+			'col' => '*',
+		),
+
+		'getAllGroupByOpenid' => array
+		(
+			# 匹配的正则或函数 选填项
+			'option' => array
+			(
+				'project_id' => 'yes',
+				'cdate' => array($time, '<='),
+				'state' => 1,
+			),
+			'type' => 'all',
+			'group' => 'openid',
+			'order' => array('cdate' => 'desc'),
+			'col' => '*',
+		),
+	),
+);

+ 169 - 0
database/msg_log.php

@@ -0,0 +1,169 @@
+<?php
+
+$status = array
+(
+	1 => '发送中',
+	2 => '发送成功',
+	3 => '发送失败',
+);
+
+return array
+(
+	# 表名
+	'name' => 'msg_log',
+	# 显示给用户看的名称
+	'lang' => '模板消息日志',
+	'order' => 90,
+	# 数据结构
+	'struct' => array
+	(
+		'id' 		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> 'ID',
+			'default' 	=> '',
+			'desc' 		=> '',
+			'match' 	=> 'is_numeric',
+			'search'	=> 'order',
+			'list'		=> true,
+		),
+
+		'project_id'		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> '项目',
+			'default' 	=> '',
+			'desc' 		=> '请输入项目',
+			'match' 	=> 'is_numeric',
+		),
+		
+		'msg_id'		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> '消息id',
+			'default' 	=> '',
+			'desc' 		=> '消息id',
+			'match' 	=> 'is_numeric',
+			'update'	=> 'text',
+			'list'		=> 'Dever::load("wechat_applet/msg-one#name", {msg_id})',
+		),
+
+		'touser'		=> array
+		(
+			'type' 		=> 'varchar-120',
+			'name' 		=> '接收者',
+			'default' 	=> '',
+			'desc' 		=> '接收者',
+			'match' 	=> 'is_string',
+			'update'	=> 'text',
+			'list'		=> true,
+		),
+
+		'page'		=> array
+		(
+			'type' 		=> 'varchar-200',
+			'name' 		=> '跳转页面',
+			'default' 	=> '',
+			'desc' 		=> '跳转页面',
+			'match' 	=> 'option',
+			'update'	=> 'textarea',
+			//'list'		=> true,
+		),
+
+		'data'		=> array
+		(
+			'type' 		=> 'text-255',
+			'name' 		=> '模板内容',
+			'default' 	=> '',
+			'desc' 		=> '模板内容',
+			'match' 	=> 'option',
+			'update'	=> 'textarea',
+			//'list'		=> true,
+		),
+
+		'form_id'		=> array
+		(
+			'type' 		=> 'varchar-30',
+			'name' 		=> '表单或者支付id',
+			'default' 	=> '',
+			'desc' 		=> '表单或者支付id',
+			'match' 	=> 'option',
+			'update'	=> 'textarea',
+			//'list'		=> true,
+		),
+
+		'emphasis_keyword'		=> array
+		(
+			'type' 		=> 'varchar-200',
+			'name' 		=> '模板需要放大的关键词',
+			'default' 	=> '',
+			'desc' 		=> '模板需要放大的关键词',
+			'match' 	=> 'option',
+			'update'	=> 'textarea',
+			//'list'		=> true,
+		),
+
+		'num'		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> '发送次数',
+			'default' 	=> '0',
+			'desc' 		=> '发送次数',
+			'match' 	=> 'option',
+			//'search'	=> 'order',
+			'list'		=> true,
+		),
+
+		'result'		=> array
+		(
+			'type' 		=> 'text-255',
+			'name' 		=> '微信返回信息',
+			'default' 	=> '',
+			'desc' 		=> '微信返回信息',
+			'match' 	=> 'option',
+			'update'	=> 'textarea',
+			'list'		=> true,
+			'modal'		=> '查看详情',
+		),
+
+		'status'		=> array
+		(
+			'type' 		=> 'tinyint-1',
+			'name' 		=> '状态',
+			'default' 	=> '1',
+			'desc' 		=> '状态',
+			'match' 	=> 'is_numeric',
+			'update'	=> 'select',
+			'option'	=> $status,
+			'list'		=> true,
+		),
+		
+		'state'		=> array
+		(
+			'type' 		=> 'tinyint-1',
+			'name' 		=> '状态',
+			'default' 	=> '1',
+			'desc' 		=> '请选择状态',
+			'match' 	=> 'is_numeric',
+		),
+		
+		'cdate'		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> '更新时间',
+			'match' 	=> array('is_numeric', time()),
+			'desc' 		=> '',
+			'default' 	=> '',
+			'list'		=> 'date("Y-m-d H:i:s", {cdate})',
+		),
+	),
+
+	'top' => Dever::config('base', 'wechat_applet')->top,
+
+	'manage' => array
+	(
+		'delete' => false,
+		'insert' => false,
+		'edit' => false,
+	),
+);

+ 132 - 0
database/msg_send.php

@@ -0,0 +1,132 @@
+<?php
+
+$project = function()
+{
+	$array = array();
+	$info = Dever::load('token/project-state', array('option_type' => 3));
+	if($info)
+	{
+		$array += $info;
+	}
+	return $array;
+};
+
+return array
+(
+	# 表名
+	'name' => 'msg_send',
+	# 显示给用户看的名称
+	'lang' => '发送模板消息',
+	'order' => 90,
+	# 数据结构
+	'struct' => array
+	(
+		'id' 		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> 'ID',
+			'default' 	=> '',
+			'desc' 		=> '',
+			'match' 	=> 'is_numeric',
+			'search'	=> 'order',
+			//'list'		=> true,
+		),
+
+		'project_id'		=> array
+		(
+			'type' 		=> 'varchar-300',
+			'name' 		=> '选择项目',
+			'default' 	=> '',
+			'desc' 		=> '选择项目',
+			'match' 	=> 'is_numeric',
+			'list'		=> true,
+			'update'	=> 'checkbox',
+			'option'	=> $project,
+		),
+
+		'key'		=> array
+		(
+			'type' 		=> 'varchar-20',
+			'name' 		=> '模板消息key',
+			'default' 	=> '',
+			'desc' 		=> '模板消息key',
+			'match' 	=> 'is_string',
+			'update'	=> 'text',
+			'list'		=> true,
+			'edit'		=> true,
+		),
+
+		'page'		=> array
+		(
+			'type' 		=> 'varchar-200',
+			'name' 		=> '页面路径',
+			'default' 	=> 'pages/index/index',
+			'desc' 		=> '页面路径',
+			'match' 	=> 'is_string',
+			'update'	=> 'text',
+			'list'		=> true,
+		),
+
+		'content'		=> array
+		(
+			'type' 		=> 'text-255',
+			'name' 		=> '模板内容',
+			'default' 	=> '',
+			'desc' 		=> '请输入内容',
+			'match' 	=> 'is_string',
+			'update'	=> array
+			(
+				array
+				(
+					'col'		=> 'key',
+					'name' 		=> '标识',
+					'default' 	=> '',
+					'desc' 		=> '请输入标识',
+					'match' 	=> 'is_string',
+					'update'	=> 'text',
+				),
+				array
+				(
+					'col' 		=> 'value',
+					'name' 		=> '内容值',
+					'default' 	=> '',
+					'desc' 		=> '内容值',
+					'match' 	=> 'is_string',
+					'update'	=> 'textarea',
+				),
+			),
+		),
+
+		'state'		=> array
+		(
+			'type' 		=> 'tinyint-1',
+			'name' 		=> '状态',
+			'default' 	=> '1',
+			'desc' 		=> '请选择状态',
+			'match' 	=> 'is_numeric',
+		),
+		
+		'cdate'		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> '更新时间',
+			'match' 	=> array('is_numeric', time()),
+			'desc' 		=> '',
+			'default' 	=> '',
+			'list'		=> 'date("Y-m-d H:i:s", {cdate})',
+		),
+	),
+
+	//'top' => Dever::config('base', 'wechat_applet')->top,
+
+	'manage' => array
+	(
+		//'delete' => false,
+		//'insert' => false,
+		//'edit' => false,
+		'list_button' => array
+		(
+			'oper' => array('立刻发送', '"wechat_applet/msg.submit?id={id}"'),
+		),
+	),
+);

+ 218 - 0
database/total_base.php

@@ -0,0 +1,218 @@
+<?php
+
+return array
+(
+	# 表名
+	'name' => 'total_base',
+	# 显示给用户看的名称
+	'lang' => '统计概览',
+	'order' => 20,
+	'desc' => '请将total.cron加入到cron中',
+	# 数据结构
+	'struct' => array
+	(
+		'id' 		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> 'ID',
+			'default' 	=> '',
+			'desc' 		=> '',
+			'match' 	=> 'is_numeric',
+			//'search'	=> 'order',
+			'order'		=> 'desc',
+			//'list'		=> true,
+		),
+
+		'project_id'		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> '项目',
+			'default' 	=> '',
+			'desc' 		=> '请输入项目',
+			'match' 	=> 'is_numeric',
+			'list'		=> 'Dever::load("token/project-one#name", {project_id})',
+		),
+		
+		'day'		=> array
+		(
+			'type' 		=> 'varchar-60',
+			'name' 		=> '统计日期',
+			'default' 	=> '',
+			'desc' 		=> '统计日期',
+			'match' 	=> 'is_string',
+			'update'	=> 'text',
+			'search'	=> 'fulltext',
+			'list'		=> true,
+		),
+
+		'daynum'		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> '统计日期',
+			'default' 	=> '',
+			'desc' 		=> '统计日期',
+			'match' 	=> 'is_numeric',
+			'update'	=> 'text',
+			//'search'	=> 'time',
+			//'list'		=> true,
+		),
+
+		'session_cnt'		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> '打开次数',
+			'default' 	=> '0',
+			'match' 	=> '打开次数',
+			'match' 	=> 'is_numeric',
+			'update'	=> 'text',
+			'list'		=> true,
+		),
+
+		'visit_pv'		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> '访问次数',
+			'default' 	=> '0',
+			'match' 	=> '访问次数',
+			'match' 	=> 'is_numeric',
+			'update'	=> 'text',
+			'list'		=> true,
+		),
+
+		'visit_uv'		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> '访问人数',
+			'default' 	=> '0',
+			'match' 	=> '访问人数',
+			'match' 	=> 'is_numeric',
+			'update'	=> 'text',
+			'list'		=> true,
+		),
+
+		'visit_uv_new'		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> '新用户数',
+			'default' 	=> '0',
+			'match' 	=> '新用户数',
+			'match' 	=> 'is_numeric',
+			'update'	=> 'text',
+			'list'		=> true,
+		),
+
+		'stay_time_uv'		=> array
+		(
+			'type' 		=> 'varchar-30',
+			'name' 		=> '人均停留时长',
+			'default' 	=> '0',
+			'match' 	=> '人均停留时长',
+			'match' 	=> 'is_string',
+			'update'	=> 'text',
+			'list'		=> true,
+		),
+
+		'stay_time_session'		=> array
+		(
+			'type' 		=> 'varchar-30',
+			'name' 		=> '次均停留时长',
+			'default' 	=> '0',
+			'match' 	=> '次均停留时长',
+			'match' 	=> 'is_string',
+			'update'	=> 'text',
+			'list'		=> true,
+		),
+
+		'visit_depth'		=> array
+		(
+			'type' 		=> 'varchar-30',
+			'name' 		=> '平均访问深度',
+			'default' 	=> '0',
+			'match' 	=> '平均访问深度',
+			'match' 	=> 'is_string',
+			'update'	=> 'text',
+			'list'		=> true,
+		),
+
+		'visit_total'		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> '累计用户数',
+			'default' 	=> '0',
+			'match' 	=> '累计用户数',
+			'match' 	=> 'is_numeric',
+			'update'	=> 'text',
+			'list'		=> true,
+		),
+
+		'share_pv'		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> '转发次数',
+			'default' 	=> '0',
+			'match' 	=> '转发次数',
+			'match' 	=> 'is_numeric',
+			'update'	=> 'text',
+			'list'		=> true,
+		),
+
+		'share_uv'		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> '转发人数',
+			'default' 	=> '0',
+			'match' 	=> '转发人数',
+			'match' 	=> 'is_numeric',
+			'update'	=> 'text',
+			'list'		=> true,
+		),
+
+		'state'		=> array
+		(
+			'type' 		=> 'tinyint-1',
+			'name' 		=> '状态',
+			'default' 	=> '1',
+			'desc' 		=> '请选择状态',
+			'match' 	=> 'is_numeric',
+		),
+		
+		'cdate'		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> '录入时间',
+			'match' 	=> array('is_numeric', time()),
+			'desc' 		=> '',
+			# 只有insert时才生效
+			'insert'	=> true,
+			//'list'		=> 'date("Y-m-d H:i:s", {cdate})',
+		),
+	),
+	
+	'manage' => array
+	(
+		'insert' => false,
+		'edit' => false,
+		'delete' => false,
+		'excel' => true,
+		'button' => array
+		(
+			'下载昨日统计报表' => array('location', 'wechat_applet/total.out'),
+		),
+	),
+
+	'request' => array
+	(
+		'getData' => array
+		(
+			# 匹配的正则或函数 选填项
+			'option' => array
+			(
+				'day' => 'yes',
+				'project_id' => array('yes', 'in'),
+				'state' => 1,
+			),
+			'type' => 'all',
+			'col' => '*',
+		),
+	),
+);

+ 7 - 0
index.php

@@ -0,0 +1,7 @@
+<?php
+define('DEVER_APP_NAME', 'wechat_applet');
+define('DEVER_APP_LANG', '小程序管理');
+define('DEVER_APP_PATH', dirname(__FILE__) . DIRECTORY_SEPARATOR);
+define('DEVER_MANAGE_ORDER', 90);
+define('DEVER_MANAGE_ICON', 'glyphicon glyphicon-tint');
+include(DEVER_APP_PATH . '../boot.php');

+ 54 - 0
src/Auth.php

@@ -0,0 +1,54 @@
+<?php
+/*
+|--------------------------------------------------------------------------
+| auth.php 用于做权限验证
+|--------------------------------------------------------------------------
+*/
+namespace Wechat_applet\Src;
+
+use Dever;
+use Token\Lib\Wechat;
+
+class Auth
+{
+	/**
+	 * wechat
+	 *
+	 * @var Wechat
+	 */
+	private $wechat;
+	
+	/**
+	 * result
+	 *
+	 * @var array
+	 */
+	private $result;
+	
+	/**
+	 * output
+	 *
+	 * @var string
+	 */
+	private $output;
+	
+	/**
+     * 构造函数 初始化
+     * 
+     * @return mixed
+     */
+	public function __construct()
+	{
+		$this->wechat = new Wechat();
+	}
+
+	/**
+     * 获取token 一般为系统token
+     * 
+     * @return mixed
+     */
+	public function token_api()
+	{
+		return $this->wechat->token(false, false, 2000, true);
+	}
+}

+ 37 - 0
src/Code.php

@@ -0,0 +1,37 @@
+<?php
+/*
+|--------------------------------------------------------------------------
+| 获取小程序二维码
+|--------------------------------------------------------------------------
+*/
+namespace Wechat_applet\Src;
+
+use Dever;
+use Token\Lib\Wechat;
+
+class Code
+{
+    public function get()
+    {
+        $project = Dever::input('project');
+        $param['path'] = Dever::input('path', 'pages/index/index');
+        $param['param'] = Dever::input('send');
+        $param['width'] = Dever::input('width', 200);
+        $update = Dever::input('update', 2);
+
+        $file = Dever::pathDay('upload/applet/code', false) . $project . '_' . md5($param['path'] . '_' . $param['param'] . '_' . $param['width']) . '.jpg';
+
+        if (!is_file($file) || $update == 1) {
+            $wechat = new Wechat($project, 'applet');
+
+            $data = $wechat->curl('code', $param, true);
+
+            if ($data) {
+                file_put_contents($file, $data);
+            }
+        }
+        $file = Dever::pic($file);
+
+        return $file;
+    }
+}

+ 295 - 0
src/Msg.php

@@ -0,0 +1,295 @@
+<?php
+/*
+|--------------------------------------------------------------------------
+| 模板消息
+|--------------------------------------------------------------------------
+*/
+namespace Wechat_applet\Src;
+
+use Dever;
+use Token\Lib\Wechat;
+use Token\Lib\Core;
+
+class Msg
+{
+	# 发送模板消息
+	public function test()
+	{
+		$page = 'pages/index/index';
+		$data = array
+        (
+            'keyword1' => array
+            (
+                'value' => '测试活动',
+            ),
+            'keyword2' => array
+            (
+                'value' => date('Y-m-d H:i:s'),
+            ),
+            'keyword3' => array
+            (
+                'value' => '欢迎参加',
+            ),
+        );
+
+        $data = json_encode($data);
+		//Dever::setInput('touser', 'oIZ895bO9a_TT_ouYCQLPFMod57c');
+		
+		//Dever::setInput('touser', 'oIZ895bO9a_TT_ouYCQLPFMod57c');
+		Dever::setInput('page', $page);
+		Dever::setInput('data', $data);
+		//Dever::setInput('form_id', '1526295575657');
+		Dever::setInput('key', 'act');
+		Dever::setInput('project_id', '2');
+
+		$type = Dever::input('type', 1);
+		if ($type == 1) {
+			return $this->send();
+		} else {
+			return $this->sendMul();
+		}
+	}
+
+	# 发送单条模板消息
+	public function send()
+	{
+		$key = Dever::input('key');
+		$project_id = Dever::input('project_id');
+		$touser = Dever::input('touser');
+		$page = Dever::input('page');
+		$data = Dever::input('data');
+		$form_id = Dever::input('form_id');
+		$emphasis_keyword = Dever::input('emphasis_keyword');
+		$this->sendOne($key, $project_id, $touser, $page, $data, $form_id, $emphasis_keyword);
+
+		return 'ok';
+	}
+
+	# 发送单条模板消息
+	public function sendOne($key, $project_id, $touser, $page, $data, $form_id = false, $emphasis_keyword = '', $state = false)
+	{
+		if ($project_id > 0 && $key && $touser && $page && $data) {
+			$info = Dever::db('wechat_applet/msg')->one(array('option_key' => $key, 'option_project_id' => $project_id));
+			if ($info) {
+				$update = array();
+				$update['project_id'] = $info['project_id'];
+				$update['msg_id'] = $info['id'];
+				$update['touser'] = $touser;
+				$update['page'] = $page;
+				$update['data'] = $data;
+				$update['form_id'] = $form_id;
+				$update['status'] = 1;
+				$update['emphasis_keyword'] = $emphasis_keyword;
+
+				if (!$update['form_id']) {
+					$update['form_id'] = $this->getFormId($info['project_id'], $update['touser']);
+				}
+
+				if (!$update['form_id']) {
+					return;
+				}
+
+				$where = array();
+				$where['option_msg_id'] = $info['id'];
+				$where['option_touser'] = $update['touser'];
+				//$where['option_data'] = $update['data'];
+				//$where['option_form_id'] = $update['form_id'];
+				$where['option_page'] = $update['page'];
+
+				$id = Dever::upinto('wechat_applet/msg_log', $where, $update);
+
+				Core::run($info['project_id'], 'send_msg', 'msg.sendAction', 'msg.sendLog', 'applet', $id, $state);
+			}
+		}
+	}
+
+	public function submit()
+	{
+		# 立刻发送
+		$id = Dever::input('id');
+		if ($id > 0) {
+			$info = Dever::db('wechat_applet/msg_send')->one($id);
+			if ($info) {
+				$project = explode(',', $info['project_id']);
+				Dever::setInput('key', $info['key']);
+				Dever::setInput('page', $info['page']);
+				$send = $this->getData($info['content']);
+
+				foreach ($project as $k => $v) {
+					Dever::setInput('project_id', $v);
+					$this->sendMul();
+				}
+			}
+		}
+		Dever::alert('提交成功,请到模板消息日志中查看发送记录');
+		return;
+	}
+
+	# 解析data
+	public function getData($data = false)
+	{
+		$send = Dever::input('data');
+		if (!$send && $data) {
+			$send = array();
+			$data = json_decode(base64_decode($data), true);
+			if ($data) {
+				foreach ($data as $k => $v) {
+					$send[$v['key']]['value'] = $v['value'];
+				}
+				$send = json_encode($send, JSON_UNESCAPED_UNICODE);
+				Dever::setInput('data', $send);
+			}
+		}
+		
+		return $send;
+	}
+
+	# 发送多条模板消息 入队
+	public function sendMul()
+	{
+		$key = Dever::input('key');
+		$project_id = Dever::input('project_id');
+		$page = Dever::input('page');
+		$data = Dever::input('data');
+		$emphasis_keyword = Dever::input('emphasis_keyword');
+		if ($project_id > 0 && $key && $page && $data) {
+			# 获取所有拥有formid的openid,并去重
+			$list = Dever::db('wechat_applet/msg_form')->getAllGroupByOpenid(array('option_project_id' => $project_id));
+			if ($list) {
+				Dever::import('queue');
+				foreach ($list as $k => $v) {
+					if ($v['form_id']) {
+						$param = array();
+						$param['key'] = $key;
+						$param['project_id'] = $project_id;
+						$param['touser'] = $v['openid'];
+						$param['page'] = $page;
+						$param['data'] = $data;
+						$param['form_id'] = $v['form_id'];
+						$param['emphasis_keyword'] = $emphasis_keyword;
+						Dever::db('wechat_applet/msg_form')->delete($v['id']);
+						Dever::push($param);
+					}
+				}
+			}
+		}
+
+		return 'ok';
+	}
+
+	# 发送多条模板消息 出队 每小时执行一次
+	public function cron()
+	{
+		Dever::import('queue');
+		$state = true;//同步发送
+		$total = 100;
+		$num = 0;
+		while($num < $total) {
+			$data = Dever::pop();
+			if ($data) {
+				$num++;
+				$state = true;
+				$this->sendOne($data['key'], $data['project_id'], $data['touser'], $data['page'], $data['data'], $data['form_id'], $data['emphasis_keyword'], $state);
+			} else {
+				$num = $total+1;
+			}
+		}
+		return 'ok';
+	}
+
+	public function getFormId($project_id, $openid)
+	{
+		# 获取一个form_id,取最新的100条,然后随机取
+		$info = Dever::db('wechat_applet/msg_form')->getAll(array('option_openid' => $openid, 'option_project_id' => $project_id));
+		if ($info) {
+			$key = array_rand($info, 1);
+			$info = $info[$key];
+			Dever::db('wechat_applet/msg_form')->delete($info['id']);
+			return $info['form_id'];
+		} else {
+			return false;
+		}
+	}
+
+	# 记录form_id 之后加上清理过期的form_id 七天过期
+	public function write_form_id()
+	{
+		$id = Dever::input('project_id');
+		if ($id > 0) {
+			$update = array();
+			$update['project_id'] = $id;
+			$update['form_id'] = Dever::input('form_id');
+			$update['openid'] = Dever::input('openid');
+
+			$where = array();
+			$where['option_openid'] = $update['openid'];
+			$where['option_project_id'] = $update['project_id'];
+			$where['option_form_id'] = $update['form_id'];
+
+			$id = Dever::upinto('wechat_applet/msg_form', $where, $update);
+		}
+
+		return 'ok';
+	}
+
+	public function sendAction($id)
+	{
+		$info = Dever::db('wechat_applet/msg_log')->one($id);
+		if ($info) {
+			$msg = Dever::db('wechat_applet/msg')->one($info['msg_id']);
+			$info['template_id'] = $msg['template_id'];
+			if ($info['data']) {
+				$info['data'] = json_decode($info['data'], true);
+			}
+			return $info;
+		} else {
+			die;
+		}
+	}
+
+	public function sendLog($project_id, $data, $id = false)
+	{
+		$info = Dever::db('wechat_applet/msg_log')->one($id);
+		if ($info) {
+			$update['where_id'] = $info['id'];
+			$update['result'] = json_encode($data);
+			if ($data['errmsg'] == 'ok') {
+				$update['status'] = 2;
+			} else {
+				$update['status'] = 3;
+			}
+			$update['num'] = $info['num'] + 1;
+			Dever::db('wechat_applet/msg_log')->update($update);
+		}
+	}
+
+
+	# 同步微信消息模板到本地
+	public function sync()
+	{
+		$project = Dever::db('token/project')->state(array('option_type' => 3));
+		if ($project) {
+			foreach ($project as $k => $v) {
+				Core::run($v['id'], 'get_msg', '', 'msg.load', 'applet');
+			}
+		}
+
+		return 'ok';
+	}
+
+	public function load($project_id, $data, $param = false)
+	{
+		if (isset($data['list']) && $data['list']) {
+			foreach ($data['list'] as $k => $v) {
+				$update = array();
+				$update['project_id'] = $project_id;
+				$update['template_id'] = $v['template_id'];
+				$update['content'] = $v['content'];
+				$update['name'] = $v['title'];
+				$update['example'] = $v['example'];
+				$id = Dever::upinto('wechat_applet/msg', array('option_project_id' => $project_id, 'option_template_id' => $v['template_id']), $update);
+			}
+		}
+		return array();
+	}
+}

+ 160 - 0
src/Total.php

@@ -0,0 +1,160 @@
+<?php
+/*
+|--------------------------------------------------------------------------
+| 统计信息
+|--------------------------------------------------------------------------
+*/
+namespace Wechat_applet\Src;
+
+use Dever;
+use Token\Lib\Wechat;
+use Token\Lib\Core;
+
+class Total
+{
+    public function getBase()
+    {
+        $day = Dever::input('day', date('Y-m-d', time()-86400));
+        $project = Dever::input('project');
+        $where = array();
+        $where['day'] = $day;
+        $where['project_id'] = $project;
+
+        $info = Dever::db('wechat_applet/total_base')->getData($where);
+
+        return $info;
+    }
+
+    # 获取基本统计信息:概况趋势和访问趋势
+    private function base($project)
+    {
+        $day = Dever::input('day', date('Y-m-d', time()-86400));
+
+        $wechat = new Wechat($project, 'applet');
+
+        $param['begin_date'] = $param['end_date'] = str_replace('-', '', $day);
+
+        $result = array();
+
+        $data = $wechat->curl('total_base', $param, false);
+
+        if (isset($data['list'][0])) {
+            $result = $data['list'][0];
+
+            $data = $wechat->curl('total_visit', $param, false);
+
+            if (isset($data['list'][0])) {
+                $result += $data['list'][0];
+            }
+
+            $this->update_base($project['id'], $day, $result);
+        }
+        
+        return $result;
+    }
+
+    # 计划任务
+    public function cron()
+    {
+        $project = $this->getProject();
+        if ($project) {
+            foreach ($project as $k => $v) {
+                if ($v) {
+                    $base = $this->base($v);
+                }
+            }
+        }
+    }
+
+    private function update_base($project, $day, $data)
+    {
+        $update = array();
+        $update['day'] = $day;
+        $update['daynum'] = Dever::maketime($day);
+        $update['project_id'] = $project;
+        $update['session_cnt'] = isset($data['session_cnt']) ? $data['session_cnt'] : 0;
+        $update['visit_pv'] = isset($data['visit_pv']) ? $data['visit_pv'] : 0;
+        $update['visit_uv'] = isset($data['visit_uv']) ? $data['visit_uv'] : 0;
+        $update['visit_uv_new'] = isset($data['visit_uv_new']) ? $data['visit_uv_new'] : 0;
+        $update['stay_time_uv'] = isset($data['stay_time_uv']) ? $data['stay_time_uv'] : 0;
+        $update['stay_time_session'] = isset($data['stay_time_session']) ? $data['stay_time_session'] : 0;
+        $update['visit_depth'] = isset($data['visit_depth']) ? $data['visit_depth'] : 0;
+        $update['visit_total'] = isset($data['visit_total']) ? $data['visit_total'] : 0;
+        $update['share_pv'] = isset($data['share_pv']) ? $data['share_pv'] : 0;
+        $update['share_uv'] = isset($data['share_uv']) ? $data['share_uv'] : 0;
+        $update['rand'] = Dever::id();
+
+        $where = array();
+        $where['rand'] = Dever::id();
+        $where['day'] = $update['day'];
+        $where['project_id'] = $update['project_id'];
+
+        $info = Dever::db('wechat_applet/total_base')->one($where);
+        if (!$info) {
+            $id = Dever::db('wechat_applet/total_base')->insert($update);
+        } else {
+            $id = $info['id'];
+            $update['where_id'] = $id;
+            Dever::db('wechat_applet/total_base')->update($update);
+        }
+    }
+
+    private function getProject()
+    {
+        $where['type'] = Dever::config('wechat', 'applet')->type;
+        $project = Dever::db('token/project')->state($where);
+        return $project;
+    }
+
+    /**
+     * 导出
+     *
+     * @return mixed
+     */
+    public function out()
+    {
+        $applet = $this->getProject();
+
+        $day = Dever::input('day');
+        if (!$day) {
+            $day = date('Y-m-d', time()-3600*24);
+        }
+        $data = Dever::db('wechat_applet/total_base')->state(array('day' => $day));
+
+        $i = 0;
+        foreach ($data as $k => $v) {
+            $data[$k]['applet'] = $applet[$data[$k]['project_id']]['name'];
+
+            if ($data[$k]['applet']) {
+                $body[$i] = array
+                (
+                    $data[$k]['applet'],
+                    $data[$k]['session_cnt'],
+                    $data[$k]['visit_pv'],
+                    $data[$k]['visit_uv'],
+                    $data[$k]['visit_uv_new'],
+                    $data[$k]['visit_total'],
+                    $data[$k]['share_pv'],
+                    $data[$k]['share_uv'],
+                    $data[$k]['stay_time_uv'],
+                    $data[$k]['stay_time_session'],
+                    $data[$k]['visit_depth'],
+                );
+                $i++;
+            }
+        }
+        $header = array
+        (
+            '小程序名称', '打开次数', '访问次数', '访问人数', '新用户数', '总用户数', '转发次数', '转发人数', '人均停留时长', '次均停留时长', '平均访问深度'
+        );
+
+        $file = $day . '_小程序每日概览';
+        if (Dever::input('test')) {
+            print_r($header);
+            print_r($body);die;
+        }
+        
+        Dever::excelExport($body, $header, $file, $sheet = 0, $sheetName = $day);
+        return;
+    }
+}