主頁 > .NET開發 > 極簡實用的Asp.NetCore框架再新增商城模塊

極簡實用的Asp.NetCore框架再新增商城模塊

2021-10-29 06:01:41 .NET開發

概述

關于這個框架的背景,在前面我已經交代過了,不清楚的可以查看這個鏈接 

1、極簡實用的Asp.NetCore模塊化框架決定免費開源了

2、極簡實用的Asp.NetCore模塊化框架新增CMS模塊

算下來確實好長時間沒更新博客了,在這段時間內一直在出差,閑暇時間一直在想dotnetcore框架本身就是模塊化的,為什么還要在這個上層應用上面繼續進行模塊化封裝,意義何在?是為了更好地劃分業務還是輪子重復利用?

細細想來,這個框架不應該再繼續模塊化下去,主要有以下幾點理由支持:

1、本身于我現有地業務而言,沒必要模塊化,我只是做個大而全地系統(權限管理,內容管理,商城,微信管理等),

2、如果要做模塊化,本身就要犧牲掉一些性能,這是我反反復復斟酌以后不能接受的,主要是犧牲性能有點多!

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

4、以前劃分為模塊化,是想朝微服務的方向發展,到時盡量改動小一點,現在想想我就一個后臺管理,沒必要想那么多,

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

新增業務功能

新增加一個商城模塊,主要包含商品管理(支持多個sku),商品分類,小程式用戶,用戶識訓地址、訂單各種狀態的串列,

 

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

 public async Task<ApiResult> AddAsync(GoodsInput input)
        {
            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();
        }

前端添加商品部分代碼:

@{
    ViewData["Title"] = "Modify";
    Layout = "~/Views/Shared/_Layout.cshtml";
}
@section css{
    <link href="https://www.cnblogs.com/mhg215/p/~/css/site.min.css" rel="stylesheet" asp-append-version="true" />
    <link href="https://www.cnblogs.com/mhg215/p/~/css/goods.css" rel="stylesheet" asp-append-version="true" />
}
<div id="container">
    <form  action="" id="app" lay-filter="column-edit">
        <div >
            <div >
                <div >基本屬性</div>
                <div >
                    <label>所屬分類</label>
                    <div >
                        <select name="categoryId" id="categoryId" lay-search="">
                            <option value="https://www.cnblogs.com/mhg215/p/0">父級</option>
                        </select>
                    </div>
                </div>
                <div >
                    <label>初始銷量</label>
                    <div >
                        <input type="text" name="salesInitial" maxlength="100" autocomplete="off" >
                    </div>
                </div>
                <div >
                    <label>商品狀態</label>
                    <div >
                        <input type="radio" name="goodsStatus" lay-skin="primary" value="https://www.cnblogs.com/mhg215/p/10" title="上架" />
                        <input type="radio" name="goodsStatus" lay-skin="primary" value="https://www.cnblogs.com/mhg215/p/20" title="下架" />
                    </div>
                </div>
                <div >
                    <label>運費模板</label>
                    @*目前現呼叫字典表的模板*@
                    <div >
                        <select name="deliveryId" id="deliveryId" lay-verify="required" lay-search="" maxlength="100">
                            @if (ViewBag.Freights != null)
                            {
                                foreach (var item in (List<Config>)ViewBag.Freights)
                                {
                                    <option value="https://www.cnblogs.com/mhg215/p/@item.Id">@item.Name</option>
                                }
                            }
                        </select>
                    </div>
                </div>
            </div>
            <div >
                <div >
                    <label  required>商品名稱</label>
                    <div >
                        <input type="text" name="name" maxlength="100" lay-verify="required" lay-verType="tips" autocomplete="off" >
                    </div>
                </div>
                <div >
                    <label >商品圖片</label>                    
                    <div >
                        <button type="button"  id="btnUploadShowImg">上傳圖片</button>
                        <blockquote  style="margin-top: 10px;margin-left:110px;">
                            預覽圖:
                            <div  id="demo2"></div>
                        </blockquote>
                    </div>
                </div>

                <hr />

                <div >
                    <label  required>商品規格</label>
                    <div >
                        <input type="radio" name="specType" lay-skin="primary" value="https://www.cnblogs.com/mhg215/p/10" lay-filter="specType" title="單規格"  checked/>
                        <input type="radio" name="specType" lay-skin="primary" value="https://www.cnblogs.com/mhg215/p/20" lay-filter="specType" title="多規格"  />
                    </div>
                </div>
                <div >
                    <div >
                        <!-- 規格屬性 -->
                        <div ></div>

                        <!-- 添加規格:按鈕 -->
                        <div >
                            <button type="button" >添加規格</button>
                        </div>

                        <!-- 添加規格:表單 -->
                        <div >
                            <div >
                                <label >規格名 </label>
                                <input type="text"  placeholder="請輸入規格名稱">
                            </div>
                            <div >
                                <label >規格值 </label>
                                <input type="text"  placeholder="請輸入規格值">
                            </div>
                            <div >
                                <button type="button" color: rgba(0, 0, 0, 1)">btn-addSpecName am-btn am-btn-xs
                                            am-btn-secondary">
                                    確定
                                </button>
                                <button type="button" color: rgba(0, 0, 0, 1)">btn-cancleAddSpecName am-btn am-btn-xs
                                              am-btn-default">
                                    取消
                                </button>
                            </div>
                        </div>
                        <!-- 商品多規格sku資訊 -->
                        <div >
                            <!-- 分割線 -->
                            <div ></div>
                            <!-- sku 批量設定 -->
                            <div >
                                <div >
                                    <label >批量設定</label>
                                </div>
                                <div >
                                    <input type="text" data-type="goods_no" placeholder="商家編碼">
                                </div>
                                <div >
                                    <input type="number" data-type="goods_price" placeholder="銷售價">
                                </div>
                                <div >
                                    <input type="number" data-type="line_price" placeholder="劃線價">
                                </div>
                                <div >
                                    <input type="number" data-type="stock_num" placeholder="庫存數量">
                                </div>
                                <div >
                                    <input type="number" data-type="goods_weight" placeholder="重量">
                                </div>
                                <div >
                                    <button type="button" color: rgba(0, 0, 0, 1)">btn-specBatchBtn am-btn am-btn-sm am-btn-secondary
                                                 am-radius">
                                        確定
                                    </button>
                                </div>
                            </div>
                            <!-- sku table -->
                            <table ></table>
                        </div>
                    </div>
                </div>

                <div id="sigleSpec">
                    <div >
                        <label  required>商品價格</label>
                        <div >
                            <input type="text" name="goodsPrice" maxlength="30" autocomplete="off" >
                        </div>
                    </div>
                    <div >
                        <label  required>商品劃線價</label>
                        <div >
                            <input type="text" name="linePrice" maxlength="40" autocomplete="off" >
                        </div>
                    </div>
                    <div >
                        <label >商品編碼</label>
                        <div >
                            <input type="text" name="goodsNo" maxlength="40" autocomplete="off" >
                        </div>
                    </div>
                    <div >
                        <label  required>庫存數量</label>
                        <div >
                            <input type="number" name="stockNum" maxlength="40" >
                        </div>
                    </div>
                    <div >
                        <label  required>商品重量(Kg)</label>
                        <div >
                            <input type="number" name="goodsWeight" maxlength="40"  >
                        </div>
                    </div>
                </div>
                <div >
                    <label  required>庫存計算</label>
                    <div >
                        <input type="radio" name="deductStockType" value="https://www.cnblogs.com/mhg215/p/10" lay-skin="primary" title="下單減庫存" />
                        <input type="radio" name="deductStockType" value="https://www.cnblogs.com/mhg215/p/20" lay-skin="primary" title="付款減庫存" />
                    </div>
                </div>
            </div>
            <div >
                <div >
                    <label >商品詳情</label>
                    <div >
                        <textarea id="content" name="content" placeholder="請輸入內容" ></textarea>
                    </div>
                </div>
            </div>

            <div >
                <div >
                    <button  lay-submit lay-filter="saveBtn">確認保存</button>
                </div>
            </div>
        </div>

    </form>
</div>

@section js{
    <script src="https://www.cnblogs.com/lib/tinymce/tinymce.min.js"></script>
    <script src="https://www.cnblogs.com/lib/tinymce/langs/zh_CN.js"></script>
    <script src="https://www.cnblogs.com/mhg215/p/~/lib/jquery-3.4.1/jquery-3.4.1.min.js"></script>
    <script src="https://www.cnblogs.com/mhg215/p/~/js/goodsSpec.js" asp-append-version="true"></script>
    <script src="https://www.cnblogs.com/mhg215/p/~/js/art-template.js" asp-append-version="true"></script>
    <script src="https://www.cnblogs.com/mhg215/p/~/js/imgUpload.js" asp-append-version="true"></script>
    <!-- 商品多規格模板 -->
    @await Html.PartialAsync("~/Views/Shared/Templates/tpl_spec_many.cshtml")
    <script>
        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 =https://www.cnblogs.com/mhg215/p/= 10) {
                    $("#sigleSpec").show() && $(".goods-spec-many").hide();
                }
                //多規格
                if (data.value =https://www.cnblogs.com/mhg215/p/= 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

喜歡交流的人進微信群

 

 

作者:realyrare

出處:https://www.cnblogs.com/mhg215/

聲援博主:如果您覺得文章對您有幫助,請點擊文章末尾的【關注我】吧!

別忘記點擊文章右下角的【推薦】支持一波,~~~///(^v^)\\\~~~ .

如果您有其他問題,也歡迎關注我的公眾號,可以聯系我一起交流切磋!

本文著作權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利,

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/340289.html

標籤:.NET Core

上一篇:IOC和DI之刨根問底之第一節

下一篇:極簡實用的Asp.NetCore框架再新增商城模塊

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • WebAPI簡介

    Web體系結構: 有三個核心:資源(resource),URL(統一資源識別符號)和表示 他們的關系是這樣的:一個資源由一個URL進行標識,HTTP客戶端使用URL定位資源,表示是從資源回傳資料,媒體型別是資源回傳的資料格式。 接下來我們說下HTTP. HTTP協議的系統是一種無狀態的方式,使用請求/ ......

    uj5u.com 2020-09-09 22:07:47 more
  • asp.net core 3.1 入口:Program.cs中的Main函式

    本文分析Program.cs 中Main()函式中代碼的運行順序分析asp.net core程式的啟動,重點不是剖析原始碼,而是理清程式開始時執行的順序。到呼叫了哪些實體,哪些法方。asp.net core 3.1 的程式入口在專案Program.cs檔案里,如下。ususing System; us ......

    uj5u.com 2020-09-09 22:07:49 more
  • asp.net網站作為websocket服務端的應用該如何寫

    最近被websocket的一個問題困擾了很久,有一個需求是在web網站中搭建websocket服務。客戶端通過網頁與服務器建立連接,然后服務器根據ip給客戶端網頁發送資訊。 其實,這個需求并不難,只是剛開始對websocket的內容不太了解。上網搜索了一下,有通過asp.net core 實作的、有 ......

    uj5u.com 2020-09-09 22:08:02 more
  • ASP.NET 開源匯入匯出庫Magicodes.IE Docker中使用

    Magicodes.IE在Docker中使用 更新歷史 2019.02.13 【Nuget】版本更新到2.0.2 【匯入】修復單列匯入的Bug,單元測驗“OneColumnImporter_Test”。問題見(https://github.com/dotnetcore/Magicodes.IE/is ......

    uj5u.com 2020-09-09 22:08:05 more
  • 在webform中使用ajax

    如果你用過Asp.net webform, 說明你也算是.NET 開發的老兵了。WEBform應該是2011 2013左右,當時還用visual studio 2005、 visual studio 2008。后來基本都用的是MVC。 如果是新開發的專案,估計沒人會用webform技術。但是有些舊版 ......

    uj5u.com 2020-09-09 22:08:50 more
  • iis添加asp.net網站,訪問提示:由于擴展配置問題而無法提供您請求的

    今天在iis服務器配置asp.net網站,遇到一個問題,記錄一下: 問題:由于擴展配置問題而無法提供您請求的頁面。如果該頁面是腳本,請添加處理程式。如果應下載檔案,請添加 MIME 映射。 WindowServer2012服務器,添加角色安裝完.netframework和iis之后,運行aspx頁面 ......

    uj5u.com 2020-09-09 22:10:00 more
  • WebAPI-處理架構

    帶著問題去思考,大家好! 問題1:HTTP請求和回傳相應的HTTP回應資訊之間發生了什么? 1:首先是最底層,托管層,位于WebAPI和底層HTTP堆疊之間 2:其次是 訊息處理程式管道層,這里比如日志和快取。OWIN的參考是將訊息處理程式管道的一些功能下移到堆疊下端的OWIN中間件了。 3:控制器處理 ......

    uj5u.com 2020-09-09 22:11:13 more
  • 微信門戶開發框架-使用指導說明書

    微信門戶應用管理系統,采用基于 MVC + Bootstrap + Ajax + Enterprise Library的技術路線,界面層采用Boostrap + Metronic組合的前端框架,資料訪問層支持Oracle、SQLServer、MySQL、PostgreSQL等資料庫。框架以MVC5,... ......

    uj5u.com 2020-09-09 22:15:18 more
  • WebAPI-HTTP編程模型

    帶著問題去思考,大家好!它是什么?它包含什么?它能干什么? 訊息 HTTP編程模型的核心就是訊息抽象,表示為:HttPRequestMessage,HttpResponseMessage.用于客戶端和服務端之間交換請求和回應訊息。 HttpMethod類包含了一組靜態屬性: private stat ......

    uj5u.com 2020-09-09 22:15:23 more
  • 部署WebApi隨筆

    一、跨域 NuGet參考Microsoft.AspNet.WebApi.Cors WebApiConfig.cs中配置: // Web API 配置和服務 config.EnableCors(new EnableCorsAttribute("*", "*", "*")); 二、清除默認回傳XML格式 ......

    uj5u.com 2020-09-09 22:15:48 more
最新发布
  • C#多執行緒學習(二) 如何操縱一個執行緒

    <a href="https://www.cnblogs.com/x-zhi/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2943582/20220801082530.png" alt="" /></...

    uj5u.com 2023-04-19 09:17:20 more
  • C#多執行緒學習(二) 如何操縱一個執行緒

    C#多執行緒學習(二) 如何操縱一個執行緒 執行緒學習第一篇:C#多執行緒學習(一) 多執行緒的相關概念 下面我們就動手來創建一個執行緒,使用Thread類創建執行緒時,只需提供執行緒入口即可。(執行緒入口使程式知道該讓這個執行緒干什么事) 在C#中,執行緒入口是通過ThreadStart代理(delegate)來提供的 ......

    uj5u.com 2023-04-19 09:16:49 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    <a href="https://www.cnblogs.com/huangxincheng/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/214741/20200614104537.png" alt="" /&g...

    uj5u.com 2023-04-18 08:39:04 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    一:背景 1. 講故事 前段時間協助訓練營里的一位朋友分析了一個程式卡死的問題,回過頭來看這個案例比較經典,這篇稍微整理一下供后來者少踩坑吧。 二:WinDbg 分析 1. 為什么會卡死 因為是表單程式,理所當然就是看主執行緒此時正在做什么? 可以用 ~0s ; k 看一下便知。 0:000> k # ......

    uj5u.com 2023-04-18 08:33:10 more
  • SignalR, No Connection with that ID,IIS

    <a href="https://www.cnblogs.com/smartstar/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/u36196.jpg" alt="" /></a>...

    uj5u.com 2023-03-30 17:21:52 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:15:33 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:13:31 more
  • C#遍歷指定檔案夾中所有檔案的3種方法

    <a href="https://www.cnblogs.com/xbhp/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/957602/20230310105611.png" alt="" /></a&...

    uj5u.com 2023-03-27 14:46:55 more
  • C#/VB.NET:如何將PDF轉為PDF/A

    <a href="https://www.cnblogs.com/Carina-baby/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2859233/20220427162558.png" alt="" />...

    uj5u.com 2023-03-27 14:46:35 more
  • 武裝你的WEBAPI-OData聚合查詢

    <a href="https://www.cnblogs.com/podolski/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/616093/20140323000327.png" alt="" /><...

    uj5u.com 2023-03-27 14:46:16 more