├── .gitattributes ├── .gitignore ├── .htaccess ├── README.md ├── app ├── admin │ ├── common.php │ ├── ctrl │ │ ├── index.php │ │ ├── movie.php │ │ ├── server.php │ │ ├── setting.php │ │ └── user.php │ └── tpl │ │ ├── index │ │ └── index.html │ │ ├── movie │ │ ├── edit.html │ │ └── index.html │ │ ├── public │ │ ├── footer.html │ │ ├── header.html │ │ └── left.html │ │ ├── server │ │ ├── edit.html │ │ └── index.html │ │ ├── setting │ │ ├── notice.html │ │ └── update.html │ │ └── user │ │ ├── feedback.html │ │ └── index.html ├── cache │ └── tpl │ │ └── index.html ├── common.php ├── common │ └── ctrl │ │ └── auth.php ├── index │ ├── common.php │ ├── ctrl │ │ ├── api.php │ │ ├── index.php │ │ └── login.php │ └── tpl │ │ ├── index │ │ ├── error.html │ │ └── index.html │ │ └── login │ │ ├── footer.html │ │ ├── header.html │ │ ├── login.html │ │ └── register.html └── user │ ├── common.php │ ├── ctrl │ ├── api.php │ ├── index.php │ ├── money.php │ └── movie.php │ └── tpl │ ├── index │ ├── feedback.html │ ├── index.html │ ├── readme.html │ └── serverlist.html │ ├── money │ ├── recharge.html │ ├── statistics.html │ └── vip.html │ ├── movie │ └── index.html │ └── public │ ├── footer.html │ └── header.html ├── assets ├── css │ ├── admin.css │ ├── amazeui.datatables.min.css │ ├── amazeui.min.css │ ├── app.css │ ├── app.less │ ├── fullcalendar.min.css │ ├── fullcalendar.print.css │ └── honeySwitch.css ├── fonts │ ├── FontAwesome.otf │ ├── fontawesome-webfont.eot │ ├── fontawesome-webfont.ttf │ ├── fontawesome-webfont.woff │ └── fontawesome-webfont.woff2 ├── i │ ├── app-icon72x72@2x.png │ ├── examples │ │ ├── admin-chrome.png │ │ ├── admin-firefox.png │ │ ├── admin-ie.png │ │ ├── admin-opera.png │ │ ├── admin-safari.png │ │ ├── adminPage.png │ │ ├── blogPage.png │ │ ├── landing.png │ │ ├── landingPage.png │ │ ├── loginPage.png │ │ └── sidebarPage.png │ ├── favicon.png │ └── startup-640x1096.png ├── img │ ├── a5.png │ ├── k.jpg │ ├── logo.png │ ├── logoa.png │ ├── logob.png │ ├── user01.png │ ├── user02.png │ ├── user03.png │ ├── user04.png │ ├── user05.png │ ├── user06.png │ └── user07.png └── js │ ├── amazeui.datatables.min.js │ ├── amazeui.min.js │ ├── app.js │ ├── dataTables.responsive.min.js │ ├── echarts.min.js │ ├── fullcalendar.min.js │ ├── honeySwitch.js │ ├── jquery.min.js │ ├── moment.js │ └── theme.js ├── icf ├── config.php ├── functions.php ├── index.php ├── lib │ ├── db.php │ ├── http.php │ ├── model.php │ ├── route.php │ ├── smtp.php │ └── view.php └── loader.php ├── index.html ├── index.php ├── openvpn-stushare ├── .gitignore ├── README.md ├── openvpn-stushare.sln └── openvpn-stushare │ ├── App.config │ ├── App.xaml │ ├── App.xaml.cs │ ├── FeedBackWindow.xaml │ ├── FeedBackWindow.xaml.cs │ ├── Functions.cs │ ├── LoginWindow.xaml │ ├── LoginWindow.xaml.cs │ ├── MainWindow.xaml │ ├── MainWindow.xaml.cs │ ├── Properties │ ├── AssemblyInfo.cs │ ├── Resources.Designer.cs │ ├── Resources.resx │ ├── Settings.Designer.cs │ ├── Settings.settings │ └── app.manifest │ ├── Resources │ ├── Newtonsoft.Json.dll │ ├── vpn.ico │ ├── vpn_success.ico │ └── vpn_wait.ico │ ├── bin │ └── Release │ │ ├── Newtonsoft.Json.dll │ │ ├── openvpn-stushare.exe │ │ ├── openvpn-stushare.exe.config │ │ └── openvpn-stushare.pdb │ ├── openvpn-debug │ ├── ca.crt │ ├── openvpn.exe │ └── user.ovpn │ ├── openvpn-stushare.csproj │ ├── openvpn-stushare.csproj.user │ └── vpn2.ico ├── pay ├── __init__.py ├── function.py ├── wxpay.py └── zfbpay.py ├── radius ├── ctrl.py └── main.py ├── sql.sql └── static ├── css ├── admin.css ├── index.css └── login.css ├── email_template.html ├── image ├── avatar.jpg ├── bg.jpg ├── bg2.jpg ├── bg3.jpg ├── demo.png ├── down.png ├── email_bg.jpg ├── logo.png ├── logo_m.png ├── m_bg2.jpg ├── sk.jpg ├── sw.jpg └── user.png └── js ├── jquery-1.8.3.min.js ├── jquery-3.1.1.min.js └── jquery.fullPage.min.js /.gitattributes: -------------------------------------------------------------------------------- 1 | *.js linguist-language=php 2 | *.css linguist-language=php 3 | *.html linguist-language=php 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /app/cache/tpl/*.php 2 | .idea 3 | cookie.txt 4 | var.html 5 | var1.html 6 | .vscode 7 | *.zip 8 | *.apk 9 | *.exe 10 | -------------------------------------------------------------------------------- /.htaccess: -------------------------------------------------------------------------------- 1 | 2 | Options +FollowSymlinks 3 | RewriteEngine On 4 | 5 | RewriteCond %{REQUEST_FILENAME} !-d 6 | RewriteCond %{REQUEST_FILENAME} !-f 7 | RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L] 8 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # stuShare 2 | [校园网分享计划](https://github.com/CodFrm/stuShare) 3 | 4 | 5 | # 搭建openVPN+STURadius认证 6 | 7 | STURadius 为本项目定制radius(233) 8 | 9 | ## 配置openVPN 10 | ### 安装openVPN 11 | CentOS 12 | 13 | yum install openvpn 14 | 15 | ### 生成服务器证书 16 | ``` 17 | wget https://github.com/OpenVPN/easy-rsa/archive/master.zip 18 | 19 | unzip master.zip 20 | 21 | mv easy-rsa-mater/ easy-rsa/ 22 | 23 | cp -R easy-rsa/ /etc/openvpn/ 24 | 25 | cd /etc/openvpn/easy-rsa/easyrsa3/ 26 | 27 | cp vars.example vars 28 | ``` 29 | `nano vars 修改下面字段,然后修改,最后wq保存` 30 | ``` 31 | set_var EASYRSA_REQ_COUNTRY "CN" 32 | 33 | set_var EASYRSA_REQ_PROVINCE "BJ" 34 | 35 | set_var EASYRSA_REQ_CITY "BeiJing" 36 | 37 | set_var EASYRSA_REQ_ORG "stuShare" 38 | 39 | set_var EASYRSA_REQ_EMAIL "admin@icodef.com" 40 | 41 | set_var EASYRSA_REQ_OU "stuShare" 42 | 43 | cd /etc/openvpn/easy-rsa/easyrsa3/ 44 | 45 | ./easyrsa build-ca 46 | 47 | ./easyrsa gen-req server nopass 48 | 49 | ./easyrsa sign server server 50 | 51 | ./easyrsa gen-dh 52 | ``` 53 | `修改server.conf配置` 54 | ``` 55 | cp /usr/share/doc/openvpn-2.3.14/sample/sample-config-files/server.conf /etc/openvpn 56 | ``` 57 | 58 | ### 配置STURadius 59 | 认证程序在radius文件夹中 60 | 61 | main.py 修改mysql配置 62 | ``` 63 | 配置openvpn的radius插件 64 | wget http://www.nongnu.org/radiusplugin/radiusplugin_v2.1a_beta1.tar.gz 65 | 66 | tar xf radiusplugin_v2.1a_beta1.tar.gz 67 | 68 | cd radiusplugin_v2.1a_beta1 69 | 70 | yum install libgcrypt-devel -y 71 | 72 | make 73 | 74 | cp radiusplugin.so /etc/openvpn/ 75 | 76 | cp radiusplugin.cnf /etc/openvpn/ 77 | 78 | ``` 79 | 80 | `配置radius文件` 81 | 82 | `导入数据库文件` 83 | 84 | `开启nat转发和iptables配置` 85 | 86 | `firewall不知道配置,推荐关闭firewall开启iptables` 87 | 88 | ``` 89 | iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -j MASQUERADE 90 | 91 | iptables -Z 92 | 93 | iptables -F 94 | 95 | iptables -X 96 | ``` 97 | 98 | ## 将本项目克隆至本地 99 | 100 | git clone https://github.com/CodFrm/stuShare.git 101 | 102 | 在 icf/config.php 中修改配置 103 | 104 | ### 微信支付监控 105 | python 启动 stuShare中的wspay.py文件,还需配置回调url 106 | 107 | 进行安装,然后就完成啦 108 | -------------------------------------------------------------------------------- /app/admin/common.php: -------------------------------------------------------------------------------- 1 | assign('title', '首页'); 19 | V()->display(); 20 | } 21 | 22 | public function logout() { 23 | setcookie('token', '', 0, '/'); 24 | header('Location: ' . url('index/login/login')); 25 | } 26 | 27 | } -------------------------------------------------------------------------------- /app/admin/ctrl/movie.php: -------------------------------------------------------------------------------- 1 | assign('title', '影视管理'); 20 | $rec = DB('video as a|user as b')->select(['a.uid=b.uid', 'father_vid' => -1,'__order by'=>'status,vid desc', '__limit' => (($page - 1) * $total) . ','.$total]); 21 | $movie_list = $rec->fetchAll(); 22 | $count=DB('video')->find(['father_vid' => -1],'count(*)')['count(*)']; 23 | V()->assign('page',$page); 24 | V()->assign('pageAll',ceil($count/$total)); 25 | V()->assign('movie_list', $movie_list); 26 | $online=DB('ip')->find(['ip_time'=>[time()-60,'>'],'type'=>1],'count(*)')['count(*)']; 27 | V()->assign('online', $online); 28 | 29 | $online=DB('ip')->find(['ip_time'=>[time()-60,'>'],'type'=>1],'count(*)')['count(*)']; 30 | V()->assign('online', $online); 31 | $up=DB('ip')->find(['ip_time'=>[strtotime(date('Y/m/d 00:00:00')),'>'],'ip_time<'.strtotime(date('Y/m/d 23:59:59')),'type'=>1],'count(*)')['count(*)']; 32 | V()->assign('up',$up); 33 | $yesterday=DB('ip')->find(['ip_time'=>[strtotime(date('Y/m/d 00:00:00'))-86400,'>'],'ip_time<'.(strtotime(date('Y/m/d 23:59:59'))-86400),'type'=>1],'count(*)')['count(*)']; 34 | V()->assign('yesterday',$yesterday); 35 | V()->display(); 36 | } 37 | public function edit($vid = 0, $fvid = 0) { 38 | V()->assign('title', '影视管理'); 39 | V()->assign('fvid', $fvid ?: $vid); 40 | $msg = []; 41 | if (!($msg = DB('video')->find(['vid' => $vid]))) { 42 | $msg['name'] = ''; 43 | $msg['vid'] = ''; 44 | $msg['pay'] = ''; 45 | $msg['introduction'] = ''; 46 | $msg['url'] = ''; 47 | $msg['image_url'] = ''; 48 | $msg['release_time'] = ''; 49 | $msg['type'] = ''; 50 | $msg['mark'] = ''; 51 | $msg['status'] = 0; 52 | if ($fvid > 0) { 53 | $msg['father_vid'] = $fvid; 54 | } else { 55 | $msg['father_vid'] = -1; 56 | } 57 | 58 | } 59 | $msg['child'] = []; 60 | if ($rec = DB('video')->select(['father_vid' => $vid])) { 61 | $msg['child'] = $rec->fetchAll(); 62 | } 63 | V()->assign('video', $msg); 64 | V()->display(); 65 | } 66 | 67 | public function post($vid = 0, $fvid = 0) { 68 | $retJson = ['code' => -1, 'msg' => '错误,vid不存在']; 69 | if ($fvid > 0 and $vid>0) {//更新子集 70 | $ret = isExist($_POST, [ 71 | 'name' => ['msg' => '请输入影视名字', 'sql' => 'name'], 72 | 'url'=> ['msg' => '请输入下载链接', 'sql' => 'url'], 73 | 'status'=> ['msg' => '请输入集数', 'sql' => 'status']], $sql); 74 | $sql['pay']=input('post.pay'); 75 | if ($ret === true) { 76 | $retJson = ['code' => 1, 'msg' => '成功']; 77 | DB('video')->update($sql,['vid'=>$vid]); 78 | } else { 79 | $retJson['msg'] = $ret; 80 | } 81 | } else if ($vid > 0) {//更新集 82 | $ret = isExist($_POST, [ 83 | 'name' => ['msg' => '请输入影视名字', 'sql' => 'name'], 84 | 'image_url'=> ['msg' => '请输入图片链接', 'sql' => 'image_url']], $sql); 85 | $sql['type']=input('post.type'); 86 | $sql['pay']=input('post.pay'); 87 | $sql['mark']=input('post.mark'); 88 | $sql['status']= input('post.status')=='true'?:0; 89 | $sql['introduction']=input('post.introduction'); 90 | $sql['release_time']=input('post.release_time'); 91 | $sql['url']=input('post.url'); 92 | if ($ret === true) { 93 | $retJson = ['code' => 1, 'msg' => '成功']; 94 | DB('video')->update($sql,['vid'=>$vid]); 95 | } else { 96 | $retJson['msg'] = $ret; 97 | } 98 | }else if($fvid>0){//添加子集 99 | $ret = isExist($_POST, [ 100 | 'name' => ['msg' => '请输入影视名字', 'sql' => 'name'], 101 | 'url'=> ['msg' => '请输入下载链接', 'sql' => 'url'], 102 | 'status'=> ['msg' => '请输入集数', 'sql' => 'status']], $sql); 103 | $sql['pay']=input('post.pay'); 104 | $sql['father_vid']=$fvid; 105 | if ($ret === true) { 106 | $retJson = ['code' => 1, 'msg' => '成功']; 107 | DB('video')->insert($sql); 108 | } else { 109 | $retJson['msg'] = $ret; 110 | } 111 | } else {//添加集 112 | $ret = isExist($_POST, [ 113 | 'name' => ['msg' => '请输入影视名字', 'sql' => 'name'], 114 | 'image_url'=> ['msg' => '请输入图片链接', 'sql' => 'image_url']], $sql); 115 | $sql['type']=input('post.type'); 116 | $sql['pay']=input('post.pay'); 117 | $sql['mark']=input('post.mark'); 118 | $sql['status']= input('post.status')=='true'?:0; 119 | $sql['introduction']=input('post.introduction'); 120 | $sql['release_time']=input('post.release_time'); 121 | $sql['uid']=$_COOKIE['uid']; 122 | if ($ret === true) { 123 | $retJson = ['code' => 1, 'msg' => '成功']; 124 | DB('video')->insert($sql); 125 | } else { 126 | $retJson['msg'] = $ret; 127 | } 128 | } 129 | return json($retJson); 130 | } 131 | 132 | public function delete($vid){ 133 | DB('video')->delete(['vid'=>$vid]); 134 | $retJson = ['code' => 0, 'msg' => '删除成功']; 135 | header('Location: '.$_SERVER['HTTP_REFERER']?:url('admin/movie/index')); 136 | return json($retJson); 137 | } 138 | } -------------------------------------------------------------------------------- /app/admin/ctrl/server.php: -------------------------------------------------------------------------------- 1 | assign('title','服务器管理'); 19 | $data = DB('server')->select()->fetchAll(); 20 | V()->assign('server_list', $data); 21 | V()->display(); 22 | } 23 | 24 | public function edit($svid = 0) { 25 | $data = ['name'=>'','ip'=>'','config'=>'','svid'=>0]; 26 | if ($svid > 0) { 27 | $data = DB('server')->find(['svid' => $svid]); 28 | } 29 | V()->assign('smsg', $data); 30 | V()->display(); 31 | } 32 | 33 | public function post($svid = 0) { 34 | $retJson = ['code' => -1, 'msg' => '错误,svid不存在']; 35 | $ret = isExist($_POST, [ 36 | 'name' => ['msg' => '请输入主机名', 'sql' => 'name'], 37 | 'config' => ['msg' => '请输入配置文件', 'sql' => 'config'], 38 | 'ip' => ['msg' => '请输入服务器ip', 'sql' => 'ip']], $sql); 39 | if ($ret === true) { 40 | if ($svid > 0) { 41 | DB('server')->update($sql, ['svid' => $svid]); 42 | $ret = '修改成功'; 43 | 44 | } else { 45 | DB('server')->insert($sql, ['svid' => $svid]); 46 | $ret = '增加成功'; 47 | } 48 | $retJson['code'] = 1; 49 | } 50 | $retJson['msg'] = $ret; 51 | return json($retJson); 52 | } 53 | 54 | public function delete($svid) { 55 | DB('server')->delete(['svid' => $svid]); 56 | $retJson = ['code' => 0, 'msg' => '删除成功']; 57 | header('Location: ' . $_SERVER['HTTP_REFERER'] ?: url('admin/server/index')); 58 | return json($retJson); 59 | } 60 | } -------------------------------------------------------------------------------- /app/admin/ctrl/setting.php: -------------------------------------------------------------------------------- 1 | assign('title', '更新设置'); 19 | $setting['pc_update_v'] = config('pc_update_v'); 20 | $setting['pc_update_u'] = config('pc_update_u'); 21 | $setting['movie_update_v'] = config('movie_update_v'); 22 | $setting['movie_update_u'] = config('movie_update_u'); 23 | V()->assign('setting', $setting); 24 | V()->display(); 25 | } 26 | 27 | public function u_setting() { 28 | if (input('post.pc_update_u')) { 29 | config('pc_update_u', input('post.pc_update_u')); 30 | } 31 | if (input('post.pc_update_v')) { 32 | config('pc_update_v', input('post.pc_update_v')); 33 | } 34 | if (input('post.movie_update_u')) { 35 | config('movie_update_u', input('post.movie_update_u')); 36 | } 37 | if (input('post.movie_update_v')) { 38 | config('movie_update_v', input('post.movie_update_v')); 39 | } 40 | return json(['code' => 1, 'msg' => '修改成功']); 41 | } 42 | 43 | public function notice() { 44 | V()->assign('title', '通知设置'); 45 | $setting['pc_notice_msg'] = config('pc_notice_msg'); 46 | $setting['pc_notice_time'] = date('Y/m/d H:i:s', config('pc_notice_time')); 47 | $setting['movie_notice_msg'] = config('movie_notice_msg'); 48 | $setting['movie_notice_time'] = date('Y/m/d H:i:s', config('movie_notice_time')); 49 | V()->assign('setting', $setting); 50 | V()->display(); 51 | } 52 | 53 | public function notice_setting() { 54 | if (input('post.pc_notice_msg')) { 55 | config('pc_notice_msg', input('post.pc_notice_msg')); 56 | config('pc_notice_time', time()); 57 | } 58 | if (input('post.movie_notice_msg')) { 59 | config('movie_notice_msg', input('post.movie_notice_msg')); 60 | config('movie_notice_time', time()); 61 | } 62 | return json(['code' => 1, 'msg' => '修改成功']); 63 | } 64 | 65 | } -------------------------------------------------------------------------------- /app/admin/ctrl/user.php: -------------------------------------------------------------------------------- 1 | assign('title', '影视管理'); 20 | $rec = DB('user as a')->select(['__order by'=>'uid desc', '__limit' => (($page - 1) * $total) . ','.$total]); 21 | $user_list = $rec->fetchAll(); 22 | $count=DB('user')->find([],'count(*)')['count(*)']; 23 | V()->assign('page',$page); 24 | V()->assign('pageAll',ceil($count/$total)); 25 | V()->assign('user_list', $user_list); 26 | V()->display(); 27 | } 28 | 29 | public function edit($uid){ 30 | 31 | } 32 | public function delete($uid){ 33 | DB('user')->delete(['uid'=>$uid]); 34 | $retJson = ['code' => 0, 'msg' => '删除成功']; 35 | header('Location: '.$_SERVER['HTTP_REFERER']?:url('admin/user/index')); 36 | return json($retJson); 37 | } 38 | 39 | public function feedback($page=1){ 40 | $total=50; 41 | V()->assign('title', '用户反馈'); 42 | $rec = DB('feedback as a')->select(['__order by'=>'time desc', '__limit' => (($page - 1) * $total) . ','.$total],'*', 43 | 'join :user as b on a.uid=b.uid'); 44 | $feed_list = $rec->fetchAll(); 45 | $count=DB('user')->find([],'count(*)')['count(*)']; 46 | V()->assign('page',$page); 47 | V()->assign('pageAll',ceil($count/$total)); 48 | V()->assign('feed_list', $feed_list); 49 | V()->display(); 50 | } 51 | public function look($uid=0,$time=0){ 52 | DB('feedback')->update(['`type`=-`type`'],['uid'=>$uid,'time'=>$time]); 53 | header('Location: '.$_SERVER['HTTP_REFERER']?:url('admin/movie/index')); 54 | } 55 | } -------------------------------------------------------------------------------- /app/admin/tpl/index/index.html: -------------------------------------------------------------------------------- 1 | {include 'public/header'} 2 | 3 |
4 | 5 | 6 |
7 | {include 'public/footer'} -------------------------------------------------------------------------------- /app/admin/tpl/movie/index.html: -------------------------------------------------------------------------------- 1 | {include 'public/header'} 2 | 3 |
4 |
5 |
6 |
7 |
8 |
9 |
影视列表
10 |
11 |
12 |

统计 今日在线: {$online}人 今日上线: {$up}人 昨日上线:{$yesterday}人

13 |
14 |
15 |
16 |
17 | 新增 20 | 21 |
22 |
23 |
24 |
25 | 26 |
27 |
28 | 29 | 30 | 32 | 33 |
34 |
35 | 36 |
37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | {foreach $movie_list as $item} 48 | 49 | 50 | 51 | 52 | 63 | 64 | {/foreach} 65 | 66 | 67 |
影视标题提交者状态操作
{$item['name']}{$item['user']}{if $item['status']==0}审核中{else}通过{/if} 53 | 62 |
68 |
69 |
70 | 71 |
72 |
    73 | {if $page!=1} 74 |
  • «
  • 75 | {/if} 76 | {if $page<4} 77 | {while ++$i<=8} 78 |
  • {$i}
  • 81 | {/while} 82 | {elseif $page>=$pageAll-4} 83 | 84 | {while ++$i<=$pageAll} 85 |
  • {$i}
  • 88 | {/while} 89 | {else} 90 | 91 | {while ++$i<=$page+4} 92 |
  • {$i}
  • 95 | {/while} 96 | {/if} 97 | {if $page!=$pageAll} 98 |
  • »
  • 99 | {/if} 100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 | 108 |
109 | {include 'public/footer'} -------------------------------------------------------------------------------- /app/admin/tpl/public/footer.html: -------------------------------------------------------------------------------- 1 | 2 |
3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/admin/tpl/public/header.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 后台管理页面 - {$title} 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 |
28 | 29 | 32 | 33 |
34 | 35 |
36 | 37 | 38 | 39 |
40 | 41 |
42 | 54 |
55 |
56 | 57 |
58 | 59 |
60 |
61 |
62 |
63 |
64 | 选择主题 65 |
66 |
67 | 68 | 69 |
70 |
71 |
72 | {include 'public/left'} -------------------------------------------------------------------------------- /app/admin/tpl/public/left.html: -------------------------------------------------------------------------------- 1 | 2 | 90 | 91 |
92 |
-------------------------------------------------------------------------------- /app/admin/tpl/server/edit.html: -------------------------------------------------------------------------------- 1 | {include 'public/header'} 2 | 3 |
4 |
5 |
6 |
7 |
服务器编辑
8 |
9 | 10 |
11 |
12 |
13 | 14 |
15 |
16 | 18 |
19 | 21 | 22 | 服务器的名称 23 |
24 |
25 |
26 | 28 |
29 | 31 | 服务器ip 32 |
33 |
34 |
35 | 36 |
37 | 39 |
40 |
41 |
42 |
43 | 46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 | {include 'public/footer'} 54 | -------------------------------------------------------------------------------- /app/admin/tpl/server/index.html: -------------------------------------------------------------------------------- 1 | {include 'public/header'} 2 | 3 |
4 |
5 |
6 |
7 |
8 |
9 |
服务器列表
10 |
11 |
12 | 13 |
14 |
15 |
16 |
17 | 新增 20 | 21 |
22 |
23 |
24 |
25 | 26 |
27 |
28 | 29 | 30 | 32 | 33 |
34 |
35 | 36 |
37 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | {foreach $server_list as $item} 49 | 50 | 51 | 52 | 53 | 64 | 65 | {/foreach} 66 | 67 |
ID主机名ip操作
{$item['svid']}{$item['name']}{$item['ip']} 54 | 63 |
68 |
69 |
70 |
71 |
72 |
73 | 74 |
75 | {include 'public/footer'} -------------------------------------------------------------------------------- /app/admin/tpl/setting/notice.html: -------------------------------------------------------------------------------- 1 | {include 'public/header'} 2 | 3 |
4 |
5 |
6 |
7 |
桌面客户端通知内容
8 |
9 | 10 |
11 |
12 |
13 | 14 |
15 |
16 | 18 |
19 | 20 | {$setting['pc_notice_time']} 21 |
22 |
23 | 24 |
25 |
26 | 29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
影视App通知内容
37 |
38 | 39 |
40 |
41 |
42 |
43 |
44 | 46 |
47 | 48 | {$setting['movie_notice_time']} 49 |
50 |
51 | 52 |
53 |
54 | 57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 | {include 'public/footer'} 65 | -------------------------------------------------------------------------------- /app/admin/tpl/setting/update.html: -------------------------------------------------------------------------------- 1 | {include 'public/header'} 2 | 3 |
4 |
5 |
6 |
7 |
桌面客户端更新设置
8 |
9 | 10 |
11 |
12 |
13 | 14 |
15 |
16 | 18 |
19 | 21 |
22 |
23 |
24 | 26 |
27 | 29 |
30 |
31 | 32 |
33 |
34 | 37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
影视App客户端更新设置
45 |
46 | 47 |
48 |
49 |
50 | 51 |
52 |
53 | 55 |
56 | 58 |
59 |
60 |
61 | 63 |
64 | 66 |
67 |
68 | 69 |
70 |
71 | 74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 | {include 'public/footer'} 82 | -------------------------------------------------------------------------------- /app/admin/tpl/user/feedback.html: -------------------------------------------------------------------------------- 1 | {include 'public/header'} 2 | 3 |
4 |
5 |
6 |
7 |
8 |
9 |
{$title}
10 |
11 |
12 | 13 |
14 |
15 | 16 | 17 | 19 | 20 |
21 |
22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | {foreach $feed_list as $item} 37 | 38 | 39 | 40 | 41 | 42 | 43 | 51 | 52 | {/foreach} 53 | 54 | 55 |
用户名联系方式内容提交时间类型操作
{$item['user']}{$item['contact']}{$item['msg']}{:date('Y/m/d H:i:s',$item['time'])}{:feedType($item['type'])} 44 | 50 |
56 |
57 |
58 | 59 |
60 |
    61 | {if $page!=1} 62 |
  • «
  • 63 | {/if} 64 | {if $page<4} 65 | {while ++$i<=8} 66 |
  • {$i}
  • 69 | {/while} 70 | {elseif $page>=$pageAll-4} 71 | 72 | {while ++$i<=$pageAll} 73 |
  • {$i}
  • 76 | {/while} 77 | {else} 78 | 79 | {while ++$i<=$page+4} 80 |
  • {$i}
  • 83 | {/while} 84 | {/if} 85 | {if $page!=$pageAll} 86 |
  • »
  • 87 | {/if} 88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 | 96 |
97 | {include 'public/footer'} -------------------------------------------------------------------------------- /app/admin/tpl/user/index.html: -------------------------------------------------------------------------------- 1 | {include 'public/header'} 2 | 3 |
4 |
5 |
6 |
7 |
8 |
9 |
用户列表
10 |
11 |
12 | 13 |
14 |
15 |
16 |
17 | 新增 20 | 21 |
22 |
23 |
24 |
25 | 26 |
27 |
28 | 29 | 30 | 32 | 33 |
34 |
35 | 36 |
37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | {foreach $user_list as $item} 49 | 50 | 51 | 52 | 53 | 54 | 65 | 66 | {/foreach} 67 | 68 | 69 |
uid用户名邮箱注册时间操作
{$item['uid']}{$item['user']}{$item['email']}{:date('Y/m/d H:i:s',$item['reg_time'])} 55 | 64 |
70 |
71 |
72 | 73 |
74 |
    75 | {if $page!=1} 76 |
  • «
  • 77 | {/if} 78 | {if $page<4} 79 | {while ++$i<=8} 80 |
  • {$i}
  • 83 | {/while} 84 | {elseif $page>=$pageAll-4} 85 | 86 | {while ++$i<=$pageAll} 87 |
  • {$i}
  • 90 | {/while} 91 | {else} 92 | 93 | {while ++$i<=$page+4} 94 |
  • {$i}
  • 97 | {/while} 98 | {/if} 99 | {if $page!=$pageAll} 100 |
  • »
  • 101 | {/if} 102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 | 110 |
111 | {include 'public/footer'} -------------------------------------------------------------------------------- /app/cache/tpl/index.html: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodFrm/stuShare/4b801862237e0bba340e5dbd2e0d7f86cbcffcd3/app/cache/tpl/index.html -------------------------------------------------------------------------------- /app/common.php: -------------------------------------------------------------------------------- 1 | insert(['uid' => $uid, 'token' => $token, 'time' => time()]); 21 | DB('token')->delete(['time<' . (time() . -604800)]); 22 | return $token; 23 | } 24 | 25 | /** 26 | * 验证token 27 | * @author Farmer 28 | * @param $uid 29 | * @param $token 30 | * @return bool 31 | */ 32 | function verifyToken($uid, $token) { 33 | $where = ['token' => $token, 'uid' => $uid]; 34 | $tokenMsg = DB('token')->select($where)->fetch(); 35 | if (!$tokenMsg) { 36 | return false; 37 | } else if ($tokenMsg['time'] + 604800 < time()) { 38 | DB('token')->delete($where); 39 | return false; 40 | } 41 | DB('token')->update(['time' => time()], $where); 42 | return true; 43 | } 44 | 45 | /** 46 | * 获取ip 47 | * @author Farmer 48 | * @return array|false|string 49 | */ 50 | function getIP() { 51 | if (getenv('HTTP_CLIENT_IP')) { 52 | $ip = getenv('HTTP_CLIENT_IP'); 53 | } elseif (getenv('HTTP_X_FORWARDED_FOR')) { 54 | $ip = getenv('HTTP_X_FORWARDED_FOR'); 55 | } elseif (getenv('HTTP_X_FORWARDED')) { 56 | $ip = getenv('HTTP_X_FORWARDED'); 57 | } elseif (getenv('HTTP_FORWARDED_FOR')) { 58 | $ip = getenv('HTTP_FORWARDED_FOR'); 59 | 60 | } elseif (getenv('HTTP_FORWARDED')) { 61 | $ip = getenv('HTTP_FORWARDED'); 62 | } else { 63 | $ip = $_SERVER['REMOTE_ADDR']; 64 | } 65 | return $ip; 66 | } 67 | 68 | /** 69 | * 取随机字符串 70 | * @author Farmer 71 | * @param $length 72 | * @param $type 73 | * @return string 74 | */ 75 | function getRandString($length, $type = 2) { 76 | $randString = '1234567890qwwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHHJKLZXCVBNM'; 77 | $retStr = ''; 78 | for ($n = 0; $n < $length; $n++) { 79 | $retStr .= substr($randString, rand(0, 9 + $type * 24), 1); 80 | } 81 | return $retStr; 82 | } 83 | 84 | /** 85 | * 通过 email user 获取用户信息 86 | * @author Farmer 87 | * @param $user 88 | * @return bool|mixed 89 | */ 90 | function getUser($user) { 91 | if ($userMsg = DB('user')->find(['user' => $user, 'email' => [$user, 'or']])) { 92 | return $userMsg; 93 | } 94 | return false; 95 | } 96 | 97 | /** 98 | * 获取/设置配置 99 | * @author Farmer 100 | * @param $key 101 | * @param string $value 102 | * @return int 103 | */ 104 | function config($key, $value = '') { 105 | if (!empty($value)) { 106 | if (config($key) !== false) { 107 | return DB('config')->update(['value' => $value], ['`key`' => $key]); 108 | } else { 109 | return DB('config')->insert(['value' => $value, 'key' => $key]); 110 | } 111 | } else { 112 | $rec = DB('config')->find(['`key`' => $key]); 113 | if (!$rec) { 114 | return false; 115 | } 116 | return $rec['value']; 117 | } 118 | } 119 | 120 | 121 | /** 122 | * 通过uid获取用户信息 123 | * @author Farmer 124 | * @param $uid 125 | * @return mixed 126 | */ 127 | function uidUser($uid) { 128 | return DB('user')->find(['uid' => $uid]); 129 | } 130 | 131 | /** 132 | * 获取用户组信息 133 | * @author Farmer 134 | * @param $uid 135 | * @return array 136 | */ 137 | function getGroup($uid) { 138 | if ($rec = DB('usergroup as a|group as b')->select(['uid' => $uid,'(a.expire_time=-1 or a.expire_time>'.time().')', 'a.group_id=b.group_id'])) { 139 | return $rec->fetchAll(); 140 | } 141 | return []; 142 | } 143 | 144 | /** 145 | * 获取权限信息 146 | * @author Farmer 147 | * @param $group_id 148 | * @return array 149 | */ 150 | function getAuth($group_id) { 151 | if ($rec = DB('groupauth as a|auth as b')->select(['group_id' => $group_id, 'a.auth_id=b.auth_id'])) { 152 | return $rec->fetchAll(); 153 | } 154 | return []; 155 | } 156 | 157 | function isAuth($group_id) { 158 | $rec = DB('groupauth as a|auth as b')->select(['group_id' => $group_id, 'a.auth_id=b.auth_id']); 159 | $model = input('model'); 160 | $ctrl = input('ctrl'); 161 | $action = input('action'); 162 | while ($msg = $rec->fetch()) { 163 | if ($count = substr_count($msg['auth_interface'], '->')) { 164 | if ($count == 1) { 165 | if (($model . '->' . $ctrl) == $msg['auth_interface']) { 166 | return true; 167 | } 168 | } else { 169 | if (($model . '->' . $ctrl . '->' . $action) == $msg['auth_interface']) { 170 | return true; 171 | } 172 | } 173 | 174 | } else { 175 | if ($msg['auth_interface'] == $model) { 176 | return true; 177 | } 178 | } 179 | } 180 | return false; 181 | } 182 | 183 | 184 | function sendEmail($to, $title, $content) { 185 | $smtpserver = "smtp.exmail.qq.com";//SMTP服务器 186 | $smtpserverport = 465;//SMTP服务器端口 187 | $smtpusermail = "love@icodef.com";//SMTP服务器的用户邮箱 188 | $smtpemailto = $to;//发送给谁 189 | $smtpuser = "love@icodef.com";//SMTP服务器的用户帐号(或填写new2008oh@126.com,这项有些邮箱需要完整的) 190 | $emailname="信院小站"; 191 | $smtppass = "VAhBsdKFPUf53QZc";//SMTP服务器的用户密码 192 | $mailtitle = $title;//邮件主题 193 | $mailcontent = $content;//邮件内容 194 | $smtp = new icf\lib\smtp(); 195 | $smtp->setName($emailname); 196 | $smtp->setServer($smtpserver, $smtpusermail, $smtppass, $smtpserverport, true); //设置smtp服务器,到服务器的SSL连接 197 | $smtp->setFrom($smtpuser); //设置发件人 198 | $smtp->setReceiver($smtpemailto); //设置收件人,多个收件人,调用多次 199 | $smtp->setMail($mailtitle, $mailcontent); //设置邮件主题、内容 200 | return $smtp->sendMail(); //发送 201 | } 202 | 203 | -------------------------------------------------------------------------------- /app/common/ctrl/auth.php: -------------------------------------------------------------------------------- 1 | userMsg = uidUser($_COOKIE['uid']); 27 | $this->userMsg['group'] = getGroup($_COOKIE['uid']); 28 | foreach ($this->userMsg['group'] as $item) { 29 | if (isAuth($item['group_id'])) { 30 | $auth = true; 31 | break; 32 | } 33 | } 34 | if ($auth !== true) { 35 | header('Location:' . url('index/index/error', 'error=你没有相应的权限&url=' . url('user/index/index'))); 36 | exit(); 37 | } 38 | V()->assign('user', $this->userMsg['user']); 39 | V()->assign('money', $this->userMsg['money']); 40 | V()->assign('ctrl', input('ctrl')); 41 | V()->assign('action', input('action')); 42 | } 43 | } 44 | 45 | /** 46 | * 日志入库 10 金额充值 47 | * @author Farmer 48 | * @param $uid 49 | * @param $log 50 | * @param int $type 51 | */ 52 | public function wlog($uid, $log, $param, $type = 0) { 53 | $req = 'get:' . implodes(',', $_GET); 54 | $req .= ' post:' . implodes(',', $_POST); 55 | $req .= ' ip:' . getIP(); 56 | DB('log')->insert(array('log' => $log, 'log_req' => $req, 'log_param' => $param, 'log_uid' => $uid, 'log_time' => time(), 'log_type' => $type)); 57 | } 58 | } 59 | 60 | function implodes($glue, $array) { 61 | $ret = ''; 62 | foreach ($array as $key => $value) { 63 | $ret .= "$key=>$value" . $glue; 64 | } 65 | return $ret; 66 | } -------------------------------------------------------------------------------- /app/index/common.php: -------------------------------------------------------------------------------- 1 | find(['inv_code' => $inv])) { 19 | if ($invMsg['inv_use_uid'] <= 0) { 20 | return true; 21 | } else { 22 | return '邀请码被用过了'; 23 | } 24 | } else { 25 | return '邀请码不存在'; 26 | } 27 | } 28 | 29 | /** 30 | * 验证用户名 31 | * @author Farmer 32 | * @param $user 33 | * @return bool|string 34 | */ 35 | function isUser($user) { 36 | if (getUser($user)) { 37 | return '用户名已经被注册'; 38 | } else { 39 | return true; 40 | } 41 | } 42 | 43 | /** 44 | * 验证游戏 45 | * @author Farmer 46 | * @param $user 47 | * @return bool|string 48 | */ 49 | function isEmail($email) { 50 | if (getUser($email)) { 51 | return '邮箱已经被注册'; 52 | } else { 53 | return true; 54 | } 55 | } 56 | 57 | 58 | /** 59 | * 验证IP 60 | * @author Farmer 61 | * @param $ip 62 | * @return bool 63 | */ 64 | function verifyIP($ip){ 65 | if($ipMsg=DB('ip')->find(array('ip'=>$ip,'type'=>-1))){ 66 | if($ipMsg['ip_time']<(time()-config('regip'))){ 67 | DB('ip')->update(array('ip_time'=>time()),array('ip'=>$ip)); 68 | return true; 69 | }else{ 70 | return false; 71 | } 72 | } 73 | DB('ip')->insert(array('ip'=>$ip,'type'=>-1,'ip_time'=>time())); 74 | return true; 75 | } 76 | -------------------------------------------------------------------------------- /app/index/ctrl/api.php: -------------------------------------------------------------------------------- 1 | getIP(),'type'=>1,'ip_time'=>[strtotime(date('Y/m/d 00:00:00')),'>'],'ip_time<'.strtotime(date('Y/m/d 23:59:59'))]; 63 | $row=DB('ip')->find($where); 64 | //判断有没有这条记录 65 | if($row){ 66 | DB('ip')->update(['ip_time'=>time()],['ip'=>getIP(),'ip_time'=>$row['ip_time'],'type'=>1]); 67 | }else{ 68 | DB('ip')->insert(['ip'=>getIP(),'ip_time'=>time(),'type'=>1]); 69 | } 70 | $count=DB('ip')->find(['ip_time'=>[time()-60,'>'],'type'=>1],'count(*)')['count(*)']; 71 | return json(['code'=>0,'msg'=>'success','online'=>$count]); 72 | } 73 | } -------------------------------------------------------------------------------- /app/index/ctrl/index.php: -------------------------------------------------------------------------------- 1 | display(); 16 | } 17 | 18 | function error() { 19 | V()->assign('title', '错误页面'); 20 | V()->assign('url', input('get.url')); 21 | V()->assign('error', input('get.error')); 22 | V()->display(); 23 | } 24 | 25 | function ip() { 26 | return getIP(); 27 | } 28 | } -------------------------------------------------------------------------------- /app/index/ctrl/login.php: -------------------------------------------------------------------------------- 1 | -1, 'msg' => '系统错误']; 17 | $ret = isExist($_POST, [ 18 | 'user' => ['regex' => ['/^[\x{4e00}-\x{9fa5}\w\@\.]{2,}$/u', '用户名不符合规则'], 'msg' => '请输入用户名', 'sql' => 'user'],//中文匹配头疼 19 | 'pwd' => ['regex' => ['/^[\\~!@#$%^&*()-_=+|{}\[\], .?\/:;\'\"\d\w]{6,16}$/', '密码不符合规范'], 'msg' => '请输入密码', 'sql' => 'password'], 20 | ], $data); 21 | if ($ret === true) { 22 | if ($userMsg = getUser($_POST['user'])) { 23 | if ($userMsg['password'] == $_POST['pwd']) { 24 | setcookie('token', getToken($userMsg['uid']), time() + 86400, '/'); 25 | setcookie('uid', $userMsg['uid'], time() + 86400, '/'); 26 | $json['code'] = 0; 27 | $json['msg'] = '登陆成功'; 28 | } else { 29 | $json['code'] = -1; 30 | $json['msg'] = '密码错误'; 31 | } 32 | } else { 33 | $json['msg'] = '账号不存在'; 34 | } 35 | } else { 36 | $json['msg'] = $ret; 37 | } 38 | return json($json); 39 | } else { 40 | V()->assign('title', '登陆页面'); 41 | V()->display(); 42 | } 43 | } 44 | 45 | function register() { 46 | if ($_SERVER['REQUEST_METHOD'] == 'POST') { 47 | $json = ['code' => -1, 'msg' => '系统错误']; 48 | $ret = isExist($_POST, [ 49 | 'user' => ['func' => ['isUser'], 'regex' => ['/^[\w]{2,10}$/', '用户名不符合规则'], 'msg' => '请输入用户名', 'sql' => 'user'],//中文匹配头疼 50 | 'pwd' => ['regex' => ['/^[\\~!@#$%^&*()-_=+|{}\[\], .?\/:;\'\"\d\w]{6,16}$/', '密码不符合规范'], 'msg' => '请输入密码', 'sql' => 'password'], 51 | 'email' => ['func' => ['isEmail'], 'regex' => ['/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/', '邮箱不符合规则', 'msg' => '请输入邮箱'], 'sql' => 'email'], 52 | ], $data); 53 | if ($ret === true) { 54 | if (!(verifyIP(getIP()))) { 55 | $json = ['code' => -1, 'msg' => '注册过于频繁']; 56 | } else { 57 | $json['code'] = 0; 58 | $json['msg'] = '注册成功,系统将会发送一封邮件到你的邮箱上,请点击邮箱激活账户'; 59 | $data['reg_time'] = time(); 60 | DB('user')->insert($data); 61 | $uid = DB()->lastinsertid(); 62 | $code=getRandString(8, 0); 63 | $url = url('index/login/email', 'code='.$code.'&uid='.$uid); 64 | sendEmail($data['email'], "邮箱激活 - 信院小站", " 65 |
66 | 67 |
68 |
69 |

请点击下面的链接激活你的账号

70 | {$url} 71 |
72 |
73 |
74 | "); 75 | DB('send_email')->insert(['uid'=>$uid,'time'=>$code,'type'=>'1']); 76 | //DB('inv_code')->update(['inv_use_uid' => $uid, 'inv_use_time' => time()], ['inv_code' => $_POST['inv_code']]); 77 | DB('usergroup')->insert(['uid' => $uid, 'group_id' => 3]); 78 | } 79 | } else { 80 | $json['msg'] = $ret; 81 | } 82 | 83 | return json($json); 84 | } else { 85 | V()->assign('title', '注册页面'); 86 | V()->display(); 87 | } 88 | } 89 | 90 | public function email($code,$uid){ 91 | $msg=DB('send_email')->find(['uid'=>$uid,'time'=>$code,'type'=>1]); 92 | if ($msg){ 93 | DB('usergroup')->insert(['uid' => $uid, 'group_id' => config('base_auth')]); 94 | DB('send_email')->delete(['uid'=>$uid,'time'=>$code,'type'=>1]); 95 | header('Location:'.url('index/index/error','error=激活成功,即将登陆&url='.url('index/login/login'))); 96 | }else{ 97 | header('Location:'.url('index/index/error','error=激活失败&url='.url('index/login/login'))); 98 | } 99 | } 100 | } -------------------------------------------------------------------------------- /app/index/tpl/index/error.html: -------------------------------------------------------------------------------- 1 | {include 'login/header'} 2 | 14 | 24 | {include 'login/footer'} -------------------------------------------------------------------------------- /app/index/tpl/index/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 信院小站 12 | 13 | 14 | 15 |
16 | logo 17 | 信院小站 18 |
19 |
20 | 21 |
22 |
23 |
24 |
25 |

信院小站

26 |

信院影视与校园网相互结合

27 |
28 |

校内生活不再无聊

29 | 30 |

QQ群:174823189

31 |
32 | 下一页
下一页
33 |
34 |
35 | 36 |
37 |
38 |
39 |
40 |

信院小站

41 |

信院影视

42 |
43 |

同时支持 爱奇艺 优酷 搜狐 腾讯 会员影视 在线观看

44 |

离线最新电影每日更新

45 |

可校内无网络状态下观看

46 | 47 |
48 | 下一页
下一页
49 |
50 |
51 |
52 | 53 | 54 | 72 | 73 | -------------------------------------------------------------------------------- /app/index/tpl/login/footer.html: -------------------------------------------------------------------------------- 1 | 2 | 49 | -------------------------------------------------------------------------------- /app/index/tpl/login/header.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | stuShare_{$title} 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/index/tpl/login/login.html: -------------------------------------------------------------------------------- 1 | {include 'header'} 2 | 19 | {include 'footer'} -------------------------------------------------------------------------------- /app/index/tpl/login/register.html: -------------------------------------------------------------------------------- 1 | {include 'header'} 2 |
3 | 6 | 24 | 28 |
29 | {include 'footer'} -------------------------------------------------------------------------------- /app/user/common.php: -------------------------------------------------------------------------------- 1 | find(['uid' => $uid], '*', 27 | 'join ' . input('config.DB_PREFIX') . 'group as b on a.group_id=b.group_id ' . 28 | 'join ' . input('config.DB_PREFIX') . 'set_meal as c on c.group_id=b.group_id'); 29 | } 30 | -------------------------------------------------------------------------------- /app/user/ctrl/api.php: -------------------------------------------------------------------------------- 1 | -1]; 23 | if ($ip != '') { 24 | $where['nas_ip'] = $ip; 25 | } 26 | $data = DB('accounting')->select($where, 'count(*)')->fetch(); 27 | $count = $data['count(*)']; 28 | $record = DB('accounting as a')->select($where, '*', 'join ' . input('config.DB_PREFIX') . 'user as b on a.uid=b.uid'); 29 | $rows = []; 30 | while ($row = $record->fetch()) { 31 | $tmp['username'] = $row['user']; 32 | $tmp['login_time'] = $row['login_time']; 33 | $tmp['nip'] = $row['nas_ip']; 34 | $rows[] = $tmp; 35 | } 36 | return json(['code' => 0, 'count' => $count, 'rows' => $rows]); 37 | } 38 | 39 | /** 40 | * 获取服务器列表 41 | * @author Farmer 42 | */ 43 | public function getserver() { 44 | $rec = DB('server')->select(); 45 | $ret = ['code' => 0, 'msg' => 'success']; 46 | foreach ($rec->fetchAll() as $item) { 47 | $tmp['svid']=$item['svid']; 48 | $tmp['name'] = $item['name']; 49 | $tmp['ip'] = $item['ip']; 50 | $tmp['config'] = $item['config']; 51 | $tmp['count'] = DB("accounting")->select(['nas_ip' => $item['ip'], 'logout_time' => '-1'], 'count(*)')->fetch()['count(*)']; 52 | $ret['rows'][] = $tmp; 53 | } 54 | return json($ret); 55 | } 56 | 57 | /** 58 | * 下载服务器配置 59 | * @author Farmer 60 | * @param int $svid 61 | */ 62 | public function downconfig($svid=0){ 63 | $row=DB('server')->find(['svid'=>$svid]); 64 | if($row){ 65 | header('Content-Type:application/text'); 66 | header('Content-Disposition: attachment; filename="'.$row['name'].'.ovpn"'); 67 | header('Content-Length:'.strlen($row['config'])); 68 | echo $row['config']; 69 | }else{ 70 | echo 'svid 错误'; 71 | } 72 | } 73 | /** 74 | * 获取权限 75 | * @author Farmer 76 | */ 77 | public function getauth() { 78 | $ret = ['code' => 0, 'msg' => 'success','user'=>$this->userMsg['user']]; 79 | $ret['rows'] = $this->userMsg['group']; 80 | return json($ret); 81 | } 82 | 83 | public function feedback() { 84 | $ret = isExist($_POST, [ 85 | 'call' => '请输入联系方式,不想输入就随便打吧,反正系统会记录的', 86 | 'msg' => '必须输入你想说的东西!' 87 | ]); 88 | $retJson = ['code' => -1]; 89 | if (isset($_POST['type'])) { 90 | $type = $_POST['type']; 91 | } else { 92 | $type = 0; 93 | } 94 | if($type!=1 or $type!=2 or $type!=3){ 95 | $retJson['msg'] = $ret; 96 | if ($ret === true) { 97 | if(strlen($_POST['msg'])<20){ 98 | $retJson = ['code' => -1, 'msg' => '你就这么点想说的?']; 99 | }else { 100 | $retJson = ['code' => 0, 'msg' => '反馈成功']; 101 | DB('feedback')->insert(['uid' => $_COOKIE['uid'], 'contact' => $_POST['call'], 102 | 'msg' => $_POST['msg'], 'time' => time(), 'type' => $type]); 103 | } 104 | } 105 | return json($retJson); 106 | } 107 | return ''; 108 | } 109 | 110 | public function check(){ 111 | $row=db('ip')->find(['ip'=>'check_'.$_COOKIE['uid'],'type'=>2,'ip_time'=>[strtotime(date('Y-m-d 0:0:0',time()-86400)),'>']]); 112 | if($row){ 113 | return ['code'=>-1,'msg'=>'今天已经签过到了']; 114 | } 115 | db('ip')->insert(['ip'=>'check_'.$_COOKIE['uid'],'type'=>2,'ip_time'=>time()]); 116 | return ['code'=>0,'msg'=>'签到成功']; 117 | } 118 | } -------------------------------------------------------------------------------- /app/user/ctrl/index.php: -------------------------------------------------------------------------------- 1 | assign('title', '用户主页'); 19 | $group = ''; 20 | foreach ($this->userMsg['group'] as $item) { 21 | if ($item['expire_time'] == -1) { 22 | $group .= $item['group_name'] . ' 永久 '; 23 | } else if ($item['expire_time'] > time()) { 24 | $group .= $item['group_name'] . ' ' . date('Y-m-d h:i:s', $item['expire_time']) . '到期 '; 25 | } 26 | } 27 | V()->assign('group', $group); 28 | V()->display(); 29 | } 30 | 31 | public function readme() { 32 | V()->assign('title', '说明文档'); 33 | V()->display(); 34 | } 35 | 36 | public function download() { 37 | if (stripos($_SERVER['HTTP_USER_AGENT'], 'win') > 0) { 38 | header('Location: ' . __HOME_ . '/static/win.zip'); 39 | } else if (stripos($_SERVER['HTTP_USER_AGENT'], 'android') > 0) { 40 | header('Location: ' . __HOME_ . '/static/openvpn.apk'); 41 | } else { 42 | echo '抱歉,暂未提供该种设备的下载链接,可以在首页反馈'; 43 | } 44 | } 45 | 46 | public function serverlist() { 47 | V()->assign('title', '服务器列表'); 48 | V()->display(); 49 | } 50 | 51 | public function feedback(){ 52 | V()->assign('title', '问题反馈'); 53 | V()->display(); 54 | } 55 | } -------------------------------------------------------------------------------- /app/user/ctrl/movie.php: -------------------------------------------------------------------------------- 1 | assign('title', '影视提交'); 19 | V()->display(); 20 | } 21 | 22 | public function mlist($page = 1) { 23 | if ($page <= 0) { 24 | $page = 1; 25 | } 26 | $retJson = []; 27 | $rec = DB('video')->select(['status' => '1', 'father_vid' => -1, '__limit' => (($page - 1) * 20) . ',20'], 'count(*)'); 28 | $count = $rec->fetch(); 29 | $rec = DB('video')->select(['status' => '1', 'father_vid' => -1, '__order by' => 'vid desc,live desc', '__limit' => (($page - 1) * 20) . ',20'], 'vid,pay,name,image_url'); 30 | $retJson = ['code' => 0, 'msg' => 'success']; 31 | $retJson['page_all'] = ceil($count['count(*)'] / 20); 32 | while ($tmp = $rec->fetch()) { 33 | $tmp['vid'] = floatval($tmp['vid']); 34 | $tmp['pay'] = floatval($tmp['pay']); 35 | $retJson['rows'][] = $tmp; 36 | } 37 | return json($retJson); 38 | } 39 | 40 | public function volume($vid = 0) { 41 | $retJson = ['code' => -1, 'msg' => 'error:not find']; 42 | if ($tmp = DB('video')->find(['vid' => $vid, 'father_vid' => -1], 'name,vid,url,mark,introduction,release_time,image_url,pay,type')) { 43 | $retJson = ['code' => 0, 'msg' => 'success']; 44 | $tmp['vid'] = floatval($tmp['vid']); 45 | $tmp['pay'] = floatval($tmp['pay']); 46 | $tmp['mark'] = floatval($tmp['mark']); 47 | $retJson['rows'] = $tmp; 48 | $rec = DB('video')->select(['status' => ['1', '>='], 'father_vid' => $vid], 'name,status,vid,url,pay,type'); 49 | while ($tmp = $rec->fetch()) { 50 | $tmp['vid'] = floatval($tmp['vid']); 51 | $tmp['pay'] = floatval($tmp['pay']); 52 | $tmp['status'] = floatval($tmp['status']); 53 | $retJson['rows']['part'][] = $tmp; 54 | } 55 | } 56 | return json($retJson); 57 | } 58 | 59 | public function post($name = '') { 60 | $retJson = ['code' => 0, 'msg' => 'success']; 61 | DB('video')->insert(['name' => $name, 'uid' => $_COOKIE['uid'], 'time' => time()]); 62 | return json($retJson); 63 | } 64 | 65 | public function api() { 66 | $key = 'S7hA9PTrW5sPFQuL';//填写你的key 67 | $url = input('get.url');//解析视频的url 68 | $apiUrl = 'http://video.visha.cc/';//接口域名 69 | $domain = 'http://127.0.0.1/video';//你的域名 70 | $do = input('get.do'); 71 | $v = input('get.v'); 72 | header('Content-type:text/json'); 73 | $apiUrl .= '?action=api&url=' . $url . '&key=' . $key . ($v !== '0' ? ('&v=' . $v) : ''); 74 | echo file_get_contents($apiUrl); 75 | } 76 | 77 | public function movie_vip(){ 78 | V()->display(); 79 | } 80 | 81 | public function statistics($vid=0){ 82 | $row=DB('video')->find(['vid'=>$vid]); 83 | $ret=['code'=>0,'msg'=>'success']; 84 | if($row){ 85 | $this->wlog($_COOKIE['uid'],$this->userMsg['user'].'观看'.$row['name'],$row['vid'],5); 86 | }else{ 87 | $ret=['code'=>-1,'msg'=>'not find vid']; 88 | } 89 | return $ret; 90 | } 91 | } -------------------------------------------------------------------------------- /app/user/tpl/index/feedback.html: -------------------------------------------------------------------------------- 1 | {include 'public/header'} 2 | 3 |
4 |
5 | 6 | stuShare 7 |
8 |
9 |
10 |
11 |

留下你宝贵的意见:

12 |
13 | 14 | 15 | 16 |
17 | 18 | 22 | 23 |
24 | 27 |
28 |
29 | {include 'public/footer'} 30 | 31 | 46 | -------------------------------------------------------------------------------- /app/user/tpl/index/index.html: -------------------------------------------------------------------------------- 1 | {include 'public/header'} 2 | 3 |
4 |
5 | 6 | stuShare 7 |
8 |
9 |
10 |
11 |
12 | 13 | 用户名:{$user} 14 |
15 | 账户余额:{$money}¥ 16 | 17 |

用户组:{$group}

18 |
19 | 30 |
31 |
32 | {include 'public/footer'} -------------------------------------------------------------------------------- /app/user/tpl/index/readme.html: -------------------------------------------------------------------------------- 1 | {include 'public/header'} 2 | 3 |
4 |
5 | 6 | stuShare 7 |
8 |
9 |
10 |
11 |

使用说明

12 |

充值:

13 |

先进入首页的 充值页面

14 |

使用手机微信扫描二维码,切记!

15 |

备注中输入你的用户名

16 |

否则无法自动到账,将会人工退款(最好反馈一下,如果没看见钱就归我了)

17 |
18 |

开通服务:

19 |

进入开通页面,将会有套餐供选择

20 |

选择合适自己的,点击确定开通

21 |
22 |

使用客户端:

23 |

Windows 用户:

24 |

先在首页点击下载客户端

25 |

直接打开客户端 登陆你的账号

26 |

点击X是无法关闭的,客户端会自动缩小到右下角,右键点击图标退出

27 |
28 |

Android 用户:

29 |

先在首页点击下载客户端

30 |

安装完毕后,打开

31 |

其他用户:

32 |

不好意思,我们没有其他用户,请自行去网上搜索相关教程233(有人提供教程或者设备的话我会上传的,开发者并没有IOS,win phone等设备)

33 | 36 |
37 |
38 | {include 'public/footer'} 39 | -------------------------------------------------------------------------------- /app/user/tpl/index/serverlist.html: -------------------------------------------------------------------------------- 1 | {include 'public/header'} 2 | 3 |
4 |
5 | 6 | stuShare 7 |
8 |
9 |
10 |
11 |

服务器列表: (点击下载对应的配置文件)

12 | 14 | 15 |
16 | 19 |
20 |
21 | {include 'public/footer'} 22 | 23 | -------------------------------------------------------------------------------- /app/user/tpl/money/recharge.html: -------------------------------------------------------------------------------- 1 | {include 'public/header'} 2 | 3 |
4 |
5 | 6 | stuShare 7 |
8 |
9 |
10 |
11 |
12 |

请用支付宝扫描下方二维码进行充值

13 |

请注意在备注中填上自己的用户名!!否则无法自动识别账号,将人工退款

14 | 15 | 16 |

请用支付宝扫描上方二维码进行充值

17 |

请注意在备注中填上自己的用户名!!否则无法自动识别账号,将人工退款

18 |
19 | 22 |
23 |
24 | {include 'public/footer'} -------------------------------------------------------------------------------- /app/user/tpl/money/statistics.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |

您好,{$user}:

4 |
5 |

您在{$time} 注册,至今陪您度过了{$day}天,非常感谢您一直使用我们的服务


6 |

转眼间即将进入2018年,在此提前给祝福您 新年快乐!

7 |
8 |

我们也为您送上了一份小礼物,我们将您账户到期时间自动续费到了1月18日,还希望不要嫌弃

9 |
10 | 11 |
12 | 13 |
14 |

我们为此,还为您专门定制了一份个人的数据

15 |
16 |

您在过去的一个月里我们帮您节省了 {$all}GB 流量(下载:{$d}GB,上传:{$u}GB)

17 |
18 |

换成RMB就是 {$rmb}元(按照联通4G 0.2元/MB计算,hhhh这个计算方式没毛病)


19 |

{$rmb_bq}

20 |
21 |

您平均每秒使用 {$s_kb}KB


22 |

{$s_kb_pd}


23 | 24 |

您最多的登录时间是在 {$s_t}和 {$e_t}


25 |

{$l_t_ts}


26 | 27 |

最长的一次登录时间长达{$m_t}小时


28 |

{$m_t_ts}


29 | 30 | 31 |
32 |
33 |

最后祝您2018年 心想事成,事事如意

34 |

(如果有什么问题意见可以在群内反馈,帮助我们越做越好)

35 |
36 |

ps:我们的初衷是希望能够通过这个项目来锻炼自己,说赚钱真的不赚几个钱

37 |

以这样的技术出去随便接个小单也有个几百了

38 |
39 |

信院南站开发组


40 |

{$n_time}

41 |
42 | 43 |
44 |
45 |
-------------------------------------------------------------------------------- /app/user/tpl/money/vip.html: -------------------------------------------------------------------------------- 1 | {include 'public/header'} 2 | 3 |
4 |
5 | 6 | stuShare 7 |
8 |
9 |
10 |
11 | {foreach $set_meal as $item} 12 |
13 |
14 |
{$item['group_name']}
15 |
{$item['description']}
16 |
17 |
18 |
19 | 带宽:{$item['bandwidth']}M
价格:{$item['set_meal_money']}/月 20 |
21 | 22 |
23 |
24 | {/foreach} 25 |
26 | 充值月数:每月0元(30天) 27 |
28 | 将付款: 0 29 | 选中套餐:暂未选中 30 |
31 | 35 |
36 |
37 | 68 | {include 'public/footer'} -------------------------------------------------------------------------------- /app/user/tpl/movie/index.html: -------------------------------------------------------------------------------- 1 | {include 'public/header'} 2 | 3 |
4 |
5 | 6 | stuShare 7 |
8 |
9 |
10 |
11 | 15 |
16 |
17 |
18 | 19 |

记忆大师 9.5

20 | 21 | 100人 22 |
23 |
24 | 25 |

记忆大师 9.5

26 | 27 | 100人 28 |
29 | 30 |

记忆大师 9.5

31 | 32 | 100人 33 |
34 | 35 |

记忆大师 9.5

36 | 37 | 100人 38 |
39 | 40 |

记忆大师 9.5

41 | 42 | 100人 43 |
44 | 45 |

记忆大师 9.5

46 | 47 | 100人 48 |
49 | 50 |

记忆大师 9.5

51 | 52 | 100人 53 |
54 | 55 |

记忆大师 9.5

56 | 57 | 100人 58 |
59 | 60 |

记忆大师 9.5

61 | 62 | 100人 63 |
64 | 65 |

记忆大师 9.5

66 | 67 | 100人 68 |
69 |
70 |
71 | {include 'public/footer'} -------------------------------------------------------------------------------- /app/user/tpl/public/footer.html: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/user/tpl/public/header.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | stuShare_{$title} 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /assets/css/fullcalendar.print.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * FullCalendar v0.0.0 Print Stylesheet 3 | * Docs & License: http://fullcalendar.io/ 4 | * (c) 2016 Adam Shaw 5 | */ 6 | 7 | /* 8 | * Include this stylesheet on your page to get a more printer-friendly calendar. 9 | * When including this stylesheet, use the media='print' attribute of the tag. 10 | * Make sure to include this stylesheet IN ADDITION to the regular fullcalendar.css. 11 | */ 12 | 13 | .fc { 14 | max-width: 100% !important; 15 | } 16 | 17 | 18 | /* Global Event Restyling 19 | --------------------------------------------------------------------------------------------------*/ 20 | 21 | .fc-event { 22 | background: #fff !important; 23 | color: #000 !important; 24 | page-break-inside: avoid; 25 | } 26 | 27 | .fc-event .fc-resizer { 28 | display: none; 29 | } 30 | 31 | 32 | /* Table & Day-Row Restyling 33 | --------------------------------------------------------------------------------------------------*/ 34 | 35 | .fc th, 36 | .fc td, 37 | .fc hr, 38 | .fc thead, 39 | .fc tbody, 40 | .fc-row { 41 | border-color: #ccc !important; 42 | background: #fff !important; 43 | } 44 | 45 | /* kill the overlaid, absolutely-positioned components */ 46 | /* common... */ 47 | .fc-bg, 48 | .fc-bgevent-skeleton, 49 | .fc-highlight-skeleton, 50 | .fc-helper-skeleton, 51 | /* for timegrid. within cells within table skeletons... */ 52 | .fc-bgevent-container, 53 | .fc-business-container, 54 | .fc-highlight-container, 55 | .fc-helper-container { 56 | display: none; 57 | } 58 | 59 | /* don't force a min-height on rows (for DayGrid) */ 60 | .fc tbody .fc-row { 61 | height: auto !important; /* undo height that JS set in distributeHeight */ 62 | min-height: 0 !important; /* undo the min-height from each view's specific stylesheet */ 63 | } 64 | 65 | .fc tbody .fc-row .fc-content-skeleton { 66 | position: static; /* undo .fc-rigid */ 67 | padding-bottom: 0 !important; /* use a more border-friendly method for this... */ 68 | } 69 | 70 | .fc tbody .fc-row .fc-content-skeleton tbody tr:last-child td { /* only works in newer browsers */ 71 | padding-bottom: 1em; /* ...gives space within the skeleton. also ensures min height in a way */ 72 | } 73 | 74 | .fc tbody .fc-row .fc-content-skeleton table { 75 | /* provides a min-height for the row, but only effective for IE, which exaggerates this value, 76 | making it look more like 3em. for other browers, it will already be this tall */ 77 | height: 1em; 78 | } 79 | 80 | 81 | /* Undo month-view event limiting. Display all events and hide the "more" links 82 | --------------------------------------------------------------------------------------------------*/ 83 | 84 | .fc-more-cell, 85 | .fc-more { 86 | display: none !important; 87 | } 88 | 89 | .fc tr.fc-limited { 90 | display: table-row !important; 91 | } 92 | 93 | .fc td.fc-limited { 94 | display: table-cell !important; 95 | } 96 | 97 | .fc-popover { 98 | display: none; /* never display the "more.." popover in print mode */ 99 | } 100 | 101 | 102 | /* TimeGrid Restyling 103 | --------------------------------------------------------------------------------------------------*/ 104 | 105 | /* undo the min-height 100% trick used to fill the container's height */ 106 | .fc-time-grid { 107 | min-height: 0 !important; 108 | } 109 | 110 | /* don't display the side axis at all ("all-day" and time cells) */ 111 | .fc-agenda-view .fc-axis { 112 | display: none; 113 | } 114 | 115 | /* don't display the horizontal lines */ 116 | .fc-slats, 117 | .fc-time-grid hr { /* this hr is used when height is underused and needs to be filled */ 118 | display: none !important; /* important overrides inline declaration */ 119 | } 120 | 121 | /* let the container that holds the events be naturally positioned and create real height */ 122 | .fc-time-grid .fc-content-skeleton { 123 | position: static; 124 | } 125 | 126 | /* in case there are no events, we still want some height */ 127 | .fc-time-grid .fc-content-skeleton table { 128 | height: 4em; 129 | } 130 | 131 | /* kill the horizontal spacing made by the event container. event margins will be done below */ 132 | .fc-time-grid .fc-event-container { 133 | margin: 0 !important; 134 | } 135 | 136 | 137 | /* TimeGrid *Event* Restyling 138 | --------------------------------------------------------------------------------------------------*/ 139 | 140 | /* naturally position events, vertically stacking them */ 141 | .fc-time-grid .fc-event { 142 | position: static !important; 143 | margin: 3px 2px !important; 144 | } 145 | 146 | /* for events that continue to a future day, give the bottom border back */ 147 | .fc-time-grid .fc-event.fc-not-end { 148 | border-bottom-width: 1px !important; 149 | } 150 | 151 | /* indicate the event continues via "..." text */ 152 | .fc-time-grid .fc-event.fc-not-end:after { 153 | content: "..."; 154 | } 155 | 156 | /* for events that are continuations from previous days, give the top border back */ 157 | .fc-time-grid .fc-event.fc-not-start { 158 | border-top-width: 1px !important; 159 | } 160 | 161 | /* indicate the event is a continuation via "..." text */ 162 | .fc-time-grid .fc-event.fc-not-start:before { 163 | content: "..."; 164 | } 165 | 166 | /* time */ 167 | 168 | /* undo a previous declaration and let the time text span to a second line */ 169 | .fc-time-grid .fc-event .fc-time { 170 | white-space: normal !important; 171 | } 172 | 173 | /* hide the the time that is normally displayed... */ 174 | .fc-time-grid .fc-event .fc-time span { 175 | display: none; 176 | } 177 | 178 | /* ...replace it with a more verbose version (includes AM/PM) stored in an html attribute */ 179 | .fc-time-grid .fc-event .fc-time:after { 180 | content: attr(data-full); 181 | } 182 | 183 | 184 | /* Vertical Scroller & Containers 185 | --------------------------------------------------------------------------------------------------*/ 186 | 187 | /* kill the scrollbars and allow natural height */ 188 | .fc-scroller, 189 | .fc-day-grid-container, /* these divs might be assigned height, which we need to cleared */ 190 | .fc-time-grid-container { /* */ 191 | overflow: visible !important; 192 | height: auto !important; 193 | } 194 | 195 | /* kill the horizontal border/padding used to compensate for scrollbars */ 196 | .fc-row { 197 | border: 0 !important; 198 | margin: 0 !important; 199 | } 200 | 201 | 202 | /* Button Controls 203 | --------------------------------------------------------------------------------------------------*/ 204 | 205 | .fc-button-group, 206 | .fc button { 207 | display: none; /* don't display any button-related controls */ 208 | } 209 | -------------------------------------------------------------------------------- /assets/css/honeySwitch.css: -------------------------------------------------------------------------------- 1 | [class|=switch] { 2 | position: relative; 3 | display: inline-block; 4 | width: 50px; 5 | height: 30px; 6 | border-radius: 16px; 7 | line-height: 32px; 8 | -webkit-tap-highlight-color:rgba(255,255,255,0); 9 | } 10 | .switch-on { 11 | border: 1px solid white; 12 | box-shadow: white 0px 0px 0px 16px inset; 13 | transition: border 0.4s, box-shadow 0.2s, background-color 1.2s; 14 | background-color: white; 15 | cursor: pointer; 16 | } 17 | .slider { 18 | position: absolute; 19 | display: inline-block; 20 | width: 30px; 21 | height: 30px; 22 | background: white; 23 | box-shadow: 0 1px 3px rgba(0, 0, 0, 0.4); 24 | border-radius: 50%; 25 | left: 0; 26 | top: 0; 27 | } 28 | .switch-on .slider { 29 | left: 20px; 30 | transition: background-color 0.4s, left 0.2s; 31 | } 32 | .switch-off { 33 | border: 1px solid #dfdfdf; 34 | transition: border 0.4s, box-shadow 0.4s; 35 | background-color: rgb(255, 255, 255); 36 | box-shadow: rgb(223, 223, 223) 0px 0px 0px 0px inset; 37 | background-color: rgb(255, 255, 255); 38 | cursor: pointer; 39 | } 40 | .switch-off .slider { 41 | left: 0; 42 | transition: background-color 0.4s, left 0.2s; 43 | } 44 | .switch-on.switch-disabled{ 45 | opacity:.5; 46 | cursor:auto; 47 | } 48 | .switch-off.switch-disabled{ 49 | background-color:#F0F0F0 !important; 50 | cursor:auto; 51 | } -------------------------------------------------------------------------------- /assets/fonts/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodFrm/stuShare/4b801862237e0bba340e5dbd2e0d7f86cbcffcd3/assets/fonts/FontAwesome.otf -------------------------------------------------------------------------------- /assets/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodFrm/stuShare/4b801862237e0bba340e5dbd2e0d7f86cbcffcd3/assets/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /assets/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodFrm/stuShare/4b801862237e0bba340e5dbd2e0d7f86cbcffcd3/assets/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /assets/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodFrm/stuShare/4b801862237e0bba340e5dbd2e0d7f86cbcffcd3/assets/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /assets/fonts/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodFrm/stuShare/4b801862237e0bba340e5dbd2e0d7f86cbcffcd3/assets/fonts/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /assets/i/app-icon72x72@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodFrm/stuShare/4b801862237e0bba340e5dbd2e0d7f86cbcffcd3/assets/i/app-icon72x72@2x.png -------------------------------------------------------------------------------- /assets/i/examples/admin-chrome.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodFrm/stuShare/4b801862237e0bba340e5dbd2e0d7f86cbcffcd3/assets/i/examples/admin-chrome.png -------------------------------------------------------------------------------- /assets/i/examples/admin-firefox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodFrm/stuShare/4b801862237e0bba340e5dbd2e0d7f86cbcffcd3/assets/i/examples/admin-firefox.png -------------------------------------------------------------------------------- /assets/i/examples/admin-ie.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodFrm/stuShare/4b801862237e0bba340e5dbd2e0d7f86cbcffcd3/assets/i/examples/admin-ie.png -------------------------------------------------------------------------------- /assets/i/examples/admin-opera.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodFrm/stuShare/4b801862237e0bba340e5dbd2e0d7f86cbcffcd3/assets/i/examples/admin-opera.png -------------------------------------------------------------------------------- /assets/i/examples/admin-safari.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodFrm/stuShare/4b801862237e0bba340e5dbd2e0d7f86cbcffcd3/assets/i/examples/admin-safari.png -------------------------------------------------------------------------------- /assets/i/examples/adminPage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodFrm/stuShare/4b801862237e0bba340e5dbd2e0d7f86cbcffcd3/assets/i/examples/adminPage.png -------------------------------------------------------------------------------- /assets/i/examples/blogPage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodFrm/stuShare/4b801862237e0bba340e5dbd2e0d7f86cbcffcd3/assets/i/examples/blogPage.png -------------------------------------------------------------------------------- /assets/i/examples/landing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodFrm/stuShare/4b801862237e0bba340e5dbd2e0d7f86cbcffcd3/assets/i/examples/landing.png -------------------------------------------------------------------------------- /assets/i/examples/landingPage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodFrm/stuShare/4b801862237e0bba340e5dbd2e0d7f86cbcffcd3/assets/i/examples/landingPage.png -------------------------------------------------------------------------------- /assets/i/examples/loginPage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodFrm/stuShare/4b801862237e0bba340e5dbd2e0d7f86cbcffcd3/assets/i/examples/loginPage.png -------------------------------------------------------------------------------- /assets/i/examples/sidebarPage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodFrm/stuShare/4b801862237e0bba340e5dbd2e0d7f86cbcffcd3/assets/i/examples/sidebarPage.png -------------------------------------------------------------------------------- /assets/i/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodFrm/stuShare/4b801862237e0bba340e5dbd2e0d7f86cbcffcd3/assets/i/favicon.png -------------------------------------------------------------------------------- /assets/i/startup-640x1096.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodFrm/stuShare/4b801862237e0bba340e5dbd2e0d7f86cbcffcd3/assets/i/startup-640x1096.png -------------------------------------------------------------------------------- /assets/img/a5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodFrm/stuShare/4b801862237e0bba340e5dbd2e0d7f86cbcffcd3/assets/img/a5.png -------------------------------------------------------------------------------- /assets/img/k.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodFrm/stuShare/4b801862237e0bba340e5dbd2e0d7f86cbcffcd3/assets/img/k.jpg -------------------------------------------------------------------------------- /assets/img/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodFrm/stuShare/4b801862237e0bba340e5dbd2e0d7f86cbcffcd3/assets/img/logo.png -------------------------------------------------------------------------------- /assets/img/logoa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodFrm/stuShare/4b801862237e0bba340e5dbd2e0d7f86cbcffcd3/assets/img/logoa.png -------------------------------------------------------------------------------- /assets/img/logob.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodFrm/stuShare/4b801862237e0bba340e5dbd2e0d7f86cbcffcd3/assets/img/logob.png -------------------------------------------------------------------------------- /assets/img/user01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodFrm/stuShare/4b801862237e0bba340e5dbd2e0d7f86cbcffcd3/assets/img/user01.png -------------------------------------------------------------------------------- /assets/img/user02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodFrm/stuShare/4b801862237e0bba340e5dbd2e0d7f86cbcffcd3/assets/img/user02.png -------------------------------------------------------------------------------- /assets/img/user03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodFrm/stuShare/4b801862237e0bba340e5dbd2e0d7f86cbcffcd3/assets/img/user03.png -------------------------------------------------------------------------------- /assets/img/user04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodFrm/stuShare/4b801862237e0bba340e5dbd2e0d7f86cbcffcd3/assets/img/user04.png -------------------------------------------------------------------------------- /assets/img/user05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodFrm/stuShare/4b801862237e0bba340e5dbd2e0d7f86cbcffcd3/assets/img/user05.png -------------------------------------------------------------------------------- /assets/img/user06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodFrm/stuShare/4b801862237e0bba340e5dbd2e0d7f86cbcffcd3/assets/img/user06.png -------------------------------------------------------------------------------- /assets/img/user07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodFrm/stuShare/4b801862237e0bba340e5dbd2e0d7f86cbcffcd3/assets/img/user07.png -------------------------------------------------------------------------------- /assets/js/honeySwitch.js: -------------------------------------------------------------------------------- 1 | var honeySwitch = {}; 2 | honeySwitch.themeColor = "rgb(100, 189, 99)"; 3 | honeySwitch.init = function() { 4 | var s = ""; 5 | $("[class^=switch]").append(s); 6 | $("[class^=switch]").click(function() { 7 | if ($(this).hasClass("switch-disabled")) { 8 | return; 9 | } 10 | if ($(this).hasClass("switch-on")) { 11 | $(this).removeClass("switch-on").addClass("switch-off"); 12 | $(".switch-off").css({ 13 | 'border-color' : '#dfdfdf', 14 | 'box-shadow' : 'rgb(223, 223, 223) 0px 0px 0px 0px inset', 15 | 'background-color' : 'rgb(255, 255, 255)' 16 | }); 17 | } else { 18 | $(this).removeClass("switch-off").addClass("switch-on"); 19 | if (honeySwitch.themeColor) { 20 | var c = honeySwitch.themeColor; 21 | $(this).css({ 22 | 'border-color' : c, 23 | 'box-shadow' : c + ' 0px 0px 0px 16px inset', 24 | 'background-color' : c 25 | }); 26 | } 27 | if ($(this).attr('themeColor')) { 28 | var c2 = $(this).attr('themeColor'); 29 | $(this).css({ 30 | 'border-color' : c2, 31 | 'box-shadow' : c2 + ' 0px 0px 0px 16px inset', 32 | 'background-color' : c2 33 | }); 34 | } 35 | } 36 | }); 37 | window.switchEvent = function(ele, on, off) { 38 | $(ele).click(function() { 39 | if ($(this).hasClass("switch-disabled")) { 40 | return; 41 | } 42 | if ($(this).hasClass('switch-on')) { 43 | if ( typeof on == 'function') { 44 | on(); 45 | } 46 | } else { 47 | if ( typeof off == 'function') { 48 | off(); 49 | } 50 | } 51 | }); 52 | } 53 | if (this.themeColor) { 54 | var c = this.themeColor; 55 | $(".switch-on").css({ 56 | 'border-color' : c, 57 | 'box-shadow' : c + ' 0px 0px 0px 16px inset', 58 | 'background-color' : c 59 | }); 60 | $(".switch-off").css({ 61 | 'border-color' : '#dfdfdf', 62 | 'box-shadow' : 'rgb(223, 223, 223) 0px 0px 0px 0px inset', 63 | 'background-color' : 'rgb(255, 255, 255)' 64 | }); 65 | } 66 | if ($('[themeColor]').length > 0) { 67 | $('[themeColor]').each(function() { 68 | var c = $(this).attr('themeColor') || honeySwitch.themeColor; 69 | if ($(this).hasClass("switch-on")) { 70 | $(this).css({ 71 | 'border-color' : c, 72 | 'box-shadow' : c + ' 0px 0px 0px 16px inset', 73 | 'background-color' : c 74 | }); 75 | } else { 76 | $(".switch-off").css({ 77 | 'border-color' : '#dfdfdf', 78 | 'box-shadow' : 'rgb(223, 223, 223) 0px 0px 0px 0px inset', 79 | 'background-color' : 'rgb(255, 255, 255)' 80 | }); 81 | } 82 | }); 83 | } 84 | }; 85 | honeySwitch.showOn = function(ele) { 86 | $(ele).removeClass("switch-off").addClass("switch-on"); 87 | if(honeySwitch.themeColor){ 88 | var c = honeySwitch.themeColor; 89 | $(ele).css({ 90 | 'border-color' : c, 91 | 'box-shadow' : c + ' 0px 0px 0px 16px inset', 92 | 'background-color' : c 93 | }); 94 | } 95 | if ($(ele).attr('themeColor')) { 96 | var c2 = $(ele).attr('themeColor'); 97 | $(ele).css({ 98 | 'border-color' : c2, 99 | 'box-shadow' : c2 + ' 0px 0px 0px 16px inset', 100 | 'background-color' : c2 101 | }); 102 | } 103 | } 104 | honeySwitch.showOff = function(ele) { 105 | $(ele).removeClass("switch-on").addClass("switch-off"); 106 | $(".switch-off").css({ 107 | 'border-color' : '#dfdfdf', 108 | 'box-shadow' : 'rgb(223, 223, 223) 0px 0px 0px 0px inset', 109 | 'background-color' : 'rgb(255, 255, 255)' 110 | }); 111 | } 112 | $(function() { 113 | honeySwitch.init(); 114 | }); -------------------------------------------------------------------------------- /assets/js/theme.js: -------------------------------------------------------------------------------- 1 | var saveSelectColor = { 2 | 'Name': 'SelcetColor', 3 | 'Color': 'theme-black' 4 | } 5 | 6 | 7 | 8 | // 判断用户是否已有自己选择的模板风格 9 | if (storageLoad('SelcetColor')) { 10 | $('body').attr('class', storageLoad('SelcetColor').Color) 11 | } else { 12 | storageSave(saveSelectColor); 13 | $('body').attr('class', 'theme-black') 14 | } 15 | 16 | 17 | // 本地缓存 18 | function storageSave(objectData) { 19 | localStorage.setItem(objectData.Name, JSON.stringify(objectData)); 20 | } 21 | 22 | function storageLoad(objectName) { 23 | if (localStorage.getItem(objectName)) { 24 | return JSON.parse(localStorage.getItem(objectName)) 25 | } else { 26 | return false 27 | } 28 | } -------------------------------------------------------------------------------- /icf/config.php: -------------------------------------------------------------------------------- 1 | 'root', 14 | 'DB_PWD' => '', 15 | 'DB_DATABASE' => 'radius', 16 | 'DB_SERVER' => 'localhost', 17 | 'DB_PREFIX' => 'share_', 18 | // 数据库引擎 19 | '__DB_' => 'mysql', 20 | // 调试模式 21 | '__DEBUG_' => true, 22 | // 模板后缀 23 | 'TPL_SUFFIX' => 'html', 24 | // 默认操作变量 25 | 'ACTION' => 'get.action', 26 | //默认控制器变量 27 | 'CTRL' => 'get.ctrl', 28 | // 路由规则 29 | 'ROUTE_RULE' => [ 30 | '{s}.php' => '${1}->index->index', 31 | '{s}/{s}' => '${1}->${2}', 32 | '{s}' => '${1}->index', 33 | ], 34 | 'PUBLIC' => 'public', 35 | ); 36 | 37 | -------------------------------------------------------------------------------- /icf/functions.php: -------------------------------------------------------------------------------- 1 | $value) { 36 | if (is_string($value)) { 37 | if (empty($array[$key])) { 38 | return $value; 39 | } 40 | } else if (is_array($value)) { 41 | if (empty($array[$key])) { 42 | return $value['msg']; 43 | } 44 | if (!empty($value['regex'])) {//正则 45 | if (!preg_match($value['regex'][0], $array[$key])) { 46 | return $value['regex'][1]; 47 | } 48 | } 49 | if (!empty($value['func'])) {//对函数处理 50 | $tmpFunction=$value['func']; 51 | $funName=$value['func'][0]; 52 | $parameter=array(); 53 | unset($tmpFunction[0]); 54 | $parameter[]=$array[$key]; 55 | foreach ($tmpFunction as $v){ 56 | $parameter[]=$array[$v]; 57 | } 58 | $tmpValue = call_user_func_array($funName,$parameter); 59 | if ($tmpValue !== true) { 60 | return $tmpValue; 61 | } 62 | } 63 | if(!empty($value['enum'])){//判断枚举类型 64 | if(!in_array($array[$key],$value['enum'][0])){ 65 | return $value['enum'][1]; 66 | } 67 | } 68 | if(!empty($value['sql'])){//将其复制给sql插入数组 69 | $data[$value['sql']]=$array[$key]; 70 | } 71 | } 72 | } 73 | return true; 74 | } 75 | 76 | $_model = array(); 77 | /** 78 | * 获取数据库对象 79 | * 80 | * @author Farmer 81 | * @param string $table 82 | * @return \icf\lib\db() 83 | */ 84 | function DB($table = '') { 85 | $db = new \icf\lib\db(); 86 | if (!empty ($table)) { 87 | return $db->getDBObject($table); 88 | } 89 | return $db; 90 | } 91 | 92 | /** 93 | * 实例化一个没有模型文件的Model 94 | * 95 | * @author Farmer 96 | * @param string $table 97 | * @return \icf\lib\model() 98 | */ 99 | function M() { 100 | if (!G('model')) { 101 | G('model', new \icf\lib\model ()); 102 | } 103 | return G('model'); 104 | } 105 | 106 | /** 107 | * 实例化一个模板引擎view 108 | * 109 | * @author Farmer 110 | * @return \icf\lib\view() 111 | */ 112 | function V() { 113 | if (!G('view')) { 114 | G('view', new \icf\lib\view ()); 115 | } 116 | return G('view');; 117 | } 118 | 119 | /** 120 | * 获取或者设置一个全局变量 121 | * 122 | * @author Farmer 123 | * @param string $var 124 | * @param var $val 125 | * @return mixed 126 | */ 127 | function G($var, $val = 0) { 128 | static $_globals = array(); 129 | if ($val === 0) { 130 | if (!isset ($_globals [$var])) { 131 | return false; 132 | } 133 | return $_globals [$var]; 134 | } 135 | $_globals [$var] = $val; 136 | } 137 | 138 | /** 139 | * 获取变量 140 | * 141 | * @author Farmer 142 | * @param string $var 143 | * @return mixed 144 | */ 145 | function input($var) { 146 | $arrVar = explode('.', $var); 147 | if (sizeof($arrVar) <= 1) { 148 | $ret = G($var); 149 | } else { 150 | $ret = G($arrVar [0]); 151 | unset ($arrVar [0]); 152 | foreach ($arrVar as $value) { 153 | if (!isset ($ret [$value])) { 154 | return false; 155 | } 156 | $ret = $ret [$value]; 157 | } 158 | } 159 | return $ret; 160 | } 161 | 162 | /** 163 | * 输出一行信息 164 | * 165 | * @author Farmer 166 | * @param string $var 167 | * @param var $val 168 | * @return var 169 | */ 170 | function outmsg($msg) { 171 | if (is_string($msg)) { 172 | echo '
string:' . $msg . '
'; 173 | } else if (is_array($msg)) { 174 | echo '
';
175 |         print_r($msg);
176 |         echo '
'; 177 | } 178 | } 179 | 180 | /** 181 | * 模板用的三目运算符 182 | * @author Farmer 183 | * @param $bool 184 | * @param $false 185 | * @return mixed 186 | */ 187 | function th($bool,$true,$false=''){ 188 | if(empty($false)){ 189 | return $bool?:$true; 190 | } 191 | return $bool?$true:$false; 192 | } 193 | 194 | ///** 195 | // * 生成访问URL 196 | // * @author Farmer 197 | // * @param string $action 198 | // * @param string $param 199 | // * @return string 200 | // */ 201 | //function url($action='',$param='') { 202 | // preg_match_all( '/([\w]+)/', $action, $arrMatch); 203 | // $url='/'; 204 | // if(sizeof($arrMatch)==1){ 205 | // $url.='action='.$arrMatch[0][0]; 206 | // }else if(sizeof($arrMatch[0])==2){ 207 | // $url.='?ctrl='.$arrMatch[0][2].'&action='.$arrMatch[0][1]; 208 | // }else if(sizeof($arrMatch[0])==3){ 209 | // $url.=$arrMatch[0][0].'.php?ctrl='.$arrMatch[0][1].'&action='.$arrMatch[0][2]; 210 | // } 211 | // 212 | // return __HOME_.$url.($param?('&'.$param):''); 213 | //} 214 | /** 215 | * 生成访问URL 216 | * @author Farmer 217 | * @param string $action 218 | * @param string $param 219 | * @return string 220 | */ 221 | function url($action='',$param='') { 222 | preg_match_all( '/([\w]+)/', $action, $arrMatch); 223 | $url=''; 224 | foreach ($arrMatch[0] as $value){ 225 | $url.=('/'.$value); 226 | } 227 | return __HOME_.$url.($param?('?'.$param):''); 228 | } 229 | 230 | -------------------------------------------------------------------------------- /icf/index.php: -------------------------------------------------------------------------------- 1 | curl = curl_init($url); 19 | curl_setopt($this->curl, CURLOPT_HEADER, 0); //不返回header部分 20 | curl_setopt($this->curl, CURLOPT_RETURNTRANSFER, true); //返回字符串,而非直接输出 21 | curl_setopt($this->curl, CURLOPT_TIMEOUT,10); 22 | } 23 | public function setopt($key,$value){ 24 | curl_setopt($this->curl,$key,$value); 25 | } 26 | public function setRedirection($value=1){ 27 | curl_setopt($this->curl, CURLOPT_FOLLOWLOCATION, $value); 28 | } 29 | public function __destruct() { 30 | // TODO: Implement __destruct() method. 31 | curl_close($this->curl); 32 | } 33 | 34 | public function setCookie($cookie) { 35 | curl_setopt($this->curl, CURLOPT_COOKIE, $cookie); 36 | } 37 | 38 | public function setHeader($header) { 39 | curl_setopt($this->curl, CURLOPT_HTTPHEADER, $header); 40 | } 41 | 42 | public function setUrl($url) { 43 | curl_setopt($this->curl, CURLOPT_URL, $url); 44 | } 45 | 46 | public function https(){ 47 | curl_setopt($this->curl, CURLOPT_SSL_VERIFYPEER, false); 48 | } 49 | public function get() { 50 | $response = curl_exec($this->curl); 51 | return $response; 52 | } 53 | } -------------------------------------------------------------------------------- /icf/lib/model.php: -------------------------------------------------------------------------------- 1 | db)){ 27 | return 0; 28 | } 29 | return call_user_func_array ( array ( 30 | $this->db, 31 | $func 32 | ) ,$arguments); 33 | } 34 | } -------------------------------------------------------------------------------- /icf/lib/view.php: -------------------------------------------------------------------------------- 1 | template load error'; 78 | return false; 79 | } 80 | $cache = __ROOT_ . '/app/cache/tpl/' . md5($path) . '.php'; 81 | return self::fetch($path, $cache); 82 | } 83 | 84 | /** 85 | * 生成编译文件并返回 86 | * 87 | * @author Farmer 88 | * @param string $path 89 | * @param string $cache 90 | * @return 91 | * 92 | */ 93 | private function fetch($path, $cache) { 94 | $fileData = file_get_contents($path); 95 | if (!file_exists($cache) || filemtime($path) > filemtime($cache)) { 96 | $pattern = array( 97 | '/\{(\$[\w\[\]\']+)\}/', 98 | '/{break}/', 99 | '/{continue}/', 100 | '/{if (.*?)}/', 101 | '/{\/if}/', 102 | '/{elseif (.*?)}/', 103 | '/{else}/', 104 | '/{foreach (.*?)}/', 105 | '/{\/foreach}/', 106 | "/{include '(.*?)'}/", 107 | '/{\:(.*?)}/' 108 | ); 109 | $replace = array( 110 | '', 111 | '', 112 | '', 113 | '', 114 | '', 115 | '', 116 | '', 117 | '', 118 | '', 119 | 'display("${1}");?>', 120 | '' 121 | ); 122 | $cacheData = preg_replace($pattern, $replace, $fileData); 123 | @file_put_contents($cache, $cacheData); 124 | } else { 125 | $cacheData = file_get_contents($cache); 126 | } 127 | $pattern = array( 128 | '/__HOME__/' 129 | ); 130 | $replace = array( 131 | __HOME_ 132 | ); 133 | $cacheData = preg_replace($pattern, $replace, $cacheData); 134 | preg_match_all('/\{\$([a-zA-Z0-9_]+)\}/', $fileData, $tmp); 135 | for ($i = 0; $i < sizeof($tmp [1]); $i++) { 136 | if (!isset (self::$tplVar [$tmp [1] [$i]])) { 137 | self::$tplVar [$tmp [1] [$i]] = ''; 138 | } 139 | } 140 | ob_start(); 141 | extract(self::$tplVar); 142 | eval ('?>' . $cacheData); 143 | $content = ob_get_contents(); 144 | ob_end_clean(); 145 | return $content; 146 | } 147 | } -------------------------------------------------------------------------------- /icf/loader.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 信院小站 12 | 13 | 14 | 15 |
16 | logo 17 | 信院小站 18 |
19 |
20 | 21 |
22 |
23 |
24 |
25 |

信院小站

26 |

信院影视与校园网相互结合

27 |
28 |

校内生活不再无聊

29 | 30 |

QQ群:175853183

31 |
32 | 下一页
下一页
33 |
34 |
35 | 36 |
37 |
38 |
39 |
40 |

信院小站

41 |

信院影视

42 |
43 |

同时支持 爱奇艺 优酷 搜狐 腾讯 会员影视 在线观看

44 |

离线最新电影每日更新

45 |

可校内无网络状态下观看

46 | 47 |
48 | 下一页
下一页
49 |
50 |
51 | 52 |
53 |
54 |
55 |
56 |

信院小站

57 |

我们还提供校园内上网服务

58 |
59 |

无需办理联通等宽带服务直接上网

60 | 61 |
62 | 返回顶部
返回顶部
63 |
64 |
65 |
66 | 67 | 68 | 86 | 87 | -------------------------------------------------------------------------------- /index.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /openvpn-stushare/openvpn-stushare/App.xaml: -------------------------------------------------------------------------------- 1 |  6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /openvpn-stushare/openvpn-stushare/App.xaml.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Configuration; 4 | using System.Data; 5 | using System.Linq; 6 | using System.Threading.Tasks; 7 | using System.Windows; 8 | 9 | namespace openvpn_stushare 10 | { 11 | /// 12 | /// App.xaml 的交互逻辑 13 | /// 14 | public partial class App : Application 15 | { 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /openvpn-stushare/openvpn-stushare/FeedBackWindow.xaml: -------------------------------------------------------------------------------- 1 |  10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 30 | 31 | 32 | 33 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 54 | 55 | 56 |