国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

C# MVC模式下商品抽獎功能實現

2019-10-29 21:29:09
字體:
來源:轉載
供稿:網友
這篇文章主要為大家分享了C#在MVC模式下實現商品抽獎功能,思路清晰,具有一定的參考價值,感興趣的小伙伴們可以參考一下
 

最近項目需求的一個抽獎功能給整理了下,語言表達能力不好,寫的不好請勿吐槽,一笑而過就好。好了下面開始說說這個抽獎功能。因為涉及到公司的項目所以一些敏感的地方均已中文代替。

首先在后臺添加獎品的名稱以及概率如圖:

C#,MVC,商品抽獎

后臺代碼沒什么好說的,我們來看看前端代碼。

通過html做出如下樣式:

 <div class="turntable-bg">                 <div class="pointer">            <img id="pointer" src="~/Content/images/pointer.png"          </div>          <div class="rotate">            <img id="turntable" src="~/Content/images/turntable.png"          </div>        </div>

C#,MVC,商品抽獎

這里要注意切圖時候的角度。不然旋轉后所對應的角度就不對了。

下面給抽獎的指針添加點擊事件:

 

function rotate() {    $.ajax({      type: 'POST',      url: '/控制器/方法',      dataType: 'json',      cache: false,      error: function () {        alert('出錯了!');        return false;      },      success: function (data) {        if (data == 1 || data == -3) {          var bRotate = true;          if (data == 1) {            alert("請登錄!");          }if (data == -3) {            alert("對不起,您的獎券不足!")          }        }        else {          var angles = parseInt(data.angle); //角度            var txt = data.prize; //獎項            var awards = parseInt(data.id);          var bRotate = false; //如果bRotate為 true 的時候無法點擊          var rotateFn = rotateFn_method(awards, angles, txt);          if (bRotate) return;          switch (awards) {            case 0:              //var angle = [26, 88, 137, 185, 235, 287, 337];                // rptateFn_method 三個參數均為后臺傳出,0,337  為轉盤旋轉所對應的角度,最后一個則為商品名稱              rotateFn_method(0, 337, '獎品名稱');              break;            case 1:              //var angle = [88, 137, 185, 235, 287];              rotateFn_method(1, 26, '獎品名稱');                break;              case 2:                //var angle = [137, 185, 235, 287];                rotateFn_method(2, 88, '獎品名稱');              break;            case 3:              //var angle = [137, 185, 235, 287];              rotateFn_method(3, 137, '獎品名稱');              break;            case 4:              //var angle = [185, 235, 287];              rotateFn_method(4, 185, '獎品名稱');              break;            case 5:              //var angle = [185, 235, 287];              rotateFn_method(5, 235, '獎品名稱');              break;            case 6:              //var angle = [235, 287];              rotateFn_method(6, 235, '獎品名稱');              break;            case 7:              //var angle = [287];              rotateFn_method(7, 282, '獎品名稱');              break;          }        }      }    });  }  //旋轉事件  function rotateFn_method(awards, angles, txt) {    var bRotate = false;    bRotate = !bRotate;    $('#turntable').stopRotate();    $('#turntable').rotate({      angle: 0,      animateTo: angles + 1800,      duration: 8000,      callback: function () {          $("#Pl h4").html("恭喜你抽中" + txt + "");        }        bRotate = !bRotate;      }    })  };//刷新當前頁面  function locateEnd() {    window.location.reload();  }

  這樣頁面的轉盤就可以旋轉以及彈出獎品了,js中注釋應該比較明確,我就不多對js進行解釋了,下面來說說控制器里計算概率的邏輯,之所以不把概率計算寫在js中,是因為js文件容易被篡改,想必大家都知道。話不多說,下面上代碼:  

 

//判斷用戶是否登錄       if (admin != null)      {         //獲取后臺設置的數據,見圖1        var LdList = hr.LuckdrawList();         //因為涉及到公司的項目所有一些敏感地方均已中文代替        List<double> dt = LdList.Select(i => i.概率).ToList();         //創建一個數值        double[] Array = dt.ToArray();        //角度        int angle = 0;        //獎品        var prize = "";        var id = 0;         //將概率放入數值,調用下面的Get方法計算出所返回的概率位于數值中的第幾位        var Pl = Get(Array);         //獲取獎品表中位于Pl的產品        var model = LdList[Pl];           // id , angle 角度  prize 獎品if (model.獎品等級 == 1)          {            angle = 26;            prize = model.獎品;            id = 1;          }          if (model.獎品等級 == 7)          {            angle = 88;            prize = model.獎品;            id = 2;          }          if (model.獎品等級 == 4)          {            angle = 137;            prize = model.獎品;            id = 3;          }          if (model.獎品等級 == 3)          {            angle = 185;            prize = model.獎品;            id = 4;          }          if (model.獎品等級 == 6)          {            angle = 235;            prize = model.獎品;            id = 5;          }          if (model.獎品等級 == 2)          {            angle = 282;            prize = model.獎品;            id = 7;          }          if (model.獎品等級 == 5)          {            angle = 337;            prize = model.獎品;            id = 0;          }          return Json(new { angle = angle, prize = prize, id = id });        }return Json(data);      }

計算概率的部分:

/// <summary>    /// 獲取抽獎結果    /// </summary>    /// <param name="prob">各物品的抽中概率</param>    /// <returns>返回抽中的物品所在數組的位置</returns>    private static int Get(double[] prob)    {      int result = 0;      int n = (int)(prob.Sum() * 1000);      //計算概率總和,放大1000倍      Random r = rnd;      float x = (float)r.Next(0, n) / 1000;    //隨機生成0~概率總和的數字      for (int i = 0; i < prob.Count(); i++)      {        double pre = prob.Take(i).Sum();     //區間下界        double next = prob.Take(i + 1).Sum();  //區間上界        if (x >= pre && x < next)        //如果在該區間范圍內,就返回結果退出循環        {          result = i;          break;        }      }      return result;    }    private static Random rnd = new Random();

 基本上就這些,有不足的地方請各位幫忙補充一下,謝謝大家的閱讀。



注:相關教程知識閱讀請移步到c#教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 安义县| 沙坪坝区| 常山县| 栾城县| 新巴尔虎左旗| 虎林市| 衡阳市| 黄平县| 寻乌县| 原阳县| 临泉县| 徐水县| 东港市| 苍溪县| 砀山县| 旌德县| 黑龙江省| 长白| 永兴县| 新竹县| 万全县| 河北区| 宕昌县| 东丽区| 洛川县| 桑日县| 武定县| 蓝田县| 宁海县| 武威市| 田林县| 房产| 三门县| 防城港市| 博客| 静宁县| 上饶县| 黄山市| 榕江县| 平利县| 丰台区|