張笑青 吳中杰 夏俊
摘要:針對江蘇省內(nèi)的對于衣、食、住、行類信息的發(fā)布、整理、歸類、檢索等功能要求,提出了使用PHP服務(wù)器、MySQL數(shù)據(jù)庫開發(fā)工具以及MVC的開發(fā)模式、Zend+CI的開發(fā)框架等最新技術(shù),設(shè)計出基于開源代碼“小黃雞”的二次開發(fā)的網(wǎng)絡(luò)互動社區(qū)平臺。實驗結(jié)果:本網(wǎng)絡(luò)互動社區(qū)平臺實現(xiàn)了信息的發(fā)布、整理、歸類、檢索等功能,此外人們還可以通過微信、網(wǎng)站發(fā)布等方式進(jìn)行信息的互動和共享。結(jié)論:本網(wǎng)絡(luò)互動社區(qū)平臺可以方便大眾人群使用并可以實現(xiàn)信息的互動和共享。
關(guān)鍵詞:PHP;MySQL;MVC;互動平臺;微信;數(shù)據(jù)庫
中圖分類號:TP311文獻(xiàn)標(biāo)識碼:A文章編號:1009-3044(2014)08-1681-11
隨著計算機(jī)網(wǎng)絡(luò)和手機(jī)網(wǎng)絡(luò)的發(fā)展,網(wǎng)絡(luò)社區(qū)成為人們相互交流溝通的良好平臺,正逐漸發(fā)展為一個巨大的網(wǎng)絡(luò)群體。社區(qū)會員通過社區(qū)平臺相互交流,彼此間的互動可以實現(xiàn)信息的傳遞和共享,方便了會員的日常生活。“愛江蘇” 網(wǎng)絡(luò)互動平臺是在開源程序“小黃雞”等的基礎(chǔ)上進(jìn)行的二次開發(fā),搭建專業(yè)的知識庫和在線問答社區(qū)。小黃雞是源于韓國的一款聊天機(jī)器人,小黃雞接口是由微信論壇提供的智能對話接口,開發(fā)者可以通過該接口建立自己的交互平臺?!皭劢K” 網(wǎng)絡(luò)互動平臺開發(fā)的主要目標(biāo)是方便人們對于在住宿、餐飲、購物、公共服務(wù)、旅游、娛樂等方面信息的需求,注冊的會員不僅可以在網(wǎng)站上提出問題、發(fā)布話題、關(guān)注好友、站內(nèi)搜索等,還可以通過手機(jī)微信查看話題、回復(fù)話題和提問等,大大方便了人們的日常生活。本系統(tǒng)的建設(shè)原則是首先采用主流技術(shù)和成熟架構(gòu)進(jìn)行開發(fā)建設(shè);其次應(yīng)該易于使用和操作,符合大眾的使用習(xí)慣;再次系統(tǒng)應(yīng)保證擁有高可靠、均衡負(fù)載、能長時間連續(xù)運行的能力;最后系統(tǒng)還需有可擴(kuò)展性,方便動態(tài)擴(kuò)展以滿足業(yè)務(wù)的不斷增長的需求。
1 運行環(huán)境
1.1服務(wù)器配置要求
操作系統(tǒng):WINXP/2000/2003
數(shù)據(jù)庫:MySQL Server 5.0
CPU:主頻800MHZ
內(nèi)存:1GB(最大可擴(kuò)充量=16GB)
硬盤:SCSI硬盤
網(wǎng)卡:100M/1000M以太網(wǎng)卡
網(wǎng)絡(luò)協(xié)議:TCP/IP
1.2 Wamp的設(shè)置和使用
本系統(tǒng)采用的開發(fā)工具是PHP語言和MySQL數(shù)據(jù)庫,由于單純搭建PHP環(huán)境比較繁瑣,所以我們使用了整合型的Wamp程序。WampServer是一款由法國人開發(fā)的Apache Web服務(wù)器、PHP解釋器以及MySQL數(shù)據(jù)庫的整合軟件包,大大簡化了開發(fā)人員配置環(huán)境的過程;Wamp又可理解為在Windows下將Apache+PHP+MySQL 集成的環(huán)境,它擁有簡單的圖形和菜單安裝和配置環(huán)境。具體安裝過程很簡單:
首先下載WampServer安裝包,根據(jù)提示安裝即可。安裝成功后可以在桌面右下角看到半圓形圖標(biāo),這個就是WampServe圖標(biāo),右鍵該圖標(biāo)可以修改語言狀態(tài),左鍵圖標(biāo)可以設(shè)置各項屬性,例如:Apache模塊設(shè)置、目錄設(shè)置,PHP設(shè)置、擴(kuò)展設(shè)置,MySQL服務(wù)設(shè)置、控制臺設(shè)置等。同時還可以通過左鍵圖標(biāo)設(shè)置WampServe的當(dāng)前狀態(tài):停止服務(wù)狀態(tài)、啟動服務(wù)狀態(tài)、離線狀態(tài)、在線狀態(tài)。
在安裝目錄下的/wamp/www/文件夾下,是“愛江蘇”互動平臺的系統(tǒng)文件夾ia0523,運行的時候在瀏覽器中輸入http://localhost/ia0523/便可以看到系統(tǒng)的頁面。下圖是Wamp的實現(xiàn)訪問數(shù)據(jù)庫的工作原理:
2 Web應(yīng)用程序的開發(fā)模式
2.1 MVC開發(fā)模式
Web應(yīng)用的開發(fā)模式主要分為分層開發(fā)模式與分模塊開發(fā)模式。
傳統(tǒng)的Web應(yīng)用開發(fā)一般分成三層:表示層、業(yè)務(wù)邏輯層和數(shù)據(jù)層。每一層完成相應(yīng)的職能,層之間通過接口實現(xiàn)松耦合,對任何一層的修改都不會影響到其他層的運行。例如數(shù)據(jù)層被修改的話,表示層和業(yè)務(wù)邏輯層均不會受到影響。
本系統(tǒng)使用的模式是當(dāng)前流行的MVC模式。MVC開發(fā)模式(Model-View-Controller),是一種分模塊的開發(fā)模式,并被廣泛應(yīng)用于Web應(yīng)用開發(fā)中。MVC中的模型(Model)代表數(shù)據(jù)結(jié)構(gòu),通常來說,模型類將包含取出、插入、更新數(shù)據(jù)庫等功能。視圖(View)是展示給用戶的信息,一個視圖通常是一個網(wǎng)頁,還可以是任何其他類型的“頁面”。控制器(Controller)是模型、視圖以及其他任何處理HTTP請求所必須的資源之間的中介,并生成網(wǎng)頁。使用MVC可以增加代碼重用率,減少數(shù)據(jù)表達(dá)、數(shù)據(jù)描述和應(yīng)用操作等部分耦合度的目的,同時還可以使程序的可維護(hù)性、可修復(fù)性、可擴(kuò)充性等得到更大的提高。下圖是MVC模式原理圖:
2.2 系統(tǒng)的開發(fā)框架:Zend框架和CI框架
框架是一個開發(fā)Web程序的基本架構(gòu),它通過提供快速搭建網(wǎng)站需要的全部組件,實現(xiàn)流水式的Web程序開發(fā)。PHP框架中,Zend、CakePHP、CI、Symfony以及Seagull是五大最佳的PHP開發(fā)框架。PHP絕大多數(shù)框架都是MVC開發(fā)模式的。
本系統(tǒng)采用了Zend框架與CI框架,汲取了兩種框架的優(yōu)點。
本系統(tǒng)的文件目錄結(jié)構(gòu)如圖3所示。
Zend框架是由Zend公司支持開發(fā)的完全基于PHP5的開源PHP開發(fā)框架,可用于開發(fā)Web程序和服務(wù)。Zend Framework采用MVC(Model-View-Controller)機(jī)構(gòu)模式來分離應(yīng)用程序中不同的部分方便程序的開發(fā)和維護(hù);代碼完全采用PHP5面向?qū)ο缶帉?;具有豐富完整的組件支持;模塊化的結(jié)構(gòu)設(shè)計,易于擴(kuò)展;完善的文檔資料;靈活的架構(gòu)設(shè)計。
CI的全稱是CodeIgniter,它是一個簡單快速的PHP MVC 框架。CodeIgniter 是一套給 PHP 網(wǎng)站開發(fā)者使用的應(yīng)用程序開發(fā)框架和工具包。它提供一套豐富的標(biāo)準(zhǔn)庫以及簡單的接口和邏輯結(jié)構(gòu),其目的是使開發(fā)人員更快速地進(jìn)行項目開發(fā)。使用 CodeIgniter 可以減少代碼的編寫量,并將你的精力投入到項目的創(chuàng)造性開發(fā)上。
相對而言,Zend比較適合用于復(fù)雜的系統(tǒng),因此會顯得比較笨重;而CI則相對輕量,自由度高,更適用于小型和初級的系統(tǒng)。
本系統(tǒng)中“話題”(topic)模塊中所使用的CI的代碼示例:
// 控制器Controller: /app/admin/topic.php
class topic extends AWS_CONTROLLER{var $per_page = 15;public function setup(){$this→model('admin_session')→init();TPL::assign('menu_list', $this→model('admin_group')→get_menu_list($this→user_info['group_id'], 303));}public function index_action(){$this→list_action();}……
//模型Model: /models/topic.php
class topic_class extends AWS_MODEL
{//根據(jù)指定條件獲取話題數(shù)據(jù)
public function get_topic_list($where = null, $limit = 10, $order = 'topic_id DESC')
{if ($topic_list = $this→fetch_all('topic', $where, $order, $limit)){
foreach ($topic_list AS $key => $val)
{if (!$val['url_token'])
{$topic_list[$key]['url_token'] = rawurlencode($val['topic_title']);
}}}
return $topic_list;
}……
//視圖View: /views/default/admin/topic/ list.tpl.htm
……
else{ ?>﹀<?php } ?><?php } ?> <?php _e('狀態(tài)'); ?> <?php _e('操作'); ?><?php _e('話題標(biāo)題'); ?> <?php _e('相關(guān)話題'); ?>
……
3 系統(tǒng)總體結(jié)構(gòu)
3.1 系統(tǒng)總體結(jié)構(gòu)
“愛江蘇”網(wǎng)絡(luò)互動平臺的實際運行過程為:用戶注冊會員,登錄后可以看到有幾個主要菜單:問題,話題,用戶。打開問題菜單,用戶可以查看全部問題列表;可以根據(jù)個人需求打開某類問題(包括住宿類、旅游類、餐飲類、娛樂類、購物類、公共服務(wù)類、其他類等);可以搜索需要了解的問題;同時還可以編輯提問。打開話題菜單:用戶可以編輯話題;關(guān)注話題。打開用戶菜單:用戶可以回復(fù)某個用戶的話題;關(guān)注和取消關(guān)注某用戶等。同時用戶還可以對個人信息進(jìn)行設(shè)置:用戶基本信息的設(shè)置;郵件或通知提醒的設(shè)置;QQ或微信賬號綁定設(shè)置;密碼設(shè)置等。以下是網(wǎng)站前臺和后臺的功能結(jié)構(gòu)圖。
3.2用例圖
“愛江蘇”網(wǎng)絡(luò)互動平臺中不同的用戶有不同的權(quán)限。未注冊的用戶只有站內(nèi)搜索、查看問題等功能,不能發(fā)起問題、后臺管理等;已注冊的用戶分為超級管理員和普通會員等,其中普通會員可以進(jìn)行問題管理、站內(nèi)搜索、話題管理、用戶管理和基本信息管理等;超級用戶除了擁有普通會員的權(quán)限外還有網(wǎng)站后臺管理的權(quán)限,包括全局管理、界面管理、內(nèi)容管理、用戶管理、運營管理、郵件群發(fā)管理、系統(tǒng)維護(hù)等。
下圖為系統(tǒng)用例圖:
4 數(shù)據(jù)庫的設(shè)計與實現(xiàn)
4.1 MySQL數(shù)據(jù)庫配置
“愛江蘇”網(wǎng)絡(luò)互動平臺中數(shù)據(jù)庫的開發(fā)使用的是MySQL數(shù)據(jù)庫,MySQL是一個快速、多線程、多用戶的SQL數(shù)據(jù)庫服務(wù)器,是PHP的首選數(shù)據(jù)庫,PHP中提供了一整套的MySQL函數(shù),對MySQL進(jìn)行了全方位的支持。WampServer整合了PHP、Apache和MySQL;其中MySQL是基于PHP的數(shù)據(jù)庫管理軟件,可以通過系統(tǒng)托盤菜單中的phpMyAdmin對數(shù)據(jù)庫進(jìn)行操作。在MySQL數(shù)據(jù)庫中,root賬戶類似于SQL Server的sa賬戶,具有對數(shù)據(jù)庫的最高操作權(quán)限。默認(rèn)情況下root賬戶的密碼為空,可以通過phpMyAdmin的界面設(shè)置權(quán)限,對root賬戶設(shè)置密碼。
數(shù)據(jù)庫配置為 /system/config/database.php文件中的:
<?php
$config['charset'] = 'utf8';$config['prefix'] = 'aws_';$config['driver'] = 'MySQLi';$config['master'] = array (
'charset' => 'utf8',
'host' => 'localhost',
'username' => 'root',
'password' => '',
'dbname' => 'ia05232',
'db_port' => '3306',
);
$config['slave'] = false;$config['db_port'] = '3306';
對數(shù)據(jù)庫中表的操作,例如/system/ aws_model.inc.php 文件中的,插入數(shù)據(jù)函數(shù):
// 插入數(shù)據(jù)
public function insert($table, $data)
{foreach ($data AS $key => $val)
{$debug_data['`' . $key . '`'] = "'" . $val . "'";
}
$sql = 'INSERT INTO `' . $this→get_table($table) . '` (' . implode(', ', array_flip($debug_data)) . ') VALUES (' . implode(', ', $debug_data) . ')';
if (AWS_APP::config()→get('system')→debug)
{$start_time = microtime(TURE);
}
try {
$rows_affected = $this→db()→insert($this→get_table($table), $data);
}catch (Exception $e)
{show_error("Database error\n——-\n\nSQL: {$sql}\n\nError Message: " . $e→getMessage());
}
if (AWS_APP::config()→get('system')→debug)
{AWS_APP::debug_log('database', (microtime(TRUE) - $start_time), $sql);
}
$last_insert_id = $this→db()→lastInsertId();
return $last_insert_id;
}
圖7是在WampServer中使用phpMyAdmin打開的MySQL數(shù)據(jù)庫ia05232的數(shù)據(jù)庫。
4.2 數(shù)據(jù)庫表結(jié)構(gòu)設(shè)計
本系統(tǒng)的數(shù)據(jù)庫設(shè)計比較復(fù)雜,主要涉及幾大類包括問題表,問題回復(fù)表,導(dǎo)航分類表,話題表,用戶表,通知表,專題表,用戶舉報表,郵件群發(fā)表,微信表等。其中每一種類型的表,都會根據(jù)功能的需要細(xì)分,不但達(dá)到表結(jié)構(gòu)的最優(yōu)減少冗余,而且能夠?qū)崿F(xiàn)特定的功能。例如:問題表可以細(xì)分成問題內(nèi)容表,問題關(guān)注表,問題邀請表,問題興趣表,問題答謝表等;問題回復(fù)表可以細(xì)分成回復(fù)內(nèi)容表,回復(fù)答謝表,回復(fù)興趣表,回復(fù)投票表等;用戶表可以細(xì)分成用戶貢獻(xiàn)度表,用戶贊同表,用戶組表,用戶通知設(shè)置表,用戶上線表,用戶qq表,用戶sina表,用戶行為表等;話題表可以細(xì)分成話題關(guān)注表,話題合并表,話題問題表等;由于數(shù)據(jù)庫中的表較多,不能一一列舉,因此只列表其中幾個比較典型的數(shù)據(jù)表結(jié)構(gòu),以下是aws_question(問題表),aws_topic(話題表),aws_notice(通知表),aws_users(用戶表),aws_users_qq(用戶qq表),aws_weixin_message(微信信息表),aws_nav_menu(導(dǎo)航菜單表),aws_category(分類表)的表結(jié)構(gòu):
1)aws_question(問題表)
5 系統(tǒng)關(guān)鍵技術(shù)
5.1網(wǎng)站第三方登錄的實現(xiàn)
本系統(tǒng)采用了第三方登錄接口,所謂第三方登錄就是不需要注冊本網(wǎng)站的會員也可以通過用戶的QQ賬號或微博賬號登錄到本網(wǎng)站中,前提是用戶已經(jīng)擁有QQ賬號或者微博賬號;這樣可以吸引更多的用戶使用我們網(wǎng)站的功能,省略了注冊會員的步驟。要使用第三方服務(wù),需要經(jīng)過第三方平臺的授權(quán),到第三方網(wǎng)站注冊成為它的開發(fā)者,并為所開發(fā)的軟件申請APPID。詳細(xì)步驟如下:
1)申請第三方登錄接口:登錄到新浪微博-開放平臺,申請web應(yīng)用的驗證授權(quán),
2)獲取到key和secret值
3)寫第三方登錄文檔
//新浪微博 OAuth 認(rèn)證類(OAuth2)
class SaeTOAuthV2 {
public $client_id;
public $client_secret;
public $access_token;
public $refresh_token;
public $http_code;
public $url;
public $host = "https://api.weibo.com/2/";
public $timeout = 30;
public $connecttimeout = 30;
public $ssl_verifypeer = FALSE;
public $format = 'json';
public $decode_json = TRUE;
public $http_info;
public $useragent = 'Sae T OAuth2 v0.1';
public $debug = FALSE;
public static $boundary = '';
//獲取Access Token如下
function accessTokenURL()
{ return 'https://api.weibo.com/oauth2/access_token'; }
//引導(dǎo)需要授權(quán)的用戶到如下地址
function authorizeURL()
{ return 'https://api.weibo.com/oauth2/authorize'; }
//實例化以下變量
function __construct($client_id, $client_secret, $access_token = NULL, $refresh_token = NULL)
{$this→client_id = $client_id;
$this→client_secret = $client_secret;
$this→access_token = $access_token;
$this→refresh_token = $refresh_token;
}
// authorize接口
function getAuthorizeURL( $url, $response_type = 'code', $state = NULL, $display = NULL )
{$params = array();
$params['client_id'] = $this→client_id;
$params['redirect_uri'] = $url;
$params['response_type'] = $response_type;
$params['state'] = $state;
$params['display'] = $display;
return $this→authorizeURL() . "?" . http_build_query($params);
}……
// 獲取最新的公共微博消息
function public_timeline( $page = 1, $count = 50, $base_app = 0 )
{$params = array();
$params['count'] = intval($count);
$params['page'] = intval($page);
$params['base_app'] = intval($base_app);
return $this→oauth→get('statuses/public_timeline', $params);
}......
5.2 微信的實現(xiàn)
隨著智能手機(jī)的普及,微信越來越受到大家的歡迎,因此“愛江蘇”網(wǎng)絡(luò)互動平臺也增設(shè)了微信公眾平臺,便于移動互聯(lián)網(wǎng)登錄,并可以綁定私人賬號進(jìn)行群發(fā)信息。具體實現(xiàn)過程為:
進(jìn)入騰訊微信的公眾平臺http://mp.weixin.qq.com,到騰訊微博開放平臺申請AppKey,輸入一個token值,任意長度和字符串,為了接口安全,盡量用大于12位的字符串。
注冊登陸微信公眾平臺http://mp.weixin.qq.com,申請公眾平臺帳號,在設(shè)置里面輸入對應(yīng)的anwsion站點api接口:http://localhost/ia0523/app/weixin/api/;輸入和第1步一樣的token值,保存。打開anwsion站點后臺管理界面,在全局-開放平臺找到對應(yīng)微信公眾平臺接口設(shè)置。關(guān)注您的公眾平臺帳號,輸入您要查詢的社區(qū)內(nèi)容,測試返回數(shù)值表示設(shè)置正確。
配置信息編寫接口文件:
……
public function get_access_rule()
{$rule_action['rule_type'] = 'black';
$rule_action['actions'] = array();
return $rule_action;
}
public function setup()
{if (!$this→model('weixin')→check_signature($_GET['signature'], $_GET['timestamp'], $_GET['nonce']))
{die;
}
if ($_GET['echostr'])
{echo htmlspecialchars($_GET['echostr']);
die;
}
$this→input_message = $this→model('weixin')→fetch_message();
}
public function index_action()
{$this→model('weixin')→response_message($this→input_message);
}}
……
//以下為接受消息代碼:
public function fetch_message()
{$post_data = file_get_contents('php://input');
// extract post data
if (! empty($post_data))
{$post_object = (array)simplexml_load_string($post_data, 'SimpleXMLElement', LIBXML_NOCDATA);
return array(
'fromUsername' => $post_object['FromUserName'],
'toUsername' => $post_object['ToUserName'],
'content' => trim($post_object['Content']),
'time' => time(),
'msgType' => $post_object['MsgType'],
'event' => $post_object['Event'],
'eventKey' => $post_object['EventKey']
);
}}
public function response_message($input_message)
{switch ($input_message['msgType'])
{case 'event':
switch ($input_message['event'])
{case 'subscribe':
$response_message = '您已經(jīng)成功關(guān)注 ' . get_setting('site_name') . ', 請問需要什么幫助嗎? 您可以通過輸入 "help, 幫助" 獲得更多支持!';
break;
}
break;
default:
if ($response = $this→message_parser($input_message))
{// Success...
$response_message = $response['message'];
$action = $response['action'];
}……..
6 界面展示
下圖為網(wǎng)站前臺首頁的界面:
下圖為網(wǎng)站后臺功能設(shè)置的界面:
7 結(jié)束語
“愛江蘇”網(wǎng)絡(luò)互動平臺采用了PHP技術(shù)和MySQL數(shù)據(jù)庫開發(fā)的基于Web的系統(tǒng),實現(xiàn)了江蘇省內(nèi)的衣食住行等信息的發(fā)布與查詢,同時實現(xiàn)了移動互聯(lián)網(wǎng)登錄技術(shù),方便了用戶的使用。本系統(tǒng)開發(fā)過程中使用了MVC開發(fā)模式和Zend+CI的框架,采用了多種先進(jìn)技術(shù),增加了代碼重用率,減少了數(shù)據(jù)表達(dá)、數(shù)據(jù)描述和應(yīng)用操作等部分耦合度,同時還可以使程序的可維護(hù)性、可修復(fù)性、可擴(kuò)充性等得到更大的提高。系統(tǒng)在實際使用過程中還需要根據(jù)具體情況不斷完善和改進(jìn)。
參考文獻(xiàn):
[1] 黃雅萍,劉曉強(qiáng),吳成義. 基于MySQL和PHP的分布式事務(wù)處理[J]. 東華大學(xué)學(xué)報:自然科學(xué)版,2011(1):81-85
[2] 張文婷. 都市報微信公眾平臺的運營與發(fā)展探索——基于八家都市報微信平臺的研究[J]. 中國記者,2013(5):99-100.
[3] 王鳳玲. 基于PHP+MYSQL的新聞發(fā)布系統(tǒng)的研究與實現(xiàn)[J]. 計算機(jī)應(yīng)用與軟件,2012(2):234-236.
[4] 張瑩. 信息分類編碼在線查詢——基于PHP+Apache+MySQL的Web數(shù)據(jù)庫開發(fā)實例[J]. 情報科學(xué),2004(4):510-512.
[5] 穆榮軍. 基于Apache+MySQL+PHP的關(guān)鍵技術(shù)分析[J]. 中國電化教育,2002(2):79.
[6] 劉紅芝. 基于Apache+PHP+MySQL框架的圖書管理系統(tǒng)開發(fā)[J]. 江西圖書館學(xué)刊,2008(3):100-101.