文:郭依潔(政大外交所研究生)
本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能
※評比前十大台北網頁設計、台北網站設計公司知名案例作品心得分享
※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選
※評比南投搬家公司費用收費行情懶人包大公開
※幫你省時又省力,新北清潔一流服務好口碑
電動版奔馳B級是戴姆勒繼Smart ForTwo電動版之後的第二款純電動車,由戴姆勒和特斯拉聯合開發,其電動馬達由特斯拉提供,今年將先後在美國和歐洲上市。

電動版奔馳B級擁有大約200公里的續航里程,0到100km/h加速僅需時7.9秒,最高速度為160km/h。其電動馬達由特斯拉提供,規律達174馬力,同寶馬i3電動車的規律相比還高出8馬力。目前戴姆勒尚未公佈新款奔馳B級電動車的售價。
電動版奔馳B級由戴姆勒位於德國的拉施塔特(Rastatt)工廠負責生產,汽油、柴油及天然氣版本的奔馳B級也在該工廠投產。據戴姆勒一名女發言人透露,電動版奔馳B級在其整個生命週期中的產量預計將達到五位數。
本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能
※評比前十大台北網頁設計、台北網站設計公司知名案例作品心得分享
※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選
※評比南投搬家公司費用收費行情懶人包大公開
※幫你省時又省力,新北清潔一流服務好口碑

英國政府宣布,將從 2035 年起禁止銷售汽油、柴油或混合動力的新車,比原計畫提前 5 年,以此降低燃燒化石燃料造成的二氧化碳。
英國首相 Boris Johnson 表示,各國必須採取行動應對二氧化碳的排放。在經過廣泛徵詢意見後,英國將在 2035 年停止銷售燃油車,包括汽油、柴油和混合動力車,如果在未來十多年的時間內很快地實現了燃油到清潔能源的過度,禁售令有可能更早生效。
英國是歐洲第二大汽車市場,以柴油和汽油為主的燃油動力車佔汽車總銷售量 90%,近年隨著政府大力推廣電動車,電動車在英國的市場需求持續提升,但潛在消費者仍然對充電體系的缺乏感到擔憂,同時市場銷售的電動車型號不多和定價較高阻礙更多消費者選購。 2019 年英國政府推出總額為 250 萬英鎊的補貼計畫,為更多城市街道安裝電動車充電裝備。
儘管禁售令到 2035 年才生效,但對傳統汽車廠商的影響將很快體現,目前英國汽車市場銷量占比前三的廠商為福特、福斯和 Vauxhall,電動車市場銷量占比前三則是特斯拉、三菱、BMW,傳統汽車廠商投資開發新車的週期為 7 年,這代表在未來幾年內將有更多電動車進入英國市場。
受影響較大的是德國汽車廠商,英國是德國傳統汽車廠商最大的單一出口市場,占其全球汽車銷售量 20%,電動車的研發和製造週期比傳統燃油汽車短,在電動車市場中德國汽車廠商將面臨更激烈的競爭。
(合作媒體:。首圖來源:)
本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能
※評比前十大台北網頁設計、台北網站設計公司知名案例作品心得分享
※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選
※評比南投搬家公司費用收費行情懶人包大公開
※幫你省時又省力,新北清潔一流服務好口碑
全球電動車用鋰電池領導廠商日本松下(Panasonic)宣布,將投資500億日圓(約新台幣136億元、人民幣27億元)在中國成立以電動車鋰電池為主要產品的電池工廠,預計在2017年投入生產。這是繼松下與特斯拉(Tesla)合作在美國內華達州成立Gigafactory之後,另一大車用鋰電池生產計劃,將鞏固松下在美、中兩大市場的發展基礎。
中國電動車市場後市看好,松下積極搶進
中國政府將電動車列為減輕空污方案的方案之一,在政策與產業面上皆有積極作為,包括提供民眾每輛車最高5.5萬元人民幣的購車補貼,以及比亞迪(BYD)、北企集團等業者發展電動車的獎勵措施等。根據《日經》新聞中文網的報導,中國純電動車(EV)與插電式油電混和車(PHEV)的市場規模目前雖然不及10萬輛,但在未來十年內將成長7.5倍到約65萬輛之譜;而根據中國汽車工業協會的統計,今年1~11月之間,EV與PHEV的產量比去年同期增加了4.4倍,來到29萬輛。且不僅中國大陸本土廠商,日產、福斯汽車等也已展開中國市場的布局。
中國EV與PHEV的需求爆發直接帶動車用鋰電池的成長,也因而促成松下宣布到中國設廠的決定。松下將與中國當地企業合作,投資500億日圓在遼寧省大連市建造鋰電池工廠,主要產品將供給EV與PHEV,預計年產量可供20萬輛電動車使用,以目前技術換算,電池容量年產量約為20GWh。
在松下之前,南韓LG Chem已於十月宣布將在江蘇省南京市建立車用鋰電池工廠,且已在中國展開推銷業務。
松下戰略:搶入美、中兩大市場
松下已是全球最大的車用鋰電池製造商,市佔率高達45.7%;第二名為日產NEC,佔17.3%,先前宣布在中國設廠的LG Chem的市占率10.5%則為全球第三。而在本次設立車用鋰電池廠之前,松下在中國大陸已有個人電腦的電池工廠。
松下於2014年宣布與Tesla合作在美國內華達州建設一座超大型鋰電池工廠Gigafactory,初期預估投資額約1,500億日圓。但隨著今年Tesla發表Powerwall/Powerpack並奪下大筆訂單、加上全球電動車需求暴漲的預期,Gigafactory的投資額最後估計將來到50億美元,且投產時程也從原先的2017提前到2016年。到了2020年整體廠房完成並產能全開時,Gigafactory總產能估計將達50GWh,可供50萬輛EV/PHEV使用;不過,該廠也有部分產能將用於生產Powerwall與Powerpack產品。
以日本企業近年對中國的投資額來看,500~600億日圓屬於較罕見的大手筆投資,同時顯示松下積極開發美、中兩大電動車市場的野心。目前美國是全球第一大電動車需求市場,中國、日本分列第二與第三。到了2025年,美國市場需求預計將來到95萬輛以上、中國也會成長到65萬輛左右。
本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※想知道網站建置、網站改版該如何進行嗎?將由專業工程師為您規劃客製化網頁設計及後台網頁設計
※不管是台北網頁設計公司、台中網頁設計公司,全省皆有專員為您服務
※Google地圖已可更新顯示潭子電動車充電站設置地點!!
※別再煩惱如何寫文案,掌握八大原則!
互聯網公司程序員,前些天項目趕進度,被強制加班。 我們公司以前也是鼓勵員工加班,但比較隱晦, 不是強制的,而這次是上司直接發話,必須要加班,否則工作無法完成的責任會扣到你頭上。
被要求強行加班,無償的,而且是喪心病狂的996,我臉上顯得很平靜,但是內心一萬頭草泥馬在奔騰。當天晚上,我就發微信給上司,我說:
“趕項目我一定不拖進度,該完成的工作按時完成,但是你別讓我加班,第一天弄的太晚,直接影響第二天工作效率,這樣得不償失”
工作只是生活的一部分,如果每天9點以後下班,就表示沒時間陪家人,沒時間娛樂活動,沒時間弄好吃的,沒有時間做自己感興趣的事情,到家直接洗洗睡,第二天醒來繼續上班,這樣的生活豈不是很無趣,加班是罪魁禍首。
寫程序是腦力勞動與體力勞動的結合,聚精會神寫一整天代碼,效率很高,但到了下班點,整個人會非常疲乏,如果繼續工作,會影響第二天狀態,所以後面所謂的加班其實是在划水,根本做不了什麼東西。當然,也可以平均分佈工作和划水,正常上班時也不用那麼認真,那麼加班的時候好像還能做點東西, 但是一整天的總工作成果沒有變化。所以,與其把工作分佈到12個小時,還不如前8個小時多做產出,后4個小時下班回家,這樣有效工作量並不會減少,還有了自由時間, 只是看起來沒那麼积極,但不用怕完不成工作而被問責。
程序員俗稱碼農,也叫IT民工,這是自黑,可在不懂技術的領導眼中就跟搬磚工沒區別,在他們眼裡,程序員多加班一小時,就會多一小時工作成果,搬磚嘛,或多或少總能搬幾塊。他們不知道,寫程序雖然不像搞藝術,非常依賴靈感,沒靈感什麼都幹不成,但在精神良好、腦子靈活的狀態下,工作效率絕對要高於無精打采、混混沌沌的狀態,有時候幾小時搞不定的問題,忽然間靈光一閃就能解決,這就不是靠加班加出來的。良好的工作狀態下產生的工作成果不是靠堆時間可以趕超的。所以很多時候在一個不開明的領導指揮下,團隊所有人看似很努力的在加班工作,其實所花的時間都是沒有意義的冤枉時間,原本這些時間可以做更有意義的事情。
還有一種加班,更加無厘頭,這種加班叫做:我也不知道為什麼要加班,別人在加, 那麼我也加一會。
這種加班,到下班時間點后員工們手上的工作停下來了,但沒人動屁股,大家看網頁的看網頁,看視頻的看視頻,打遊戲的打遊戲,下班,不存在的。因為別人都在加班,我下班了,感覺就像在犯罪,有強烈的罪惡感。這種加班比前一種加班更加可惡,沒半分實際意義, 但是偏偏就很難打破。其實每個人都在抱怨,可又沒有人敢越雷池一步。
說實話我挺佩服能不加班的人,雖然加班有很多外部因素,比如工作真的忙,比如公司文化就是這樣,在比如領導犯渾,但加班表達出來的意思其實就是工作任務完不成了,要多花時間。那麼不加班也意味着在正常的工作時間內能游刃有餘的完成工作,是能力的體現。
我也想實現這個夢想,所以我拒絕加班,領導也同意了,他說:“那你自己看着辦吧, 我不強迫你”,然而我知道,我在這家公司只能在地板上混了,連天花板都別想碰到,更別談升級,但是我覺得值,因為我想要更多的自由生活時間。
本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能
※評比前十大台北網頁設計、台北網站設計公司知名案例作品心得分享
※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選
※評比南投搬家公司費用收費行情懶人包大公開
※幫你省時又省力,新北清潔一流服務好口碑
人生苦短,我選Python
前文傳送門
我們前面聊過了為什麼要使用迭代器,各位同學應該還有印象吧(說沒有的就太過分了)。
列表太大的話會佔用過大的內存,可以使用迭代器,只拿出需要使用的部分。
生成器的設計原則和迭代器是相似的,如果需要一個非常大的集合,不會將元素全部都放在這個集合中,而是將元素保存成生成器的狀態,每次迭代的時候返回一個值。
比如我們要生成一個列表,可以採用如下方式:
list1 = [x*x for x in range(10)]
print(list1)
結果如下:
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
如果我們生成的列表非常的巨大,比如:
list2 = [x*x for x in range(1000000000000000000000000)]
結果如下:
Traceback (most recent call last):
File "D:/Development/Projects/python-learning/base-generator/Demo.py", line 3, in <module>
list2 = [x*x for x in range(1000000000000000000000000)]
File "D:/Development/Projects/python-learning/base-generator/Demo.py", line 3, in <listcomp>
list2 = [x*x for x in range(1000000000000000000000000)]
MemoryError
報錯了,報錯信息提示我們存儲異常,並且整個程序運行了相當長一段時間。友情提醒,這麼大的列表創建請慎重,如果電腦配置不夠很有可能會將電腦卡死。
如果我們使用生成器就會非常方便了,而且執行速度嗖嗖的。
generator1 = (x*x for x in range(1000000000000000000000000))
print(generator1)
print(type(generator1))
結果如下:
<generator object <genexpr> at 0x0000014383E85B48>
<class 'generator'>
那麼,我們使用了生成器以後,怎麼讀取生成器生成的數據呢?
當然是和之前的迭代器一樣的拉,使用 next() 函數:
generator2 = (x*x for x in range(3))
print(next(generator2))
print(next(generator2))
print(next(generator2))
print(next(generator2))
結果如下:
Traceback (most recent call last):
File "D:/Development/Projects/python-learning/base-generator/Demo.py", line 14, in <module>
print(next(generator2))
StopIteration
直到最後,拋出 StopIteration 異常。
但是,這種使用方法我們並不知道什麼時候會迭代結束,所以我們可以使用 for 循環來獲取每生成器生成的具體的元素,並且使用 for 循環同時也無需關心最後的 StopIteration 異常。
generator3 = (x*x for x in range(5))
for index in generator3:
print(index)
結果如下:
0
1
4
9
16
generator 非常的強大,本質上, generator 並不會取存儲我們的具體元素,它存儲是推算的算法,通過算法來推算出下一個值。
如果推算的算法比較複雜,用類似列表生成式的 for 循環無法實現的時候,還可以用函數來實現。
比如我們定義一個函數,emmmmmm,還是簡單點吧,大家領會精神:
def print_a(max):
i = 0
while i < max:
i += 1
yield i
a = print_a(10)
print(a)
print(type(a))
結果如下:
<generator object print_a at 0x00000278C6AA5CC8>
<class 'generator'>
這裏使用到了關鍵字 yield , yield 和 return 非常的相似,都可以返回值,但是不同的是 yield 不會結束函數。
我們調用幾次這個用函數創建的生成器:
print(next(a))
print(next(a))
print(next(a))
print(next(a))
結果如下:
1
2
3
4
可以看到,當我們使用 next() 對生成器進行一次操作的時候,會返回一次循環的值,在 yield 這裏結束本次的運行。但是在下一次執行 next() 的時候,會接着上次的斷點接着運行。直到下一個 yield ,並且不停的循環往複,直到運行至生成器的最後。
還有一種與 next() 等價的方式,直接看示例代碼吧:
print(a.__next__())
print(a.__next__())
結果如下:
5
6
接下來要介紹的這個方法就更厲害了,不僅能迭代,還能給函數再傳一個值回去:
def print_b(max):
i = 0
while i < max:
i += 1
args = yield i
print('傳入參數為:' + args)
b = print_b(20)
print(next(b))
print(b.send('Python'))
結果如下:
1
傳入參數為:Python
2
上面講了這麼多,可能各位還沒想到生成器能有什麼具體的作用吧,這裏我來提一個——協程。
在介紹什麼是協程之前先介紹下什麼是多線程,就是在同一個時間內可以執行多個程序,簡單理解就是你平時可能很經常的一邊玩手機一邊聽音樂(毫無違和感)。
協程更貼切的解釋是流水線,比如某件事情必須 A 先做一步, B 再做一步,並且這兩件事情看起來要是同時進行的。
def print_c():
while True:
print('執行 A ')
yield None
def print_d():
while True:
print('執行 B ')
yield None
c = print_c()
d = print_d()
while True:
c.__next__()
d.__next__()
結果如下:
...
執行 A
執行 B
執行 A
執行 B
執行 A
執行 B
執行 A
執行 B
執行 A
執行 B
...
因為 while 條件設置的是永真,所以這個循環是不會停下來的。
這裏我們定義了兩個生成器,並且在一個循環中往複的調用這兩個生成器,這樣看起來就是兩個任務在同時執行。
最後的協程可能理解起來稍有難度,有問題可以在公眾號後台問我哦~~~
本系列的所有代碼小編都會放在代碼管理倉庫 Github 和 Gitee 上,方便大家取用。
本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※想知道網站建置、網站改版該如何進行嗎?將由專業工程師為您規劃客製化網頁設計及後台網頁設計
※不管是台北網頁設計公司、台中網頁設計公司,全省皆有專員為您服務
※Google地圖已可更新顯示潭子電動車充電站設置地點!!
※別再煩惱如何寫文案,掌握八大原則!
引用自: 《重構 改善既有代碼的設計》
重構是在不改變軟件可觀察行為的前提下改善其內部結構。當你面對一個最需要重構的遺留系統時,其規模之大、歷史之久、代碼質量之差,常會使得添加單元測試或者理解其邏輯都成為不可能的任務。此時你唯一能依靠的就是那些已經被證明是行為保持的重構手法: 用絕對安全的手法從焦油坑中整理出可測試的接口,給它添加測試,以此作為繼續重構的立足點。
因為我們部門內容平台的文章系統之前遺留了很多問題,急需解決這些具有”壞味道”的代碼。最後因為其他人手頭裡都有其他工作,最後這些任務就交給了我。以下是急需解決的問題。
內容平台新增/更新/取消/刪除文章,同步各集團下文章行為狀態,消息鏈路過長的問題。
問題導火索: 運營後台文章發布,發送消息到marketing-base
慢鏈路,鏈路過長
mysql數據同步,單條執行n次
es索引數據同步,dubbo接口調用n次
圖1 鏈路圖
//開啟同步開關的集團
List<Integer> groupList = autoSyncStatusService.getAutoSyncGroupByManageType(MANAGE_TYPE_GROUP_ARTICLE);
for (Integer groupId : syncSubjectList) {
SiteGroupInfoDTO siteGroupInfo = siteSPI.getGroupInfoById(groupId);
Set<String> groupBrandSet = carOnSaleManage.getGroupBrandSet(siteGroupInfo);
List<String> matchedBrandCodes = extractBrandCodesFromArticleLabel(article.getLabelInfos());
if (CollectionUtils.isEmpty(matchedBrandCodes) || CollectionUtils.containsAny(groupBrandSet, matchedBrandCodes)) {
ArticleGroupMaterialBO groupMaterialBO =
ArticleBeanConverter.convertMaterial2GroupMaterial(article, groupId, groupList);
// 設置對應的集團主題id
ArticleGroupSubjectBO groupSubjectBO =
articleGroupSubjectService.getGroupSubjectBySoucheId(groupId, article.getSubjectId());
if (Objects.nonNull(groupSubjectBO.getId())) {
groupMaterialBO.setSubjectId(groupSubjectBO.getId());
groupMaterialBO.setMaterialId(myArticleId);
articleGroupMaterialService.addArticleGroupMaterial(groupMaterialBO);
}
}
} else {
//查詢同步的文章數據是否存在
List<ArticleGroupMaterialBO> list = articleGroupMaterialService.getListByMaterialId(myArticleId);
for (ArticleGroupMaterialBO a : list) {
if (groupList.contains(a.getGroupId())) {
articleGroupMaterialService.changeRecommendStatus(a.getId(), a.getGroupId(), recommend, article.getLastOperatorName(), article.getLastOperatorName());
}
}
}
第4行中我們可以看到這裡有一個for循環️,假設開啟同步開關的集體有1000家,則第18行中mysql插入操作就需要執行1000次。
第24行這裏同樣有一個for循環體️,則26行內部的es數據同步則需要調用1000次。它的實現如下:
@Override
public boolean changeRecommendStatus(int id, int groupId, int recommended, String lastOperatorUserId, String lastOperatorName) {
final boolean success = articleGroupMaterialDAO.changeRecommendStatus(
id, groupId, recommended, lastOperatorUserId, lastOperatorName) > 0;
if (success) {
//更新索引,更改推薦狀態
articleSearchManage.updateArticleIndex(ArticleIndexUtil.getUpdateRecommendIndex(recommended, id, lastOperatorName));
}
return success;
}
對於第一個循環️體中,我們需要將數據批量添加到數據庫,mybatis提供了將list集合循環添加到數據庫的方法。
insertForeach(List < Fund > list) 方法,返回值是批量添加的數據條數public interface FundMapper {
int insertForeach(List<Fund> list);
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.center.manager.mapper.FundMapper">
<insert id="insertForeach" parameterType="java.util.List" useGeneratedKeys="false">
insert into fund
( id,fund_name,fund_code,date_x,data_y,create_by,create_date,update_by,update_date,remarks,del_flag)
values
<foreach collection="list" item="item" index="index" separator=",">
(
#{item.id},
#{item.fundName},
#{item.fundCode},
#{item.dateX},
#{item.dataY},
#{item.createBy},
#{item.createDate},
#{item.updateBy},
#{item.updateDate},
#{item.remarks},
#{item.delFlag}
)
</foreach>
</insert>
</mapper>
com.souche.elastic.search.api.IndexService
方法:BulkUpdateResponse bulkUpdate(String index, Map<String, Object> event, String query, String origin)
參數:
index:要操作的索引
event:更新的數據,可以只包含需要更新的字段,相當於mysql的update語句中的set語句中的字段
query:query中的條件相當於mysql中的where,具體語法與下面的搜索接口中【querys:string 複雜的複合查詢 不同字段的OR 查詢】相同
origin:操作源,一般寫調用方自己的應用名,用於區分不同調用方
返回值:
BulkUpdateResponse:
{
requestId:本次操作的唯一標示
status:狀態,目前返回默認都是true
updated:成功更新的條數
failed:更新失敗的條數
message:第一條更新失敗的原因
}
調用示例:
1Map<String, Object> data = new HashMap<>();
2 data.put("id", 20);
3 data.put("title", "xue yin");
4 data.put("content", "kuang dao");
5 BulkUpdateResponse response = indexService.bulkUpdate("test_index", data, "address=bj AND contry=cn", "shenfl");
這條更新將test_index索引中所有 address是bj並且contry是cn 的數據的 title更新成‘xue yin’ content更新成‘kuang dao’,注意:address和contry兩個字段在索引中需要加索引
當前article數據表數據量:
select count(*) as 總數 from article;
結果如下:
總數
369737
@Override
public String addSharedArticle(ArticleBO articleBO) {
ArticleDO articleDO = new ArticleDO();
BeanUtils.copyProperties(articleBO, articleDO);
String shortUUID = UUIDUtil.getShortUUID();
articleDO.setUid(shortUUID);
if (articleDAO.addSharedArticle(articleDO) > 0) {
return shortUUID;
}
return StringUtil.EMPTY_STRING;
}
從上面這個業務邏輯實現類中,我們可以看到事實上我們想得到的是插入表數據的uid。但是之前的邏輯中,我們並沒有判斷該條數據是否已經存在,我們需要在上面代碼中判斷數據是否存在,已存在,查詢最後一天數據的uid返回給上層。不存在的話,執行插入操作。
article_material | CREATE TABLE `article_material` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`my_article_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '內容平台我的文章id',
`status` tinyint(3) unsigned NOT NULL COMMENT '1-待發布、2-發布、3-取消發布',
`subject_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '主題id',
`platform_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '平台id',
`source` varchar(32) NOT NULL DEFAULT '' COMMENT '版塊',
`crawler_article_id` varchar(32) NOT NULL DEFAULT '0' COMMENT '爬蟲的文章id',
`title` varchar(64) NOT NULL DEFAULT '' COMMENT '標題',
`cover_img` varchar(128) NOT NULL COMMENT '封面圖',
`summary` varchar(255) NOT NULL DEFAULT '' COMMENT '摘要',
`labels` varchar(512) NOT NULL DEFAULT '' COMMENT '標籤',
`label_infos` varchar(1024) NOT NULL DEFAULT '' COMMENT '標籤詳細信息',
`content` text NOT NULL COMMENT '內容,用戶看到的',
`content_imgs` text NOT NULL COMMENT '內容中圖片',
`content_videos` varchar(255) NOT NULL DEFAULT '' COMMENT '內容中視頻',
`content_draft` text NOT NULL COMMENT '草稿內容,編輯后保存到這裏,發布后內容會複製到content,此字段清空',
`content_imgs_draft` text NOT NULL COMMENT '草稿內容的圖片,同上',
`content_videos_draft` varchar(255) NOT NULL DEFAULT '' COMMENT '草稿內容的視頻',
`recommended` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '0-不推薦、1-推薦',
`author_user_id` varchar(64) NOT NULL DEFAULT '' COMMENT '作者userId',
`author_name` varchar(16) NOT NULL COMMENT '作者名稱',
`last_operator_user_id` varchar(64) NOT NULL DEFAULT '' COMMENT '最後操作人userId',
`last_operator_name` varchar(16) NOT NULL COMMENT '最後操作人名字',
`publish_date` datetime DEFAULT NULL COMMENT '發布時間',
`publisher_user_id` varchar(64) NOT NULL DEFAULT '' COMMENT '發布者userId',
`publisher_name` varchar(16) NOT NULL DEFAULT '' COMMENT '發布者名字',
`pv` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '流量pv',
`uv` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '流量uv',
`share_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '分享次數',
`share_people_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '分享人數',
`date_create` datetime NOT NULL,
`date_update` datetime NOT NULL,
`date_delete` datetime DEFAULT NULL,
`deleted` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '0 表示未刪除,刪除后是毫秒級時間戳',
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_id` (`my_article_id`),
KEY `idx_title_label_status` (`subject_id`,`platform_id`,`title`,`label_infos`(255),`source`)
) ENGINE=InnoDB AUTO_INCREMENT=861 DEFAULT CHARSET=utf8 COMMENT='文章素材庫,給集團提供文章素材'
上表中content, content_imgs,content_videos都是text類型等大字段,對於這種類型,我們需要把這種類型的表拆分成2張表 article_metedata和article_content 兩張表。
本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能
※評比前十大台北網頁設計、台北網站設計公司知名案例作品心得分享
※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選
※評比南投搬家公司費用收費行情懶人包大公開
※幫你省時又省力,新北清潔一流服務好口碑
之前看到一篇推薦這個搜索引擎的新聞,對於這個搜索引擎是否好用咱們不予置評,但是我在這個搜索引擎上面發現了一個好玩的前端功能。
如上圖,將鼠標浮動到學習來源上時,會展示一堆指引線。
本博客的右側文章目錄也集成了這個功能,諸位可以玩一玩。
當時覺得這個功能很好玩,而且前端領域其實這種指引線還是有很多用處的,比如新手指引,功能指引,腦圖之類的功能。
鑒於以後很可能需要用到,當時就調試了一下這個網站,發現使用了這個庫。
然後百度了一下,發現網上也沒什麼人介紹這個庫,所以這裏寫個安利文吧。
這個庫在Github上的介紹很簡單:
Draw a leader line in your web page.
意思就是在網頁上畫指引線。
使用起來也非常方便:
<script src="leader-line.min.js"></script>
<script>
new LeaderLine(
document.getElementById('start'),
document.getElementById('end')
);
</script>
new一個LeaderLine對象即可,只需要輸入兩個dom元素節點而已。
當然也可以輸入更多的參數來繪製各種各樣的指引線:
具體的使用方法可以去查看lead-line的,這裏就不贅述了。
而且這個庫本身就提供了hover繪製指引線的功能,並且能偏移起始點和結束點的位置,同時當起始點和結束點變動時,也可以實時調整指引線。
這兩個功能可以將鼠標hover到右側的文章目錄上,然後滾動鼠標輪來查看效果。
這個庫的實現原理其實很簡單,根據提供的兩個dom元素,找到這兩個dom元素的位置,然後通過svg在body下繪製一條指引線。
這個庫雖然只是個js,但是在引入後會將一些樣式寫到一個id為leader-line-defs的svg元素內。
這些指引線使用了一個叫leader-line的樣式class,如果繪製指引線時出現遮擋情況,可以通過調整這個樣式class的z-index或者position來處理。
可以預想一下,這些指引線都是position:absolute的,因為position:fixed的元素在滾動時肯定會存在問題。
原理都講了,所以諸位請在頁面有fixed元素或者absolute元素時,仔細查看指引線是否會與這些元素產生遮擋。
這裏就以我博客右側目錄集成的指引線功能作為示例代碼:
// 生成目錄上的指引線
function createCatalogLeaderLine($h2Arr) { // $h2Arr是一個dom元素集合,注意不是數組哦
// lines的目的是為了保留leader-line變量,方便重繪
var lines = {};
var options = {
color: '#5bf', // 指引線顏色
endPlug: "disc", // 指引線結束點的樣式
size: 2, // 線條尺寸
startSocket: "left", //在指引線開始的地方從元素左側開始
endSocket: "right", //在指引線開始的地方從元素右側結束
hide:true // 繪製時隱藏,默認為false,在初始化時可能會出現閃爍的線條
};
[].slice.call($h2Arr).forEach(function (item) {
var anchor = LeaderLine.mouseHoverAnchor(document.getElementById('catalog' + item.id), 'draw', {
// 指引線動效
animOptions: {
duration: 500
},
// 清除默認的hover樣式
hoverStyle:{
backgroundColor: null
},
// 起始點樣式,這裏為了清除默認樣式
style: {
paddingTop: null,
paddingRight: null,
paddingBottom: null,
paddingLeft: null,
cursor: null,
backgroundColor: null,
backgroundImage: null,
backgroundSize: null,
backgroundPosition: null,
backgroundRepeat: null
},
// 當起始點被hover時調用的事件
onSwitch: function (event) {
var line = lines[item.id]
// 浮動上去就重繪
if (event.type == "mouseenter") {
line.position();
}
}
});
lines[item.id] = new LeaderLine(
anchor,
document.getElementById(item.id),
options
);
})
// 滾動時重繪指引線
$(window).scroll(function () {
for (var key in lines) {
lines[key].position()
}
})
}
其中LeaderLine.mouseHoverAnchor為leader-line提供的api,顧名思義即可。
代碼就不講了,關鍵點都有註釋。
沒什麼好總結的,這裏發一個小吐槽。
其實我博客集成這個功能時,最開始是直接把這個庫的js複製粘貼到了博客園的自定義js代碼中,沒想到博客園這方面做了大小限制。
所以我就把Magi這個搜索引擎的引用地址拿來用了,萬一哪天這個搜索引擎不能用了或者js地址變了那麼我目錄的指引功能可能就掛了。
N年之後你看到這篇文章,也許功能失效了,到時候別忘了給我發個短消息提醒我一下。
本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※想知道網站建置、網站改版該如何進行嗎?將由專業工程師為您規劃客製化網頁設計及後台網頁設計
※不管是台北網頁設計公司、台中網頁設計公司,全省皆有專員為您服務
※Google地圖已可更新顯示潭子電動車充電站設置地點!!
※別再煩惱如何寫文案,掌握八大原則!
文:宋瑞文(媽媽監督核電廠聯盟特約撰述)
本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能
※評比前十大台北網頁設計、台北網站設計公司知名案例作品心得分享
※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選
※評比南投搬家公司費用收費行情懶人包大公開