天天看點

極簡實用的Asp.NetCore架構再新增商城子產品概述新增業務功能關于添加和修改商品的部分後端代碼:前端添加商品部分代碼:

概述

關于這個架構的背景,在前面我已經交代過了。不清楚的可以檢視這個連結

1、極簡實用的Asp.NetCore子產品化架構決定免費開源了

2、極簡實用的Asp.NetCore子產品化架構新增CMS子產品

算下來确實好長時間沒更新部落格了,在這段時間内一直在出差,閑暇時間一直在想dotnetcore架構本身就是子產品化的,為什麼還要在這個上層應用上面繼續進行子產品化封裝,意義何在?是為了更好地劃分業務還是輪子重複利用?

細細想來,這個架構不應該再繼續子產品化下去,主要有以下幾點理由支援:

1、本身于我現有地業務而言,沒必要子產品化,我隻是做個大而全地系統(權限管理,内容管理,商城,微信管理等)。

2、如果要做子產品化,本身就要犧牲掉一些性能,這是我反反複複斟酌以後不能接受的,主要是犧牲性能有點多!

3、dotnetcore本身就更友好子產品化,沒必要在這個上層應用上面再包裹一層,沒有任何意義,我下載下傳了dotnetcore源碼後,覺得它的設計理念特别棒,于是“dotnetcore”本身就是最好的子產品化(元件化)架構,可以把很多時間和精力投身于源碼上面研究,沒有必要在糾結于子產品化這個概念,在上層應用折騰來折騰去,對于技術的成長微乎其微。

4、以前劃分為子產品化,是想朝微服務的方向發展,到時盡量改動小一點。現在想想我就一個背景管理,沒必要想那麼多。

基于以上幾點,我于是把架構進行了更改,對于原來的子產品化架構也進行了分支保留(一定意義上來說也不全是子產品化)。

新增業務功能

新增加一個商城子產品,主要包含商品管理(支援多個sku),商品分類,小程式使用者,使用者收獲位址、訂單各種狀态的清單。

極簡實用的Asp.NetCore架構再新增商城子產品概述新增業務功能關于添加和修改商品的部分後端代碼:前端添加商品部分代碼:
極簡實用的Asp.NetCore架構再新增商城子產品概述新增業務功能關于添加和修改商品的部分後端代碼:前端添加商品部分代碼:
極簡實用的Asp.NetCore架構再新增商城子產品概述新增業務功能關于添加和修改商品的部分後端代碼:前端添加商品部分代碼:

關于添加和修改商品的部分後端代碼:

{
            try
            {
                Db.BeginTran();
                // 儲存商品
                var goods = _mapper.Map<Goods>(input);
                var goodsId = await Db.Insertable<Goods>(goods).ExecuteReturnIdentityAsync();
                // 儲存規格
                await DealwithGoodsSpec(goodsId, input);
                Db.CommitTran();
            }
            catch (Exception e)
            {
                Db.RollbackTran();
                return new ApiResult(e.Message);
            }
            return new ApiResult();
        }
        /// <summary>
        /// 公共的商品規格資訊處理
        /// </summary>
        /// <param name="goodsId"></param>
        /// <param name="input"></param>
        /// <returns></returns>
        private async Task DealwithGoodsSpec(int goodsId, GoodsInput input)
        {
            // 儲存規格
            if (input.SpecType == SpecTypeEnum.Single.GetValue<int>())
            {
                var specSingle = JsonConvert.DeserializeObject<GoodsSpecInput>(input.SpecSingle);
                input.GoodsSpecInput = specSingle;
                var goodsSpec = input.BuildGoodsSpec(goodsId);
                if (null == goodsSpec)
                {
                    throw new FriendlyException("商品規格實體資料不能為空!");
                }
                await Db.Insertable(goodsSpec).ExecuteReturnIdentityAsync();
            }
            else
            {
                var goodsSpecs = input.BuildGoodsSpecs(goodsId);
                if (null == goodsSpecs || goodsSpecs.Count == 0)
                {
                    throw new FriendlyException("商品規格實體資料集合不能為空!");
                }
                await Db.Insertable(goodsSpecs).ExecuteReturnIdentityAsync();
                var goodsSpecRels = input.BuildGoodsSpecRels(goodsId);
                if (goodsSpecRels.Count == 0 || goodsSpecRels == null)
                {
                    throw new FriendlyException("商品規格實體關系集合資料不能為空!");
                }
                //根據規格值反推規格組id
                var specValues = await Db.Queryable<SpecValue>().Where(d => d.Status).ToListAsync();
                foreach (var item in goodsSpecRels)
                {
                    var specId = specValues.Where(d => d.Status && d.Id == item.SpecValueId).Select(d => d.SpecId);
                    item.SpecId = specId.FirstOrDefault();
                }
                await Db.Insertable(goodsSpecRels).ExecuteReturnIdentityAsync();
            }
        }
        public async Task<ApiResult> ModifyAsync(GoodsModifyInput input)
        {
            var goods = await GetModelAsync(d => d.Id == input.Id);
            if (goods == null) throw new FriendlyException($"此商品{input.Id}沒有查找對應的商品資訊");
            try
            {
                Db.BeginTran();
                // 更新商品
                var model = _mapper.Map<Goods>(input);
                var goodsId = await Db.Updateable(model).IgnoreColumns(d => new { d.CreateTime }).ExecuteCommandAsync();
                // 更新規格 
                await Db.Deleteable<GoodsSpec>().Where(d => d.GoodsId == input.Id).ExecuteCommandAsync();
                await Db.Deleteable<GoodsSpecRel>().Where(d => d.GoodsId == input.Id).ExecuteCommandAsync();
                // 儲存規格
                await DealwithGoodsSpec(input.Id, input);
                Db.CommitTran();
            }
            catch (Exception e)
            {
                Db.RollbackTran();
                return new ApiResult(e.Message);
            }
            return new ApiResult();
        }           

前端添加商品部分代碼:

tinymce.init({
            selector: '#content',
            auto_focus: true,
            height: 500,
            content_style: "img {max-width:100%;}",
            image_advtab: true,//開啟圖檔上傳的進階選項功能
            images_upload_url: '/api/goods/UploadImg',//圖檔上傳
            plugins: 'print preview code searchreplace autolink directionality visualblocks visualchars fullscreen image link media codesample table charmap hr pagebreak nonbreaking anchor toc insertdatetime advlist lists textcolor wordcount imagetools contextmenu colorpicker textpattern help ',
            toolbar: 'formatselect styleselect | bold italic forecolor backcolor | link  | alignleft aligncenter alignright alignjustify  | numlist bullist outdent indent  | removeformat'
        });
        layui.use(['form', 'common'], function () {
            var form = layui.form,
                $ = layui.$,
                apiUtil = layui.common;
            // 目前彈出層,防止ID被覆寫
            var parentIndex = parent.layer.getFrameIndex(window.name);

            apiUtil.BindParentCategory();
            form.render();

            // 注冊商品多規格元件
            var specMany = new GoodsSpec({
                container: '.goods-spec-many'
            });

            //處理單/多規格的顯示問題
            form.on('radio(specType)', function (data) {
                //但規格
                if (data.value == 10) {
                    $("#sigleSpec").show() && $(".goods-spec-many").hide();
                }
                //多規格
                if (data.value == 20) {
                    $("#sigleSpec").hide() && $(".goods-spec-many").show();
                }
                //console.log(data.elem); //得到radio原始DOM對象
            });
          
            //監聽送出
            form.on('submit(saveBtn)', function (data) {
                data.field.content = tinyMCE.editors[0].getContent();
                var specType = $('input[name=specType]:checked').val();
                if (specType == 20) {
                    var specMany2 = JSON.stringify(specMany.getData());
                    console.log("specMany:" + specMany2);
                    var isEmpty = specMany.isEmptySkuList();
                    if (isEmpty == true) {
                        layer.msg('商品規格不能為空');
                        return false;
                    }
                    data.field.specMany = specMany2;
                } else {
                    var specSingle =  {
                        goods_no: data.field.goodsNo,
                        line_price: data.field.linePrice,
                        goods_price: data.field.goodsPrice,
                        goods_weight: data.field.goodsWeight,
                        stock_num: data.field.stockNum,
                    };
                    data.field.specSingle=JSON.stringify(specSingle);
                }                
                data.field.specType = specType;
                data.field.goodsStatus = $('input[name=goodsStatus]:checked').val();
                data.field.deductStockType = $('input[name=deductStockType]:checked').val();
                data.field.imgUrl = $(".div_img input").map(function () { return $(this).attr("value"); }).get().join(',');
                if (data.field.imgUrl == "" || data.field.imgUrl == null) {
                   apiUtil.error("商品圖檔至少需要上傳一張!");
                    return false;
                }
                apiUtil.ajax('goods/add', data.field, "application/json", "post", function (res) {
                    apiUtil.success(res.msg);
                    parent.layer.close(parentIndex);
                });
                return false;
            });           
        });

    </script>
}           

這裡隻貼部分代碼吧,更多的細節可以直接去看源碼。另外關于商城的設計其實寫個系列也不過分,下次抽時間具體寫篇文章介紹下商品的多規格怎麼設計好一點。

源碼位址:

https://gitee.com/shenniu_code_group/shen-nius.-modularity

繼續閱讀