基於 abp vNext 和 .NET Core 開發博客項目 – Blazor 實戰系列(二)

系列文章

  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 開發博客項目 – 博客接口實戰篇(四)
  20. 基於 abp vNext 和 .NET Core 開發博客項目 – 博客接口實戰篇(五)
  21. 基於 abp vNext 和 .NET Core 開發博客項目 – Blazor 實戰系列(一)
  22. 基於 abp vNext 和 .NET Core 開發博客項目 – Blazor 實戰系列(二)
  23. 基於 abp vNext 和 .NET Core 開發博客項目 – Blazor 實戰系列(三)
  24. 基於 abp vNext 和 .NET Core 開發博客項目 – Blazor 實戰系列(四)
  25. 基於 abp vNext 和 .NET Core 開發博客項目 – Blazor 實戰系列(五)
  26. 基於 abp vNext 和 .NET Core 開發博客項目 – Blazor 實戰系列(六)
  27. 基於 abp vNext 和 .NET Core 開發博客項目 – Blazor 實戰系列(七)
  28. 基於 abp vNext 和 .NET Core 開發博客項目 – Blazor 實戰系列(八)
  29. 基於 abp vNext 和 .NET Core 開發博客項目 – Blazor 實戰系列(九)
  30. 基於 abp vNext 和 .NET Core 開發博客項目 – 終結篇之發布項目

上一篇搭建了 Blazor 項目並將整體框架改造了一下,本篇將完成用 C# 代碼代替 JavaScript 實現幾個小功能,說是代替但並不能完全不用 JavaScript,應該說是盡量不用吧。

二維碼显示與隱藏

可以看到,當我鼠標移入的時候显示二維碼,移出的時候隱藏二維碼。

這個功能如果是用JavaScript來完成的話,肯定首先想到的是HTML的 Mouse 事件屬性,那麼在Blazor中也是一樣的,給我們實現了各種on*事件。

打開index.razor頁面,給微信圖標那個 NavLink 標籤添加兩個事件,@onmouseover@onmouseout

...
<NavLink class="link-item weixin" title="掃碼關注微信公眾號:『阿星Plus』查看更多。" @onmouseover="Hover" @onmouseout="Hover">
    <i class="iconfont iconweixin"></i>
</NavLink>
...

當鼠標移入移出的時候都執行我們自定義的一個方法Hover()

C# 代碼寫在@code{}花括號中,實現显示和隱藏原理是利用css,默認是隱藏的,當显示的時候將具有隱藏屬性的class值去掉就可以了。

所以,可以添加兩個字段,一個用於判斷當前是否處於隱藏狀態,一個用來存儲class的值。

/// <summary>
/// 是否隱藏
/// </summary>
private bool IsHidden = true;

/// <summary>
/// 二維碼CSS
/// </summary>
private string QrCodeCssClass => IsHidden ? "hidden" : null;

IsHidden = trueQrCodeCssClass = "hidden",當IsHidden = falseQrCodeCssClass = null

那麼在Hover()方法中,不斷修改IsHidden的值就可以實現效果了。

/// <summary>
/// 鼠標移入移出操作
/// </summary>
private void Hover() => IsHidden = !IsHidden;

最後將QrCodeCssClass變量賦值給二維碼圖片所在的div上。

...
<div class="qrcode @QrCodeCssClass">
    <img src="https://static.meowv.com/images/wx_qrcode.jpg" />
</div>
...

大功告成,index.razor完整代碼如下:

@page "/"

<div class="main">
    <div class="container">
        <div class="intro">
            <div class="avatar">
                <a href="javascript:;"><img src="https://static.meowv.com/images/avatar.jpg"></a>
            </div>
            <div class="nickname">阿星Plus</div>
            <div class="description">
                <p>
                    生命不息,奮鬥不止
                    <br>Cease to struggle and you cease to live
                </p>
            </div>
            <div class="links">
                <NavLink class="link-item" title="Posts" href="posts">
                    <i class="iconfont iconread"></i>
                </NavLink>
                <NavLink target="_blank" class="link-item" title="Notes" href="https://notes.meowv.com/">
                    <i class="iconfont iconnotes"></i>
                </NavLink>
                <NavLink target="_blank" class="link-item" title="API" href="https://api.meowv.com/">
                    <i class="iconfont iconapi"></i>
                </NavLink>
                <NavLink class="link-item" title="Manage" href="/account/auth">
                    <i class="iconfont iconcode"></i>
                </NavLink>
                <NavLink target="_blank" class="link-item" title="Github" href="https://github.com/Meowv/">
                    <i class="iconfont icongithub"></i>
                </NavLink>
                <NavLink class="link-item weixin" title="掃碼關注微信公眾號:『阿星Plus』查看更多。" @onmouseover="Hover" @onmouseout="Hover">
                    <i class="iconfont iconweixin"></i>
                </NavLink>
                <div class="qrcode @QrCodeCssClass">
                    <img src="https://static.meowv.com/images/wx_qrcode.jpg" />
                </div>
            </div>
        </div>
    </div>
</div>

@code {
    /// <summary>
    /// 是否隱藏
    /// </summary>
    private bool IsHidden = true;

    /// <summary>
    /// 二維碼CSS
    /// </summary>
    private string QrCodeCssClass => IsHidden ? "hidden" : null;

    /// <summary>
    /// 鼠標移入移出操作
    /// </summary>
    private void Hover() => IsHidden = !IsHidden;
}

菜單显示與隱藏

菜單是在小屏幕上才會出現的,相信看完了二維碼的显示與隱藏,這個菜單的显示與隱藏就好辦了吧,實現方法是一樣的,菜單按鈕是在頭部組件Header.razor中的,包括主題切換功能,所以下面代碼都在Header.razor裏面。

@code {
    /// <summary>
    /// 下拉菜單是否打開
    /// </summary>
    private bool collapseNavMenu = false;

    /// <summary>
    /// 導航菜單CSS
    /// </summary>
    private string NavMenuCssClass => collapseNavMenu ? "active" : null;

    /// <summary>
    /// 显示/隱藏 菜單
    /// </summary>
    private void ToggleNavMenu() => collapseNavMenu = !collapseNavMenu;
}

默認是不打開的,collapseNavMenu = false。然後根據collapseNavMenu值為NavMenuCssClass給定不同的class。

...
<nav class="navbar-mobile">
    <div class="container">
        <div class="navbar-header">
            <div>
                <NavLink class="menu-item" href="" Match="NavLinkMatch.All">阿星Plus</NavLink>
                <NavLink>&nbsp;·&nbsp;Light</NavLink>
            </div>
            <div class="menu-toggle" @onclick="ToggleNavMenu">&#9776; Menu</div>
        </div>
        <div class="menu @NavMenuCssClass">
            <NavLink class="menu-item" href="posts">Posts</NavLink>
            <NavLink class="menu-item" href="categories">Categories</NavLink>
            <NavLink class="menu-item" href="tags">Tags</NavLink>
            <NavLink class="menu-item apps" href="apps">Apps</NavLink>
        </div>
    </div>
</nav>
...

與二維碼显示與隱藏唯一區別就是這裡是點擊按鈕,不是移入移出,所以菜單显示與隱藏需要用到@onclick方法。

主題切換

哇,這個主題切換真的是一言難盡,當切換主題的時候需要記住當前的主題是什麼,當刷新頁面或者跳轉其他頁面的時候,主題狀態是需要一致的,默認是白色主題,當切換暗黑色主題后其實是在body上加了一個class。

在Blazor實在是不知道用什麼辦法去動態控制body的樣式,所以這裏我想到了一個辦法,寫幾個全局的JavaScript方法,然後再Blazor中調用,要知道,他們是可以互相調用的,於是問題迎刃而解。

添加app.js文件,放在 /wwwroot/js/ 下面。

var func = window.func || {};

func = {
    setStorage: function (name, value) {
        localStorage.setItem(name, value);
    },
    getStorage: function (name) {
        return localStorage.getItem(name);
    },
    switchTheme: function () {
        var currentTheme = this.getStorage('theme') || 'Light';
        var isDark = currentTheme === 'Dark';

        if (isDark) {
            document.querySelector('body').classList.add('dark-theme');
        } else {
            document.querySelector('body').classList.remove('dark-theme');
        }
    }
};

這裏寫了三個方法,設置localStorage:setStorage(name,value),獲取localStorage:getStorage(name),切換主題:switchTheme(),localStorage 是瀏覽器以 name:value 形式的本地存儲對象。

switchTheme主要做的事情就是,判斷當前主題如果是暗黑,就給body加上對應的class,如果不是就去掉。

然後在 index.html 中引用。

...
<body>
    <app>
        <div class="loader"></div>
    </app>
    <script src="js/app.js"></script>
    <script src="_framework/blazor.webassembly.js"></script>
</body>
...

有了這個三個全局的JavaScript方法,切換主題就變得簡單多了,看代碼。

...
/// <summary>
/// 當前主題
/// </summary>
private string currentTheme;

/// <summary>
/// 初始化
/// </summary>
/// <returns></returns>
protected override async Task OnInitializedAsync()
{
    currentTheme = await JSRuntime.InvokeAsync<string>("window.func.getStorage", "theme") ?? "Light";

    await JSRuntime.InvokeVoidAsync("window.func.switchTheme");
}
...

注意在Blazor調用JavaScript方法需要注入IJSRuntime接口,@inject IJSRuntime JSRuntime

新建一個變量currentTheme,在生命周期函數初始化的時候去調用JavaScript中的getStorage方法,獲取當前主題,考慮到第一次訪問的情況,可以給一個默認值為Light,表示白色主題,然後再去調用switchTheme,執行切換主題的方法。這樣頁面就會根據localStorage的值來確定當前的主題。

...
/// <summary>
/// 切換主題
/// </summary>
private async Task SwitchTheme()
{
    currentTheme = currentTheme == "Light" ? "Dark" : "Light";

    await JSRuntime.InvokeVoidAsync("window.func.setStorage", "theme", currentTheme);

    await JSRuntime.InvokeVoidAsync("window.func.switchTheme");
}
...

SwitchTheme()是切換主題的方法,當我們點擊input按鈕時可以任意切換,並且主題還要實時跟着變化。

當點擊按鈕執行SwitchTheme()時候改變currentTheme的值,然後將currentTheme傳遞給JavaScript方法setStorage,最後再次執行切換主題的JavaScript方法即可。

此時變量currentTheme也發揮了不少作用,在小屏幕下會显示當前主題的名稱,Dark or Light,可以直接將currentTheme在HTML中賦值即可。

並且我們input是checkbox類型,當是黑色主題的時候需要時選中的狀態,白色主題的時候不選中,這裏就可以利用checked屬性這樣寫:checked="@(currentTheme == "Dark")"

<nav class="navbar">
    <div class="container">
       ...
        <div class="menu navbar-right">
           ...
            <input id="switch_default" type="checkbox" class="switch_default" @onchange="SwitchTheme" checked="@(currentTheme == "Dark")" />
            <label for="switch_default" class="toggleBtn"></label>
        </div>
    </div>
</nav>
<nav class="navbar">
    <div class="container">
       ...
        <div class="menu navbar-right">
           ...
            <input id="switch_default" type="checkbox" class="switch_default" @onchange="SwitchTheme" checked="@(currentTheme == "Dark")" />
            <label for="switch_default" class="toggleBtn"></label>
        </div>
    </div>
</nav>
<nav class="navbar-mobile">
    <div class="container">
        <div class="navbar-header">
            <div>
                <NavLink class="menu-item" href="" Match="NavLinkMatch.All">阿星Plus</NavLink>
                <NavLink @onclick="SwitchTheme">&nbsp;·&nbsp;@currentTheme</NavLink>
            </div>
            <div class="menu-toggle" @onclick="ToggleNavMenu">&#9776; Menu</div>
        </div>
        <div class="menu @NavMenuCssClass">
            ...
        </div>
    </div>
</nav>

OK,搞定,快去試試吧。

優化代碼

現在看起來亂亂的,並且設置獲取localStorage屬於公共的方法,說不定以後也能用到,我們將其封裝一下,便於日後的調用,不然要寫好多重複的代碼。

在Blazor項目根目錄添加文件夾Commons,在文件夾下添加一個Common.cs,目前用到了IJSRuntime,用構造函數注入,然後寫幾個公共的方法。

//Common.cs
using Microsoft.JSInterop;
using System.Threading.Tasks;

namespace Meowv.Blog.BlazorApp.Commons
{
    public class Common
    {
        private readonly IJSRuntime _jsRuntime;

        public Common(IJSRuntime jsRuntime)
        {
            _jsRuntime = jsRuntime;
        }

        /// <summary>
        /// 執行無返回值方法
        /// </summary>
        /// <param name="identifier"></param>
        /// <param name="args"></param>
        /// <returns></returns>
        public async ValueTask InvokeAsync(string identifier, params object[] args)
        {
            await _jsRuntime.InvokeVoidAsync(identifier, args);
        }

        /// <summary>
        /// 執行帶返回值的方法
        /// </summary>
        /// <typeparam name="TValue"></typeparam>
        /// <param name="identifier"></param>
        /// <param name="args"></param>
        /// <returns></returns>
        public async ValueTask<TValue> InvokeAsync<TValue>(string identifier, params object[] args)
        {
            return await _jsRuntime.InvokeAsync<TValue>(identifier, args);
        }

        /// <summary>
        /// 設置localStorage
        /// </summary>
        /// <param name="name"></param>
        /// <param name="value"></param>
        /// <returns></returns>
        public async Task SetStorageAsync(string name, string value)
        {
            await InvokeAsync("window.func.setStorage", name, value);
        }

        /// <summary>
        /// 獲取localStorage
        /// </summary>
        /// <param name="name"></param>
        /// <returns></returns>
        public async Task<string> GetStorageAsync(string name)
        {
            return await InvokeAsync<string>("window.func.getStorage", name);
        }
    }
}

然後需要在Program.cs中注入。

using Meowv.Blog.BlazorApp.Commons;
using Microsoft.AspNetCore.Components.WebAssembly.Hosting;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Net.Http;
using System.Threading.Tasks;

namespace Meowv.Blog.BlazorApp
{
    public class Program
    {
        public static async Task Main(string[] args)
        {
            var builder = WebAssemblyHostBuilder.CreateDefault(args);
            builder.RootComponents.Add<App>("app");

            builder.Services.AddTransient(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) });

            builder.Services.AddSingleton(typeof(Common));

            await builder.Build().RunAsync();
        }
    }
}

緊接着在_Imports.razor中注入使用Common@inject Commons.Common Common

改造一下Header.razor,全部代碼如下:

<header>
    <nav class="navbar">
        <div class="container">
            <div class="navbar-header header-logo">
                <NavLink class="menu-item" href="/" Match="NavLinkMatch.All">
                    阿星Plus
                </NavLink>
            </div>
            <div class="menu navbar-right">
                <NavLink class="menu-item" href="posts">Posts</NavLink>
                <NavLink class="menu-item" href="categories">Categories</NavLink>
                <NavLink class="menu-item" href="tags">Tags</NavLink>
                <NavLink class="menu-item apps" href="apps">Apps</NavLink>
                <input id="switch_default" type="checkbox" class="switch_default" @onchange="SwitchTheme" checked="@(currentTheme == "Dark")" />
                <label for="switch_default" class="toggleBtn"></label>
            </div>
        </div>
    </nav>
    <nav class="navbar-mobile">
        <div class="container">
            <div class="navbar-header">
                <div>
                    <NavLink class="menu-item" href="" Match="NavLinkMatch.All">阿星Plus</NavLink>
                    <NavLink @onclick="SwitchTheme">&nbsp;·&nbsp;@currentTheme</NavLink>
                </div>
                <div class="menu-toggle" @onclick="ToggleNavMenu">&#9776; Menu</div>
            </div>
            <div class="menu @NavMenuCssClass">
                <NavLink class="menu-item" href="posts">Posts</NavLink>
                <NavLink class="menu-item" href="categories">Categories</NavLink>
                <NavLink class="menu-item" href="tags">Tags</NavLink>
                <NavLink class="menu-item apps" href="apps">Apps</NavLink>
            </div>
        </div>
    </nav>
</header>

@code {
    /// <summary>
    /// 下拉菜單是否打開
    /// </summary>
    private bool collapseNavMenu = false;

    /// <summary>
    /// 導航菜單CSS
    /// </summary>
    private string NavMenuCssClass => collapseNavMenu ? "active" : null;

    /// <summary>
    /// 显示/隱藏 菜單
    /// </summary>
    private void ToggleNavMenu() => collapseNavMenu = !collapseNavMenu;

    /// <summary>
    /// 當前主題
    /// </summary>
    private string currentTheme;

    /// <summary>
    /// 初始化
    /// </summary>
    /// <returns></returns>
    protected override async Task OnInitializedAsync()
    {
        currentTheme = await Common.GetStorageAsync("theme") ?? "Light";

        await Common.InvokeAsync("window.func.switchTheme");
    }

    /// <summary>
    /// 切換主題
    /// </summary>
    private async Task SwitchTheme()
    {
        currentTheme = currentTheme == "Light" ? "Dark" : "Light";

        await Common.SetStorageAsync("theme", currentTheme);

        await Common.InvokeAsync("window.func.switchTheme");
    }
}

實現過程比較簡單,相信你絕對學會了。本篇就到這裏了,未完待續…

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

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

【其他文章推薦】

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

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

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

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

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

※回頭車貨運收費標準

10幾萬就想買個好看又踏實的家用車,怪不得大家都買他們…

58萬元,在推出第二年才推出了自動擋車型,可能因為自動變速箱實在不行,在往後的幾年推出新款就再也沒推出過自動擋車型了,直到15年的時候擁有一定的調校技術和資源才推出了自動擋車型,也開始陸續地“開枝散恭弘=叶 恭弘”,紅標、藍標、運動版逐漸現世,但依然不太推薦自動擋車型,兩百塊能跑四百公里和只能跑300公里相比,你會怎麼選。

“,我要買哈弗H6!”

“哦?那你想買哪個版本?”

“啊?怎麼說?”

“哈弗H6有紅標運動版、藍標運動版、升級版、柴油版、Coupe車型….”

“……”

11月份哈弗H6賣出了7.03萬輛

排在國內熱銷SUV排行榜榜首

銷量超過了第二名的傳祺GS4兩倍有餘

為什麼哈弗H6這麼多人買?

因為它賣得火啊!

全文終。

自2011年哈弗H6在長城天津工廠下線以來,一步步地成為國內SUV市場的爆款,在2015年哈弗H6累計銷量破百萬,這是自主品牌的銷量神話…

哈弗H6犹如是淘寶中慢慢蛻變爆款的商品,在SUV市場還沒全面興起的時候,恰好在這個時間上架,也憑藉一些實力做出了一些口碑,可以理解為“刷”好評。消費者要買想SUV,首先看的是SUV銷量排行榜,其次是看口碑,十個口碑中有六個好評其實已經引起消費者的好感和購買慾望,這是大部分中國消費者的消費習慣。

▲哈弗H6符合國人口味的外觀

▲哈弗H6不俗的內飾

口碑是可以“刷”出來的,但也需要用實力去支撐,哈弗H6也有它的“過人之處”,多重的因素令它成為了最成功的SUV車型之一。每一個商家不會放過任何一個有爆款潛力的商品,更何況是已經成為爆款的商品,更是加大投入推廣和改進,爭取獲得更好的銷量成績。

▲哈弗H6 COUpE車型

11年上市的哈弗H6隻有兩個版本,分別是2.0L和2.0T的發動機,只有手動擋配置,當時國內的自動變速箱技術還真不夠成熟,所以那時候大部分自主車型都是手動擋,畢竟机械離合器構造簡單成本低。價錢也不低,當時候最低配也要9.58萬元,在推出第二年才推出了自動擋車型,可能因為自動變速箱實在不行,在往後的幾年推出新款就再也沒推出過自動擋車型了,直到15年的時候擁有一定的調校技術和資源才推出了自動擋車型,也開始陸續地“開枝散恭弘=叶 恭弘”,紅標、藍標、運動版逐漸現世,但依然不太推薦自動擋車型,兩百塊能跑四百公里和只能跑300公里相比,你會怎麼選?手動擋剛開始接觸可能稍難上手一些,但用得久了,其實真沒什麼,這是很多開手動擋車的老司機原話。

現在很多更新換代的車型無非就是稍微改改外觀內飾,增加或減少配置控制整車成本,都是這樣的一個套路,哈弗H6這麼多款版本車型也不例外,無論是外觀和內飾配置怎麼變怎麼改,都是用那套原來舊的動力總成、懸架甚至是車身結構,並沒有“改頭”只是“換臉”而已。眾所周知大部分自主品牌使用的動力總成大多都是合資品牌的老舊技術,質量過關耐用,但就是跟不上時代的步伐,就拿國內的2.0T發動機和本田的2.0T發動機相比,真的是天地之別。

奈何,國人的用車習慣就是車能跑得快、空間夠大人坐得舒服也載得多人,其次還有外觀要好看霸氣有面子,重點還要價錢不能高,所以十來萬的SUV最符合國人的口味,哈弗H6就是這樣符合國情,但真要說人生第二台車會不會選哈弗,相信很多消費者都是否定的。

再來說說轎車吧,轎車一直都不是自主品牌的強悍,SUV市場一片繁華,但轎車方面還是十分中庸,11月份轎車銷量排行榜十中有九都是合資品牌,都是我們熟悉的軒逸、朗逸、速騰、英朗等等一直很火的十來萬緊湊型車。

▲日產軒逸-11月份轎車排行榜銷量冠軍

轎車銷量排行榜前十名的銷量並沒有SUV排行榜那麼懸殊,都是賣出三、四萬台這樣,日產軒逸賣出4.52萬輛排在第一,對於部分抵制日貨的消費者來說很氣,但日系車特別符合家庭用車習慣這是最大的事實,賣出一台日系車日本賺到的利潤遠遠比不上我們自己國家收的稅多,這裏就不往下說了,日系車還是賣得很好,證明大部分消費者都是理性消費的。

▲國人的用車還是以家庭為主

中國家庭就是需要一台看着大氣開起來舒服又省油的轎車,車價在10-15萬元是國人最能接受的區間,首付供車壓力不算大,全款支付也並不需要N+1年才能實現“有車一族”,所以轎車銷量排行榜中車型都涉及到這個車價區間,這也是國內汽車市場最受歡迎的價格區間。

你想問轎車銷量排行榜裏面哪款車比較好?不吹不黑告訴你們,這些車都差不多,很適合家庭用車,如果你想從中選一台,可以按以下步驟:

第一、從外觀入手,除了自己的審美之外,問問父母的意見(僅僅外觀一項)有女朋友的問女朋友有老婆的問老婆,從中挑幾款順眼好看的車型;

第二、到4S店靜態體驗,空間大小和座椅的舒適性比較,當然最好也能帶上父母或者老婆,畢竟以後他們都會坐上你的車;

第三、看手頭的預算,挑配置,配置不用多夠用就好,省點總比亂花好;

第四、道路試駕,其中十來萬的合資車開起來差不到哪裡去,省油才是最關鍵,其次感受一下車輛的濾震,挑開起來順手最舒服的那台絕對沒錯;

第五、看中哪個配置車型就可以跟銷售砍價了。

有個性的車,例如外觀極端,不管是好看還是難看,基本都賣不好,自然成為了小眾車型。國人的審美逐漸被常見的車型平淡化,你覺得這輛車個性又獨特,但當你真正需要買車的時候不會想到這些小眾的車型,除非是價錢吸引到你,大多人都會回歸到銷量排行榜中,這是一種依賴的心理效應,總覺得賣得好的車就是最靠譜的車,至少不會因為自己的選擇而後悔,就算是後悔也有一大把人陪自己呢,車子出問題了大不了跟“同病相憐”的一起抱怨罷了。

總結:SUV或轎車也好,其實不必要太糾結每個月的銷量排行榜,我們可以將它作為我們買車的參考,而不是將它作為我們買車的標準,選擇自己真心喜歡的車型,沒必要迎合他人的口味。榜上有名的車型自然有它們存在的道理,這裏不談它們的優點或缺點,畢竟人無完人,車也一樣嘛!本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

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

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

※超省錢租車方案

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

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

※回頭車貨運收費標準

買了小排量就鐵定省油?天真!

5排量啊,還帶T,聽起來像思域的那台哦。你跟我談油耗。看下F1的發動機怎麼噴油的。F1的百公里油耗差不多在50—70升。你跟我說小排量省油。所以發動機的油耗與排量沒有最直接的關係,而是發動機做功的多少,我們都知道能量守恆定律。

這两天由於各個地方的霧霾,大排量的汽車又被推上風口浪尖,甚至引起不少所謂的微博大V撕逼。還有所謂的大學生上街遊行抵制大排量。

以往說到大排量就會想到油老虎,確實,我們所見到的大排量的車要麼是跑車。

要麼是旗艦級的豪車。

還有“美國車”。

首先發動機的排量是個什麼東西呢?今天就不列公式裝逼了。打個簡單的比方,如果說小排量是瘦子。

那麼大排量就像胖子。

同樣吃一個大蛋糕,大排量每一口吃得更多,小排量每口吃得更少,所以胖子吃得更快。不過即使這樣,只要時間充足,瘦子最後也能把蛋糕吃完。

這也是我們大多數人的印象,大排量發動機動力更好,車跑得更快,但是油耗更高。

為什麼會有大排量就鐵定高耗油的定論呢?因為胖子嘴大,餓起來連自己都吃,所以每一口吃得多,你要讓豬八戒把人蔘果分兩口吃肯定不可能。

而瘦子則可以每次吃半口,如果感覺有點飽了接下來的半口可以留着不吃。理論上聽着確實很省。

但是為什麼現在很多朋友買了1.2T三缸和1.5T四缸,發現並沒有想象中省油呢?先不說那所謂的“工信部油耗”。

我們上面也說了,從A到B就像吃吃一塊蛋糕,如果每一口吃得多,那麼肯定吃得快,要是小排量也想和大排量一起吃完,那就必須吃得更快,所以像之前說的1050馬力的本田1.5T F1發動機工作轉速就高達14000轉。1.5排量啊,還帶T,聽起來像思域的那台哦。

你跟我談油耗?看下F1的發動機怎麼噴油的!

F1的百公里油耗差不多在50—70升。你跟我說小排量省油?所以發動機的油耗與排量沒有最直接的關係,而是發動機做功的多少,我們都知道能量守恆定律。要想馬兒跑得快肯定要讓馬多吃草。那麼市面上的小排量發動機的優勢在哪裡呢?我們會發現大排量的車發動機也是多缸數,3.0以上排量就肯定是6缸了,4.0以上至少8缸,再往上就12缸,還是那句老話,馬力大十匹不如體重減十斤。12缸畢竟缸數在這裏,所以像3缸4缸發動機在自重上佔有不少優勢。如果兩台發動機功率一樣,那麼重量更輕的在油耗上肯定佔有優勢。

所以發動機的油耗是看做功的多少,(做功的多少又關係發動機的熱效率)那麼做的功多少能用到輪上又考慮到變速箱和輪胎等多方面因素了,一台車是否省油還是看你怎麼開,只是小排量更容易開出低油耗。

如果你經常切二擋。

2.0也可以開出6.0的油耗。

如果你只是當做一個從A到B的工具,能動就可以,不追求什麼加速能力,推背感,6.0也可以開出2.0的油耗。

就像以前手機還是2G網絡的時候一個月30M都用不完,現在用上4G一個月10G也不夠。

而那些把空氣污染和霧霾全部歸咎於汽車排放的人,看了下面的成績單,是不是說明邯鄲的汽車排放是北京的3倍呢?

那如果霧霾的罪魁禍首不是汽車又是誰呢?

本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

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

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※回頭車貨運收費標準

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

※超省錢租車方案

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

“小7系”降臨,E級顫抖了嗎?!全新寶馬5系Li揭開面紗!

而在動力總成方面,預計未來國產長軸距版車型將搭載不同功率調校的全新2。0T發動機以及3。0T發動機。與發動機匹配的有望是8速自動變速箱,部分車型還將搭載四驅系統。新5系標準軸距版海外的5系標準軸距版將於2017年2月在歐洲率先開售,起售價為36025英鎊,摺合人民幣29。

日前,華晨寶馬公布了一張國產全新5系Li長軸距版車型的官方圖片。新車針對中國消費者喜好,在全新一代寶馬5系標準軸距版的基礎上進行軸距加長打造而成。有消息稱全新5系Li有望在2017年4月的上海車展首發亮相,並且預計在2017年6月正式上市。

全新5系Li

在外觀方面,全新5系Li與標準軸距版幾乎保持一致,標誌性的雙腎型進氣格柵,開眼角式大燈,貫穿全車的側面腰線,前輪後方的氣流出口,儼然在向大哥7系看齊。

新5系標準軸距版

7系

內飾方面,預計也會和標準軸距版保持一致,延續新7系的設計語言,豪華之餘充滿科技感。略偏向駕駛者的中控布局,懸浮式中控大屏,全新設計的多功能方向盤,以及整體的飾料風格和色彩搭配,讓人一眼看上去很容易以為就是7系的內飾。

新5系標準軸距版

7系

配置方面,新車預計將配備多種新7繫上的高科技配置,如手勢控制、遙控泊車、遠程3D視角、HUD抬頭显示、夜視系統等。

而在動力總成方面,預計未來國產長軸距版車型將搭載不同功率調校的全新2.0T發動機以及3.0T發動機。與發動機匹配的有望是8速自動變速箱,部分車型還將搭載四驅系統。

新5系標準軸距版

海外的5系標準軸距版將於2017年2月在歐洲率先開售,起售價為36025英鎊,摺合人民幣29.67萬元,而國內售價則尚未公布。用5系的價格買到一輛“小7系”,這種越級的體驗不再是奔馳E級一家獨大,相信隨着全新寶馬5系Li的推出,國內C級豪華轎車市場的競爭會越發激烈。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※超省錢租車方案

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

※回頭車貨運收費標準

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

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

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

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

廿年輝煌 經典再鑄 經典全順入駐上海汽車博物館

不僅如此,福特全順還與2016年G20杭州峰會形成戰略合作關係,成為其指定用車,被授予“G20杭州峰會指定產品”榮譽證書。此次全順榮耀慶典的最大亮點,即是全順系列明星車型—經典全順順利入駐上海汽車博物館,被該館永久收藏。

全順是福特和江鈴汽車合資主打商用車的品牌,在大街上也經常能看到,特別的是改裝款車型如運鈔車、救護車、警車等。在中國市場銷售已經近20年,累計銷售50萬台,一直在輕客市場保持着銷量冠軍,而且這20年中幾乎沒有改款,堪稱經典。

你的名字,經典全順;我的名字,福特新全順。今日,所有的經典終得圓滿,所有的榮耀終被典藏,所有的傳奇將被傳承!12月20日,“福特新全順,榮耀永傳承”2016福特全順榮耀慶典活動在江鈴小藍工廠成功舉辦,經典全順榮耀版順利入駐上海汽車博物館,50萬銷量傳奇銘記成永恆。

福特全順,這款在國內被稱為歐系輕客先驅者的商用車,以經典鑄造經典,給車主創造財富的同時,成為中國經濟騰飛的創造者和見證者。福特新全順,這款專業高效的多功能商用車,以傳承實現超越,提升車主用車價值的同時,推動物流業升級轉型,打造物流新價值。

披荊斬棘,福特全順終得圓滿

自1965年第一輛福特全順從英國蘭利工廠正式下線,歷經半個世紀的品質錘鍊,已經是福特旗下最暢銷的商用車品牌。2013年北美福特毅然用歐洲福特的全順接替了旗下商用車E-series,使全順真正成為了一款福特品牌全球車。憑藉全球熱銷800萬輛的傲人成績,福特全順成為迄今為止銷量最大的商用車品牌,甚至於全順的英文名字“Transit”成了歐洲同類車型的代名詞。

經過不斷磨礪,積澱實力,1976年福特全順獲得首個百萬用戶群,到2005年全順誕生40周年之際,第500萬輛全順從英國南安普頓工廠順利下線。從2010年銷量600萬輛到2013年6月第700萬輛在南昌小藍工廠下線,短短3年間全順銷量增加了100萬輛。之後又經過短短2年,2015年全順全球銷量順利突破800萬輛,成為引領全球的高端商用車領導品牌,全順實力,終得圓滿。

輝煌廿年,經典全順榮耀典藏

傳承歐洲福特純正血統,秉持歐洲品質創新研發的福特全順,進入國內短短的20年間,憑藉堅強品質、出色性能和多功能優勢,從0個車主發展到50萬個車主,實現從質變到量變的轉化,成為輕客市場的銷量“傳奇”。其實,福特全順進入國內20年以來,連續蟬聯歐系輕客銷量冠軍,是國內輕客市場的領軍品牌,收穫無數獎項,斬獲無數榮耀。不僅如此,福特全順還與2016年G20杭州峰會形成戰略合作關係,成為其指定用車,被授予“G20杭州峰會指定產品”榮譽證書。

此次全順榮耀慶典的最大亮點,即是全順系列明星車型—經典全順順利入駐上海汽車博物館,被該館永久收藏。據了解,上海汽車博物館對於展示車輛極其嚴格,收藏的均是具有代表性和貢獻意義的20餘個品牌的近百輛經典古董車。因此,經典全順能夠入駐上海汽車博物館,是對福特品牌和江鈴製造的高度認可,對福特全順的發展之路有着深遠意義。

繼往開來,福特新全順重鑄華本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

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

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

※回頭車貨運收費標準

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

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

想買德系SUV的考慮一下是不是把錢留到2017年?

SUV陣營上汽大眾途觀L新款途觀的上市可以說是眾多合資SUV潛在買家“千呼萬喚始出來”的角色,繼全進口的tiguan公布售價之後,合資的國產途觀也緊隨着將在2017年年初上市。新平台,新外觀,跨越級別的車身尺寸是途觀L的最大武器,2791mm的軸距已然超越中型SUV的標杆車型漢蘭達,儘管是僅僅1mm的差距,但也足以看出途觀意圖跨級競爭的決心。

不知從什麼時候開始,“買車就買德系車”,成為了很多家庭和個人的購車第一主觀反應,也不得不承認德系車擁有着相當大的一波粉絲。

轎車陣營

一汽大眾CC

現款大眾CC也確實接近於全新換代的時間臨界點,雖然是每年都有小改動,但都是同一代車型,預計將在明年年中,據悉,一汽大眾CC的全新換代車型將在2017年上半年正式下線。

一汽大眾全新CC將基於MQB平台生產,從國外媒體所透露出來的渲染圖可見,溜背式的轎跑造型依然還是大眾CC的主體語言,全新一台CC設計方面借鑒了很多大眾sport Coupe GTE概念車的元素;根據之前已經得到的消息,新CC將在2017年實現國產。

寶馬1系三廂

三廂版本的國產寶馬1系可以說是寶馬品牌寄予厚望的一跨車型,該車亮相於今年十一月的廣州車展,預計將於2017年年初就正式上市。

1系三廂版本基於寶馬UKL前驅平台生產,儘管是前驅,但它依然是一款強調着運動感和操控性的緊湊型三廂轎車,至於未來價格和實際動態表現究竟如何,着實令人期待。

SUV陣營

上汽大眾途觀L

新款途觀的上市可以說是眾多合資SUV潛在買家“千呼萬喚始出來”的角色,繼全進口的tiguan公布售價之後,合資的國產途觀也緊隨着將在2017年年初上市。

新平台,新外觀,跨越級別的車身尺寸是途觀L的最大武器,2791mm的軸距已然超越中型SUV的標杆車型漢蘭達,儘管是僅僅1mm的差距,但也足以看出途觀意圖跨級競爭的決心。

上汽大眾Teramont

Teramont是上汽大眾進軍中大型SUV市場的強力車型,車身長度超過5米,定位比途觀還要高半個級別,儘管沒有正式發布,但不出意外的話,這款SUV將於明年上半年跟公眾見面。

至於價格,小編猜測這麼大的一台大眾,怎麼著也要四十多萬吧。

斯柯達科迪亞克

儘管斯柯達是一個捷克斯洛伐克的品牌,但畢竟是基於大眾的生產技術,所以把它歸類於德系車也不為過。

科迪亞克是斯柯達的第一台擁有七座的SUV,產品定位與途觀L一樣,生產平台也共享自大眾集團MQB橫置模塊箱平台,由於品牌定位原因,很多人猜測科迪亞克的定價應該會比較親民,承載了相當高關注度的科迪亞克,屆時上市價格希望不會令人失望才好。

本次介紹的車型僅是德系車的一部分在國內可以購買到合資的車型,價格在正式上市之後比全進口的德系車要便宜不少,相信在SUV極度火爆的中國市場,那幾款SUV的正式亮相才是廣大消費者更為關注的新聞,如果在今年尋覓不到心中所想,或許耐心等到明年,這些產品力進一步提升的新款車型上市之後,就可以“找到真愛”啦~本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

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

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

※回頭車貨運收費標準

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

※超省錢租車方案

虎眼看中國中國SUV新標杆瑞虎7華南試駕會精彩大趴

0DVVT+CVT、1。5T+DCT三種動力組合。1。5T高性能渦輪增壓發動機搭配愛信6速手動變速箱,油耗低至百公里6。3L。瑞虎7后懸採用多連桿獨立懸架+副車架結構,令整車的操控樂趣與駕乘舒適性完美統一。科技配置及安全性方面,瑞虎7搭載了Cloudrive2。

2016年12月18日,奇瑞瑞虎7千人交車儀式暨試駕會在花園城市東莞隆重舉行。近三百輛嶄新的瑞虎7正式交付東莞車主。

12月18日對於奇瑞汽車來說,一個非常特別的日子,1999年12月18日奇瑞汽車第一台整車下線,時至今天—2016年12月18日,奇瑞公司在大家的陪伴下走過了整整19個年頭,以榮獲日內瓦國際車展設計大獎TX概念車為原型的瑞虎7,瑞虎7自9月20日上市以來,上市首月客戶訂單突破2萬台,受到廣大車友的一致追捧,其前瞻性動感造型,出色動力及精準操控,滿足多樣化駕控需求、科技智慧帶來便捷行車生活。瑞虎7的上市熱銷,標志著奇瑞汽車創下中國車企造車水平的又一新高度。

伴隨着動感的音樂,瑞虎7千人交車儀式正式開始,華南大區總經理翟小兵先生為今天活動致辭,一起見證瑞虎7千人交車活動的珍貴瞬間。

瑞虎7不僅是奇瑞歷史上最好的產品,更是中國品牌標杆產品之一。作為奇瑞進入戰略2.0后的首款SUV車型,瑞虎7是在“大奇瑞”國際化團隊協作下,融合捷豹路虎、觀致技術流程開發的專業SUV平台——奇瑞T1X平台開發的首款產品。以未來派前瞻美學的設計風格、自主領先,超越合資的整體性能,實現了品質與品位的完美統一。

在全廣東媒體和現場上百人的見證下,奇瑞汽車廠家領導將瑞虎7車鑰匙交給首批東莞瑞虎7車主,恭喜進300名瑞虎7車主“金”日提車。

瑞虎7上市熱銷,兼具顏值和實力 榮耀之作樹立中國SUV新標杆。

外形方面,轎跑風的“水流”車身設計、側身極速破浪式躍動腰線、超凡奪目的三叉戟式氙氣大燈配虎爪矩陣式LED尾燈,盡顯霸氣與精緻。

動力操控方面,瑞虎7搭載了1.5T+6MT、2.0DVVT+CVT、1.5T+DCT三種動力組合。1.5T高性能渦輪增壓發動機搭配愛信6速手動變速箱,油耗低至百公里6.3L。瑞虎7后懸採用多連桿獨立懸架+副車架結構,令整車的操控樂趣與駕乘舒適性完美統一。

科技配置及安全性方面,瑞虎7搭載了Cloudrive2.0智雲互聯行車系統,採用9英寸超大電容觸摸真彩高清屏,內置4G無線網卡,為全車用戶提供高速流暢的互聯體驗,打造全時在線生活。

瑞虎7採用6D縱梁框架和3R-Body的一體化籠式高強度車身結構,有效提高正側面撞擊的抗擊能力。全系標配ESp电子車身穩定系統、HHC上坡起步輔助系統、TpMS智能胎壓監測系統、前後8探頭雷達,高配車型還裝備了360°全景式影像系統、實時監測車身周邊障礙物,由內而外保護車內乘員的人身安全。

瑞虎7堪稱瑞虎家族“十年磨一劍”的蛻變之作,是一款具有划時代意義的精品SUV。市場對瑞虎7充滿了期待,瑞虎7上市熱銷也給出了完美的交代。瑞虎7在高速增長又競爭激烈的SUV市場中扮演了一名狠角色。已成為中國SUV市場新標杆,征服華南區SUV市場。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※回頭車貨運收費標準

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

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

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

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

Jmeter(八) – 從入門到精通 – JMeter配置元件(詳解教程)

1.簡介

JMeter配置元件可以用來初始化默認值和變量,讀取文件數據,設置公共請求參數,賦予變量值等,以便後續採樣器使用。將在其作用域的初始化階段處理。配置元件(Config Element)提供對靜態數據配置的支持,可以為取樣器設置默認值和變量。

首先我們來看一下JMeter的配置元件,路徑:添加-配置元件;我們可以清楚地看到JMeter5中共有19個配置元件,如下圖所示:

如果上圖您看得不是很清楚的話,宏哥總結了一個思維導圖,關於JMeter5的配置元件類型,如下圖所示:

 通過以上的了解,我們對配置元件有了一個大致的了解和認識。下面宏哥就給小夥伴或則童鞋們分享講解一些通常在工作中會用到的配置元件。

 2.常用配置元件詳解

  這一小節,宏哥就由上而下地詳細地講解一下常用的配置元件。

2.1CSV Data Set Config

1、我們先來看看這個CSV Data Set Config長得是啥樣子,如下圖所示:

 2、參數詳解及說明,如下錶所示:

參 數 描 述 是否必填
Name 腳本中显示的這個元件的描述性名稱
Filename 待讀取文件的名稱。可以寫入絕對路徑,也可以寫入相對路徑(相對於bin目錄),如果直接寫文件名,則該文件要放在bin目錄中。對於分佈式測試,主機和遠程機中相應目錄下應該有相同的CSV文件
File Encoding 文件讀取時的編碼格式,不填則使用操作系統的編碼格式
Ignore first line 是否忽略首行,如果csv文件中沒有表頭,則選擇false
Variable Names 變量名列表,多個變量名之間必須用分隔符分隔。如果該項為空,則文件首行會被讀取並解析為列名列表
Delimiter 參數分隔符,將一行數據分隔成多個變量,默認為逗號,也可以使用“\t”。如果一行數據分隔后的值比Vairable Names中定義的變量少,這些變量將保留以前的值(如果有值的話)
Allow quoted data? 是否允許變量使用雙引號,允許的話,變量將可以括在雙引號內,並且這些變量名可以包含分隔符
Recycle on EOF? 是否循環讀取csv文件內容,達到文件結尾后,是否從文件開始循環重新讀取;默認為 true
Stop thread on EOF? 是否循環讀取csv文件內容,達到文件結尾后,線程是否該終止;默認為 true
Recycle on EOF? 當Recycle on EOF為False時,停止線程,當Recycle on EOF為True時,此項無意義,默認為 false
Sharing mode 1、All threads(默認):一個線程組內,各個線程(用戶)唯一順序取值;2、current thread:一個線程組內,各個線程(用戶)各自順序取值;3、線程組各自獨立,但每個線程組內各個線程(用戶)唯一順序取值;

 3、Recycle on EOF 和Stop thread on EOF的關係:

當Recycle on EOF 選擇true時,Stop thread on EOF選擇true和false無任何意義,因為既然前面已經設置了文件是不停的循環讀取,後面的控制stop就相當於失效;
當Recycle on EOF 選擇false時,Stop thread on EOF選擇true,則當線程數超過文件里的參數的個數時,實際請求數為參數的個數;
當Recycle on EOF 選擇false時,Stop thread on EOF選擇flase,當線程數超過文件里參數的個數時,實際請求次數為線程數,但當線程數超過參數次數時,由於沒有參數,所以結果仍然是失敗的。
4、Sharing mode:如果希望每個線程擁有自己獨立的值集合,那麼就需要創建一系列數據文件,為每個線程準備一個數據文件,如test1.csv、test2.csv等,使用文件名test${__threadNum}.csv,並將“sharing mode”設置為”Current thread”

All threads:文件在所有線程間共享。

Identifier:所有線程共享相同的標識,共享相同的文件。如有4個線程組,測試人員可以使用一個通用ID,以便在兩個或多個線程組之間共享文件。

Current thread:每個文件會針對每個線程單獨打開。

Current thread group:每個文件會針對每個線程組打開一次。

2.2HTTP Header Manager

支持用戶添加或者重寫HTTP請求頭。JMeter支持多個信息頭管理器。多個信息頭條目合併成一個信息頭列表,跟隨http請求一併提交到服務端。

注意:敲黑板,敲腦殼!!!

(1)當有多個信息頭管理器,且不同的管理器內有名稱相同的信息頭條目存在時,順序靠前的管理器的信息頭條目會覆蓋後面的;

(2)當只有一個信息頭管理器,但管理器內有名稱相同的信息頭條目時,會同時生效;

 1、我們先來看看這個HTTP Header Manager長得是啥樣子,如下圖所示:

 2、參數詳解及說明,如下錶所示:

參數 描述 是否必填
Name 請求頭的名稱,比如Content-Type
Value 請求頭的值,比如application/json

3、常用請求頭,這些一般可以抓包和在瀏覽器中查到,如下錶所示:

2.3HTTP Cookie Manager

主要有兩個功能:

一個功能是:像web瀏覽器一樣存儲和發送Cookie。如果有一個HTTP請求和相應里包含Cookie,Cookie管理器會自動存儲Cookie,那麼接下來針對特定web站點的所有請求中使用該Cookie。可在結果樹中查看。

接收到的Cookie可以被保存為變量,須定義屬性”CookieManager.save.cookie=true”。另外,在被存儲前Cookie名稱會加上前綴“COOKIE_”,要恢復早前處理方式,則定義屬性”CookieManager.name.prefix=”(一個或多個空格)。

如果啟動了該功能,那麼名稱為TEST的Cookie,可以通過${COOKIE_TEST}加以引用。手動為Cookie管理器添加一個Cookie(為所有JMeter線程所共享)。

1、我們先來看看這個HTTP Cookie Manager長得是啥樣子,如下圖所示:

2、參數詳細說明,如下錶所示:

參數 描述 是否必填
Name 樹中显示此元件描述的名稱
Comments 註釋
Clear cookie each Iteration  每次線程組運行前,都會清楚cookie,但是如果是手動添加的cookie,不會被清除
Cookie Policy 選擇Cookie的管理策略,建議選擇兼容性,兼容性強
User Define cookie 用戶自定義cookie

 

2.4HTTP Cache Manager

  被用來為其作用域內的HTTP請求提供緩存功能,如果“Use Cache-Control/Expires header When …”選中,那麼會根據當前時間來選擇,如果請求是”GET”,而時間指向未來,那麼採樣器就會立即返回,而無須從遠程服務器請求URL,這樣是為了模擬瀏覽器的操作,請注意Cache-Control頭必須是“pulic”的,並且只有”max-age”終結選項會被處理,如果請求文檔自從其被緩存以來沒有發生任何改變,那麼響應包體就會為空。

1、我們先來看看這個HTTP Cache Manager長得是啥樣子,如下圖所示:

2、參數詳細說明,如下錶所示:

參數 描述 是否必填
Name 樹中显示此元件的描述性名稱 
Comments 註釋
Clear Cache each iteration 如果選擇此選項,則在線程開始時清除緩存。
Use Cache 如果選擇此選項,則在線程開始時使用緩存。
Max Number 如果選擇此選項,則在線程開始時最大緩存。

 

2.5HTTP Request Defaults

在實際測試計劃中,我們經常會碰到Http Sampler請求有較多的參數與配置會重複,每一個Http Sampler都單獨設置的話比較浪費時間和精力,為了節省工作量,JMeter提供了HTTP Request Defaults元件,用來把這些重複的部分封裝起來,一次設置多次使用。可以設定一些缺省值,假設有10個請求,訪問域名和端口都是一樣的,那HTTP請求中就不再需要單獨配置了,比較方便(增加腳本的移植性)。

這個元件可以設置HTTP請求控制器使用的默認值。例如,圖中【服務器名稱或IP】項目內填入了【example.com】,後面的HTTP請求如果IP也是example.com的話,那麼只要將【服務器名稱或IP】留空,那麼這個字段將自動繼承HTTP請求默認值中的值。其他諸如【協議】、【端口號】、【路徑】等同此。

1、我們先來看看這個HTTP Request Defaults長得是啥樣子,如下圖所示:

2、參數詳細說明,如下錶所示:

參數 描述 是否必填
Name 用作標識一個取樣器,建議使用一個見名知義的名稱
Comments 註釋
Protocol 協議,向目標服務器發送HTTP請求時的協議,可以是http或者是Https  
IP HTTP請求發送的目標服務器名稱或者IP地址  
Port Number 目標服務器端口  
Path 目標URL路徑(不包括服務器地址和端口)  
Content encdoing 內容的編碼方式  
Parameter 參數  
body data 參數  

 

2.6Counter

計數器,顧名思義就是在測試執行過程中會記錄迭代次數。可以在線程組任何位置創建,允許用戶配置起點、最大值和增量。配置后,計數器將從起點循環到最大值,然後重新開始,直到線程結束。允許用戶創建一個計數器,可在線程組中任何地方被引用。

1、我們先來看看這個Counter長得是啥樣子,如下圖所示:

2、參數詳細說明,如下錶所示:

參數 描述 是否必填
Name 控制器名稱,可以隨意設置
Comments 註釋,可以隨意設置
Starting value 啟動,記錄數量起始值  
Increment 遞增,記錄迭代次數步長,1后是2,步長就是1  
Maximum value 記錄的最大值  
Number format 計算器格式,可以是数字,例如000000(6位長度,000,000(6位長度,3位間隔開);字符加数字,例如CUST_000000(字符加6位数字 )  
Exported Variable Name 引用變量名稱,記數器記錄的值可以存入的此引用名(變量),可供其他元件調用  
Track counter independently for each user 與每位用戶獨立的跟蹤計數器,每個線程都有自己的計數器,相互不干擾  
Reset counter on each Thread Group Iteration 每次迭代復原計數器  

 

2.7DNS Cache Manager

1、我們先來看看這個DNS Cache Manager長得是啥樣子,如下圖所示:

2、參數詳細說明,如下錶所示:

參數 描述 是否必填
Name 樹中显示此元件的描述性名稱  
Comments 註釋  
Clear cache each iter 清除每個迭代的緩存,如果選擇此選項,則每次啟動新迭代時,都會清除每個線程的DNS緩存。  
Use System DNS resolver 使用系統DNS解析器;將使用系統DNS解析器。為了正確工作,請編輯 $ JAVA_HOME / jre / lib / security / java.security並添加networkaddress.cache.ttl = 0  
Use custom DNS resolver 使用自定義DNS解析器;將使用自定義DNS解析器(來自dnsjava庫)。  

 

2.8FTP Request Defaults

被用於設置FTP請求的默認值

1、我們先來看看這個FTP Request Defaults長得是啥樣子,如下圖所示:

2.9HTTP Authorization Manager

HTTP認證是一種安全機制,在客戶端、瀏覽器或者程序向服務器發起請求時,需要提供用戶名和密碼且驗證通過(拿到憑證)才能繼續發起交互。

1、我們先來看看這個HTTP Authorization Manager長得是啥樣子,如下圖所示: 

2.10JDBC Connection Configuration

1、我們先來看看這個JDBC Connection COnfiguration長得是啥樣子,如下圖所示: 

 2、關於JDBC Connection COnfiguration參數詳細說明,可以參考宏哥的另一篇文章是非常詳細的:傳送門。

2.11Java Request Defaults

1、我們先來看看這個Java Request Defaults長得是啥樣子,如下圖所示: 

2.12Keystore Configuration

1、我們先來看看這個Keystore Configuration長得是啥樣子,如下圖所示: 

2、參數詳細說明,如下錶所示:

參數 描述 是否必填
Name 樹中显示此元件的描述性名稱。可以默認
Comments 註釋
Preload 預載,是否預加載秘鑰庫,設置為true通常是最佳選擇
Variable name holding certificate alias 變量名稱,將包含用於客戶端證書身份驗證的別名。例如,將從CSV數據集中填充變量值。在屏幕截圖中,“ certificat_ssl”也將是CSV數據集中的變量。
Alias Start index 從0開始在Keystore中使用的第一個鍵的索引。
Alias End index 基於0的密鑰庫中要使用的最後一個密鑰的索引。使用“變量名稱持有證書別名”時,請確保其足夠大,以便在啟動時加載所有密鑰。

 2.13LDAP Extended Request Defaults

1、我們先來看看這個LDAP Extended Request Defaults長得是啥樣子,如下圖所示: 

2.14LDAP Request Defaults

1、我們先來看看這個LDAP Request Defaults長得是啥樣子,如下圖所示: 

2.15Login Config Element

1、我們先來看看這個Login Config Element長得是啥樣子,如下圖所示: 

2.16Random Variable

1、我們先來看看這個Random Variable長得是啥樣子,如下圖所示:

2、參數詳細說明,如下錶所示:  

參數 描述 是否必填
Name 樹中显示的此元件的描述性名稱。  
Comments 註釋  
Variable Name 變量名,存儲隨機字符串的變量的名稱。  
Output Format 格式化字符串,要使用的java.text.DecimalFormat格式字符串。例如,“ 000”將生成至少3位数字,或者“ USER_000”將生成USER_nnn形式的輸出。如果未指定,則默認為使用Long.toString()生成数字。  
Minimum Value 最小值;生成的隨機數的最小值(長整數)。  
Maximum Value 最大值;生成的隨機數的最大值(長整數)。  
Seed for Random function 隨機種子,隨機數生成器的種子。默認值為當前時間,以毫秒為單位。如果在“將每個線程”設置為true的情況下使用相同的種子值,則與“ 隨機” 一樣,您將為earch線程獲得相同的值  
Per Thread(User)? 每個線程,如果為False,則在線程組中的所有線程之間共享生成器。如果為True,則每個線程都有自己的隨機生成器。  

2.17Simple Config Element

1、我們先來看看這個Simple Config Element長得是啥樣子,如下圖所示: 

2、參數詳細說明,如下錶所示:  

參數 描述 是否必填
Name 樹中显示此元件的描述名稱
Comments 註釋
Name 參數名稱  
Value 參數值  

2.18TCP Sampler Config

TCP採樣器配置為TCP採樣器提供默認數據

1、我們先來看看這個TCP Sampler Config長得是啥樣子,如下圖所示:

2、參數詳細說明,如下錶所示: 

參數 描述 是否必填
Name 樹中显示此元件的描述性名稱  
Comments 註釋  
TCPClient classname TCPClient類的名稱,默認屬性tcp.handler,使TCPClientImpl失敗  
Sever Name or IP TCP服務器的名稱或者IP  
Port Number 使用的端口  
Re-use connection 重用連接,如果選擇,則連接保持打開狀態,否則,在讀取數據后將其關閉  
Close connection 關閉連接,如果選擇此項,則在運行採樣器后將連接關閉  
Set NoDelay 設置節點布局,應該設置nodelay  
SO_LINGER 創建套接字時,以指定的延遲時間(以秒為單位)啟用/禁用SO_LINGER。如果將“SO_LINGER”值設置為0,則則可以防止大量套接字處於TIME_WAT 的狀態  
End of line byte value 判斷行結束的byte值,如果你指定的值大於127或者小於-128,則會跳過EOL檢測。比如服務器端返回的字符串都是以回車符結尾,那麼我們可以將該選項設置成10。  
Text to send 文字發送,要發送的文字  
Connect 連接超時(毫秒。0禁用)  
Response 響應超時(毫秒。0禁用)  

2.19User Defined Variables

如果您有多個線程組,請確保對不同的值使用不同的名稱,因為UDV在線程組之間共享。同樣,這些變量在處理完元素之後才可用,因此您不能引用在同一元素中定義的變量。您可以引用在早期UDV或測試計劃中定義的變量。

1、我們先來看看這個User Defined Variable長得是啥樣子,如下圖所示:

2、參數詳細說明,如下錶所示: 

參數 描述 是否必填
Name 樹中显示此元件描述的名稱  
Comments 註釋  
User Define Variables 用戶定義的變量。變量名稱/值對。您需要在$ {…}結構的方括號內放置“名稱”(Name)列下的字符串,以便以後使用變量。然後,整個$ {…}將由“值”列中的字符串替換  

3.小結

 好了,今天關於JMeter的配置元件就分享到這裏,其中有些常用的要熟練掌握。

 

您的肯定就是我進步的動力。如果你感覺還不錯,就請鼓勵一下吧!記得隨手點波  推薦  不要忘記哦!!!

別忘了點 推薦 留下您來過的痕迹

 

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

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

台北網頁設計公司這麼多該如何選擇?

※智慧手機時代的來臨,RWD網頁設計為架站首選

※評比南投搬家公司費用收費行情懶人包大公開

※回頭車貨運收費標準

數據誤操作,教你使用ApexSQLLog工具從 SQLServer日誌恢複數據!

前幾天同事不小心誤操作,將SQLServer庫的一張表的一個狀態字段給刷成了一個統一狀態,由於是update執行所以原來的相關狀態無法確定。發生這種事情的時候我的小夥伴背後 一涼。

由於是在開發試運行中的項目,還沒來得及進行備份處理,所以從備份恢復宣告失敗。就算有備份那麼恢復的也是備份時間節點的數據,意味着使用平台做的數據需要從備份時間重新做過,而且有可能有遺漏。

小夥伴問我這咋辦,首先沒有備份,那麼只有從數據庫日誌查找,然後看能不能通過日誌找回之前的數據,再還原到刷狀態之前的數據。然後就找到了ApexSQLLog工具,接下來我介紹下這款工具的使用和如何恢複數據。ApexSQLLog有幾個版本,我是用的是ApexSQLLog2014支持SqlServer更高的版本,數據庫使用的是SqlSerVer2014。

ApexSQLLog2014
提取碼: np4f

  • 首先建一個測試庫,和一張測試表。
    測試庫ApexSQLLogTest和測試用的表TestUser,然後我手動編輯了三條數據進去,保存編輯的數據。

  • 用ApexSQLLog打開測試庫日誌
    選擇要連接的數據庫,也可以從最近的session中打開,打開篩選過的記錄可以保存未session。
    然後選中要篩選的日誌文件,如果有備份數據庫文件也會自動查找到並在這裏羅列出來,自己按情況選擇。

  • 條件篩選
    我們選擇日誌文件后就進入到篩選條件選擇,可以在篩選條件裏面自由組合。
    可以選擇時間段(Time range)、操作(operations)、表(tables)。

    高級選項(advanced options)裏面還有用戶、字段條件等可以選擇。

  • 查看日誌數據
    當我們組合完篩選條件后,就進入到日誌分析界面,可以看到我們之前手動插入的三條數據實際已經在日誌裏面了,分成了三條insert語句。在選中其中一條日誌的時候在下面可以看到執行的各字段值的修改情況。

    可以點擊 下面的Row history查看記錄,Redo script可以生成執行的操作, Undo script可以還原到之前的數據。我們恢複數據就是使用Undo script。

  • 恢複數據測試。
    我們使用update語句將Status狀態全都重置為3。

update TestUser set Status=3 

然後刷新下日誌,會看到多出了三條Update日誌記錄,點擊第一條看到下面的Status字段從0變為了3。

我們選中這三條記錄右鍵或者上面的菜單欄功能,用create undo script 生成恢復sql。

--	This UNDO script was generated with ApexSQL Log 2014.04.1133 on 2020-06-10 11:18:47.601
--	NOTE: Operations in UNDO scripts are always output in descending order.
--	SERVER VIP-966\SQLEXPRESS
--	DATABASE ApexSQLLogTest

--	UPDATE (00000024:000000A0:0004) done at 2020-06-10 11:09:36.293 by VIP-966\Administrator in transaction 0000:0000034B (Committed)
BEGIN TRANSACTION 
UPDATE [dbo].[TestUser] SET [Status] = 2 WHERE [Id] = 3
IF @@ROWCOUNT <= 1 COMMIT TRANSACTION ELSE BEGIN ROLLBACK TRANSACTION; PRINT 'ERROR: STATEMENT AFFECTED MORE THAN ONE ROW. ALL THE CHANGES WERE ROLLED BACK.' END
--	UPDATE (00000024:000000A0:0003) done at 2020-06-10 11:09:36.293 by VIP-966\Administrator in transaction 0000:0000034B (Committed)
BEGIN TRANSACTION 
UPDATE [dbo].[TestUser] SET [Status] = 1 WHERE [Id] = 2
IF @@ROWCOUNT <= 1 COMMIT TRANSACTION ELSE BEGIN ROLLBACK TRANSACTION; PRINT 'ERROR: STATEMENT AFFECTED MORE THAN ONE ROW. ALL THE CHANGES WERE ROLLED BACK.' END
--	UPDATE (00000024:000000A0:0002) done at 2020-06-10 11:09:36.293 by VIP-966\Administrator in transaction 0000:0000034B (Committed)
BEGIN TRANSACTION 
UPDATE [dbo].[TestUser] SET [Status] = 0 WHERE [Id] = 1
IF @@ROWCOUNT <= 1 COMMIT TRANSACTION ELSE BEGIN ROLLBACK TRANSACTION; PRINT 'ERROR: STATEMENT AFFECTED MORE THAN ONE ROW. ALL THE CHANGES WERE ROLLED BACK.' END
GO

--	FINISHED ON 2020-06-10 11:18:47.697
--	TOTAL OPERATIONS PROCESSED 3
--	END OF FILE

最後我們就可以使用這個腳本去恢複數據了。

注意

我們在使用日誌恢復的時候如果表有主鍵會根據主鍵生成sql,如上圖sql中 where後面的條件。如果表沒有主鍵那麼生成的sql後面的where條件會帶上所有的字段。在我幫小夥伴恢複數據的時候發現他的表沒有設置主鍵,而且字段有20多個,3萬多條數據生成的sql都是100多M,還要拆分執行。
比如我把Id主鍵去了再更新下Status狀態到4,生成的sql如下,會提示沒有主鍵。

以上就是一次數據恢復的分享,如果下次你也遇到這種情況希望能幫到你。

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

【其他文章推薦】

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

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※回頭車貨運收費標準

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

※超省錢租車方案

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

微服務中的網關

什麼是網關

  簡單點說網關是一個Api服務器,是系統的唯一入口。為每個客戶端提供一個定製的Restful API。同時它還需要具有一些業務之外的責任:鑒權。靜態響應等處理。

為什麼需要gateway

  我們知道我們要進入一個服務本身,並不是一件容易的事情。服務本身有自己的通訊協議,這種協議往往不能很好的兼容各個客戶端的需求,所以我們只能尋找一種公共協議:http。所以網關的概念就誕生了。如圖:

  

gateway的作用

  所以網關的最主要在作用就是路由的轉發 。但是 在我們平時的使用過程中,直接請求http 協議的 api 會存在很多問題。例如:安全問題,流量問題  等等。所以gateway 還需要做一些額外的 事情來保證我們的流程是安全的、可靠的。

使用網關

  現在已經出現了很多網關的產品:比如 Ocelot ,zuul ,Spring Cloud Gateway,kong 等等

  今天我們要 介紹的網關就是  kong

kong 在docker中的部署

創建一個kong的網絡

  docker network create kong-net

創建數據庫 pgsql  

docker run -d --name kong-database --network=kong-net  -p 5432:5432  -e "POSTGRES_USER=kong" -e "POSTGRES_DB=kong"  -e "POSTGRES_PASSWORD=qwe123QWE"  postgres:9.6

 數據遷移  

docker run --rm \
      --network=kong-net \
      -e "KONG_DATABASE=postgres" \
      -e "KONG_PG_HOST=kong-database" \
      -e "KONG_PG_PASSWORD=qwe123QWE" \
      -e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \
      kong:latest kong migrations bootstrap

啟動kong  

docker run -d --name kong \
   --network=kong-net \
  -e "KONG_DATABASE=postgres" \
  -e "KONG_PG_HOST=kong-database" \
  -e "KONG_PG_PASSWORD=qwe123QWE" \
  -e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \
  -e "KONG_PROXY_ACCESS_LOG=/dev/stdout" \
  -e "KONG_ADMIN_ACCESS_LOG=/dev/stdout" \
  -e "KONG_PROXY_ERROR_LOG=/dev/stderr" \
  -e "KONG_ADMIN_ERROR_LOG=/dev/stderr" \
  -e "KONG_ADMIN_LISTEN=0.0.0.0:8001, 0.0.0.0:8444 ssl" \
  -p 8000:8000 \
  -p 8443:8443 \
  -p 8001:8001 \
  -p 8444:8444 \
  kong

瀏覽器輸入:http:kongip:8001,會出現json字符,表示成功

安裝konga

數據遷移

docker run --network=kong-net --rm pantsel/konga:latest -c prepare -a postgres -u postgresql://kong:qwe123QWE@kong-database:5432/konga

啟動konga

docker run 
-p 1337:1337 \
--network kong-net \
--name konga \
-e "NODE_ENV=production" \
-e "DB_ADAPTER=postgres" \
-e "DB_URI=postgresql://kong:qwe123QWE@kong-database:5432/konga" \
pantsel/konga

創建鏈接的Admin URL地址可以使用kong創建的網絡。例如:http://kong:8001

 如圖:

 然後可以自行編輯自己的 serevices 與service對應的route  訪問:http:kongip:8000/路由  就可以訪問你的  api啦

最後安利一波

ketchup 是一個微服務框架  它集成了網關kong,通過簡單的配置,可以自行註冊到kong的網關中,大大減少了開發的時間。

源碼地址:https://github.com/simple-gr/ketchup

操作文檔  請見:https://github.com/simple-gr/ketchup/wiki/%E7%BD%91%E5%85%B3。

qq 交流群:592407137

 

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

【其他文章推薦】

※超省錢租車方案

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

※回頭車貨運收費標準

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

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

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益