首页
文章
分类
标签
更多
时光机
友情链接
Search
1
史上超全共享单车车锁的开锁方式(含具体方案)转
5,215 阅读
2
渗透测试工具实战技巧合集
3,499 阅读
3
URP综合教务系统通杀getshell
3,023 阅读
4
pentestbox 下安装whatweb后,报IPADDR模块没有配置的解决办法。
2,868 阅读
5
Pentest BOX安装和使用
2,311 阅读
学习资料
工具
视频
笔记
登录
Search
标签搜索
python
javascript
pentestbox
NSA
cms
linux
前端知识
jquery
安全
mysql
php
seafile
seahub
wdcp
Richar
累计撰写
130
篇文章
累计收到
4
条评论
首页
栏目
学习资料
工具
视频
笔记
页面
文章
分类
标签
时光机
友情链接
搜索到
107
篇与
学习资料
的结果
2017-09-25
一个PHP写的数字加解密程序
<?php /** * @Author: Richer * @Date: 2017-09-25 10:05:24 * @Last Modified by: Richer * @Last Modified time: 2017-09-25 11:27:36 */ /** * 加密解密类,PHP加密解密数字,适用于URL加密 * 该算法仅支持加密数字。比较适用于数据库中id字段的加密解密,以及根据数字显示url的加密。 * @version alpha * @加密原则 标记长度 + 补位 + 数字替换 * @加密步骤: * 将a-z,A-Z,0-9 62个字符打乱,取前M(数字最大的位数)位作为 标记长度字符串,取第M+1 到第M+10位为数字替换字符串,剩余的为补位字符串 * 1.计算数字长度n,取乱码的第n位作为标记长度。 * 2.计算补位的长度,加密串的长度N -1 - n 为补位的长度。根据指定的算法得到补位字符串。 * 3.根据数字替换字符串替换数字,得到数字加密字符串。 * 标记长度字符 + 补位字符串 + 数字加密字符串 = 加密串 * 注意:xDeode()中的数字必需大于等于要加密的数字长度,否则可能无法解密 * Usage: * $obj = new XDeode(9); * $e_txt = $obj->encode(123); * echo $e_txt.'<br/>'; * echo $key->decode($e_txt); */ class XDeode { private $strbase = "Flpvf70CsakVjqgeWUP3b8cAEKwTd54nXQxSyJizmNH6B1uRtZOMDhoG2YLrI"; private $key,$length,$codelen,$codenums,$codeext; function __construct($length = 9,$key = 2543.5415412812){ $this->key = $key; $this->length = $length; $this->codelen = substr($this->strbase,0,$this->length); $this->codenums = substr($this->strbase,$this->length,10); $this->codeext = substr($this->strbase,$this->length + 10); } function encode($nums){ $rtn = ""; $numslen = strlen($nums); //密文第一位标记数字的长度 $begin = substr($this->codelen,$numslen - 1,1); //密文的扩展位 $extlen = $this->length - $numslen - 1; $temp = str_replace('.', '', $nums / $this->key); $temp = substr($temp,-$extlen); $arrextTemp = str_split($this->codeext); $arrext = str_split($temp); foreach ($arrext as $v) { $rtn .= $arrextTemp[$v]; } $arrnumsTemp = str_split($this->codenums); $arrnums = str_split($nums); foreach ($arrnums as $v) { $rtn .= $arrnumsTemp[$v]; } return $begin.$rtn; } function decode($code){ $begin = substr($code,0,1); $rtn = ''; $len = strpos($this->codelen,$begin); if($len!== false){ $len++; $arrnums = str_split(substr($code,-$len)); foreach ($arrnums as $v) { $rtn .= strpos($this->codenums,$v); } } return $rtn; } } ?>
2017年09月25日
1,464 阅读
0 评论
0 点赞
2017-09-18
php一个无限遍历数组的小作业(正\倒序输出九九乘法表等....)
//无穷遍历数组 function browArry($arr){ foreach ($arr as $id => $value) { if(is_array($value)){ browArry($value); }else{ echo $value."个<br/>"; } } } //测试数据$arr1 = array(array(array('111','222'),'1','2','3'),'11','22','33', '44');foreach ($arr1 as $key => $value) { if (is_array($value)) { browArry($value); }else{ echo $value."个<br />"; } } *九九乘法表 for ($i=1; $i <= 9; $i++) { for ($j=1; $j<=$i ; $j++) { echo "$j*$i=".$i*$j." "; }; echo "<br/>"; }; echo "_____________<br/>"; for($i=9;$i>=1;$i--){ for ($j=1; $j<=$i ; $j++) { echo "$j*$i=".$i*$j." "; }; echo "<br/>" ; }//文件夹遍历 function dirFile($d){ $dirArr=scandir($d); foreach($dirArr as $dirName){ $temp=$d."/".$dirName; if(is_dir($temp)&& substr($temp,-1,1)!='.' && substr($temp,-1,1)!='..'){ dirFile($temp); }else{ echo $temp."<br/>"; } } } $dirS="f:/www"; dirFile($dirS);//图片计数器//计数器 clearstatcache(); if(!@$f=fopen("num.txt", "r")){ echo "文件不存在!"; $num=0; }else{ $num=fgets($f,10); fclose($f); } $num++; $ff=fopen("num.txt", "w"); fwrite($ff, $num); fclose($ff); $numArr=str_split($num); foreach ($numArr as $key => $value) { echo "<img src='img/".$value.".jpg'></img>"; }
2017年09月18日
1,303 阅读
0 评论
0 点赞
2017-09-06
前端工程师必备实用网站
一、配色类网站http://colorhunt.co这个网站给我们提供了很多的配色方案,我们直接使用就OK了。使用方法也很简单,鼠标移动到对应的颜色上,我们就可以看到颜色的十六进制码,复制这个颜色到工具里就可以使用了。https://webgradients.com/180种渐变方案供你选择,还可以直接复制CSS样式应用到网页中https://color.adobe.com/zh/create/color-wheel这个是Adobe公司出的,他提供了多种配色方案。我们点击圆盘中间的点,就可以调整出我们想要的配色方案。http://www.colorhunter.com/这是一个提取现有图片配色方案的工具。我们上传一张图片,它就会帮我们把图片的配色提取出来供我们使用。http://www.bootcss.com/p/websafecolors/这个网站是为WEB设计,开发中经常用到的安全色。网站内列出了颜色的十六进制码和RGB码,复制粘贴就可以了。http://www.sioe.cn/yingyong/yanse-rgb-16/这是一个在线RGB和十六进制颜色码转换工具。在对应的位置填入十六进制代码,点击转换,我们就可以获取到RGB颜色的代码了。二、图标类网站http://www.iconfont.cn/plus这是阿里巴巴旗下的图标库网站,直接搜索关键词就可以找到大批的图标。下载图标的时候我们还可以选择颜色、大小、格式,根据自己的需要下载就好了。http://www.easyicon.net/iconsearch/ios/这也是一个非常有名的图标库,与上面那个不同的是,这里的图标不是单一颜色的,而是设计好的颜色。下载图标也很简单,直接点击对应图标上面的格式就可以下载。http://www.thinkcmf.com/font/search.html奥森图标(Font Awesome)提供丰富的矢量字体图标—通过CSS可以任意控制所有图标的大小 ,颜色,阴影。三、插件类网站http://www.jq22.com/这个网站分享jQuery插件和提供各种jQuery特效的详细使用方法,在线预览,jQuery插件下载及教程http://www.htmleaf.com/这个网站与上一个网站类似,也提供了大量的jQuery插件http://www.layui.com/这是一个强大的模块化前端框架http://www.h-ui.net/index.shtmlH-ui前端框架,一个轻量级前端框架,简单免费,兼容性好,服务中国网站。四、素材类网站http://588ku.com/千库网,一个免费下载图片素材的网站https://unsplash.com/Unsplash是一个分享免费高质量照片的网站,照片分辨率都挺大,而且都是真实的摄影师作品,图片多是风景和静物。五、字体类网站http://www.youziku.com/onlinefont/index有字库,一个免下载字体,直接在线引用字体的网站。http://www.psjia.com/pssc/fontxz/list_18_3.htmlPS字体库,包含了几乎所有类型的字体,下载好安装,PS中就可以使用了。六、工具类http://tool.lu/一个在线工具网站,包含大量在线工具http://www.xueui.cn/design/online-tools方便好用的UI设计工具合集https://tinypng.com/一个在线图片压缩工具,可以批量使用http://www.css88.com/各种前端类工具和技术文章今天就分享这么多吧!大家如果有什么好的工具或者是网站,可以留个言分享一下。咱们共同学习,一起进步!作者:IT青年链接:http://www.jianshu.com/p/53a7da454057來源:简书著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
2017年09月06日
1,324 阅读
0 评论
0 点赞
2017-09-02
实用的sublime插件集合 – sublime推荐必备插件
原文地址:http://blog.csdn.net/jianhua0902/article/details/43761899不得不说,sublime是个神器,不得不说它所支持的扩展和插件,下面在介绍的同时将会奉上生动的动画配图。 前言在阅读此文章之前,建议先阅读这篇:sublime text 2 神器插件介绍Package Control功能:安装包管理简介:sublime插件控制台,提供添加、删除、禁用、查找插件等功能使用:https://sublime.wbond.net/installation安装方法:CTRL+` ,出现控制台 粘贴以下代码至控制台 ST2:1import urllib2,os; pf='Package Control.sublime-package'; ipp = sublime.installed_packages_path(); os.makedirs( ipp ) if not os.path.exists(ipp) else None; urllib2.install_opener( urllib2.build_opener( urllib2.ProxyHandler( ))); open( os.path.join( ipp, pf), 'wb' ).write( urllib2.urlopen( 'http://sublime.wbond.net/' +pf.replace( ' ','%20' )).read()); print( 'Please restart Sublime Text to finish installation')ST3:1importurllib.request,os;pf='Package Control.sublime-package';ipp=sublime.installed_packages_path();urllib.request.install_opener(urllib.request.build_opener(urllib.request.ProxyHandler()));open(os.path.join(ipp,pf),'wb').write(urllib.request.urlopen('http://sublime.wbond.net/'+pf.replace(' ','%20')).read())其他方法:如果以上方法不能安装,请使用下面的方法选择菜单:Preferences > Browse Packages 打开sublime插件安装包文件夹 下载文件并复制到打开的文件夹 重启sublime Emmet功能:编码快捷键,前端必备简介:Emmet作为zen coding的升级版,对于前端来说,可是必备插件,如果你对它还不太熟悉,可以在其官网(http://docs.emmet.io/)上看下具体的演示视频。使用:教程-http://docs.emmet.io/cheat-sheet/、http://peters-playground.com/Emmet-Css-Snippets-for-Sublime-Text-2/emmetJSFormat功能:JavaScript的代码格式化插件简介:很多网站的js代码都进行了压缩,一行式的甚至混淆压缩,这让我们看起来很吃力。而这个插件能帮我们把原始代码进行格式的整理,包括换行和缩进等等,是代码一目了然,更快读懂~使用:在已压缩的JS文件中,右键选择jsFormat或者使用默认快捷键(Ctrl+Alt+F)jsFormatLESS功能:LESS高亮插件简介:用LESS的同学都知道,sublime没有支持less的语法高亮,所以这个插件可以帮上我们使用:打开.less文件或者设置为less格式lessLess2CSS功能:编译Less简介:监测到文件改动时,编译保存为.css文件使用:打开.less文件,编写代码保存即可看到同时生成.css的文件,如果没有则需要安装node。不推荐用这种方法编译,要么用koala,要么就用grunt编译。Alignment功能:”=”号对齐简介:变量定义太多,长短不一,可一键对齐使用:默认快捷键Ctrl+Alt+A和QQ截屏冲突,可设置其他快捷键如:Ctrl+Shift+Alt+A;先选择要对齐的文本alignsublime-autoprefixer功能:CSS添加私有前缀简介:CSS还未标准化,所以要给各大浏览器一个前缀以解决兼容问题使用:Ctrl+Shift+P,选择autoprefixer即可。需要安装Node.js。其他设置如快捷键请参考:https://sublime.wbond.net/packages/AutoprefixerprefixerClipboard History功能:粘贴板历史记录简介:方便使用复制/剪切的内容使用:Ctrl+alt+v:显示历史记录 Ctrl+alt+d:清空历史记录 Ctrl+shift+v:粘贴上一条记录(最旧) Ctrl+shift+alt+v:粘贴下一条记录(最新) keyboardBracket Highlighter功能:代码匹配简介:可匹配[], (), {}, “”, ”, <tag></tag>,高亮标记,便于查看起始和结束标记使用:点击对应代码即可highlightGit功能:Git管理简介:插件基本上实现了git的所有功能使用:https://github.com/kemayo/sublime-text-git/wikigitjQuery功能:jQ函数提示简介:快捷输入jQ函数,是偷懒的好方法jqueryDocBlockr功能:生成优美注释简介:标准的注释,包括函数名、参数、返回值等,并以多行显示,手动写比较麻烦使用:输入/、/*然后回车,还有很多用法,请参照https://sublime.wbond.net/packages/DocBlockrbasic function-templateColorPicker功能:调色板简介:需要输入颜色时,可直接选取颜色使用:快捷键Windows: ctrl+shift+ci5KI6SBAfs7Qk iY1DDCRG5TsyRConvertToUTF8功能:文件转码成utf-8简介:通过本插件,您可以编辑并保存目前编码不被 Sublime Text 支持的文件,特别是中日韩用户使用的 GB2312,GBK,BIG5,EUC-KR,EUC-JP ,ANSI等。ConvertToUTF8 同时支持 Sublime Text 2 和 3。使用:安装插件后自动转换为utf-8格式uy67yAutoFileName功能:快捷输入文件名简介:自动完成文件名的输入,如图片选取使用:输入”/”即可看到相对于本项目文件夹的其他文件autofilenameNodejs功能:node代码提示教程:https://sublime.wbond.net/packages/NodejsZCFcCIMESupport功能:sublime中文输入法简介:还在纠结 Sublime Text 中文输入法不能跟随光标吗?试试「IMESupport 」这个插件吧!目前只支持 Windows,在搜索等界面不能很好的跟随光标。使用:Ctrl + Shift + P →输入pci →输入IMESupport →回车c1608aa0gw1e9dmrd3vxpg209y08d75xTrailing spaces功能:检测并一键去除代码中多余的空格简介:还在纠结代码中有多余的空格而显得代码不规范?或是有处女座情节?次插件帮你实现发现多余空格、一键删除空格、保存时自动删除多余空格,让你的代码规范清爽起来使用:安装插件并重启,即可自动提示多余空格。一键删除多余空格:CTRL+SHITF+T(需配置),更多配置请点击标题。快捷键配置:在Preferences / Key Bindings – User加上代码(数组内)1{"keys":["ctrl+shift+t"],"command":"delete_trailing_spaces"}spacFileDiffs功能:强大的比较代码不同工具简介:比较当前文件与选中的代码、剪切板中代码、另一文件、未保存文件之间的差别。可配置为显示差别在外部比较工具,精确到行。使用:右键标签页,出现FileDiffs Menu或者Diff with Tab…选择对应文件比较即可diffGBK Encoding Support功能:中文识别简介:Sublime Text 2可识别UTF-8格式的中文,不识别GBK和ANSI,因此打开很多含中文的文档都会出现乱码。可以通过安装插件GBK Support,来识别GBK和ANSI。使用:Open a GBK File Save file with GBK encoding Change file encoding from utf8 to GBK or GBK to utf8 zxdcsafsafsaf后续还有Sass、SVN、CoffeeScript等插件,先就介绍这么多,弄配图加翻译测试挺辛苦的,如果觉得不错,可以选择分享或者点击底部中间的小工具收藏此文章。后续会有更新~附注册码:Sublime Text 3 3126 注册码第一个测试通过—– BEGIN LICENSE —–Michael BarnesSingle User LicenseEA7E-8213858A353C41 872A0D5C DF9B2950 AFF6F667C458EA6D 8EA3C286 98D1D650 131A97ABAA919AEC EF20E143 B361B1E7 4C8B7F04B085E65E 2F5F5360 8489D422 FB8FC1AA93F6323C FD7F7544 3F39C318 D95E6480FCCC7561 8A4A1741 68FA4223 ADCEDE07200C25BE DBBC4855 C4CFB774 C5EC138C0FEC1CEF D9DCECEC D3A5DAD1 01316C36—— END LICENSE ———– BEGIN LICENSE —–Free Communities Consultoria em Informática LtdaSingle User LicenseEA7E-801302C154C122 4EFA4415 F1AAEBCC 315F3A7D2580735A 7955AA57 850ABD88 72A1DDD88D2CE060 CF980C29 890D74F2 53131895281E324E 98EA1FEF 7FF69A12 17CA7784490862AF 833E133D FD22141D D8C89B944C10A4D2 24693D70 AE37C18F 72EF0BE51ED60704 651BC71F 16CA1B77 496A0B19463EDFF9 6BEB1861 CA5BAD96 89D0118E—— END LICENSE ———– BEGIN LICENSE —–Nicolas HennionSingle User LicenseEA7E-8660758A01AA83 1D668D24 4484AEBC 3B04512C827B0DE5 69E9B07A A39ACCC0 F95F5410729D5639 4C37CECB B2522FB3 8D37FDC172899363 BBA441AC A5F47F08 6CD3B3FECEFB3783 B2E1BA96 71AAF7B4 AFB61B1D0CC513E7 52FF2333 9F726D2C CDE53B4A810C0D4F E1F419A3 CDA0832B 8440565A35BF00F6 4CA9F869 ED10E245 469C233E—— END LICENSE ———– BEGIN LICENSE —–Anthony SansoneSingle User LicenseEA7E-87856328B9A648 42B99D8A F2E3E9E0 16DE076EE218B3DC F3606379 C33C1526 E8B58964B2CB3F63 BDF901BE D31424D2 082891B5F7058694 55FA46D8 EFC11878 0868F093B17CAFE7 63A78881 86B78E38 0F146238BAE22DBB D4EC71A1 0EC2E701 C7F9C6485CF29CA3 1CB14285 19A46991 E9A9867614FD4777 2D8A0AB6 A444EE0D CA009B54—— END LICENSE ———– BEGIN LICENSE —–Alexey PlutalovSingle User LicenseEA7E-8607763DC19CC1 134CDF23 504DC871 2DE5CE55585DC8A6 253BB0D9 637C87A2 D8D0BA85AAE574AD BA7D6DA9 2B9773F2 324C5DEF17830A4E FBCF9D1D 182406E9 F883EA87E585BBA1 2538C270 E2E857C2 194283CA7234FF9E D0392F93 1D16E021 F191491763909E12 203C0169 3F08FFC8 86D06EA873DDAEF0 AC559F30 A6A67947 B60104C6—— END LICENSE ———– BEGIN LICENSE —–Peter HallidaySingle User LicenseEA7E-8559883997BFF0 2856413A 7A555954 67069B7806D8CE12 63EAF079 AD039757 79E16D13C555AD90 465CBE53 10F6DFC4 D3A3C611411106F8 0CFEB15F 0A7BB891 111F5ED2C6AA8429 77913528 FA6291A9 B88D4550F1D6AB13 BF9153BC 91B4DFFE D296CFE0C1D8EB22 13D5F14E 75A699EC 49EDDC23D89D0F9B D240B10A A3712467 09DE7870—— END LICENSE ———– BEGIN LICENSE —–Fred ZirdungSingle User LicenseEA7E-8446726089C0EC 22936E1A 1EADEBE2 B8654BBA5C98FFA6 C0FD1599 0364779B 071C74FBEEFE9EAB 92B3D867 CD1B32FE D190269F6FC08F8F 8D24191D 32828465 942CE58EAECE5307 08B62229 D788560A 6E0AAC4B48A2D9EE 24FD8CAA 07BEBDF2 28EA86D4CCB96084 6C34CAD2 E8A04F39 3B5A3CBC3B668BB7 C94D0B4B 847D6D7F 4BC07375—— END LICENSE ———– BEGIN LICENSE —–WixelSingle User LicenseEA7E-848235103D2969 8700C7ED 8173CF61 537000C0EB3C7ECB 5E750F17 6B42B67C A190090B7669164F C6F371A8 5A1D88D5 BDD0DA70C065892B 7CC1BB2B 1C8B8C7C F08E77897C2A5241 35F86328 4C8F70D9 C023D7C211245C36 59A730DB 72BDB9A7 D5B2030490E90E72 9F08CA25 73F49C20 179D938E5BC8BEDA 13457A69 39E6265F 233767F9—— END LICENSE ———– BEGIN LICENSE —–Daniel RusselSingle User LicenseEA7E-9174209327EC62 44020C2A 45172A68 12FE13F11D22245B 680892EE F551F8EB C183D0328B4EDB4B 479CB7E4 07E42EDD A780021D56BADF42 AC05238B 023B47B1 EBA1B7DE6DF9A383 159F32AE 04EBE100 1278B1D252E81B60 C68AA2E8 F84A20BE FE7990EB5D44E4B6 16369263 1DDAACBC 280FF19E86CF4319 0B8615A8 4FF0512E B123B8EC—— END LICENSE ———– BEGIN LICENSE —–Peter ErikssonSingle User LicenseEA7E-8900688E107C71 3100D6FC 2AC805BF 9E627C7772E710D7 43392469 D06A2F5B F9304FBDF5AB4DB2 7A95F172 FE68E300 42745819E94AB2DF C1893094 ECABADC8 71FEE76420224821 3EABF931 745AF882 87AD0A4B33C6E377 0210D712 CD2B1178 82601542C7FD8098 F45D2824 BC7DFB38 F1EBD38AD7A3AFE0 96F938EA 2D90BD72 9E34CDF0—— END LICENSE ———– BEGIN LICENSE —–Ryan ClarkSingle User LicenseEA7E-8124792158A7DE B690A7A3 8EC04710 006A5EEB34E77CA3 9C82C81F 0DB6371B 79704E6F93F36655 B031503A 03257CCC 01B20F60D304FA8D B1B4F0AF 8A76C7BA 0FA94D5556D46BCE 5237A341 CD837F30 4D60772D349B1179 A996F826 90CDB73C 24D41245FD032C30 AD5E7241 4EAA66ED 167D91FB55896B16 EA125C81 F550AF6B A6820916—— END LICENSE ——
2017年09月02日
1,337 阅读
0 评论
0 点赞
2017-08-26
Bootstrap+Thinkphp3.2+Auth认证+jquery-validator后台
Auth权限认证本例采用auth权限认证,用户和用户组采用多对多关系处理,自动添加rule规则,带有jquery-validator插件,自动控制菜单显示或隐藏。config.php中的配置'AUTH_CONFIG'=>array( 'AUTH_ON' => true, //认证开关 'AUTH_TYPE' => 1, // 认证方式,1为时时认证;2为登录认证。 'AUTH_GROUP' => 'think_auth_group', //用户组数据表名 'AUTH_GROUP_ACCESS' => 'think_auth_group_access', //用户组明细表 'AUTH_RULE' => 'think_auth_rule', //权限规则表 'AUTH_USER' => 'think_user'//用户信息表 )第一步、Thinkphp3.2中的library下有Auth.class.php有所需的三个表及注释。创建数据表。自己还需建一张用户表。n think_auth_rule,规则表(存放所有的权限规则)n think_auth_group 用户组表(存放一个用户组有哪些权限)n think_auth_group_access 用户组明细表(其实就是叫用户表和用户组的中间表)n think_user 用户表(需自建)第二步、config.php中配置auth认证。'AUTH_CONFIG'=>array('AUTH_ON' => true, //认证开关'AUTH_TYPE' => 1, // 认证方式,1为时时认证;2为登录认证。'AUTH_GROUP' => 'think_auth_group', //用户组数据表名'AUTH_GROUP_ACCESS' => 'think_auth_group_access', //用户组明细表'AUTH_RULE' => 'think_auth_rule', //权限规则表'AUTH_USER' => 'think_user'//用户信息表)第三步、需要验证的类都继承CommonController。创建CommonController.class.php文件。(此类针对多入口的情况)<?phpnamespace AdminController;use ThinkController;class CommonController extends Controller {public function _initialize () { if(!isset($_SESSION[C('USER_AUTH_KEY')])){ //判断是否有uid $this->redirect("Public/login"); } $Auth = new \Think\Auth(); $module_name=CONTROLLER_NAME.'/'.ACTION_NAME; if($_SESSION['uname']==C('ADMIN_AUTH_KEY')){ //以用户名来判断是否是超级管理员,绕过验证,不用用户组来判断的原因是用户组有时候是中文 ,而且常删除或更改。 return true; } if(!$Auth->check($module_name,$_SESSION[C('USER_AUTH_KEY')])){ $this->error('没有权限'); } }}第四步、登录验证的PublicController和以前都差不多。创建PublicController.class.php<?phpnamespace AdminController;use ThinkController;class PublicController extends Controller {public function index(){ $this->display(); } //登录页 public function login(){ $this->display(); } //登出 public function logout(){ if($_SESSION[C('USER_AUTH_KEY')]) { session_destroy(); $this->redirect("Public/login"); }else { $this->error('已经登出!'); } } //验证登陆表单 public function checkLogin(){ $username=I('username',''); $password=I('password',''); $verify_code=I('verify',''); if($username==''||$password==''||$verify_code==''){ $this->redirect("Public/login"); } if(!$this->_verifyCheck($verify_code)){ $this->error("验证码错误!!!"); } $user=M('user')->where(array('username'=>$username))->find(); if(!$user||md5($password)!=$user['password']){ $this->error("用户名或密码错误!!!"); } if(!$user['status']){ //status为0时表示锁定 $this->error("用户被锁定!!!"); }else{ $data['login_ip'] = get_client_ip(); $data['last_login_time']=time(); if(M("user")->where(array('id'=>$user['id']))->save($data)){ M("user")->where(array('id'=>$user['id']))->setInc("login_num"); } session(C('USER_AUTH_KEY'),$user['id']); session('uname',$user['username']); $this->success("登录成功...",U("Index/index")); } } //验证码 public function verify(){ $config = array( 'fontSize' => 20, // 验证码字体大小 'length' => 1, // 验证码位数 'useNoise' => false, // 关闭验证码杂点 'imageH' => 50, // 验证码图片高度 'imageW' => 200, // 验证码图片宽度 ); $Verify =new \Think\Verify($config); $Verify->entry(); } //验证验证码 private function _verifyCheck($code, $id = ''){ $verify = new \Think\Verify(); return $verify->check($code, $id); } }到这里,auth的权限认证就基本完成第五步、创建AuthController.class.php(逻辑代码如下,就是一些CURD),多加了一个register方法,用来自动把规则的放入数据库中.本人把register放在function.php中方便其他类调用。用户和用户组采用多对多的关系处理,方便权限更为精细。<?phpnamespace AdminController;use ThinkController;class AuthController extends CommonController {//Auth认证管理 public function index(){ //获取用户信息 $user=D("user")->relation(true)->field("password",true)->select(); $this->user=$user; //获取用户组信息 $group=M("auth_group")->select(); $obj=M("auth_rule"); foreach($group as $k=>$v){ $map['id'] = array('in',$group[$k]['rules']); $group[$k]['group']=$obj->where($map)->select(); } $this->group=$group; //获取rule规则 $this->rule=M("auth_rule")->select(); //$ip = new \Org\Net\IpLocation("UTFWry.dat"); //$location=$ip->getlocation(); //p($location);die; //p($group);die; $this->display(); } //添加后台用户及表单处理 public function user(){ if(IS_POST){ $data=array( 'username'=>I('username','','trim'), 'remark'=>I('remark','','trim'), 'password'=>I('password','','md5'), 'status'=>I('status',0,'intval'), 'rsgtime'=>$_SERVER['REQUEST_TIME'], 'login_num'=>0 ); if(!isset($_POST['role_id'])){ $this->error("请选择用户组..."); } if($data['password']!=md5($_POST['repassword'])){ $this->error("两次密码不一致..."); } if(M("user")->where(array('username'=>$data['username']))->find()){ $this->error("用户名已存在..."); } if($lastInsertId=M("user")->add($data)){ foreach($_POST['role_id'] as $k=>$v){ $arr=array( 'uid'=>$lastInsertId, 'group_id'=>$_POST['role_id'][$k] ); M("auth_group_access")->add($arr); } M("auth_group_access")->add($arr); $this->success("添加成功...",U("Auth/index")); }else{ $this->error("添加失败..."); } }else{ $this->group=M("auth_group")->field("id,title")->select(); $this->display(); } } //添加后台用户组及表单处理 public function group(){ if(IS_POST){ $data=array( 'title'=>I('title','','trim'), 'status'=>I('status',0,'intval') ); if(M("auth_group")->where(array('title'=>$data['title']))->find()){ $this->error("用户组名称已存在..."); } if(M("auth_group")->add($data)){ $this->success("添加成功...",U("Auth/index")); }else{ $this->error("添加失败..."); } }else{ $this->display(); } } //添加后台权限及表单处理 public function auth(){ if(IS_POST){ $data=array( 'name'=>I('name','','trim'), 'title'=>I('title','','trim'), 'condition'=>I('condition','','trim'), 'status'=>I('status',0,'intval'), 'type'=>I('type',0,'intval'), ); if(M("auth_rule")->add($data)){ $this->success("添加成功...",U("Auth/index")); }else{ $this->error("添加失败..."); } }else{ $this->display(); } } //注册rule规则 public function register(){ $class_name=get_class(); return register($class_name); } //删除用户组 public function deleteGroup(){ if(IS_GET){ if(!isset($_GET['id'])){ return false; } $id=I("id",0,"intval"); if(!$id){ return false; } if(M("auth_group")->where(array("id"=>$id))->delete()){ M("auth_group_access")->where(array("group_id"=>$id))->delete(); $this->success("删除成功...",U("Auth/index")); }else{ $this->error("删除失败..."); } } } //修改用户组 public function modifyGroup(){ if(IS_GET){ if(!isset($_GET['id'])){ return false; } $id=I("id",0,"intval"); if(!$id){ return false; } $group=M("auth_group")->where(array("id"=>$id))->find(); $rule=M("auth_rule")->select(); foreach($rule as $k=>$v){ if(in_array($rule[$k]['id'],explode(',',$group['rules']))){ $rule[$k]['is_checked']=1; }else{ $rule[$k]['is_checked']=0; } } $this->rule=$rule; $this->group=$group; $this->id=$id; //p($rule);die; $this->display(); }elseif(IS_POST){ $data=array( 'title'=>I("title","","trim"), 'rules'=>implode(",",$_POST['rule']), 'status'=>I("status","","trim") ); if(M("auth_group")->where(array("id"=>$_POST['id']))->save($data)){ $this->success("修改成功...",U("Auth/index")); }else{ $this->error("修改失败..."); } } } //删除RULE public function deleteRule(){ if(IS_GET){ if(!isset($_GET['id'])){ return false; } $id=I("id",0,"intval"); if(!$id){ return false; } if(M("auth_rule")->where(array("id"=>$id))->delete()){ $this->success("删除成功...",U("Auth/index")); }else{ $this->error("删除失败..."); } } } //修改RULE public function modifyRule(){ if(IS_POST){ if(!isset($_POST['id'])){ return false; } $id=I("id",0,"intval"); unset($_POST['id']); if(!$id){ return false; } if(M("auth_rule")->where(array("id"=>$id))->save($_POST)){ $this->success("修改成功...",U("Auth/index")); }else{ $this->error("修改失败..."); } } } //删除用户 public function deleteUser(){ if(IS_GET){ if(!isset($_GET['id'])){ return false; } $id=I("id",0,"intval"); if(!$id){ return false; } if(M("user")->where(array("id"=>$id))->delete()){ M("auth_group_access")->where(array("uid"=>$id))->delete(); $this->success("删除成功...",U("Auth/index")); }else{ $this->error("删除失败..."); } } } //修改用户 public function modifyUser(){ if(IS_POST){ $id=I("id",0,"intval"); if(!$id){ return false; } $data['username']=I("username","","trim"); $data['remark']=I("remark","","trim"); $data['status']=I("status",0,"intval"); $tmp=0; if(isset($_POST['role_id'])){ M("auth_group_access")->where(array("uid"=>$id))->delete(); foreach ($_POST['role_id'] as $key => $value) { if(M("auth_group_access")->add(array("uid"=>$id,"group_id"=>$_POST['role_id'][$key]))){ $tmp=1; } } } if(trim($_POST['password'])){ if(md5($_POST['password'])!=md5($_POST['repassword'])){ $this->error("两次密码输入不一致..."); }else{ $data['password']=I("password","","md5"); } } if(M("user")->where(array("id"=>$id))->save($data)){ $this->success("修改成功...",U("Auth/index")); }else{ if($tmp){ $this->success("修改成功...",U("Auth/index")); }else{ $this->error("修改失败..."); } } }elseif(IS_GET){ if(!isset($_GET['id'])){ return false; } $id=I("id",0,"intval"); if(!$id){ return false; } $this->user=M("user")->where(array('id'=>$id))->field("password",true)->find(); $user_group=M("auth_group_access")->where(array("uid"=>$id))->select(); $group=M("auth_group")->select(); foreach($user_group as $key => $value){ $user_group[$key]['group_name']=M("auth_group")->where(array("id"=>$user_group[$key]['group_id']))->getField("title"); } $this->user_group=$user_group; $this->group=$group; $this->display(); } } }function.php如下:(authCheck方法会在模板中有使用,用来控制菜单等显示或隐藏,不需自己写sql来循环判断显不显示)/**注册rule规则@param class_name string 类的名称@return str 返回错误或者正确信息*/function register($class_name){$data=get_class_methods($class_name); //把一些父类的方法过滤掉 $arr=array('_initialize','__set','__construct','display','show','fetch','buildHtml','theme','assign',' __set','get','__get','__isset','__call','error','success','ajaxReturn','redirect','__destruct');foreach($arr as $k=>$v){ if(in_array($arr[$k],$data)){ $tmp=array_keys($data,$arr[$k]); unset($data[$tmp[0]]); } } $obj=M("auth_rule"); $msg=''; foreach($data as $k=>$v){ $data[$k]=CONTROLLER_NAME.'/'.$data[$k]; if(!$obj->where(array('name'=>$data[$k]))->find()){ if($obj->add(array('name'=>$data[$k]))){ $msg=$msg.$data[$k].'注册成功\n'; }else{ $msg=$msg.$data[$k].'注册失败\n'; } }else{ $msg=$msg.$data[$k].'已注册\n' ; } } echo "<script>alert('".$msg."');history.back(-1);</script>"; }/**控制模板中菜单的显示@param rule string|array 需要验证的规则列表,支持逗号分隔的权限规则或索引数组@param uid int 认证用户的id@param string mode 执行check的模式@param relation string 如果为 'or' 表示满足任一条规则即通过验证;如果为 'and'则表示需满足所有规则才能通过验证@return boolean 通过验证返回true;失败返回false*/function authCheck($rule,$uid,$type=1, $mode='url', $relation='or'){$auth=new \Think\Auth(); //获取当前uid所在的角色组id //$groups=$auth->getGroups($uid); if($_SESSION['uname']==C('ADMIN_AUTH_KEY')){ return true; } return $auth->check($rule,$uid,$type,$mode,$relation)?true:false; }注:模板中使用authCheck的方法,在你需要进行显示或者隐藏的地方加上条件就可以了。 <if condition="authCheck('Auth/index',$_SESSION[C('USER_AUTH_KEY')])"> Auth权限认证 <span class="hidden-tablet"> Auth认证 </span> </if> 最后一步、创建UserModel.class.php<?php/**Created by PhpStorm.User: AdministratorDate: 14-10-20Time: 下午12:54*/namespace AdminModel;use ThinkModelRelationModel;class UserModel extends RelationModel{//关联查询用户所属的用户组 protected $_link = array( 'auth_group' => array( 'mapping_type' => self::MANY_TO_MANY, 'class_name' => 'auth_group', 'mapping_name' => 'classify', 'foreign_key' => 'uid', 'relation_foreign_key' => 'group_id', 'relation_table' => 'think_auth_group_access' ) ); }
2017年08月26日
1,056 阅读
0 评论
0 点赞
1
2
3
4
...
22