快速開發框架CRL3.0發布,附帶最新的項目示例CRLShoppingDemo


繼上次使用CRL實現大數據分庫分表方案升級到2.4,時隔不久又升級到了大版本號3.0,主要是因為結構發生了一些更改

ORM和業務封裝Package分開了,增加了實例項目演示代碼CRLShoppingDemo,整體項目結構如下

3.0更新內容如下:

2015-09-26
    升級改到3.0版,2.X版不再更新
2015-09-28
    Model索引值類型改為dynamic
    減少QueryList方法參數
2015-10-08
    重載了BaseProvider
    增加了in select查詢
2015-10-10
    增加Equals擴展方法解析
2015-10-15
     優化了PackageTrans方法,去掉暴露在外面的事務控制方法
     去掉了SetContext方法,使用TransactionScope實現整體事務
     賬戶系統去掉SQL寫法,改為對象
2015-10-20
    修改了創建表時數據初始,改為在Model實現GetInitData
    修改了緩存null判斷
    數據訪問對象dbHelper改名為DBExtend
2015-10-23
    更改字段別名返回和處理,不需專門傳映射關系
QueryFromAllCache方法名 改為QueryFromCache 增加CRL演示項目

 以上更新在3.0開發文檔中都有體現

 

主要功能更新講解

1.In select 創建一個等效的關聯in 查詢,也有相對的Not In

//等效為 product.UserId in(select UserId from order where product.SupplierId=10 and order.status=2)
            query.In<Code.Order>(b => b.UserId, b => b.UserId, (a, b) => a.SupplierId == "10" && b.Status == 2);

 

2.Equals 擴展方法,類型不同的字段和參數,能用此方法進行相等判斷了,省去了轉換方法

query.Where(b => b.UserId.Equals(Code.ProductChannel.其它));//按值等於,enum等於int

 

3.統一事務調用方法PackageTrans,不用再手動回滾了

public bool TransactionTest(out string error)
        {
            //簡化了事務寫法,自動提交回滾
            return PackageTrans((out string ex) =>
            {
                ex = "";
                var product = new ProductData();
                product.BarCode = "sdfsdf";
                product.Number = 10;
                ProductDataManage.Instance.Add(product);
                //return false; //會回滾
                product = new ProductData();
                //product.BarCode = "sdfsdf2";
                //product.Number = 12;
                ProductDataManage.Instance.Add(product);//不符合數據校驗規則,將會拋出異常,會回滾
                //return false;
                return true;
            }, out error);
        }

 

4.初始數據改在Model里重寫GetInitData方法了,當對象表創建時,數據也會創建

/// <summary>
    /// 產品
    /// </summary>
    public class Product : CRL.Package.Product.ProductBase
    {
        /// <summary>
        /// 初始默認數據
        /// </summary>
        /// <returns></returns>
        public override System.Collections.IList GetInitData()
        {
            var list = new List<Product>();
            for (int i = 1; i < 100; i++)
            {
                list.Add(new Product() { ProductName = "測試產品" + i, SettlementPrice = 80, SoldPrice = 100, SupplierId = 1, ProductStatus = CRL.Package.Product.ProductStatus.已上架 });
            }
            return list;
        }
}

 

演示項目CRLShoppingDemo

之前有人提到看不懂文檔,希望有簡單的例子,如你所願,按基本在線銷售系統寫了一個Demo,以下為運行效果

此演示項目正如上面所說,采用了精簡的寫法實現了這些業務

 

繼承業務封裝,實現會員管理

 public class MemberManage : CRL.Package.Person.PersonBusiness<MemberManage, Member>

商家和會員就都有了登錄和驗證方法,並實現Form認證

public ActionResult Login(Model.Member member)
        {
            string error;
            var a = MemberManage.Instance.CheckPass(member.AccountNo, member.PassWord, out error);
            if (!a)
            {
                ModelState.AddModelError("", error);
                return View();
            }
            var u = MemberManage.Instance.QueryItem(b => b.AccountNo == member.AccountNo);
            if (u.Locked)
            {
                ModelState.AddModelError("", "賬號已鎖定");
                return View();
            }
            MemberManage.Instance.Login(u, "Member", false);
            string returnUrl = Request["returnUrl"];
            if (string.IsNullOrEmpty(returnUrl))
            {
                returnUrl = "/";
            }
            return Redirect(returnUrl);
        }

 頁面上需要取當前用戶,通過Form認證返回統一的Person對象

var user = MemberManage.Instance.CurrentUser;//CRL.Package.Person.Person

 

類似FindOne,FindList,分頁方法不用去傻傻的寫很多次了(一般三層結構會把這類方法寫N次),已經自動轉換好了

var item = ProductManage.Instance.QueryItemFromCache(b => b.Id == id);//從緩存查詢
var item = ProductManage.Instance.QueryItem(b => b.Id == id);//從數據庫查找

//分頁

var query = ProductManage.Instance.GetLambdaQuery();
query.Where(b => b.SupplierId == CurrentUser.Id);
int count;
var result = ProductManage.Instance.Page(query, out count);

 
        

 

內置賬戶交易系統,解決多種類型支付管理問題

可以給N種角色設置N種貨幣類型,統一進行管理

比如以下是充值現金到會員

public bool Charge(Member member, decimal amount, string remark, TransactionType transactionType, out string error)
        {
            var account = Transaction.AccountManage.Instance.GetAccountId(member.Id, Model.AccountType.會員, transactionType);
            string orderId = DateTime.Now.ToString("yyMMddhhmmssff");
            int tradeType = 10001;
            var trans = new List<CRL.Package.Account.Transaction>();
            var ts = new CRL.Package.Account.Transaction() { AccountId = account, Amount = amount, OperateType = CRL.Package.Account.OperateType.收入, TradeType = tradeType, OutOrderId = orderId, Remark = remark };
            trans.Add(ts);

            bool b = Transaction.TransactionManage.Instance.SubmitTransaction(out error,true, trans.ToArray());//提交流水
            return b;
        }

確認訂單時扣款,同時贈送積分

var accountUser = Transaction.AccountManage.Instance.GetAccount(order.UserId, Model.AccountType.會員, Model.TransactionType.現金);
            var accountUser2 = Transaction.AccountManage.Instance.GetAccount(order.UserId, Model.AccountType.會員, Model.TransactionType.積分);
            if (accountUser.AvailableBalance < order.TotalAmount)
            {
                error = "賬戶余額不足";
                return false;
            }
            
            int tradeType = 1001;
            var amount = order.TotalAmount;
            var orderId = order.OrderId;
            var remark = "訂單支付";
            var trans = new List<CRL.Package.Account.Transaction>();
            //生成會員交易流水
            var ts = new CRL.Package.Account.Transaction() { AccountId = accountUser.Id, Amount = amount, OperateType = CRL.Package.Account.OperateType.支出, TradeType = tradeType, OutOrderId = orderId, Remark = remark };
            trans.Add(ts);
            //贈送積分
            var ts3 = new CRL.Package.Account.Transaction() { AccountId = accountUser2.Id, Amount = amount, OperateType = CRL.Package.Account.OperateType.收入, TradeType = tradeType, OutOrderId = orderId, Remark = "贈送積分" };
            trans.Add(ts3);
            bool b = Transaction.TransactionManage.Instance.SubmitTransaction(out error, trans.ToArray());//提交流水
            if(!b)
            {
                return false;
            }

更多詳細寫法請對照示例和開發文檔

 

示例源碼(不包含CRL源碼) http://pan.baidu.com/s/1mg1YDqK

 

沒什么人關注,為增加人氣,CRL3.0完整源碼請入群獲取,謝謝支持


免責聲明!

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



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