微擎框架基本操作

公众平台说明

公众号分为个人(只能申请订阅号,不可认证)和企业(服务号、订阅号,可认证),订阅号每天可发文章,在订阅列表中,服务号1个月4篇文章,在微信列表,权限、功能更强大。未认证的订阅号很多接口无法对接,比如支付,不仅要认证还要申请支付通道。

企业微信一般是针对企业内部管理的。

同一个人的小程序和公众号的appid是性质一样,都是applicationidentification,但他们两者之间的APP ID号是不同,每个公众平台账号都有一个单独的APP ID,就像身份证号码一样,具有唯一性。

微擎简介

微擎是一款小程序和公众号管理系统,可以实现微信平台(mp.weixin.qq.com)不能实现的功能,例如商城,餐饮,酒店,汽车,门店,同城,各类行业解决方案,营销,推广,吸粉,游戏,物联网和人工智能等功能。

1:系统百分百开源,方便二次开发。
2:软件和数据保存在自己的服务器上,使用的自己的域名,安全性较高。
3:微擎分为付费版和免费版,全方面覆盖企业商业运营和个人测试使用需求。
4:基于目前最流行的WEB2.0的架构(php+mysql),运行环境推荐使用linux(centOS)+ nginx + php5.3,mysql5.6。
5:微擎拥有开发者认证机制,上万开发团队基于微擎系统开发插件,用户可以直接购买这类插件,无需再次开发,降低成本。

已经安装微擎系统的用户可以在应用商城(s.we7.cc)购买自己所需要的插件,这类插件可以广泛的应用在小程序,公众号,PC网页,前台模板,微站模板等

微擎MVC

使用的是微擎系统,按照微擎语法来使用

所有模板缓存均被解析成php文件存放在./data/tpl中, 以 “模板标示符.tpl.php”形式保存。

在开发模块时模块内部应该使用 $this->template() 函数

1
2
$_GPC 全局请求变量, 获取 $GET, $POST, $_COOKIES 中的变量
$_W(大写W),是系统中最为重要的全局变量,微擎系统中很多常用的数据都存储在这个变量之中

同一个微信号appid是唯一的,对应同一个小程序中openid是唯一的。

$_w的相关数据查询

参考链接:

https://blog.csdn.net/minato_wdz/article/details/78420624

M:

位于 framework/model 目录下,每一个文件代表一个独立的功能模型,模型通常会与控制器对应。加载模型时以可使用 [load() 函数](

V:

位于 [web|app]/themes/default/ 中,模板文件与 controller, action 对应,系统提供了简单的模板引擎机制,具体请参看[模板引擎](

C:

1
控制器以文件夹、文件的形式组织,位于系统的 source 目录下,每一个目录代表一个 controller ,文件夹中的每个文件即为一个 action(参数a)。某些情况,一个action可能可能会包含多个操作,系统中提供 do参数来用于区分同一个 action 中的不同操作(细分的控制器名) 。

即控制器位于source/controller,每个controller称为一个action,一个controller包括a参数和do参数来规定它的行为

微擎目录结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
addons:模块安装目录
api:外部接口文件
app:控制微信访问的部分控制器
attachment:用户上传文件目录
data:日志、缓存
errpage:错误跳转页面(404等等)
framework:框架核心文件(包括function/class/modul)
payment:支付代码
web:web端公共文件、控制器、资源、后台前端页面等

api.php:公众号、站点接口文件
index.php:首页指向引导文件
install.php:安装文件,建议安装后删除
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
├─ framework 
│ ├─ builtin ……………………………………【微擎内建模块,很少用】 
│ │ ├─ basic 文字回复模块 
│ │ ├─ core 会话消息统计 
│ │ ├─ cover 通用封面回复 
│ │ ├─ default 默认回复模块 
│ │ ├─ music 音乐回复模块 
│ │ ├─ news 图文回复模块 
│ │ ├─ userapi 自定义接口回复模块(此处的模块目录结构和addons区别不大) 
│ │ │ ├─ api 功能文件目录 
│ │ │ │ ├─ baike.php 百科 
│ │ │ │ ├─ calendar.php 万年历 
│ │ │ │ ├─ express.php 快递 
│ │ │ │ ├─ news.php 新闻 
│ │ │ │ ├─ translate.php 翻译 
│ │ │ │ ├─ weather.php 天气 
│ │ │ │ └─ … 可模仿其他文件做扩展 
│ │ └─ … . 
│ ├─ class ………………………………………… 工具类(可以在里面加自己定义的函类文件,比较常用) 
│ │ ├─ loader.class.php 文件加载器 
│ │ ├─ db.class.php 数据库操作类 
│ │ ├─ account.class.php 公众号业务操作基类 
│ │ ├─ weixin.account.class.php 微信公众号业务操作(微信开发文档中的接口,都在此被封装为了函数 例如:数据统计、消息群发、素材上传发送等等) 
│ │ ├─ yixin.account.class.php 易信 
│ │ └─ … . 
│ ├─ function …………………………………… 工具函数(可以在里面加自己定义的函数,比较常用) 
│ │ ├─ global.func.php 全局通用函数 
│ │ ├─ cache.file.func.php 文件缓存 
│ │ ├─ cache.func.php 缓存功能 
│ │ ├─ cache.memcache.func.php 插件缓存 
│ │ ├─ cache.mysql.func.php mysql缓存 
│ │ ├─ communication.func.php http 通信(ihttp_request函数等) 
│ │ ├─ compat.biz.func.php 兼容函数(业务功能) 
│ │ ├─ compat.func.php 兼容函数(逻辑功能) 
│ │ ├─ file.func.php 文件操作 
│ │ ├─ logging.func.php 日志记录 
│ │ ├─ pdo.func.php 数据库访问操作 
│ │ ├─ db.func.php 数据库信息相关操作 
│ │ └─ tpl.func.php 自定义模板控件 
│ ├─ library ……………………………………… 其他函数库 
│ ├─ model ………………………………………… 业务功能模块(主要是微擎框架本身来调用,一般用不到) 
│ │ ├─ account.mod.php 公众号相关操作 
│ │ ├─ activity.mod.php 营销活动 
│ │ ├─ app.mod.php APP 端相关操作 
│ │ ├─ cache.mod.php 缓存 
│ │ ├─ cloud.mod.php 云服务 
│ │ ├─ extension.mod.php 扩展功能 
│ │ ├─ mc.mod.php 会员功能 
│ │ ├─ module.mod.php 公众号 
│ │ ├─ payment.mod.php 支付功能 
│ │ ├─ reply.mod.php 规则回复 
│ │ ├─ setting.mod.php 读写系统设置缓存 
│ │ ├─ user.mod.php 操作用户 
│ │ └─ utility.mod.php 
│ ├─ bootstrap.inc.php 核心文件 
│ ├─ const.inc.php 全局常量定义文件 
│ └─ version.inc.php 版本号 信息定义文件

bootstrap.inc.php 文件:$_W、$_GPC数组数据收集就是从这开始的 。还有个常用的:53行代码:define('DEVELOPMENT', $_W['config']['setting']['development'] == 1); 改为0,就是开发者模式。 
有时出错,页面出现空白, 此处改为开发者模式的话,就会出现报错信息了。 
此文件中也有常量、路径等定义。
还有一些公用的方法在web/common 文件夹内
微擎封装好的message、url、checklogin、checkaccount、buildframes等方法在common.fun.php文件内. 
封装的tpl_*** 函数,比如上传图片、富文本编辑器。。。函数在tpl.func.php文件内. 
微擎的框架信息文件为 frames.inc.php

参考链接:https://blog.csdn.net/qq_39702981/article/details/82788225

微擎模板中的语法:

变量输出-{$var}

等同于<?php echo $var;?>,使用花括号包含的变量将直接输出至页面

支持直接输出数组元素或嵌套数组元素

{$row['name']} {$_W['member']['username']}

一般情况模板引擎能自动识别 javascript 中的花括号和变量输入的花括号. 如果遇到程序不能自动分辨的情况可以强制使用 “” 符号来代表 “}”

条件语法 - {if condition}{/if}

1
2
3
4
5
6
if与逻辑运算符 
{if $row['flag'] =='-1'&& $row['role']!= 'admin'}被禁用{/if}
使用 {else} 来扩充条件判断, 例如:
{if $row['role'] == 'admin'} 管理员 {else} 普通用户 {/if}
可以使用 {else if condition} 来进行多个条件的判断, 例如:
{if $row['role'] == 'founder'} 创始人 {else if $row['role'] == 'admin'} 管理员 {else} 普通用户 {/if}

循环语法 - {loop $list $row}

1
2
3
4
使用循环语法 遍历某个集合的内容. 示例:
{loop $wechats $wechat} <li>Name: {$wechat['name']}</li> {/loop}
使用扩展的语法 {$loop $list $key $wechat} 来遍历集合的键名和键值, 例如:
{loop $wechats $weid $wechat} <li>Id: {$key}; Name: {$wechat['name']}</li> {/loop}

模板嵌套 - {template $name}

在模板的当前位置嵌入另一个模板, 例如: 使用 {template common/header} 来嵌入标准页头.

PHP语法嵌入 - {php statement}

使用 PHP 语法嵌入标记, 例如:

{php echo date('Y-m-d H:i:s', $row['dateline']);}

数据获取标签

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
{data module="" func="" return="" item="" limit="" assign=""}{/data}


func - 指定获取数据的函数,此函数定义在模块目录下的model.php文件中
module - 指定获取数据的模块。
assign - 指定该标签得到数据后,存入的变量名称。如果为空则存在与func同名的变量中,方便在下方的代码中使用。
item - 指定循环体内的迭代时的变量名。相当于
foreach ($foo as $i => $row)中 $row变量。

limit - 指定获取变量时条数。
return - 为true时,获取到数据后直接循环输出,为false时,获取到数据后作为变量返回。默认为false

目前支持的获取数据func
{data func="site*slide*search"} 获取微站幻灯片
获取出4条幻灯片数据,示例:
{data module="" func="site_slide_search" return="" item="row" limit="4"} <li>Name: {$row['name']}</li> {/data}

{data func="site_article" cid=$cid return="true" assign="result" iscommend="true" ishot="true"}
说明: 根据当前分类$cid获取文章列表,把数据存放在result变量中。此数组中包含list数据和pager数据,iscommend 表示推荐文章,ishot表示热门文章。此标签可同时使用,也可单个使用。示例:
{data module="site" func="site_article" cid=$cid return="true" assign="result"}
{loop $result['list'] $row} <li><a href="{$row['url']}">{$row['title']}</a></li> {/loop} {$result['pager']}`

{data func="site_category" parentid="0"}
说明:获取当前分类列表,parentid指定获取某个分类的子类。parentid为0是则获取所有的父分类,默认是获取全部分类,示例:
{data module="site" func="site_category"}{$row['name']}{loop $row['children'] $item}{$item['name']}{/loop}{/data}

参考链接:http://www.360doc.com/content/19/0726/15/65525851_851144335.shtml

微擎sql调用:

引号:

1
2
3
4
5
- 在能使用单引号的情况下,禁止使用双引号。
- 字符串为固定值,不包含换号、制表等特殊转义时,需使用单引号。
- 字符串作为数据索引时,需使用单引号。
- 字符串不需要带入变量,需使用单引号。
- 数据库SQL语句中,所有数据必须加单引号,无论数值还是字串,以避免可能的注入漏洞和SQL错误。

SQL查询:

1
2
3
4
5
- 所有数据库查询时,尽量使用封装的 pdo_getXXX 系列函数,如果无法满足再考虑书写SQL语句使用 pdo_fetchXXX 系列函数
- 所有SQL查询关键字大写,方便代码审查
- 所有SQL对象(表名,字段名,索引名等)必须用反引号包括
- 所有编码参数查询,必须使用PDO的参数绑定机制处理
- 不能绑定参数处理的查询,必须处理好变量检测及字符串转义

SQL操作

增:int | boolean

1
2
3
4
pdo_insert($tablename, $data = array(), $replace = false)
//案例
$arr=['name'=>'英语' ];
$result = pdo_insert('health_moniter_category', $arr, false);

删:int | boolean

1
2
3
4
pdo_delete($tablename, $condition = array(), $glue = 'AND')
//例句
$result = pdo_delete('health_moniter_category', array('id'=>3));
var_dump($result)

改:array | boolean

1
2
3
pdo_update($tablename, $data = array(), $condition, $glue = 'AND')
//例句
$result = pdo_update('health_moniter_category', array('name'=>'web编程'), array('id'=>1));

查:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
查单条:array | boolean
pdo_get($tablename, $condition = array(), $fields = array());
//例如
$result = pdo_get('health_moniter_course', array('id'=>1), array());
占位符:
$chat=pdo_fetch("SELECT * FROM" . tablename('longbing_card_chat') .
"WHERE user_id=:user_id AND target_id=:target_id OR user_id=:target_id
AND target_id=:user_id",[':user_id'=>$uid,':target_id'=>$_GPC['to_uid']])

查多条:array | boolean
pdo_getall($tablename, $condition = array(), $fields = array(), $keyfield = '',$orderby = array(), $limit = array());
//例句
$user1 = pdo_getall('users', array('status' => 1), array() , '' , 'uid DESC' , array(1,10));
fetchall:
$save_count = "SELECT COUNT(id) as `count` FROM " . tablename('longbing_card_count') . " WHERE (uniacid = {$uniacid} && sign = 'copy' && `type` = 2) OR (uniacid = {$uniacid} && sign = 'copy' && `type` = 1) GROUP BY user_id";
$save_count = pdo_fetchall($save_count);

查多表:
$sql="SELECT cou.*,cate.* FROM ims_health_moniter_course as cou inner JOIN ims_health_moniter_category as cate on (cou.category = cate.id)";
$result = pdo_fetchall($sql);
var_dump($result);

餐饮添加营销短信菜单,对应控制器、视图和短信模板,及修正万能门店会员分页sql使用错误

参考链接:http://s.w7.cc/index.php?c=wiki&do=view&id=1&list=173