二次开发

二次开发

wecenter测试网站联盟广告是否被屏蔽

WeCenter 程序三叔 发表了文章 • 1 个评论 • 58 次浏览 • 4 天前 • 来自相关话题

代码是网上找的。我这只是做成了独立的模板,然后输出。便于将来迁移。步骤如下:第一步:创建 /static/js/adview_pic_cpc_cpm_cpa_guanggao_gg_ads_300x ...查看全部

代码是网上找的。

我这只是做成了独立的模板,然后输出。便于将来迁移。

步骤如下:

第一步:

创建 /static/js/adview_pic_cpc_cpm_cpa_guanggao_gg_ads_300x250.js

写入内容:

var killads = true;


第二步 

创建模板 /views/default/block/ads_block_check.tpl.htm


第三步

在第二步的模板中写入:

<script src="/static/js/adview_pic_cpc_cpm_cpa_guanggao_gg_ads_300x250.js" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript">
if (typeof(killads)=='undefined'){
    console.log('广告被过滤');

    自行处理代码;
}
</script>


第四步:

在适当的模板中,比如/views/default/article/index.tpl.htm的最底部的代码

<?php TPL::output('global/footer.tpl.htm'); ?>

上面引入这个检查广告是否被屏蔽的代码:

<?php TPL::output( 'block/ads_block_check.tpl.htm'); ?>

最后刷新页面:

就会出现你的处理代码:


并且在控制台中输出:


关于版本更新,提两个小想法,供官方参考

WeCenter 程序fanta 回复了问题 • 4 人关注 • 3 个回复 • 257 次浏览 • 2019-10-29 20:17 • 来自相关话题

还记得老夫的吹牛贴么,一个月增粉1万3.

建站运营三叔 发表了文章 • 2 个评论 • 490 次浏览 • 2019-07-24 10:20 • 来自相关话题

上个月的今天老夫发了个贴:之前在官方群里说的一个设想实现了。那时候截了个粉丝数量 ...查看全部

上个月的今天老夫发了个贴:

之前在官方群里说的一个设想实现了。

那时候截了个粉丝数量截图:


整一个月过去了,发一下现在的截图。


今天正好增粉13000.

wecenter的二开实在是太强大了!!!!

wecenter里改造扫码登录跳到自己定义的页面里拿到openid

WeCenter 程序三叔 发表了文章 • 0 个评论 • 521 次浏览 • 2019-07-09 16:23 • 来自相关话题

微信oauth登录过程: 引导用户跳转到微信服务器,并且带上一个编码后的地址A 用户在微信服务器,点击同意授权(或者无感知的登录),就会跳转到地址A,并且带上参数code ...查看全部

微信oauth登录过程:



引导用户跳转到微信服务器,并且带上一个编码后的地址A

用户在微信服务器,点击同意授权(或者无感知的登录),就会跳转到地址A,并且带上参数code

我们需要在地址A拿到code参数,然后加上微信服务号的appid和appkey等参数,请求微信服务器,然后就得到了用户openid和一个token

用户openid已经是唯一标识符了,如果我们还需要用户其它信息,就需要用token和openid再一次请求微信服务器,从而获取所需信息。



-----------------------------------------------------



wecenter扫码登录的二维码解析后是:



http://www.xxxx.com/?/m/weixin/oauth_redirect/?uri=http://www.xxxx.com/?/m/weixin/qr_login/token-14869783&scope=snsapi_userinfo&state=OAUTH_REDIRECT



扫码回跳后会拿到code



具体的参见:



/app/m/weixin.php里的public function qr_login_action()方法



我们可以拿到 code 和 token两个参数,这里的token应该是wc生成的,不是微信的access_token



当然,我的这篇帖子并不是用来介绍wecenter的扫码登录的。



所以我利用官方的方法来实现自己的目的。



我们首先改造二维码。



我们在/app/weixin/main.php里新增代码



public function login_qr_code_4winform_action()

    {

        include(AWS_PATH . 'Services/phpqrcode/qrlib.php');

        header('Content-Type: image/png');

        ob_clean();

        QRcode::png($this->model('openid_weixin_weixin')->get_oauth_url(get_js_url('/winform/ajax/get_openid/token-' . $this->model('openid_weixin_weixin')->request_client_login_token(session_id())), 'snsapi_userinfo', 'OAUTH_REDIRECT'), null, QR_ECLEVEL_L, 4);

    }



这里我们参考了官方的代码,修改了上面标红的地方。



然后我们在 /app/winform/里增加ajax.php,然后在php里增加方法:



 public function get_openid_action()

    {

          if ($_GET['code'])

        {

            if ($access_token = $this->model('openid_weixin_weixin')->get_sns_access_token_by_authorization_code($_GET['code']))

            {

                echo $access_token['openid'];

            }

            //

        }

    }



这样就可以在扫码后跳到这个函数里拿到openid了,当然还有access_token 具体想做什么随你。


给问题加一个自动清理垃圾问题的方法

建站运营Alu 发表了文章 • 4 个评论 • 569 次浏览 • 2019-07-01 19:42 • 来自相关话题

你的网站是不是也被灌水机攻击了,删问题删的手软,以下方法可以让它自动清理: 1、禁止灌水发提问的用户(这是关键) 2、在程序目录下的 models\question ...查看全部

你的网站是不是也被灌水机攻击了,删问题删的手软,以下方法可以让它自动清理:



1、禁止灌水发提问的用户(这是关键)



2、在程序目录下的 models\question.php 代码最下面 } 前添加:



    public function delete_user_question()

    {

        if (AWS_APP::cache()->get('delete_question_num')) {

            return false;

        }

        $uids = $ids = array();

        if (! $uids = AWS_APP::cache()->get('delete_user_question')) {

            $time = time() - 86400 * 90;

            foreach($this->fetch_all('users', 'reg_time>' . $time . ' AND integral>100 AND forbidden>0', '', null, 1000) as $value) {

                $uids[] = $value['uid'];

            }

            AWS_APP::cache()->set('delete_user_question', $uids, 86400);

        }

        if ($question = $this->fetch_all('question', "published_uid IN(" . implode(',', $uids) . ")", '', 1000))

        {

            foreach($question as $key => $value) {

                $ids[] = $value['question_id'];

                $this->remove_question($value['question_id']);

            }

            if (($num = count($ids)) <= 0) {

                AWS_APP::cache()->set('delete_question_num', 100);

            }

        }

    }



3、在计划任务里添加 models\crond.php



// 每半分钟执行 或 // 每分钟执行 或自行选择周期



$this->model('question')->delete_user_question();



 



 


谷歌浏览器(chrome)或360浏览器获取cookie的方法

建站运营三叔 发表了文章 • 1 个评论 • 865 次浏览 • 2019-06-29 18:38 • 来自相关话题

  拿B站说事。 首先登录自己的会员。 然后在任意页面按下快捷键“F12” ...查看全部

 



拿B站说事。



首先登录自己的会员。



然后在任意页面按下快捷键“F12”



弹出下面的框。





然后选择Application



就会进入下面的界面





 



在左边的 Storage里点击Cookies ,然后再点击 www.bilibili.com



就会出现右侧的本地所有的Cookie.



因为我们只用到 SESSDATA的值 所以我们在  这里双击就可以复制了。


之前在官方群里说的一个设想实现了。

WeCenter 程序三叔 发表了文章 • 1 个评论 • 680 次浏览 • 2019-06-24 10:11 • 来自相关话题

之前在官方群里吹牛逼: 我最近在写桌面工具,我要让我的用户关注我公众号的可以用我的软件,凡是取消关注的都不可以再用! ...查看全部

之前在官方群里吹牛逼:



我最近在写桌面工具,我要让我的用户关注我公众号的可以用我的软件,凡是取消关注的都不可以再用!



好了,牛逼实现啦!!!



我来说说我的实现思路:



第一步:



我在数据库创建了一个表: aws_tool_weixin



里面有三个主要字段: mac, openid,subscribe  以及日期等辅助字段。



 



第二步:



我在我的winform程序里写了一个带参数的微信关注二维码生成.参数里是用的当前主机的mac地址。





第三步:



我修改了wecenter里和微信交互的那块。在event为 subscribe(是否关注)里增加获取第二步二维码自定义参数值的获取,也就是mac地址



并且判断openid是否存在,如果不存在,则插入一条 mac和openid以及 subscribe=1(1为关注,0为取消关注)



并且新增了 unsubscribe的event判断,这个判断是取消关注的通知。 微信会给我们两个参数: openid  unscribe。



我会根据openid查询是否有记录,有记录则把subscribe字段改为0





第四步:



用户在我的桌面程序里,关注完公众号开始操作。第一次操作的时候,会去查询我的接口,传入mac地址。 因为关注二维码我是不知道当前用户的openid的,但是第二步里我将mac地址和openid绑在一起了。 所以此时传入mac地址的时候,会从接口里读出对应的数据库了的openid。并且将openid保存到本地。下次查询就带着openid去查询了。



如果查询到的subscribe



如果是1 那就是已关注我的公众号且未取消



如果是0 那就是已经取消关注,那就直接弹出对话框:“因为你取消了关注,你已经不可以再使用本软件”



如果后端传来的是没有数据。那就弹出第二步的窗口 让用户关注。



 



最后



自此我的思路就好了。虽然如此 但是还是会有十分之一的人会取消关注。那就不好意思了。昨天还有人发语音问我:为什么我关注了,却用不了你们的软件。 我直接告诉他几点关注的 几点取消关注的。





 



目前我的公众号人数暴涨。




wecenter二开之微信ticket和access_token的获取

WeCenter 程序三叔 发表了文章 • 2 个评论 • 357 次浏览 • 2019-06-21 14:33 • 来自相关话题

//获取token $access_token = $this->model('openid_weixin_weixin')->get_access_token(get_setting( ...查看全部

//获取token



$access_token = $this->model('openid_weixin_weixin')->get_access_token(get_setting('weixin_app_id'), get_setting('weixin_app_secret'));



 



//获取ticket



$jsapi_ticket = $this->model('openid_weixin_weixin')->get_jsapi_ticket($access_token);


Wecenter插件系统开发规范

插件fanta 发表了文章 • 0 个评论 • 840 次浏览 • 2019-06-14 13:31 • 来自相关话题

1.命名规范



插件命名以wc_作为前缀+插件名,如插件test,即wc_test



2.目录新建



目录新建在根目录下plugin文件夹下,如插件名test,目录结构就是/plugins/wc_test/



3.目录结构



目录包含内容必须要有配置文件、核心类,非必要的有模型类、静态资源、第三方类、页面模板等,如test,则玩着目录如下



wc_test



|-config.php  配置文件



|-test.php   核心类



|-test_model  模型类



|-view     视图模板目录



|-static    静态资源目录



|-install.sql   安装sql



|-uninstall.sql  卸载sql



|-upgrade.sql  升级sql



4.配置文件



Config.php配置文件 返回一个多维数组,包含有:



name: 插件标识



title 插件标题名称



intro 插件介绍



author : 插件作者



version 插件版本



state  插件状态



config: 也是一个数组,包含所需的配置项,如:



  'config'=>[



  'ad_plugin_enable' =>



  array (



    'title' => '广告开启',



    'type' => 'radio',



    'value' => 'Y',



    'options' =>



    array (



      'Y' => '开启',



      'N' => '关闭',



    ),



  )



],



以上的配置config就是后台广告插件的配置显示效果,



'options' 对应的是配置项的值,



'value' 是默认值,



'type' 是配置类型,



'title' 是配置名称



常用的有textselectradioCheckBox



ad_plugin_enable是开发者自己定义,调用的时候调用此键名即可



5.核心类



核心类同样继承自AWS_CONTROLLER,包含5个固定方法,即构造方法 install安装,uninstall卸载,enable启用,disable禁用,构造方法获取插件的配置和插件相关信息,安装、卸载、启用、禁用四个方法默认是调用系统的方法,也可以自定义,在方法里自行处理相关逻辑。



除了这5个方法之外,开发者可以自定义其他的方法进行调用。



6.模型类



模型类的定义名称需后接_model方可,如test_model,内部的定义与使用与model目录下的模型相同,



另注意一点,此处的模型名不可与model目录下的模型重名,如果重名,会去调用model目录下的模型,从而会导致找不到相关的方法一类的错误。



调用方法还是$this->model()进行调用。



6.staticview静态资源、视图目录



Staic目录存放css\js等静态资源



View 视图目可存放后台以及前台的视图模板



后台视图的要在目录下新建子目录admin,前台的模板直接放在view下即可,在核心类中,通过 PLUTPL::output('ad/banner');渲染页面,其中ad是插件名或者标识,banner是页面名称



后台的只需加上admin即可,如PLUTPL::output('ad/admin/edit');



7.安装、卸载、升级



安装、卸载、升级在后台都有相对应的操作,对应相应的sql执行即可。



8.插件调用



正常的调用只需用公共方法hook()方法调用即可,在后台或者其他的页面需要调用插件方法进行页面调用或方法的时候,可以通过doact方法,前台explore/doact  后台admin/plugin/doact  ,



添加广告按钮需要调用插件添加广告的方法,此处是超链接,可以通过admin/plugin/doact/?p=ad&a=edit进行传参调用,其中pa是必传的,p是插件名,a是方法名。


在文章底部增加第三方社交分享功能

建站运营三叔 发表了文章 • 5 个评论 • 754 次浏览 • 2019-05-29 12:25 • 来自相关话题

第一步: 在 /views/default/global/下创建文件 socialshare.tpl.htm 写入代码: ...查看全部

第一步:



在 /views/default/global/下创建文件 socialshare.tpl.htm



写入代码:



<div class="social-share" data-mobile-sites="weibo,qq,qzone,tencent,wechat"></div>

<link href="//cdnjs.cloudflare.com/ajax/libs/social-share.js/1.0.16/css/share.min.css" rel="stylesheet">

<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/social-share.js/1.0.16/js/jquery.share.min.js"></script>



 



第二步:



/views/模板/article/index.tpl.htm 你要放社交按钮的地方增加代码:



<?php TPL::output('global/socialshare.tpl.htm'); ?>



 



收功!



效果如:





 



参考网页:



http://www.bejson.com/a/12.html



 


条新动态, 点击查看
飞想翼

飞想翼 回答了问题 • 2013-05-19 10:21 • 19 个回复 不感兴趣

wecenter核心代码注释,持续更新中

赞同来自:

支持,希望能坚持做下去!
支持,希望能坚持做下去!
其实很简单,就是你找的人不会WC的二次开发,学习成本高,自然问你要价就高咯..相反,他们熟悉WP,自然喜欢从WP入手..从内行的角度看待你这个问题,很简单,你从WP入手 几乎等于从零开始,内行都知道WP其实根本没有什么功能..既然如此,何不找个好的开发团队,用... 显示全部 »
其实很简单,就是你找的人不会WC的二次开发,学习成本高,自然问你要价就高咯..相反,他们熟悉WP,自然喜欢从WP入手..从内行的角度看待你这个问题,很简单,你从WP入手 几乎等于从零开始,内行都知道WP其实根本没有什么功能..既然如此,何不找个好的开发团队,用框架从零开始开发呢,还有自主版权呢.以后修改,升级,也方面不是
a279257725

a279257725 回答了问题 • 2015-10-22 09:36 • 23 个回复 不感兴趣

简单的文章打赏功能,来点评下

赞同来自:

很好,支持一下,期待分享
很好,支持一下,期待分享
战国乱

战国乱 回答了问题 • 2016-02-25 16:12 • 8 个回复 不感兴趣

怎么修改首页模板布局?

赞同来自:

首页的模版是\views\default\explore\index.tpl.htm   suprise
首页的模版是\views\default\explore\index.tpl.htm   suprise

手机模板开发修改对应文件基础认识,新手改模板可以看看

WeCenter 程序卓越膜结构 回复了问题 • 8 人关注 • 3 个回复 • 1185 次浏览 • 2018-09-17 17:05 • 来自相关话题

专为WeCenter打造的云端采集器【神箭手】发布2.0版 五大贴心功能打造最流畅的采集体验

WeCenter 程序timilive 回复了问题 • 85 人关注 • 34 个回复 • 13725 次浏览 • 2018-05-22 17:58 • 来自相关话题

【WeCenter二次开发】不同分类的效果

小明明 发表了文章 • 8 个评论 • 4668 次浏览 • 2015-10-30 07:32 • 来自相关话题

【更正】 因为之前发布的是问题,不能编辑,在这更正。 第二篇,前端新建文件名,应改为新建 views/default/block/content_nav.tpl.htm。    【后台 分类设置】 ...查看全部
【更正】
因为之前发布的是问题,不能编辑,在这更正。
第二篇,前端新建文件名,应改为新建 views/default/block/content_nav.tpl.htm。
 
 【后台 分类设置】


搜狗截图15年10月30日0728_1.png


 
【文章页面】


QQ截图20151030073405.png


 
【问题页面】


QQ截图20151030073324.png



【活动页面】


QQ截图20151030073431.png



修改过程:
http://wenda.wecenter.com/question/27787
http://wenda.wecenter.com/question/27788
 

发福利了。。。小白实现问题置顶功能。。。

Mader 回复了问题 • 63 人关注 • 15 个回复 • 5009 次浏览 • 2016-01-11 14:29 • 来自相关话题

【WeCenter二次开发】你至少要知道的那些事

小明明 发表了文章 • 18 个评论 • 6625 次浏览 • 2015-06-24 21:33 • 来自相关话题

引言: 我仅仅是一个编程爱好者,遇到WeCenter的原因是想做个高考咨询的问答站。自己对PHP也只是略懂皮毛,更别说框架了。看了三天的ThinkPHP文档不太好消化。是WeCenter让我更好的理解了M ...查看全部


引言:
我仅仅是一个编程爱好者,遇到WeCenter的原因是想做个高考咨询的问答站。自己对PHP也只是略懂皮毛,更别说框架了。看了三天的ThinkPHP文档不太好消化。是WeCenter让我更好的理解了MVC的含义。


以下内容仅适合刚刚接触WeCenter准备二次开发的新同学,如果您是大神可以就此止步。如有说法不准确,请包涵,以下内容仅为个人理解。
=====================
 
 
1:框架结构有三层它们的作用及它们对应的文件夹如下:
控制器(程序流程,了解用户想要什么)--》APP
模型(数据库访问,提供用户需要的原材料)--》Model
视图(展示出来,也就是最后成品,由控制器放到用户面前)--》View
 
2:Wecenter的框架流程是什么样的?
控制器也就是app文件夹下的文件夹及文件,例如访问http://example.com/?/account/就是执行app/account/main.php 中 index_action 方法~再例如访问http://example.com/?/account/login/就是执行上述文件中login_action这个方法。
这(控制器函数/方法)里面会调用模型,即执行Model文件夹下的相关文件,访问数据库获得数据。例如$this->model('account')->get_user_info_by_uid($uid);就是在调用account这个用户模型,具体就是model/account.php里的相关方法~
调用完数据,要做的事情就是把数据展示出来。在控制器方法中一般都会以这样的语句结束:TPL::output("XXX");它所做的事情就是调用视图——我们通常所说的模板。
 
3:在调用模型之后输出视图,那么模型是怎么把数据传给视图的呢?
请注意这条语句:TPL::assign('AAA', 'BBB');,意思就是把BBB包装成AAA;BBB是由模型获得的数据,AAA是在视图展示的形式,在TPL::output("XXX");输出的模板中可通过<?php echo $this->AAA;?>来输出BBB这个值。
 
 Tip:研究BBB来充分发挥AAA的价值:
上文说到“把BBB包装成AAA”,其实AAA和BBB完全可以理解为等价。
前些日子活跃了一阵子,看到一个用户问,怎么显示加入时间。其实加入时间即注册时间,get_user_info_by_uid()返回的应该是用户信息绝大多数字段,或者就是用户表全部字段,我没有一一比较。同时还会有微信消息设置信息。我通过视图<?php print_r($this->user);//打印数组?>发现有reg_time这个字段的值,只要把时间戳转化成易理解的日期即可。
所以,在开发初期可以多打印几个数组,掌握成员组成,说不准什么时候就可以用到。默认模板只是把认为有必要展示的内容展示出来了,你想展示其他的,研究BBB的内容。


编后语:
第一次打这么多字,还没有插图。向全部读完的童鞋致敬!愿大家开发出自己的特色产品,愿WeCenter越来越好~


WeCenter 二次开发基础说明(模块开发)

jat 发表了文章 • 20 个评论 • 11847 次浏览 • 2015-02-05 12:23 • 来自相关话题

WeCenter组件,活动模块,工单模块等都是一个独立的模块,升级覆盖不影响功能使用,可以理解成一个需要执行sql的插件。  一. 组件文件目录结构说明 ...查看全部
WeCenter组件,活动模块,工单模块等都是一个独立的模块,升级覆盖不影响功能使用,可以理解成一个需要执行sql的插件。
 一. 组件文件目录结构说明
一般来说,一个模块需要下面几个文件,假设模块名为AA,则


app/AA – 应用目录
models/AA.php – 模型目录
static/css/default/AA.css – 静态文件
views/default/AA – 模板目录



二. URL 路由
WeCenter 有一个解析能力强大的 URL 路由,模块AA的访问设置如下
1. 动作访问:


/模块名/控制器/动作/ID
ID 为 id 查询, 例: 模块名/login/123, 则在 login 控制器中 $_GET['id'] 的值为 123
(*) 如果使用 /模块名/控制器/动作/ID 格式 Query string 的使用可以参照 兼容性的支持
(*) 如果动作在 main 控制器中可以省略, 例: 模块名/main/login/ 等同于 account/login/
(*) 如果动作名为 index 可以省略,  例: 模块名/login/index/ 等同于 account/login/



2. Query string
WeCenter 的查询字符串为使用 __ 分隔参数, 使用 – 为参数赋值, 在程序中直接使用 $_GET 取出内容


常规的: account/login/?return_url=1&callback=2
WeCenter 的: account/login/return_url-1__callback-2
(*) 在程序中输出 URL 请使用 get_js_url 函数, 因为这样会兼容 Rewrite 是否开启两种情况



3. 兼容性的支持
下面的几种 URL 形式在程序中都是被支持的:


http://domian/index.php?/question/id-320__column-log__source-doc
http://domian/index.php?/question/320?column=log&source=doc
http://domian/index.php?/question/?id=320&column=log&source=doc
http://domian/index.php?/question/320?column-log__source-doc
http://domian/index.php?/question/320&column-log__source-doc



三. 模板命名规则
程序中所有模板的存放规则为 模块/控制器/动作, 如果控制器为 main 则省略


如 account/main/login/ 对应的模板为 views/模板集/account/login.tpl.htm
如 account/setting/profile/ 对应的模板为 views/模板集/account/setting/profile.tpl.htm


 
四. 自动引入机制
WeCenter 类库, Model 的使用都是不需要事先引入文件的, 这使得在编程过程中变得方便快捷, 也避免了类库重复实例化的问题, 但是使用自动引入机制需要遵循下面的规则.
(*) 所有自动引入的类库都不需要事先实例化, 直接使用即可.
1. Model


放在 model 目录下, 文件名: name.inc.php
文件中需要有继承 AWS_MODEL 的 name_class
(*) 在程序中使用方法: $this->model('name')->action();
(*) 可用范围: CONTROLLER, Model



2. System 类库


放在 system 目录之下, 类名相对于 system 目录, 将 / 换成 _
例: Zend_Mail
路径: system/Zend/Mail.php
类名: Zend_Mail
(*) 在程序中使用方法: new, 静态调用, load_class('class_name');
(*) 可用范围: 任意, 不需要带参数实例化建议使用 load_class



3. 配置文件


放在 system/config 目录之下, 文件内容为一个 $config 数组, 命名为 配置名.php
(*) 在程序中使用方法: AWS_APP::config()->get('配置名')->数组下标
(*) 可用范围: 任意, 不需要带参数实例化建议使用 load_class
如需添加后台菜单,请在 system/config 目录下新建 admin_menu.extension.php 文件,格式与 admin_menu.php 一致。



五. 模板机制

WeCenter 的模板采用继承机制, 系统的 default 为主模板, 用户的自定义模板只需要更改很少的文件即可实现程序界面的定制.继承机制原理:


当管理员设定了一个 newstyle 模板, 用户访问首页

系统开始查找 views/newstyle/home/index.tpl.htm

找到相应文件                                               找不到文件
⬇                                                                   ⬇
读取内容并
解析后显示                ⬅        读取 views/default/home/index.tpl.htm



建立模板集的方法:
1. 在 views 下面建立模板集目录
2. 在 static/css/ 下建立与模板集相同的目录, 我们建议从 static/css/default/ 拷贝一份内容到新建的模板集中, 然后开始修改工作.

六. 常用开发指导
JavaScript:
我们使用 jQuery 作为主要 framework, 载入的插件有:
jQuery Form ( http://malsup.com/jquery/form/ )
AJAX Upload ( http://valums.com/ajax-upload/ )
Valums file Uploader (修改过)
jQuery.ScrollTo

(*) 在 Javascript 中判断用户是否登录判断全局变量 G_USER_ID 是否大于 0 即可
(*) 全局变量在 header 模板中
(*) 所有 JS 请求 URL 需要加上 G_BASE_URL 前缀
(*) 全局 ajax 列表函数使用 bp_load_more

PHP:
关于 Zend Framwork 类库的使用方法请参考官方文档
(*) 在控制器中判断用户是否登录判断 $this->user_id 是否大于 0 即可
(*) 控制器与模板中始终可用 $this->user_id 和 $this->user_info
(*) 控制器与 Model 中禁止使用构造函数, 可以用 setup() 函数替代
(*) 程序已经提供了两个中文处理函数 cjk_substr 和 cjk_strlen

Access Rule:
public function get_access_rule()
{
// 规则类型
// white: actions 里的 action 全部用户可见, 其余 action 需要登录
// black: actions 里的 action 需要登录, 其余 action 全部用户可见
$rule_action["rule_type"] = 'white';
$rule_action["actions"] = array(
'check_username',
'check_email',
'register_process',
'login_process',
'register_agreement',
'send_valid_mail',
'valid_email_active',
'request_find_password',
'find_password_modify'
);
return $rule_action;
}
(*) 控制器中不加此函数, 则所有 action 必需登录可见

模板:
(*) 在模板可以使用 PHP 代码, 全部静态类与 function, 但是不能使用 Model
(*) 模板中 $this-> 中的内容是全局通用变量, 可以在模板中引入的模板使用, 模板内部产生的变量则不能
(*) TPL::output 方法第二个参数为 false 时, 内容会返回给变量不会输出, 可以利用此方法做 JS 调用或者代码重用

注册页面和登陆页面弹出框处理

夏洛特 回复了问题 • 34 人关注 • 4 个回复 • 3525 次浏览 • 2014-09-17 19:54 • 来自相关话题

分享一个自定义WC首页的方法(修改默认首页)

Alu 发表了文章 • 18 个评论 • 10638 次浏览 • 2014-04-11 14:04 • 来自相关话题

有人问我,如果自定义自己写的应用为默认首页如何设置,我不再一一回了,在这里写出来大家互相学习。 在:system\core\uri.php有个默认控制器,修改这个参数 var $default_vars = array( ...查看全部
有人问我,如果自定义自己写的应用为默认首页如何设置,我不再一一回了,在这里写出来大家互相学习。

在:system\core\uri.php有个默认控制器,修改这个参数
var $default_vars = array(
'app_dir' => 'home', //应用名
'controller' => 'main', //文件名
'action' => 'index'//执行的程序
);

【二次开发教程】三、友情链接开发,后台处理页面,附插件下载。

___在路上____ 回复了问题 • 73 人关注 • 16 个回复 • 8610 次浏览 • 2014-12-07 22:09 • 来自相关话题

【二次开发教程】二、友情链接开发,前台申请页面。

buffonly 回复了问题 • 54 人关注 • 11 个回复 • 5327 次浏览 • 2014-04-24 14:45 • 来自相关话题

关于版本更新,提两个小想法,供官方参考

回复

WeCenter 程序fanta 回复了问题 • 4 人关注 • 3 个回复 • 257 次浏览 • 2019-10-29 20:17 • 来自相关话题

发现wecenter后端有个很奇怪的问题,懂技术的都来看看。。。。。

回复

WeCenter 程序bennyyao 发起了问题 • 1 人关注 • 0 个回复 • 595 次浏览 • 2019-04-18 12:49 • 来自相关话题

请问,现在的系统,对发布悬赏的判断,仅仅是有没有category参数吗? 有点困惑。。。

回复

建站运营fanta 回复了问题 • 4 人关注 • 1 个回复 • 592 次浏览 • 2019-04-08 13:31 • 来自相关话题

需要一个二开思路

回复

创意与设计marco_hsu 回复了问题 • 4 人关注 • 3 个回复 • 738 次浏览 • 2019-01-17 16:55 • 来自相关话题

关于wecenter上传图片的压缩质量问题,疑似BUG !

回复

WeCenter 程序 回复了问题 • 8 人关注 • 4 个回复 • 1056 次浏览 • 2019-01-03 09:49 • 来自相关话题

如果增加了字段、修改过模板,升级怎么避免被覆盖?

回复

建站运营kaiheitv 回复了问题 • 6 人关注 • 4 个回复 • 818 次浏览 • 2018-12-25 12:46 • 来自相关话题

bootstrap自帶都有幻燈片功能官方首頁又去加載一個JS

回复

建议marco_hsu 回复了问题 • 5 人关注 • 4 个回复 • 985 次浏览 • 2018-12-13 11:39 • 来自相关话题

寻求插件功能开发,预算合理就可以开工了...........

回复

WeCenter 程序张三疯子 回复了问题 • 2 人关注 • 1 个回复 • 852 次浏览 • 2018-12-09 00:55 • 来自相关话题

把xunsearch集成到wecenter系统中,有没有做过的?

回复

问与答WhoCareWho 发起了问题 • 1 人关注 • 0 个回复 • 603 次浏览 • 2018-10-29 16:21 • 来自相关话题

感觉黑色的抬头比蓝色的好看

回复

建议风见雨下 回复了问题 • 2 人关注 • 1 个回复 • 904 次浏览 • 2018-10-11 13:36 • 来自相关话题

wecenter测试网站联盟广告是否被屏蔽

WeCenter 程序三叔 发表了文章 • 1 个评论 • 58 次浏览 • 4 天前 • 来自相关话题

代码是网上找的。我这只是做成了独立的模板,然后输出。便于将来迁移。步骤如下:第一步:创建 /static/js/adview_pic_cpc_cpm_cpa_guanggao_gg_ads_300x ...查看全部

代码是网上找的。

我这只是做成了独立的模板,然后输出。便于将来迁移。

步骤如下:

第一步:

创建 /static/js/adview_pic_cpc_cpm_cpa_guanggao_gg_ads_300x250.js

写入内容:

var killads = true;


第二步 

创建模板 /views/default/block/ads_block_check.tpl.htm


第三步

在第二步的模板中写入:

<script src="/static/js/adview_pic_cpc_cpm_cpa_guanggao_gg_ads_300x250.js" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript">
if (typeof(killads)=='undefined'){
    console.log('广告被过滤');

    自行处理代码;
}
</script>


第四步:

在适当的模板中,比如/views/default/article/index.tpl.htm的最底部的代码

<?php TPL::output('global/footer.tpl.htm'); ?>

上面引入这个检查广告是否被屏蔽的代码:

<?php TPL::output( 'block/ads_block_check.tpl.htm'); ?>

最后刷新页面:

就会出现你的处理代码:


并且在控制台中输出:


还记得老夫的吹牛贴么,一个月增粉1万3.

建站运营三叔 发表了文章 • 2 个评论 • 490 次浏览 • 2019-07-24 10:20 • 来自相关话题

上个月的今天老夫发了个贴:之前在官方群里说的一个设想实现了。那时候截了个粉丝数量 ...查看全部

上个月的今天老夫发了个贴:

之前在官方群里说的一个设想实现了。

那时候截了个粉丝数量截图:


整一个月过去了,发一下现在的截图。


今天正好增粉13000.

wecenter的二开实在是太强大了!!!!

wecenter里改造扫码登录跳到自己定义的页面里拿到openid

WeCenter 程序三叔 发表了文章 • 0 个评论 • 521 次浏览 • 2019-07-09 16:23 • 来自相关话题

微信oauth登录过程: 引导用户跳转到微信服务器,并且带上一个编码后的地址A 用户在微信服务器,点击同意授权(或者无感知的登录),就会跳转到地址A,并且带上参数code ...查看全部

微信oauth登录过程:



引导用户跳转到微信服务器,并且带上一个编码后的地址A

用户在微信服务器,点击同意授权(或者无感知的登录),就会跳转到地址A,并且带上参数code

我们需要在地址A拿到code参数,然后加上微信服务号的appid和appkey等参数,请求微信服务器,然后就得到了用户openid和一个token

用户openid已经是唯一标识符了,如果我们还需要用户其它信息,就需要用token和openid再一次请求微信服务器,从而获取所需信息。



-----------------------------------------------------



wecenter扫码登录的二维码解析后是:



http://www.xxxx.com/?/m/weixin/oauth_redirect/?uri=http://www.xxxx.com/?/m/weixin/qr_login/token-14869783&scope=snsapi_userinfo&state=OAUTH_REDIRECT



扫码回跳后会拿到code



具体的参见:



/app/m/weixin.php里的public function qr_login_action()方法



我们可以拿到 code 和 token两个参数,这里的token应该是wc生成的,不是微信的access_token



当然,我的这篇帖子并不是用来介绍wecenter的扫码登录的。



所以我利用官方的方法来实现自己的目的。



我们首先改造二维码。



我们在/app/weixin/main.php里新增代码



public function login_qr_code_4winform_action()

    {

        include(AWS_PATH . 'Services/phpqrcode/qrlib.php');

        header('Content-Type: image/png');

        ob_clean();

        QRcode::png($this->model('openid_weixin_weixin')->get_oauth_url(get_js_url('/winform/ajax/get_openid/token-' . $this->model('openid_weixin_weixin')->request_client_login_token(session_id())), 'snsapi_userinfo', 'OAUTH_REDIRECT'), null, QR_ECLEVEL_L, 4);

    }



这里我们参考了官方的代码,修改了上面标红的地方。



然后我们在 /app/winform/里增加ajax.php,然后在php里增加方法:



 public function get_openid_action()

    {

          if ($_GET['code'])

        {

            if ($access_token = $this->model('openid_weixin_weixin')->get_sns_access_token_by_authorization_code($_GET['code']))

            {

                echo $access_token['openid'];

            }

            //

        }

    }



这样就可以在扫码后跳到这个函数里拿到openid了,当然还有access_token 具体想做什么随你。


给问题加一个自动清理垃圾问题的方法

建站运营Alu 发表了文章 • 4 个评论 • 569 次浏览 • 2019-07-01 19:42 • 来自相关话题

你的网站是不是也被灌水机攻击了,删问题删的手软,以下方法可以让它自动清理: 1、禁止灌水发提问的用户(这是关键) 2、在程序目录下的 models\question ...查看全部

你的网站是不是也被灌水机攻击了,删问题删的手软,以下方法可以让它自动清理:



1、禁止灌水发提问的用户(这是关键)



2、在程序目录下的 models\question.php 代码最下面 } 前添加:



    public function delete_user_question()

    {

        if (AWS_APP::cache()->get('delete_question_num')) {

            return false;

        }

        $uids = $ids = array();

        if (! $uids = AWS_APP::cache()->get('delete_user_question')) {

            $time = time() - 86400 * 90;

            foreach($this->fetch_all('users', 'reg_time>' . $time . ' AND integral>100 AND forbidden>0', '', null, 1000) as $value) {

                $uids[] = $value['uid'];

            }

            AWS_APP::cache()->set('delete_user_question', $uids, 86400);

        }

        if ($question = $this->fetch_all('question', "published_uid IN(" . implode(',', $uids) . ")", '', 1000))

        {

            foreach($question as $key => $value) {

                $ids[] = $value['question_id'];

                $this->remove_question($value['question_id']);

            }

            if (($num = count($ids)) <= 0) {

                AWS_APP::cache()->set('delete_question_num', 100);

            }

        }

    }



3、在计划任务里添加 models\crond.php



// 每半分钟执行 或 // 每分钟执行 或自行选择周期



$this->model('question')->delete_user_question();



 



 


谷歌浏览器(chrome)或360浏览器获取cookie的方法

建站运营三叔 发表了文章 • 1 个评论 • 865 次浏览 • 2019-06-29 18:38 • 来自相关话题

  拿B站说事。 首先登录自己的会员。 然后在任意页面按下快捷键“F12” ...查看全部

 



拿B站说事。



首先登录自己的会员。



然后在任意页面按下快捷键“F12”



弹出下面的框。





然后选择Application



就会进入下面的界面





 



在左边的 Storage里点击Cookies ,然后再点击 www.bilibili.com



就会出现右侧的本地所有的Cookie.



因为我们只用到 SESSDATA的值 所以我们在  这里双击就可以复制了。


之前在官方群里说的一个设想实现了。

WeCenter 程序三叔 发表了文章 • 1 个评论 • 680 次浏览 • 2019-06-24 10:11 • 来自相关话题

之前在官方群里吹牛逼: 我最近在写桌面工具,我要让我的用户关注我公众号的可以用我的软件,凡是取消关注的都不可以再用! ...查看全部

之前在官方群里吹牛逼:



我最近在写桌面工具,我要让我的用户关注我公众号的可以用我的软件,凡是取消关注的都不可以再用!



好了,牛逼实现啦!!!



我来说说我的实现思路:



第一步:



我在数据库创建了一个表: aws_tool_weixin



里面有三个主要字段: mac, openid,subscribe  以及日期等辅助字段。



 



第二步:



我在我的winform程序里写了一个带参数的微信关注二维码生成.参数里是用的当前主机的mac地址。





第三步:



我修改了wecenter里和微信交互的那块。在event为 subscribe(是否关注)里增加获取第二步二维码自定义参数值的获取,也就是mac地址



并且判断openid是否存在,如果不存在,则插入一条 mac和openid以及 subscribe=1(1为关注,0为取消关注)



并且新增了 unsubscribe的event判断,这个判断是取消关注的通知。 微信会给我们两个参数: openid  unscribe。



我会根据openid查询是否有记录,有记录则把subscribe字段改为0





第四步:



用户在我的桌面程序里,关注完公众号开始操作。第一次操作的时候,会去查询我的接口,传入mac地址。 因为关注二维码我是不知道当前用户的openid的,但是第二步里我将mac地址和openid绑在一起了。 所以此时传入mac地址的时候,会从接口里读出对应的数据库了的openid。并且将openid保存到本地。下次查询就带着openid去查询了。



如果查询到的subscribe



如果是1 那就是已关注我的公众号且未取消



如果是0 那就是已经取消关注,那就直接弹出对话框:“因为你取消了关注,你已经不可以再使用本软件”



如果后端传来的是没有数据。那就弹出第二步的窗口 让用户关注。



 



最后



自此我的思路就好了。虽然如此 但是还是会有十分之一的人会取消关注。那就不好意思了。昨天还有人发语音问我:为什么我关注了,却用不了你们的软件。 我直接告诉他几点关注的 几点取消关注的。





 



目前我的公众号人数暴涨。




wecenter二开之微信ticket和access_token的获取

WeCenter 程序三叔 发表了文章 • 2 个评论 • 357 次浏览 • 2019-06-21 14:33 • 来自相关话题

//获取token $access_token = $this->model('openid_weixin_weixin')->get_access_token(get_setting( ...查看全部

//获取token



$access_token = $this->model('openid_weixin_weixin')->get_access_token(get_setting('weixin_app_id'), get_setting('weixin_app_secret'));



 



//获取ticket



$jsapi_ticket = $this->model('openid_weixin_weixin')->get_jsapi_ticket($access_token);


Wecenter插件系统开发规范

插件fanta 发表了文章 • 0 个评论 • 840 次浏览 • 2019-06-14 13:31 • 来自相关话题

1.命名规范



插件命名以wc_作为前缀+插件名,如插件test,即wc_test



2.目录新建



目录新建在根目录下plugin文件夹下,如插件名test,目录结构就是/plugins/wc_test/



3.目录结构



目录包含内容必须要有配置文件、核心类,非必要的有模型类、静态资源、第三方类、页面模板等,如test,则玩着目录如下



wc_test



|-config.php  配置文件



|-test.php   核心类



|-test_model  模型类



|-view     视图模板目录



|-static    静态资源目录



|-install.sql   安装sql



|-uninstall.sql  卸载sql



|-upgrade.sql  升级sql



4.配置文件



Config.php配置文件 返回一个多维数组,包含有:



name: 插件标识



title 插件标题名称



intro 插件介绍



author : 插件作者



version 插件版本



state  插件状态



config: 也是一个数组,包含所需的配置项,如:



  'config'=>[



  'ad_plugin_enable' =>



  array (



    'title' => '广告开启',



    'type' => 'radio',



    'value' => 'Y',



    'options' =>



    array (



      'Y' => '开启',



      'N' => '关闭',



    ),



  )



],



以上的配置config就是后台广告插件的配置显示效果,



'options' 对应的是配置项的值,



'value' 是默认值,



'type' 是配置类型,



'title' 是配置名称



常用的有textselectradioCheckBox



ad_plugin_enable是开发者自己定义,调用的时候调用此键名即可



5.核心类



核心类同样继承自AWS_CONTROLLER,包含5个固定方法,即构造方法 install安装,uninstall卸载,enable启用,disable禁用,构造方法获取插件的配置和插件相关信息,安装、卸载、启用、禁用四个方法默认是调用系统的方法,也可以自定义,在方法里自行处理相关逻辑。



除了这5个方法之外,开发者可以自定义其他的方法进行调用。



6.模型类



模型类的定义名称需后接_model方可,如test_model,内部的定义与使用与model目录下的模型相同,



另注意一点,此处的模型名不可与model目录下的模型重名,如果重名,会去调用model目录下的模型,从而会导致找不到相关的方法一类的错误。



调用方法还是$this->model()进行调用。



6.staticview静态资源、视图目录



Staic目录存放css\js等静态资源



View 视图目可存放后台以及前台的视图模板



后台视图的要在目录下新建子目录admin,前台的模板直接放在view下即可,在核心类中,通过 PLUTPL::output('ad/banner');渲染页面,其中ad是插件名或者标识,banner是页面名称



后台的只需加上admin即可,如PLUTPL::output('ad/admin/edit');



7.安装、卸载、升级



安装、卸载、升级在后台都有相对应的操作,对应相应的sql执行即可。



8.插件调用



正常的调用只需用公共方法hook()方法调用即可,在后台或者其他的页面需要调用插件方法进行页面调用或方法的时候,可以通过doact方法,前台explore/doact  后台admin/plugin/doact  ,



添加广告按钮需要调用插件添加广告的方法,此处是超链接,可以通过admin/plugin/doact/?p=ad&a=edit进行传参调用,其中pa是必传的,p是插件名,a是方法名。


在文章底部增加第三方社交分享功能

建站运营三叔 发表了文章 • 5 个评论 • 754 次浏览 • 2019-05-29 12:25 • 来自相关话题

第一步: 在 /views/default/global/下创建文件 socialshare.tpl.htm 写入代码: ...查看全部

第一步:



在 /views/default/global/下创建文件 socialshare.tpl.htm



写入代码:



<div class="social-share" data-mobile-sites="weibo,qq,qzone,tencent,wechat"></div>

<link href="//cdnjs.cloudflare.com/ajax/libs/social-share.js/1.0.16/css/share.min.css" rel="stylesheet">

<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/social-share.js/1.0.16/js/jquery.share.min.js"></script>



 



第二步:



/views/模板/article/index.tpl.htm 你要放社交按钮的地方增加代码:



<?php TPL::output('global/socialshare.tpl.htm'); ?>



 



收功!



效果如:





 



参考网页:



http://www.bejson.com/a/12.html



 


瀑布流卡片风格,接受预定!先看图吧,这个是浏览器里随手搭的大概样子,实际会更精致

创意与设计bennyyao 发表了文章 • 5 个评论 • 817 次浏览 • 2019-04-18 09:53 • 来自相关话题

  ...查看全部


 


 


除了feed改为瀑布流卡片风格外,其他页面布局应该还会是原版布局。


另外,sidebar搬到左侧,也会有白色底,或透明底都可。


 


接受预定。如果有10人有意向买,我就开做。


 


你们还可以留言给出你的具体需求建议,我综合考虑。

二次开发,简单的说就是在现有的软件上进行定制修改,功能的扩展,然后达到自己想要的功能,一般来说都不会改变原有系统的内核。