文:矢崎克馬;翻譯、整理:宋瑞文;審稿:上前万由子等
本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!
※網頁設計公司推薦不同的風格,搶佔消費者視覺第一線
※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整
※南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!
※教你寫出一流的銷售文案?
※超省錢租車方案
※聚甘新
摘錄自2020年03月26日星島日報報導
英國因應疫情實施禁足令,世界最古老,有近200年歷史的倫敦動物園(London Zoo)也關閉,是自二戰以來首次,園方呼籲各界捐贈,以保護園內大約1.8萬隻動物。
有別於博物館或藝術館,倫敦動物園即使關閉,園內的動物仍有其需要,無論獅子、大猩猩、斑馬和長頸鹿等大型獸類,或是馬達加斯加蟑螂等其他大小動物。
倫敦動物學會營運長表示:「我們通常完全依賴公眾支撐開支,因此若沒有人造訪,就不會有收入。我們必須尋求其他收入來源,讓人們展現對我們的支持並進行捐贈。」她指出:「我們的動物吃得很多,我們必須確保供應鏈能夠繼續,且有高品質食物。無論是源自柯芬園的水果、蔬菜或肉類,我們需要持續的供應。」
本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!
※網頁設計公司推薦不同的風格,搶佔消費者視覺第一線
※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整
※南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!
※教你寫出一流的銷售文案?
※超省錢租車方案
※聚甘新
析構函數(Destructors),是對象的成員函數,沒有返回值也沒有參數,且一個類只有一個析構函數,當對象被銷毀的時候調用,被銷毀通常有這麼幾個情況。
編譯器會自動創建默認的析構函數,通常都沒有問題,但是當我們在類中動態分配了內存空間時,我們需要手段的回收這塊空間,防止內存溢出。就像這樣
class String
{
private:
char *s;
int size;
public:
String(char *); // constructor
~String(); // destructor
};
String::String(char *c)
{
size = strlen(c);
s = new char[size+1];
strcpy(s,c);
}
String::~String()
{
delete []s;
}
可以將析構函數的訪問權限設置為private,設置時沒有問題的,但是一個問題就是,通常的手段就沒法調用析構函數了。
如下所示,程序結束后要調用析構函數,但是析構函數時私有的沒法調用,所以會編譯出錯。
#include <iostream>
using namespace std;
class Test {
private:
~Test() {}
};
int main()
{
Test t;
}
以下這樣不會有問題,因為沒有對象被建立,也不用析構
int main()
{
Test* t;
}
以下這樣也不會有問題,因為動態分配的內存需要程序員手段釋放,所以程序結束時沒有釋放內存,也沒有調用析構函數。這裏插一句,動態分配的內存如果不手動釋放,程序結束后也會不會釋放,但是現代操作系統可以幫我們釋放,因為這個動態分配的內存和這個進程有關,操作系統應該可以捕獲到這個泄露的內存從而釋放。(查資料看到的)
int main()
{
Test* t = new Test;
}
如果使用delete來刪除對象,會編譯出錯
int main()
{
Test* t = new Test;
delete t;//編譯出錯,無法調用私有的析構函數
}
可以利用Friend函數,進行對象的銷毀,因為Friend可以訪問私有成員,所以可以訪問析構函數。
#include <iostream>
class Test {
private:
~Test() {}
friend void destructTest(Test*);
};
void destructTest(Test* ptr)
{
delete ptr;
}
int main()
{
Test* ptr = new Test;
destructTest(ptr);
return 0;
}
或者給類寫一個銷毀的方法,在需要銷毀的時候調用。
class Test {
public:
destroy(){delete this};
private:
~Test() {}
};
那麼什麼時候需要使用私有的析構函數呢?當我們只希望動態分配對象空間(在堆上)時候,用私有析構,就防止了在棧上分配,因為在編譯階段就會出錯。
當類用到多態的特性時候,使用虛析構函數。看如下的例子。
#include <iostream>
using namespace std;
class Base
{
public:
Base(){
cout << "Base Constructor Called\n";
}
~Base(){
cout << "Base Destructor called\n";
}
};
class Derived1: public Base
{
public:
Derived1(){
cout << "Derived constructor called\n";
}
~Derived1(){
cout << "Derived destructor called\n";
}
};
int main()
{
Base *b = new Derived1();
delete b;
}
例子里的析構函數都不是虛函數,當我們想用基類的指針來刪除派生類對象的時候,就出現了問題,“undefined behavior”,c++標準里規定,只由編譯器實現,通常這時不會報錯,會調用基類的析構函數。但這應該不是我們想要的,這會導致內存泄漏。所以要把析構函數置為虛函數。(msvc似乎不用給析構函數加virtual,默認就是虛的,gcc沒有默認還是要加的)
另外虛析構函數可以是純虛析構函數,但是要提供函數體,不然沒法析構,因為虛析構函數和一般的虛函數的overide還不一樣,虛析構函數要挨個執行,不提供函數體,會編譯出錯。
派生類,成員對象,基類這樣
class B
{public: virtual ~B(){cout<<"基類B執行了"<<endl; }
};
class D
{public:virtual ~D(){cout<<"成員D執行了"<<endl; }
} ;
class E
{public:virtual ~E(){cout<<"成員E執行了"<<endl; }
} ;
class A
{public:virtual ~A(){cout<<"基類A執行了"<<endl;};
};
class C:public A,B
{
public:virtual ~C(){cout<<"派生類執行了"<<endl;};
private:
E e;
D d;
};
int main()
{
C *c;
c=new C();
delete c;
}
結果為:
本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!
※網頁設計公司推薦不同的風格,搶佔消費者視覺第一線
※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整
※南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!
※教你寫出一流的銷售文案?
※超省錢租車方案
![]() |
台灣的電動機車品牌Gogoro已經能從台北一路騎到高雄,還將進軍歐洲市場。而台灣首款本地生產的電動汽車也正式領取生產執照,將由在地廠商必翔集團負責產銷。
必翔集團在台成立三十餘年,早期曾投入農業機械研發,近期則以電動代步車、醫療用車等車款代工為主要業務。看好全球電動車市場蓬勃,必翔於2011年正式成立必翔電動汽車公司,並獲得中國廠商比亞迪(BYD)的肯定,合作發展電動汽車技術。
必翔在宜蘭縣建有電動汽車組裝廠,客戶行銷歐洲。日前,必翔已成功取得台灣首張電動汽車生產執照,預計將在今年第三季前量產問世。
除電動汽車公司外,必翔集團旗下另一子公司必翔電能為磷酸鋰鐵電池廠,廠房位於新竹,每月可生產100萬顆18650鋰鐵電池,集團整體可形成電動車產業的垂直整合。為提供日漸提升的電動車用電池需求,新竹廠房將陸續擴產到目前規模的10倍;公司也已申請掛牌上市,正在等待審核。
必翔集團也積極投入再生能源發展。必翔電動汽車的,由台灣永鑫能源負責開發、雲豹能源科技出資,完全採用美商First Solar的太陽能板,是First Solar在亞洲規模最大的屋頂型太陽能發電廠。
(照片:必翔公司廠房。來源:)
本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!
※網頁設計公司推薦不同的風格,搶佔消費者視覺第一線
※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整
※南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!
※教你寫出一流的銷售文案?
※超省錢租車方案
![]() |
美國電動車大廠 Tesla 傳出將在 3 月 20 日開始試產 Model 3,貿聯-KY為特斯拉電池線束的主力供應廠,可望受惠,今年營運展望佳。13 日股價上漲 3.5%,上漲 6 元,股價收在 177.5 元。
市場傳言,貿聯-KY供應 Model 3的電池管理線束已陸續開始交貨,新產品出貨的時程從 2 月就開始,目前是樣品階段,根據 Tesla 給貿聯-KY的預估量,是呈現逐季上揚,因此,貿聯-KY的業績在 2017 年是樂觀的一年,呈現逐季上揚。
貿聯-KY今年營收成長動能主要延續資訊產品業績成長,另外,年底則隨著電動車客戶平價車種投產挹注產品線;資訊用線主要在 Type C 市場應用起飛,帶動周邊擴充基座需求同步放大。
貿聯-KY元月營收 6.6 億元,月減 25.2%,年減 5.39%。公司表示,上月資訊用線擴充基座需求成長,另外,車用線整體訂單平穩,但受到季節性淡季以及工作天數減少影響,導致營收較上月衰退。
國泰證券金融商品部建議,看好貿聯-KY等個股,在行情震盪時,可以權證代替股票,布局相關認購權證。可留意如貿聯國泰65購01、貿聯永豐66購01、貿聯國泰67購01等權證。這 3 檔皆在價外 15% 以內,且距離到期日仍有三個月以上。
(本文內容由授權使用。圖片出處:Tesla)
本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!
※網頁設計公司推薦不同的風格,搶佔消費者視覺第一線
※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整
※南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!
※教你寫出一流的銷售文案?
※超省錢租車方案
![]() |
Tesla Motors有超過50萬筆Model 3之訂單,為了讓這些訂單準時出貨,Tesla創辦人Elon Musk表示,占地1,500萬平方英尺、專用來生產Tesla電動車用鋰電池的超級工廠Gigafactory進度已超前預定進度兩年。而Gigafactory存在的原因很簡單,即是為了降低鋰電池的生產成本。
據網站Electrek報導,近期研究顯示,電動車鋰電池近6年來已降至每kWh 227美金,下降80%。即便如此,電動車高昂的價格仍令人難以負擔。
降低鋰電池成本一直為Tesla改善的目標之一。在新的宣傳影片裡,Tesla 表示將降低35% 的電池成本。 雖然Tesla 並沒有詳述電池成本下降的細節,但若從釋出的消息中,多少可以拼湊出一些樣貌。
從Tesla於2016年說的「低於每kWh 190美金」,套上降低電池成本35%,電池成本將會來到每kWh 124美金之下。假設一輛Model 3 需要55 kWh之電池,那麼電池成本最多為6,875美金。鋰電池看來似乎是生產成本裡最高的組件,但以一輛3.5 萬美元的電動車來說,評估下來似乎合理。
以Tesla自有品牌家用儲能系統Powerwall來說,規格14 kWh的售價為5,500美金;大型發電設備用的Powerpack、規格210 kWh/供電4小時的售價則為109,750美金。
若要使電動車和燃油車具成本競爭力,電動車之電池成本至少需降至每kWh 100 美金以內。Elon Musk 一度對於Tesla Motors無法在2020達到這個里程碑而失望。但以現階段狀況看來,於內華達州之Gigafactory 1 完成進度已達14%,即將於歐洲設廠之Gigafactory 2也已進行籌備階段,降低鋰點池生產成本的目標看很有機會達成。
(首圖為Gigafactory。來源:Tesla)
本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!
※網頁設計公司推薦不同的風格,搶佔消費者視覺第一線
※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整
※南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!
※教你寫出一流的銷售文案?
※超省錢租車方案
docker鏡像瘦身思路
一、簡介
docker鏡像太大,帶來了以下幾個問題:
這塊影響其實不算很大,因為對服務器磁盤來說,15GB的存儲空間並不算大,除非用戶服務器的磁盤空間很緊張
這塊影響真的很大,交付件zip包太大,導致用戶部署該產品時,花費的時間變長,客戶現場中反饋部署時間超過1.5小時,這嚴重影響用戶的體驗,降低滿意度
如果客戶的服務器規格不夠(特別是磁盤讀寫性能不夠),會增大部署失敗的概率。
二、瘦身思路
以下思路是我在該任務中嘗試使用用於鏡像瘦身的方法,均可以不同程度的降低DOcker鏡像的尺寸。
在Dockerfile構建Docker鏡像過程中,有可能引入臨時文件,比如:安裝包i、文件壓縮包。這些臨時文件忘記清理,導致佔據了一定的尺寸,有必要對其進行清理。
如下Dockerfile:
FROM xxxx/xxxx-jdk:1.0.0RUN apt-get update && apt-get install -y git maven
mysql-client nodejs nodejs-legacy python-pip graphviz npm unzip
Dockerfile裏面經常安裝很多工具,安裝完后,需要及時刪除安裝包緩存
(alpine) apk del openssh vim:刪除包及其依賴包
(Ubuntu) Apt-get clean:刪除所有已下載的包文件
(centos) Yum clean all: yum 會把下載的軟件包和header存儲在cache中,而不自動刪除。如果覺得佔用磁盤空間,可以使用yum clean指令進行清除,更精確 的用法是yum clean headers清除header,yum clean packages清除下載的rpm包,yum clean all一全部清除
上面的dockerfile中在安裝工具后應該執行下: && apt-get clean && rm -rf /var/lib/apt/lists/*
RUN apt-get update && apt-get install -y git maven mysql-client nodejs nodejs-legacy python-pip graphviz npm unzip && apt-get clean && rm -rf /var/lib/apt/lists/*
實例:
FROM centos:7 RUN yum update -y RUN yum install -y wget unzip socat java-1.8.0-openjdk-headless # Set permissions RUN yum clean all EXPOSE 8486
修改:將黃色標示的部分改寫成如下,大小從691Mb下降到583Mb
RUN yum update -y && yum install -y wget unzip socat java-1.8.0-openjdk-headless && yum clean all
有的Dockerfile中安裝了很多工具,這個工具的加在一起尺寸比較大,這塊需要挨個排查:客戶環境下,需不需要安裝該工具?很多工具其實是面向開發使用的,而用戶根本不會使用,那麼就沒有必要在客戶環境上使用安裝這麼工具的鏡像,應該仔細排除工具的必要性,會給鏡像瘦身帶來比較大的收益。比如, dockerfile中安裝了JDK。 這個有些情況下,完全沒必要,實際上可能jre就能搞定。
總之,能不安裝,就不安裝;能少安裝,就少安裝;能用輕量級的工具,盡量用輕量級的工具!!!
Docker多階段構建是17.05以後引入的新特性,旨在解決編譯、構建複雜和鏡像大小的問題。對於多階段構建,可以在Dockerfile中使用多個FROM語句。每個FROM指令可以使用不同的基礎,並且每個指令都開始一個新的構建。您可以選擇性地將工件從一個階段複製到另一個階段,從而在最終image中只留下您想要的內容。
如下圖所示為多階段構建的使用示例:
把多個Dockerfile合併在一塊,每個Dockerfile單獨作為一個“階段”,“階段”之間可以互相聯繫,讓后一個階段構建可以使用前一個階段構建的產物,形成一條構建階段的chain,最終結果僅產生一個image,避免產生冗餘的多個臨時images或臨時容器對象。
針對多階段構建的特點,分析我們產品裏面的dockerfile,如下面所示,該操作的目的是將tar包拷貝值容器內的路徑下,並解壓、執行後續操作。然而COPY層具有一定的大小,只起到臨時層的作用。(特別是這個tar包足足幾百MB!)。
FROM xxxx:${project.version}COPY karaf-${ccsdk.opendaylight.version}.tar.gz /tmp/ RUN mkdir /opt/opendaylight \ && tar zxvf /tmp/karaf-${ccsdk.opendaylight.version}.tar.gz --directory /opt/opendaylight \&& rm -rf /tmp/karaf-${ccsdk.opendaylight.version}.tar.gz \ && mv /opt/opendaylight/karaf-${ccsdk.opendaylight.version} /opt/opendaylight/current && mkdir -p /opt/opendaylight/current && ln -s /opt/opendaylight/current /opt/opendaylight/karaf-${ccsdk.opendaylight.version} RUN mkdir -p /opt/opendaylight/current/system/org/mariadb/jdbc/mariadb-java-client/${ccsdk.mariadb-connector-java.version} COPY mariadb-java-client-${ccsdk.mariadb-connector-java.version}.jar /opt/opendaylight/current/system/org/mariadb/jdbc/mariadb-java-client/${ccsdk.mariadb-connector-java.version} EXPOSE 8181
使用多階段構建,修改后的dockerfile如下圖所示,修改實現將第一階段拷貝並解壓好的文件複製過來即可,少了拷貝tar包的環節,這樣使得最終形成的鏡像中鏡像層數得到有效的降低,也一定程度上降低了鏡像尺寸。
FROM xxxx:${project.version} as baseFirst COPY karaf-${ccsdk.opendaylight.version}.tar.gz /tmp/ RUN mkdir /opt/opendaylight \ && tar zxvf /tmp/karaf-${ccsdk.opendaylight.version}.tar.gz --directory /opt/opendaylight \&& rm -rf /tmp/karaf-${ccsdk.opendaylight.version}.tar.gz \ && mv /opt/opendaylight/karaf-${ccsdk.opendaylight.version} /opt/opendaylight/current FROM xxxxxe:${project.version} as baseSecondRUN mkdir -p /opt/opendaylight/current && ln -s /opt/opendaylight/current /opt/opendaylight/karaf-${ccsdk.opendaylight.version} COPY --from=baseFirst /opt/opendaylight/current /opt/opendaylight/current RUN mkdir -p /opt/opendaylight/current/system/org/mariadb/jdbc/mariadb-java-client/${ccsdk.mariadb-connector-java.version} COPY mariadb-java-client-${ccsdk.mariadb-connector-java.version}.jar /opt/opendaylight/current/system/org/mariadb/jdbc/mariadb-java-client/${ccsdk.mariadb-connector-java.version} EXPOSE 8181
FROM ubuntu:16.04 # Copy APIKeys COPY ./messageservice/ /tmp/zookeeper/gerrit ------A EXPOSE 2181 2888 3888 B------> RUN useradd $ZK_USER && [ `id -u $ZK_USER` -eq 1000 ] && [ `id -g $ZK_USER` -eq 1000 ] && chown -R $ZK_USER:$ZK_USER /opt/$ZK_DIST/ /opt/zookeeper/ /var/lib/ /var/log/ /tmp/zookeeper/ USER $ZK_USER
問題排查如下:A處copy的文件700MB太大,很多文件沒用到
B處給/tmp/zookeeper添加屬組和屬主,該層也很大
修改:使用 COPY –chown=1000:1000 ./messageservice/ /tmp/zookeeper/gerrit, 鏡像大小從1.4GB 下降到700Mb
這一塊修改得當的話,得到的收益是最大的!!!最大的!!!最大的!!!
我們知道docker鏡像具有層級結構,如果很多鏡像具有相同的層,則這些相同的層就能得到復用(把多個鏡像生成一個tar),docker不會保存兩份相同放入層文件,通過提高層得復用能顯著降低整體的鏡像尺寸。比如常見方法有:替換統一的基礎鏡像、創建出統一的基礎鏡像、調整層的順序等等。這裏東西沒有整理,就不上圖了,可以自行腦補,查閱資料即可
我這邊經過這一步調整后,zip產品包從11.45GB下降到6.96GB
最終zip包從15GB下降到7GB
本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!
※網頁設計公司推薦不同的風格,搶佔消費者視覺第一線
※Google地圖已可更新顯示潭子電動車充電站設置地點!!
※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益
※別再煩惱如何寫文案,掌握八大原則!
※網頁設計最專業,超強功能平台可客製化
![]() |
電動車究竟行不行得通?讓特斯拉(Tesla)來告訴你答案。3 日上午,隨著特斯拉的股價飆升,特斯拉的市值正式超越了百年汽車大廠福特(Ford),成為美國第二大汽車製造商。
電動車將成主流?
華爾街日報報導,特斯拉近日公布2017 年第一季銷售數據,受到Model S、Model X 車款交貨量大增帶動,全球銷售量較去年同期大增69%,創下單季銷售量歷史新高,消息激勵股價3 日大漲7.3% 至298.52 美元,特斯拉的市值也來到487 億美元(約1.48 兆元台幣),超過福特的455 億美元(約1.38 兆元台幣)。
隨著車款交貨量提升,特斯拉將有望順利達成2017 上半年的5 萬台銷售目標。儘管整體銷售量仍無法與其他大廠做比較,但有越來越多的投資人相信,在經過數年可觀的成長後,美國汽車的銷售市場已經開始出現衰退,電動車將逐漸成為主流。
這項在1980 年代時日本車廠企圖研發的技術,如今卻可能由矽谷的公司來讓其發揚光大。
特斯拉的專長?
或許是嗅到未來的商機,不僅僅是特斯拉,許多汽車大廠也開始關注電動車及自駕車領域。通用也在日前就推出平價電動車Chevrolet Bolt,想與特斯拉一較高下,然而3 月僅銷售3,000 輛,與特斯拉Model 3的預購盛況相去勝遠。
福特即將上任的執行長費爾茲(Mark Fields)也承諾將在2021 年前推出自駕車,但百年企業轉型談何容易,目前看來仍舊困難重重。
基金公司ARK Invest 的分析師Tasha Keeney 認為,其他汽車大廠若想投入電動車和自駕車領域發展,目前得需付出比特斯拉雙倍的努力才有望達成。
福特的市值和2010 年底時大致相同,但當時新上市的特斯拉市值仍低於20 億美元(約608 億元台幣)。目前全美最大的汽車製造商是通用(General),市值為521 億美元(約1.58 兆元台幣)。
如今看來,特斯拉隨時有機會超越通用,奪下全美市值第一汽車製造商的寶座。
市值被高估?
由於看好特斯拉對自駕車共乘服務的未來發展,摩根史丹利的分析師Adam Jonas 將特斯拉的目標價訂為每股305 美元,部分投資人認為,相較起其他汽車大廠和科技龍頭,特斯拉更有望能將自駕技術真正帶進道路。
然而並非所有人都對特斯拉有信心,儘管已經成立13 年,特斯拉仍有著沉重的負債、未能穩定獲利,自駕車也還在測試階段。底特律車商和汽車研究中心主席David Cole 就認為,特斯拉的市值攀升是靠著炒作和承諾為基礎的。
對於外界的關注,馬斯克3日發推特表示,如果以特斯拉的歷史來看,確實會讓人覺得公司市值過高,但特斯拉現在的股價是反映風險調整後的未來現金流。福特則發聲明指出,營運並不會受股價波動影響,重心一直都放在透過經營來提升價值。
(合作媒體:。圖片出處:Public Domain CC0)
本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!
※網頁設計公司推薦不同的風格,搶佔消費者視覺第一線
※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整
※南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!
※教你寫出一流的銷售文案?
※超省錢租車方案
在這之前已經把編輯個人的所有信息的功能已經完成了
之後先對首頁的列表搞動態的,之前都是寫死的靜態
1、之前都是把好友寫死的,現在就在js裏面定義一個數組,用循環來動態的綁定
在onReady中定義,取真實的數據給定義的列表數組list
通過調用 db.collection(‘users’).get() 這裏沒有加其他的限制,得到的就是所有的數據了,拿到全部的數據之後就會觸發then方法了
用then返回的res中有一個data的列表集合,有一個注意的點就是,這樣子讀取是吧數據庫中的數據的全部字段,但是我們需要用的只是
用戶的頭像和點贊數、用戶昵稱,其他的數據其實是不需要的
可以加一個field方法,可以要求返回的字段是哪些的
可以看到是只有一個用戶,我們為了模擬的話,就可以多賬號進行調試,
1、創立多賬號
①首先這個多賬號的一定要是測試號,所以先進入微信的管理後台 https://mp.weixin.qq.com/
②進入 【成員管理】添加項目成員
③回到微信開發者工具中-》工具-》多賬號調試-》可以通過添加虛擬測試號來進行測試的,不用真實的微信號都可以
之後就是對點贊的功能進行設計了(就可以在index.wxml中給點贊的小心上加一個點擊事件即可了
(小細節在小程序中規定,在客戶端中讀取用戶列表的時候,一般不會把整個數據庫的用戶都讀取出來的,是有一個限制的
一般都是把前二十條數據給讀取出來的,如果數據一多的話,一般都是進行分頁處理了–一般都是用數據庫中的collection.skip和collection.limit,這兩個東西一起配合的話就可以做下拉加載的功能了)
由於這個點贊是要對找到用戶的id地址的,所以在wxml中給點贊這個圖標加上一個id自定義屬性的掛載
data-id="{{ item._id}}"
這個東西的用處就是,在點擊這個心心的時候就可以拿到這個自定義的屬性id了
通過把handleLinks(ev)函數中把ev打印出來發現,這個自定義屬性id 的位置在
ev.target.dataset.id
console.log就是用來測試的,如果沒效果的話,一般都是直接在點擊事件後面通過promise 的then把res打印出來看看情況是怎麼樣的
***有時候這些點擊事件無法觸發的話,就可以在檢查一下樣式,可能這個區域在前端显示是在這裏,但是實際上是在其他的地方,
也就是布局引起的問題了
可以看到這裏就是碰到的是點贊的這個圖標,但是這個樣式是在左上角進行了渲染的
這個時候為了演示把,就把自定義屬性,和點擊事件放在點贊圖標還有點贊數包含的這個text裏面了
<text bindtap="handleLinks" data-id="{{ item._id}}" > <!-- 點贊圖標 --> <text class="iconfont icondianzan" ></text> <!-- 點贊數 --> <text>{{ item.links }}</text> </text>
改完之後,再點擊心心或者是數量,就可以正常的進行點贊了
但是發現只有給自己點贊的時候才可以改變點贊的數量,而改其他人點贊的時候就改不了
比如:
這就是一個權限的問題了也就是只能改自己的數據(點贊數)改不了別人的數據l
因為在小程序端中,由於用戶可以直接對數據庫進行操作,所以會有一定的風險,所以就通過這個訪問權限來進行了限制
那?
怎麼修改別人的數據呢?—這個操作就要在服務端來進行操作了! 也就是在雲函數中去完成一個雲函數的操作了
下面就是講解 如何在 服務端來對数字字段來進行更改!
二、點贊功能實現與update雲函數
由於要在服務端來做的話,就可以把這一塊的部分代碼刪掉了
handleLinks(ev){ let id = ev.target.dataset.id; db.collection('users').doc(id).update({ data : { links : 5 } }).then((res)=>{ console.log(res) }); }
需要新創一個雲函數(新建一個node.js雲函數
這些默認的結構都是可以刪掉的了
之後就是參考 微信開放文檔 雲開發-》SDK文檔->數據庫-》collection->update-》示例代碼demo
其中:這個就是指定了數據庫的環境
cloud.init({
env: cloud.DYNAMIC_CURRENT_ENV
})
然後就是在服務端拿到數據庫db
const db = cloud.database()
然後可以在示例代碼中看到async這個異步的操作
直接複製 try catch
try { return await db.collection('todos').where({ done: false }) .update({ data: { progress: _.inc(10) }, }) } catch(e) { console.error(e) }
return就是返回一個異步的數據,而catch就是返回錯誤信息
主要修改的就是 db.collecion()中要反問那個數據庫表單,這裏不能寫死為users,因為可能其他的地方也是要用到更新的這個功能的
所以最好就是把update這個雲函數寫成一個通用的方式
其中雲函數入口函數
exports.main = async (event, context) => { 這個裡面的event就是前端傳參過來的對象了 就訪問 event.colletion,然後不用where而是用doc 再把event的doc也傳進來,這 ***小知識點:ES6的擴展運算符 。。。 (三個點)
更新成功了之後,就可以返回結果到前台了
這個就是update雲函數中js文件的代碼(傳進去的doc實際上是用戶的_id
// 雲函數入口文件 const cloud = require('wx-server-sdk') cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV }) const db = cloud.database() // 雲函數入口函數 exports.main = async (event, context) => { try { return await db.collection(event.collection).doc(event.doc) .update({ data: { ...event.data }, }) } catch (e) { console.error(e) } }
View Code
把雲函數寫好之後,這個時候雲函數還是在本地,要把這個雲函數傳到雲開發平台上
上傳了之後一定要去雲平台-》雲函數中去檢查一下
之後就可以調用這個雲函數了
再回到index.js 點贊的方法 handleLinkes方法中進行設置即可;
如果雲函數沒問題,可能是雲函數裏面定義的env出了問題,就可以寫死了,傳入自己的那個環境,就不用默認的那個環境了
【注意】修改了雲函數記得要重新上傳到雲平台才行
(因為在服務端是不會受到數據庫權限的限制的)
後面要優化的就是(上面的點贊是寫死給多少links的,並且不能點完之後立馬更新
可以把數據庫的links讀出來,+1之後再寫入,但是這樣的話就多了一個數據庫的操縱了 ,但是數據庫本身就提供了累加或者累減等運算的操作的
(這樣的話就只需要一次的數據庫讀取即可了)
在開放文檔 db.command裏面就有很多的方法
https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-sdk-api/database/command/Command.inc.html
示例代碼 將一個 todo 的進度自增 10: const _ = db.command db.collection('todos').doc('todo-id').update({ data: { progress: _.inc(10) } })
為了在服務端不把運算給寫死了,一般都是把運算直接通過前端來傳入的
由於前端不認識下劃線這種操作,因為前端要先解析,之後再把東西傳到服務端的,所以就可以在前端給服務端傳一個字符串的話
然後再在服務端解析即可
data : "{links : _.inc(1)}"
在前端把這個字符串傳入到服務端中,之後就可以在服務端那邊對這個字符串進行解析了
所以在update雲函數中 就要對event.data這個傳過來的數據進行判斷,判斷它的類型,是普通的還是字符串類型的,如果是字符串類型的話就要進行解析
用js裏面的eval方法,它是把字符串轉成 js 語句的
if(typeof event.data == 'string'){ event.data = eval('(' + event.data + ')') }
即可了(點一下心心就可以讓點贊數+1)
後面有空的話,可以繼續進行優化,也就是對一次的點贊數進行限制,或者是點一下加+1,再點一下就是取消了就-1了
後面就是要把點贊了之後,實時的把點贊數進行更新
可以看到給服務端那邊上傳之後,對數據庫進行了更新之後,then返回的結果res,中有一個是updated==1,就可以進行if判斷了
再用for循環對列表中的每一個元素判斷,是不是現在被點擊點贊的這個id
let updated = res.result.stats.updated; if(updated){ // 先用擴展運算符 克隆一份數組 let cloneListData = [...this.data.listData]; for(let i = 0;i < cloneListData.length ; i++){ if( cloneListData[i]._id == id){ cloneListData[i].links++; } } this.setData({ listData : cloneListData }); }
點贊數增加 就是通過_inc 但是在服務端中的update函數中是用全局的,不能寫死,所以運算的規則就通過前端傳過去
為了以後其他的頁面也有更新功能的話做準備了
本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!
※網頁設計公司推薦不同的風格,搶佔消費者視覺第一線
※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整
※南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!
※教你寫出一流的銷售文案?
※超省錢租車方案
![]() |
美國電動車廠特斯拉(Tesla)公佈首季獲利不如預期,但好消息是眾所矚目的Model 3平價電動車,有望如期量產。
特斯拉當季營收27億美元,為去年同期營收11.5億美元的兩倍多,亦優於分析師預估的26.2億美元。(路透社)
儘管如此,特斯拉當季每股虧1.33美元,遠超過分析師預估每股虧0.81美元。特斯拉去年同期每股虧1.45美元。
特斯拉說Model 3開發進度順利,將可在今年7月導入量產。不過從虧損超出預期可知,這應該是特斯拉燒錢換來的成果。
另外,特斯拉執行長Elon Musk還憂心客戶對定價只有35,000美元的Model 3期待太高,而忘了Model 3是平價車種,性能與續航力均不能與售價70,000美元的Model S相提並論。
特斯拉首季共交車25,051部,較去年同期成長64%、較去年第四季成長13%,上半年47,000-50,000部的交車目標也有望達陣。
(本文內容由授權使用。圖片出處:Tesla)
本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!
※網頁設計公司推薦不同的風格,搶佔消費者視覺第一線
※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整
※南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!
※教你寫出一流的銷售文案?
※超省錢租車方案