存档在 2016年10月

先进的权限模型体系设计

2016年10月30日

目前权限管理系统不少,但通用、灵活、符合现代企事业单位实际工作需要的不多。现有的权限系统绝大多数都是以模块为核心,而本权限模型将摒弃此类普遍的做法,将以组织机构为核心来进行权限系统的设计,因为这更符合实际的业务需求

附 – 权限模型+流程专家:http://pjdemo.yellbuy.com/

    附 – 代码工厂 MVC 插件 Demo 地址:http://mvcdemo.yellbuy.com/

    附 – 代码工厂 WPF 插件 介绍:http://www.cnblogs.com/gyche/archive/2012/06/02/2531121.html

    附件下载一 – 代码工厂:YbSoftwareFactory V2 下载,运行环境-.NET 4.0。

    附件下载二 – 代码工厂 WinForm 插件 Demo:YbRapidSolution for WinForm Demo下载:运行环境-.NET 4.0。服务层部署在 Internet 上,,可直接运行;如需在本地部署,除了安装数据库外,就是修改配置文件,这里不再详述。

u盘修复指令

2016年10月27日

chkdsk F: /R

百度地图获取数据库表中信息的坐标点显示在地图上

2016年10月20日

map.js

//通用封装好的js:

var map = new BMap.Map("container"); //建树Map实例
var point = new BMap.Point(103.976032, 33.845509); // 建树点坐标
map.centerAndZoom(point, 6); // 初始化地图,设置中心点坐标和地图级别。
//地图事件设置函数:
map.enableDragging(); //启用地图拖拽事件,默认启用(可不写)
map.enableScrollWheelZoom(); //启用地图滚轮放大缩小
map.enableDoubleClickZoom(); //启用鼠标双击放大,默认启用(可不写)
map.enableKeyboard(); //启用键盘上下左右键移动地图

//向地图中添加缩放控件
var ctrl_nav = new BMap.NavigationControl({ anchor: BMAP_ANCHOR_TOP_LEFT, type: BMAP_NAVIGATION_CONTROL_LARGE });
map.addControl(ctrl_nav);
//向地图中添加缩略图控件
var ctrl_ove = new BMap.OverviewMapControl({ anchor: BMAP_ANCHOR_BOTTOM_RIGHT, isOpen: 1 });
map.addControl(ctrl_ove);
//向地图中添加比例尺控件
var ctrl_sca = new BMap.ScaleControl({ anchor: BMAP_ANCHOR_BOTTOM_LEFT });
map.addControl(ctrl_sca);
//创建marker
function addMarker() {
    for (var i = 0; i < markerArr.length; i++) {
        var json = markerArr[i];
        var p0 = json.point.split("|")[0];
        var p1 = json.point.split("|")[1];
        var point = new BMap.Point(p0, p1);
        
        var iconImg = createIcon(json.icon);
        var marker = new BMap.Marker(point, { icon: iconImg });
        map.addOverlay(marker);
    }
}
//创建一个Icon
function createIcon(json) {
    // 创建图标对象   
        //var myIcon = new BMap.Icon("../marker_red_sprite.png", new BMap.Size(23, 25), {
        //    // 指定定位位置。   
        //    // 当标注显示在地图上时,其所指向的地理位置距离图标左上    
        //    // 角各偏移10像素和25像素。您可以看到在本例中该位置即是   
        //    // 图标中央下端的尖角位置。    
        //    offset: new BMap.Size(10, 25),    
        //    // 设置图片偏移。   
        //    // 当您需要从一幅较大的图片中截取某部分作为标注图标时,您   
        //    // 需要指定大图的偏移位置,此做法与css sprites技术类似。    
        //    //imageOffset: new BMap.Size(0, 0 - index * 25)   // 设置图片偏移    
        //});
    var icon = new BMap.Icon(图片名称, new BMap.Size(json.w, json.h), { imageOffset: new BMap.Size(-json.l, -json.t), infoWindowOffset: new BMap.Size(json.lb + 5, 1), offset: new BMap.Size(json.x, json.h) })
    return icon;
}

Map.js

获取数据库数据

<html>
 <head>
  <title>百度地图加载</title>
 </head>
 <script src="Map.js"></script>
 <script type="text/javascript"> 
    
    //声明全局数组
    var markerArr = [];
    $(function () {
        //点击查询加载标注
        $("#btnSearch").click(function () {
            LoadMap();
        });

    });

    //加载游客地理位置
    function LoadMap() {
       //清空数组和所有标注点
        markerArr = [];
        map.clearOverlays();
        var par={
            startDate:$("#startDate").val(),
            endDate:$("#endDate").val()
        }
        $.ajax({
            type: "get",
            url: "/VisitorClient/GetAllInfo",
            data: par,
            dataType:"json",
            cache: false,
            success: function (r) {
                if (r.res) { 
                    dataBind(r);
                    $("#spannum").text("该时段App园区游客人数为:" + r.count);
                }
                else {
                    $("#spannum").text("该时段园区没有人使用App");
                }
                
            },
            error: function (d)
            {
                
                alert(d.responseText);
            }
        });    
    }
    function dataBind(r) {
        $.map(r.data, function (d) {
            
            var arr = { point: "" + d.Longitude + "|" + d.Latitude };
            markerArr.push(arr);
        });
        addMarker();
    }

</script>
 <body>
  <input type="button" value="搜索" id="btnSearch"/>
 </body>
</html>

《从你的全世界路过》

2016年10月12日
  • 当你全力以赴打算对一个人好的时候,你就变成了傻子、聋子,眼里除了他什么人都没有,就连伤害,都变成了一场恋爱的检测,你还傻兮兮的鼓励自己,安慰自己,要坚强。
  • 我希望有个如你一般的人,如山间清爽的风,如古城温暖的光,从清晨到夜晚,由山野到书房,只要最后是你
  • 故事的开头总是这样,适逢其会,猝不及防。故事的结局总是这样,花开两朵,天各一方。
  • 在季节的车上,如果你要提前下车,请别推醒装睡的我,这样我可以沉睡到终点,假装不知道你已经离开。
  • 我觉得这个世界美好无比。晴时满树花开,雨天一湖涟漪,阳光席卷城市,微风穿越指间,入夜每个电台播放的情歌,沿途每条山路铺开的影子,全部是你不经意写的一字一句,留我年复一年朗读。这世界是你的遗嘱,而我是你唯一的遗物。
  • 世事如书,我偏爱你这一句,愿做个逗号,呆在你脚边。但你有自己的朗读者,而我只是个摆渡人。
  • 我们在同一个时区,却有一辈子的时差。
  • 一个人的记忆就是一座城市,时间腐蚀着一切建筑,把高楼和道路全部沙化。如果你不往前走,就会被沙子掩埋。所以我们泪流满面,步步回头,可是只能往前走。
  • 我淋过的最大的雨,是那一天你在烈日下的不回头。
  • 你燃烧,我陪你焚成灰烬。你熄灭,我陪你低落尘埃。你出生,我陪你徒步人海。你沉默,我陪你一言不发,你欢笑,我陪你山呼海啸。你衰老,我陪你满目疮痍。你逃避,我陪你隐入夜晚。你离开,我只能等待。
  • 可不可以等等我,等我幡然醒悟,等我明辨是非,等我说服自己,等我爬出悬崖。等我缝好胸腔,来看你。
  • 所有人的坚强,都是柔软生的茧。
  • 我希望买的鞋子是你渴望的颜色。我希望拨通电话时你恰好在想我。我希望说早安你也刚起床。我希望写的书是你欣赏的故事。我希望关灯的刹那你正泛起困意。我希望买的水果你永远觉得是甜的。我希望点的歌都是你喜欢唱的。我希望我希望的是你希望的。
  • 过自己想要的生活,上帝会让你付出代价。照顾好自己,爱自己才能爱好别人。如果你压抑,痛苦,忧伤,不自由,又怎么可能在心里腾出温暖的房间,让重要的人住在里面。如果一颗心千疮百孔,住在里面的人就会被雨水打湿。
  • 总有几分钟,其中的每一秒,你都愿意拿一年去换取。总有几颗泪,其中的每一次抽泣,你都愿意拿满手的承诺去代替。总有几段场景,其中的每幅画面,你都愿意拿全部的力量去铭记。总有几段话,其中的每个字眼,你都愿意拿所有的夜晚去复习。亲爱的,如果一切可以重来,我想和你,永远在一起。
  • 回忆不能抹去,只好慢慢堆积。岁月带你走上牌桌,偏偏赌注是自己。
    你燃烧,我陪你焚成灰烬。你熄灭,我陪你低落尘埃。你出生,我陪你徒步人海。你沉默,我陪你一言不发。你欢笑,我陪你山呼海啸。
    你衰老,我陪你满目疮痍。你逃避,我陪你隐入夜晚。你离开,我只能等待。
    没有很好的机会跟你说一声“再见”,以后再也见不到你。比幸福更悲伤,比相聚更遥远,比坚强更脆弱,比离开更安静。
    终将有一天,我要背上行囊登船了。不是那艘钢铁巨兽,只是一叶很小的竹筏。我会努力扎起薄弱的帆,希望你能看见一点遥远的白色。
    或许在深邃的宇宙中,偶尔你能注视一眼。
    那就会让我知道,你安全地降落在另一片土地上,欢歌笑语,我们已经记不起什么叫作惆怅。
  • 你如果想念一个人就会变成微风,轻轻掠过他的身边。就算他感觉不到,可这就是你全部的努力。人生就是这样子,每个人都变成各自想念的风。
  • 这世界是你的遗嘱,而我是你唯一的遗物。
  • 韶光太好,怎么走过都是辜负。青春太短,怎么燃烧都是耽误。幸福太远,怎么奔跑都是驻足。不如潦草穿了衣服,一路种花,一路纵酒,在碧水青山里,写自己的句子去。白云深处一回头,年少时在山顶读书。
  • 我们在年少时并不知道,有些乐章,一旦开始,唱得就是曲终人散。
  • 我知道自己喜欢你, 但我不知道将来在哪里。 因为我知道, 无论哪里, 你都不会带我去。 而记忆打亮你的微笑, 要如此用力才变得欢喜。
  • 我会承诺很多,实现很少,我们会面对面越走越远,肩并肩悄然失散。你会掉眼泪,每一颗都烫伤我的肌肤。你应该留在家里,把试卷做完,而不是和我一起交了空白纸张。对不起,爱过你。
  • “我爱你”是三个字,三个字组成最复杂的一句话。
    有些人藏在心里,有些人脱口而出。也许有人曾静静看着你:可不可以等等我,等我幡然醒悟,等我明辨是非,等我说服自己,等我爬上悬崖,等我缝好胸腔来看你。
    可是全世界没有人在等。是这样的,一等,雨水将落满单行道,找不到正确的路标。一等,生命将写满错别字,看不见华美的封面。
    全世界都不知道谁在等谁。
    而管春在等毛毛。
    我希望有个如你一般的人。这世界有人的爱情如山间清爽的风,有人的爱情如古城温暖的阳光。但没关系,最后是你就好。
    由起点到夜晚,由山野到书房,一切问题的答案都很简单。所以管春点点头。
    那,总会有人对你点点头,贯彻未来,数遍生命的公路牌。
  • 与其怀念,不如向往,与其向往,不如该放就放去远方。
  • 我们都会上岸,阳光万里,去哪里都是鲜花开放。
  • 我是有多愚蠢,我是有多渴望;我是有多执迷不悟,我是有多空空荡荡。你是有多善良,你是有多简单;你是有多形单影只,你是有多踉踉跄跄。大家笑得有多牵强,哭得有多委屈,想念是有多安然无恙。
  • 我喜欢独自一个人,直到你走进我的心里。那么,我只想和你在一起,我不喜欢独自一个人。
    我想分担你的所有,我想拥抱你的所有,我想一辈子陪着你,我爱你,我无法抗拒,我就是爱你。
  • 有些东西明明一文不值,却不舍得丢掉。有时候找不着还会急得坐立不安。问题是他们越来越旧,越来越老,而我渐渐不敢看它们。它们装在盒子里,放在角落里,像一部部电影。随时都能让我重新看到一场大雨。一次分离,一杯咖啡,一个拥抱。
  • 没有很好的机会和你说再见,以后再也见不到你。比幸福更悲伤,比相聚更遥远,比坚强更脆弱,比离开更安静。
  • 有很多话想跟你说,但一直没有机会。我携带着它们穿越季节,掠过高架,铺在山与海之间。花盛开就是一句,夜漫过就是一篇。黄昏开始书写,黎明是无数的扉页。全世界拼成首诗,我爱你当作最后一行。
  • 靠着树干坐下,头顶满树韶光,枝叶的罅隙里斜斜地透着记忆,落满一地思念。醒来拍拍裤管,向不知名的地方走去。
  • 有些人藏在心里,有些人脱口而出。也许有人曾静静看着你:可不可以等等我,等我幡然醒悟,等我明辨是非,等我说服自己,等我爬出悬崖,等我缝好胸腔来看你
  • 时间这么快。你们很重要,可以走开一会,但是别走散了。
  • 遇到喜欢的人“一定要先追,因为你先追,顶多一开始丢点儿面子。如果追到了,就说明你研究了她的爱好,迎合她的喜怒,你已经慢慢渗透她的生活,等你厌倦她的时候,她却已经离不开你。因此,在结局里,一般提出分手的,都是先追求的那一个。”

easyui为tabs添加右键菜单

2016年10月11日

菜单就是easyui的menu组件,使用者可以为菜单选项添加图标,定义样式,甚至可以设置多级结构的菜单。

<div id="rcmenu" class="easyui-menu" style="">
	<div data-options="iconCls:'icon-cancel'" id="closecur">
		关闭
	</div>
	<div id="closeall">
		关闭全部
	</div>
	<div id="closeother">
		关闭其他
	</div>
	<div class="menu-sep"></div>
	<div id="closeright">
		关闭右侧标签页
	</div>
	<div id="closeleft">
		关闭左侧标签页
	</div>
</div>

easyui-menu的使用请参考官方文档:http://www.jeasyui.com/documentation/menu.php

$(function(){
			
	$(".tabs-header").bind('contextmenu',function(e){
		e.preventDefault();
		$('#rcmenu').menu('show', {
			left: e.pageX,
			top: e.pageY
		});
	});
	//关闭当前标签页
	$("#closecur").bind("click",function(){
		var tab = $('#tab').tabs('getSelected');
		var index = $('#tab').tabs('getTabIndex',tab);
		$('#tab').tabs('close',index);
	});
	//关闭所有标签页
	$("#closeall").bind("click",function(){
		var tablist = $('#tab').tabs('tabs');
		for(var i=tablist.length-1;i>=0;i--){
			$('#tab').tabs('close',i);
		}
	});
	//关闭非当前标签页(先关闭右侧,再关闭左侧)
	$("#closeother").bind("click",function(){
		var tablist = $('#tab').tabs('tabs');
		var tab = $('#tab').tabs('getSelected');
		var index = $('#tab').tabs('getTabIndex',tab);
		for(var i=tablist.length-1;i>index;i--){
			$('#tab').tabs('close',i);
		}
		var num = index-1;
		for(var i=num;i>=0;i--){
			$('#tab').tabs('close',0);
		}
	});
	//关闭当前标签页右侧标签页
	$("#closeright").bind("click",function(){
		var tablist = $('#tab').tabs('tabs');
		var tab = $('#tab').tabs('getSelected');
		var index = $('#tab').tabs('getTabIndex',tab);
		for(var i=tablist.length-1;i>index;i--){
			$('#tab').tabs('close',i);
		}
	});
	//关闭当前标签页左侧标签页
	$("#closeleft").bind("click",function(){
		var tab = $('#tab').tabs('getSelected');
		var index = $('#tab').tabs('getTabIndex',tab);
		var num = index-1;
		for(var i=0;i<=num;i++){
			$('#tab').tabs('close',0);
		}
	});
		
});

$(‘.tabs-header’)为tabs的hearder对象,通过绑定contextmenu事件,并阻止默认的事件,来实现在header区域右键弹出菜单操作。最后运用官方提供的api,来实现tab标签页的关闭。

科大博客提供 Google Fonts 加速

2016年10月9日

由于 fonts.googleapis.com 在国内访问不稳定,USTC Blog 某些主题中的字体加载不出来。现在 LUG 提供了 Google Fonts 加速服务,已经把 WordPress 原始代码和用户主题内的 Google 字体和 CSS、JS 文件替换成了 LUG 的代理,以加速字体的显示。

事实上 360 网站卫士已经提供了 Google Fonts 加速服务(libs.useso.com),但不支持 HTTPS。HTTPS 博客内只能引用 HTTPS 资源,因此不能用他们的服务,只好自建了。我们的做法与他们类似,我们的服务器通过“国际专线”(你懂的)对用户的请求做代理,并修改 HTTP 响应内容中的 URL(例如 fonts.googleapis.com 中会引用 themes.googleusercontent.com 的资源)。感谢 雨路 和 stephen 的建议。

如果您的博客不在科大 LUG 上,也想使用加速服务,请在 WordPress 源码内进行如下替换:

  1. ajax.googleapis.com => ajax.lug.ustc.edu.cn
  2. fonts.googleapis.com => fonts.lug.ustc.edu.cn
  3. themes.googleusercontent.com => google-themes.lug.ustc.edu.cn

thinkphp中的session的使用

2016年10月8日

session的作用:session可以长时间的保存数据,不丢失。

session的常用于:
1.登录,保存登录信息
2.保存购物车信息
3.保存验证码信息
链接:http://document.thinkphp.cn/manual_3_2.html#session

定义session常量

define('WXUSER', 'wxuser_session');
define('MEMBER', 'member_session');
define('MERCHANT', 'merchant_session');
define('AGENT', 'agent_session');
define('CART', 'cart_session');

给session赋值

session(MERCHANT, $user['id']);

根据session获取用户信息

$user = M('user')->where(array('id' => session(MERCHANT)))->find();
$this->user = $user;
$this->user_id = $user['id'];

如果session存在,直接进入主界面,否则进入登录界面

 //商户登陆
    public function login() {
        if (session(MERCHANT)) {
            $this->redirect(U('User/Index/index'));
        } else {
            $this->display();
        }
    }

登出,销毁session

//登出
    public function userLogout()
    {
        session(null);
        //session_destroy();
        //unset($_SESSION);
        $this->redirect(U('Home/Index/index'));
    }

关于session的几点理解与测试

  • 同一个浏览器,同一个session名,不同的网址,保存的位置不同。销毁其中一个,另外的并没有收到影响。
  • session是保存在服务器上的,不同的网址意味着不同的服务器。销毁其中一个,其他的并没有收到影响。
  • 当你关闭浏览器的时候,session的死期也就到了。
  • 同一个网址,不同的浏览器打开都有对应的一个session。
  • 大部分的Session机制都使用进程中Cookie来保存Session_id的,关闭浏览器后这个进程也就自动消失了,进程中的Cookie自然就消失了,那么Session_id也跟着消失了,再次连接到服务器时也就无法找到原来的Session了。
  • 我们可以在登陆时点击下次自动登录,比如说“记住我一周”。这就要用到我们上文提到的另一种Cookie了——硬盘中Cookie,这时Session_id将长期保存在硬盘上的Cookie中,直到失效为止。

WECHAT-PHP-SDK

2016年10月7日
  • 此 SDK 运行最底要求 PHP 版本 5.3.3 , 建议在 PHP7 运行以获取最佳性能。
  • 微信的部分接口需要缓存数据在本地,因此对目录需要有写权限。
  • SDK 已经过数个线上项目验证,可靠性极高,欢迎阅读 SDK 相关源码。
  • 我们鼓励大家使用 composer 来管理您的第三方库,方便后期更新操作(尤其是接口类)。
  • 近期发现 access_token 经常无故失效,此 SDK 加入失败状态检测,重新生成 access_token 并试图再次返回结果.

SDK开发文档

官方接口文档链接

SDK 封装对接及功能

  • 接入验证 (初级权限)
  • 自动回复(文本、图片、语音、视频、音乐、图文) (初级权限)
  • 菜单操作(查询、创建、删除) (菜单权限)
  • 客服消息(文本、图片、语音、视频、音乐、图文) (认证权限)
  • 二维码(创建临时、永久二维码,获取二维码URL) (服务号、认证权限)
  • 长链接转短链接接口 (服务号、认证权限)
  • 标签操作(查询、创建、修改、移动用户到标签) (认证权限)
  • 网页授权(基本授权,用户信息授权) (服务号、认证权限)
  • 用户信息(查询用户基本信息、获取关注者列表) (认证权限)
  • 多客服功能(客服管理、获取客服记录、客服会话管理) (认证权限)
  • 媒体文件(上传、获取) (认证权限)
  • 高级群发 (认证权限)
  • 模板消息(设置所属行业、添加模板、发送模板消息) (服务号、认证权限)
  • 卡券管理(创建、修改、删除、发放、门店管理等) (认证权限)
  • 语义理解 (服务号、认证权限)
  • 获取微信服务器IP列表 (初级权限)
  • 微信JSAPI授权(获取ticket、获取签名) (初级权限)
  • 数据统计(用户、图文、消息、接口分析数据) (认证权限)
  • 微信支付(网页支付、扫码支付、交易退款、给粉丝打款)(认证服务号并开通支付)

接口权限备注:

  • 初级权限:基本权限,任何正常的公众号都有此权限
  • 菜单权限:正常的服务号、认证后的订阅号拥有此权限
  • 认证权限:分为订阅号、服务号认证,如前缀服务号则仅认证的服务号有此权限
  • 支付权限:仅认证后的服务号可以申请此权限

账号creater/XXXXXX

另外一个项目:https://github.com/dodgepudding/wechat-php-sdk