亞馬遜經濟開發引衝突 NGO不畏強權抗爭多年

摘錄自2019年11月30日中央通訊社巴西報導

環境保護與經濟發展孰輕孰重一直是受到矚目的議題。巴西亞馬遜雨林主要觀光目的地之一Alter do Chao聚落一直受到開發商青睞,當地NGO不畏強權,守護土地,抗爭多年。

巴西北部巴拉州刑警3天前拘捕Alter do Chao社區消防隊4名志工消防員,指控他們在亞馬遜雨林故意製造火災,以獲取國際金援,引起當地社運人士、原住民和環保團體抗議。

在近百個非政府組織(NGO)聯合施壓下,巴西法院昨天(29日)傍晚下令釋放這4名協助撲滅該地區森林火災的非政府組織Alter do Chao社區消防隊成員,但當地與非政府組織的緊張關係已經持續幾10年。

桑塔林觀光局指出,2018年約19萬名遊客造訪Alter do Chao。該地區的旅遊熱潮使村莊周圍地區,房地產開發商具有強烈的開發興趣。一方面,有強大的地方家族勢力和企業家主張在以清澈的河水和白色的沙灘而聞名的塔巴鳩斯(Tapajos)河沿岸建造大型酒店和度假村。另一方面,社運人士、例如與被逮捕的Alter do Chao社區消防隊有聯繫的環保團體,則主張對環境衝擊較小的旅遊業,以保留該區域的特點,並防止傳統社區被驅逐趕離。

巴拉聯邦大學(Ufpa)社會學家托瑞斯(Mauricio Torres)指出,Alter do Chao的爭議邏輯不同於亞馬遜其他區域,當地的旅遊文化、環境保護與經濟開發衝突,才是促成逮捕志工消防員的真實背景。

托瑞斯說,這是屬於一個一直在擴大發展的城市的衝突,有傳統社區面臨被驅逐趕離的壓力,但幕後推手不是木材商或農牧場,而是聚焦於旅遊業的房地產投機與開發。

有論點指出,巴拉州刑警對志工人員進行預防性拘留,指控他們自行引發火災,之後加以撲滅,以獲取國際機構的金援。但一名不願具名、害怕遭到報復的聯邦公務員告訴巴西媒體,社運人士、大學生和原住民強烈反對,致使提案沒有取得進展,所以在當地活動的環保團體都相信逮捕志工消防員的行動含政治動機。巴拉州長巴爾巴柳(Helder Barbalho)昨天已宣布撤換負責此案的警長,並質疑行動的合法性。

聯邦檢察廳自2015年以來進行的調查指出,非法佔領土地和房地產投機,是導致Alter do Chao環境退化的因素,「由於該地區是巴西最著名的度假勝地之一,成為旅遊和房地產業的爭相競奪的目標,且經常受到公共土地入侵者的壓力。」

【其他文章推薦】

※專業客製化禮物、贈品設計,辦公用品常見【L夾】搖身一變大受好評!!

示波器探測執行效能最佳化的8大秘訣

※選用哪種桶裝水,外宿露營超方便?

※(全省)堆高機租賃保養一覽表

※DIY自行施工建築隔熱紙,簡易教學大公開 !

※票選推薦煮婦最愛手壓封口機,省荷包不犧牲品質

中國湖泊過去50多年間西增東減變化明顯

摘錄自2019年12月1日中新網報導

中國科學院青藏高原研究所及合作單位研究發現,從20世紀60年代到2015年的50多年間,中國湖泊總面積增加5858平方公里,增幅為9%,並且呈現出西增、東減這一明顯不同的空間變化特徵。

該項研究結果顯示,2015年中國共有面積大於1平方公里湖泊2554個,總面積達7.4萬平方公里。其中,青藏高原地區湖泊最多,數量佔全國湖泊的41%,面積佔57%。總體來說,過去50多年間,中國湖泊總面積增加5858平方公里,增幅為9%,並且呈現出明顯不同的空間變化特徵:青藏高原、新疆、東北平原與山區湖泊面積增加顯著,增幅均超過15%,但內蒙古高原湖泊面積減幅達22%。過去50年中,141個新增的湖泊主要出現在中國西部,而333個消失的湖泊主要位於中國東部。

氣候因素是中國湖泊變化的主要原因,同時人類活動在東部平原和雲貴高原所造成直接影響分別約為39%和36%。

【其他文章推薦】

※影響示波器測試準確度的五大因素

※無毒橡膠墊片哪裡買的到?

※飲用桶裝水到底安不安全? 破解錯誤迷思!

※十大封口機人氣排行榜-烘焙必備幫手!

不鏽鋼螺絲的應用常識-五金修繕

連續封口機購物網-不怕你比價,就怕你買貴!

只要「一個塑料瓶」油煙機用上「一年都不用洗」

快到年底了,準備大掃除的朋友,收藏吧很實用哦

家裡油煙機不停滴油

油盒反覆清洗依舊很髒,

給油煙機用上這樣東西

再也不用為油煙機清潔發愁!

塑料瓶

用一隻舊塑料瓶就能解決!用塑料瓶代替油盒,再也不用清洗,超省事!

第一步:找來一個礦泉水瓶。在瓶身中間挖一個小圓洞,讓廢油可以滴入瓶內。洞口的大小可根據你家油煙機出油孔的大小調整,通常直徑約1.5cm左右即可。

第二步:根據油煙機上油盒掛鉤的位置,確定塑料瓶相應卡口的裁剪位置。

用捲尺測量好對應的寬度,以圓洞口為中心,確定兩側掛鉤卡口的位置,用筆畫上記號。

然後,用剪刀在兩側各剪一個縫隙,用來使塑料瓶固定在油煙機掛鉤上。

第三步:將做好的塑料品固定在原先掛油盒的位置,廢油就可以儲存在塑料瓶里了,如果油積滿了,直接扔掉塑料瓶。

保鮮膜

現在新款的側吸式油煙機,使用的是貼合在面板下方的油槽。那麼這種細長的油槽,怎樣清潔更方便呢?

可以用保鮮膜來防油污!

將保鮮膜鋪在油槽內側,使保鮮膜貼合在凹槽里,然後再將油槽安裝還原。

這樣油污就會被保鮮膜包裹著,每周將油槽拆卸下來,揭開保鮮膜,連帶廢油一起扔掉就好。

舊報紙

除了用保鮮膜隔離油污,還可以用舊報紙。報紙的吸油性更好,在油槽里鋪上幾層舊報紙,至少能保持3個月不用清理油槽。

將兩張報紙對摺至1/5大小,將其墊在凹槽內側,根據凹槽長度調整報紙,使其內側被報紙覆蓋,並壓緊報紙邊角,保證貼合平整。

清潔抽油煙機

解決了油煙機的油盒,清潔油煙機就不用費勁拆卸,只需要定期清潔排煙濾網,擦拭油煙機外部的污垢即可。不如試試這幾種「懶人清潔法」,讓你毫不費勁就能擦掉油污。

廢油清潔法

平時油煙機油盒積累的廢油,可以用來「以毒攻毒」,對付油煙機上的頑固油污。

先把廢油用一個廢舊的易拉罐罐里,然後用百潔布蘸取一點廢油,用來擦拭濾網表面的污垢。

用這些廢油,輕輕一抹就擦掉了那些黏在濾網上的陳年油脂。因為油類之間相互有滲透性,廢油和油污接觸后,便能軟化污垢。

小蘇打+洗潔精

將小蘇打和洗潔精混合,加入少量的清水稀釋后,噴洒在濾網表面,也能輕鬆去除油污。

噴洒完清潔溶液后,靜待10分鐘左右,便能看到頑固油污正在融化,這時用濕抹布擦拭,油污一抹就乾淨了!

這些方法有沒有很實用呢?

你們get到了嗎?

via

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

【其他文章推薦】

聽過「電子菸」嗎?想知道與一般傳統香菸有何不同嗎?

電子煙能幫助戒菸嗎?專家學者以健康觀點帶您來了解 !

新手該如何選擇電子菸口味及濃度呢?

草莓季開跑!苗栗大湖9園區「提前1個月開放」 免費入園「隨你吃到飽」帶走還打9折

眼看冬天就快到來,酸酸甜甜的草莓終於開始轉紅了!雖然今年秋老虎持續發威,直到現在都還感受不到寒意,但也正是充足的陽光,讓以往12月才成熟的「大湖草莓季」,提前在11月就進入了盛產時節,不少園區目前都已經開放民眾採草莓,若想要搶先品嚐最鮮美的好滋味,那麼現在就可以趁著晴朗的好天氣,出發前往苗栗了!

圖片來源:大湖旅遊網

根據《ETtoday新聞雲》報導,苗栗縣大湖鄉是全台灣最大的草莓產地,幾乎每年冬天都會吸引大批旅客前來採果,而今年則是受到天氣影響,讓草莓季提早一個月開跑,造福了不少喜歡吃草莓的民眾。對此,大湖旅遊網表示,現在正好是「第一期花」的季節,以生產「香水草莓」、「美姬草莓」為主,通常它們的果粒色澤看上去會比較艷麗,且果肉紮實有嚼勁,無論大小顆的甜度都非常不錯。

圖片來源:自由時報

目前,苗栗大湖所有的觀光草莓園都是不收入園費的,只是會以秤重計價,每台斤大約350元至400元之間,採多少算多少,並沒有最低消費的門檻限制。而如果民眾採完後,要帶回家馬上吃的話,建議可以採顏色較深的「全熟」果實,其他7、8分熟的果實比較耐放,只要確實冷藏,就可以放5至7天。但是這裡必須提醒大家,請一定要體諒農民「粒粒皆辛苦」,不能邊採邊吃,父母也要看好小朋友,別讓他們動手擠、捏草莓,以免果實受損。

圖片來源:Dcard、大湖旅遊網

另外,為了分散人潮,目前也有9家園區提供了「平日打9折」的優惠,其中包含棋琦牛奶草莓園、全興高架草莓農場、山之戀草莓園、六合牛奶草莓農場、豐樂草莓園、巧合草莓園、名品牛奶草莓園、公主草莓園以及楓和草莓園,如果大家時間上許可的話,可以選擇平日去採草莓,除了避免人擠人,也比較有機會挑到又大又紅的草莓喔!

圖片來源:聯合新聞網

更多資訊可到「大湖旅遊網」查詢。

酸酸甜甜的草莓最好吃了!趁著下週天氣晴朗,大家趕快衝一波了啊!

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

【精選推薦文章】

※聽過「電子菸」嗎?想知道與一般傳統香菸有何不同嗎?

電子煙能幫助戒菸嗎?專家學者以健康觀點帶您來了解 !

※新手該如何選擇電子菸口味及濃度呢?

速凍餃子怎麼煮?很多人做錯了,難怪餃子都破皮了

餃子既可以當主食又可以當小吃,可以煮湯,也可以蘸料吃,口感獨特,深受大家的喜愛。

許多人空閑的時候,都會自己在家包餃子,食材簡單,而且吃不完也可以放進冰箱速凍,想吃的時候再拿出來煮,完全不會影響口味。

但是煮速凍餃子的時候,很多人不懂得怎麼煮,每次煮的時候都會把餃子皮給煮破,其實是大家犯了三個誤區,教你們正確煮速凍餃子的做法,這樣餃子才不會破皮。

第一點:

很多人都是會把速凍餃子先解凍,其實這個做法是多餘了,因為速凍餃子解凍之後,皮會變得黏糊糊,這樣拿去煮立馬皮就破了。

第二點:

水開了才把速凍餃子放下去,很多人煮速凍餃子跟煮現包的餃子一樣,水沸騰了才把餃子放下去煮。

正確的做法應該是,拿去速凍餃子後直接放在鍋裡煮,這樣在水燒開的時候,餃子麵皮和餡兒是一起升溫的,餃子皮才不會容易破掉。如果是直接放沸水中煮的話,那麼餃子皮在高溫下很快就破掉,而裡面的餡可能還未熟。

餃子放入鍋中煮的時候,可以加點鹽,然後用筷子攪拌,防止餃子黏在一起。


第三點:

不要把鍋蓋蓋上,很多人煮餃子的時候,想要餃子更快熟都會蓋上蓋子,讓它熟的更快,但是煮速凍餃子的時候,最好不要蓋上鍋蓋,要用筷子推動,防止餃子黏在一起。因為蓋上蓋子溫度會更加高,這樣餃子就很容易破皮。

然後餃子煮10分鐘就可以撈起來了,配上蘸料就可以吃了。這樣煮出來的餃子不破皮,而且很有嚼勁。大家煮速凍餃子的時候,不要解凍,不要沸水時下鍋,直接放鍋裡煮,還有不要把蓋蓋子,這樣煮出來的速凍餃子,就不會破皮。

經常吃速凍餃子的人可以這樣煮,餃子不破皮,味道好。

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

【精選推薦文章】

※聽過「電子菸」嗎?想知道與一般傳統香菸有何不同嗎?

電子煙能幫助戒菸嗎?專家學者以健康觀點帶您來了解 !

※新手該如何選擇電子菸口味及濃度呢?

生鏽螺絲不要用蠻力去擰!老師傅抹上可樂,輕鬆擰下螺絲

相信很多朋友都遇到過這樣的情況,就是生鏽的螺絲怎麼擰都擰不開。

別急,今天就跟大家分享幾個小妙招,輕鬆擰開,再也不用蠻力了,快來看看吧。

1、可樂。 

直接將可樂抹在生鏽的螺絲上,靜置一段時間後,就會發現螺絲很容易就擰開了。

這是因為可樂的成分中有碳酸,而鐵鏽的成分是氧化鐵,兩者發生化學反應就能將鐵鏽除去了。

2、酒精+白醋+洗潔精。 

瓶子中加入適量清水,然後倒入兩瓶蓋酒精,兩瓶蓋白醋,兩瓶蓋洗潔精,搖晃均勻。

倒一些在螺絲上,靜置了幾分鐘,再用扳手輕輕一擰,生鏽的螺絲就能立馬鬆動,毫不費力的就能把螺絲拆下來了。

3、用鎚子用力敲打。 

螺絲生鏽了,千萬不要用扳手硬擰,不然將螺絲擰滑就不好辦了。

應該用扳手擰住螺絲,然後用鎚子敲擊扳手的把手位置,頻率高的敲幾下,裡面生鏽的部位因敲擊而產生鬆動,再擰的話就輕鬆多了,或者直接敲擊螺母處,周圍都敲幾遍,也會讓螺母與螺絲之間產生鬆動,更容易擰開。

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

【精選推薦文章】

※聽過「電子菸」嗎?想知道與一般傳統香菸有何不同嗎?

電子煙能幫助戒菸嗎?專家學者以健康觀點帶您來了解 !

※新手該如何選擇電子菸口味及濃度呢?

番茄和金針菇太搭了!減脂吃不胖,連喝一周越來越瘦

想要好身材,肯定要從兩個方面入手,一個是飲食,一個是運動。

吃對了就真的太重要了,今天要跟大家極力推薦的這菌菇酸湯,

酸爽開胃,超級好喝,重點吃不胖能減脂呢!

因為這個酸湯所用的都是低脂易消化的食材,

番茄維生素豐富,多補充維c,

皮膚水潤有光澤,而且還不容易感冒哦!

菌菇酸湯裡的香菇、金針菇它們高蛋白、低脂肪、

低熱量暫且先不說,光是這鮮美的味道、嫩滑的口感,

就能讓你胃口大開了,好吃又營養,減脂吃不胖!

 

 

【菌菇酸湯】

主料:番茄,金針菇,香菇,雞蛋

配料:油,鹽

 

 

第一步:首先食材清洗乾淨,金針菇去掉根部,

番茄切小塊,香菇切片,雞蛋打散攪拌均勻備用。

 

 

第二步:熱鍋下油,放入番茄翻炒,翻炒至番茄出汁。

 

 

第三步:加入熱水,此時如果覺得湯汁濃度不夠的話

可以再加番茄醬調濃度,所以番茄醬不是必須的,可以根據自己口味來調整。

 

 

第四步:然後加入金針菇,香菇中火煮5-8分鐘。

 

 

第五步:倒入打散的雞蛋液,雞蛋液沿著鍋邊慢慢倒下去。

 

 

第六步:煮開後加入適量鹽調味即可出鍋。

 

 

一道好吃又營養,減脂吃不胖的菌菇酸湯就做好啦。

 

 

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

【精選推薦文章】

※聽過「電子菸」嗎?想知道與一般傳統香菸有何不同嗎?

電子煙能幫助戒菸嗎?專家學者以健康觀點帶您來了解 !

※新手該如何選擇電子菸口味及濃度呢?

drf組件之jwt認證

drf組件之jwt認證模塊

一、認證規則

全稱:json web token
解釋:加密字符串的原始數據是json,後台產生,通過web傳輸給前台存儲
格式:三段式 – 頭.載荷.簽名 – 頭和載荷用的是base64可逆加密,簽名用md5不可逆加密
內容:
頭(基礎信息,也可以為空):加密方式、公司信息、項目組信息、…
載荷(核心信息):用戶信息、過期時間、…
簽名(安全保障):頭加密結果+載荷加密結果+服務器秘鑰 的md5加密結果

認證規則:
後台一定要保障 服務器秘鑰 的安全性(它是jwt的唯一安全保障)
後台簽發token(login接口 ) -> 前台存儲 -> 發送需要認證的請求帶着token -> 後台校驗得到合法的用戶 -> 權限管理

為什麼要有jwt認證:
1)服務器壓力小, 後台不需要存儲token,只需要存儲簽發與校驗token的算法,效率遠遠大於後台存儲和取出token完成校驗
2) jwt算法認證,更適合服務器集群部署

二、認證模塊

安裝:pip install djangorestframework-jwt
模塊包:rest_framework_jwt

採用drf-jwt框架,後期任務只需要書寫登錄
為什麼要重寫登錄:drf-jwt只完成了賬號密碼登錄,我們還需要手機登錄,郵箱登錄
為什麼不需要重寫認證類:因為認證規則已經完成且固定不變,變得只有認證字符串的前綴,前綴可以在配置文件中配置

三、JWT使用

jwt配置;

在settings.py文件中配置,如果不配置,默認走jwt默認的

jwt插件的三個接口:

在urls.py中配置

在postman中測試一下籤發token

注意:上面三個接口都是發送POST請求

四、利用JWT實現多方式登錄

注:APIResponse 為自定義Response對象

# views.py
from rest_framework.views import APIView
from . import models,serializers
from utils.response import APIResponse

class LoginAPIView(APIView):
    # 登錄接口應該禁用所有的認證和、權限,因為不管是誰都應該能進來
    authentication_classes = []
    permission_classes = []
    def post(self, request, *args, **kwargs):
        # 將數據傳到序列化組件進行校驗
        user_ser = serializers.LoginSerializer(data=request.data)
        user_ser.is_valid(raise_exception=True)

        return APIResponse(msg='login success', data={
            'username': user_ser.user.username,
            'token': user_ser.token
        })

注意:

通過user對象生成payload載荷
payload = jwt_payload_handler(user)

通過payload簽發token
token = jwt_encode_handler(payload)

# serializer.py
from rest_framework.serializers import ModelSerializer, CharField, ValidationError, SerializerMethodField
from . import models
from django.contrib.auth import authenticate
import re
from rest_framework_jwt.serializers import jwt_payload_handler, jwt_encode_handler

class LoginSerializer(ModelSerializer):
    username = CharField(write_only=True)
    password = CharField(write_only=True)
    class Meta:
        model = models.User
        fields = ('username', 'password')

    def validate(self, attrs):
        # user_obj = authenticate(**attrs)
        # if not user_obj:
        #     raise ValidationError('用戶名或密碼錯誤')

        # 賬號密碼登錄 ==》 多方式登錄
        user = self._many_method_login(**attrs)

        # 通過user對象生成payload載荷
        payload = jwt_payload_handler(user)
        # 通過payload簽發token
        token = jwt_encode_handler(payload)

        # 將user和token存放在序列化對象中,方便返回到前端去
        self.user = user
        self.token = token

        return attrs

    # 多方式登錄 (用戶名、郵箱、手機號三種方式登錄)
    def _many_method_login(self, **attrs):
        username = attrs.get('username')
        password = attrs.get('password')
        # 利用正則匹配判斷用戶輸入的信息
        # 1.判斷郵箱登錄
        if re.match(r'.*@.*', username):
            user = models.User.objects.filter(email=username).first()  # type: models.User
        # 2.判斷手機號登錄
        elif re.match(r'^1[3-9][0-9]{9}$',username):
            user = models.User.objects.filter(mobile=username).first()
        # 3.用戶名登錄
        else:
            user = models.User.objects.filter(username=username).first()

        if not user:
            raise ValidationError({'username': '賬號有誤'})

        if not user.check_password(password):
            raise ValidationError({'password': '密碼錯誤'})

        return user

使用postman測試代碼:

五、前後台分離模式下信息交互規則

"""
1)任何人都能直接訪問的接口
    請求不是是get、還是post等,不需要做任何校驗

2)必須登錄后才能訪問的接口
    任何請求方式都可能做該方式的限制,請求必須在請求頭中攜帶認證信息 - authorization
    
3)前台的認證信息獲取只能通過登錄接口
    前台提供賬號密碼等信息,去後台換認證信息token
    
4)前台如何完成登錄註銷
    前台登錄成功一般在cookie中保存認證信息token,分離註銷就是前台主動清除保存的token信息
"""

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

※帶您來了解什麼是 USB CONNECTOR  ?

平板收購,iphone手機收購,二手筆電回收,二手iphone收購-全台皆可收購

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

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

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

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

【前端知識體系-JS相關】10分鐘搞定JavaScript正則表達式高頻考點

1.正則表達式基礎

1.1 創建正則表達式

1.1.1 使用一個正則表達式字面量

const regex = /^[a-zA-Z]+[0-9]*\W?_$/gi;

1.1.2 調用RegExp對象的構造函數

const regex = new RegExp(pattern, [, flags])

1.1.3 特殊字符

 - ^ 匹配輸入的開始
 - $ 匹配輸入的結束
 - \* 0次或多次  {0,}
 - \+ 1次或多次  {1,}
 - ?
   - 0次或者1次 {0,1}。
   - 用於先行斷言
   - 如果緊跟在任何量詞 *、 +、? 或 {} 的後面,將會使量詞變為非貪婪
     - 對 "123abc" 用 /\d+/ 將會返回 "123",
     - 用 /\d+?/,那麼就只會匹配到 "1"。
 - . 匹配除換行符之外的任何單個字符
 - (x)  匹配 'x' 並且記住匹配項
 - (?:x)  匹配 'x' 但是不記住匹配項
 - x(?=y)  配'x'僅僅當'x'後面跟着'y'.這種叫做正向肯定查找。
 - x(?!y)  匹配'x'僅僅當'x'後面不跟着'y',這個叫做正向否定查找。
 - x|y  匹配‘x’或者‘y’。
 - {n}  重複n次
 - {n, m}  匹配至少n次,最多m次
 - [xyz]   代表 x 或 y 或 z
 - [^xyz]  不是 x 或 y 或 z
 - \d  数字
 - \D  非数字
 - \s  空白字符,包括空格、製表符、換頁符和換行符。
 - \S  非空白字符
 - \w  單詞字符(字母、数字或者下劃線)  [A-Za-z0-9_]
 - \W  非單字字符。[^A-Za-z0-9_]
 - \3  表示第三個分組
 - \b   詞的邊界
   - /\bm/匹配“moon”中得‘m’;
 - \B   非單詞邊界

1.2 使用正則表達式的方法

  • exec 一個在字符串中執行查找匹配的RegExp方法,它返回一個數組(未匹配到則返回null)。
  • test 一個在字符串中測試是否匹配的RegExp方法,它返回true或false。
  • match 一個在字符串中執行查找匹配的String方法,它返回一個數組或者在未匹配到時返回null。
  • search 一個在字符串中測試匹配的String方法,它返回匹配到的位置索引,或者在失敗時返回-1。
  • replace 一個在字符串中執行查找匹配的String方法,並且使用替換字符串替換掉匹配到的子字符串。
  • split 一個使用正則表達式或者一個固定字符串分隔一個字符串,並將分隔后的子字符串存儲到數組中的String方法。

1.2.1 正則對象的三個方法

        //①test()判斷字符串中是否出現某個字符串,返回布爾值
        var re = /abc/;
        var str = '00abc66';
        console.log(re.test(str));  // true
        //②exec()查找並返回字符串中指定的某個字符串,只匹配一次
        var re = /abc/;
        var str = 'a0bc88abc00abc';
        console.log(re.exec(str));  // ["abc", index: 6, input: "a0bc88abc00abc", groups: undefined]
        //③compile()方法用於改變正則匹配的內容
        var re = /ab/;
        var str = "aabcdef";
        console.log(re.test(str));  //true
        re.compile(/bd/);
        console.log(re.test(str));  //false
        re.compile('66');
        console.log(re.test(str));  //false

1.2.2 字符串中與正則相關的方法

        //①search()方法,返回符合條件的字符串首次出現的位置(下標)
        var re = /abc/;
        var str = '00abc66';
        console.log(str.search(re));        // 2
        //②match()方法,返回查找的結果,如果查詢不到返回NULL
        console.log(str.match(re));         // ["abc", index: 2, input: "00abc66", groups: undefined]
        //③replace()方法,將匹配到的內容替換成指定內容
        console.log(str.replace(re, "*"));
        //④split()方法,將字符串分割成字符串數組
        console.log(str.split(re));

1.3 正則表達式子表達式相關

1.3.1 子表達式

在正則表達式中,通過一對圓括號括起來的內容,我們就稱之為“子表達式”。如:var re = /\d(\d)\d/;

1.3.2 捕獲

在正則表達式中,子表達式匹配到相應的內容時,系統會自動捕獲這個行為,然後將子表達式匹配到的內容放入系統的緩存區中。我們把這個過程就稱之為“捕獲”。

1.3.3 反向引用

在正則表達式中,我們可以使用\n(n>0,正整數,代表系統中的緩衝區編號)來獲取緩衝區中的內容,我們把這個過程就稱之為“反向引用”。

    var str = "d1122jj7667h6868s9999";
    //查找AABB型的数字
    console.log(str.match(/(\d)\1(\d)\2/)); //1122
    //查找ABBA型的数字
    console.log(str.match(/(\d)(\d)\2\1/)); //7667
    //查找ABAB型的数字
    console.log(str.match(/(\d)(\d)\1\2/)); //6868
    //查找四個連續相同的数字
    console.log(str.match(/(\d)\1\1\1/));   //9999

1.4 限定符

[!NOTE]
限定符可以指定正則表達式的一個給定字符必須要出現多少次才能滿足匹配。

    *:匹配前面的子表達式零次或多次,0到多
    +:匹配前面的子表達式一次或多次,1到多
    ?:匹配前面的子表達式零次或一次,0或1
    {n}:匹配確定的 n 次 
    {n,}:至少匹配 n 次 
    {n,m}:最少匹配 n 次且最多匹配 m 次

[!WARNING]
注意:針對於{n,m},正則在匹配到一個符合多種次數的字符串時,優先匹配次數多的,即能匹配到m次就不會匹配n次,這就是貪婪模式(默認)。

如果在其後加?即{n,m}?則會更改為非貪婪模式(惰性模式),則此時正則優先匹配n次。

    var str = "aa1a22a333a6a8a";
    console.log(str.match(/a\d*/));      //a
    console.log(str.match(/a\d+/));      //a1
    console.log(str.match(/a\d?/));      //a
    console.log(str.match(/a\d{3}/));    //a333
    console.log(str.match(/a\d{2,}/));   //a22
    console.log(str.match(/a\d{1,3}/));  //a1
    console.log(str.match(/a\d{1,3}?/)); //a1

    //貪婪模式加深理解,案例如下:
    //貪婪模式下最開始的'a2就符合條件',但是它會返回'a22'
    //注意:它是在遇到一個同時符合多個次數條件的字符串時,取符合次數多字符串
    var str = "a22aa1a333a6a8a";
    console.log(str.match(/a\d{1,3}/));   //a22
    console.log(str.match(/a\d{1,3}/g));  //a22 a1 a333 a6 a8
    console.log(str.match(/a\d{1,3}?/));  //a2
    console.log(str.match(/a\d{1,3}?/g)); //a2 a1 a3 a6 a8

1.5 定位符

[!NOTE]
定位符可以將一個正則表達式固定在一行的開始或結束。也可以創建只在單詞內或只在單詞的開始或結尾處出現的正則表達式。

^ (脫字符):匹配輸入字符串的開始位置
$:匹配輸入字符串的結束位置
\b:匹配一個單詞邊界
\B:匹配非單詞邊界

1.6 正則表達式的匹配模式(修飾符)

[!NOTE]
表示正則匹配的附加規則,放在正則模式的最尾部。修飾符可以單個使用,也可以多個一起使用。

  • ①g全局匹配,找到所有匹配,而不是在第一個匹配后停止
  • ②i匹配全部大小寫
  • ③m多行,將開始和結束字符(^和$)視為在多行上工作(也就是,分別匹配每一行的開始和結束(由\n或\r分割),而不只是只匹配整個輸入字符串的最開始和最末尾處。
  • ④s與m相反,單行匹配
    var re = /^[a-z]/gim;   //可組合使用

1.7 轉義字符

[!NOTE]
因為在正則表達式中 . +  等屬於表達式的一部分,但有時也需要匹配這些特殊字符,所以,需要使用反斜杠對特殊字符進行轉義。

  需要轉義的字符:
  點號.
  小括號()
  中括號[]
  左斜杠/
  右斜杠\
  選擇匹配符|
  
  * 
  ?
  {}
  + 
  $
  ^

2. 正則練習題

2.1 匹配結尾的数字

/\d+$/g

2.2 統計空格個數

字符串內如有空格,但是空格的數量可能不一致,通過正則將空格的個數統一變為一個。

let reg = /\s+/g
str.replace(reg, " ");

2.3 判斷字符串是不是由数字組成

str.test(/^\d+$/);

2.4 電話號碼正則

  • 區號必填為3-4位的数字
  • 區號之後用“-”與電話號碼連接電話號碼為7-8位的数字
  • 分機號碼為3-4位的数字,非必填,但若填寫則以“-”與電話號碼相連接
/^\d{3,4}-\d{7,8}(-\d{3,4})?$/

2.5 手機號碼正則表達式

正則驗證手機號,忽略前面的0,支持130-139,150-159。忽略前面0之後判斷它是11位的。

/^0*1(3|5)\d{9}$/

2.6 使用正則表達式實現刪除字符串中的空格

funtion trim(str) {
  let reg = /^\s+|\s+$/g
  return str.replace(reg, '');
}

2.7 限制文本框只能輸入数字和兩位小數點等等

/^\d*\.\d{0,2}$/

2.8 只能輸入小寫的英文字母和小數點,和冒號,正反斜杠(:./)

/^[a-z\.:\/\\]*$/

2.9 替換小數點前內容為指定內容

例如:infomarket.php?id=197 替換為 test.php?id=197

var reg = /^[^\.]+/;
var target = '---------';
str = str.replace(reg, target)

2.10 只匹配中文的正則表達式

/[\u4E00-\u9FA5\uf900-\ufa2d]/ig

2.11 返回字符串的中文字符個數

先去掉非中文字符,再返回length屬性。

function cLength(str){
  var reg = /[^\u4E00-\u9FA5\uf900-\ufa2d]/g;
  //匹配非中文的正則表達式
  var temp = str.replace(reg,'');
  return temp.length;
}

2.12 正則表達式取得匹配IP地址前三段

只要匹配掉最後一段並且替換為空字符串就行了

function getPreThrstr(str) {
  let reg = /\.\d{1,3}$/;
  return str.replace(reg,'');
}

2.13 匹配ul標籤之間的內容

/<ul>[\s\S]+?</ul>/i

2.14 用正則表達式獲得文件名

c:\images\tupian\006.jpg

可能是直接在盤符根目錄下,也可能在好幾層目錄下,要求替換到只剩文件名。
首先匹配非左右斜線字符0或多個,然後是左右斜線一個或者多個。

function getFileName(str){
  var reg = /[^\\\/]*[\\\/]+/g;
  // xxx\ 或是 xxx/
  str = str.replace(reg,'');
  return str;
}

2.15 絕對路徑變相對路徑

“http://23.123.22.12/image/somepic.gif”轉換為:”/image/somepic.gif”

var reg = /http:\/\/[^\/]+/;
str = str.replace(reg,"");

2.16 用戶名正則

用於用戶名註冊,,用戶名只 能用 中文、英文、数字、下劃線、4-16個字符。

/^[\u4E00-\u9FA5\uf900-\ufa2d\w]{4,16}$/

2.17 匹配英文地址

規則如下:
包含 “點”, “字母”,”空格”,”逗號”,”数字”,但開頭和結尾不能是除字母外任何字符。

/^[a-zA-Z][\.a-zA-Z,0-9]*[a-zA-Z]$/

2.18 正則匹配價格

開頭数字若干位,可能有一個小數點,小數點後面可以有兩位数字。

/^\d+(\.\d{2})?$/

2.19 身份證號碼的匹配

身份證號碼可以是15位或者是18位,其中最後一位可以是X。其它全是数字

/^(\d{14}|\d{17})(X|x)$/

2.20 單詞首字母大寫

每單詞首字大寫,其他小寫。如blue idea轉換為Blue Idea,BLUE IDEA也轉換為Blue Idea

function firstCharUpper(str) {
  str = str.toLowerCase();
  let reg = /\b(\w)/g;
  return str.replace(reg, m => m.toUpperCase());
}

2.21 正則驗證日期格式

yyyy-mm-dd格式, 4位数字,橫線,1或者2位数字,再橫線,最後又是1或者2位数字。

/^\d{4}-\d{1,2}-\d{1,2}$/

2.22 去掉文件的後綴名

www.abc.com/dc/fda.asp 變為 www.abc.com/dc/fda

function removeExp(str) {
  return str.replace(/\.\w$/,'')
}

2.23 驗證郵箱的正則表達式

開始必須是一個或者多個單詞字符或者是-,加上@,然後又是一個或者多個單詞字符或者是-。然後是點“.”和單詞字符和-的組合,可以有一個或者多個組合。

/^[\w-]+@\w+\.\w+$/

2.24 正則判斷標籤是否閉合

標籤可能有兩種方式閉合,自閉和或者對稱閉合的方式。

/<([a-z]+)(\s*\w*?\s*=\s*".+?")*(\s*?>[\s\S]*?(<\/\1>)+|\s*\/>)/i

2.25 正則判斷是否為数字與字母的混合

不能小於12位,且必須為字母和数字的混合

/^(([a-z]+[0-9]+)|([0-9]+[a-z]+))[a-z0-9]*$/i

2.26 將阿拉伯数字替換為中文大寫形式

function replaceReg(reg,str){
  let arr=["零","壹","貳","叄","肆","伍","陸","柒","捌","玖"];
  let reg = /\d/g;
  return str.replace(reg,function(m){return arr[m];})
}

2.27 去掉標籤的所有屬性

<td style="width: 23px; height: 26px;" align="left">***</td>
變成沒有任何屬性的
<td>***</td>

思路:非捕獲匹配屬性,捕獲匹配標籤,使用捕獲結果替換掉字符串。正則如下:

/(<td)\s(?:\s*\w*?\s*=\s*".+?")*?\s*?(>)/

2.28 駝峰表示

String.prototype.camelCase = function () {
        // .*?是非貪婪的匹配,點可以匹配任意字符,星號是前邊的字符有0-n個均匹配,問號是則是0-1;
        // (^\w{1}): 用於匹配第一個首字母
        // (.*):用於匹配任意個的前面的字符,.表示的就是任意字符

        // - param 1: 匹配到的字符串
        // - param 2: 匹配的的子字符串
        // - param 3: 匹配的子字符串
        // - param的位置
        // - param 5: 原始字符串 4: 匹配到的字符串在字符串中

        return this.replace(/(^\w{1})(.*)/g, function (match, g1, g2) {
            return g1.toUpperCase() + g2.toLowerCase();
        });
    }

2.29 模板字符串

// str = 'name: @(name), age:@(age)'
       // data = {name : 'xiugang', age : 18}
       /**
        * 實現一個簡單的數據綁定
        * @param str
        * @param data
        * @return {*}
        */
       String.prototype.formateString = function (data) {
           return this.replace(/@\((\w+)\)/g, function (match, key) {
               // 注意這裏找到的值必須返回出去(如果是undefined,就是沒有數據)
               // 注意:判斷一個值的類型是不是undefined,可以通過typeof判斷
               console.log(typeof data[key] === 'undefined');
               return data[key] === 'undefined' ? '' : data[key];
           });

       }

2.30 去掉兩邊的空格

/**
        * 去掉兩邊的空格
        * @param str
        * @return {*}
        */
       String.prototype.trim = function () {
           return this.replace(/(^\s*)|(\s*$)/g, '');
       }

2.31 獲取url參數: 使用replace保存到一個數組裡面,然後從數組裡面取出數據

'http://www.189dg.com/ajax/sms_query.ashx?undefined&undefined&undefined-06-27&undefined-06-27'
 url.replace(/(\w+)=(\w+)/g, function(a, b, c){
   console.log(a, b, c)
 })
action=smsdetail action smsdetail
sid=22 sid 22
stime=2014 stime 2014
etime=2014 etime 2014


// 封裝為一個函數
var url = "http://127.0.0.1/e/action/ShowInfo.php?classid=9&id=2";
function parse_url(_url){
 var pattern = /(\w+)=(\w+)/ig;
 var parames = {};
 url.replace(pattern, function(a, b, c){
   parames[b] = c;
 });
 return parames;
}
var parames = parse_url(url);
alert(parames['classid'] + ", " + parames['id']);

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

※為什麼 USB CONNECTOR 是電子產業重要的元件?

收購3c,收購IPHONE,收購蘋果電腦-詳細收購流程一覽表

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想要讓你的商品在網路上成為最夯、最多人討論的話題?

※高價收購3C產品,價格不怕你比較

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

ASP.NET Aries 高級開發教程:如何寫WebAPI接口

前提:

最近,有不少同學又問到,Aries里如何提供WebAPI接口?

針對這個問題,今天給順路寫個教程,其實呢,很簡單的。

方式一:直接用WebService提供接口。

用這種方式,直接添加接口就可以了,Aries只是默認處理了.html後綴的請求。對於WS的asmx後綴是沒有影響的,所以傳統怎麼添加就怎麼添加。

 

方式二:單獨用Taurus.MVC寫一個接口項目。

用這種方式,就是把接口獨立成一個項目,然後通過IIS部署成子應用程序就可以了。

只是部署成子應用程序的時候,需要注意一下子目錄和根目錄的web.config,出現重複的只能留根目錄的那個。

(一般都會建議用戶用這種方式,好處是可以在IIS里學會一下怎麼部署子應用程序。)

方式三:在Aries引入Taurus.MVC即可。

這個方式,其實也很簡單,下面介紹一下簡單的部署:

1、引用Taurus.MVC用於寫WebAPI:

在Web.UI項目添加引用Taurus.Core.dll(可以在Nuget上引用,也可以引用源碼項目再引用項目)

2、配置Taurus.MVC的兩個必備項:

A、在HttpModule中添加URL攔截。

//這是原來有的: 
<add name="Aries.Core" type="Aries.Core.UrlRewrite,Aries.Core" />
//這是新添加的:
 <add name="Taurus.Core" type="Taurus.Core.UrlRewrite,Taurus.Core"/>

B、在AppSetting中設置路徑模式:

<!--配置模式【值為0,1或2】[默認為1]
      值為0:匹配{Action}/{Para}
      值為1:匹配{Controller}/{Action}/{Para}
      值為2:匹配{Module}/{Controller}/{Action}/{Para}-->
    <add key="Taurus.RouteMode" value="1"/>

C、在AppSetting中設置接口代碼所在的項目:

<!--指定控制器所在的項目(Dll)名稱(可改,項目編繹的dll叫什麼名就寫什麼)
    <add key="Taurus.Controllers" value="Taurus.Controllers"/>-->

 

如果是用Nuget上引用的,默認都會有上面的兩個,其它默認生的,可以註釋掉。

3、開始寫應用接口代碼:

接口代碼寫在哪裡呢?放在哪個項目都可以,只要上面C點的配置指向就可以了,如果接口代碼分散在多個項目中,配置的value可以用“逗號”分隔。

按Taurus.MVC的方式寫接口,繼承自Taurus.Core.Controller即可:

如:

  /// <summary>
    /// API 接口
    /// </summary>
    public  class APIController : Taurus.Core.Controller
    {
        public void Hello()
        {
            Write("hello Controllers.API");
        }
    }

接口訪問:http://…/api/hello

總結說明:

Aries中默認處理的是.html後綴。

Taurus默認處理的是無後綴。

所以兩者並無衝突,直接引用,加配置就可以了,沒你想的複雜。

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

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

※高價3c回收,收購空拍機,收購鏡頭,收購 MACBOOK-更多收購平台討論專區

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

收購3c瘋!各款手機、筆電、相機、平板,歡迎來詢價!

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選