上传了一些文件
This commit is contained in:
parent
36d7decd07
commit
155688790f
1
api/index.php
Normal file
1
api/index.php
Normal file
@ -0,0 +1 @@
|
|||||||
|
<?php exit; ?>
|
30
api/set.php
Normal file
30
api/set.php
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
<?php
|
||||||
|
// 引入类
|
||||||
|
require_once('../inc/require.php');
|
||||||
|
global $config;
|
||||||
|
$url_c = new url();
|
||||||
|
|
||||||
|
$opt = [];
|
||||||
|
$opt['success'] = 'false';
|
||||||
|
|
||||||
|
$request_arr = json_decode(file_get_contents('php://input'), true);
|
||||||
|
if(isset($request_arr['url'])) {
|
||||||
|
// 添加 HTTP 协议前缀
|
||||||
|
if(!strstr($request_arr['url'], 'http://') && !strstr($request_arr['url'], 'https:')) $request_arr['url'] = 'http://' . $request_arr['url'];
|
||||||
|
// 检测网址格式是否正确
|
||||||
|
$is_link = preg_match('(http(|s)://([\w-]+\.)+[\w-]+(/)?)', $request_arr['url']);
|
||||||
|
// 判断条件
|
||||||
|
if($request_arr['url'] != '' && !strstr($request_arr['url'], $_SERVER['HTTP_HOST']) && $is_link) {
|
||||||
|
$opt['success'] = 'true';
|
||||||
|
$opt['content']['url'] = $url_c->set_url($request_arr['url'], $config['length']);
|
||||||
|
} else if(strstr($request_arr['url'], $_SERVER['HTTP_HOST'])) {
|
||||||
|
$opt['content'] = '链接已经是短地址了。';
|
||||||
|
} else if(!$is_link) {
|
||||||
|
$opt['content'] = '请输入正确格式的网址。';
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$opt['content'] = '调用参数不能为空。';
|
||||||
|
}
|
||||||
|
// 输出
|
||||||
|
echo json_encode($opt);
|
||||||
|
?>
|
103
asset/css/main.css
Normal file
103
asset/css/main.css
Normal file
@ -0,0 +1,103 @@
|
|||||||
|
/* Reset */
|
||||||
|
* {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
html, body, input, text, textarea {
|
||||||
|
outline: none;
|
||||||
|
font-family: 'Arial', 'Microsoft YaHei', '黑体', '宋体', sans-serif;
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
html, body {
|
||||||
|
background: #fff;
|
||||||
|
}
|
||||||
|
a {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
a:hover {
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Main */
|
||||||
|
.wrap {
|
||||||
|
text-align: center;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
.wrap .meta {
|
||||||
|
margin: 160px 0 0 0;
|
||||||
|
opacity: 0;
|
||||||
|
transform: translateY(-150px);
|
||||||
|
transition: .5s all ease;
|
||||||
|
}
|
||||||
|
.on .wrap .meta {
|
||||||
|
opacity: 1;
|
||||||
|
transform: translateY(0);
|
||||||
|
}
|
||||||
|
.wrap .meta .title {
|
||||||
|
line-height: 1em;
|
||||||
|
color: #ff4665;
|
||||||
|
font-size: 42px;
|
||||||
|
text-transform: uppercase;
|
||||||
|
}
|
||||||
|
.wrap .meta .description {
|
||||||
|
margin: 10px 0 0 0;
|
||||||
|
line-height: 1em;
|
||||||
|
color: #7e7e7e;
|
||||||
|
font-size: 16px;
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
.wrap .link-area {
|
||||||
|
margin: 50px 0 0 0;
|
||||||
|
opacity: 0;
|
||||||
|
transition: .5s opacity ease;
|
||||||
|
}
|
||||||
|
.on .wrap .link-area {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
.wrap .link-area input {
|
||||||
|
display: inline-block;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
.wrap .link-area #url,
|
||||||
|
.wrap .link-area #shorturl {
|
||||||
|
width: 320px;
|
||||||
|
height: 32px;
|
||||||
|
line-height: 32px;
|
||||||
|
padding: 0 10px;
|
||||||
|
border: 3px solid #bdc3c7;
|
||||||
|
border-radius: 5px;
|
||||||
|
color: #333;
|
||||||
|
}
|
||||||
|
.wrap .link-area #url.focus,
|
||||||
|
.wrap .link-area #url:focus {
|
||||||
|
border-color: #ff4665;
|
||||||
|
transition: .2s border ease;
|
||||||
|
}
|
||||||
|
.wrap .link-area #shorturlcopy,
|
||||||
|
.wrap .link-area #submit {
|
||||||
|
width: 90px;
|
||||||
|
height: 38px;
|
||||||
|
margin: 0 0 0 5px;
|
||||||
|
background: #ff4665;
|
||||||
|
border-radius: 5px;
|
||||||
|
color: #fff;
|
||||||
|
border: none;
|
||||||
|
cursor: pointer;
|
||||||
|
transition: .2s opacity ease;
|
||||||
|
}
|
||||||
|
.wrap .link-area #submit:hover {
|
||||||
|
opacity: .75;
|
||||||
|
}
|
||||||
|
.wrap .link-area #submit:active {
|
||||||
|
opacity: .9;
|
||||||
|
}
|
||||||
|
.wrap .footer {
|
||||||
|
width: 100%;
|
||||||
|
bottom: 80px;
|
||||||
|
left: 0;
|
||||||
|
position: absolute;
|
||||||
|
color: #7e7e7e;
|
||||||
|
}
|
||||||
|
.wrap .footer a {
|
||||||
|
color:#ff4665;
|
||||||
|
}
|
60
asset/js/app.js
Normal file
60
asset/js/app.js
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
|
||||||
|
function copyText() {
|
||||||
|
var input = document.getElementById("shorturl");
|
||||||
|
input.select(); // 选中文本
|
||||||
|
document.execCommand("copy"); // 执行浏览器复制命令
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
var APP = (function(){
|
||||||
|
|
||||||
|
var fn = {
|
||||||
|
|
||||||
|
// 生成短地址
|
||||||
|
setUrl: function(self) {
|
||||||
|
var urlEl = document.getElementById('url'),
|
||||||
|
tips = 'https://',
|
||||||
|
request = {"url": urlEl.value};
|
||||||
|
fn.getJson('api/set.php', true, JSON.stringify(request), function(res) {
|
||||||
|
if(res.success == 'true') {
|
||||||
|
//urlEl.className = 'focus';
|
||||||
|
//urlEl.value = res.content.url;
|
||||||
|
$res = document.getElementById('shorturl')
|
||||||
|
$res.className = 'focus';
|
||||||
|
$res.value = res.content.url;
|
||||||
|
} else {
|
||||||
|
urlEl.className = '';
|
||||||
|
urlEl.value = '';
|
||||||
|
urlEl.setAttribute('placeholder', res.content);
|
||||||
|
setTimeout(function() {
|
||||||
|
urlEl.setAttribute('placeholder', tips);
|
||||||
|
}, 2000);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
// 获取 JSON 数据
|
||||||
|
getJson: function(url, post, data, callback) {
|
||||||
|
var xhr = new XMLHttpRequest(),
|
||||||
|
type = (post) ? 'POST' : 'GET';
|
||||||
|
xhr.onreadystatechange = function() {
|
||||||
|
if(xhr.readyState == 4 && xhr.status == 200) {
|
||||||
|
var json = JSON.parse(xhr.responseText);
|
||||||
|
callback(json);
|
||||||
|
} else if(xhr.readyState == 4) {
|
||||||
|
callback(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
xhr.open(type, url, true);
|
||||||
|
xhr.send(data);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
init = function() {
|
||||||
|
setTimeout(function() {
|
||||||
|
var el = document.getElementsByTagName('html')[0];
|
||||||
|
el.className = 'on';
|
||||||
|
}, 10);
|
||||||
|
};
|
||||||
|
return {fn: fn, init: init}
|
||||||
|
})();
|
||||||
|
|
||||||
|
document.addEventListener('DOMContentLoaded', function() {APP.init();})
|
BIN
inc/class/database.db
Normal file
BIN
inc/class/database.db
Normal file
Binary file not shown.
32
inc/class/db.class.php
Normal file
32
inc/class/db.class.php
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
<?php
|
||||||
|
class db {
|
||||||
|
function __construct() {
|
||||||
|
$this->db = new PDO('sqlite:' . dirname(__FILE__) . '/database.db');
|
||||||
|
$this->init_tab();
|
||||||
|
}
|
||||||
|
// 初始化数据库结构
|
||||||
|
function init_tab() {
|
||||||
|
// 网址表
|
||||||
|
$this->db->exec("CREATE TABLE urls(id char(8) PRIMARY KEY, url longtext, ip varchar(16), ua varchar(255))");
|
||||||
|
}
|
||||||
|
// 查询表内容
|
||||||
|
function query($name, $rule = '') {
|
||||||
|
$query = $this->db->prepare("SELECT * FROM $name $rule");
|
||||||
|
$query->execute();
|
||||||
|
$result = $query->fetchAll();
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
// 插入表内容
|
||||||
|
function insert($tab, $key, $val) {
|
||||||
|
$exec = $this->db->exec("INSERT INTO $tab ($key) VALUES($val)");
|
||||||
|
if(!$exec) return false;
|
||||||
|
$this->db->beginTransaction();
|
||||||
|
}
|
||||||
|
// 删除表内容
|
||||||
|
function delete($tab, $rule = '') {
|
||||||
|
$exec = $this->db->exec("DELETE FROM $tab $rule");
|
||||||
|
if(!$exec) return false;
|
||||||
|
$this->db->beginTransaction();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
60
inc/class/url.class.php
Normal file
60
inc/class/url.class.php
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
<?php
|
||||||
|
class url {
|
||||||
|
function __construct() {
|
||||||
|
global $db_c;
|
||||||
|
$this->db = $db_c;
|
||||||
|
}
|
||||||
|
// 生成短地址
|
||||||
|
public function set_url($url, $size = 4) {
|
||||||
|
$id = $this->get_id($url);
|
||||||
|
if(!$id) {
|
||||||
|
$id = $this->create_id($url, $size);
|
||||||
|
$ip = get_ip();
|
||||||
|
$ua = get_ua();
|
||||||
|
$this->db->insert('urls', 'id, url, ip, ua', "'$id', '$url', '$ip', '$ua'");
|
||||||
|
}
|
||||||
|
$s_url = get_uri() . $id;
|
||||||
|
return $s_url;
|
||||||
|
}
|
||||||
|
// 生成地址 ID
|
||||||
|
public function create_id($url, $size = 4) {
|
||||||
|
$md5 = md5($url);
|
||||||
|
// 随机抽取 MD5 中的字符作为 ID
|
||||||
|
$id = '';
|
||||||
|
for($i = 0; $i < $size; $i++) {
|
||||||
|
$rand_id = rand(0, strlen($md5) - 1);
|
||||||
|
$id .= $md5[$rand_id];
|
||||||
|
}
|
||||||
|
// ID 检测
|
||||||
|
if($this->has_id($id)) {
|
||||||
|
return $this->create_id($url, $size);
|
||||||
|
} else {
|
||||||
|
return $id;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 查询 ID 号
|
||||||
|
public function get_id($url) {
|
||||||
|
$result = $this->db->query('urls', "WHERE url = '$url'");
|
||||||
|
(count($result) > 0) ? $opt = $result[0]['id'] : $opt = false;
|
||||||
|
return $opt;
|
||||||
|
}
|
||||||
|
// 查询目标地址
|
||||||
|
public function get_url($id) {
|
||||||
|
$result = $this->db->query('urls', "WHERE id = '$id'");
|
||||||
|
(count($result) > 0) ? $opt = $result[0]['url'] : $opt = false;
|
||||||
|
return $opt;
|
||||||
|
}
|
||||||
|
// 检测 ID 是否已经存在
|
||||||
|
public function has_id($id) {
|
||||||
|
$result = $this->db->query('urls', "WHERE id = '$id'");
|
||||||
|
(count($result) > 0) ? $opt = true : $opt = false;
|
||||||
|
return $opt;
|
||||||
|
}
|
||||||
|
// 清空短地址
|
||||||
|
public function clean_urls() {
|
||||||
|
$del = $this->db->delete('urls');
|
||||||
|
if($del) return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
Loading…
x
Reference in New Issue
Block a user