数据库表结构
CREATE TABLE `u_links` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`url` varchar(255) NOT NULL DEFAULT '',
`hash` varchar(32) NOT NULL,
`hits` int(10) unsigned NOT NULL DEFAULT '0',
`created_at` datetime NOT NULL,
`updated_at` datetime NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `hash` (`hash`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
虽然理论上url可以很长,但是这里约束一下255
目录结构
这里仅列出需要动到的目录和文件
app/config 配置文件目录
app/controllers 控制器
app/models 模型
app/views 视图
app/lib 自己建的,方便放一些公用库
app/routes.php 路由
代码
对于短网址的算法不再说明,网上很多,这里使用base62来处理
配置文件
app/config/app.php
- 打开debug
- 修改时区为'Asia/Shanghai'
- 修改key,可使用artisan生成
php artisan key:generate
app/config/database.php
- 修改mysql的配置
定路由
// 显示首页
Route::get('/', 'HomeController@index');
// 网址转向
Route::get('{shorten}', 'HomeController@redirect')
->where('shorten', '[0-9A-z]+');
// 网址点击统计
Route::get('{shorten}!', 'HomeController@show')
->where('shorten', '[0-9A-z]+');
控制器
由于HomeController本身就存在,所以我们不需要生成或新建。 这里我们会用到base62的库,附件中会给出
贴代码:
public function index() {
$shorten = '';
$url = Input::get('url');
if (!is_null($url)) {
$validator = Validator::make(compact('url'), [
'url' => 'required|max:255|url',
]);
if ($validator->fails())
return Redirect::to('/')->withInput()->withErrors($validator->errors());
$hash = md5($url);
$link = Link::whereHash($hash)->first();
if (!$link)
$link = Link::create(compact('url', 'hash'));
$shorten = \Lib\Base62::encode($link->id);
}
return View::make('home.index')
->with(compact('url', 'shorten'));
}
public function redirect($shorten) {
$id = \Lib\Base62::decode($shorten);
$link = Link::find($id);
if ($link) {
$link->increment('hits');
return Redirect::to($link->url, 301);
}
App::abort(404);
}
public function show($shorten) {
$id = \Lib\Base62::decode($shorten);
$link = Link::find($id);
if ($link) {
return View::make('home.show')
->with($link->toArray());
}
App::abort(404);
}
Base62.zip