//微擎 开发一个便利店
步骤一. 需求分析
首先,你要明确你做的模块包含什么功能。
- 便利店管理 — (store)
- 商品管理 — (goods)
- 客户管理 — (customers)
- 订单管理 — (orders)
- 购物车与支付 — (cart)
- 统计功能 — (statistics) (待续…)
步骤二. 设计新模块
开始设计新模块前,你要知道通过你的模块用户能干什么, 并起一个很棒的英文名字.
操作用户能干什么 | 微信用户能干什么 | |
---|---|---|
1. 管理便利店 (store) | 1. 逛便利店 (store) | |
2. 管理商品 (goods) | 2. 查看购物车 (cart) | |
3. 管理订单 (order) | 3. 查看订单 (order) | |
4. 管理客户 (customer) | 4. 付款 (pay) |
先给模块起个名字吧:we7_store (便利店)
注意 : 模块标识必须小写
好了,接下来要设计模块了。
设计模块的相关内容
【设计新模块】 - 【便利店】
模块基本信息 | ||||
---|---|---|---|---|
模块名称 | 便利店 | |||
模块标识 | we7_store | |||
版本 | 1.0 | |||
模块类型 | 主要业务 | |||
模块简述 | 一个简单的便利店 | |||
模块介绍 | 教初学者如何快速开发一个微擎模块. | |||
作者 | Gorden | |||
发布页 | http://bbs.we7.cc/ | |||
设置项 | ? 存在全局设置项 | |||
公众平台消息处理选项 | ||||
订阅的消息类型 | ? 文本消息(重要) | |||
直接处理的类型 | ? 文本消息(重要) | |||
是否要嵌入规则 | ? 需要嵌入规则 | |||
微站功能绑定 | ||||
项目名称 | 操作名称 | 入口标识 | 操作附加数据 | 无需登录直接展示 |
功能封面 | 便利店首页 | store | ? | |
管理中心导航菜单 | 商品管理 | goods | ? | |
订单管理 | orders | ? | ||
微站首页导航图标 | 便利店首页 | store | ? | |
微站个人中心导航 | 便利店订单 | orders | ? | |
微站快捷功能导航 | 便利店订单 | orders | ? | |
模块发布 | ||||
兼容的微擎版本 | ? WeEngine 0.6 | |||
模块缩略图 | icon.jpg | |||
模块封面 | preview.jpg | |||
模块安装脚本 | ||||
模块卸载脚本 | ||||
模块升级脚本 |
生成源代码预览
--
步骤三. 创建表(SQL语句)
你可以使用控制台或手动书写 SQL 语句来创建模块相关表。
因为模块与统一公众号相关,所以所有表结构里均与 $uniacid 相关.
随着模块的开发可能会随时变动数据表结构.
-- phpMyAdmin SQL Dump -- version 4.1.6 -- http://www.phpmyadmin.net -- -- Host: 127.0.0.1 -- Generation Time: 2014-11-14 10:53:34 -- 服务器版本: 5.6.16 -- PHP Version: 5.5.9 SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; SET time_zone = "+00:00"; -- -- Database: `we7_pro` -- -- -------------------------------------------------------- -- -- 表的结构 `ims_we7_store_cart` -- CREATE TABLE IF NOT EXISTS `ims_we7_store_cart` ( `id` INT(11) NOT NULL AUTO_INCREMENT COMMENT ‘主键‘, `goodsid` INT(10) UNSIGNED NOT NULL COMMENT ‘商品编号‘, `uid` INT(10) UNSIGNED NOT NULL COMMENT ‘微信会员‘, `uniacid` INT(10) UNSIGNED NOT NULL, `createtime` INT(10) UNSIGNED NOT NULL COMMENT ‘加入购物车时间‘, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; -- -------------------------------------------------------- -- -- 表的结构 `ims_we7_store_category` -- CREATE TABLE IF NOT EXISTS `ims_we7_store_category` ( `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT ‘分类id‘, `name` VARCHAR(30) NOT NULL COMMENT ‘类名‘, `orderno` INT(10) UNSIGNED NOT NULL COMMENT ‘排序‘, `uniacid` INT(11) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; -- -------------------------------------------------------- -- -- 表的结构 `ims_we7_store_goods` -- CREATE TABLE IF NOT EXISTS `ims_we7_store_goods` ( `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT ‘主键‘, `sn` VARCHAR(30) NOT NULL COMMENT ‘条码‘, `name` VARCHAR(50) NOT NULL COMMENT ‘品名‘, `price` DECIMAL(10,2) NOT NULL DEFAULT ‘0‘ COMMENT ‘价格‘, `cost` DECIMAL(10,2) NOT NULL COMMENT ‘成本价‘, `quantity` INT(11) NOT NULL, `uniacid` INT(10) UNSIGNED NOT NULL COMMENT ‘统一公众号‘, `createtime` INT(10) UNSIGNED NOT NULL COMMENT ‘添加日期‘, `status` INT(11) NOT NULL COMMENT ‘1:下架, 2: 上架‘, `categoryid` INT(11) NOT NULL COMMENT ‘分类 id‘, PRIMARY KEY (`id`), KEY `sn` (`sn`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT=‘商品表‘ AUTO_INCREMENT=1 ; -- -------------------------------------------------------- -- -- 表的结构 `ims_we7_store_items` -- CREATE TABLE IF NOT EXISTS `ims_we7_store_items` ( `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, `orderid` INT(10) UNSIGNED NOT NULL COMMENT ‘订单编号‘, `goodsid` INT(10) UNSIGNED NOT NULL, `name` VARCHAR(30) NOT NULL COMMENT ‘品名‘, `price` DECIMAL(10,2) NOT NULL COMMENT ‘售价‘, `quantity` INT(11) NOT NULL COMMENT ‘购买数量‘, `cost` DECIMAL(10,2) NOT NULL COMMENT ‘实时成本‘, `uniacid` INT(10) UNSIGNED NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; -- -------------------------------------------------------- -- -- 表的结构 `ims_we7_store_orders` -- CREATE TABLE IF NOT EXISTS `ims_we7_store_orders` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `uid` INT(10) UNSIGNED NOT NULL, `uniacid` INT(10) UNSIGNED NOT NULL, `sn` VARCHAR(30) NOT NULL, `amount` DECIMAL(10,2) NOT NULL COMMENT ‘金额合计‘, `province` VARCHAR(30) NOT NULL, `city` VARCHAR(30) NOT NULL, `district` VARCHAR(30) NOT NULL, `createtime` INT(10) UNSIGNED NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; -- -------------------------------------------------------- -- -- 表的结构 `ims_we7_store_user` -- CREATE TABLE IF NOT EXISTS `ims_we7_store_user` ( `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, `uid` INT(10) UNSIGNED NOT NULL, `uniacid` INT(10) UNSIGNED NOT NULL, `total` DECIMAL(10,2) NOT NULL COMMENT ‘消费总金额‘, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
步骤四. 安装模块
建表完成后 需要安装模块
步骤五. 功能开发(核心)
【module.php】 - 【参数设置】 | ||
---|---|---|
settingsDisplay($settings) | 参数设置 | 设置便利店信息 |
【site.php】 - 【doWeb(后台)】 | ||
doWebCategory() | 商品分类 | 设置商品分类信息 (学会如何手动添加链接入口到管理中心菜单) |
doWebGoods() | 商品管理 | 设置商品信息 |
doWebOrders() | 订单管理 设置直接访问(direct = true) |
订单信息查询 |
【site.php】 - 【doMobile(微站)】 | ||
doMobileStore() | 便利店首页 | 商品列表, 商品加入购物车 |
doMobileCart() | 购物车 | 购物车商品查看与结算生成订单 |
doMobileOrders() | 我的订单 | 订单列表查看与付款(未完成) |
doMobilePay() | 付款 | 付款(未完成) |
【module.php】 - 【规则定义】 | ||
fieldsFormDisplay() | 编辑规则时附加表单展示 | |
fieldsFormValidate() | 编辑规则时附加表单验证 | |
fieldsFormSubmit() | 保存规则时附加表单保存 | |
ruleDeleted() | 卸载模块时清理数据 | |
【processor.php】 - 【消息处理器】 | ||
respond() | 消息处理器 | 实际处理消息 |
【receiver.php】 - 【消息订阅器】 | ||
receive() | 消息订阅器 | |
【manifest.xml】 - 【设置直接访问(direct)】 | ||
<entry … direct=“true” /> | Web 端 | |
App 端 | ||
【site.php】 - call - 【扩展菜单】 | ||
<bindings> <[menu|home|profile|shortcut] call=“func”> |
binding - Xxx - call |
1.参数设置
【便利店】 - 参数设置
settingsDisplay()
1. 功能说明
- 对每一个统一公号分别独立保存模块信息,(如:每个统一公号经营一个便利店, 便利店信息要独立保存.)
- 此处参数保存不需要单独建表
- settingsDisplay() 方法用来控制 参数设置 的页面展示与表单提交.
- 系统将自动读取参数设置为 $settings 变量
- 通过 include $this→template(‘setting‘); 来调用后台管理模板 template/setting.html
- $settings, $_W, $_GPC 等变量可在调用的模板中使用
- 此处将设置便利店基本信息(表单字段)
- 名称 — ( name )
- logo — ( logo )
- 联系人 — ( linkman )
- 电话 — ( phone )
- 地址 — ( address )
- 介绍 — ( description )
HTML 知识点
{template ‘common/header‘} <div class="main"> <form action="" method="post" class="form-horizontal form" id="setting-form"> <div class="panel panel-default"> <div class="panel-heading">便利店信息</div> <div class="panel-body"> <div class="form-group"> <label class="col-xs-12 col-sm-3 col-md-2 col-lg-2 control-label">名称</label> <div class="col-sm-8"> <input type="text" name="data[name]" class="form-control" value="{$settings[‘name‘]}" /> </div> </div> <div class="form-group"> <label class="col-xs-12 col-sm-3 col-md-2 col-lg-2 control-label">徽标图案</label> <div class="col-sm-8"> {php echo tpl_form_field_icon(‘data[icon]‘, $settings[‘icon‘]);} </div> </div> <div class="form-group"> <label class="col-xs-12 col-sm-3 col-md-2 col-lg-2 control-label">徽标颜色</label> <div class="col-sm-8"> {php echo tpl_form_field_color(‘data[color]‘, $settings[‘color‘]);} </div> </div> <div class="form-group"> <label class="col-xs-12 col-sm-3 col-md-2 col-lg-2 control-label">品牌图片</label> <div class="col-sm-8"> {php echo tpl_form_field_image(‘data[logo]‘, $settings[‘logo‘]);} </div> </div> <div class="form-group"> <label class="col-xs-12 col-sm-3 col-md-2 col-lg-2 control-label">品牌宣传</label> <div class="col-sm-8"> {php echo tpl_form_field_multi_image(‘data[pics]‘, $settings[‘pics‘]);} </div> </div> <div class="form-group"> <label class="col-xs-12 col-sm-3 col-md-2 col-lg-2 control-label">单音频</label> <div class="col-sm-8"> {php echo tpl_form_field_audio(‘data[audio]‘, $settings[‘audio‘]);} </div> </div> <div class="form-group"> <label class="col-xs-12 col-sm-3 col-md-2 col-lg-2 control-label">多音频</label> <div class="col-sm-8"> {php echo tpl_form_field_multi_audio(‘data[multiaudio]‘, $settings[‘multiaudio‘]);} </div> </div> <div class="form-group"> <label class="col-xs-12 col-sm-3 col-md-2 col-lg-2 control-label">注册日期</label> <div class="col-sm-8"> {php echo tpl_form_field_date(‘data[registerdate]‘, $settings[‘registerdate‘]);} </div> </div> <div class="form-group"> <label class="col-xs-12 col-sm-3 col-md-2 col-lg-2 control-label">营业时间</label> <div class="col-sm-8"> {php echo tpl_form_field_daterange(‘data[businesshours]‘, $settings[‘businesshours‘], true);} </div> </div> <div class="form-group"> <label class="col-xs-12 col-sm-3 col-md-2 col-lg-2 control-label">地址</label> <div class="col-sm-8"> {php echo tpl_form_field_district(‘data[address]‘, empty($settings[‘address‘]) ? array() : $settings[‘address‘]);} </div> </div> <div class="form-group"> <label class="col-xs-12 col-sm-3 col-md-2 col-lg-2 control-label">地理位置</label> <div class="col-sm-8"> {php echo tpl_form_field_coordinate(‘data[map]‘, $settings[‘map‘]);} </div> </div> <div class="form-group"> <label class="col-xs-12 col-sm-3 col-md-2 col-lg-2 control-label">行业</label> <div class="col-sm-8"> {php echo tpl_form_field_industry(‘data[industry]‘, $settings[‘industry‘][‘parent‘], $settings[‘industry‘][‘child‘]);} </div> </div> <div class="form-group"> <label class="col-xs-12 col-sm-3 col-md-2 col-lg-2 control-label">联系人</label> <div class="col-sm-8"> <input type="text" name="data[linkman]" class="form-control" value="{$settings[‘linkman‘]}" /> </div> </div> <div class="form-group"> <label class="col-xs-12 col-sm-3 col-md-2 col-lg-2 control-label">联系电话</label> <div class="col-sm-8"> <input type="text" id="phone" name="data[phone]" class="form-control" value="{$settings[‘phone‘]}"> </div> </div> <div class="form-group"> <label class="col-xs-12 col-sm-3 col-md-2 col-lg-2 control-label">所在地址</label> <div class="col-sm-8"> <input type="text" id="address" name="data[detailedaddress]" class="form-control" value="{$settings[‘detailedaddress‘]}"> </div> </div> <div class="form-group"> <label class="col-xs-12 col-sm-3 col-md-2 col-lg-2 control-label">便利店介绍</label> <div class="col-sm-8"> <textarea style="height:200px;" id="description" name="data[description]" class="form-control description" cols="60">{$settings[‘description‘]}</textarea> </div> </div> <div class="form-group"> <div class="col-xs-12 col-sm-9 col-md-10 col-lg-10 col-sm-offset-3 col-md-offset-2 col-lg-offset-2"> <input name="submit" type="submit" value="提交" class="btn btn-primary" /> <input type="hidden" name="token" value="{$_W[‘token‘]}" /> </div> </div> </div> </div> </form> </div> <script> require([‘jquery‘, ‘util‘], function($, util){ $(function(){ $(‘#setting-form‘).submit(function(){ var result = true; if($(‘input[name="data[name]"]‘).val() == ‘‘){ result = false; util.message(‘未填写便利店名称.‘); } if($(‘input[name="data[logo]"]‘).val() == ‘‘){ result = false; util.message(‘未填加便利店LOGO.‘); } if($(‘input[name="data[linkman]"]‘).val() == ‘‘){ result = false; util.message(‘未填写便利店联系人.‘); } if($(‘input[name="data[phone]"]‘).val() == ‘‘){ result = false; util.message(‘未填写便利店联系电话.‘); } if($(‘input[name="data[address]"]‘).val() == ‘‘){ result = false; util.message(‘未填写便利店地址.‘); } return result; }); }); }); </script> {template ‘common/footer‘}
使用 Bootstrap CSS 3 | 使你的模块页面美观并与微擎系统风格保持一致. | |
{$settings[‘name‘]} |
模板中使用 {$var} 来输出变量. 详情请参阅 模板语法. | |
2 |
<input type="text" name="date[name]" class="form-control" value="{$settings[‘name‘]}" /> <input type="text" name="date[phone]" class="form-control" value="{$settings[‘phone‘]}" /> |
表单名称使用如: name=“date[name]“ 数组的形式, 提交表单时, 可以将表单值打包 后台 PHP 代码通过 $date = $_GPC[‘date‘]; 来获取所有打包的表单值; 否则,你将不得不一个一个获取表单值. |
<form action="" method="post" class="form-horizontal form" id="setting-form"> ... <input type="submit" name="save" value="保存"> <input type="submit" name="confirm" value="确认"> <input type="hidden" name="token" value="{$_W[‘token‘]}" /> </form> |
如果模板中存在多个提交按钮, 后台可以调用checksubmit(‘save‘), checksubmit(‘confirm‘) 来区分提交的 submit 来源 | |
<input type="hidden" name="token" value="{$_W[‘token‘]}" /> |
POST 提交最好加上这行代码, 与 checksubmit()配合使用来验证表单安全. | |
<script> require([‘jquery‘, ‘util‘], function($, util){ $(function(){ $(‘#setting-form‘).submit(function(){ var result = true; if($(‘input[name="date[name]"]‘).val() == ‘‘){ result = false; util.message(‘未填写便利店名称.‘); } return result; }); }); }); </script> |
表单验证 | |
{template ‘common/header‘} <!-- 调用公共模板 web/themes/default/common/header.html --> {template ‘common/footer‘} <!-- 调用公共模板 web/themes/default/common/footer.html --> |
(嵌套)调用模板 | |
{php echo tpl_form_field_image(‘date[logo]‘, $settings[‘logo‘]);} |
调用表单控件 |
3. PHP 知识点
查看 源码
【参数设置】通过 settingsDisplay() 方法, 展示和保存表单. <?php /** * 便利店模块定义 * * @author Gorden * @url http://bbs.we7.cc/ */ defined(‘IN_IA‘) or exit(‘Access Denied‘); class We7_storeModule extends WeModule { public function settingsDisplay($settings) { // 声明为全局才可以访问到. global $_W, $_GPC; // 验证表单来源安全 if(checksubmit()) { // $_GPC 可以用来获取 Cookies,表单中以及地址栏参数 $dat = $_GPC[‘dat‘]; // 验证表单, 通过 message() 方法提示用户操作错误信息 empty($dat[‘name‘]) && message(‘请填写便利店名称‘); empty($dat[‘logo‘]) && message(‘请填写便利店 LOGO‘); empty($dat[‘linkman‘]) && message(‘请填写便利店联系人‘); empty($dat[‘phone‘]) && message(‘请填写便利店联系电话‘); empty($dat[‘address‘]) && message(‘请填写便利店地址‘); empty($dat[‘description‘]) && message(‘请填写便利店介绍‘); //字段验证, 并获得正确的数据$dat if (!$this->saveSettings($dat)) { message(‘保存信息失败‘,‘‘,‘error‘); // 保存失败 } else { message(‘保存信息成功‘,‘‘,‘success‘); // 保存成功 } } // 模板中需要用到 "tpl" 表单控件函数的话, 记得一定要调用此方法. load()->func(‘tpl‘); // 调用模板, 展示参数设置表单 include $this->template(‘setting‘); } }
if(checksubmit()) { // 本例等价为 if(checksubmit(‘submit‘)){} // POST 提交表单后执行此代码. } |
通过 checksubmit($name=‘submit‘) 验证表单是否为 POST 方式,是否需要继续执行。 | |
if(checksubmit(‘save‘)){ // save } if(checksubmit(‘confirm‘)){ // confirm } |
多 submit 表单提交, 可以调用 checksubmit( $submit_name ) 来区分提交的 submit 来源 | |
empty($date[‘name‘]) && message(‘请填写便利店名称‘); |
验证表单, 通过 message() 方法来中断代码执行, 提示用户错误信息并返回到上个访问的页面. 仅限大量逻辑简单的后台字段验证使用 |
|
$date = $_GPC[‘date‘]; $name = $date[‘name‘]; $phone = $date[‘name‘]; |
获取表单值, $_GPC 是由 $_GET, $_POST, $_COOKIES 合并而来 | |
$this->saveSettings($date); |
保存模块设置信息. | |
include $this->template(‘setting‘); |
调用模板文件 “template/setting.html”. | |
load()->func(‘tpl‘); |
如果要在模板中使用 表单控件, 必须调用此方法。 |
4. 界面展示
导航链接
参数设置
步骤六. 发布模块
以下载源码代码为准.
然后
目录 [隐藏]
【便利店】 - 参数设置
settingsDisplay()
1. 功能说明
- 对每一个统一公号分别独立保存模块信息,(如:每个统一公号经营一个便利店, 便利店信息要独立保存.)
- 此处参数保存不需要单独建表
- settingsDisplay() 方法用来控制 参数设置 的页面展示与表单提交.
- 系统将自动读取参数设置为 $settings 变量
- 通过 include $this→template(‘setting‘); 来调用后台管理模板 template/setting.html
- $settings, $_W, $_GPC 等变量可在调用的模板中使用
- 此处将设置便利店基本信息(表单字段)
- 名称 — ( name )
- logo — ( logo )
- 联系人 — ( linkman )
- 电话 — ( phone )
- 地址 — ( address )
- 介绍 — ( description )
HTML 知识点
使用 Bootstrap CSS 3 | 使你的模块页面美观并与微擎系统风格保持一致. | |
{$settings[‘name‘]} |
模板中使用 {$var} 来输出变量. 详情请参阅 模板语法. | |
2 |
<input type="text" name="date[name]" class="form-control" value="{$settings[‘name‘]}" /> <input type="text" name="date[phone]" class="form-control" value="{$settings[‘phone‘]}" /> |
表单名称使用如: name=“date[name]“ 数组的形式, 提交表单时, 可以将表单值打包 后台 PHP 代码通过 $date = $_GPC[‘date‘]; 来获取所有打包的表单值; 否则,你将不得不一个一个获取表单值. |
<form action="" method="post" class="form-horizontal form" id="setting-form"> ... <input type="submit" name="save" value="保存"> <input type="submit" name="confirm" value="确认"> <input type="hidden" name="token" value="{$_W[‘token‘]}" /> </form> |
如果模板中存在多个提交按钮, 后台可以调用checksubmit(‘save‘), checksubmit(‘confirm‘) 来区分提交的 submit 来源 | |
<input type="hidden" name="token" value="{$_W[‘token‘]}" /> |
POST 提交最好加上这行代码, 与 checksubmit()配合使用来验证表单安全. | |
<script> require([‘jquery‘, ‘util‘], function($, util){ $(function(){ $(‘#setting-form‘).submit(function(){ var result = true; if($(‘input[name="date[name]"]‘).val() == ‘‘){ result = false; util.message(‘未填写便利店名称.‘); } return result; }); }); }); </script> |
表单验证 | |
{template ‘common/header‘} <!-- 调用公共模板 web/themes/default/common/header.html --> {template ‘common/footer‘} <!-- 调用公共模板 web/themes/default/common/footer.html --> |
(嵌套)调用模板 | |
{php echo tpl_form_field_image(‘date[logo]‘, $settings[‘logo‘]);} |
调用表单控件 |
3. PHP 知识点
查看 源码
if(checksubmit()) { // 本例等价为 if(checksubmit(‘submit‘)){} // POST 提交表单后执行此代码. } |
通过 checksubmit($name=‘submit‘) 验证表单是否为 POST 方式,是否需要继续执行。 | |
if(checksubmit(‘save‘)){ // save } if(checksubmit(‘confirm‘)){ // confirm } |
多 submit 表单提交, 可以调用 checksubmit( $submit_name ) 来区分提交的 submit 来源 | |
empty($date[‘name‘]) && message(‘请填写便利店名称‘); |
验证表单, 通过 message() 方法来中断代码执行, 提示用户错误信息并返回到上个访问的页面. 仅限大量逻辑简单的后台字段验证使用 |
|
$date = $_GPC[‘date‘]; $name = $date[‘name‘]; $phone = $date[‘name‘]; |
获取表单值, $_GPC 是由 $_GET, $_POST, $_COOKIES 合并而来 | |
$this->saveSettings($date); |
保存模块设置信息. | |
include $this->template(‘setting‘); |
调用模板文件 “template/setting.html”. | |
load()->func(‘tpl‘); |
如果要在模板中使用 表单控件, 必须调用此方法。 |
4. 界面展示
导航链接
参数设置
时间: 2024-10-10 21:12:40