分類
發燒車訊

銷量冠軍——吉利亮相振威新能源汽車展

由中國土木工程學會城市公共交通學會、廣東省新能源汽車產業協會、廣東省充電設施協會、充電設施線上網及振威展覽股份聯合舉辦的2017新能源汽車產業博覽會將於6月16-18日,8月23-25日分別在深圳會展中心及上海新國際博覽中心隆重舉行。本次展會涵蓋了整車、核心三電(電池、電機、電控)、充電設備等三大產業板塊及新能源汽車整體解決方案、零部件等全產業鏈展覽展示。是國內以新能源汽車產業為主題全方位展示的第一平臺。

本次展會迎來了一位重量級大咖——吉利汽車。據瞭解,吉利汽車已於近日確認參加本次展會,展位號:E5215、9T220。本次吉利將帶來旗下全款車型隆重亮相。為什麼說吉利是重量級大咖呢?

一、用銷量說話

從2016年4月,吉利推出的第一款純電動汽車—吉利帝豪EV開始,國內整個新能源汽車格局就開始有了變化。從最初的比亞迪、北汽新能源為主的新能源汽車市場,到吉利帝豪EV的加入後,整個銷售市場的格局完全被打破。作為“藍色吉利行動”的首款戰略車型,其超長的續航里程、超低的使用成本、超高的性價比,使帝豪EV在不到9個月的時間裡完成了終端銷售16975台,位元列2016年中國純電動單車型銷量冠軍。

然而,這並不是吉利的最終成績!

根據乘聯會近期公佈的4月新能源汽車銷量資料,吉利新能源旗下的汽車憑藉著6295輛的銷量領跑4月份新能源汽車銷量排行榜。其中吉利帝豪EV300以2586台的銷售成績成為A級純電動轎車的銷量冠軍。此次改款的帝豪EV300不僅升級了續航里程,還增加了ITCS智慧溫控管理系統等配置,並憑藉良好的用戶口碑在純電動轎車領域持續發力。

二、立足使用者需求,以產品力打動客戶

目前純電動車的三大痛點非常明確:一是續航問題,一是充電時長問題,最後一個是針對惡劣天氣的充電問題。而帝豪EV300針對這三大痛點做了全面升級,新車綜合工況里程由之前的253公里增加至300公里,並且在勻速工況下續航里程達360公里。極大的增加了出行半徑及減少了充電的頻率。

對於充電時長,帝豪EV300設置了多種充電模式。首先是升級了6.6KW車載慢充,將慢充時間縮短到7小時,利用晚上峰穀時間充電既能安心充滿,又能節省費用。此外,還添加了60KW公共快充、10KW快充盒、6.6KW慢充樁、3.3KW家用慢充盒、1.8KW隨車應急線充電五種充電模式,極大地提供了充電的便利性,滿足不同客戶的需求。

此外,帝豪EV300還標配了國內首創的ITCS電池智慧溫控管理系統,該系統完美實現了動力電池低能耗的低溫預熱和高溫冷卻技術突破。即使在-30度的極寒天氣,動力電池仍然可以正常使用,在-20度時還能實現快速充電。此外,在高溫天氣ITCS能夠智慧降溫,可確保動力電池正常使用且續航能力不受高溫影響,同時也極大的提高了動力電池的安全性。

據組委會介紹。目前,除了吉利之外,還雲集了比亞迪、上汽、知豆、五洲龍、成功汽車、南京金龍、陸地方舟、新吉奧、英威騰、科陸電子、鼎充、ABB、科大智慧、中恒、盛弘、科華恒盛、萬馬線纜等新能源汽車產業鏈上的各種大咖,這將是繼四月上海車展後以新能源汽車為主題的又一行業盛會!

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】

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

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

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

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

※幫你省時又省力,新北清潔一流服務好口碑

※回頭車貨運收費標準

分類
發燒車訊

全長 1,000 公里!澳洲昆士蘭將建可供充電的電動車高速公路

澳洲昆士蘭 (Queensland) 將在長 1,600 公里的高速公路沿線設置「電動車充電站」,充電時間只需花費 15 至 30 分鐘,預計將成為澳洲第一個運用太陽能提供電動車快速充電站的省。   此項計畫的第一個充電站會座落在湯斯維爾,後續其他地點則將沿著全長 1,600 公里長的布魯斯高速公路(Bruce Highway)興建。昆士蘭政府表示,「此項計畫目標是為了「電動高速公路」(electric super highway)揭開序幕,希望能夠提供來往昆士蘭的用路人快速充電服務。 」 這項計畫雖然將會啟用太陽能為主的快速充電站,但沿線依舊會保有傳統的加油站,傳統汽油汽車的用路權益不會受損,而電動車的車主也無需因為路途遙遠而擔心電力問題。    

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

【其他文章推薦】

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

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

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

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

新北清潔公司,居家、辦公、裝潢細清專業服務

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

分類
發燒車訊

歐盟計畫出臺統一的電動汽車補貼政策

目前歐盟國家對的補貼參差不齊,在法國購買電動汽車可獲得最多至7000歐元的補貼,而在德國沒有補貼。為幫助歐洲汽車工業克服時艱,歐盟擬出臺統一的電動汽車補貼政策。

歐盟工業專員塔賈尼(Antonio Tajani)在其草擬的行動計畫中對這一政策目標作說明時說,歐洲汽車工業迫切需要得到支援,以應對挑戰。歐洲汽車工業間接或直接地創造1200個工作崗位,而部分廠商深陷危機。塔賈尼表示,過去數月是歐洲汽車工業經歷的艱難時刻,一些企業如法國PSA、義大利菲亞特、德國歐寶等遭遇強大的重組壓力,產品滯銷。

塔賈尼透過行動計畫承諾,將為歐洲汽車工業提供研發資金,並從歐洲社保基金中拿錢培訓員工,幫助其掌握新的技術。塔還想阻止歐洲國家單一購車補貼行為,在全歐範圍內推行統一的購買電動車補貼政策。法國的做法是,對購買法國本土生產的電動車或混合動力汽車予以最多至7000歐元的補貼,以支持本國汽車業發展和維護其競爭力。而在德國,汽車工業協會也曾多次提出要求予以補貼,但遭德政府拒絕。塔將于本週四飛往柏林遊說其擬出臺方案。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】

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

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

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

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

※幫你省時又省力,新北清潔一流服務好口碑

※回頭車貨運收費標準

分類
發燒車訊

日產CEO戈恩否認目前對電動汽車過度投資

日產汽車CEO卡洛斯·戈恩(Carlos Ghosn)日前表示,受人喜愛,唯一的關注點是電動汽車發展是否會受到能否盈利的拖累,但是從日產的經營發展狀況看,這顯然不是累贅,他否認目前對電動汽車過度投資。

事實上,今年前10個月,日產在美國的市場份額一直徘徊在7.9%,低於去年同期的8.2%。此外,日產押寶電動汽車的勢頭也顯現出頹勢,截至10月,聆風純電動汽車銷量下滑16%至6791輛,與全年20000輛的銷售目標相距甚遠。戈恩對此表示,若想在美國的市場份額達到10%,需要提高生產能力,他預計到2017年可實現此目標。

戈恩目前對日產設立的中期目標是:日產在2017年3月31日財年末在美國的市場份額達到10%。一旦達到這一目標,日產將在北美開設新分廠。新工廠的新增生產能力將用來生產英菲尼迪。現在,英菲尼迪汽車除了JX跨界車在田納西州士麥那生產外,其他的都在日本本土生產。

對於英菲尼迪LE純電動概念車所扮演的角色,戈恩表示,零排放汽車對我來說是即使不賣也要保留的車型。市場上會出現越來越多的零排放汽車,理所當然,英菲尼迪也至少有這樣一款車型。很顯然,它是一款旗艦車型,會開發、量產、上市銷售。

當被問及是否擔心為在全球推出上萬輛電動汽車而過度投資時,戈恩對此予以否認。他說,“我不這樣認為,因為今天我們的投資規模是年產50萬輛,這與潛在需求是適度匹配的,我們正在密切關注中國市場,同時關注著法國的電動汽車新激勵政策。無論如何,美國未來將不得不接受電動汽車,並且是以可持續的態勢。而日本已經在這樣做了。因此,我不認為我們目前是在過度投資。”

據悉,到2015年,日產雷諾聯盟的電動汽車目標是達到累計銷售150萬輛。戈恩回應道:“雷諾有4款電動車型,其中最重要的一款Zoe將於2013年初發售,雷諾電動汽車的大規模市場啟動還沒有開始,日產方面,聆風純電動已經走向全球市場,日產雷諾聯盟會為達成目標而變得更有競爭力,但是現在還言之尚早。”

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

【其他文章推薦】

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

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

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

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

新北清潔公司,居家、辦公、裝潢細清專業服務

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

分類
發燒車訊

Kubernetes學習筆記(九):StatefulSet–部署有狀態的多副本應用

StatefulSet如何提供穩定的網絡標識和狀態

ReplicaSet中的Pod都是無狀態,可隨意替代的。又因為ReplicaSet中的Pod是根據模板生成的多副本,無法對每個副本都指定單獨的PVC。

來看一下StatefulSet如何解決的。

提供穩定的網絡標識

StatefulSet創建Pod都有一個從零開始的順序索引,這會體現在Pod的名稱和主機名上,同樣也會體現在Pod對應的固定存儲上。所以這些名字是可預先知道的,不同於ReplicaSet的隨機生成名字。

因為他們的名字都是固定的,而且彼此狀態都不同,通常會操作他們其中的一個。如此情況,一般都會創建一個與之對應的headless Service,通過這個Service,每個Pod將擁有獨立的DNS記錄。

擴容一個StatefulSet會使用下一個順序索引創建一個新的Pod,縮容會刪除索引值最高的。並且縮容任何時候只會操作一個Pod。

如何提供穩定的存儲

StatefulSet可以擁有一個或多個PVC模板,這些PVC會在創建Pod前創建出來,綁定到一個Pod實例上。

擴容的時候會創建一個Pod以及若干個PVC,刪除的時候只會刪除Pod。StatefulSet縮容時不會刪除PVC,擴容時會重新掛上。

使用StatefulSet

定義三個PV

定義pv-(a|b|c)

# stateful-pv-list.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-a
spec:
  capacity:
    storage: 1Mi
  accessModes:
  - ReadWriteOnce
  persistentVolumeReclaimPolicy: Recycle
  hostPath:
    path: /tmp/pva
---
apiVersion: v1
kind: PersistentVolume
# 以下忽略

headless的Service

# stateful-service-headless.yaml
apiVersion: v1
kind: Service
metadata:
  name: rwfile
spec:
  clusterIP: None
  selector:
    app: rwfile
  ports:
  - port: 80

定義StatefulSet

先創建兩個Pod副本。使用volumeClaimTemplates定義了PVC模板。

# stateful.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: rwfile
spec:
  replicas: 2
  serviceName: rwfile
  selector:
    matchLabels:
     app: rwfile
  template:
    metadata:
      labels:
        app: rwfile
    spec:
      containers:
      - image: registry.cn-hangzhou.aliyuncs.com/orzi/rwfile
        name: rwfile
        ports:
        - containerPort: 8000
        volumeMounts:
        - name: data
          mountPath: /tmp/data
  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      resources:
        requests:
          storage: 1Mi
      accessModes:
      - ReadWriteOnce

創建三個PV,一個headless的Service,一個StatefulSet

-> [root@kube0.vm] [~] k create -f stateful-pv-list.yaml
persistentvolume/pv-a created
persistentvolume/pv-b created
persistentvolume/pv-c created

-> [root@kube0.vm] [~] k create -f stateful-service-headless.yaml
service/rwfile created

-> [root@kube0.vm] [~] k create -f stateful.yaml
statefulset.apps/rwfile created

查看

-> [root@kube0.vm] [~] k get all -o wide
NAME                    READY   STATUS      RESTARTS   AGE   IP            NODE       NOMINATED NODE   READINESS GATES
pod/rwfile-0            1/1     Running     0          12s   10.244.1.52   kube1.vm   <none>           <none>
pod/rwfile-1            1/1     Running     0          8s    10.244.2.56   kube2.vm   <none>           <none>

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE   SELECTOR
service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   81s   <none>
service/rwfile       ClusterIP   None         <none>        80/TCP    23s   app=rwfile

NAME                      READY   AGE   CONTAINERS   IMAGES
statefulset.apps/rwfile   2/2     12s   rwfile       registry.cn-hangzhou.aliyuncs.com/orzi/rwfile

查看PV和PVC,可以看到已經有兩個PVC綁定了PV

-> [root@kube0.vm] [~] k get pv,pvc -o wide
NAME                    CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM                   STORAGECLASS   REASON   AGE     VOLUMEMODE
persistentvolume/pv-a   1Mi        RWO            Recycle          Bound       default/data-rwfile-0                           7m20s   Filesystem
persistentvolume/pv-b   1Mi        RWO            Recycle          Bound       default/data-rwfile-1                           7m20s   Filesystem
persistentvolume/pv-c   1Mi        RWO            Recycle          Available                                                   7m20s   Filesystem

NAME                                  STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE     VOLUMEMODE
persistentvolumeclaim/data-rwfile-0   Bound    pv-a     1Mi        RWO                           6m55s   Filesystem
persistentvolumeclaim/data-rwfile-1   Bound    pv-b     1Mi        RWO                           6m51s   Filesystem

請求Pod

啟動代理

-> [root@kube0.vm] [~] k proxy
Starting to serve on 127.0.0.1:8001

發送請求

-> [root@kube0.vm] [~] curl http://localhost:8001/api/v1/namespaces/default/pods/rwfile-0/proxy/ -d "a=123"
data stored in : rwfile-0

-> [root@kube0.vm] [~] curl http://localhost:8001/api/v1/namespaces/default/pods/rwfile-0/proxy/
a=123

刪除測試

刪除rwfile-0,然後查看,從時間上看確實是被刪除重建的。

-> [root@kube0.vm] [~] k delete po rwfile-0
pod "rwfile-0" deleted

-> [root@kube0.vm] [~] k get po
NAME                READY   STATUS      RESTARTS   AGE
rwfile-0            1/1     Running     0          7s
rwfile-1            1/1     Running     0          19m

看一下之前存儲的數據還在不在

-> [root@kube0.vm] [~] curl http://localhost:8001/api/v1/namespaces/default/pods/rwfile-0/proxy/
a=123

還是在的,此次測試實際上也證明了StatefulSet提供了穩定的網絡標識和存儲。

發現StatefulSet的夥伴節點

使用DNS解析headless的Service的FQDN。
例子以後再寫吧。。

如何處理節點失效

除非確定節點無法運行或者不會在訪問,否則不要強制刪除有狀態的Pod

k delete pod rwfile-0 --force --grace-period 0

小結

  • StatefulSet創建Pod都有一個從零開始的順序索引
  • 通常會創建一個與StatefulSet對應的headless Service。
  • 擴容一個StatefulSet會使用下一個順序索引創建一個新的Pod,縮容會刪除索引值最高的。
  • 新建StatefulSet需要指定headless ServiceName和volumeClaimTemplates。
  • 使用DNS發現StatefulSet的夥伴節點
  • 強制刪除:k delete pod rwfile-0 --force --grace-period 0

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】

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

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

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

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

※幫你省時又省力,新北清潔一流服務好口碑

※回頭車貨運收費標準

分類
發燒車訊

接口中的默認方法與靜態方法

在Java8之前的版本中,接口中只能聲明常量和抽象方法,接口的實現類中必須實現接口中所有的抽象方法。而在Java8中,接口中可以聲明默認方法靜態方法。

接口中的默認方法

Java 8中允許接口中包含具有具體實現的方法,該方法稱為“默認方法”,默認方法使用“ default ”關鍵字修飾 。

示例:

public interface MyInterface {
    default String getMsg(String srcMsg){
        return "======"+srcMsg;
    }
}

接口中的默認方法,有一個“類優先”原則:

若一個接口中定義了一個默認方法,而另外一個父類或接口中又定義了同一個同名的方法時:

  • 選擇父類中的方法。如果一個父類提供了具體的實現,那麼接口中具有相同名稱的參數的默認方法會被忽略。
  • 接口衝突。如果一個父接口提供一個默認方法,而另一個接口中也提供了一個具有相同名稱和參數列表的方法(不管方法是否是默認方法),那麼必須覆蓋該方法來解決衝突。

示例1:

public interface MyInterface1 {
    default String getMsg(String srcMsg){
        return "===我是MyInterface1111111==="+srcMsg;
    }
}
///////////////////////////////////////////////////////
public class MyClass1 {
    public String getMsg(String srcMsg){
        return "===我是MyClass11111==="+srcMsg;
    }
}
///////////////////////////////////////////////////////
public class MySubClass1 extends MyClass1 implements MyInterface1 {
}

///////////////////////////////////////////////////////
public class InterfaceTest {

    public static void main(String[] args) {
        MySubClass1 ms1 = new MySubClass1();

        String srcMsg = "Java 牛逼!!";
        //MySubClass1 類繼承了 MyClass1 類,實現了MyInterface1 接口,根據類優先原則,調用同名方法時,會忽略掉接口 MyInterface1 中的默認方法。
        System.out.println(ms1.getMsg(srcMsg));//輸出結果:===我是MyClass11111===Java 牛逼!!

    }
}

示例2:

public interface MyInterface2 {
    default String getMsg(String srcMsg){
        return "===我是MyInterface2222222==="+srcMsg;
    }
}
////////////////////////////////////////////////////////////////
public class MySubClass2 implements MyInterface1,MyInterface2 {
    @Override
    public String getMsg(String srcMsg) {
        //同時實現了 MyInterface1,MyInterface2  接口,根據 類優先 原則,兩個父接口中都提供了相同的方法,那麼子類中就必須重寫這個方法來解決衝突。
        return MyInterface1.super.getMsg(srcMsg);
        //return MyInterface2.super.getMsg(srcMsg);
        //return "------"+srcMsg;
    }
}
////////////////////////////////////////////////////////////////
public class InterfaceTest {

    public static void main(String[] args) {
        MySubClass2 ms2 = new MySubClass2();

        //MySubClass2 重新實現了兩個父接口中都存在的相同名稱的方法。
        System.out.println(ms2.getMsg(srcMsg));//輸出結果:===我是MyInterface1111111===Java 牛逼!!
    }
}

 

接口中的靜態方法

在Java8中,接口中允許添加 靜態方法,使用方式:“接口名.方法名”

示例:

public interface MyInterface3 {
    static String getMsg(String msg){
        return "我是接口中的靜態方法:"+msg;
    }

    static void main(String[] args) {
        System.out.println(MyInterface3.getMsg("Java牛逼!!"));
    }
}

 

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

【其他文章推薦】

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

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

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

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

新北清潔公司,居家、辦公、裝潢細清專業服務

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

分類
發燒車訊

番茄感染病毒 法國出現首批確診案例

摘錄自2020年2月18日中央社報導

法國農業部今天(18日)表示,法國最西邊菲尼斯泰爾省(Finistere)的番茄植物已遭一種毀滅性病毒污染,這種病毒可能導致全部作物付之一炬。

法新社報導,法國農業部表示,已隔離一座農場,並將摧毀充滿番茄的多座溫室,目前沒有已知的治療方法。

這種病毒稱作「番茄褐色皺紋果病毒」(ToBRFV),可造成番茄出現粗糙變色斑塊,以致番茄賣不出去。官員先前警告,這種病毒的散播對農夫將有「重大經濟後果」。

這種病毒對人類無害。2014年於以色列的溫室中傳出首例,之後傳播至歐洲及美洲。

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

【其他文章推薦】

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

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

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

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

※幫你省時又省力,新北清潔一流服務好口碑

※回頭車貨運收費標準

分類
發燒車訊

Dell 將於 2040 年全面轉用再生能源

摘錄自2019年11月13日unwire HK報導

隨著更多的企業響應環保,作為知名的電腦公司 DELL 在近日亦宣佈了新的可持續發展計劃,指公司所有設施的 75% 電力將會使用可再生能源,直至 2040 年時將預計可獲 100% 的電力,並同時在計劃在過程中提高公司在生產及供應鏈上的能源效益,以達致低排放的目標為環保出一分力。

DELL 在早前宣佈公司將進行「Progress Made Real」的計劃,計劃內容主要包括在消費者購買的每一項設備時會回收同一污染水平的產品,以及在生產電力方面採用可再生能源。DELL 指出到 2030 年時公司一半以上的設備將會由回收材料或可再生物料而生產,在包裝上則會全面使用可重覆利用的物料。

不過 DELL 就並未透露公司是否會增加旗下所有裝置的使用壽命,但就指出對電子製造商而言,應對氣候變化的最佳方法是避免所有電子產品送往堆填區,而是重覆使用及物盡其用。

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

【其他文章推薦】

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

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

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

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

新北清潔公司,居家、辦公、裝潢細清專業服務

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

分類
發燒車訊

驗證碼原理及驗證

驗證碼的原理

驗證碼的作用:

 驗證碼是是一種區分用戶是計算機還是人的公共全自動程序,可以防止:惡意破解密碼、刷票、論壇灌水、有效防止某個黑客對某一特定註冊用戶,用特定程序暴力破解方式進行不斷的登錄嘗試。實際上驗證碼是現在很多網站通行的方式,我們利用比較簡易的方式實現了這個功能。

生成驗證碼

生成驗證碼這個功能已經特別成熟了 在網上可以找到很多資源

以下是生成驗證碼的相關代碼:

package com._yhnit.randomcode;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 *  生成驗證碼的Servlet
 * @author yhn
 *
 */
@WebServlet("/createRandomcode")
public class RandomCodeServlet extends HttpServlet{

	private static final long serialVersionUID = 1L;
	 public RandomCodeServlet() {
	        super();

	    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        doPost(request, response);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        // 響應頭信息
        response.setHeader("Pragma", "No-Cache");
        response.setHeader("Cache-Control", "no-cache");
        response.setDateHeader("Expries", 0);

        // 隨機數生成類
        Random random = new Random();

        // 定義驗證碼的位數
        int size = 5;

        // 定義變量保存生成的驗證碼
        String vCode = "";
        char c;
        // 產生驗證碼
        for (int i = 0; i < size; i++) {
            // 產生一個26以內的隨機整數
            int number = random.nextInt(26);
            // 如果生成的是偶數,則隨機生成一個数字
            if (number % 2 == 0) {
                c = (char) ('0' + (char) ((int) (Math.random() * 10)));
                // 如果生成的是奇數,則隨機生成一個字母
            } else {
                c = (char) ((char) ((int) (Math.random() * 26)) + 'A');
            }
            vCode = vCode + c;
        }

        // 保存生成的5位驗證碼
        request.getSession().setAttribute("RANDOMCODE_IN_SESSION", vCode);

        // 驗證碼圖片的生成
        // 定義圖片的寬度和高度
        int width = (int) Math.ceil(size * 20);
        int height = 30;
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        // 獲取圖片的上下文
        Graphics gr = image.getGraphics();
        // 設定圖片背景顏色
        gr.setColor(Color.WHITE);
        gr.fillRect(0, 0, width, height);
        // 設定圖片邊框
        gr.setColor(Color.GRAY);
        gr.drawRect(0, 0, width - 1, height - 1);
        // 畫十條幹擾線
        for (int i = 0; i < 5; i++) {
            int x1 = random.nextInt(width);
            int y1 = random.nextInt(height);
            int x2 = random.nextInt(width);
            int y2 = random.nextInt(height);
            gr.setColor(randomColor());
            gr.drawLine(x1, y1, x2, y2);
        }
        // 設置字體,畫驗證碼
        gr.setColor(randomColor());
        gr.setFont(randomFont());
        gr.drawString(vCode, 10, 22);
        // 圖像生效
        gr.dispose();
        // 輸出到頁面
        ImageIO.write(image, "JPEG", response.getOutputStream());

    }

    // 生成隨機的顏色
    private Color randomColor() {
        int red = r.nextInt(150);
        int green = r.nextInt(150);
        int blue = r.nextInt(150);
        return new Color(red, green, blue);
    }

    private String[] fontNames = { "宋體", "華文楷體", "黑體", "微軟雅黑", "楷體_GB2312" };
    private Random r = new Random();

    // 生成隨機的字體
    private Font randomFont() {
        int index = r.nextInt(fontNames.length);
        String fontName = fontNames[index];// 生成隨機的字體名稱
        int style = r.nextInt(4);
        int size = r.nextInt(3) + 24; // 生成隨機字號, 24 ~ 28
        return new Font(fontName, style, size);
    }
}



上述代碼中 定義了生成5位数字+字母的驗證碼

生成的驗證碼 將存放到兩個地方:

  1. Session中
  2. 放到圖片上去

最重要的是 將驗證碼存入Session,因為後台校驗驗證碼是否正確要依靠這一步

// 保存生成的5位驗證碼
 request.getSession().setAttribute("RANDOMCODE_IN_SESSION", vCode);

前端頁面實現驗證碼的切換

在很多應用中 ,我們都會看見驗證碼的切換操作

比如:點擊圖片切換,或者點擊後面文字(類如 看不清,換一張) 進行切換

其實 切換很簡單 只是將圖片元素 的src 屬性 變換一下就可以完成

這裏給驗證碼圖片 和 換一張文字添加點擊事件

驗證碼:<input type="text" maxlength="5" required="required" name ="randomcode">
	   <img  src="/createRandomcode" style="cursor: pointer;" onclick="change();"  id="randomcodeImg">
		<a href="" onclick="change();">換一張</a><br>

點擊事件 是一個名字為change函數

function change(){
	// 因為有緩存  所以加一個隨機數  表示不同的請求
	document.getElementById("randomcodeImg").src="/createRandomcode?"+new Date().getTime();	
	}

注意這裏:src不能也寫 /createRandomcode,因為瀏覽器有緩存 因為之前的src就是它

所以點擊時不會發生切換,所以我們可以加個隨機數代表每一次都是一個新的請求。

這樣就可以實現驗證碼的切換了。

驗證碼的後台驗證

驗證其實也很簡單,只需要把輸入的和圖片中的驗證碼進行對比即可

獲取輸入的驗證碼:

String code = req.getParameter("randomcode");

獲取圖片中的驗證碼:

(生成的時候 已經存在Session中 這時只需要從Session中取出即可)

String Imgcode = req.getSession().getAttribute("RANDOMCODE_IN_SESSION").toString();

兩者進行對比驗證:

if (!code.equalsIgnoreCase(Imgcode)) {
    // 設置一些錯誤提示  提示用戶輸入錯誤 
	req.getSession().setAttribute("errorMes", "請輸入正確的驗證碼或已經過期");
	req.getRequestDispatcher("randomcode/RandomCodeLogin.jsp").forward(req, resp);
	return;
}
		
// 此時驗證碼成功
System.out.println("驗證碼成功");
// 避免重複提交  去除Session中這一次驗證碼
req.getSession().removeAttribute("RANDOMCODE_IN_SESSION");

// 繼續驗證用戶名和密碼  ....

驗證碼驗證成功之後 要銷毀Session中這次的驗證碼(驗證碼一次性使用) 避免重複提交

// 避免重複提交  去除Session中這一次驗證碼
req.getSession().removeAttribute("RANDOMCODE_IN_SESSION");

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】

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

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

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

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

※幫你省時又省力,新北清潔一流服務好口碑

※回頭車貨運收費標準

分類
發燒車訊

.NET 5 嘗鮮 – 開源項目TerminalMACS WPF管理端支持.NET 5

.NET 5 嘗鮮 – 開源項目TerminalMACS WPF管理端支持.NET 5

一個使用 Prism 作為模塊化框架、基於多個開源控件庫作為UI控件選擇、集成開源 UI 界面設計的 .NET 5 WPF 客戶端項目。

  • 項目名稱:TerminalMACS WPF管理端
  • 項目開源地址:
    • Github:https://github.com/dotnet9/TerminalMACS.ManagerForWPF
    • Gitee:https://gitee.com/dotnet9/TerminalMACS.ManagerForWPF
  • 作者:Dotnet9

1. 特性

  • 使用 .NET 5 開發,體驗最新 .NET 平台(和 .NET Core 3.1 無縫兼容)

.NET 5 是 .NET Framework 和 .NET Core 的未來,最終將成為一個統一平台,.NET5將包含ASP.NET核心、實體框架核心、WinForms、WPF、Xamarin 和 ML.NET。

  • 基於 Prism 8 搭建模塊化框架,方便程序擴展

Prism為程序設計提供指導,旨在幫助用戶更加容易的設計和構建豐富、靈活、易於維護WPF桌面應用程序。Prism使用設計模式(如MVVM,複合視圖,事件聚合器),幫助你創建一個松耦合的程序。遵循這些設計模式原則,將目標程序解耦成獨立的模塊。這些類型的應用程序被稱為複合應用程序。

  • 已使用或即將使用到多個開源WPF控件庫

    • MaterialDesignInXamlToolkit
    • HandyControl
    • PanuonUI.Silver
    • AduSkin。

參考以上多種開源 WPF UI 庫,多個選擇,開發 WPF 項目更方便。

  • ECharts

界面設計有使用到ECharts,使用WPF WebBrowser控件加載html的方式

ECharts:pie-doughnut

  • 本地化支持

  • 動態國際化支持

  • 支持主題色動態切換

2. 支持環境

  • .NET 5.0。

3. 當前版本

0.1

4. 鏈接

  • 官方網站:Dotnet9

5. 項目界面截圖

5.1. 關於

5.2. 首頁模塊

正在開發中…

5.3. 服務端模塊

正在開發中…

5.4. 客戶端模塊

正在開發中…

5.5. 測試案例

收集全球優秀的開源WPF界面設計,實時收集、實時添加更新,下面是部分實例截圖:

登錄註冊分類 1

  1. 簡單登錄窗體設計1

參考視頻:C# WPF Material Design UI: Login Window

參考源碼:Login2

  1. 簡單登錄窗體設計2

參考視頻:C# WPF Material Design UI: Login Window

參考源碼:Login1

  1. 美食應用登錄

參考視頻:WPF Food App Login UI Material Design [Speed Design]

菜單類 2

  1. 抽屜式菜單

參考視頻:C# WPF Material Design UI: Animated Colorful Navigation Drawer

參考源碼:AnimatedColorfulMenu

  1. 菜單切換用戶控件

參考視頻:C# WPF Material Design UI: Fast Food Sales

參考源碼:Pizzaria1

  1. 菜單切換動畫

參考視頻:C# WPF Material Design UI: Animated Menu

參考源碼:AnimatedMenu1

其他界面設計 3

  1. 移動應用儀錶盤

參考視頻:WPF Dashboard UI – Material Design [Speed Design]

參考源碼:WPF-Dashboard-UI-Material-Design-Concept

  1. 簡易儀錶盤2

參考視頻:WPF Dashboard UI – Material Design [Speed Design]

參考源碼:WPF-Dashboard-UI-Material-Design-Concept

ECharts:pie-doughnut

  1. Instagram重新設計

參考視頻:C# WPF Material Design UI: Redesign Instagram

參考源碼:Instagram

  1. LoLGoal

參考視頻:dotnet9

參考源碼:dotnet9

  1. 簡易音樂播放器1

參考視頻:C# WPF Material Design UI: Dashboard

參考源碼:Dashboard

  1. 百度地圖

通過WPF WebBrowser控件加載html5文件的形式加載百度地圖,使用JavaScript與C#互操作實現地圖交互。

  1. 聊天界面設計

參考視頻:

  • C# WPF Design UI – 1/3 – Contact List
  • C# WPF Design UI – 2/3 – Profile
  • C# WPF Design UI – 3/3 – Chat

參考源碼:Chat

  1. 計算器

參考視頻:

  • Calcalator

關注Dotnet9,分享更多好文
如果本文對你有用,歡迎轉載,Dotnet9對應原文有markdown格式原文分享下載哦。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】

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

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

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

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

※幫你省時又省力,新北清潔一流服務好口碑

※回頭車貨運收費標準