123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155 |
- <?php
- namespace app\index\controller;
- use app\index\model\ShortUrlModel;
- use app\index\service\HelperService;
- use think\Controller;
- use think\Validate;
- class ShortUrl extends CmsController
- {
- public function index(){
- $params = $this->request->param();
- $rule = [
- 'old_url'=>'require'
- ];
- $validate = new Validate($rule);
- if(!$validate->check($params)){
- HelperService::returnJson([
- 'code'=>400,
- 'msg'=>$validate->getError(),
- 'data'=>""
- ]);
- }
- $num = 0;
- $flag = 'NEW';
- while(true){
- $shortUrlModel = new ShortUrlModel();
- $res = $shortUrlModel->where(['old_url'=>"{$params['old_url']}"])->find();
- if($res){
- $url_str = $res['url_str'];
- $flag = 'OLD';
- break;
- }
- $random = rand(0,9999);
- $random = str_pad($random,4,'0',STR_PAD_LEFT);
- $url_str = $this->createShortUrl("{$params['old_url']}",$random);
- //首先看库里有没有没有插入
- $res = $shortUrlModel->where(['url_str'=>"{$url_str}"])->find();
- if(empty($res)){
- break;
- }
- $num++;
- }
- if('NEW' == $flag){
- $shortUrlModel = new ShortUrlModel();
- $shortUrlModel->insert([
- 'old_url'=>"{$params['old_url']}",
- 'url_str'=>"{$url_str}",
- 'num'=>$num,
- ]);
- }
- HelperService::returnJson([
- 'code'=>200,
- 'msg'=>"http://{$_SERVER['HTTP_HOST']}?to={$url_str}",
- 'data'=>$flag
- ]);
- }
- private function createShortUrl($or_url,$salt){
- $md5_url = md5($or_url);
- //$salt = '0826';//这里不高于aaaa就不会出现61以上的数字,所以来说,后面的特别符号是不会出现的!
- $md5_url = $this->addSalt($md5_url,$salt);
- $short_url = '';
- for($i=0;$i<6;$i++){
- $current_str = substr($md5_url,$i*6,6);
- //处理当前串的值
- $short_url .= $this->ZChar($current_str);
- }
- return $short_url;
- }
- /**
- * 处理字符串
- * @param $str
- * @return int
- */
- private function dealStr($str){
- if(strlen($str) != 6){
- die("dealStr:{$str}error");
- }
- $count = '';
- for($i=0;$i<6;$i++){
- //加权,避免不同序列的和一致
- $number = hexdec($str[$i])*($i+1)%12;
- $count += $number;
- }
- return $count % 66;
- }
- /**
- * 字码表
- * @param $char_point
- * @return mixed
- */
- private function char($char_point){
- $char_array = ["0","1","2","3","4","5",
- "6","7","8","9","a","b","c","d",
- "e","f","g","h","i","j","k","l",
- "m","n","o","p","q","r","s","t",
- "u","v","w","x","y","z","A","B",
- "C","D","E","F","G","H","I","J",
- "K","L","M","N","O","P","Q","R",
- "S","T","U","V","W","X","Y","Z",
- "$","@",'+',"="];
- $char_point = intval($char_point);
- if($char_point < 0 || $char_point > 65){
- die('char:'.$char_point.' error');
- }
- return $char_array[$char_point];
- }
- /**
- * 添加盐
- * @param $md5_url
- * @param $salt
- * @return string
- */
- private function addSalt($md5_url,$salt){
- if(strlen($md5_url) != 32){
- die('addSalt:{$md5_url} error');
- }
- $len = strlen($salt);
- for($i=0;$i<$len;$i++){
- $position = hexdec($md5_url[$i]);
- $weight = ceil($position/8);
- $position = $position * $weight;
- $pre = substr($md5_url,0,$position);
- $next = substr($md5_url,$position);
- $md5_url = $pre.$salt[$i].$next;
- }
- return $md5_url;
- }
- /**
- * 加密字节
- * @param $current_str
- * @return mixed
- */
- private function ZChar($current_str){
- $Vchar = $this->dealStr($current_str);
- return $this->char($Vchar);
- }
- }
|