分類: 3C資訊

  • OAuth + Security – 3 – JWT令牌_租車

    OAuth + Security – 3 – JWT令牌_租車

    ※超省錢租車方案

    商務出差、學生出遊、旅遊渡假、臨時用車!GO 神州租賃有限公司!合法經營、合法連鎖、合法租賃小客車!

    PS:此文章為系列文章,建議從第一篇開始閱讀。

    為什麼使用JWT令牌

    在上面的資源服務器中,通過配置,我們了解到,當我們程序是前後端分離時,在拿着token去獲取資源時,程序會先去調用遠程認證服務器的端點去驗證解析token,這樣毫無疑問,當訪問量過大的時候,對認證服務器的壓力可想而知,所以為了解決上面的問題,我們採用JWT令牌格式,可以優化上面的問題。

    令牌採用JWT格式即可解決上邊的問題,用戶認證通過會得到一個JWT令牌,JWT令牌中已經包括了用戶相關的信息,客戶端只需要攜帶JWT訪問資源服務,資源服務根據事先約定的算法自行完成令牌校驗,無需每次都請求認證服務完成授權。

    改造認證服務器

    1. 修改TokenConfig類,如下:
    @Configuration
    public class TokenConfigure {
    
        private static final String SIGNING_KEY = "dimples";
    
        @Bean
        public TokenStore tokenStore() {
            return new JwtTokenStore(accessTokenConverter());
        }
    
        @Bean
        public JwtAccessTokenConverter accessTokenConverter() {
            JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
            //對稱秘鑰,資源服務器使用該秘鑰來驗證
            converter.setSigningKey(SIGNING_KEY);
            return converter;
        }
    
    
    }
    
    1. 修改認證服務器的配置
    private TokenStore tokenStore;
    
    private ClientDetailsService clientDetailsService;
    
    private JwtAccessTokenConverter jwtAccessTokenConverter;
    //通過構造方法注入
    ...
    
    
    /**
     * 令牌管理服務
     *
     * @return TokenServices
     */
    @Bean
    public AuthorizationServerTokenServices tokenServices() {
        DefaultTokenServices services = new DefaultTokenServices();
        // 客戶端詳情服務
        services.setClientDetailsService(clientDetailsService);
        // 支持令牌刷新
        services.setSupportRefreshToken(true);
        // 令牌存儲策略
        services.setTokenStore(tokenStore);
        
        // 配置令牌增強 JWT
        TokenEnhancerChain tokenEnhancerChain = new TokenEnhancerChain();
        tokenEnhancerChain.setTokenEnhancers(Collections.singletonList(jwtAccessTokenConverter));
        services.setTokenEnhancer(tokenEnhancerChain);
        
        // 令牌默認有效期2小時(如果客戶端設置了會覆蓋該值)
        services.setAccessTokenValiditySeconds(7200);
        // 刷新令牌默認有效期2天
        services.setRefreshTokenValiditySeconds(259200);
        return services;
    }
    
    1. 最後別忘了在pom中添加JWT的依賴,否則項目將會報錯
    <dependency>
    	<groupId>org.springframework.security</groupId>
    	<artifactId>spring-security-jwt</artifactId>
    	<version>1.1.0.RELEASE</version>
    </dependency>
    

    測試結果如下:

    可以使用OAuth的/oauth/check_token端點來解析驗證一下該token

    但是我們需要明白一點的是,這種令牌還是存儲在內存中的,後期我們如何將其存儲到redis中是我們研究的方向。

    改造資源服務器

    當我們使用了JWT令牌以後,由於在JWT令牌中我們存儲了相應的用戶信息和權限,這時我們可以直接在資源服務器中直接去解析對應令牌,就不用每次都去請求認證服務器端點,加大認證服務器的壓力,下面我們開始改造資源服務器:

    1. 將上面認證服務器中寫的TokenConfigure類拷貝一份到資源服務器
    2. 在資源服務器中屏蔽調之前的資源服務器令牌解析服務( tokenService() )
    3. 注入TokenConfigure類,然後配置到ResourceServerSecurityConfigurer里

    完整的配置如下:

    @Configuration
    @EnableResourceServer
    @EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true)
    public class DimplesResourceServerConfigurerAdapter extends ResourceServerConfigurerAdapter {
    
        public static final String RESOURCE_ID = "dimples";
    
        private TokenStore tokenStore;
        
    
        @Autowired
        public DimplesResourceServerConfigurerAdapter(TokenStore tokenStore) {
            this.tokenStore = tokenStore;
        }
    
        @Override
        public void configure(ResourceServerSecurityConfigurer resources) {
            resources.resourceId(RESOURCE_ID)
                    .tokenServices(tokenService())
                    .stateless(true);
        }
    
        @Override
        public void configure(HttpSecurity http) throws Exception {
            http
                    .authorizeRequests()
                    // 配置客戶端權限scope
                    .antMatchers("/**").access("#oauth2.hasScope('all')")
                    .and().csrf().disable()
                    // 關閉session
                    .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
        }
    
    }
    

    然後重啟服務,重新獲取令牌,然後訪問之前的測試接口:

    待解決的問題

    在此處的JWT的配置中,我們獲取的令牌信息還是存在內存中的,這樣不利於我們程序的擴展。那麼我們如何將生產的令牌去存儲到數據庫中或者存儲到redis中呢?請關注後續的文章。

    ※Google地圖已可更新顯示潭子電動車充電站設置地點!!

    日本、大陸,發現這些先進的國家已經早就讓電動車優先上路,而且先進國家空氣品質相當好,電動車節能減碳可以減少空污

    使用非對稱加密

    在上面的jwt加密中,我們的JWT簽名是寫死的字符串,可能我們的項目為了安全考慮,需要使用非對稱的加密,我們該怎麼配置呢?

    首先獲取加密文件的私鑰和公鑰,需要先安裝安裝OpenSSL工具,參考鏈接【https://blog.csdn.net/qq_39081974/article/details/81059022】

    1. 生成JKS Java KeyStore文件

    命令行執行:keytool -genkeypair -alias dimples -keyalg RSA -keypass dimples -keystore dimples.jks -storepass dimples

    將生成一個名為medical.jks的文件,其中包含我們的密鑰 – 公鑰和私鑰。 還要確保keypass和storepass是一樣的

    1. 導出公鑰

    keytool -list -rfc –keystore dimples.jks | openssl x509 -inform pem -pubkey

    或 keytool -importkeystore -srckeystore dimples.jks -destkeystore dimples.jks -deststoretype pkcs12

    將其複製到我們的資源服務器 src/main/resources/public.txt 中

    1. 配置認證服務器(TokenConfigure)
    /**
     * 配置jwt生成token的轉換
     * 使用RSA Sign Key 進行加密
     *
     * @return JwtAccessTokenConverter
     */
    @Bean
    public JwtAccessTokenConverter jwtAccessTokenConverter() {
        KeyStoreKeyFactory keyStoreKeyFactory = new KeyStoreKeyFactory(new ClassPathResource("medical.jks"), "medical".toCharArray());
        JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
        converter.setKeyPair(keyStoreKeyFactory.getKeyPair("medical"));
        return converter;
    }
    
    1. 配置資源服務器(TokenConfigure)
    /**
     * 配置jwt生成token的轉換
     *
     * @return JwtAccessTokenConverter
     */
    @Bean
    public JwtAccessTokenConverter accessTokenConverter() {
        JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
        Resource resource = new ClassPathResource("public.txt");
        String publicKey;
        try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(resource.getInputStream()))) {
            publicKey = bufferedReader.lines().collect(Collectors.joining("\n"));
        } catch (final IOException e) {
            throw new RuntimeException(e);
        }
        converter.setSigningKey(publicKey);
        return converter;
    }
    

    擴展JWT的存儲信息

    當我們使用如上的配置獲取Token后,將access_token中的內容複製到https://jwt.io/網站解析下:

    可以看到在jwt中只是保存了我們的user_name,那麼我們怎麼去擴展呢?讓其可以保存我們需要的用戶詳細信息,這裡有兩種方案:

    • 實現TokenEnhancer(Token增強器)
    public class JWTokenEnhancer implements TokenEnhancer {
        @Override
        public OAuth2AccessToken enhance(OAuth2AccessToken oAuth2AccessToken, OAuth2Authentication oAuth2Authentication) {
            Map<String, Object> info = new HashMap<>();
            info.put("other", "hello world");
            ((DefaultOAuth2AccessToken) oAuth2AccessToken).setAdditionalInformation(info);
            return oAuth2AccessToken;
        }
    }
    

    然後在TokenConfigure 中配置該Bean:

    @Configuration
    public class TokenConfigure {
        ......
    
        @Bean
        public TokenEnhancer tokenEnhancer() {
            return new JWTokenEnhancer();
        }
    }
    

    最後在認證服務器里配置該增強器:

    @Configuration
    @EnableAuthorizationServer
    public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {
    
        @Autowired
        private TokenEnhancer tokenEnhancer;
    
        @Override
        public void configure(AuthorizationServerEndpointsConfigurer endpoints) {
            .....
            
            TokenEnhancerChain enhancerChain = new TokenEnhancerChain();
            List<TokenEnhancer> enhancers = new ArrayList<>();
            enhancers.add(tokenEnhancer);
            enhancers.add(jwtAccessTokenConverter);
            enhancerChain.setTokenEnhancers(enhancers);
    
            endpoints.tokenEnhancer(enhancerChain);
        }
        ......
    }
    
    • 擴展username的內容

    比如存入json數據內容作為username的內容。相比較而言,方案二比較簡單還不用破壞UserDetails的結構

    @Override 
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        //登錄賬號
        System.out.println("username="+username);
        //根據賬號去數據庫查詢...
        UserDto user = userDao.getUserByUsername(username);
        if(user == null){
            return null;
        }
        //查詢用戶權限
        List<String> permissions = userDao.findPermissionsByUserId(user.getId());
        String[] perarray = new String[permissions.size()];
        permissions.toArray(perarray);
        //創建userDetails
        //這裏將user轉為json,將整體user存入userDetails
        String principal = JSON.toJSONString(user);
        UserDetails userDetails = User.withUsername(principal).password(user.getPassword()).authorities(perarray).build();
        return userDetails;
    }
    

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

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

    有別於一般網頁架設公司,除了模組化的架站軟體,我們的營業主軸還包含:資料庫程式開發、網站建置、網頁設計、電子商務專案開發、系統整合、APP設計建置、專業網路行銷。

  • 用python做時間序列預測一:初識概念_包裝設計

    用python做時間序列預測一:初識概念_包裝設計

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

    網動廣告出品的網頁設計,採用精簡與質感的CSS語法,提升企業的專業形象與簡約舒適的瀏覽體驗,讓瀏覽者第一眼就愛上她。

    利用時間序列預測方法,我們可以基於歷史的情況來預測未來的情況。比如共享單車每日租車數,食堂每日就餐人數等等,都是基於各自歷史的情況來預測的。

    什麼是時間序列?

    • 時間序列,是指同一個變量在連續且固定的時間間隔上的各個數據點的集合,比如每5分鐘記錄的收費口車流量,或者每年記錄的藥物銷量都是時間序列。

    時間序列的類型

    • 根據時間間隔的不同,時間序列可以是按年度(Annual)、季度、月度、周、小時、分鐘、秒等頻率採集的序列。

    時間序列的成分

    • 趨勢(Trend),比如長期上漲或長期下跌。
    • 季節性(Seasonal),比如羽絨服的銷量一般會在冬季更高,或者某家燒烤店的生意一般會在每周五和周六晚上更好。
    • 周期性(Cyclic),比如你時不時搞個大促,那麼銷量在那段時間就會比較好。
    • 誤差。

    什麼是時間序列預測?

    • 就是用同一個變量的歷史值預測未來值,或者除了歷史值以外,還加入一些預測因子(又稱外生變量)來預測未來值。前者稱為單變量時間序列預測,後者稱為多變量時間序列預測。
    • 比如,我們要預測某海灘下個月的的遊客數量,除了用歷史遊客數量做預測外,還可以加入溫度這個因子。那麼只用歷史遊客數量做預測就是單變量時間預測,加入溫度這個因子就是多變量時間預測,當然還可以加入其它合理的預測因子,比如該海灘的每月廣告支出等。

    一些簡單的預測方法

    均值法

    所有未來的預測值等於歷史數據的平均值。

    樸素法

    簡單的將最後一次觀測值作為未來的預測值。

    季節性樸素法

    相比樸素法,就是考慮了季節性,也就是說將同期的最後一次觀測值作為本期的預測值,比如預測本周的數值,那麼就將上周的周一觀測值作為本周的周一預測值,上周的周二觀測值作為本周的周二預測值,以此類推。

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

    窩窩觸角包含自媒體、自有平台及其他國家營銷業務等,多角化經營並具有國際觀的永續理念。

    漂移法(drift )

    在起始觀測值和最後一次觀測值之間畫一條連接線,延伸到預測時間點,作為預測值,公式如下:

    下面的2副圖展示了上面四種方法的預測效果:

    常用的時間序列預測法

    • Exponential smoothing 指數平滑
      簡單說就是用過去的觀測值的加權平均值來作為預測值,權重隨着與當前時刻的距離變遠而呈指數衰減。
    • ARIMA
      簡單說就是用變量的自回歸(AR)與歷史預測誤差的自回歸(MA)構成的時間序列預測模型。
    • 基於深度學習的方法
      簡單說就是利用神經網絡強大的學習能力,從時間序列歷史數據中提取各種可能的特徵,從而對未來進行預測。這部分的模型比較多,比如LSTM,GRU,TCN等。

    注意,上述的方法並不能說誰一定比誰好,不同的預測場景下每個方法都有可能做出更好的預測,所以通常需要相互比較,以便做出更合理的預測。

    本篇介紹了時間序列的相關概念,下一篇將介紹時間序列的一般數據格式和基於python的可視化方法。

    ok,本篇就這麼多內容啦~,感謝閱讀O(∩_∩)O。

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

    南投搬家公司費用需注意的眉眉角角,別等搬了再說!

    上新台中搬家公司提供您一套專業有效率且人性化的辦公室搬遷、公司行號搬家及工廠遷廠的搬家服務

  • kubeadm實現k8s高可用集群環境部署與配置_台中搬家

    kubeadm實現k8s高可用集群環境部署與配置_台中搬家

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

    台中搬家公司推薦超過30年經驗,首選台中大展搬家

    高可用架構

    k8s集群的高可用實際是k8s各核心組件高可用,這裏使用主備模式,架構如下:

    主備模式高可用架構說明:

    核心組件 高可用模式 高可用實現方式
    apiserver 主備 keepalived
    controller-manager 主備 leader election
    scheduler 主備 leader election
    etcd 集群 kubeadm
    • apiserver 通過keepalived實現高可用,當某個節點故障時觸發keepalived vip 轉移;
    • controller-manager k8s內部通過選舉方式產生領導者(由–leader-elect 選型控制,默認為true),同一時刻集群內只有一個controller-manager組件運行;
    • scheduler k8s內部通過選舉方式產生領導者(由–leader-elect 選型控制,默認為true),同一時刻集群內只有一個scheduler組件運行;
    • etcd 通過運行kubeadm方式自動創建集群來實現高可用,部署的節點數為奇數,3節點方式最多容忍一台機器宕機。

    部署環境

    k8s版本

    kubelet version kubeadm version kubectl version
    v1.15.1 v1.15.1 v1.15.1

    主機配置

    Centos版本 系統內核 docker version flannel version Keepalived version
    7.8.2003 4.4.223 19.03.9 v0.11.0 v1.3.5

    主機列表

    主機名 ip 主機配置 備註
    master01 192.168.213.181 4U4G control plane
    master02 192.168.213.182 4U4G control plane
    master03 192.168.213.183 4U4G control plane
    node01 192.168.213.192 2U2G node
    node02 192.168.213.192 2U2G node
    VIP 192.168.213.200 4U4G 在control plane上浮動

    私有倉庫

    主機名 ip 主機配置 備註
    docker-registry 192.168.213.129 2U1G reg.zhao.com

    其他準備

    系統初始化,docker安裝,k8s(kubelet、kubeadm和kubectl)安裝省略

    • kubelet 運行在集群所有節點上,用於啟動Pod和容器
    • kubeadm 用於初始化集群,啟動集群
    • kubectl 用於和集群通信,部署和管理應用,查看各種資源,創建、刪除和更新各種組件

    啟動kubelet並設置開機啟動 systemctl enable kubelet && systemctl start kubelet

    keepalived安裝

    在所有master節點上安裝

    安裝keepalived

    [root@master01 ~]# yum -y install keepalived
    

    keepalived配置

    master01

    [root@master01 ~]# cat /etc/keepalived/keepalived.conf 
    ! Configuration File for keepalived
    global_defs {
       router_id master01
    }
    vrrp_instance VI_1 {
        state MASTER 
        interface ens33
        virtual_router_id 50
        priority 150
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            192.168.213.200
        }
    }
    

    master02

    [root@master02 ~]# cat /etc/keepalived/keepalived.conf 
    ! Configuration File for keepalived
    global_defs {
       router_id master02
    }
    vrrp_instance VI_1 {
        state BACKUP 
        interface ens33
        virtual_router_id 50
        priority 100
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            192.168.213.200
        }
    }
    

    master03

    [root@master03 ~]# cat /etc/keepalived/keepalived.conf 
    ! Configuration File for keepalived
    global_defs {
       router_id master03
    }
    vrrp_instance VI_1 {
        state BACKUP 
        interface ens33
        virtual_router_id 50
        priority 100
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            192.168.213.200
        }
    }
    

    啟動keepalived並設置開機啟動

    [root@master01 ~]# systemctl start keepalived
    [root@master01 ~]# systemctl enable keepalived
    

    VIP查看

    配置master節點

    初始化master01節點

    master01初始化

    #初始化的配置文件
    [root@master01 ~]# cat kubeadm-config.yaml
    apiVersion: kubeadm.k8s.io/v1beta2
    kind: ClusterConfiguration
    kubernetesVersion: v1.15.1
    apiServer:
      certSANs:		##填寫所有kube-apiserver節點的hostname、IP、VIP
      - master01
      - master02
      - master03
      - node01
      - node02
      - 192.168.213.181
      - 192.168.213.182
      - 192.168.213.183
      - 192.168.213.191
      - 192.168.213.192
      - 192.168.213.200
    controlPlaneEndpoint: "192.168.213.200:6443"
    networking:
      podSubnet: "10.244.0.0/16"
    [root@master01 ~]# kubeadm init --config=kubeadm-config.yaml|tee kubeadim-init.log
    

    記錄kubeadm join的輸出,後面需要這個命令將備master節點和node節點加入集群中

    Then you can join any number of worker nodes by running the following on each as root:
    
    kubeadm join 192.168.213.200:6443 --token ebx4uz.9y3twsnoj9yoscoo \
        --discovery-token-ca-cert-hash sha256:1bc280548259dd8f1ac53d75e918a8ec99c234b13f4fe18a71435bbbe8cb26f3
    

    加載環境變量

    [root@master01 ~]# echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
    [root@master01 ~]# source .bash_profile
    

    安裝flannel網絡

    [root@master01 ~]# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/2140ac876ef134e0ed5af15c65e414cf26827915/Documentation/kube-flannel.yml
    

    備master節點加入集群

    配置免密登錄

    配置master01到master02、master03免密登錄

    #創建秘鑰
    [root@master01 ~]# ssh-keygen -t rsa
    #將秘鑰同步至master02,master03
    [root@master01 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.213.182
    [root@master01 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.213.183
    #免密登陸測試
    [root@master01 ~]# ssh master02
    [root@master01 ~]# ssh 192.168.213.183
    

    master01分發證書

    在master01上運行腳本cert-main-master.sh,將證書分發至master02和master03

    [root@master01 ~]# cat cert-main-master.sh
    USER=root # customizable
    CONTROL_PLANE_IPS="192.168.213.182 192.168.213.183"
    for host in ${CONTROL_PLANE_IPS}; do
        scp /etc/kubernetes/pki/ca.crt "${USER}"@$host:
        scp /etc/kubernetes/pki/ca.key "${USER}"@$host:
        scp /etc/kubernetes/pki/sa.key "${USER}"@$host:
        scp /etc/kubernetes/pki/sa.pub "${USER}"@$host:
        scp /etc/kubernetes/pki/front-proxy-ca.crt "${USER}"@$host:
        scp /etc/kubernetes/pki/front-proxy-ca.key "${USER}"@$host:
        scp /etc/kubernetes/pki/etcd/ca.crt "${USER}"@$host:etcd-ca.crt
        # Quote this line if you are using external etcd
        scp /etc/kubernetes/pki/etcd/ca.key "${USER}"@$host:etcd-ca.key
    done
    [root@master01 ~]# ./cert-main-master.sh
    

    備master節點移動證書至指定目錄

    在master02,master03上運行腳本cert-other-master.sh,將證書移至指定目錄

    [root@master02 ~]# cat cert-other-master.sh
    USER=root # customizable
    mkdir -p /etc/kubernetes/pki/etcd
    mv /${USER}/ca.crt /etc/kubernetes/pki/
    mv /${USER}/ca.key /etc/kubernetes/pki/
    mv /${USER}/sa.pub /etc/kubernetes/pki/
    mv /${USER}/sa.key /etc/kubernetes/pki/
    mv /${USER}/front-proxy-ca.crt /etc/kubernetes/pki/
    mv /${USER}/front-proxy-ca.key /etc/kubernetes/pki/
    mv /${USER}/etcd-ca.crt /etc/kubernetes/pki/etcd/ca.crt
    # Quote this line if you are using external etcd
    mv /${USER}/etcd-ca.key /etc/kubernetes/pki/etcd/ca.key
    [root@master02 ~]# ./cert-other-master.sh 
    

    備master節點加入集群

    在master02和master03節點上運行加入集群的命令

    kubeadm join 192.168.213.200:6443 --token ebx4uz.9y3twsnoj9yoscoo \
        --discovery-token-ca-cert-hash sha256:1bc280548259dd8f1ac53d75e918a8ec99c234b13f4fe18a71435bbbe8cb26f3
    

    備master節點加載環境變量

    此步驟是為了在備master節點上也能執行kubectl命令

    scp master01:/etc/kubernetes/admin.conf /etc/kubernetes/
    echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
    source .bash_profile
    

    node節點加入集群

    加入集群

    在node節點運行初始化master生成的加入集群的命令

    kubeadm join 192.168.213.200:6443 --token ebx4uz.9y3twsnoj9yoscoo \
        --discovery-token-ca-cert-hash sha256:1bc280548259dd8f1ac53d75e918a8ec99c234b13f4fe18a71435bbbe8cb26f3
    

    集群節點查看

    [root@master01 ~]# kubectl get nodes
    [root@master01 ~]# kubectl get pod -o wide -n kube-system 
    

    所有control plane節點處於ready狀態,所有的系統組件也正常

    對接私有倉庫

    私有倉庫配置省略,在所有節點上執行以下步驟

    修改daemon.json

    [root@master01 ~]# cat /etc/hosts
    127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
    ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
    192.168.213.181 master01
    192.168.213.182 master02
    192.168.213.183 master03
    192.168.213.191 node01
    192.168.213.192 node02
    192.168.213.129 reg.zhao.com
    [root@master01 ~]# cat /etc/docker/daemon.json
    {
        "registry-mirrors": ["https://sopn42m9.mirror.aliyuncs.com"],
        "exec-opts": ["native.cgroupdriver=systemd"],
        "log-driver": "json-file",
            "log-opts": {
                "max-size": "100m"
            },
        "insecure-registries": ["https://reg.zhao.com"]
    }
    [root@master01 ~]# systemctl daemon-reload
    [root@master01 ~]# systemctl restart docker
    

    創建認證secret

    使用Kuberctl創建docker register認證secret

    [root@master01 ~]# kubectl create secret docker-registry myregistrykey --docker-server=https://reg.zhao.com --docker-username=admin --docker-password=Harbor12345 --docker-email=""
    secret/myregistrykey created
    [root@master02 ~]# kubectl get secrets
    NAME                  TYPE                                  DATA   AGE
    default-token-6mrjd   kubernetes.io/service-account-token   3      18h
    myregistrykey         kubernetes.io/dockerconfigjson        1      19s
    

    在創建Pod的時通過imagePullSecret引用myregistrykey

    imagePullSecrets:
      - name: myregistrykey
    

    集群功能測試

    測試私有倉庫

    [root@master02 ~]# cat test_sc.yaml
    apiVersion: v1
    kind: Pod
    metadata:
      name: foo
    spec:
      containers:
        - name: foo
          image: reg.zhao.com/zhao/myapp:v1.0
    #  imagePullSecrets:
    #    - name: myregistrykey
    

    打開註釋,應用密鑰,可以拉取到鏡像

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

    擁有20年純熟搬遷經驗,提供免費估價且流程透明更是5星評價的搬家公司

    測試集群高可用

    測試master節點高可用

    通過ip查看apiserver所在節點,通過leader-elect查看scheduler和controller-manager所在節點

    [root@master01 ~]# ip a|grep ens33
    [root@master01 ~]# kubectl get endpoints kube-scheduler -n kube-system -o yaml |grep holderIdentity
    [root@master01 ~]# kubectl get endpoints kube-controller-manager -n kube-system -o yaml |grep holderIdentity
    

    組件名 所在節點
    apiserver master01
    controller-manager master01
    scheduler master01

    關閉master01,模擬宕機,master01狀態為NotReady

    [root@master01 ~]# init 0
    

    VIP飄到了master02,controller-manager和scheduler也發生了遷移

    組件名 所在節點
    apiserver master02
    controller-manager master03
    scheduler master02

    測試node節點高可用

    K8S 的pod-eviction在某些場景下如節點 NotReady,資源不足時,會把 pod 驅逐至其它節點

    Kube-controller-manager 周期性檢查節點狀態,每當節點狀態為 NotReady,並且超出 pod-eviction-timeout 時間后,就把該節點上的 pod 全部驅逐到其它節點,其中具體驅逐速度還受驅逐速度參數,集群大小等的影響。最常用的 2 個參數如下:
    pod-eviction-timeout:NotReady 狀態節點超過該時間后,執行驅逐,默認 5 min
    node-eviction-rate:驅逐速度,默認為 0.1 pod/秒

    創建pod,維持副本數3

    [root@master02 ~]# cat myapp_deploy.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: myapp-deploy
      namespace: default
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: myapp
          release: stabel
      template:
        metadata:
          labels:
            app: myapp
            release: stabel
            env: test
        spec:
          containers:
          - name: myapp
            image: library/nginx
            imagePullPolicy: IfNotPresent
            ports:
            - name: http
              containerPort: 80
    

    可以看到pod分佈在node01和node02節點上
    關閉node02,模擬宕機,node02狀態為NotReady
    可以看到 NotReady 狀態節點超過指定時間后,pod被驅逐到 Ready 的節點上,deployment維持運行3個副本

    問題

    初始化master節點失敗

    如果初始化失敗,可執行kubeadm reset后重新初始化

    [root@master01 ~]# kubeadm reset
    #非root用戶還須執行rm -rf $HOME/.kube/config
    

    flanne文件下載失敗

    方法一:可以直接下載kube-flannel.yml文件,然後再執行apply
    方法二:配置域名解析
    在https://site.ip138.com查詢服務器IP
    echo "151.101.76.133 raw.Githubusercontent.com" >>/etc/hosts

    節點狀態NotReady

    在節點機器上執行journalctl -f -u kubelet查看kubelet的輸出日誌信息如下:

    Container runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized

    出現這個錯誤的原因是網絡插件沒有準備好,在節點上執行命令 docker images|grep flannel 查看flannel鏡像是否已經成功拉取,這個花費的時間可能會很長

    如果很長時間仍然沒有拉下來flannel鏡像,可以使用如下方法解決

    docker save把主節點上的flannel鏡像保存為壓縮文件(或在官方倉庫https://github.com/coreos/flannel/releases下載鏡像傳到主機上,要注意版本對應),在節點機器上執行docker load加載鏡像

    [root@master02 ~]# docker save -o my_flannel.tar quay.io/coreos/flannel:v0.11.0-amd64
    [root@master02 ~]# scp my_flannel.tar node01:/root
    [root@node01 ~]# docker load < my_flannel.tar
    

    unexpected token `$’do\r”

    shell,運行出錯:syntax error near unexpected token `$’do\r”

    原因:Linux和windows下的回車換行符不兼容

    解決方法:將windows下面的CR LF,轉換為Linux下面的LF
    用notepad++打開文件,編輯->檔案格式轉換->轉換為UNIX格式->保存即可

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

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

    擁有20年純熟搬遷經驗,提供免費估價且流程透明更是5星評價的搬家公司

  • 使用VUE開發用戶後台時的動態路由問題、按鈕權限問題以及其他頁面處理問題_台中搬家公司

    使用VUE開發用戶後台時的動態路由問題、按鈕權限問題以及其他頁面處理問題_台中搬家公司

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

    還在煩惱搬家費用要多少哪?台中大展搬家線上試算搬家費用,從此不再擔心「物品怎麼計費」、「多少車才能裝完」

    如今前後端分離是大勢所趨,筆者雖然是做後台的,但也不得不學學前端的流行框架VUE -_-||| 。

    為了學習VUE,筆者搭建了一個簡單的用戶後台,以此來了解VUE的開發思路(注:本項目不用於實際開發,只是為了學習,本文重點在於vue的動態路由添加,動態權限以及頁面處理的一些小問題)。

    一、項目組成

      VUE 2.6.11 + axios +VueX + ElementUI 2.13.2 

    二、整體思路

      1.  用戶登錄后,獲取菜單數據,用以显示菜單。

      2.  用戶登錄后,後台獲取Vue路由數據,用以動態添加到VueRouter中。

      3.  用戶登錄后,從後台獲取用戶的權限,用以控制用戶是否對某一功能具有可操作權限。

    三、具體實現

    ·   1.  登錄。由於本人學習重點是使用VUE動態添加路由、菜單显示和權限控制,所以登錄頁面沒有做具體功能,點擊登錄按鈕就表示登錄成功了。

          由於登錄頁是用戶的第一界面,不存在任何權限問題,所以筆者就直接將登錄頁的路由直接寫在了VueRouter實例中。如下:

       

    import Vue from 'vue'
    import VueRouter from 'vue-router'
    
    Vue.use(VueRouter)
    
    const routes = [{
      path: '/Login',
      name: 'Login',
      component: () => import('../views/Login.vue')
    }]
    
    export function initRouter() {
      return new VueRouter({
        routes
      })
    }
    
    export default initRouter()

      用戶通過 http://localhost:8080/#/login 可訪問到登陸頁面:

     

     

           點擊登錄按鈕表示登錄成功!

      登錄成功后的處理:

      (1)向後台發請求拿到路由數據並存入VueX的state中,並通過addRoutes(routerObjArr)動態添加到路由實例中注:後台返回的數據結構需跟route相一致,如圖:

      前端所需數據結構:

      

      後台返回的數據結構:

      

     

     

     

     

     

       細節處理:由於後台返回的component字段是個組件地址字符串,這就需要將後台返回的route數據 一 一 做處理,通過import() 方法動態的加載組件,然後將返回的compoent對象重新賦值到component字段上。如圖:

      

     

      代碼:

      

    const _import = require('@/router/_import_' + process.env.NODE_ENV) //獲取組件的方法
    /**將router的json字符串中的component轉換為組件對象 */
    export function filterAsyncRouter(asyncRouterMap) {
      if (!asyncRouterMap) return [];
    
      function _iter(before) {
        const after = Object.assign({}, before)
        if (after.component) {
          after.component = _import(after.component);
        }
        if (after.children && after.children.length) {
          after.children = filterAsyncRouter(after.children);
        }
        return after
      }
    
      return asyncRouterMap.map(_iter)
    
    }

     

     

       圖中所用的import方法,根據生產環境不同,引用不同的文件,如圖:

      

     

     

       各自的代碼如下:

      _import_development.js:

    module.exports = file => require('@/views/' + file + '.vue').default // vue-loader at least v13.0.0+

      _import_production.js

    module.exports = file => () => import('@/views/' + file + '.vue')

      將後台的返回的路由數據處理完成后,最後就可以使用addRoutes方法動態加入VueRouter中了。此時,用戶便可以按照路由訪問頁面了。代碼如下:

    //動態生成路由
          axios
            .get("https://localhost:5001/AdminApi/Home/GetMenuJson?userid=" + 1)
            .then(res => {
              //取出路由列表 (isRoute=1)
              res.data.obj.router[0].children = res.data.obj.router[0].children.filter(
                a => a.meta.isRoute == 1 //isRoute=1的
              );
    
              //存入緩存
              this.$store.commit("setRoutes", res.data.obj.router);
    
              //轉換組件對象
              var getRouter = filterAsyncRouter(res.data.obj.router);
    
              //打印當前路由列表
              console.log("當前路由列表:", res.data.obj.router[0].children);
    
              //清空之前的路由信息
              this.$router.matcher = initRouter().matcher;
    
              //重新添加路由信息
              this.$router.addRoutes(getRouter);
    
              //跳轉到 Layout 組件
              this.$router.push("/");
            });

     

      (2)向後台發請求拿到權限數據,並存入VueX的state中。代碼如下:

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

    台中搬鋼琴,台中金庫搬運,中部廢棄物處理,南投縣搬家公司,好幫手搬家,西屯區搬家

         axios
            .get(
              "https://localhost:5001/AdminApi/Access/ActionPermission?userid=" + 1
            )
            .then(res => {
              //存入權限
              console.log("權限列表:", res.data.obj);
              this.$store.commit("setAccess", res.data.obj);
            });

      (3)向後台請求數據並存入VueX中的state之前,需要清空上一次存入的數據(包括路由數據和權限數據),否則會造成數據混亂,如圖:   

            

      (4)addRoutes之前,不僅要做component字段的字符串轉對象的處理,還要清掉上一個用戶登錄后存入router中的路由數據,否則會造成數據混亂或者vue警告重複的路由名稱。

      

     

     

       Login.vue組件中的全部代碼如下:

    <template>
      <div class="about">
        <button @click="login">登錄</button>
      </div>
    </template>
    
    <script> import { filterAsyncRouter } from "../common/promission"; import axios from "axios"; import { initRouter } from "@/router"; export default { created() { this.$store.commit("logout"); }, methods: { login() { //動態生成路由
     axios .get("https://localhost:5001/AdminApi/Home/GetMenuJson?userid=" + 1) .then(res => { //取出路由列表 (isRoute=1)
     res.data.obj.router[0].children = res.data.obj.router[0].children.filter( a => a.meta.isRoute == 1 //isRoute=1的
     ); //存入緩存
              this.$store.commit("setRoutes", res.data.obj.router); //轉換組件對象
              var getRouter = filterAsyncRouter(res.data.obj.router); //打印當前路由列表
     console.log("當前路由列表:", res.data.obj.router[0].children); //清空之前的路由信息
              this.$router.matcher = initRouter().matcher; //重新添加路由信息
              this.$router.addRoutes(getRouter); //跳轉到 Layout 組件
              this.$router.push("/"); }); axios .get( "https://localhost:5001/AdminApi/Access/ActionPermission?userid=" + 1 ) .then(res => { //存入權限
     console.log("權限列表:", res.data.obj); this.$store.commit("setAccess", res.data.obj); }); } } }; </script>

      promiss.js代碼如下:

    const _import = require('@/router/_import_' + process.env.NODE_ENV) //獲取組件的方法
    /**將router的json字符串中的component轉換為組件對象 */
    export function filterAsyncRouter(asyncRouterMap) {
      if (!asyncRouterMap) return [];
    
      function _iter(before) {
        const after = Object.assign({}, before)
        if (after.component) {
          after.component = _import(after.component);
        }
        if (after.children && after.children.length) {
          after.children = filterAsyncRouter(after.children);
        }
        return after
      }
    
      return asyncRouterMap.map(_iter)
    
    }

      store.js代碼如下:

    import Vue from 'vue'
    import Vuex from 'vuex'
    import VuexPersistence from 'vuex-persist'
    
    Vue.use(Vuex)
    
    export default new Vuex.Store({
      state: {
        routes: [],
      },
      mutations: {
        setRoutes: (state, routes) => {
          state.routes = routes
        },
        setAccess: (state, access) => {
          state.access = access;
        },
        logout: (state) => {
          state.routes = [];
          state.access = []
        }
      },
      actions: {},
      modules: {},
      plugins: [new VuexPersistence().plugin]
    })

     

      2. 菜單。將Layout組件用作菜显示組件,將ele中的菜單組件複製到該組件中,並通過向後台請求數據,拿到菜單和菜單對應的分組數據 。拿到菜單和菜單分組數據后,循環遍歷,將菜單按照對應的分組全部显示(後台判斷當前用戶可显示的菜單,沒有權限的菜單直接不返給前台)。vue代碼以及後台數據如下:

      

    <template>
      <el-container>
        <el-header>
          <el-dropdown>
            <i class="el-icon-setting"></i>
            <el-dropdown-menu slot="dropdown">
              <el-dropdown-item>修改密碼</el-dropdown-item>
              <el-dropdown-item>退出</el-dropdown-item>
            </el-dropdown-menu>
          </el-dropdown>
          <span>王小虎</span>
        </el-header>
        <el-container>
          <el-aside width="250px">
            <el-menu @select="handleSelect">
              <el-submenu :index="group.name" v-for="group in groupList" :key="group.id">
                <template slot="title">
                  <i class="el-icon-message"></i> {{group.title}} </template>
                <template v-for="router in routerList">
                  <el-menu-item :index="router.path" :key="router.meta.id" v-if="router.meta.groupId == group.id"
                  >{{router.meta.title}}</el-menu-item>
                </template>
              </el-submenu>
            </el-menu>
          </el-aside>
          <el-main>
            <router-view />
          </el-main>
        </el-container>
      </el-container>
    </template>
    
    <script> import axios from "axios"; export default { data() { return { activeIndex: "/home/Index", groupList: [], routerList: [] }; }, mounted() { this.getGroupList(); this.getRouterList(); }, methods: { //菜單點擊事件
     handleSelect(key) { this.$router.push(key); }, //獲取菜單分組數據
     getGroupList() { var that = this; axios .get("https://localhost:5001/AdminApi/Home/GetGroupJson") .then(res => { that.groupList = res.data.obj; }); }, //獲取菜單數據
     getRouterList() { var that = this; axios .get("https://localhost:5001/AdminApi/Home/GetMenuJson") .then(res => { that.routerList = res.data.obj.router[0].children.filter( a => a.meta.display == 1 //取display=1的
     ); console.log("當前菜單列表"); console.log(that.routerList); }); } } }; </script>
    
    <style> @import "../styles/layout.css"; /*引入公共樣式*/
    </style>

    後台分組數據:

    {
    "id": 14,
    "name": "Customer",
    "title": "客戶中心",
    "target": "mainRigh",
    "url": "#",
    "icoCss": "layui-icon-username",
    "delFlag": 0,
    "sortNo": 0,
    "createMan": 1,
    "createTime": "2019-05-05T11:30:06"
    },
    {
    "id": 9,
    "name": "System",
    "title": "系統設置",
    "target": "123",
    "url": "#",
    "icoCss": "fa-gears",
    "delFlag": 0,
    "sortNo": 1,
    "createMan": 1,
    "createTime": "2019-05-05T11:29:56"
    }

    後台菜單數據:

     

     

    效果圖:

      3.  功能頁面的處理。

        (1)組件的動態加載規則由於該vue項目中的組件是動態加載,那麼後台返回的路由數據中的component字段中的路徑自然也要按照某一種規則來返給前端。否則會造成import()組件的時候,由於地址不對解析加載不到組件而報錯。

       例如筆者是按照這種規則:

           後台數據

     

     

     斜杠”/“前邊表示文件夾名稱,後邊表示組件名稱,這樣就可以按照這種規則動態加載到組件了。

     

     

     

     (2).頁面刷新變成空白頁?(路由丟失)

      遇到這個問題的話,在main.js中加入一段代碼,每次刷新頁面都把存入VueX state中的數據拿出來,判斷一下路由裡邊還存不存在當前刷新頁面的路由,如果沒有,則對VueRouters重新賦值

      main.js 代碼如下:

    import Vue from 'vue'
    import App from './App.vue'
    import router from './router'
    import ElementUI from 'element-ui';
    import 'element-ui/lib/theme-chalk/index.css';
    import store from './common/store'
    import {
      filterAsyncRouter
    } from "./common/promission";
    
    Vue.config.productionTip = false
    Vue.use(ElementUI);
    
    new Vue({
      router,
      store,
      render: h => h(App),
      mounted() {
        // 緩存的路由信息
        const routes = this.$store.state.routes
        // 判斷當前路由是否被清除
        const hasRoute = this.$router.options.routes.some(r => r.name == 'index')
        // 如果 緩存中有路由信息 並且 當前路由被清除
        if (routes.length && !hasRoute) {
          //獲取路由Json字符串
          var getRouter = filterAsyncRouter(routes);
          // 再次添加路由信息
          this.$router.addRoutes(getRouter);
          // 然後強制更新當前組件
          this.$forceUpdate()
        }
      },
    }).$mount('#app')

      (3)  頁面按鈕的控制

      將前面存入vuex state中的權限數據,在每個組件中都拿出來一下存入一個變量中,在按鈕上使用v-if、array.indexOf(‘權限名稱’)來控制显示/隱藏。

      原理是如果用戶存在該權限,則v-if=”true“,按鈕則显示,否則按鈕隱藏。

      代碼如下:

    <el-button @click="edit(scope.row)" type="text" size="small" v-if="accessList.indexOf('SysRole/AddEdit')>-1"
            >編輯</el-button>

      

     

     效果圖:

     

    好了,筆者就介紹到這裏。當然,如果要做一個完整的後台,肯定還有很多要做的東西,比如用戶角色啊、角色授權啊等等;但筆者這次學習的重點是VUE的動態路由、動態權限,以及頁面處理中一些比較常見的坑,所以別的就不多介紹了。

    如有需要,朋友們可以聯繫我,大家多多交流。

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

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

    還在煩惱搬家費用要多少哪?台中大展搬家線上試算搬家費用,從此不再擔心「物品怎麼計費」、「多少車才能裝完」

  • 別說我沒教你!四十萬以內最能泡妞的車型都在這了!_網頁設計公司

    別說我沒教你!四十萬以內最能泡妞的車型都在這了!_網頁設計公司

    ※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

    台中景泰電動車行只是一個單純的理由,將來台灣的環境,出門可以自由放心的深呼吸,讓空氣回歸自然的乾淨,減少污染,留給我們下一代有好品質無空污的優質環境

    0L自然吸氣發動機,最大馬力只有160ps,峰值扭矩188N。m,從動力特性上說這並不是一台強調着性能與極限的機器,但是足夠拉風的外形已經讓它可以成為路面上一道強有力的殺睛利器。二十萬級現代飛思根據市場的調查發現,女孩子們喜歡兩廂車的比例比三廂車要大得多,特別是將車型區間控制在二十萬以內的緊湊型轎車之間,女生傾心兩廂車的比例明顯增加。

    有車沒女友,你還是單身狗!雖然這是一句很冷的諺語,但確實容易傷透了很多單身汪的玻璃心,別煩惱,只要你還沒買車那就有機會,四十萬以內,從豪車到平民車,小編幫你們整理出了最容易泡妹紙的車型,祝你抓緊這年末的尾巴早日脫離“單身俱樂部”!

    四十萬級

    福特野馬Mustang 2.3T

    有人可能會說,哥有了四十萬買車還愁妹子不上車?這你就錯了,現在的年輕妹紙認識寶馬奔馳奧迪車標的不在少數,而且很多妹紙會覺得,你開個寶馬那隻不過代表你是個沒有品位的暴發戶。所以,如果你有買BMW的資金,你卻需要一個個性的選擇。

    進口福特野馬2.3T。要性能?對不起,它真沒有,純美國肌肉車的精髓是多缸數大排量自然吸氣發動機,而2.3T的野馬,在小編看來最多只能稱作Ford pony(福特小馬駒),小排量渦輪增壓的搭配讓這台野馬沒有了美式肌肉車的那種純粹,但是B格卻不會跌份兒。

    原廠已經足夠漂亮性感的車身線條,已經不需要做任何多餘的改裝,開着這車,把妹子撩倒的幾率絕對比什麼開個寶馬奔馳那種常見的豪華轎車要高得多。

    三十萬級

    馬自達MX-5

    沒有幾個女生不喜歡馬自達MX-5,

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

    網站的第一印象網頁設計,決定了客戶是否繼續瀏覽的意願。台北網動廣告製作的RWD網頁設計,採用精簡與質感的CSS語法,提升企業的專業形象與簡約舒適的瀏覽體驗,讓瀏覽者第一眼就愛上它。

    小巧精緻的造型,拉風的硬頂敞篷式設計,強勁的動力輸出,靈活的車身動作,精準的操控特性,這些都是這台精緻的小型跑車所擁有的優點。

    馬自達MX-5搭載的是一台2.0L自然吸氣發動機,最大馬力只有160ps,峰值扭矩188N.m,從動力特性上說這並不是一台強調着性能與極限的機器,但是足夠拉風的外形已經讓它可以成為路面上一道強有力的殺睛利器。

    二十萬級

    現代飛思

    根據市場的調查發現,女孩子們喜歡兩廂車的比例比三廂車要大得多,特別是將車型區間控制在二十萬以內的緊湊型轎車之間,女生傾心兩廂車的比例明顯增加。

    現代飛思就是一款十分符合女性朋友審美的車型。現代家族所擅長的外觀設計方式將飛思打造成了目前現代品牌旗下最具特色的兩廂轎車。不對稱的三開門式設計,精緻的車身尺寸,力量感與設計感並存的肌肉線條,讓這台車的顏值保持在一個相當高的位置。

    1.6T的發動機有着204ps的最大馬力,再有着韓系車一貫容易上手的駕駛特性,二十萬級的車型要彰顯你選車的個性,飛思絕對有佔據你候選目標隊列裏面一席之地的實力。

    十萬級

    長安逸動XT

    如果你問我十萬級別顏值最高的自主品牌家轎,我想我會投長安逸動XT一票。在初次見到逸動XT之前,尚且對於自主品牌的兩廂車還停留在夏利的那個記憶當中,可以說逸動XT是我對自主品牌車型外觀設計上有了一定程度的改觀的車型。

    逸動XT有1.6L自吸和1.5T渦輪兩種版本可以選擇,自吸的最大馬力125ps,日常代步通勤還是可以有不錯的動力表現,而如果想體會一把駕駛的樂趣,還是推薦170ps馬力的1.5T渦輪版本。

    全文總結:顏值高的車型還有本田思域、昂克賽拉兩廂等車型可以選擇,其實總結一點,根據我們調查發現,女孩子的審美和男性還是有所不同,她們要麼喜歡大跑車、要麼喜歡精緻小巧的掀背兩廂車。所以如果你買車是為了泡妞,那麼,就考慮一下這兩種車型吧~~本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

    ※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

    以設計的實用美學觀點,規劃出舒適、美觀的視覺畫面,有效提昇使用者的心理期待,營造出輕鬆、愉悅的網站瀏覽體驗。

  • 這幾款車摸准了國人買車心理 不愧是高性價比國貨精品!_如何寫文案

    這幾款車摸准了國人買車心理 不愧是高性價比國貨精品!_如何寫文案

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

    擁有後台管理系統的網站,將擁有強大的資料管理與更新功能,幫助您隨時新增網站的內容並節省網站開發的成本。

    88-20。18萬總結:今天所介紹的這兩個品牌的車型都是目前在自主品牌比較出色的。長安汽車從前幾年發力開始就慢慢顯露實力,悅翔V7是其在緊湊車出色的產品,不僅價格親民,近期推出的1。0T車型更是走在自主品牌的前面。睿騁熱度雖然低了一點,但無論顏值與配置都是相當出色的。

    雖然中級車市場一直被合資品牌佔據,但自主品牌肯定不會眼睜睜地看着這塊蛋糕旁落;一旦在緊湊車市場中站穩腳跟,肯定會遇到天花板效應,向上延伸就無可厚非了。既然要跟合資品牌競爭,

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

    什麼是銷售文案服務?A就是幫你撰寫適合的廣告文案。當您需要販售商品、宣傳活動、建立個人品牌,撰寫廣告文案都是必須的工作。

    就要非常出色的產品力了,自主品牌的配置與性價比優勢仍然要堅持,這樣與緊湊車形成高低搭配才能更好地征戰市場。

    吉利家族

    緊湊車 帝豪(三廂燃油版)

    售價:6.98-10.08萬

    中型車 博瑞

    售價:11.98-22.98萬

    長安家族

    緊湊車 悅翔V7

    售價:5.99-8.79萬

    中型車 睿騁

    售價:10.88-20.18萬

    總結:今天所介紹的這兩個品牌的車型都是目前在自主品牌比較出色的;長安汽車從前幾年發力開始就慢慢顯露實力,悅翔V7是其在緊湊車出色的產品,不僅價格親民,近期推出的1.0T車型更是走在自主品牌的前面;睿騁熱度雖然低了一點,但無論顏值與配置都是相當出色的。

    吉利汽車自從收購了沃爾沃汽車之後就一發不可收拾了,帝豪這款緊湊車就是很好的證明;如今銷量已經突破百萬輛了;性價比與口碑並存;至於被譽為最美自主轎車的博瑞,上市以來就受到消費者的追捧;如今仍然是一車難求就知道這款車型非常出色了。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

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

    銷售文案是什麼?A文案是廣告用的文字。舉凡任何宣傳、行銷、販賣商品時所用到的文字都是文案。在網路時代,文案成為行銷中最重要的宣傳方式,好的文案可節省大量宣傳資源,達成行銷目的。

  • 完爆漢蘭達、樓蘭?這款27萬的中型SUV是要賣瘋的節奏!_網頁設計公司

    完爆漢蘭達、樓蘭?這款27萬的中型SUV是要賣瘋的節奏!_網頁設計公司

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

    當全世界的人們隨著網路時代而改變向上時您還停留在『網站美醜不重要』的舊有思維嗎?機會是留給努力改變現況的人們,別再浪費一分一秒可以接觸商機的寶貴時間!

    仿皮縫線、木紋裝飾件以及適當鍍鉻裝飾件的存在營造出一種豪華高檔的氣氛,還有着一個可以調節角度的懸浮式中控屏幕,並且支持Carplay系統。紅色的一鍵啟動按鈕非常注目。動力方面採用的是與前紐北最速前驅王——本田思域 TYpE R同宗的2。

    前言

    隨着SUV在全球市場的大熱,本田也越發重視中國這個世界最大的汽車市場,先後在中國推出了CR-V、繽智、歌詩圖等車型,其中CR-V是最為成功的SUV,可以說是帶領了中國城市SUV市場的潮流,但是這麼多年過去,CR-V已經沒有過往那種驚艷的感覺,加上本田在中大型SUV上的缺席,本田(中國)為此在中國研發了一款中型SUV,在廣汽本田中它就是廣汽本田冠道。

    本田冠道售價為26.98萬-32.98萬,車身尺寸為4816*1942*1669mm,軸距為2820mm,要比起豐田漢蘭達、別克昂科威都要大上一圈,定位是中型SUV。

    冠道採用本田的家族式設計,前臉給人的感覺和本田思域有着很多的相似之處,一樣使用了更有科技感的LED大燈,只是橫貫於兩燈之間的鍍鉻中網裝飾條更為粗壯以及進氣格柵面積更大,而日間行車則是被放置在傳統霧燈位置上,在小編眼中感覺這樣的設計有種“汽配城”感覺。但整車前臉給人的感覺是比較厚重,給人一種寬大又不失精緻的感覺。

    車身側面可以看到A柱下有着類似進氣口的裝飾件,非常的精緻,車頂使用了懸浮式設計+溜背造型,整體顏值比較高。全系標配的19英寸輪轂加上高高隆起的輪拱,讓冠道增加了一些力量感,加上車頂線條讓人覺得非常動感。

    作為一部中型SUV,冠道的尾部卻是非常的精緻,尾燈的造型能讓你想到很多本田的車型。此外冠道還用着的是單邊共雙出的排氣管設計,營造出一種性能上的霸氣。

    內飾方面則代表了廣汽本田最高的水平,

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

    RWD(響應式網頁設計)是透過瀏覽器的解析度來判斷要給使用者看到的樣貌

    表現出冠道豪華SUV的身份,中控上使用了大量軟質材料,手感以及質感都非常出色。仿皮縫線、木紋裝飾件以及適當鍍鉻裝飾件的存在營造出一種豪華高檔的氣氛,還有着一個可以調節角度的懸浮式中控屏幕,並且支持Carplay系統。

    紅色的一鍵啟動按鈕非常注目。

    動力方面採用的是與前紐北最速前驅王——本田思域 TYpE R同宗的2.0T渦輪增壓發動機,最大功率200千瓦,最大扭矩370牛米,已經是性能車級別的發動機水平,在競爭對手中處於不敗地位,並且實測油耗能在10L左右,油耗表現非常出色。

    變速箱方面採用了和寶馬一個供應商的ZF采埃孚的9AT自動變速箱,該變速箱也有使用在jeep 自由光以及路虎極光上,耐用度有待考驗,不過和它們不同的是本田對它進行了匹配以及換上了更顯檔次的按鈕式电子檔把。

    底盤方面,採用了前麥費遜后多連桿式獨立懸架,值得一提的是后懸架下搖臂採用的是成本更高的鋁合金材料,相對於同級車常用的鑄鐵材料來得更強更輕,帶來更直接更佳的駕駛體驗。

    配置方面,廣汽本田冠道表現出超高的水平,全系配備了無鑰匙進入、一鍵啟動、自動駐車、19英寸鋁合金輪轂、換擋撥片、定速巡航、座椅電動調節、自動空調、後排獨立空調以及發動機啟停技術等,即使是購買最低配也能滿足一般人的使用需求。高配車型還有抬頭显示,LED大燈,全景天窗、電動後備廂、座椅通風加熱、併線輔助、全景影像、主動剎車、併線輔助、車道偏離預警系統、自動泊車等配置。

    對於推薦車型方面,筆者推薦的是次低配的兩驅豪華型,以着1萬的差價就有多了全景天窗、電動後備廂、真皮方向盤、倒車影像、前排座椅加熱、LED大燈、併線輔助等使用功能,性價比非常的高,而單單僅僅是全景天窗、LED大燈兩者相加就遠遠大於了一萬元,性價比不言而喻。而價格更高的四驅版筆者覺得是沒有必要的,城市使用中四驅系統使用的機會微乎其微,只能平白增加油耗以及稍微提高一點性能。而在後期,廣汽本田還會推出價格更低的1.5T車型,門檻更低。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

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

    透過資料庫的網站架設建置,建立公司的形象或購物系統,並提供最人性化的使用介面,讓使用者能即時接收到相關的資訊

  • 你們真的了解車震的真諦嗎?_網頁設計

    你們真的了解車震的真諦嗎?_網頁設計

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

    網動是一群專業、熱情、向前行的工作團隊,我們擁有靈活的組織與溝通的能力,能傾聽客戶聲音,激發創意的火花,呈現完美的作品

    首先可能是你節氣門需要清洗了車子行駛一段時間后,節氣門會很臟,然後會導致節氣門關閉不嚴或怠速步進電動機卡滯,然後你的車子怠速會很高,然後就抖了。噴油嘴積碳噴油嘴積碳之後,在冷啟動時噴出來的汽油會被積碳吸收,導致啟動時候的汽油過於稀薄。

    今天說說車震的那些事兒。大家不好誤會,並不是大家所想的人在車上震,而是汽車自己震的問題。

    有一次,同事坐我車的時候,跟我說為啥你的車子在抖,你要去檢查一下喔。但其實,我是在抖腳……不少車子在行駛了一定的里程之後,車子都會出現不同程度的抖動,就是怎麼回事呢?

    行駛中:如果在行駛中發現汽車抖動,你可能要檢查一下你的輪胎和輪圈。首先可能是你輪胎已經偏了,需要去做一下動平衡或者是四輪定位,其次是你的輪轂有可能變形了,如果真的變形,你需要換一個新的了。

    靜止時抖動,車輛在靜止時抖動的話,原因有幾個。

    首先可能是你節氣門需要清洗了

    車子行駛一段時間后,

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

    擁有專業的維修技術團隊,同時聘請資深iphone手機維修專家,現場說明手機問題,快速修理,沒修好不收錢

    節氣門會很臟,然後會導致節氣門關閉不嚴或怠速步進電動機卡滯,然後你的車子怠速會很高,然後就抖了。

    噴油嘴積碳

    噴油嘴積碳之後,在冷啟動時噴出來的汽油會被積碳吸收,導致啟動時候的汽油過於稀薄。

    火花塞積碳

    火花塞是發動機點火的重要部件,如果火花塞積碳會影響打火,嚴重時候甚至會導致氣缸停止工作,這個時候更換一套火花塞就好了,有經驗的可以清理一下火花塞上的積碳。如果火花塞沒積碳,則檢查點火線圈、高壓導線的工作情況。

    油壓不穩定、進氣壓力傳感器出問題

    如果上面的部件都沒問題,這個時候就要檢查一下油泵、進氣壓力傳感器是不是有問題,如果這兩個部件出問題,都會造成供油壓力不正常或進氣壓力傳感器數值錯誤,這個問題最好到4S店檢查一下。

    發動機的腳墊老化

    如果你的車已經老到了有一定的年紀,然後你又發現上面這些部件都沒問題,那就有可能是發動機的腳墊老化。這個腳墊有點兒像避震,發動機工作的時候,這個腳墊是吸收震動,防止震動傳進車廂。

    汽車抖動的含義有很多,其中不少都是車主沒辦法自己來維護,建議到快修店做一個檢測就可以,一般十來分鐘就能夠完成檢查。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

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

    窩窩以「數位行銷」「品牌經營」「網站與應用程式」「印刷品設計」等四大主軸,為每一位客戶客製建立行銷脈絡及洞燭市場先機。

  • GS8全國上市 沒有彎道的傳祺世界第6季落幕_貨運

    GS8全國上市 沒有彎道的傳祺世界第6季落幕_貨運

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

    網動結合了許多網際網路業界的菁英共同研發簡單易操作的架站工具,及時性的更新,為客戶創造出更多的網路商機。

    7萬創新高,羊城團購訂單超500台。數據显示,9月份,廣汽傳祺全系銷量達到3。7萬輛,創造單月銷量歷史新高度。在J。D。power亞太公司發布2016年中國新車質量(IQS)報告中,廣汽傳祺連續四年獲得中國品牌新車品質之冠。同時,傳祺明星車型GS4,在緊湊型SUV新車質量排名中,以93分的高分力拔中國品牌質量頭籌。

    10月29日,特意跑來廣州白雲試駕基地參加了廣汽傳祺大型品牌試駕活動——“行祺道 試鋒芒 沒有彎道的傳祺世界第6季”。另外剛在杭州G20主會場上市的傳祺GS8也在“廣州主場”驚艷上市。同時,傳祺明星車型GS4、GA3S 200T上演炫酷的車舞表演。

    傳祺GS8 驚艷上市,十五城連動

    繼10月26日閃耀杭州G20峰會主會場舉行全國上市活動后,10月29日,廣汽傳祺 “旗艦級豪華大7座SUV”GS8,在“彎六”活動現場舉行盛大區域上市發布。於此同時,在深圳、長沙、廣州、昆明、北京、天津直至烏魯木齊等15大城市也將聯動進行,中國大型SUV躍升高端,踏上“征服”之路。

    作為傳祺品牌高端化路線上繼GA8之後的又一款C級高端力作,GS8集“超硬朗霸氣外觀、大格局七座空間、新視野智能互聯、全地形無畏駕控”四大核心價值於一身,創造中國品牌高端突破新高度,為用戶呈現大幅超越同級的產品價值。有媒體表示:傳祺GS8將是對合資品牌一次最有力的衝擊,中國品牌有望首次突破20萬價格天花板。

    美女車手大玩極限漂移 傳祺家族車款全系亮相

    想要感受傳祺明星家族的魅力,就來彎六活動現場,此言不虛。傳祺旗下GS4GA6GA8GA3S 200T等明星車型悉數上陣,消費者可以零距離體驗全系車型,消費者還可藉此機會,實地體驗傳祺與一些合資對手的正面pK,

    ※回頭車貨運收費標準

    宇安交通關係企業,自成立迄今,即秉持著「以誠待人」、「以實處事」的企業信念

    通過靜音、百米加速、連續彎道、濕滑路面等多個項目,一較高下。

    活動現場,美女車手駕駛傳祺GA3S 200T上演漂移入庫挑戰賽,向逐漸變小的車庫間距急速漂移,挑戰漂移入庫最短距離吉尼斯世界紀錄。現場不斷爆發的陣陣掌聲,是對美女車技的驚嘆,更是對傳祺車高性能、高品質的讚譽。

    9月份銷量3.7萬創新高,羊城團購訂單超500台!

    數據显示,9月份,廣汽傳祺全系銷量達到3.7萬輛,創造單月銷量歷史新高度!在J.D.power亞太公司發布2016年中國新車質量(IQS)報告中,廣汽傳祺連續四年獲得中國品牌新車品質之冠。同時,傳祺明星車型GS4,在緊湊型SUV新車質量排名中,以93分的高分力拔中國品牌質量頭籌!

    為了答謝消費者的厚愛,此次彎6廣州站也正值金九銀十最佳購車季,廣汽傳祺為大本營消費者準備了多重豪禮,現場變成了最接地氣、最實惠、最好玩的購車盛宴。做為傳祺品牌的大本營,廣州站現場攬獲訂單超500台。除了傳祺GS4之外,GS8也收穫大量訂單。現場下訂的趙先生表示,其實早在上市前就想下訂了,現場體驗到這個“大傢伙”后,更是讓我愛不釋手,廣汽造車就是實在。”

    然而精彩與實惠還將繼續,傳祺彎6將駛入合肥、福州、長沙站,感興趣的朋友,可到廣汽傳祺銷售店或傳祺官網報名參与,傳祺與您不見不散。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

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

    搬家價格與搬家費用透明合理,不亂收費。本公司提供下列三種搬家計費方案,由資深專業組長到府估價,替客戶量身規劃選擇最經濟節省的計費方式

  • 瞄準哈弗、長安?這款10萬出頭的SUV會是多一個新選擇_網頁設計公司

    瞄準哈弗、長安?這款10萬出頭的SUV會是多一個新選擇_網頁設計公司

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

    搬家費用:依消費者運送距離、搬運樓層、有無電梯、步行距離、特殊地形、超重物品等計價因素後,評估每車次單

    0L自然吸氣發動機以及愛信6AT變速箱,而1。4T的渦輪增壓車型目前僅配備手動變速箱。這一套來自pSA的動力總成曾經在雪鐵龍和標緻的車型上都有裝配。數據並不算突出,但是200N。m的峰值扭矩對於一般城市通勤代步來說,動力已經足夠使用。

    每個購車人士對於自己的愛車都有着不同的需求,無論是外觀、空間、操控、售價區間等等,但是相信對於旨在購買一款家用車的消費者來說,大空間、高可靠性、過得去的外觀就已經足夠,在如今SUV市場膨脹急速的大環境下,來自鄭州日產旗下自主品牌的東風風度MX5,或許也會是一個不錯的選擇。

    外觀:視覺衝擊力高;辨識度強

    外觀的好看與否,向來是見仁見智的選擇,東風風度MX5的外觀應該算是在當下自主品牌SUV車型裏面較為引人矚目的類型,一體貫穿式的進氣格柵鍍鉻裝飾使得中央車標顯得分外醒目,整體突出的前臉極具運動感。

    與前臉交相呼應的是車尾同樣貫穿式的尾燈設計,加之設計緊湊,整體性極強的整車外觀,東風風度MX5的外觀個人認為可以位居當下自主品牌SUV裏面較為前列的位置。

    內飾:務實設計;居家舒適

    內飾方面東風風度MX5採用了大量的軟質材料進行包裹,基本上在駕駛員和乘客經常觸摸到的地方都是軟質的材料,這對於車內舒適程度來說是比較厚道的做法。

    車內空間非常可觀,整車尺寸比哈弗H6、長安CS75都要大上一圈,後排地板全平,對於乘坐三人來說十分合適,全系標配後排出風口,我一直在強調,後排出風口的配置是決定了一台車舒適性的重要配置之一,

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

    節能減碳愛地球是景泰電動車的理念,是創立景泰電動車行的初衷,滿意態度更是服務客戶的最高品質,我們的成長來自於你的推薦。

    在這一點,東風風度MX5是做得相對到位的一款SUV。

    動力:技術成熟;噪音稍大

    東風風度MX5的動力總成採用的是pSA的2.0L自然吸氣發動機以及愛信6AT變速箱,而1.4T的渦輪增壓車型目前僅配備手動變速箱。

    這一套來自pSA的動力總成曾經在雪鐵龍和標緻的車型上都有裝配。數據並不算突出,但是200N.m的峰值扭矩對於一般城市通勤代步來說,動力已經足夠使用。應付一般的非鋪裝路面同樣綽綽有餘。但由於也是一套比較老舊的發動機,高轉速下的噪音則會顯得比較嘈雜。

    全文總結:東風風度MX5在今年年底才會正式上市,目前只有最低配車型的預售價,售價103555元,根據東風風度官方透露的訊息,頂配車型將會在13萬元左右。

    東風風度MX5的產品力較為綜合,肉眼看不見的地方配置為厚道,例如前後獨立懸架,全系標配ESC車身穩定系統、配備全尺寸備胎等等,但是,在車型外部的配置則不太全面,例如原廠沒有配備當下流行的氙氣大燈或者LED大燈、沒有功能齊全的多媒體人機互聯繫統等等,這些配置雖說不貴可以後期加裝,但是原廠配備或許可以給到消費者更好的體驗。

    東風風度作為SUV市場的新晉品牌,目前旗下僅有兩款SUV,MX5和MX6,綜合汽車本身的產品力來看,東風風度MX5整體硬傷並不明顯,而且由於東風風度實際上是鄭州日產旗下的品牌,所以在品控方面更多的是向合資品牌看齊,至於消費者是否可以接受,那就得等它正式上市公布最終售價后,看市場的接受程度是否給力了。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

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

    透過選單樣式的調整、圖片的縮放比例、文字的放大及段落的排版對應來給使用者最佳的瀏覽體驗,所以不用擔心有手機版網站兩個後台的問題,而視覺效果也是透過我們前端設計師優秀的空間比例設計,不會因為畫面變大變小而影響到整體視覺的美感。