提问交流

提问交流

使用问题咨询
经验分享

经验分享

开发经验交流分享
功能建议

功能建议

官方开发功能建议
BUG反馈

BUG反馈

使用BUG反馈
模块&插件&数据包

模块&插件&数据包

模块插件数据包分享
框架发布

框架发布

【微信】开发模块发布

caiaiqiu 回复了问题 • 22 人关注 • 11 个回复 • 3263 次浏览 • 2018-06-06 09:41 • 来自相关话题

阿里大鱼插件 前台发送验证码 怎么写呢!大神们

ringback 回复了问题 • 4 人关注 • 4 个回复 • 570 次浏览 • 2018-05-22 19:21 • 来自相关话题

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 72 bytes)

打死as 回复了问题 • 2 人关注 • 3 个回复 • 134 次浏览 • 2018-05-17 10:10 • 来自相关话题

如何在后台上传视频

牧鸭人 回复了问题 • 3 人关注 • 2 个回复 • 223 次浏览 • 2018-05-03 13:15 • 来自相关话题

分享一个又拍云上传插件

zxc544 发表了文章 • 2 个评论 • 285 次浏览 • 2018-02-08 14:27 • 来自相关话题

 
仓库地址:
  
ok写不了
 
 
GitHub搜索UpyunForDophinPHP
 
https://github.com/Lsido/UpyunForDophinPHP
 
仓库地址:
  
ok写不了
 
 
GitHub搜索UpyunForDophinPHP
 
https://github.com/Lsido/UpyunForDophinPHP

顶部模块从首页切换到其他模块会很慢

dolphinphp 回复了问题 • 2 人关注 • 1 个回复 • 274 次浏览 • 2018-02-02 09:54 • 来自相关话题

静态页面缓存

dragonlhp 发表了文章 • 0 个评论 • 215 次浏览 • 2018-01-18 16:39 • 来自相关话题

缓存必须要关闭调试模式才能生效
将behavior目录的文件放在common/behavior目录下 再在tags.php的文件中添加return [
// 应用初始化
'app_init' => [],
// 应用开始
'app_begin' => [
'app\\common\\behavior\\ReadHtmlCacheBehavior',// 读取静态缓存
],
// 模块初始化
'module_init' => [],
// 操作开始执行
'action_begin' => [],
// 视图内容过滤
'view_filter' => [
'app\\common\\behavior\\WriteHtmlCacheBehavior',// 写入静态缓存
],
// 日志写入
'log_write' => [],
// 应用结束
'app_end' => [],
];
config.php// +----------------------------------------------------------------------
// | 静态缓存设置
// +----------------------------------------------------------------------
//'配置值'
'html_cache_on' => true, // 开启静态缓存
'html_cache_time' => 7200, // 全局静态缓存有效期(秒)
'html_file_suffix' => '.html', // 设置静态缓存文件后缀
'html_cache_compile_type' => 'file',//缓存存储驱动
'html_cache_rules' => [
// 定义静态缓存规则
// // 定义格式1 数组方式
//'静态地址' => array('静态规则', '有效期', '附加规则'),
//1.任意控制器的任意操作都适用
'cms>' => array('{$_SERVER.REQUEST_URI|md5}', 0),
// //2.任意控制器的md5操作
// 'md5' => array('{:module}/{:controller}/{:action}_{id|md5}'),
// //3.Static控制器的所有操作
// 'Static:' => array('{:module}/{:controller}/{:action}', 50),//第一个参数是构造的字符串,后面是缓存50秒
// //4.Hmtl控制器的md5操作
// 'Html:md5' => array('{:module}/{:controller}/{:action}'),
], 查看全部
缓存必须要关闭调试模式才能生效
将behavior目录的文件放在common/behavior目录下 再在tags.php的文件中添加
return [
// 应用初始化
'app_init' => [],
// 应用开始
'app_begin' => [
'app\\common\\behavior\\ReadHtmlCacheBehavior',// 读取静态缓存
],
// 模块初始化
'module_init' => [],
// 操作开始执行
'action_begin' => [],
// 视图内容过滤
'view_filter' => [
'app\\common\\behavior\\WriteHtmlCacheBehavior',// 写入静态缓存
],
// 日志写入
'log_write' => [],
// 应用结束
'app_end' => [],
];

config.php
// +----------------------------------------------------------------------
// | 静态缓存设置
// +----------------------------------------------------------------------
//'配置值'
'html_cache_on' => true, // 开启静态缓存
'html_cache_time' => 7200, // 全局静态缓存有效期(秒)
'html_file_suffix' => '.html', // 设置静态缓存文件后缀
'html_cache_compile_type' => 'file',//缓存存储驱动
'html_cache_rules' => [
// 定义静态缓存规则
// // 定义格式1 数组方式
//'静态地址' => array('静态规则', '有效期', '附加规则'),
//1.任意控制器的任意操作都适用
'cms>' => array('{$_SERVER.REQUEST_URI|md5}', 0),
// //2.任意控制器的md5操作
// 'md5' => array('{:module}/{:controller}/{:action}_{id|md5}'),
// //3.Static控制器的所有操作
// 'Static:' => array('{:module}/{:controller}/{:action}', 50),//第一个参数是构造的字符串,后面是缓存50秒
// //4.Hmtl控制器的md5操作
// 'Html:md5' => array('{:module}/{:controller}/{:action}'),
],

阿里短信

simone 发表了文章 • 3 个评论 • 662 次浏览 • 2017-10-27 10:08 • 来自相关话题

 
AccessKeyId 与 AccessKeySecret 在阿里云Access Key管理页面获取。
 
短信签名及短信模板 短信服务内申请
 
阿里短信系统升级 现更新源码。
 
使用:
plugin_action('AliyunSms','AliyunSms','sendSms',['phoneNumbers'=>18888888888,'templateParam'=>array('name'=>'test')]);
  查看全部
 
AccessKeyId 与 AccessKeySecret 在阿里云Access Key管理页面获取。
 
短信签名及短信模板 短信服务内申请
 
阿里短信系统升级 现更新源码。
 
使用:
plugin_action('AliyunSms','AliyunSms','sendSms',['phoneNumbers'=>18888888888,'templateParam'=>array('name'=>'test')]);
 

markdown插件

回复

gyh9711 发起了问题 • 2 人关注 • 0 个回复 • 410 次浏览 • 2017-10-26 11:43 • 来自相关话题

后台【两步验证】插件

流风回雪 发表了文章 • 10 个评论 • 775 次浏览 • 2017-10-20 14:39 • 来自相关话题

为了防止网站后台工作人员账号密码意外泄露带来的安全问题(如CSDN事件),可以考虑给后台登录加一个两步验证
 
一、安装
解压附件中的插件到 /plugins 目录修改 application/admin/controller/Admin.php 在 protected function _initialize() 方法的第一行添加代码
/**
* 初始化
* @author 蔡伟明 <314013107@qq.com>
*/
protected function _initialize()
{
// 两步验证钩子
$hook_result = \think\Hook::listen('two_step');
if (!empty($hook_result) && true !== $hook_result[0]) {
$current_url = request()->url(); // 当前 url
if ( // 下面三个 URL 不跳转到两步验证页
strpos ( $current_url , plugin_url('TwoStep/Admin/verification') ) === false && // 两步验证页
strpos ( $current_url , plugin_url('TwoStep/Admin/signin') ) === false && // 验证两步验证码
strpos ( $current_url , url('user/publics/signout') ) === false // 登出账号
){
$this->redirect(plugin_url('TwoStep/Admin/verification'));
}
}
.
.
.
.
.
}
修改 application/admin/controller/Index.php 用下面代码覆盖 public function profile() 方法
/**
* 个人设置
* @author 蔡伟明 <314013107@qq.com>
*/
public function profile()
{
// 保存数据
if ($this->request->isPost()) {
$data = $this->request->post();

$data['nickname'] == '' && $this->error('昵称不能为空');
$data['id'] = UID;

// 如果没有填写密码,则不更新密码
if ($data['password'] == '') {
unset($data['password']);
}

$UserModel = new UserModel();
if ($user = $UserModel->allowField(['nickname', 'email', 'password', 'mobile', 'avatar'])->update($data)) {
// 记录行为
action_log('user_edit', 'admin_user', UID, UID, get_nickname(UID));
$this->success('编辑成功');
} else {
$this->error('编辑失败');
}
}

// 获取数据
$info = UserModel::where('id', UID)->field('password', true)->find();

// 开启两步验证功能
$generate_secret_url = plugin_url('TwoStep/Admin/generateSecret');
$js = <<<EOF
<script type="text/javascript">
$(function(){
$("#is_two_step").change(function() {
if($('#is_two_step').is(':checked')) {
$.get("{$generate_secret_url}", function(res){
if(res.code == 0){
Dolphin.notify(res.msg, 'danger');
$("#is_two_step").removeAttr("checked");
} else {
$("#two_step_secret").val(res.secret);
$("#form_group_is_two_step > .col-sm-12").after("<img src='"+res.QRCode+"' id='QRCode' alt='QRCode'>");
}
});
} else {
$("#two_step_secret").val('');
$("#QRCode").remove();
}
});

});
</script>
EOF;

$items = [ // 批量添加表单项
['static', 'username', '用户名', '不可更改'],
['text', 'nickname', '昵称', '可以是中文'],
['text', 'email', '邮箱', ''],
['password', 'password', '密码', '必填,6-20位'],
['text', 'mobile', '手机号'],
['image', 'avatar', '头像']
];

if (isset($info['two_step_secret'])){ // 两步验证插件已安装
if ($info['two_step_secret']){
array_push ( $items , ['switch', 'is_two_step', '两步验证', '关闭后再开启可重新生成二维码', 1] );
}else{
array_push ( $items , ['switch', 'is_two_step', '两步验证', '开启后用 <code>Google Authenticator</code> 扫描二维码', 0] );
}
array_push ( $items , ['hidden', 'two_step_secret'] );
}else{
$js = '';
}

// 使用ZBuilder快速创建表单
return ZBuilder::make('form')
->addFormItems($items)
->setFormData($info) // 设置表单数据
->setExtraJs($js)
->fetch();
}
到后台“扩展中心”安装“两步验证”插件安装后再“设置插件”,把主机名改成自己的




开启非“超级管理员”的插件运行权限




 
PS: 如果插件设置和权限设置没生效,请清空缓存!


二、使用
打开“个人设置”页




拖到页面底部,开启两步验证




开启后立即用 Google Authenticator 扫描二维码(不过我还是推荐使用 Authy 这款APP,即使刷机也不怕验证码丢失)




确定扫描成功后再提交保存!退出后台重新登录,在系统验证完账号密码后,如果要登录的用户开启了两步验证,则会再要求输入验证码,验证成功后方可进入后台





三、关闭两步验证
若要关闭两步验证只需要在“个人设置”页关闭并保存即可
 

本插件基于 DolphinPHP 1.0.7 开发
 
目前测试下来支持 DolphinPHP 1.1.0 !但如果你从低版本升级到 1.1.0 后发现无法登录后台,请先删除 runtime 目录;如果还使用了Redis缓存,需要清空下Redis缓存数据的内容!


TwoStep.zip 查看全部
为了防止网站后台工作人员账号密码意外泄露带来的安全问题(如CSDN事件),可以考虑给后台登录加一个两步验证
 
一、安装
  • 解压附件中的插件到 /plugins 目录
  • 修改 application/admin/controller/Admin.php 在 protected function _initialize() 方法的第一行添加代码

    /**
* 初始化
* @author 蔡伟明 <314013107@qq.com>
*/
protected function _initialize()
{
// 两步验证钩子
$hook_result = \think\Hook::listen('two_step');
if (!empty($hook_result) && true !== $hook_result[0]) {
$current_url = request()->url(); // 当前 url
if ( // 下面三个 URL 不跳转到两步验证页
strpos ( $current_url , plugin_url('TwoStep/Admin/verification') ) === false && // 两步验证页
strpos ( $current_url , plugin_url('TwoStep/Admin/signin') ) === false && // 验证两步验证码
strpos ( $current_url , url('user/publics/signout') ) === false // 登出账号
){
$this->redirect(plugin_url('TwoStep/Admin/verification'));
}
}
.
.
.
.
.
}

  • 修改 application/admin/controller/Index.php 用下面代码覆盖 public function profile() 方法

    /**
* 个人设置
* @author 蔡伟明 <314013107@qq.com>
*/
public function profile()
{
// 保存数据
if ($this->request->isPost()) {
$data = $this->request->post();

$data['nickname'] == '' && $this->error('昵称不能为空');
$data['id'] = UID;

// 如果没有填写密码,则不更新密码
if ($data['password'] == '') {
unset($data['password']);
}

$UserModel = new UserModel();
if ($user = $UserModel->allowField(['nickname', 'email', 'password', 'mobile', 'avatar'])->update($data)) {
// 记录行为
action_log('user_edit', 'admin_user', UID, UID, get_nickname(UID));
$this->success('编辑成功');
} else {
$this->error('编辑失败');
}
}

// 获取数据
$info = UserModel::where('id', UID)->field('password', true)->find();

// 开启两步验证功能
$generate_secret_url = plugin_url('TwoStep/Admin/generateSecret');
$js = <<<EOF
<script type="text/javascript">
$(function(){
$("#is_two_step").change(function() {
if($('#is_two_step').is(':checked')) {
$.get("{$generate_secret_url}", function(res){
if(res.code == 0){
Dolphin.notify(res.msg, 'danger');
$("#is_two_step").removeAttr("checked");
} else {
$("#two_step_secret").val(res.secret);
$("#form_group_is_two_step > .col-sm-12").after("<img src='"+res.QRCode+"' id='QRCode' alt='QRCode'>");
}
});
} else {
$("#two_step_secret").val('');
$("#QRCode").remove();
}
});

});
</script>
EOF;

$items = [ // 批量添加表单项
['static', 'username', '用户名', '不可更改'],
['text', 'nickname', '昵称', '可以是中文'],
['text', 'email', '邮箱', ''],
['password', 'password', '密码', '必填,6-20位'],
['text', 'mobile', '手机号'],
['image', 'avatar', '头像']
];

if (isset($info['two_step_secret'])){ // 两步验证插件已安装
if ($info['two_step_secret']){
array_push ( $items , ['switch', 'is_two_step', '两步验证', '关闭后再开启可重新生成二维码', 1] );
}else{
array_push ( $items , ['switch', 'is_two_step', '两步验证', '开启后用 <code>Google Authenticator</code> 扫描二维码', 0] );
}
array_push ( $items , ['hidden', 'two_step_secret'] );
}else{
$js = '';
}

// 使用ZBuilder快速创建表单
return ZBuilder::make('form')
->addFormItems($items)
->setFormData($info) // 设置表单数据
->setExtraJs($js)
->fetch();
}

  • 到后台“扩展中心”安装“两步验证”插件
  • 安装后再“设置插件”,把主机名改成自己的

QQ截图20171020134353.png

  • 开启非“超级管理员”的插件运行权限

QQ截图20171020140227.png

 
PS: 如果插件设置和权限设置没生效,请清空缓存!


二、使用
  • 打开“个人设置”页

QQ截图20171020134456.png

  • 拖到页面底部,开启两步验证

QQ截图20171020134955.png

  • 开启后立即用 Google Authenticator 扫描二维码(不过我还是推荐使用 Authy 这款APP,即使刷机也不怕验证码丢失)

IMG_2652(20171020-143848).jpg

  • 确定扫描成功后再提交保存!
  • 退出后台重新登录,在系统验证完账号密码后,如果要登录的用户开启了两步验证,则会再要求输入验证码,验证成功后方可进入后台

QQ截图20171020135521.png


三、关闭两步验证
  • 若要关闭两步验证只需要在“个人设置”页关闭并保存即可

 

本插件基于 DolphinPHP 1.0.7 开发
 
目前测试下来支持 DolphinPHP 1.1.0 !但如果你从低版本升级到 1.1.0 后发现无法登录后台,请先删除 runtime 目录;如果还使用了Redis缓存,需要清空下Redis缓存数据的内容!

七牛上传错误

流风回雪 回复了问题 • 2 人关注 • 2 个回复 • 481 次浏览 • 2017-10-19 16:25 • 来自相关话题

Multifield多维数组字段-扩展form单序列化字段

yangweijie 发表了文章 • 6 个评论 • 563 次浏览 • 2017-10-04 08:47 • 来自相关话题

使用
form

addMultifield($name = '', $title = '', $tips = '', $options = [], $default = [],$extra_class='') 添加多维字段序列化存储,每一行记录由options控制,field_name=>field_title

存储时 如 input('no') 获取出来是 [['name'=>'', 'value'=>'']]这样的结构;

测试代码
public function test(){
if(request()->isAjax()){
$mult_attribute = I('mult_attribute/a', []);
$this->checkPackagePrice($mult_attribute);
}else{
return ZBuilder::make('form')
->setPageTitle('新增商品-选择店铺')
->addMultifield('mult_attribute', '商品', '', ['name'=>'名称','value'=>'值'], '')
->fetch();
}
}

public function checkPackagePrice($mult_attribute){
$empty_num = 0;
foreach ($mult_attribute as $key => $row) {
if (empty($row['attribute_value']) || empty($row['attribute_name'])) {
$empty_num++;
}
}
if ($empty_num > 0) {
$this->error('每个子项的属性名或属性值必填');
}
}效果图:










  查看全部
使用
form


addMultifield($name = '', $title = '', $tips = '', $options = [], $default = [],$extra_class='') 添加多维字段序列化存储,每一行记录由options控制,field_name=>field_title

存储时 如 input('no') 获取出来是 [['name'=>'', 'value'=>'']]这样的结构;

测试代码
public function test(){
if(request()->isAjax()){
$mult_attribute = I('mult_attribute/a', []);
$this->checkPackagePrice($mult_attribute);
}else{
return ZBuilder::make('form')
->setPageTitle('新增商品-选择店铺')
->addMultifield('mult_attribute', '商品', '', ['name'=>'名称','value'=>'值'], '')
->fetch();
}
}

public function checkPackagePrice($mult_attribute){
$empty_num = 0;
foreach ($mult_attribute as $key => $row) {
if (empty($row['attribute_value']) || empty($row['attribute_name'])) {
$empty_num++;
}
}
if ($empty_num > 0) {
$this->error('每个子项的属性名或属性值必填');
}
}
效果图:

TIM截图20171004084505.jpg


TIM截图20171004084440.jpg

 

自定义表单项目之select2ajax

yangweijie 发表了文章 • 0 个评论 • 719 次浏览 • 2017-09-06 15:10 • 来自相关话题

因为公司有个下拉列表有几千的数据,而过多的json在前端会造成浏览器卡 崩溃,故研究ajax 搜索下拉。
form

addSelect2ajax 注意定义ajax请求地址,参数固定q page=1

ajax_url

返回 data: 列表 键值分别为text 和id 即可

测试代码


测试代码

public function test_table($q='', $page = 1){
if(Request::instance()->isAjax()){
// 静态模拟
return json([
'data'=>[
['text'=>'吉佳便利超市','id'=>2],
['text'=>'吉祥馄饨','id'=>880],
]
]);
// 动态查询
$where['company_name'] = ['like', "%{$q}%"];
$shop_list = Db::name('Shop')->where($where)->field('company_name AS text,id')->paginate(10);
return json($shop_list);
}else{
return ZBuilder::make('form')
->addSelect2ajax('select', '测试','', [], '', url('test_table'))
->fetch();
}
}下载附件放入extend/form/里解压出来select2ajax 目录,
在表单里如上面方式使用,addSelect2ajax ,  注意 ajax_url 搜索的处理。
 
注意自定义表单项的模板 里 变量时builder里的 不要直接copy common builder里的 查看全部

TIM截图20170906150516.jpg

因为公司有个下拉列表有几千的数据,而过多的json在前端会造成浏览器卡 崩溃,故研究ajax 搜索下拉。
form

addSelect2ajax 注意定义ajax请求地址,参数固定q page=1

ajax_url

返回 data: 列表 键值分别为text 和id 即可

测试代码


测试代码

public function test_table($q='', $page = 1){
if(Request::instance()->isAjax()){
// 静态模拟
return json([
'data'=>[
['text'=>'吉佳便利超市','id'=>2],
['text'=>'吉祥馄饨','id'=>880],
]
]);
// 动态查询
$where['company_name'] = ['like', "%{$q}%"];
$shop_list = Db::name('Shop')->where($where)->field('company_name AS text,id')->paginate(10);
return json($shop_list);
}else{
return ZBuilder::make('form')
->addSelect2ajax('select', '测试','', [], '', url('test_table'))
->fetch();
}
}
下载附件放入extend/form/里解压出来select2ajax 目录,
在表单里如上面方式使用,addSelect2ajax ,  注意 ajax_url 搜索的处理。
 
注意自定义表单项的模板 里 变量时builder里的 不要直接copy common builder里的

求七牛插件

dolphinphp 回复了问题 • 2 人关注 • 2 个回复 • 883 次浏览 • 2017-08-16 17:39 • 来自相关话题

七牛云存储插件

dolphinphp 发表了文章 • 3 个评论 • 1102 次浏览 • 2017-08-16 17:39 • 来自相关话题

本插件仅支持DolphinPHP1.0.6版本或更新版本。
 
【安装步骤】
1.解压到根目录下的plugins目录
2.在后台安装插件
3.在“系统设置”-“上传”中,将“上传驱动”设置为七牛云
本插件仅支持DolphinPHP1.0.6版本或更新版本。
 
【安装步骤】
1.解压到根目录下的plugins目录
2.在后台安装插件
3.在“系统设置”-“上传”中,将“上传驱动”设置为七牛云

发包 钢材生产订单管理系统开发

kimee 发表了文章 • 1 个评论 • 548 次浏览 • 2017-07-26 13:15 • 来自相关话题

语言建议是PHP,当然其他语言也行。需要给客户电脑安装环境,部署项目,客户电脑是Windows系统。用户端在局域网使用。

PHP的话可使用海豚PHP框架,他自带了角色、用户、自定义模型功能,可降低成本,快速开发。

 

数据模块:角色、用户、订单、材料、加工工艺、客户、发货单

角色用来控制权限、订单是主要模块、材料和工艺来设置单价和自动计算、客户来区分订单归属、发货单是同一个客户的多个订单的组合(也就是说我下了几个单子,但是一起发货,一起算账)

 

功能:增删改查,组合查询,导出xls,打印页面

权限要求:角色对应字段有不同的添加、编辑、查看权限。订单数据对应角色和人有查看权限。举例:接单员只能录入部分字段。技术人员可以修改某些字段。接单员只能看见他录入的数据,技术人员只能看见他授权的数据。授权就是说数据的某个字段关联了技术人员的id。

 

订单字段如下

 

 

说明:

一、角色:技术人员、生产人员、财务人员、公司内部访客、主管理员

   1、技术人员,表行中白色部分、绿色部分除“结算方式”项外,均为此类人员编辑部分,且技术人员可后期通过“客户名称”或“图纸编号”查找对应任务,对编辑部分信息可再编辑,但不能删除任务项。

   2、生产人员,表中红色部分为此类人员编辑部分,且也可辅助编辑“用料长度”、“用料宽度”两项,其他列均不可编辑,在完成状态未显示为“已完成”时,始终提示生产人员此任务处于未完成状态,此任务表中“客户名称”以及绿色部分对此类人员隐藏,但可分配权限使生产主管可查看“客户名称”。

   3、财务人员,可查看全项,除“结算方式”项可点选外,其余项均无权限编辑,且在“结算方式”项未显示值时,始终提示财务人员此任务处于未完成状态,当:“结算情况”显示为“记账”值时,可认为此任务为完成状态,可打开打印页面。

   4、公司内部访客,除“客户名称”以及绿色部分对此类人员隐藏外,其余项均可查看,不可编辑,不可打印。

   5、主管理员,可编辑任何项,可修改内部参数等。

 

   1、“图纸编号”可自动生成,其生成值的方式遵循一定的规律,且每一位技术人员操作期间,生成各自的值,不重复,该值可快速被复制;MS15-170701-001。15代表人的id,中间是下单日期,001是订单id。

 

   1、“材料结算”、“切割结算”项中,可自动进行计算出值;大致的公示为:(材料单价*数量)、(加工单价*数量)。订单金额为两个相加。

   3、每月可导出上月订单数据成xls.

   4、订单具有组合筛选功能,点击表头排序功能。每一位登陆人员,优先显示为该人员的未完成的,再显示完成的;

四、打印要求:

   1、按照下方图片格式要求,制作一个白底页面,用于打印。同一个客户的多个订单可以合并成一个发货单。选择哪些订单来合并是操作人员自己勾选的,不是按程序规则的。 查看全部
语言建议是PHP,当然其他语言也行。需要给客户电脑安装环境,部署项目,客户电脑是Windows系统。用户端在局域网使用。

PHP的话可使用海豚PHP框架,他自带了角色、用户、自定义模型功能,可降低成本,快速开发。

 

数据模块:角色、用户、订单、材料、加工工艺、客户、发货单

角色用来控制权限、订单是主要模块、材料和工艺来设置单价和自动计算、客户来区分订单归属、发货单是同一个客户的多个订单的组合(也就是说我下了几个单子,但是一起发货,一起算账)

 

功能:增删改查,组合查询,导出xls,打印页面

权限要求:角色对应字段有不同的添加、编辑、查看权限。订单数据对应角色和人有查看权限。举例:接单员只能录入部分字段。技术人员可以修改某些字段。接单员只能看见他录入的数据,技术人员只能看见他授权的数据。授权就是说数据的某个字段关联了技术人员的id。

 

订单字段如下

 

 

说明:

一、角色:技术人员、生产人员、财务人员、公司内部访客、主管理员

   1、技术人员,表行中白色部分、绿色部分除“结算方式”项外,均为此类人员编辑部分,且技术人员可后期通过“客户名称”或“图纸编号”查找对应任务,对编辑部分信息可再编辑,但不能删除任务项。

   2、生产人员,表中红色部分为此类人员编辑部分,且也可辅助编辑“用料长度”、“用料宽度”两项,其他列均不可编辑,在完成状态未显示为“已完成”时,始终提示生产人员此任务处于未完成状态,此任务表中“客户名称”以及绿色部分对此类人员隐藏,但可分配权限使生产主管可查看“客户名称”。

   3、财务人员,可查看全项,除“结算方式”项可点选外,其余项均无权限编辑,且在“结算方式”项未显示值时,始终提示财务人员此任务处于未完成状态,当:“结算情况”显示为“记账”值时,可认为此任务为完成状态,可打开打印页面。

   4、公司内部访客,除“客户名称”以及绿色部分对此类人员隐藏外,其余项均可查看,不可编辑,不可打印。

   5、主管理员,可编辑任何项,可修改内部参数等。

 

   1、“图纸编号”可自动生成,其生成值的方式遵循一定的规律,且每一位技术人员操作期间,生成各自的值,不重复,该值可快速被复制;MS15-170701-001。15代表人的id,中间是下单日期,001是订单id。

 

   1、“材料结算”、“切割结算”项中,可自动进行计算出值;大致的公示为:(材料单价*数量)、(加工单价*数量)。订单金额为两个相加。

   3、每月可导出上月订单数据成xls.

   4、订单具有组合筛选功能,点击表头排序功能。每一位登陆人员,优先显示为该人员的未完成的,再显示完成的;

四、打印要求:

   1、按照下方图片格式要求,制作一个白底页面,用于打印。同一个客户的多个订单可以合并成一个发货单。选择哪些订单来合并是操作人员自己勾选的,不是按程序规则的。

【定时/计划任务】模块发布

流风回雪 发表了文章 • 30 个评论 • 2321 次浏览 • 2017-07-14 09:11 • 来自相关话题

简介:
 
此模块可以在网站系统的后台管理定时任务,让系统自动的定时的执行SQL,Shell或者请求指定的URL。
任务计划使用与 linux 一致的的 cron 表达式进行配置,所以非常灵活。例如:0 23 ? * MON-FRI 这样配置就可以设置任务在 每周一至周五晚上11点30分 执行计划任务。至于  cron 表达式请自行百度查询!

模块大量抄袭了 FastAdmin 的设计,但 FastAdmin 不能后台查看任务的执行结果,只能在服务器上查看日志文件,而且日志记录还不完整。不过我们还是要感谢FastAdmin作者!
FastAdmin项目地址: git.oschina.net/karson/fastadmin
 
 
应用场景举例:
定时执行SQL,比如定时清理某些日志表;定时访问某个本地路径或者远程的URL,让其做某些工作;定时执行Shell命令,比如定时更新网站搜索引擎的索引。
  

安装流程:
 1. 安装这两个依赖包composer require mtdowling/cron-expression

composer require guzzlehttp/guzzle
说明:
mtdowling/cron-expression 是用来解析、计算 cron 表达式的关键组件;
guzzlehttp/guzzle 用来请求远程 url 的。

2. 安装模块
把模块包解压后放到 application 目录,然后进系统后台安装本模块。
 
3. 把系统入口文件 index.php 改为下面代码
 
DolphinPHP V1.0.8 版本使用下面代码// 定义应用目录
define('APP_PATH', __DIR__ . '/application/');

// 定义后台入口文件
define('ADMIN_FILE', 'admin.php');

// 检查是否安装
if(!is_file(__DIR__ . '/data/install.lock')){
define('BIND_MODULE', 'install');
}

// 加载框架基础文件
require __DIR__ . '/thinkphp/base.php';

// cli 模式关闭路由
if (PHP_SAPI == 'cli'){
\think\App::route(false);
}

// 执行应用
\think\App::run()->send();
 
DolphinPHP V1.1.0 以上版本使用下面代码// 定义应用目录
define('APP_PATH', __DIR__ . '/../application/');

// 定义后台入口文件
define('ADMIN_FILE', 'admin.php');

// 检查是否安装
if(!is_file(__DIR__ . '/../data/install.lock')){
define('BIND_MODULE', 'install');
}

// 加载框架基础文件
require __DIR__ . '/../thinkphp/base.php';

// cli 模式关闭路由
if (PHP_SAPI == 'cli'){
\think\App::route(false);
}

// 执行应用
\think\App::run()->send();
 说明:
把相对路径改成绝对路径的目的是为了使定时任务可以在命令行下的任意位置执行;cli模式下必须关闭系统的路由功能,否则 ThinkPHP 在检查路由的时候会报错,这貌似是 ThinkPHP 的BUG;
 
4. 开启PHP的 shell_exec() 函数
打开 php.ini ,在里面搜索 disable_functions ,然后把等号后面的 shell_exec 删掉执行 /etc/init.d/httpd restart 重启 Apache ,如果是 Nginx 的话执行 /etc/init.d/php-fpm restart 重启 PHP
 
5. 添加一个Linux上的crontab定时任务
执行 crontab -e ,在里面添加一条定时任务,让服务器每1分钟访问一次我们的任务执行接口* * * * * /usr/bin/php /你网站的完整根路径(绝对路径)/index.php /crontab/autotask(1、注意空格;2、注意 DolphinPHP V1.1.0 以上版本入口文件是在 public 目录) 

6. 到网站后台添加任务即可
 
 
截图:





 任务列表





 请求本地路径配置





 配置定时执行SQL





请求远程URL,这里故意把url写错,用来测试请求失败的效果





 执行的任务日志列表





 可以看到,上面请求远程URL的任务内容配置错了,这里执行失败后便记录下了错误内容





 执行Shell命令后记录返回的结果
 

模块包:
适用于 DolphinPHP V1.0.8

crontab_v1_0_8.zip




适用于 DolphinPHP V1.1.0 以上版本

crontab_v1_1_0.zip




从 DolphinPHP 1.0.8 升级到 1.1.0
1、升级时如果用升级包里的 vendor 替换了原系统的 vendor,请检查模块需要的那两个依赖包是否存在,如果被替换或删除了,请重新安装;
2、升级后如果覆盖了 index.php 入口文件,请照文中方法修改;
3、重新下载文中适用于 DolphinPHP V1.1.0 以上版本的模块包进行覆盖(实际上是需要覆盖 /crontab/view/admin/index/add.html 文件和 /crontab/home/Autotask.php 即可)
4、执行 crontab -e 命令,修改 Linux 定时任务中网站系统入口文件的绝对路径,因为 1.1.0 把入口调整到了 public 目录,这里也需要在 index.php 前面加上 public
  
更新日志:
2018-02-21:
1. 修复升级到 Dolphinphp v1.1.0 后本地 URL 任务执行错误问题;
 
2018-01-24:
1. 修改模板文件以支持 DolphinPHP V1.1.0 以上版本;
2. 上文中的安装说明新增 DolphinPHP V1.1.0 以上版本注意事项;

 2017-10-27:
1. 支持 DolphinPHP V1.0.8(V1.0.8以下版本需要删除表格构建器的raw()方法,V1.0.7系统有BUG,所以不支持);
2. 把 rmccue/requests 组件换成 guzzlehttp/guzzle;

 2017-07-15:
1. 更换掉后台任务管理模板的那种蛋疼的写法;
2. 修改任务执行接口上的一个小bug;
 

注意:
 
不支持windows环境 查看全部
简介:
 
此模块可以在网站系统的后台管理定时任务,让系统自动的定时的执行SQL,Shell或者请求指定的URL。
任务计划使用与 linux 一致的的 cron 表达式进行配置,所以非常灵活。例如:0 23 ? * MON-FRI 这样配置就可以设置任务在 每周一至周五晚上11点30分 执行计划任务。至于  cron 表达式请自行百度查询!

模块大量抄袭了 FastAdmin 的设计,但 FastAdmin 不能后台查看任务的执行结果,只能在服务器上查看日志文件,而且日志记录还不完整。不过我们还是要感谢FastAdmin作者!
FastAdmin项目地址: git.oschina.net/karson/fastadmin
 
 
应用场景举例:
  1. 定时执行SQL,比如定时清理某些日志表;
  2. 定时访问某个本地路径或者远程的URL,让其做某些工作;
  3. 定时执行Shell命令,比如定时更新网站搜索引擎的索引。

  

安装流程:
 1. 安装这两个依赖包
composer require mtdowling/cron-expression

composer require guzzlehttp/guzzle

说明:
mtdowling/cron-expression 是用来解析、计算 cron 表达式的关键组件;
guzzlehttp/guzzle 用来请求远程 url 的。

2. 安装模块
把模块包解压后放到 application 目录,然后进系统后台安装本模块。
 
3. 把系统入口文件 index.php 改为下面代码
 
DolphinPHP V1.0.8 版本使用下面代码
// 定义应用目录
define('APP_PATH', __DIR__ . '/application/');

// 定义后台入口文件
define('ADMIN_FILE', 'admin.php');

// 检查是否安装
if(!is_file(__DIR__ . '/data/install.lock')){
define('BIND_MODULE', 'install');
}

// 加载框架基础文件
require __DIR__ . '/thinkphp/base.php';

// cli 模式关闭路由
if (PHP_SAPI == 'cli'){
\think\App::route(false);
}

// 执行应用
\think\App::run()->send();

 
DolphinPHP V1.1.0 以上版本使用下面代码
// 定义应用目录
define('APP_PATH', __DIR__ . '/../application/');

// 定义后台入口文件
define('ADMIN_FILE', 'admin.php');

// 检查是否安装
if(!is_file(__DIR__ . '/../data/install.lock')){
define('BIND_MODULE', 'install');
}

// 加载框架基础文件
require __DIR__ . '/../thinkphp/base.php';

// cli 模式关闭路由
if (PHP_SAPI == 'cli'){
\think\App::route(false);
}

// 执行应用
\think\App::run()->send();

 说明:
  1. 把相对路径改成绝对路径的目的是为了使定时任务可以在命令行下的任意位置执行;
  2. cli模式下必须关闭系统的路由功能,否则 ThinkPHP 在检查路由的时候会报错,这貌似是 ThinkPHP 的BUG;

 
4. 开启PHP的 shell_exec() 函数
  1. 打开 php.ini ,在里面搜索 disable_functions ,然后把等号后面的 shell_exec 删掉
  2. 执行 /etc/init.d/httpd restart 重启 Apache ,如果是 Nginx 的话执行 /etc/init.d/php-fpm restart 重启 PHP

 
5. 添加一个Linux上的crontab定时任务
执行 crontab -e ,在里面添加一条定时任务,让服务器每1分钟访问一次我们的任务执行接口
* * * * * /usr/bin/php /你网站的完整根路径(绝对路径)/index.php /crontab/autotask
(1、注意空格;2、注意 DolphinPHP V1.1.0 以上版本入口文件是在 public 目录) 

6. 到网站后台添加任务即可
 
 
截图:

QQ截图20170714082128.png

 任务列表

QQ截图20170714082222.png

 请求本地路径配置

QQ截图20170714082359.png

 配置定时执行SQL

QQ截图20170714082450.png

请求远程URL,这里故意把url写错,用来测试请求失败的效果

QQ截图20170714082525.png

 执行的任务日志列表

QQ截图20170714082608.png

 可以看到,上面请求远程URL的任务内容配置错了,这里执行失败后便记录下了错误内容

QQ截图20170714082633.png

 执行Shell命令后记录返回的结果
 

模块包:
适用于 DolphinPHP V1.0.8



适用于 DolphinPHP V1.1.0 以上版本



从 DolphinPHP 1.0.8 升级到 1.1.0
1、升级时如果用升级包里的 vendor 替换了原系统的 vendor,请检查模块需要的那两个依赖包是否存在,如果被替换或删除了,请重新安装;
2、升级后如果覆盖了 index.php 入口文件,请照文中方法修改;
3、重新下载文中适用于 DolphinPHP V1.1.0 以上版本的模块包进行覆盖(实际上是需要覆盖 /crontab/view/admin/index/add.html 文件和 /crontab/home/Autotask.php 即可)
4、执行 crontab -e 命令,修改 Linux 定时任务中网站系统入口文件的绝对路径,因为 1.1.0 把入口调整到了 public 目录,这里也需要在 index.php 前面加上 public
  
更新日志:
2018-02-21:
1. 修复升级到 Dolphinphp v1.1.0 后本地 URL 任务执行错误问题;
 
2018-01-24:
1. 修改模板文件以支持 DolphinPHP V1.1.0 以上版本;
2. 上文中的安装说明新增 DolphinPHP V1.1.0 以上版本注意事项;

 2017-10-27:
1. 支持 DolphinPHP V1.0.8(V1.0.8以下版本需要删除表格构建器的raw()方法,V1.0.7系统有BUG,所以不支持);
2. 把 rmccue/requests 组件换成 guzzlehttp/guzzle;

 2017-07-15:
1. 更换掉后台任务管理模板的那种蛋疼的写法;
2. 修改任务执行接口上的一个小bug;
 

注意:
 
不支持windows环境

环迅支付插件

cklnk 发表了文章 • 0 个评论 • 834 次浏览 • 2017-06-30 14:18 • 来自相关话题

调用
 $payment_data = [
'GoodsName' => '充值',
'MerBillNo' => '订单号',
'Amount' => '金额',
'Attach' => '备注',
'Merchanturl' => '',
'ServerUrl' => '',
'UserRealName' => '',//自动注册
'UserId' => '',//自动注册
];
plugin_action('Ipspay/Ipspay/payment', [$payment_data, 'h5']);

解压到plugins文件夹下即可 查看全部

QQ截图20170630141641.jpg

调用
 
$payment_data = [
'GoodsName' => '充值',
'MerBillNo' => '订单号',
'Amount' => '金额',
'Attach' => '备注',
'Merchanturl' => '',
'ServerUrl' => '',
'UserRealName' => '',//自动注册
'UserId' => '',//自动注册
];
plugin_action('Ipspay/Ipspay/payment', [$payment_data, 'h5']);


解压到plugins文件夹下即可

PHPMailer邮件类插件

july 发表了文章 • 2 个评论 • 806 次浏览 • 2017-06-27 13:49 • 来自相关话题

看到SwiftMailer似乎大概也许好像需要php: >=7.0.0,所以做了一个PHPMailer插件类
 
安装此插件前,请先使用命令composer require phpmailer/phpmailer 安装PHPMailer
 





 public function send_phpmailer(){
$res = PHPMailer::send_email('测试宝宝','测试内容','to_user_emial','alias');
dump($res);
}
  查看全部
看到SwiftMailer似乎大概也许好像需要php: >=7.0.0,所以做了一个PHPMailer插件类
 
安装此插件前,请先使用命令composer require phpmailer/phpmailer 安装PHPMailer
 

TIM图片20170627130540.png

 
public function send_phpmailer(){
$res = PHPMailer::send_email('测试宝宝','测试内容','to_user_emial','alias');
dump($res);
}

 

SwiftMailer邮件类插件

july 发表了文章 • 0 个评论 • 464 次浏览 • 2017-06-27 13:11 • 来自相关话题

需要用邮件所以做了个初版的SwiftMailer邮件类插件,静态方法调用

 
安装此插件前,请先使用命令composer require swiftmailer/swiftmailer 安装SwiftMailer
 





测试方法public function send_email(){
$res = SwiftMailer::send_email('测试宝宝','测试内容',to_user_emial);
dump($res);
} 查看全部
需要用邮件所以做了个初版的SwiftMailer邮件类插件,静态方法调用

 
安装此插件前,请先使用命令composer require swiftmailer/swiftmailer 安装SwiftMailer
 
TIM图片20170627130540.png


测试方法
public function send_email(){
$res = SwiftMailer::send_email('测试宝宝','测试内容',to_user_emial);
dump($res);
}