生成短鏈(網址) ShortUrlLink


建表

CREATE TABLE [dbo].[ShortUrl](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [LongUrl] [nvarchar](500) NOT NULL,
    [BaseUri] [int] NOT NULL,
    [ShortToken] [nvarchar](50) NOT NULL,
    [Hits] [int] NOT NULL,
    [Creator] [nvarchar](50) NULL,
    [CreateTime] [datetime] NOT NULL,
    [LastUpdateTime] [datetime] NULL,
    [LastOperator] [nvarchar](50) NULL,
    [Enable] [bit] NOT NULL,
    [IsDelete] [bit] NOT NULL
) ON [PRIMARY]

GO

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'長鏈地址' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'ShortUrl', @level2type=N'COLUMN',@level2name=N'LongUrl'
GO

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'短鏈域名對應數值' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'ShortUrl', @level2type=N'COLUMN',@level2name=N'BaseUri'
GO

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'短鏈末尾編碼串' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'ShortUrl', @level2type=N'COLUMN',@level2name=N'ShortToken'
GO

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'url點擊量' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'ShortUrl', @level2type=N'COLUMN',@level2name=N'Hits'
GO

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'創建人' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'ShortUrl', @level2type=N'COLUMN',@level2name=N'Creator'
GO

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'創建時間' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'ShortUrl', @level2type=N'COLUMN',@level2name=N'CreateTime'
GO

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'最近更新時間' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'ShortUrl', @level2type=N'COLUMN',@level2name=N'LastUpdateTime'
GO

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'更新操作人' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'ShortUrl', @level2type=N'COLUMN',@level2name=N'LastOperator'
GO

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'是否啟用' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'ShortUrl', @level2type=N'COLUMN',@level2name=N'Enable'
GO

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'是否刪除' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'ShortUrl', @level2type=N'COLUMN',@level2name=N'IsDelete'
GO

ALTER TABLE [dbo].[ShortUrl] ADD  CONSTRAINT [DF_ShortUrl_IsDelete]  DEFAULT ((0)) FOR [IsDelete]
GO
CREATE TABLE [dbo].[ShortUrlStat](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [UrlId] [int] NOT NULL,
    [ShortUrl] [nvarchar](500) NOT NULL,
    [UrlRefferer] [nvarchar](500) NOT NULL,
    [UserAgent] [nvarchar](500) NOT NULL,
    [UserHostAddress] [nvarchar](500) NOT NULL,
    [UserLanguage] [nvarchar](100) NOT NULL,
    [Browser] [nvarchar](200) NOT NULL,
    [MajorVersion] [int] NOT NULL,
    [IsMobile] [bit] NOT NULL,
    [CreateTime] [datetime] NOT NULL
) ON [PRIMARY]

GO

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'狀態記錄所對應的長鏈的id' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'ShortUrlStat', @level2type=N'COLUMN',@level2name=N'UrlId'
GO

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'短鏈地址' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'ShortUrlStat', @level2type=N'COLUMN',@level2name=N'ShortUrl'
GO

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'獲取Url鏈接當前客戶端的主機部分' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'ShortUrlStat', @level2type=N'COLUMN',@level2name=N'UrlRefferer'
GO

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'獲取客戶端完整的用戶代理字符串' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'ShortUrlStat', @level2type=N'COLUMN',@level2name=N'UserAgent'
GO

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'獲取客戶端ip的主機地址' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'ShortUrlStat', @level2type=N'COLUMN',@level2name=N'UserHostAddress'
GO

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'獲取客戶端語言首選項' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'ShortUrlStat', @level2type=N'COLUMN',@level2name=N'UserLanguage'
GO

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'獲取瀏覽器請求標頭中發送的瀏覽器字符串' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'ShortUrlStat', @level2type=N'COLUMN',@level2name=N'Browser'
GO

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'獲取瀏覽器主版本號' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'ShortUrlStat', @level2type=N'COLUMN',@level2name=N'MajorVersion'
GO

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'獲取瀏覽器是否已標識為移動設備' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'ShortUrlStat', @level2type=N'COLUMN',@level2name=N'IsMobile'
GO

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'創建時間' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'ShortUrlStat', @level2type=N'COLUMN',@level2name=N'CreateTime'
GO
@model IEnumerable<ShortUrl.ShortUrlModels>
@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>
<a href="@Url.Action("AddDetail", "ShortUrl")">新增</a>
@if (Model != null && Model.Any())
{
    <table>
        <thead>
            <tr>
                <th style="text-align: center">
                    序號
                </th>
                <th style="text-align: center">短鏈</th>
            </tr>
        </thead>
        <tbody>
            @foreach (var item in Model)
            {
                <tr>
                    <td>@item.Id</td>
                    <td><a href="@Url.Action("ReirectToken", "ShortUrl", new { id =item.Id})" target="_blank">@item.BaseShortUrl</a></td>
                </tr>
            }
        </tbody>
    </table>
}
@using ShortUrl
@model ShortUrl.ShortUrlModels
@{
    ViewBag.Title = "AddShortUrl";
}
<script src="@Url.Content("~/Scripts/jquery-1.8.2.min.js")"></script>
<h2>AddShortUrl</h2>



<table style="width: 99%; margin: 5px auto;">
    <tbody>
    <tr>
        <td>長鏈</td>
        <td>
            <input type="text" value="@Model.LongUrl" id="longurl"/>
        </td>
    </tr>
    <tr>
        <td>短網址后綴</td>
        <td>
            @Html.DropDownListFor(m => m.BaseUri, new KvSelectList(Model.ShortUrl))
        </td>
    </tr>
    <tr>
        <td>
            <input type="button" value="保存" class="sBtn" id="btnSave" style="margin-left: 45%"/>
        </td>
    </tr>
    </tbody>
</table>

<script type="text/javascript">
    function necessaryinput() {
        //if ($("#longurl").val() == '' || $("#longurl").val() == undefined || $("#longurl").val().match(/(http[s]?|ftp):\/\/([\w-]+\.)+[\w-]+(\/[\w- .\/?%&=]*)?/) == null) {
        //    alert("請輸入合法的長鏈地址");
        //    return false;
        //}
        if ($("#longurl").val() == '' || $("#longurl").val() == undefined) {
            alert("請輸入長鏈地址");
            return false;
        }
        return true;
    }
    var model = {};
    $("#btnSave").click(function () {
        model.LongUrl = $.trim($("#longurl").val());
        model.BaseUri = $.trim($("#BaseUri").val());

        if (confirm("你確定保存嗎?")) {
            if (necessaryinput()) {
                $.ajax({
                    url: '@Url.Action("Add", "ShortUrl")',
                    type: 'post',
                    dataType: 'json',
                    contentType: 'application/json',
                    data: JSON.stringify(model),
                    success: function (result) {
                        if (result.DoFlag) {
                            alert(result.DoResult);
                            window.location.href = '@Url.Action("Index", "ShortUrl")';
                        } else {
                            alert(result.DoResult);
                        }
                    }
                });
            }
        }


    })
</script>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Web;
using System.Web.Mvc;
using ShortUrl.Models;
using ShortUrlDbEntity;
using ShortUrlUtility;

namespace ShortUrl.Controllers
{
    public class ShortUrlController : Controller
    {
        //
        // GET: /ShortUrl/
        MVCDemoEntities db = new MVCDemoEntities();  
        public ActionResult Index()
        {
            List<ShortUrlModels> shortUrlList = new List<ShortUrlModels>();
            shortUrlList.AddRange(db.ShortUrl.OrderByDescending(x => x.Hits).ThenByDescending(x => x.LastUpdateTime).Select(t => new ShortUrlModels()
            {
                Id=t.Id,
                LongUrl = t.LongUrl,
                BaseUri = t.BaseUri,
                ShortToken = t.ShortToken,
                Hits = t.Hits,
                CreateTime = t.CreateTime,

            }));
            return View(shortUrlList);
        }

        //短鏈跳轉
        public ActionResult ReirectToken(int id)
        {
            if (id == 0)
                return RedirectToAction("UrlNotFound", "ShortUrl");
            else
            {
                var shortUrlRecord = db.ShortUrl.FirstOrDefault(t => t.Id == id);
                if (shortUrlRecord == null)
                    return RedirectToAction("UrlNotFound", "ShortUrl");
                else
                {
                    ShortUrlModels shortUrlModel = new ShortUrlModels();
                    shortUrlModel = Mapper.GetMapper.Map<ShortUrlDbEntity.ShortUrl, ShortUrlModels>(shortUrlRecord);

                    ShortUrlStatModels stats = new ShortUrlStatModels(Request);
                    stats.UrlId = id;
                    stats.ShortUrl = shortUrlModel.BaseShortUrl;
                    stats.CreateTime = DateTime.Now;
                    var dbstats = Mapper.GetMapper.Map<ShortUrlStatModels, ShortUrlStat>(stats);
                    db.ShortUrlStat.Add(dbstats);
                    db.SaveChanges();
                    shortUrlRecord.Hits++;
                    shortUrlRecord.LastUpdateTime = DateTime.Now;
                    db.SaveChanges();
                    
                    return Redirect(shortUrlModel.LongUrl);
                }
            }
        }

        public ActionResult UrlNotFound()
        {
            return View();
        }


        public ActionResult AddDetail(ShortUrlModels model)
        {
            ShortUrlModels shortmodels=new ShortUrlModels();
            return View("AddDetail", shortmodels);
        }

        //添加url model.LongUrl = HttpUtility.UrlDecode(model.LongUrl) ?? "";
 public JsonResult Add(ShortUrlModels model) { try {
            
if (string.IsNullOrEmpty(model.LongUrl)) return Json(new { DoResult = "請輸入Url地址" }, JsonRequestBehavior.AllowGet); else { if (CheckLongUrlExists(model.LongUrl)) { if (!HasHttPProtocol(model.LongUrl)) model.LongUrl = "http://" + model.LongUrl; var existingUrl = db.ShortUrl.FirstOrDefault(u => Equals(u.LongUrl.ToLower(), model.LongUrl.ToLower())); if (existingUrl == null) { ShortUrlModels shortUrl = new ShortUrlModels() { LongUrl = model.LongUrl, BaseUri = model.BaseUri, Hits = 0, CreateTime = DateTime.Now, LastUpdateTime = DateTime.Now, Enable = true, //ShortToken = GenerateRandomShortUrl() //ShortToken = GenerateRandomString(6) ShortToken = Guid.NewGuid().ToString().Substring(0, 6) }; var shortUrlDb = Mapper.GetMapper.Map<ShortUrlModels, ShortUrlDbEntity.ShortUrl>(shortUrl); db.ShortUrl.Add(shortUrlDb); db.SaveChanges(); var result = new {DoResult = "新增成功", DoFlag = true}; return Json(result, JsonRequestBehavior.AllowGet); } else { var result = new {DoResult = "新增失敗,Url已被添加過", DoFlag = false}; return Json(result, JsonRequestBehavior.AllowGet); } } else { var result = new { DoResult = "Url地址不存在或已失效,請填寫正確的地址", DoFlag = false }; return Json(result, JsonRequestBehavior.AllowGet); } } } catch (Exception ex) { return Json(new { DoResult = "新增異常", DoFlag = false }, JsonRequestBehavior.AllowGet); } } //校驗url開頭帶不帶http private bool HasHttPProtocol(string url) { url = url.ToLower(); if (url.Length > 5) { if (url.StartsWith(Constants.Protocol.HTTP) || url.StartsWith(Constants.Protocol.HTTPS)) return true; else return false; } else return false; } //生成隨機的6位串 public string GenerateRandomShortUrl() { string number = ""; int j; Random random = new Random(); for (int i = 0; i < 6; i++) { j = random.Next(0, 35); if (j < 10) j += 48; else j += 87; number = number + char.ConvertFromUtf32(j); } return number; } //生成隨機的串(方法二) public static string GenerateRandomString(short len = 11) { string rand = string.Empty; while (rand.Length < len) { rand += GetCleanRandString(); } return rand.Substring(0, len); } private static string GetCleanRandString() { char[] AmbiguousChars = { 'l', '1', '.' }; return string.Join(string.Empty, System.IO.Path.GetRandomFileName().ToLower().Split(AmbiguousChars)); } //removed 'I', 'l', '1', 'O' and '0' const string chars = "23456789abcdefghjkmnopqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ"; private readonly int theBase = chars.Length; public string Encode(int value) { var hash = ""; if (value > 0) { var remainder = value % theBase; hash += chars[remainder]; value = value / theBase; } hash += chars[value]; return hash; } public int Decode(string hash) { var result = 0; for (var i = hash.Length - 1; i >= 0; i--) { result += (chars.IndexOf(hash[i]) * (int)(Math.Pow(theBase, i))); } return result; } //檢測url有沒有過期 public bool CheckLongUrlExists(string url) { if (!HasHttPProtocol(url)) url = Constants.Protocol.HTTP + url; try { //Creating the HttpWebRequest HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest; //Setting the Request method HEAD, you can also use GET too. request.Method = "HEAD"; //Getting the Web Response. HttpWebResponse response = request.GetResponse() as HttpWebResponse; //Returns TRUE if the Status code == 200 return (response.StatusCode == HttpStatusCode.OK); } catch { return false; } } } }

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace ShortUrl
{


    public class ShortUrlModels
    {
        public int Id { get; set; }
        public string LongUrl { get; set; }
        public int BaseUri { get; set; }
        public string ShortToken { get; set; }
        public int Hits { get; set; }
        public string Creator { get; set; }
        public DateTime CreateTime { get; set; }
        public DateTime LastUpdateTime { get; set; }
        public string LastOperator { get; set; }
        public bool Enable { get; set; }
        public bool IsDelete { get; set; }

        private Dictionary<int, string> _shortUrl;
        public Dictionary<int, string> ShortUrl {
            get
            {
                _shortUrl= new Dictionary<int, string>()
                {
                    {1,"t.cn"},
                    {2,"dwz.cn"},
                    {3,"qq.cn.hn"},
                    {4,"jd.cn.hn"},
                    {5,"tb.cn.hn"},
                    {6,"sina.lt"},
                    {7,"tinyurl.com"},
                    {8,"qr.net"},
                    {9,"goo.gl"},
                    {10,"is.gd"},
                    {11,"j.mp"},
                    {12,"bit.ly"}
                };
                return _shortUrl;
            }
            set { _shortUrl = value; }
        }

        public string BaseShortUrl
        {
            get { return "http://" + ShortUrl[BaseUri]+"/"+ShortToken; }
        }

    }


}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;


namespace ShortUrl.Models
{
    public class ShortUrlStatModels
    {
        public int Id { get; set; }
        //短鏈的Id
        public int UrlId { get; set; }
        //短鏈地址
        public string ShortUrl { get; set; }
        //獲取Url鏈接當前客戶端的主機部分
        public string UrlRefferer { get; set; }
        //獲取客戶端完整的用戶代理字符串
        public string UserAgent { get; set; }
        //獲取客戶端ip的主機地址
        public string UserHostAddress { get; set; }
        //獲取客戶端語言首選項
        public string UserLanguage { get; set; }
        //獲取瀏覽器請求標頭中發送的瀏覽器字符串
        public string Browser { get; set; }
        //獲取瀏覽器主版本號
        public int MajorVersion { get; set; }
        //獲取瀏覽器是否已標識為移動設備
        public bool IsMobile { get; set; }
        //創建時間
        public DateTime CreateTime { get; set; }

        public ShortUrlStatModels(HttpRequestBase request)
        {
            if (string.IsNullOrEmpty(request.UrlReferrer.Host))
                UrlRefferer = Constants.UNKNOWN;
            else
                UrlRefferer = request.UrlReferrer.Host;

            if (string.IsNullOrEmpty(request.UserAgent))
                UserAgent = Constants.UNKNOWN;
            else
                UserAgent = request.UserAgent;

            if (string.IsNullOrEmpty(request.UserHostAddress))
                UserHostAddress = Constants.UNKNOWN;
            else
                UserHostAddress = request.UserHostAddress;

            if (string.IsNullOrEmpty(request.UserLanguages[0]))
                UserLanguage = Constants.UNKNOWN;
            else
                UserLanguage = request.UserLanguages[0];
            
            if (string.IsNullOrEmpty(request.Browser.Browser))
                Browser = Constants.UNKNOWN;
            else
                Browser = request.Browser.Browser;
            
            MajorVersion = request.Browser.MajorVersion;
            IsMobile = request.Browser.IsMobileDevice;
        }
    }

}

 

生成隨機串其它參考:

/// <summary>
    /// 短網址應用 ,例如QQ微博的url.cn   http://url.cn/2hytQx
    /// </summary>
    /// <param name="url"></param>
    /// <returns></returns>
    public static string[] ShortUrl(string url)
    {
        //可以自定義生成MD5加密字符傳前的混合KEY
        string key = "fooo_2016";
        //要使用生成URL的字符
        string[] chars = new string[]{
        "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",
        "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"
        };

        //對傳入網址進行MD5加密
        string hex = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(key + url, "md5");
        string[] resUrl = new string[4];
        for (int i = 0; i < 4; i++)
        {
            //把加密字符按照8位一組16進制與0x3FFFFFFF進行位與運算
            int hexint = 0x3FFFFFFF & Convert.ToInt32("0x" + hex.Substring(i * 8, 8), 16);
            string outChars = string.Empty;
            for (int j = 0; j < 6; j++)
            {
                //把得到的值與0x0000003D進行位與運算,取得字符數組chars索引
                int index = 0x0000003D & hexint;
                //把取得的字符相加
                outChars += chars[index];
                //每次循環按位右移5位
                hexint = hexint >> 5;
            }
            //把字符串存入對應索引的輸出數組
            resUrl[i] = outChars;
        }
        return resUrl;
    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        string[] Shor = ShortUrl(this.TextBox1.Text);


        // Response.Write( );  //得到值fAVfui
        //ShortUrl(http://www.jb51.net)[1];  //得到值3ayQry
        //ShortUrl(http://www.jb51.net)[2];  //得到值UZzyUr
        //ShortUrl(http://www.jb51.net)[3];  //得到值36rQZn

        for (int i = 0; i < Shor.Length; i++)
        {
            Response.Write("<br/>" + i + ">>" + Shor[i]);
        }
    }

 

//  url + (url.EndsWith("?") ? "" : "?"

//string host = txtWebUrl.Text.Trim().TrimEnd('/').ToLower();
            url = (host.StartsWith("http") || host.StartsWith("https"))? host:"http://" + host;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM