標籤: iphone維修

  • 買SUV就圖個高大帥氣!20萬要買SUV你怎麼也得考慮這幾款

    買SUV就圖個高大帥氣!20萬要買SUV你怎麼也得考慮這幾款

    廣汽菲克Jeep-自由光 指導價:20。98-31。58萬如果要數國產化之後表現會比進口版還要優秀的車子,叫獸相信廣汽菲克Jeep自由光算是一輛。國產的自由光在動力匹配和車廂隔音這兩個方面都比進口版的自由光要優秀,實際上在國產中型SUV市場上,自由光也算是一位表現出色的傢伙。

    前段時間,二胎政策的放鬆,不少家用車消費者一下子都把目光投向了七座車上面,然而實際上坐滿七個座位的情況真的不多,而且很多時候七座SUV的第三排都是雞肋,成年人坐進去就會很憋屈。所以何苦為難自己和乘客?一輛大五座的汽車其實更加適合我們的日常使用,這甚至已經逐漸變成一種潮流。今天就和看看有哪些大五座的SUV值得我們關注吧。

    上汽通用別克-昂科威 指導價:20.99-34.99萬元

    昂科威是比較早期的“大五座”SUV,其實以昂科威的車身尺寸,要做七座車型並不是不可以,但它偏偏以座位布置上的差異與同價位的競爭對手漢蘭達錯位競爭,為自己創造出更大的生存空間,而後來火爆的銷量也說明了昂科威的路線是正確的。

    外觀上,昂科威的造型飽滿修長又不乏時尚感,大氣得來又不會太老土,這樣的風格符合大部分消費者的審美。飽滿的前臉毫無疑問的採用了別克家族的網瀑式格柵,頗顯霸氣,大燈為氙氣光源並帶透鏡和LED燈帶,大燈造型和車身的匹配也毫無違和感。至於側面和車尾就以簡潔為主了,但是前後的線條在布局上互相溝通,整體感很強。

    別克在車廂內飾豪華感的營造上可謂是業界的老手了,用料方面,上方的搪塑材料、中間的木紋飾板以及包圍的真皮面料,絲毫沒有怠慢;而設計上也不低調,懷抱式的布局加寬大的扶手,非對稱式的中控台,按鍵的布局也很合理,既有層次感又實用。多媒體方面,搭載了安吉星系統,支持手機互聯和導航等,功能豐富。

    空間方面,調整好座椅以後,身高178cm的體驗者在駕駛位能取得一拳的頭部空間,在後排則有三指的頭部和一拳四指的腿部空間。值得一提的是昂科威的後排地板是全平的,而且後排座椅靠背也可以調節,只是可惜在頭部空間方面稍顯局促。

    動力方面,昂科威搭載1.5T+七速雙離合或者2.0T+6AT的動力系統,最大馬力分別是169ps和260ps,1.5T車型的話動力還是稍失從容,畢竟馬力和車重都擺在那,需要拉高轉速來維持較理想的動力輸出,雙離合的低速頓挫則依舊存在,且對急加速的響應不夠迅速。相對來說,2.0T版本無論是動力強度還是變速箱的表現都要從容穩定更多,動力輸出流暢有後勁,所以更推薦2.0T的昂科威。

    廣汽本田-冠道 指導價:26.98-32.98萬元

    冠道這款車還未上市的時候就已經賺足眼球了,畢竟它是本田在國內的第一款中型SUV,但同時,冠道身上又集合了很多新技術,如2.0T的地球夢發動機,以及ZF的9AT變速箱,都是第一次出現在國內的本田車上,所以該車自然就吸引了不少的眼球了。

    冠道的外觀硬朗且有肌肉感,雖然車身的高度略矮,但給人的感覺還是很壯碩的。中網寬大的鍍鉻飾條和車身造型很匹配,共同營造出冠道的“大塊頭”形象。細節處也頗具心思,如LED大燈、LED日行燈等的加入,側面的三條曲線更凸顯了車身的肌肉感,至於車尾的設計就稍顯普通,但是LED尾燈和雙排氣的設計還是不輸氣勢的。

    內飾方面,冠道採用了懸浮式的中控屏和按鍵式排擋設計,科技感十足,同時用料方面也不會十分寒酸,中控台上方採用搪塑+縫線的設計,中間也加入了仿木紋啞光飾板,檔次感更強。而配置方面,座椅加熱和通風、手機互聯、HUD、車道偏離預警等功能都一應俱全,頗有豪華車的風範。

    至於空間就是冠道的一大優勢了,前排調整好坐姿之後,身高182cm的體驗者在駕駛座仍有一拳一指的頭部空間,至於他去到後排之後,則有兩拳有餘的腿部和四指的頭部空間,空間表現十分寬裕,只是後排座椅靠背角度不支持調節,這有點可惜。

    動力方面前面也提過,2.0T的發動機搭配采埃孚的9AT變速箱,最大馬力272ps,動力輸出比較線性,雖然不是很有爆發力的輸出,但信心還是很充足的,所以動力方面無需擔心。冠道底盤的舒適性也很值得肯定,濾震效果很徹底,但是時速60以上過彎的話,車輛的循跡性就會明顯下降,另外冠道對於高速行駛時遇到的顛簸還是處理得不夠從容,除此以外,冠道可以說本田有史以來隔音做得最好的車子了。

    廣汽菲克Jeep-自由光 指導價:20.98-31.58萬

    如果要數國產化之後表現會比進口版還要優秀的車子,叫獸相信廣汽菲克Jeep自由光算是一輛。國產的自由光在動力匹配和車廂隔音這兩個方面都比進口版的自由光要優秀,實際上在國產中型SUV市場上,自由光也算是一位表現出色的傢伙。

    外觀尺寸方面,自由光比昂科威、冠道等同級對手要稍微小一點。但這也絲毫掩飾不了它的硬漢外形,全車身的黑色下包圍和七孔的豎狀中網,都凸顯了自由光作為一輛Jeep汽車該有的運動氣息,頗具特色的是七孔的中網還使用了曲折式的設計,比傳統的Jeep中網更有個性。

    內飾方面,自由光並不像其他的Jeep車型那樣走硬朗的越野風,更多的是體現出一輛城市該有的細膩和豪華。中控台採用了軟質材料,而且上方有雙縫線工藝,提升了檔次感,真皮方向盤很粗壯,握感飽滿。多媒體方面,8.4英寸的Uconnect屏幕包含了導航、倒車影像等功能,功能上不會落後。

    座椅的填充厚實,而且前排兩張座椅都有電動調節,算是順應了國內消費者的需求。空間方面,調整好坐姿之後,身高174cm的體驗者在前排有四指的頭部空間,在後排則有兩拳的腿部和兩指的頭部空間,可惜後排的地板凸起比較高,不利於中間位置的乘坐,所以自由光的後排空間表現只能算是中規中矩。

    國產自由光的動力系統有兩種,分別是2.0L和2.4L的發動機,搭配9AT的變速箱,最大馬力分別是155ps和175ps,採用了全自然吸氣的班底,算是現時少有的了。兩個排量的自由光都不是以動力為賣點,而且變速箱的降擋反應並不积極,僅能滿足日常的駕駛,所以2.0L的自由光並不適合激烈的駕駛。底盤則偏向於城市SUV的調校,偏向舒適且濾震效果不錯。

    上汽大眾斯柯達-柯迪亞克預計上市時間:2017年夏季

    斯柯達和大眾之間有着一些微妙的關係,一般這兩個品牌同一時期的同級別同平台車輛的話,先上市的一般是斯柯達的車,速派和邁騰就是這種關係。而在中型SUV領域,柯迪亞克和新途觀之間也是類似的這種微妙關係。至於个中原因,就是大眾決策層的經營策略了,我們也不好猜測。

    還是先把注意力放回柯迪亞克身上吧,從“Kodiaq”的名字我們就會知道這輛車的體型不會小,而且外觀風格也會比較硬朗,實際也是如此。前臉雖然依舊是斯柯達家族式的中網,但線條會更加硬朗,而中網兩邊的大燈也是斯柯達首次使用的LED大燈,科技感十足。側面造型修長且硬朗,尾部造型則和速派旅行版相仿,家族氣息更濃,辨識度也不低。

    來到內飾,熟悉MQB平台車輛(高爾夫7、速派)的人都不會感到陌生了,平直的線條、對稱式的布局,嚴謹的設計風格。但柯迪亞克的內飾還是比其他大眾系的車輛要顯得開揚一點,簡單說就是更大氣了。配置方面,常規B級車的駕駛輔助和舒適性方面的配置都沒有或缺,另外要說的是該車的儲物空間挺豐富的,而且加入了全景天窗,比較對消費者的胃口。

    部分車型(估計是高配)座椅面料為Alcantara加真皮,看着顯檔次,坐着也舒適,比較喜歡這種座椅。空間方面,前排調整好之後,身高185cm的體驗者還能有一拳的頭部空間,而他去到後排則有一拳有餘的腿部和四指的頭部空間,這個表現對於普通身材的成年人來說已經足夠寬敞,不用擔心空間問題。

    目前已知柯迪亞克會推出兩種動力系統,分別是1.8T和2.0T的排量,搭配7速DSG變速箱,最大馬力為180ps和220ps,動力表現和速派這類大眾車類似,起步時油門會稍顯慵懶,但隨着油門深度的加大,動力的充沛感會愈加明顯。底盤則維持了德系車紮實質感的基礎上會稍偏硬,但舒適性並不差,只是這種車體型大,方向盤也很輕,駕駛感不太明顯。

    總結:越來越多的廠商重視“大五座”SUV這個細分市場,事實上大部分消費者在預算足夠的情況下都更願意買大點的車,至於七座與否,似乎並不是最重要的點。相對緊湊型車,這個級別有更多的空間來提升車輛的產品力,所以這也是建立品牌口碑的一個很好的途徑,相信中型SUV市場的競爭會越來越激烈,更多的好車也會不斷湧出。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

    ※台北網頁設計公司全省服務真心推薦

    ※想知道最厲害的網頁設計公司"嚨底家"!

    ※推薦評價好的iphone維修中心

    網頁設計最專業,超強功能平台可客製化

    ※別再煩惱如何寫文案,掌握八大原則!

  • 基於 abp vNext 和 .NET Core 開發博客項目 – 博客接口實戰篇(五)

    基於 abp vNext 和 .NET Core 開發博客項目 – 博客接口實戰篇(五)

    系列文章

    1. 基於 abp vNext 和 .NET Core 開發博客項目 – 使用 abp cli 搭建項目
    2. 基於 abp vNext 和 .NET Core 開發博客項目 – 給項目瘦身,讓它跑起來
    3. 基於 abp vNext 和 .NET Core 開發博客項目 – 完善與美化,Swagger登場
    4. 基於 abp vNext 和 .NET Core 開發博客項目 – 數據訪問和代碼優先
    5. 基於 abp vNext 和 .NET Core 開發博客項目 – 自定義倉儲之增刪改查
    6. 基於 abp vNext 和 .NET Core 開發博客項目 – 統一規範API,包裝返回模型
    7. 基於 abp vNext 和 .NET Core 開發博客項目 – 再說Swagger,分組、描述、小綠鎖
    8. 基於 abp vNext 和 .NET Core 開發博客項目 – 接入GitHub,用JWT保護你的API
    9. 基於 abp vNext 和 .NET Core 開發博客項目 – 異常處理和日誌記錄
    10. 基於 abp vNext 和 .NET Core 開發博客項目 – 使用Redis緩存數據
    11. 基於 abp vNext 和 .NET Core 開發博客項目 – 集成Hangfire實現定時任務處理
    12. 基於 abp vNext 和 .NET Core 開發博客項目 – 用AutoMapper搞定對象映射
    13. 基於 abp vNext 和 .NET Core 開發博客項目 – 定時任務最佳實戰(一)
    14. 基於 abp vNext 和 .NET Core 開發博客項目 – 定時任務最佳實戰(二)
    15. 基於 abp vNext 和 .NET Core 開發博客項目 – 定時任務最佳實戰(三)
    16. 基於 abp vNext 和 .NET Core 開發博客項目 – 博客接口實戰篇(一)
    17. 基於 abp vNext 和 .NET Core 開發博客項目 – 博客接口實戰篇(二)
    18. 基於 abp vNext 和 .NET Core 開發博客項目 – 博客接口實戰篇(三)
    19. 基於 abp vNext 和 .NET Core 開發博客項目 – 博客接口實戰篇(四)

    上篇文章完成了文章詳情頁數據查詢和清除緩存的功能。

    本篇繼續完成分類、標籤、友情鏈接的後台操作接口,還是那句話,這些純CRUD的內容,建議還是自己動手完成比較好,本篇將不再啰嗦,直接貼代碼,以供參考。

    分類

    添加接口:查詢分類列表QueryCategoriesForAdminAsync()、新增分類InsertCategoryAsync(...)、更新分類UpdateCategoryAsync(...)、刪除分類DeleteCategoryAsync(...)

    #region Categories
    
    /// <summary>
    /// 查詢分類列表
    /// </summary>
    /// <returns></returns>
    Task<ServiceResult<IEnumerable<QueryCategoryForAdminDto>>> QueryCategoriesForAdminAsync();
    
    /// <summary>
    /// 新增分類
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    Task<ServiceResult> InsertCategoryAsync(EditCategoryInput input);
    
    /// <summary>
    /// 更新分類
    /// </summary>
    /// <param name="id"></param>
    /// <param name="input"></param>
    /// <returns></returns>
    Task<ServiceResult> UpdateCategoryAsync(int id, EditCategoryInput input);
    
    /// <summary>
    /// 刪除分類
    /// </summary>
    /// <param name="id"></param>
    /// <returns></returns>
    Task<ServiceResult> DeleteCategoryAsync(int id);
    
    #endregion Categories
    

    查詢分類列表需要返回的模型類QueryCategoryForAdminDto.cs

    //QueryCategoryForAdminDto.cs
    namespace Meowv.Blog.Application.Contracts.Blog
    {
        public class QueryCategoryForAdminDto : QueryCategoryDto
        {
            /// <summary>
            /// 主鍵
            /// </summary>
            public int Id { get; set; }
        }
    }
    

    新增分類和更新分類需要的輸入參數EditCategoryInput.cs,直接繼承CategoryDto即可。

    //EditCategoryInput.cs
    namespace Meowv.Blog.Application.Contracts.Blog.Params
    {
        public class EditCategoryInput : CategoryDto
        {
        }
    }
    

    分別實現這幾個接口。

    /// <summary>
    /// 查詢分類列表
    /// </summary>
    /// <returns></returns>
    public async Task<ServiceResult<IEnumerable<QueryCategoryForAdminDto>>> QueryCategoriesForAdminAsync()
    {
        var result = new ServiceResult<IEnumerable<QueryCategoryForAdminDto>>();
    
        var posts = await _postRepository.GetListAsync();
    
        var categories = _categoryRepository.GetListAsync().Result.Select(x => new QueryCategoryForAdminDto
        {
            Id = x.Id,
            CategoryName = x.CategoryName,
            DisplayName = x.DisplayName,
            Count = posts.Count(p => p.CategoryId == x.Id)
        });
    
        result.IsSuccess(categories);
        return result;
    }
    
    /// <summary>
    /// 新增分類
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    public async Task<ServiceResult> InsertCategoryAsync(EditCategoryInput input)
    {
        var result = new ServiceResult();
    
        var category = ObjectMapper.Map<EditCategoryInput, Category>(input);
        await _categoryRepository.InsertAsync(category);
    
        result.IsSuccess(ResponseText.INSERT_SUCCESS);
        return result;
    }
    

    這裏需要一條AutoMapper配置,將EditCategoryInput轉換為Category,忽略Id字段。

    CreateMap<EditCategoryInput, Category>().ForMember(x => x.Id, opt => opt.Ignore());
    
    /// <summary>
    /// 更新分類
    /// </summary>
    /// <param name="id"></param>
    /// <param name="input"></param>
    /// <returns></returns>
    public async Task<ServiceResult> UpdateCategoryAsync(int id, EditCategoryInput input)
    {
        var result = new ServiceResult();
    
        var category = await _categoryRepository.GetAsync(id);
        category.CategoryName = input.CategoryName;
        category.DisplayName = input.DisplayName;
    
        await _categoryRepository.UpdateAsync(category);
    
        result.IsSuccess(ResponseText.UPDATE_SUCCESS);
        return result;
    }
    
    /// <summary>
    /// 刪除分類
    /// </summary>
    /// <param name="id"></param>
    /// <returns></returns>
    public async Task<ServiceResult> DeleteCategoryAsync(int id)
    {
        var result = new ServiceResult();
    
        var category = await _categoryRepository.FindAsync(id);
        if (null == category)
        {
            result.IsFailed(ResponseText.WHAT_NOT_EXIST.FormatWith("Id", id));
            return result;
        }
    
        await _categoryRepository.DeleteAsync(id);
    
        result.IsSuccess(ResponseText.DELETE_SUCCESS);
        return result;
    }
    

    BlogController.Admin.cs中添加接口。

    #region Categories
    
    /// <summary>
    /// 查詢分類列表
    /// </summary>
    /// <returns></returns>
    [HttpGet]
    [Authorize]
    [Route("admin/categories")]
    [ApiExplorerSettings(GroupName = Grouping.GroupName_v2)]
    public async Task<ServiceResult<IEnumerable<QueryCategoryForAdminDto>>> QueryCategoriesForAdminAsync()
    {
        return await _blogService.QueryCategoriesForAdminAsync();
    }
    
    /// <summary>
    /// 新增分類
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    [HttpPost]
    [Authorize]
    [Route("category")]
    [ApiExplorerSettings(GroupName = Grouping.GroupName_v2)]
    public async Task<ServiceResult> InsertCategoryAsync([FromBody] EditCategoryInput input)
    {
        return await _blogService.InsertCategoryAsync(input);
    }
    
    /// <summary>
    /// 更新分類
    /// </summary>
    /// <param name="id"></param>
    /// <param name="input"></param>
    /// <returns></returns>
    [HttpPut]
    [Authorize]
    [Route("category")]
    [ApiExplorerSettings(GroupName = Grouping.GroupName_v2)]
    public async Task<ServiceResult> UpdateCategoryAsync([Required] int id, [FromBody] EditCategoryInput input)
    {
        return await _blogService.UpdateCategoryAsync(id, input);
    }
    
    /// <summary>
    /// 刪除分類
    /// </summary>
    /// <param name="id"></param>
    /// <returns></returns>
    [HttpDelete]
    [Authorize]
    [Route("category")]
    [ApiExplorerSettings(GroupName = Grouping.GroupName_v2)]
    public async Task<ServiceResult> DeleteCategoryAsync([Required] int id)
    {
        return await _blogService.DeleteCategoryAsync(id);
    }
    
    #endregion Categories
    

    標籤

    添加接口:查詢標籤列表QueryTagsForAdminAsync()、新增標籤InsertTagAsync(...)、更新標籤UpdateTagAsync(...)、刪除標籤DeleteTagAsync(...)

    #region Tags
    
    /// <summary>
    /// 查詢標籤列表
    /// </summary>
    /// <returns></returns>
    Task<ServiceResult<IEnumerable<QueryTagForAdminDto>>> QueryTagsForAdminAsync();
    
    /// <summary>
    /// 新增標籤
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    Task<ServiceResult> InsertTagAsync(EditTagInput input);
    
    /// <summary>
    /// 更新標籤
    /// </summary>
    /// <param name="id"></param>
    /// <param name="input"></param>
    /// <returns></returns>
    Task<ServiceResult> UpdateTagAsync(int id, EditTagInput input);
    
    /// <summary>
    /// 刪除標籤
    /// </summary>
    /// <param name="id"></param>
    /// <returns></returns>
    Task<ServiceResult> DeleteTagAsync(int id);
    
    #endregion Tags
    

    查詢標籤列表需要返回的模型類QueryTagForAdminDto.cs

    //QueryTagForAdminDto.cs
    namespace Meowv.Blog.Application.Contracts.Blog
    {
        public class QueryTagForAdminDto : QueryTagDto
        {
            /// <summary>
            /// 主鍵
            /// </summary>
            public int Id { get; set; }
        }
    }
    

    新增標籤和更新標籤需要的輸入參數EditTagInput.cs,直接繼承TagDto即可。

    //EditTagInput.cs
    namespace Meowv.Blog.Application.Contracts.Blog.Params
    {
        public class EditTagInput : TagDto
        {
        }
    }
    

    分別實現這幾個接口。

    /// <summary>
    /// 查詢標籤列表
    /// </summary>
    /// <returns></returns>
    public async Task<ServiceResult<IEnumerable<QueryTagForAdminDto>>> QueryTagsForAdminAsync()
    {
        var result = new ServiceResult<IEnumerable<QueryTagForAdminDto>>();
    
        var post_tags = await _postTagRepository.GetListAsync();
    
        var tags = _tagRepository.GetListAsync().Result.Select(x => new QueryTagForAdminDto
        {
            Id = x.Id,
            TagName = x.TagName,
            DisplayName = x.DisplayName,
            Count = post_tags.Count(p => p.TagId == x.Id)
        });
    
        result.IsSuccess(tags);
        return result;
    }
    
    /// <summary>
    /// 新增標籤
    /// </summary>
    /// <param name="dto"></param>
    /// <returns></returns>
    public async Task<ServiceResult> InsertTagAsync(EditTagInput input)
    {
        var result = new ServiceResult();
    
        var tag = ObjectMapper.Map<EditTagInput, Tag>(input);
        await _tagRepository.InsertAsync(tag);
    
        result.IsSuccess(ResponseText.INSERT_SUCCESS);
        return result;
    }
    

    這裏需要一條AutoMapper配置,將EditCategoryInput轉換為Tag,忽略Id字段。

    CreateMap<EditTagInput, Tag>().ForMember(x => x.Id, opt => opt.Ignore());
    
    /// <summary>
    /// 更新標籤
    /// </summary>
    /// <param name="id"></param>
    /// <param name="dto"></param>
    /// <returns></returns>
    public async Task<ServiceResult> UpdateTagAsync(int id, EditTagInput input)
    {
        var result = new ServiceResult();
    
        var tag = await _tagRepository.GetAsync(id);
        tag.TagName = input.TagName;
        tag.DisplayName = input.DisplayName;
    
        await _tagRepository.UpdateAsync(tag);
    
        result.IsSuccess(ResponseText.UPDATE_SUCCESS);
        return result;
    }
    
    /// <summary>
    /// 刪除標籤
    /// </summary>
    /// <param name="id"></param>
    /// <returns></returns>
    public async Task<ServiceResult> DeleteTagAsync(int id)
    {
        var result = new ServiceResult();
    
        var tag = await _tagRepository.FindAsync(id);
        if (null == tag)
        {
            result.IsFailed(ResponseText.WHAT_NOT_EXIST.FormatWith("Id", id));
            return result;
        }
    
        await _tagRepository.DeleteAsync(id);
        await _postTagRepository.DeleteAsync(x => x.TagId == id);
    
        result.IsSuccess(ResponseText.DELETE_SUCCESS);
        return result;
    }
    

    BlogController.Admin.cs中添加接口。

    #region Tags
    
    /// <summary>
    /// 查詢標籤列表
    /// </summary>
    /// <returns></returns>
    [HttpGet]
    [Authorize]
    [Route("admin/tags")]
    [ApiExplorerSettings(GroupName = Grouping.GroupName_v2)]
    public async Task<ServiceResult<IEnumerable<QueryTagForAdminDto>>> QueryTagsForAdminAsync()
    {
        return await _blogService.QueryTagsForAdminAsync();
    }
    
    /// <summary>
    /// 新增標籤
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    [HttpPost]
    [Authorize]
    [Route("tag")]
    [ApiExplorerSettings(GroupName = Grouping.GroupName_v2)]
    public async Task<ServiceResult> InsertTagAsync([FromBody] EditTagInput input)
    {
        return await _blogService.InsertTagAsync(input);
    }
    
    /// <summary>
    /// 更新標籤
    /// </summary>
    /// <param name="id"></param>
    /// <param name="input"></param>
    /// <returns></returns>
    [HttpPut]
    [Authorize]
    [Route("tag")]
    [ApiExplorerSettings(GroupName = Grouping.GroupName_v2)]
    public async Task<ServiceResult> UpdateTagAsync([Required] int id, [FromBody] EditTagInput input)
    {
        return await _blogService.UpdateTagAsync(id, input);
    }
    
    /// <summary>
    /// 刪除標籤
    /// </summary>
    /// <param name="id"></param>
    /// <returns></returns>
    [HttpDelete]
    [Authorize]
    [Route("tag")]
    [ApiExplorerSettings(GroupName = Grouping.GroupName_v2)]
    public async Task<ServiceResult> DeleteTagAsync([Required] int id)
    {
        return await _blogService.DeleteTagAsync(id);
    }
    
    #endregion Tags
    

    友鏈

    添加接口:查詢友鏈列表QueryFriendLinksForAdminAsync()、新增友鏈InsertFriendLinkAsync(...)、更新友鏈UpdateFriendLinkAsync(...)、刪除友鏈DeleteFriendLinkAsync(...)

    #region FriendLinks
    
    /// <summary>
    /// 查詢友鏈列表
    /// </summary>
    /// <returns></returns>
    Task<ServiceResult<IEnumerable<QueryFriendLinkForAdminDto>>> QueryFriendLinksForAdminAsync();
    
    /// <summary>
    /// 新增友鏈
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    Task<ServiceResult> InsertFriendLinkAsync(EditFriendLinkInput input);
    
    /// <summary>
    /// 更新友鏈
    /// </summary>
    /// <param name="id"></param>
    /// <param name="input"></param>
    /// <returns></returns>
    Task<ServiceResult> UpdateFriendLinkAsync(int id, EditFriendLinkInput input);
    
    /// <summary>
    /// 刪除友鏈
    /// </summary>
    /// <param name="id"></param>
    /// <returns></returns>
    Task<ServiceResult> DeleteFriendLinkAsync(int id);
    
    #endregion FriendLinks
    

    查詢友鏈列表需要返回的模型類QueryFriendLinkForAdminDto.cs

    //QueryFriendLinkForAdminDto.cs
    namespace Meowv.Blog.Application.Contracts.Blog
    {
        public class QueryFriendLinkForAdminDto : FriendLinkDto
        {
            /// <summary>
            /// 主鍵
            /// </summary>
            public int Id { get; set; }
        }
    }
    

    新增友鏈和更新友鏈需要的輸入參數EditFriendLinkInput.cs,直接繼承FriendLinkDto即可。

    //EditFriendLinkInput .cs
    namespace Meowv.Blog.Application.Contracts.Blog.Params
    {
        public class EditFriendLinkInput : FriendLinkDto
        {
        }
    }
    

    分別實現這幾個接口。

    /// <summary>
    /// 查詢友鏈列表
    /// </summary>
    /// <returns></returns>
    public async Task<ServiceResult<IEnumerable<QueryFriendLinkForAdminDto>>> QueryFriendLinksForAdminAsync()
    {
        var result = new ServiceResult<IEnumerable<QueryFriendLinkForAdminDto>>();
    
        var friendLinks = await _friendLinksRepository.GetListAsync();
    
        var dto = ObjectMapper.Map<List<FriendLink>, IEnumerable<QueryFriendLinkForAdminDto>>(friendLinks);
    
        result.IsSuccess(dto);
        return result;
    }
    
    /// <summary>
    /// 新增友鏈
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    public async Task<ServiceResult> InsertFriendLinkAsync(EditFriendLinkInput input)
    {
        var result = new ServiceResult();
    
        var friendLink = ObjectMapper.Map<EditFriendLinkInput, FriendLink>(input);
        await _friendLinksRepository.InsertAsync(friendLink);
    
        // 執行清除緩存操作
        await _blogCacheService.RemoveAsync(CachePrefix.Blog_FriendLink);
    
        result.IsSuccess(ResponseText.INSERT_SUCCESS);
        return result;
    }
    
    /// <summary>
    /// 更新友鏈
    /// </summary>
    /// <param name="id"></param>
    /// <param name="input"></param>
    /// <returns></returns>
    public async Task<ServiceResult> UpdateFriendLinkAsync(int id, EditFriendLinkInput input)
    {
        var result = new ServiceResult();
    
        var friendLink = await _friendLinksRepository.GetAsync(id);
        friendLink.Title = input.Title;
        friendLink.LinkUrl = input.LinkUrl;
    
        await _friendLinksRepository.UpdateAsync(friendLink);
    
        // 執行清除緩存操作
        await _blogCacheService.RemoveAsync(CachePrefix.Blog_FriendLink);
    
        result.IsSuccess(ResponseText.UPDATE_SUCCESS);
        return result;
    }
    
    /// <summary>
    /// 刪除友鏈
    /// </summary>
    /// <param name="id"></param>
    /// <returns></returns>
    public async Task<ServiceResult> DeleteFriendLinkAsync(int id)
    {
        var result = new ServiceResult();
    
        var friendLink = await _friendLinksRepository.FindAsync(id);
        if (null == friendLink)
        {
            result.IsFailed(ResponseText.WHAT_NOT_EXIST.FormatWith("Id", id));
            return result;
        }
    
        await _friendLinksRepository.DeleteAsync(id);
    
        // 執行清除緩存操作
        await _blogCacheService.RemoveAsync(CachePrefix.Blog_FriendLink);
    
        result.IsSuccess(ResponseText.DELETE_SUCCESS);
        return result;
    }
    

    其中查詢友鏈列表和新增友鏈中有兩條AutoMapper配置。

    CreateMap<FriendLink, QueryFriendLinkForAdminDto>();
    
    CreateMap<EditFriendLinkInput, FriendLink>().ForMember(x => x.Id, opt => opt.Ignore());
    

    BlogController.Admin.cs中添加接口。

    #region FriendLinks
    
    /// <summary>
    /// 查詢友鏈列表
    /// </summary>
    /// <returns></returns>
    [HttpGet]
    [Authorize]
    [Route("admin/friendlinks")]
    [ApiExplorerSettings(GroupName = Grouping.GroupName_v2)]
    public async Task<ServiceResult<IEnumerable<QueryFriendLinkForAdminDto>>> QueryFriendLinksForAdminAsync()
    {
        return await _blogService.QueryFriendLinksForAdminAsync();
    }
    
    /// <summary>
    /// 新增友鏈
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    [HttpPost]
    [Authorize]
    [Route("friendlink")]
    [ApiExplorerSettings(GroupName = Grouping.GroupName_v2)]
    public async Task<ServiceResult> InsertFriendLinkAsync([FromBody] EditFriendLinkInput input)
    {
        return await _blogService.InsertFriendLinkAsync(input);
    }
    
    /// <summary>
    /// 更新友鏈
    /// </summary>
    /// <param name="id"></param>
    /// <param name="input"></param>
    /// <returns></returns>
    [HttpPut]
    [Authorize]
    [Route("friendlink")]
    [ApiExplorerSettings(GroupName = Grouping.GroupName_v2)]
    public async Task<ServiceResult> UpdateFriendLinkAsync([Required] int id, [FromBody] EditFriendLinkInput input)
    {
        return await _blogService.UpdateFriendLinkAsync(id, input);
    }
    
    /// <summary>
    /// 刪除友鏈
    /// </summary>
    /// <param name="id"></param>
    /// <returns></returns>
    [HttpDelete]
    [Authorize]
    [Route("friendlink")]
    [ApiExplorerSettings(GroupName = Grouping.GroupName_v2)]
    public async Task<ServiceResult> DeleteFriendLinkAsync([Required] int id)
    {
        return await _blogService.DeleteFriendLinkAsync(id);
    }
    
    #endregion
    

    Next

    截止本篇,基於 abp vNext 和 .NET Core 開發博客項目 系列的後台API部分便全部開發完成了。

    本博客項目系列是我一邊寫代碼一邊記錄后的成果,並不是開發完成后再拿出來寫的,涉及到東西也不是很多,對於新手入門來說應該是夠了的,如果你從中有所收穫請多多轉發分享。

    在此,希望大家可以關注一下我的微信公眾號:『阿星Plus』,文章將會首發在公眾號中。

    現在有了API,大家可以選擇自己熟悉的方式去開發前端界面,比如目前我博客的線上版本就是用的 ASP.NET Core Web ,感興趣的可以去 release 分支查看。

    關於前端部分,看到有人呼籲vue,說實話前端技術不是很厲害,本職主要是後端開發,可能達不到預期效果。

    所以我準備入坑 Blazor ,接下來就現學現賣吧,一起學習一起做項目一起進步,加油

    開源地址:https://github.com/Meowv/Blog/tree/blog_tutorial

    搭配下方課程學習更佳 ↓ ↓ ↓

    http://gk.link/a/10iQ7

    本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    網頁設計最專業,超強功能平台可客製化

    ※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

    ※回頭車貨運收費標準

    ※推薦評價好的iphone維修中心

    ※教你寫出一流的銷售文案?

    台中搬家公司教你幾個打包小技巧,輕鬆整理裝箱!

    台中搬家公司費用怎麼算?

  • 手把手帶你入門numpy,從此數據處理不再慌【四】

    手把手帶你入門numpy,從此數據處理不再慌【四】

    本文始發於個人公眾號:TechFlow,原創不易,求個關注

    今天是numpy專題的第四篇文章,numpy中的數組重塑與三元表達式。

    首先我們來看數組重塑,所謂的重塑本質上就是改變數組的shape。在保證數組當中所有元素不變的前提下,變更數組形狀的操作。比如常用的操作主要有兩個,一個是轉置,另外一個是reshape。

    轉置與reshape

    轉置操作很簡單,它對應線性代數當中的轉置矩陣這個概念,也就是說它的功能就是將一個矩陣進行轉置

    轉置矩陣的定義是將一個矩陣的橫行寫為轉置矩陣的縱列,把縱列寫成轉置矩陣的橫行。這個定義的是二維的矩陣,本質上來說,轉置操作其實是將一個矩陣沿着矩陣的大對角線進行翻轉。翻轉之後,顯然這個矩陣的各個維度都會發生變化。

    其中二維的矩陣最直觀,一個4 x 3的矩陣,轉置之後得到的是3 x 4的矩陣。如果維度更多呢?如果是3 x 2 x 4的矩陣轉置之後會得到什麼?

    很簡單,得到的會是4 x 2 x 3的矩陣。我們都知道,如果我們把一個矩陣各個維度的大小寫在一起,會得到一個元組(tuple),這個元組稱為矩陣的shape,我實在是不知道該怎麼翻譯這個單詞,但是我覺得叫做形狀不太妥當,所以就保留了英文原文。轉置之後,矩陣的shape會整個翻轉。比如(3, 2, 4)會變成(4, 2, 3)。

    我們可以來看一個例子,會更加的直觀。首先我們先看最簡單的二維矩陣:

    這是隨機出來的一個3 x 4的二維矩陣,在numpy當中,有兩種方式獲取一個矩陣或者是數組的轉置。第一種方式是通過在數組的變量名之後加上.T操作符,第二種方式是調用numpy中的transpose函數,這兩種方式是一樣的。我個人比較傾向於前者,寫起來比較簡單。

    我們可以看到轉置之後新的矩陣的第一列其實是原矩陣的第一行,第一行是原矩陣的第一列。可以看成是原矩陣按照從左上角到右下角的一條無形的線翻轉之後的結果。

    理解了轉置之後,我們再來看reshape操作。其實我們從這個單詞上也能大概猜到它的意思,reshape也就是再次shape的意思,本意是根據我們想要的shape重新組裝矩陣當中的元素

    我們來看一個例子吧,首先,我們通過arange方法來獲取一個一維的數組:

    因為是1維的,所以我們去看它的shape也只有一維。假設我們不喜歡這樣的一維數組,而想把它變成3 x 4或者是6 x 2的格式,這時候使用reshape就會很方便。

    本質上來說reshape操作其實就是按照順序從矩陣當中獲取元素,然後按照我們制定的shape填充出一個新的矩陣的操作。這個應該不難理解, 它也是非常常用的重塑操作,通過reshape和轉置,我們可以很方便地操作矩陣的大小,根據我們的需要作出改變。

    三元表達式

    在許多編程語言當中我們經常會用到三元表達式,三元表達式其實本質就是if-else語句,只是我們用特殊的方法將它簡寫。

    比如說在C++當中,我們可以把if condition A else B簡寫成:condition ? A : B。Python同樣支持三元表達式,不過對C++的三元表達式做了一些改動,在Python當中三元表達式寫成:A if condition else B。相對來說更加直觀一些,我們經常會在數組初始化的時候用到三元表達式。

    比如,我們可能會這樣生成一個數組:

    arr = [1 if condition else 0 for _ in range(10)]
    

    我們通過條件來判斷了每一位是1還是0來生成了一個數組,簡化了代碼。在numpy當中同樣繼承了這個用法,我們一樣可以使用三元表達式,不過numpy將它封裝進了where函數當中,我們是通過調用一個方法來實現三元表達式的功能。我們來看下具體的用法,假設我們有兩個數組:

    我們還有一個bool型的數組c,我們希望根據c數組選擇從a數組或者是b數組當中獲取數據。我們可以使用where寫成這樣:

    在這個例子當中,c數組中的1和0分別表示True和False。當我們調用np.where的時候,numpy會自動根據c數組當中的值去選擇從a數組還是b數組當中獲取數據。相當於我們執行了這麼一段代碼:

    [x if c else y for c, x, y in zip(c, a, b)]
    

    雖然兩者的運行結果是一樣的,但是顯然使用循環的方法計算耗時更長,而使用numpy的向量做法運算速度更快。除此之外,numpy的where方法還支持高維的數組,但是循環的方法不行。並且where還有一些更高級的用法,比如說我們傳入的第二個和第三個參數,可以不是數組而是一個標量。比如我們可以指定當c中的元素是True的時候填入1,否則填入-1:

    甚至我們還可以將標量和向量結合起來使用:

    並且這裏的數組c也可以替換成邏輯運算:

    總結

    今天的文章主要介紹了Numpy當中的reshape、轉置以及where的用法,這些也是numpy的基礎用法,尤其是轉置、reshape,幾乎是處理數據必用的方法。所以想要從事Python機器學習或者是人工智能的小夥伴,numpy的這些用法是一定要會的。

    本文當中介紹的只是numpy的一些固定套路,但其實numpy很多的用法是可以組合的,一些看似平淡無奇的用法組合在一起之後會有神奇的效果。這一點光看書或者是資料是很難窮盡的,所以如果你已經學會了這些api的基本使用,接下來最應該做的是去讀一些大牛的源碼,看看大牛們是如何運用這些工具的,相信一定還會有新的收貨。

    文章就到這裏,如果喜歡本文,可以的話,請點個關注

    本文使用 mdnice 排版

    本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    ※產品缺大量曝光嗎?你需要的是一流包裝設計!

    ※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

    ※回頭車貨運收費標準

    ※推薦評價好的iphone維修中心

    ※超省錢租車方案

    台中搬家遵守搬運三大原則,讓您的家具不再被破壞!

    ※推薦台中搬家公司優質服務,可到府估價

  • WinUI 3 試玩報告

    WinUI 3 試玩報告

    1. 什麼是 WinUI 3

    在微軟 Build 2020 開發者大會上,WinUI 團隊宣布可公開預覽的 WinUI 3 Preview 1,它讓開發人員可以在 Win32 中使用 WinUI。WinUI 3 Preview 1 包含新的 VisualStudio 項目模板,可以創建面向 .NET 5 的 C# 和 C++/Win32 項目。從技術上講,WinUI 3 將 UWP 的 XAML、Composition 和 Input 層分離,並通過NuGet將它們獨立分發給針對Windows 10 版本 1803 及更高版本的 Win32 應用。

    WinUI 3 適用於 Win32 和 UWP,這篇文章主要討論 Win32 的情況。

    2. 理解 WinUI 3

    以前我們總是抱怨 WPF 多年都不提供新的主題,不提供新的控件,性能又沒提升。現在微軟索性把什麼都是新的 WinUI 3 提供給桌面開發,沒 WPF 什麼事了。

    簡單來說,UWP 的開發體驗不好(關於這個話題真是一言難盡),而且出了 Bug 還必須等待下半年的 Windows 更新進行修復,但微軟的開發人員專心給 UWP 的 UI 層加各種功能;.NET Core 更新很快,但很少人有興趣有動力給陳舊的 WPF 的 UI 層進行大幅度的改進。於是 WinUI 將 UWP 的 UI 層從 Windows SDK 的其它部分分離,並將從 Windows 轉移到 Nuget。現在建一個 C++ 或 C#(.NET 5) 程序,再從 Nuget 上裝個 WinUI 3 的包套個 UI 層,一個基於 Fluent Design,觸摸友好,性能無與倫比的應用程序就誕生了。

    上圖列舉了 WinUI 3 和其他平台對比的部分特性,除此之外 WinUI 3 還有很多好處,例如開源、更新更快、更新不與系統版本綁定等,更詳細的內容還是看微軟自己怎麼宣傳吧:

    WinUI – The modern native UI platform of Windows.

    不過要用上 WinUI 3 還要等一年半載。下面是微軟給出的發布路線圖,目前我們也只能用 Preview 版嘗嘗鮮。

    3. 試玩WinUI 3

    要試玩 WinUI 3 首先要有 Windows 10 1803 以上版本的電腦(WinUI 3 最低支持1803),然後還需要使用 Visual Studio 2019 16.7 以上版本(目前只能安裝預覽版)。安裝 Visual Studio 時要把以下工作負載全都選上:

    • .NET 桌面開發
    • 通用 Windows 平台開發
    • 使用 C++ 的桌面開發
    • 適用於通用 Windows 平台負載的 C++(V142) 通用 Windows 平台工具可選組件

    當然 .NET 5.0 也要裝上。

    然後在 https://aka.ms/winui3/previewdownload 下載並安裝 WinUI 3 Project Templates 擴展,這樣才可以在 Visual Studio 創建 WinUI 的項目。

    可選 C++ 或 C# ,這裏我選擇了 C# 的“Blank App, Packaged
    (WinUI in Desktop)”項目,並選擇了對應的 Windows 平台:

    項目創建后 Visual Studio 生成了兩個項目。第一個包含應用的代碼,代碼結構基本和 UWP 一樣,只是少了用於打包應用的 Package.appxmanifest 和一些圖片。從依賴項里可以看到項目已經安裝了 Microsoft.WinUI 3 的包。從項目屬性里可以看到這就是個 .NET 5 的項目。

    Visual Studio 生成的第二個項目是一個 Windows 應用程序打包項目,該項目經配置后可將應用生成為適合部署的 MSIX 程序包。 也就是說 UWP 項目中用於打包的部分被獨立出來了。這個項目還應該是解決方案的啟動項目。運行這個項目后創建的應用會添加到開始菜單中,這點也和UWP一樣。

    到這裏為止都和預期的一樣,我之後還嘗試了將 UWP 應用移植到 WinUI ,基本上只需要將 Windows.UI 命名空間改為 Microsoft.UI就可以了,XAML 和 C# 代碼完全不用變。只可惜目前 WinUI 還很簡陋,Win2D、Community Toolkit 等微軟自己發布的 UWP 包都還沒有 WinUI 版本。而且沒有設計視圖,XAML 視圖也沒有智能感知,現在想要用 WinUI做些什麼有趣的項目會很困難。不過從目前的移植難度上來看,將來正式發布后應該可以完整地將 UWP 的 UI 的開發經驗運用在 WinUI 上。

    4. 和 WPF 及 UWP 進行對比

    既然 WinUI 3 開發模式和 WPF 及 UWP 都很像,我當然對它們之間的對比很感興趣。

    命名

    首先說說命名,“WinUI” 光這個名字就 Win 了。 “UWP” 太高雅,我敢打賭國內有些 UWP 的開發(例如我)都不能好好地把 UWP 的全稱拼出來;“WPF” 好些,但 WPF 的含義也讓人很疑惑。而 Windows UI 簡稱 WinUI ,意義和發音都很清晰明確。不過這三個都比很多人都不會讀的 “Xamarin” 強多了。

    可是有了 WinUI 3 ,就會有人問“那 WinUI 2 呢?”WinUI 2是一個 UWP 的控件庫,當然的只能用在 UWP 上。這就很尷尬了,WinUI 的 3 和 2 根本不是同一個概念,實在很容易讓人混淆,說不定以後會把後綴的 3 去掉(我這篇文章就常常懶得理寫這個3)。而且 UWP 中代碼的命名空間以 Windows.UI 開頭,在 WinUI 3 中則 Microsoft.UI ,按着 Office 365 改名為 Microsoft 365、Bind Ads 改名為 Microsoft Advertising 這些經驗,該不會以後 WinUI 可能改名為 Microsoft UI ,簡稱 MiUI 吧?

    權限

    權限方面是 WinUI 的一個亮點,因為它本質上就是個 Win32 程序,可以放開手腳隨便來。相對的 UWP 有很嚴格的權限限制,開發 UWP 時常常會感到綁手綁腳。例如下面這段代碼,大部分 WPF 開發者都難以想象只是最小化 UWP 程序而已,它就不能好好運行了:

    int count = 0;
    DispatcherTimer timer = new DispatcherTimer();
    timer.Interval = TimeSpan.FromSeconds(1);
    timer.Tick += (s, e) =>
      {
          myButton.Content = count++;
      };
    timer.Start();
    

    UWP 的生命周期如上圖,當 UWP 處於 background 運行或 suspended 狀態時應用基本處於暫停狀態,也也不會處理UI功能。我明白這是 UWP 為了省電、安全等原因才這樣設計,但對開發人員來說真的太不方便。而 WinUI 應用基本上就是個 Win32 應用,目前看來不會有這些坑。

    開發體驗

    說起開發體驗,WPF 好歹還算正常,Visual Studio 的設計視圖運行正常,編譯起來也快。UWP 編譯很慢,設計視圖經常出問題,Blend 也時好時壞把設計師都氣跑了。就算完全按着官方的文檔完成一個 UWP App,甚至一行代碼都不改,發布到商店后還是有可能崩潰。而對於應用商店,真是千言萬語彙聚成一個草花頭。

    現在 WinUI 的 XAML 視圖連智能感知都沒有,也沒有設計視圖,實在沒法談開發體驗。很難猜測正式發布的時候會怎麼樣,希望至少和WPF保持一致吧。

    性能

    WPF 總是給人“慢”的印象,除了因為在它剛出來的時候(10年前)電腦性能不夠導致留下了刻板印象,還有一個主要原因是:它真的很慢。

    UWP 的 XAML 有很優秀的性能表現,除此之外為了照顧已經不存在的 Windows Phone 的貧弱性能,很多控件模版都經過精心設計並大幅簡化。

    為了驗證 WinUI 的性能我寫了下面這些代碼,然後分別移植到 WPF .Net Framework 4.8、WPF .NET 5、UWP、WinUI(WPF 和 UWP/WinUI 的代碼稍微有一點不同):

    for (int i = 0; i < 50; i++)
    {
        var rectangle = new Rectangle
        {
            Height = 500,
            Width = 500,
            Opacity = ((double)i + 40) / 100d,
            RadiusX = 108,
            RadiusY = 98,
            StrokeThickness = 3,
            Stroke = new SolidColorBrush(Color.FromArgb(255, 75, 75, (byte)(i * 250d / 50d))),
            RenderTransformOrigin = new Point(0.5, 0.5)
        };
        Root.Children.Add(rectangle);
        var angle = i * 360d / 50d;
        var transform = new RotateTransform
        {
            Angle = angle
        };
    
        rectangle.RenderTransform = transform;
    
        var storyboard = new Storyboard();
        storyboard.Children.Add(new DoubleAnimation { Duration = TimeSpan.FromSeconds(1), From = angle, To = angle + 360 });
        Storyboard.SetTarget(storyboard, transform);
        Storyboard.SetTargetProperty(storyboard, "Angle");
        storyboard.RepeatBehavior = RepeatBehavior.Forever;
        storyboard.Begin();
    }
    

    上面這段代碼是讓50個矩形旋轉,十分考驗 WPF 的性能。結果可以說出乎意料。

    CPU 內存 GPU
    WPF .NET Framework 4.8 12 60 76
    WPF .NET 5.0 12 85 72
    UWP 3 28 36
    WinUI 5 65 95

    我的環境是 i7-6820HQ 及集成顯卡。WPF 平台佔用 70 多%的 GPU,這我大致能猜到。UWP 十分流暢,GPU 只佔用 WPF 的一半,CPU 和 內存都有出色表現,不過我還以為會更低的。

    WinUI 這個濃眉大眼的我真的萬萬沒想到,不僅掉幀明顯,還佔用了幾乎 100% GPU,也就是說它連這麼簡單的代碼都跑不起來。()順便一提,將測試代碼中旋轉的矩形減少為10個,WPF 的程序佔用 32% GPU,而 WinUI 佔用 70 多%。)

    從上面的數據基本可以說明,WinUI 離設計目標還十分遙遠,畢竟是預覽版,還有一年半載可以慢慢優化。

    5. 結語

    總的來說微軟雄心勃勃,可是現在拿出來的 WinUI 預覽版還差得太遠,功能未完善,性能不及預期。我覺得大致方向沒錯,WinUI 對 C++、WPF、UWP 開發者都是個新的工具新的機遇,可以關注一下。

    6. Q & A

    Windows 7 怎麼辦?

    按微軟公布的路線圖,再包括跳票等因素,等 WinUI 真正可用時 Windows 7 已停止更新很久,到時 Windows 7 的佔有率可能已經下降到開發者不會關心的程度。

    基於 .NET Core 的 Wpf 還是 WinUI?

    假使不想花精力將現有項目遷移到 WinUI,或者對來自 UWP 的 WinUI 沒信心,又或者舍不得 Windows 7 的用戶,並且對觸摸沒需求,當然可以繼續選用 WPF,基於 .NET Core 的 WPF 會是個很好的選擇。

    MAUI 還是 WinUI ?

    MAUI 還在很遙遠的將來(2021年11月),我沒試玩過,所以不好評價。如果有跨平台需求當然只能選 MAUI,如果 WinUI 團隊技高一籌實現了 MAUI 難以企及的超高性能,那就選 WinUI。不過 MAUI 這個名字太過普通/普遍,可能會被逼着改名吧。

    那 UWP 呢?

    權限受限的 UWP 可以說是人畜無害,對用戶來說可能也是個不錯的選擇。而且 UWP 還支持 Xbox 和 Hololens 等平台,目前看來還是有它的市場。

    Winforms 呢?

    人只有忘卻了過去,才能好好活着。

    WinUI 有未來嗎?

    我做了好多年 Silverlight 開發,買了5、6部 Windows Phone 手機,寫了幾十篇 UWP 文章,根據我豐富的經驗,我可以肯定 WinUI 是有未來的。

    8. 參考

    WinUI – The modern native UI platform of Windows.

    Introducing WinUI 3 Preview 1 – Windows Developer Blog

    Get started with WinUI 3 for desktop apps Microsoft Docs

    GitHub – microsoft_microsoft-ui-xaml

    Windows UI Library Roadmap

    WinUI 3.0_ The future of Windows controls

    本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    ※回頭車貨運收費標準

    ※產品缺大量曝光嗎?你需要的是一流包裝設計!

    ※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

    ※推薦評價好的iphone維修中心

    ※教你寫出一流的銷售文案?

    台中搬家公司教你幾個打包小技巧,輕鬆整理裝箱!

    台中搬家遵守搬運三大原則,讓您的家具不再被破壞!

  • 10萬隻能買山寨保時捷?現在能買真X5!

    0T,163馬力)與手動變速箱的組合,又根據外觀的區別分文紅標藍標。而F6S又定位於緊湊級SUV,有多少因為H6型號太多,不知道怎麼選,最後放棄的朋友。報個到。4。女司機賓利無人駕駛俗話說防火防盜防女司機,就在昨天,一位賓利女司機的事故又在朋友圈瘋傳,從視頻上來看她是想去地庫,結果一不小心衝過卡,你跟我說倒車,太難了,直接就下車取卡,誰知道帶你裝逼帶你飛的賓利不帶女司機玩,自己跑了,拉都拉不住。

    1. 勞斯萊斯全路況車型 Cullinan庫里南

    由於全球市場SUV的熱銷,越來越多的豪車廠商紛紛下海(保時捷,瑪莎拉蒂,阿爾法羅密歐)隨着賓利添越的發布與熱賣,勞斯萊斯也公布了旗下首款非SUV的諜照,(官方一直表明這隻是全路況汽車,並非SUV)然而新車的名字Cullinan被網友戲稱為苦力男,也不是沒有道理,這車的車主腰部運動量肯定較常人多,如果非要有個正經的命名法則,應該是源於迄今為止世界上最大的鑽石。

    其實早在2015年海外媒體就跟蹤報道過,當時的測試車看着就像加了尾翼底盤抬高的幻影,從目前這款車的諜照來看,勞斯萊斯Cullinan將會採用和幻影相類似的車身設計,並且極有可能搭載和幻影一致的6.8L V12發動機。

    2. 東風景逸X5

    眼看今年只有兩個月不到了,還在為過年回家開的車沒面子感到煩擾嗎,沒問題,現在有這麼款車,名字叫x5,德國外形設計。

    極具科技感的內飾。

    看到這種配方你們以為說的是眾泰嗎?too young too naïve,而是最新的東風景逸X5,官方消息表示新車將於本月17號正式上市,搭載1.6和2.0升發動機,匹配5速、6速手動變速箱和CVt自動變速箱。沒有眾泰那麼直接的借鑒加上最後十萬左右的價格(9到12萬),對過年有信心了嗎?

    3. H6轎跑版哈弗F6S

    就在前陣的廣州車展,哈弗推出了旗下高端品牌wey,近日工信部又表示哈弗將推兩款定位高於H6的SUV,或將命名為F6和F6S,儘管換了新名字,不過還是基於H6平台打造。

    除了2.0T加上雙離合的變速箱,F6還將增加柴油發動機(2.0T,163馬力)與手動變速箱的組合,又根據外觀的區別分文紅標藍標。而F6S又定位於緊湊級SUV,有多少因為H6型號太多,不知道怎麼選,最後放棄的朋友?報個到。

    4. 女司機賓利無人駕駛

    俗話說防火防盜防女司機,就在昨天,一位賓利女司機的事故又在朋友圈瘋傳,從視頻上來看她是想去地庫,結果一不小心衝過卡,你跟我說倒車,太難了,直接就下車取卡,誰知道帶你裝逼帶你飛的賓利不帶女司機玩,自己跑了,拉都拉不住。

    你以為這樣就完了嗎?被撞那堵牆的另一側,更是一度上演死神來了的劇本,好在那位大叔瞬間使出凌波微步,僥倖避開事故,有人說女司機真沒素質,又是在車尾裝流氓燈,又是連p擋都不會掛,也有人說賓利這麼一個豪華品牌居然沒有開門自動掛p擋的功能,差評,不管怎樣,這位女司機又給女同胞順利掛上了一個女司機的負面標籤。

    5.J.D power 年度中國最靠譜汽車品牌前兩名為路虎和mini

    近日,J.D. power 發布了2016年中國車輛可靠性研究SM(VDS),引來一片質疑,為什麼會這樣呢?因為今年被評為最可靠的品牌分別為路虎(豪華車)和MINI(主流車)。

    不管路虎的越野性能有多出色,但是在以往J.D. power 的排名中幾乎是墊底的。甚至被調侃到如果發現一輛路虎沒有漏油,說明油漏完了,在公布成績后JD power也被調侃,JD(假的)嘛,肯定是假的咯,在這裏奶茶妹夫表示無故躺槍。(京東也算JD)本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

    網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

    ※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

    南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

    ※教你寫出一流的銷售文案?

    ※超省錢租車方案

    ※回頭車貨運收費標準

  • 還在看奔馳寶馬奧迪?這款豪華型SUV面子可不比它們少!

    還在看奔馳寶馬奧迪?這款豪華型SUV面子可不比它們少!

    ▲后艙儲物軌道設計另外還有滑動式的隔欄,擺放固定好物品隨心所欲,這無一不體驗了一款豪華型SUV的專屬特質。靈動的操控 動力隨心而動強勁的動力搭配是豪車的專屬,XT5和凱迪拉克其他車型一樣,它的動力調性都非常有駕駛魅力,2。

    提起豪車品牌,或許你們立馬會想起奔馳寶馬奧迪,但有一個品牌始於19世紀初的美國汽車之城底特律,在汽車行業中創造了無數個第一,締造了無數個豪華車的行業標準。

    如今這個品牌融匯了百年歷史精華和代代設計師的智慧才智,打造出了一款驚艷的豪華型SUV,它的銷量已然超過了同級別的寶馬X3,它就是今天的主角-凱迪拉克XT5。

    車內空間的變化 自由到超乎你想象

    凱迪拉克定位為一款豪華中型SUV,尺寸在同級別中佔優,相比同級別中奧迪Q5的2807mm軸距還長上50mm,達到了2857mm的超長軸距,自然比其他競爭車型的乘坐空間寬裕不少,體驗過奧迪Q5的後排的朋友們也清楚其狹窄的程度,像XT5擁有超長軸距和寬大空間的車型實屬少見。

    擁有寬裕的空間,得益於座椅的調節靈活性,多角度的調節能夠讓乘客找到最舒適的乘坐姿態,同時如果全車坐滿5個成人的前提下,後備廂還能放下3個28寸的行李箱,重點是還不顯得擁擠,其次座椅還具有加熱通風功能,凸顯了豪車的優勢所在。

    多達11處人性化儲物空間,每一處都充滿了驚喜,特別是擁有超大的3.75L中央扶手箱,無論是深度和縱度都很大,避免了雜物亂擺放的尷尬 。

    ▲後排輕鬆一鍵放倒

    其實最喜歡的還是凱迪拉克XT5那令人超乎想象的後備廂空間,常規行李箱的容積為584L,手指只需一按一鍵放倒功能,行李箱的空間馬上變為1634L超大容積,放一個家用的洗衣機或是幾個大行李箱都不在話下,無論是帶着行李出差還是自駕游,都無需擔心XT5的裝載能力。

    ▲後備廂自動感應開啟

    當你無法騰出雙手時,比如擰着購物袋或者懷裡抱着孩子,無需從口袋裡掏出鑰匙,只需用腳輕掃保險杠下方,後備廂門便自動打開。

    ▲后艙儲物軌道設計

    另外還有滑動式的隔欄,擺放固定好物品隨心所欲,這無一不體驗了一款豪華型SUV的專屬特質。

    靈動的操控 動力隨心而動

    強勁的動力搭配是豪車的專屬,XT5和凱迪拉克其他車型一樣,它的動力調性都非常有駕駛魅力,2.0T的發動機強勁有力,其次還有智能適時的四驅系統,給予駕駛者專屬的豪車駕駛感受。

    ▲2.0T渦輪增壓直噴發動機

    要證明這是一台合格的豪華型SUV,四驅系統則是最好的體現,XT5的智能雙離合適時四驅系統採用頂級跑車專用技術。

    ▲提供多種駕駛模式選擇

    DISCONNECT可分離分動器在路況良好的情況下,讓XT5真正進入兩輪驅動模式,而TWIN-CLUTCH雙離合后驅單元則針對實際路況分配最佳的扭矩分配,不同的路況享受最好的駕駛模式,輕鬆駕馭,這可是豪華型車的專屬配置哦!

    總結:

    凱迪拉克XT5擁有豪車的特質之餘,個性獨特的凱迪拉克鑽石切割設計言語凸顯出XT5不同的豪車風範,別出心裁的設計尤其能突出它優良的美式傳統,寬大的乘坐空間和裝載能力也在同級別中非常優秀。

    凱迪拉克XT5論面子不輸BBA,綜合表現相當均衡,它既能舒舒服服地陪駕駛者達到目的地,也能有着不錯的駕駛樂趣,絕對滿足日常用車需求,實屬一台可貴實用的豪華型SUV。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    網頁設計最專業,超強功能平台可客製化

    ※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

    ※回頭車貨運收費標準

    ※推薦評價好的iphone維修中心

    ※教你寫出一流的銷售文案?

    台中搬家公司教你幾個打包小技巧,輕鬆整理裝箱!

    台中搬家公司費用怎麼算?

  • 划時代產品駕到 樂視戰略夥伴FF首款量產車終露真容

    划時代產品駕到 樂視戰略夥伴FF首款量產車終露真容

    與此同時,某知名媒體人也在其官方微博曬出了FF官方發出的邀請函,而樂視掌門人賈躍亭也轉發此微博並附言:“First Forward。全球首發。戰略夥伴FF,新物種,如何重構百年汽車產業。1。3給你答案。”從今年CES上FF的品牌首秀,到如今首款量產車落地在即,不到一年的時間,FF的發展速度讓人驚嘆。

    12月7日, 樂視戰略夥伴Faraday Future(簡稱FF)在其官方渠道發出了一張題為“新物種·重構百年汽車產業”的官方海報,除了公布其將於明年1月3日正式發布以外,實車的前臉設計細節也首次公之於眾。

    從海報中可以看到,貫穿車頭的日間行車燈帶最為亮眼。這一設計與其概念車FF ZERO1“UFO線”的設計極為相似,未來或將成為FF家族的標誌性設計元素。從圖片判斷,FF首款量產車日間行車燈或將使用LED光源,其線條環抱整個前臉。除了具有極具辨識度的造型設計以外,未來或將有更多功能會被集成其中,給人無盡的想象空間。

    FF首款量產車細節曝光

    由燈帶包裹的大燈、轉向燈等信息在該圖上還無從識別,但以FF大膽和極具未來感的設計風格來看,實車亮相時或許還將帶來一些超乎以往的感官體驗。

    此外,之前曝光的海報中疑似FF前臉包圍的設計也得到了證實,這條由FF Logo圖紋組成的醒目光帶十分搶眼。與傳統車輛的實體Logo不同,FF的Logo或將採用可變燈組显示,科技感爆棚,逼格滿滿。

    除醒目的車輛前臉細節以外,車身的流線造型設計也非常漂亮。圓弧形的車輛線條從車頭一直延伸而下,兩條稜線將車輛分割開來,這樣的設計元素除了讓外形層次感更加分明以外還可能為整車帶來更好的空氣動力學特性,風阻係數也將進一步降低。

    此前,FF對首款量產車進行了多輪路測,並完成了對高速穩定性和放電效率的階段性測試,相信整車已經為發布做好了充分的準備。

    與此同時,某知名媒體人也在其官方微博曬出了FF官方發出的邀請函,而樂視掌門人賈躍亭也轉發此微博並附言:“First Forward!全球首發!戰略夥伴FF,新物種,如何重構百年汽車產業?1.3給你答案。”

    從今年CES上FF的品牌首秀,到如今首款量產車落地在即,不到一年的時間,FF的發展速度讓人驚嘆。作為汽車產業的新軍,FF想要打造的不只是一款划時代的互聯電動車產品,更是要為百年的汽車產業帶來顛覆性變革,徹底將人類出行邁進互聯網生態時代。

    眾所周知,FF的汽車團隊已經集合了包括電動化、車聯網、自動駕駛技術等全方面的頂級人才。這樣一家企業打造出的首款量產車,恐怕絕不僅僅是一款電動車這樣簡單。今年1月,FF與樂視達成了戰略合作,4月,雙方又共同成立了FF&LeFuture 人工智能研究院,並且研究院的初步成果也在今年的世界機器人大會上成功進行了階段性的展示。再者,樂視在車聯網、內容、應用、互聯網、雲等方面深耕已久,並且在EUI方面的技術積累也已十分成熟,因此這種深度的融合必將會在未來車輛上的應用與體驗方面帶來顛覆傳統的感受。

    如今,距離明年該車全球首發已經只有不到1個月的時間,而該車到底能給我們帶來什麼更多的驚喜,就讓我們拭目以待吧!本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    ※產品缺大量曝光嗎?你需要的是一流包裝設計!

    ※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

    ※回頭車貨運收費標準

    ※推薦評價好的iphone維修中心

    ※超省錢租車方案

    台中搬家遵守搬運三大原則,讓您的家具不再被破壞!

    ※推薦台中搬家公司優質服務,可到府估價

  • 大空間的5座車和高檔次的7座車,你會更喜歡哪輛?

    大空間的5座車和高檔次的7座車,你會更喜歡哪輛?

    兩車的實用性都很高,不過兩者的性格區別很大。冠道動力充沛,指向靈敏,裝載貨物空間大。而GL8乘坐空間更大,乘坐感受更為舒適,隔音濾震都相當出色。如果你喜歡駕駛,偶爾還會走走野外爛路,那冠道絕對是首選。不過如果你上有老下有小,可能還計劃生二胎,那麼舒適寬大的GL8會是更好的選擇。

    隨着時代發展,汽車已經逐漸變成每個家庭的必需品,許多人買車時考慮的第一要素就是車子夠不夠實用。而說到實用性,關於SUV和MpV哪個更實用的爭論一直都沒有消停過。今天就給大家對比一下兩款時下最熱門的SUV和MpV,本田冠道和全新別克GL8,看看哪一個能成為你的心頭好!

    總結:冠道和GL8的最大區別在於一個是採用5座布局,另一個採用的是7座布局。兩車的實用性都很高,不過兩者的性格區別很大。冠道動力充沛,指向靈敏,裝載貨物空間大;而GL8乘坐空間更大,乘坐感受更為舒適,隔音濾震都相當出色。如果你喜歡駕駛,偶爾還會走走野外爛路,那冠道絕對是首選;不過如果你上有老下有小,可能還計劃生二胎,那麼舒適寬大的GL8會是更好的選擇。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    ※回頭車貨運收費標準

    ※產品缺大量曝光嗎?你需要的是一流包裝設計!

    ※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

    ※推薦評價好的iphone維修中心

    ※教你寫出一流的銷售文案?

    台中搬家公司教你幾個打包小技巧,輕鬆整理裝箱!

    台中搬家遵守搬運三大原則,讓您的家具不再被破壞!

  • 新冠病毒是就業殺手!美太陽能產業五年的就業成長歸零

    摘錄自2020年5月19日自由時報報導

    路透報導,新冠病毒的大流行,導致美國太陽能產業五年來的就業成長歸零。

    產業領袖周一(18日)表示,在疫情期間,美國砍掉了6萬5000多個太陽能產業工作,這個以遏止氣候變遷為目標領域五年來的就業成長倒轉回原點。美國貿易公會組織「太陽能產業協會」表示,因商店關門和居家避疫令而無法安裝太陽能設施,導致工作急劇流失。

    美國整個經濟體4月流失逾2050萬個工作,是自經濟大蕭條以來受薪工作最急劇的下滑。這波裁員後預期人力剩下18萬8000多名員工,類似此產業在2014年的規模,與之前預測的30萬2000名員工相距甚遠。

    能源議題
    再生能源
    能源轉型
    國際新聞
    美國
    武漢肺炎
    太陽能
    低碳產業
    就業
    疫情看氣候與能源

    本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

    ※台北網頁設計公司全省服務真心推薦

    ※想知道最厲害的網頁設計公司"嚨底家"!

    ※推薦評價好的iphone維修中心

    網頁設計最專業,超強功能平台可客製化

    ※別再煩惱如何寫文案,掌握八大原則!

  • 購置稅減半優惠政策真的即將結束?結果可能會是這樣

    購置稅減半優惠政策真的即將結束?結果可能會是這樣

    所以,汽車工業協會已經向有關部門提出建議,希望繼續推行1。6L及以下乘用車購置稅優惠政策,而且,對於是否繼續延續這個優惠政策,有關部門正在進行商討。我們從某兩家車企的高層了解到,他們認為接下來小排量汽車的購置稅按7。

    馬上到元旦了,近期有購車打算的小夥伴們都是一個比一個忙的,看車、試駕、砍價、簽單一氣呵成,好像現在不買車以後就買不到了一樣。

    昨天表哥還跟我打電話說車子已經定好了,就等提車了,我當時就說你這個做事這麼墨跡的人怎麼這麼快就做出決定了。

    他回答:“不買不行啊,到了月底購置稅減半政策就結束了,銷售也一個勁的催我,害怕多花幾千塊錢就趕緊訂車了。”

    再聯想到11月份汽車銷量又創新高,所以可以看出來,這一政策對打算購車之人的影響還是非常大的。

    2015年9月29日,國務院召開會議,為促進小排量汽車發展,決定對購買1.6L及以下排量的乘用車實行車輛購置稅減半的優惠政策,即10%稅率降為按5%稅率徵收。簡單的理解就是相當於在之前的購置稅基礎之上打五折。實行日期為2015年10月1日-2016年12月31日。

    眼看着這個五折優惠政策即將到期,所以大家都是想在這個政策結束之前趕緊下單買車。

    當時實行這個優惠政策的目的也是為了擴大內需,促進消費。這個政策確實極大的促進了汽車銷量的增長,達到了預期效果,今年前十個月國內汽車銷量同比增長約為13%,過去五年的年均增長率大約為6.4%,增速明顯。

    但是這個政策更像是催熟劑,使得需求提前被釋放出來了。如果優惠政策戛然而止,那麼對車市的打擊很可能是十分巨大的。所以,汽車工業協會已經向有關部門提出建議,希望繼續推行1.6L及以下乘用車購置稅優惠政策,而且,對於是否繼續延續這個優惠政策,有關部門正在進行商討。

    我們從某兩家車企的高層了解到,他們認為接下來小排量汽車的購置稅按7.5%的稅率徵收的可能性更大。簡單的理解也就是購置稅打7.5折。因為7.5%的稅率在我國早有先例,所以小編認為這個傳言還是比較可信的。

    雖然沒有了5折的優惠,但是可以打7.5折還是不錯的麽,畢竟也可以省下一部分錢了。車型的價格越高,省的錢就越多。不過7.5%並不是可靠消息,只是稅率很有可能是7.5%,具體是什麼情況還是要看政策。

    所以如果車價較貴,還是建議儘快下手比較好,因為誰也無法準確預測政策將會往哪裡走。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

    ※台北網頁設計公司全省服務真心推薦

    ※想知道最厲害的網頁設計公司"嚨底家"!

    ※推薦評價好的iphone維修中心

    網頁設計最專業,超強功能平台可客製化

    ※別再煩惱如何寫文案,掌握八大原則!