92国产精品视频_亚洲a级在线观看_国产精品电影观看_国产精品免费观看在线_精品伊人久久97_亚洲人成在线观_尤物九九久久国产精品的特点_成人激情在线播放_成人黄色大片在线免费观看_亚洲成人精品久久久_久久免费视频在线观看_久久精品国产一区_国产一区二区三区18_亚洲欧美中文字幕在线一区_日韩美女中文字幕_日韩视频免费在线

首頁

垂類品牌年輕化重塑—有駕品牌升級

鶴鶴

什么是“有駕”

【有駕】是百度旗下的汽車信息與服務平臺,累計用戶超5.3億,致力于為用戶提供真實、可靠的看選買車服務,以及為車企和經銷商提供從品牌到效果的一站式互聯網營銷解決方案。 

現狀分析

有駕品牌在孵化初期,重點是在用戶詞建立品牌感知。所以我們提取“有駕“的字形做為品牌符號,減少歧義,強化用戶的感知。

但是隨著品牌持續運營進入新的階段,我們發現現有的設計無法滿足后續的運營訴求了,主要體現在:

品牌logo:不能體現汽車的行業屬性,缺乏成體系的品牌符號和VI體系,色彩上也不夠符合時下潮流的年輕配色體系。

品牌活動:品牌關聯度弱,活動維度單一。



項目概述

因此,我們重新梳理有駕的品牌定位與調性,借助本次品牌升級,打造有駕差異化風格,形成獨有的視覺印記。

因為用戶對于舊的logo已有一定的認知。所以此次改版的目標在保持固有用戶認知,在原有基礎上進行品牌標識的探索及應用,以強化品牌感知,提升品牌的競爭力,整合業務資源做心智觸達。





前期分析

前期我們對汽車垂類的競品進行了一輪調研,并且結合有駕的用戶群里,尋找有駕品牌的差異點。

有駕用戶群體年輕化為主,普遍具有高學歷,集中在新一線二線城市。

通過以上在用戶、行業及行業趨勢等多唯獨的信息搜集后,我們確定了有駕品牌設計的四個核心關鍵詞:年輕、科技、未來、專業。



建立體系

在明確設計方向后,我們梳理了線上線下的所有品牌觸點,結合前期的調研結論,匯總出了有駕設計系統的完整框架,以確保品牌設計的完整性和靈活適用性。




設計落地

基于前期分析洞察結論,我們在繼承圓形和車形的基礎上,對品牌符號與icon進行了大量的方案探索。從圖形、質感等方面切入,簡化圖形形態,嘗試不同的形態呈現的視覺感受和氣質。最終確定了全新品牌logo方案。




相對于升級前,新版的logo加入汽車元素,解決升級前logo的行業屬性不明確的問題,讓產品app的行業屬性更加直觀。同時增加品牌符號做為底紋,輔以有駕的圓形符號成為品牌核心的一部分。強化有駕的品牌基因。





符號提煉

確定品牌logo后,為了確保品牌能夠更好的拓展應用,進行了品牌符號的提煉。并為了延續之前的品牌調性。所以輔助圖形延續了之前的圓環造型,造型偏向輪胎;在不破壞原有型的基礎上,加入一些折角的質感的變化,使圖形變化更加豐富,更有識別度。





設計語言

為了更好的觸達到各業務場景,所以我們對視覺風格進行了探索和拓展。分別以淺色與深色作為主要探索方向,以適配不同的落地場景。結合有駕的年輕化,科技感的設計目標,探索出以下三種質感呈現:






符號拓展

在提取的形狀基礎上進行變形,增加折疊細節。在大事件活動,海報等場景使用,增加品牌關聯度。




設計字體

結合全新的品牌定位,我們也優化了有駕的品牌字體,從細節出透出有駕的品牌感知。




品牌手冊

新的品牌需要一套更全面的品牌系統來滿足不同場景下的業務拓展需求。

目前我們也對現有的品牌手冊進行拓展和完善,同步到業務方,以便更好的保證各業務場景觸點下品牌的認知和統一,達到提質增效的目的。



品牌落地

除了對品牌對角度的塑造和升級,我們更積極的把品牌滲透到活動、欄目包裝、大事件運營、品牌海報等各維度場景中,讓有駕品牌形象更加立體多元。









結語

目前有駕品牌升級已經取得階段性成果,沉淀出更加完善的品牌資產,不僅提升設計效率保證全鏈路的品牌曝光,也為業務規模化打下基礎。之后我們也將不斷完善和擴充品牌資產,將設計成果不斷落地到業務中,細化業務目標并與設計目標緊密結合,多維度助力業務的高速發展。


作者:百度MEUX
來源:站酷
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

作者:百度MEUX     來源:站酷

藍藍設計建立了UI設計分享群,每天會分享國內外的一些優秀設計,如果有興趣的話,可以進入一起成長學習,請加微信ban_lanlan,報下信息,藍小助會請您入群。歡迎您加入噢~~
希望得到建議咨詢、商務合作,也請與我們聯系01063334945。 

分享此文一切功德,皆悉回向給文章原作者及眾讀者. 免責聲明:藍藍設計尊重原作者,文章的版權歸原作者。如涉及版權問題,請及時與我們取得聯系,我們立即更正或刪除。 

藍藍設計m.skdbbs.com )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務、UI設計公司、界面設計公司、UI設計服務公司、數據可視化設計公司、UI交互設計公司、高端網站設計公司、UI咨詢、用戶體驗公司、軟件界面設計公司

效率至上|帶你認識提升用戶效率的4種方法

鶴鶴

從事體驗設計這么多年,經歷過多款B端和C端產品的體驗設計,有了一定的個人感悟。由于兩者用戶群體、使用場景、產品定位等方面的不同,讓兩者的體驗設計策略也存在較大的差異。但是無論是B端還是C端產品,有一個共同的體驗目標就是“提升用戶的操作效率”。甚至在一定程度上,C端產品比B端產品要求更高。

為什么這么說呢?

因為C端產品面臨激烈的市場競爭,如果效率方面存在明顯的不足,用戶很容易就轉向其他平臺了。而B端產品一旦部署上線,不菲的產品價格,平臺切換的風險,數據遷移的成本等因素,很容易形成產品的護城河。雖然用戶內心已是萬馬奔騰,但是依舊要自己摸索嘗試、查看文檔、或者請教別人來完成工作任務。

今天我們了解下C端產品用戶行為路徑中提升效率的4種方法。



一、用戶行為探知

用戶行為探知,就是根據用戶的操作行為或特定的時間,系統給出相應的推薦操作。

1、用戶操作感知

最常見的就是截屏操作產生的行為引導,目前主流的產品應用都會做出分享功能提示。在淘寶中,由于商品鏈接無法在微信中直接分享,所以淘寶對可能的用戶分享行為都進行了設計優化。

例如用戶在商品頁面截屏時,系統會自動復制淘口令,既方便用戶分享給好友,又方便了對方快速獲取商品信息,避免了圖片分享過程中的復雜操作。同樣微信在用戶發信息時,會自動提示是否要發送截圖內容,減少了用戶選擇圖片等操作流程,提升了用戶效率。



(左圖:淘寶截屏提示 右圖:微信提示截屏信息)

2、用戶行為分析

高德地圖在特定時間段,開啟導航時會默認給出“上班路線”的按鈕,方便用戶快速導航。此外還在地址中增加了“常搜”標簽,根據當前地址優先顯示常搜的地址,幫助用戶快速完成導航設定。



二、用戶行為引導

用戶行為引導,就是通過用戶行為流程分析,在用戶路徑中增加相關功能的曝光和引導,讓流程更加流暢,從而提高用戶的操作效率。

1、行為流程引導

淘寶購物商品詳情頁中,在最后幾張商品圖片中植入了評價信息和入口,更加符合用戶的心智,引導性也更強。同時用戶可以直接選擇自己喜歡的款式查看商品評價,操作效率也更高。

而且增加評論引導后,實現了用戶在首屏就可以了解商品、價格和用戶評價,有利于用戶對商品作出初步的購買決策,從而提高用戶效率。



相比之下,專門的評價模塊進入后默認顯示全部商品的評價信息,用戶需要手動選擇才能查看自己喜歡的商品款式的評價信息,無形中拉長了用戶的行為路徑,增加了用戶操作成本。

2、操作行為轉化

在今日頭條中,搜索行為與資訊內容綁定。用戶在瀏覽的資訊后,資訊下方會自動顯示搜索關鍵詞,可以幫助用戶更快捷的進行搜索操作。

同樣在熱榜資訊下方增加了詳情提示,引導用戶去查看事件詳情。



(左圖:搜索關鍵詞推薦 右圖:熱榜引導)

三、用戶行為聚合

手機產品屏幕的空間相對較小,展示內容有限。因此需要根據用戶行為,將相關功能聚合,讓用戶在一屏中可以獲取更多的信息,從而提高用戶效率。

在天貓部分商品詳情頁中,將商品參數集合在了商品名稱右側,保證了用戶在不滑動屏幕的情況下,就可以直接讀取商品參數。方便了用戶快速了解商品信息,提升了用戶的購物效率。

考拉海購則在部分商品首屏中,直接分類展現出了商品的型號和款式分類,并且實現了商品價格聯動,提升了用戶獲取信息的效率。



四、用戶行為記憶

減少用戶的記憶成本,最好的方法就是讓系統產生記憶。因此大多數APP都會提供歷史瀏覽記錄等功能,方便用戶查找相關信息。而內容型產品為了更好的提高用戶操作效率,則是將用戶行為記憶直接保留在內容層面上。

我們常見的音樂類產品會留存音樂的播放進度,用戶點擊后就可以直接再次播放。



(左圖:喜馬拉雅 右圖:網易云音樂)

微信公眾號文章閱讀時,會對用戶閱讀位置增加錨點。用戶再次閱讀時,自動定位到上次退出時位置,從而提高用戶的閱讀效率。

微信“看一看”進入時,內容會自動刷新,提供更多新的內容給用戶,為了幫助用戶更好地區分新內容,微信增加了瀏覽位置提醒。

同樣對于用戶未完成的文章內容,用戶再次進入時,今日頭條會給出繼續閱讀的提示信息,方便用戶快速操作。



總結

在提升用戶效率時,我們需要關注用戶場景和行為路徑,從而尋找到更多的效率提升突破口,主要包含以下3個注意點:

1、明確用戶的行為路徑,尋找用戶核心關切點,提升用戶效率;

2、轉移用戶操作成本,讓系統承擔更多的行為判斷和用戶引導;

3、用戶行為聚合時,應當集中關鍵的行為信息,避免對用戶核心行為造成干擾;

以上就是我對提升用戶效率方法的分析和總結,歡迎大家留言交流。

作者:子牧先生

轉載請注明:站酷

藍藍設計建立了UI設計分享群,每天會分享國內外的一些優秀設計,如果有興趣的話,可以進入一起成長學習,請加藍小助,微信號:ben_lanlan,報下信息,藍小助會請您入群。歡迎您加入噢~~希望得到建議咨詢、商務合作,也請與我們聯系01063334945。


分享此文一切功德,皆悉回向給文章原作者及眾讀者.
免責聲明:藍藍設計尊重原作者,文章的版權歸原作者。如涉及版權問題,請及時與我們取得聯系,我們立即更正或刪除。


藍藍設計m.skdbbs.com )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 平面設計服務、UI設計公司、界面設計公司、UI設計服務公司、數據可視化設計公司、UI交互設計公司、高端網站設計公司、UI咨詢、用戶體驗公司、軟件界面設計公司


vue el-upload 和form表單一起提交

前端達人

圖片上傳和表單同時一起提交

1. <!-- 彈出框 --> <el-dialog :title="titleMap[dialogStatus]" :visible.sync="dialogFormVisible"> <el-form :model="form" :rules="rules" ref="form"> <el-form-item label="商品名稱" prop='goodsName' style="width:40%"> <el-input v-model="form.goodsName" auto-complete="off" placeholder="請輸入商品名稱" size="medium"></el-input> </el-form-item> <el-form-item label="商品圖片" prop='goodsImg'> <el-upload action="uploadAction" list-type="picture-card" :on-preview="handlePictureCardPreview" :on-remove="handleRemove" :limit="1" :show-file-list="true" name="img" ref="upload" :data="form" accept="image/png,image/gif,image/jpg,image/jpeg" :headers="headers" :on-exceed="handleExceed" :auto-upload="false" :on-error="uploadError" :before-upload="handleBeforeUpload" :on-change="changeFile"> <i class="el-icon-plus"></i> </el-upload> <el-dialog :visible.sync="dialogVisible"> <img width="50px" :src="dialogImageUrl" alt=""> </el-dialog> </el-form-item> <el-form-item label="商品對應積分" prop='goodsIntegral'> <el-input v-model="form.goodsIntegral" auto-complete="off" placeholder="請輸入積分" size="medium" type="number"></el-input> </el-form-item> </el-form> <div slot="footer" class="dialog-footer"> <el-button @click="cancel">取 消</el-button> <el-button type="primary" @click="uploadFileFun('form')">確 定</el-button> "注意uploadFileFun('form')  括號內記得帶引號不然可能會報validate is not defined" </div> </el-dialog> 
                    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

2.data部分

 data() { return { //新增和編輯彈框標題 titleMap: { addStore: '新增商品', editStore: "修改商品" }, dialogStatus: "", //新增編輯彈出框 dialogFormVisible: false, dialogVisible: false, //表格數據 tableData: [], form: { id: '', goodsName: '', goodsImg: '', goodsIntegral: '', }, rules: { goodsName: [{ required: true, message: '請輸入商品名稱', trigger: 'blur' }], goodsIntegral: [{ required: true, message: '請輸入商品積分', trigger: 'blur' }], }, headers: { Authorization: 'Bearer ' + window.localStorage.getItem("token") }, dialogImageUrl: '', //圖片回顯 uploadFiles: '', //formData img 文件 goodsId: '', //判斷是新增還是編輯 }, 
                    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  1. methods部分 手動上傳圖片 **var fd = new FormData()**添加
// 上傳文件之前的鉤子 handleBeforeUpload(file) { console.log('按鈕', this.titleMap) if (!(file.type === 'image/png' || file.type === 'image/gif' || file.type === 'image/jpg' || file.type === 'image/jpeg')) { this.$notify.warning({ title: '警告', message: '請上傳格式為image/png, image/gif, image/jpg, image/jpeg的圖片' }) } let size = file.size / 1024 / 1024 / 2 if (size > 2) { this.$notify.warning({ title: '警告', message: '圖片大小必須小于2M' }) } }, //圖片上傳超過數量限制 handleExceed(files, fileList) { this.$message.error("上傳圖片不能超過1張!"); }, handleRemove(file, fileList) { this.$message.error("刪除成功!"); }, // 圖片上傳失敗時 uploadError() { this.$message.error("圖片上傳失敗!"); }, //預覽圖片 handlePictureCardPreview(file) { this.dialogImageUrl = file.url; this.dialogVisible = true; }, //文件改變時 on-change方法 ,fileList[0].raw 就是傳給后端的值 //filelist這個對象里面有很多屬性,我們上傳文件時,實際上傳的是filelist列表中每一項的raw,只有raw可以正常上傳, 獲取到文件后,需要定義變量保存文件。所以需要獲取filelist中的raw進行保存。 //這里我用的formdata上傳多文件,console打印formdata,文件在控制臺中顯示的格式為binary。 changeFile(file, fileList) { this.uploadFiles = fileList[0].raw }, uploadFileFun(formName) { this.$refs[formName].validate((valid) => { let fd = new FormData(); fd.append('id', this.form.id); fd.append('goodsName', this.form.goodsName); fd.append('goodsIntegral', this.form.goodsIntegral); fd.append('img', this.uploadFiles); let config = { headers: { 'Content-Type': 'multipart/form-data' } } 根據goodsID判斷是編輯提交還是新增提交,主要針對新增編輯使用同一個彈框 if (valid && !this.goodsId) { this.$axios.post("接口地址", fd, config).then(res => { if (res.data.success == true) { this.dialogFormVisible = false this.$message({ message: res.data.msg, type: 'success' }); //新增完清空表單內容 setTimeout(() => { this.$refs.form.resetFields(); }, 200) this.reload() } else { this.$message.error(res.data.msg); } }).catch(res => { console.log(res) }) } else { this.$axios.post("接口地址", fd, config).then(res => { if (res.data.success == true) { this.dialogFormVisible = false this.$message({ message: res.data.msg, type: 'success' }); //編輯完清空表單內容 setTimeout(() => { this.$refs.form.resetFields(); }, 200) this.reload() } else { this.$message.error(res.data.msg); } }).catch(res => { console.log(res) }) } }) }, add() { this.dialogStatus = "addStore" this.dialogFormVisible = true this.goodsId = "" //新增商品是商品ID為空 }, // 取消 cancel() { this.dialogFormVisible = false this.$refs[formName].resetFields() }, //編輯 handleEdit(index, row) { this.form = this.tableData[index] this.dialogStatus = "editStore" this.goodsId = row.id this.currentIndex = index this.dialogFormVisible = true }, 
                    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
文章


藍藍設計建立了UI設計分享群,每天會分享國內外的一些優秀設計,如果有興趣的話,可以進入一起成長學習,請加藍小助,微信號:ben_lanlan,報下信息,藍小助會請您入群。歡迎您加入噢~~希望得到建議咨詢、商務合作,也請與我們聯系01063334945。


分享此文一切功德,皆悉回向給文章原作者及眾讀者.
免責聲明:藍藍設計尊重原作者,文章的版權歸原作者。如涉及版權問題,請及時與我們取得聯系,我們立即更正或刪除。


藍藍設計m.skdbbs.com )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 平面設計服務UI設計公司、界面設計公司、UI設計服務公司、數據可視化設計公司、UI交互設計公司、高端網站設計公司、UI咨詢、用戶體驗公司、軟件界面設計公司


使用Node.js的formidable模塊實現文件上傳

前端達人

在我上一篇寫的Node.js實現簡單的POST請求
里面POST請求接受參數需要寫兩個事件,這難免有些不太方便
在這里插入圖片描述

如果我們用formidable來接受參數的話,會變得特別方便。

下面我們來寫一個Demo,來利用formidable來實現圖片上傳

1.下面來看一眼 目錄結構

在這里插入圖片描述

2.先來寫一個簡單的前端上傳頁面

index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <form class="upload" action="shangchuan" enctype="multipart/form-data" method="post"><!--  上傳接口是/shangchuan -->
        <p>
            請上傳一個頭像
            <input type="file" name="wenjian">
        </p>
        <p>
            <input type="submit" value="提交">
        </p>
    </form>
</body>
</html> 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

2.package.json 文件

安裝依賴,執行下面這三句npm語句

npm install finalhandler --save
npm install serve-static --save
npm install formidable --save

之后會自動生成下面這個package.json文件

{
  "dependencies": {
    "finalhandler": "^1.1.1",
    "formidable": "^1.2.1",
    "serve-static": "^1.13.2"
  }
} 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

3.post.js

var finalhandler = require('finalhandler')
var http = require('http')
var serveStatic = require('serve-static')
var url = require('url')
var fs = require('fs')
var querystring = require('querystring')
var formidable = require('formidable')
var path = require('path')
// Serve up public/ftp folder
//配置靜態資源服務器,將public文件夾靜態化出來

var serve = serveStatic('public', {'index': ['index.html', 'index.htm']})

// Create server
var server = http.createServer(function onRequest (req, res) {
    //路由
    var pathname = url.parse(req.url).pathname;
    if(pathname == '/shangchuan'){
        //創建一個表單的實例,formidable
        var form = new formidable.IncomingForm();
        //設置上傳的文件存放在哪里
        form.uploadDir = './uploads';
        //處理表單
        form.parse(req,(err,fields,files) => {
            //fields 表示普通控件
            //files 表示文件控件
            if(!files.wenjian){
                return;
            }
            if(!files.wenjian.name){
                return;
            }
            var extname = path.extname(files.wenjian.name);獲取文件的擴展名,便于下面修改上傳后的文件名字
            //改名
            fs.rename(files.wenjian.path, files.wenjian.path + extname,() => {
                res.end('上傳成功')
            })
            // console.log(fields);
        })
        return;
    }
    serve(req, res, finalhandler(req, res))
})

// Listen
server.listen(3000);
console.log('服務已經啟動在3000端口'); 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47

4.最后找到post文件的目錄,然后開始node post.js

會看到這個頁面

在這里插入圖片描述

然后選擇任意文件點擊提交
會發現在很短的時間內你的文件會提交成功在你的uploads文件夾下。




藍藍設計建立了UI設計分享群,每天會分享國內外的一些優秀設計,如果有興趣的話,可以進入一起成長學習,請加藍小助,微信號:ben_lanlan,報下信息,藍小助會請您入群。歡迎您加入噢~~希望得到建議咨詢、商務合作,也請與我們聯系01063334945。


分享此文一切功德,皆悉回向給文章原作者及眾讀者.
免責聲明:藍藍設計尊重原作者,文章的版權歸原作者。如涉及版權問題,請及時與我們取得聯系,我們立即更正或刪除。


藍藍設計m.skdbbs.com )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務UI設計公司、界面設計公司、UI設計服務公司、數據可視化設計公司、UI交互設計公司、高端網站設計公司、UI咨詢、用戶體驗公司、軟件界面設計公司

設計師需要懂得用戶體驗

鶴鶴

設計師需要懂得用戶體驗知識











作者:董康
來源:站酷

藍藍設計建立了UI設計分享群,每天會分享國內外的一些優秀設計,如果有興趣的話,可以進入一起成長學習,請加微信ban_lanlan,報下信息,藍小助會請您入群。歡迎您加入噢~~
希望得到建議咨詢、商務合作,也請與我們聯系01063334945。 

分享此文一切功德,皆悉回向給文章原作者及眾讀者. 免責聲明:藍藍設計尊重原作者,文章的版權歸原作者。如涉及版權問題,請及時與我們取得聯系,我們立即更正或刪除。 

藍藍設計m.skdbbs.com )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務、UI設計公司、界面設計公司、UI設計服務公司、數據可視化設計公司、UI交互設計公司、高端網站設計公司、UI咨詢、用戶體驗公司、軟件界面設計公司

關于vue.js element ui 表單驗證 使用this.$refs[formName].validate()

前端達人

實現form表單提交驗證功能

model : 綁定整個表單model
rules : 整個表單校驗規則
ref :獲取該表單form組件
prop : 綁定每個表單的規則,寫在el-form-item
validate : 對整個表單進行校驗的方法
valid : 每個必填表單項都提交為true,否則為false

1、簡易版 表單提交

//使用element-ui 頁面組件 <el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm"> <el-form-item label="活動名稱" prop="name"> <el-input v-model="ruleForm.name"></el-input> </el-form-item> <el-form-item label="活動區域" prop="region"> <el-select v-model="ruleForm.region" placeholder="請選擇活動區域"> <el-option label="區域一" value="shanghai"></el-option> <el-option label="區域二" value="beijing"></el-option> </el-select> </el-form-item> </el-form> <el-form-item> <el-button type="primary" @click="submitForm('ruleForm')">立即創建</el-button> </el-form-item> //data中定義form表單中每項表單model值、和每個表單校驗的規則 <script> export default { data() { return { ruleForm: { name: '', region: '', }, rules: { name: [ { required: true, message: '請輸入活動名稱', trigger: 'blur' }, { min: 3, max: 5, message: '長度在 3 到 5 個字符', trigger: 'blur' } ], region: [ { required: true, message: '請選擇活動區域', trigger: 'change' } ], }; }, //定義表單提交方法 methods: { submitForm(formName) { this.$refs[formName].validate((valid) => { if (valid) { alert('submit!'); } else { console.log('error submit!!'); return false; } }); }, } } 
        
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51

2、復雜版 表單提交

  • 對于頁面有多個整體的form提交,每個form表單里類型為文本框、下拉框、單選框、復選框等類型,可對類型進行封裝,使用循環遍歷使頁面呈現不同類型表單項
<el-form v-if="fromHtmlList.deviceInfo.sitsb.length" :model="fasj" :rules="rules" label-position="left" label-width="125px" ref='sitsb'> <el-form-item label-width="100%" > <div slot="label" class="titleInfo">局端設備</div> </el-form-item> <el-form-item v-for="(item, i) in fromHtmlList.deviceInfo.sitsb" :key="`F_key_${i}`" :label="`${item.label}:`" :class="item.class" :label-width="item.labelWidth" :prop="`${item.rule ? 'deviceInfo.sitsb.'+item.rule : ''}`"> <el-select v-if="item.el === 'slt'" v-model="fasj.deviceInfo.sitsb[item.model]" placeholder="請選擇" style="width:200px;" clearable> <el-option v-for="(op, n) in options[item.option]" :key="`vop_key_${n}`" :label="op.label" :value="op.value"> </el-option> </el-select> <el-input  v-if="item.el === 'ipt'" v-model="fasj.deviceInfo.sitsb[item.model]" @focus="()=>{ item.focus && handleFocus('sitsb', item.model)}" :placeholder="`${item.placeholder ? item.placeholder : '請輸入'}`" style="width:200px;"></el-input> <span v-if="item.el === 'txt'">{{fasj.base[item.model]}}</span> </el-form-item> </el-form> <div class="btn-list"> <el-button type="primary" @click="checkRequired">提 交</el-button> </div> <script> export default { data() { return { fasj: { base: {}, // 基本信息 deviceInfo: {}, }, //定義 頁面表單結構 fromHtmlList: { baseInfo: [], deviceInfo: { ywzsb: [], sitsb: [] } }, //定義 表單校驗規則 rules: { 'deviceInfo.sitsb.IPType': [ { required: true, message: '請輸入', trigger: 'blur' } ], 'deviceInfo.sitsb.IPAddr': [ { required: true, message: '請輸入', trigger: 'blur' } ], 'deviceInfo.sitsb.netmask': [ { required: true, message: '請輸入', trigger: 'blur' } ], 'deviceInfo.sitsb.vlanId': [ { required: true, message: '請輸入', trigger: 'blur' } ], }, options: { IPType: [ {label: 'ipv4', value: 'ipv4'}, {label: 'ipv6', value: 'ipv6'} ], rmSite: [], room: [], }, } }, created(){ const orderType = '業務開通' ;//頁面初始加載用到的變量值,可通過組件傳值獲取 //created中初始定義頁面表單結構 this.fromHtmlList = { baseInfo: orderType === '業務開通' ? [ {label: '接入方式', labelWidth: '100px', rule: '' , model: 'serviceType', option: '', el: 'txt', class: 'w2'}, {label: '標準九級地址', labelWidth: '120px', rule: '', model: 'aendAdreesName', option: '', el: 'txt', class: 'w2'}, {label: '城鄉類型', labelWidth: '100px', rule: 'cityType', model: 'cityType', option: 'cityType', el: 'slt', class: 'w2'}, {label: '方案設計附件', labelWidth: '120px', rule: '', model: 'fileId', option: '', el: 'btn', class: 'w2'}, ] : orderType === '移機' ? [ {label: '接入方式', labelWidth: '100px', rule: '' , model: 'serviceType', option: '', el: 'txt', class: 'w2'}, {label: '標準九級地址', labelWidth: '120px', rule: '', model: 'aendAdreesName', option: '', el: 'txt', class: 'w2'}, {label: '城鄉類型', labelWidth: '100px', rule: 'cityType', model: 'cityType', option: 'cityType', el: 'slt', class: 'w2'}, {label: '方案設計附件', labelWidth: '120px', rule: '', model: 'fileId', option: '', el: 'btn', class: 'w2'}, {label: '移機場景', labelWidth: '100px', rule: 'moveScene', model: 'moveScene', option: 'moveScene', el: 'slt', class: 'w2'}, {label: '是否需要網絡調整', labelWidth: '', rule: 'netChange', model: 'netChange', option: 'netChange', el: 'slt', class: 'w2'} ] : [ {label: '接入方式', labelWidth: '100px', rule: '' , model: 'serviceType', option: '', el: 'txt', class: 'w2'}, {label: '標準九級地址', labelWidth: '120px', rule: '', model: 'aendAdreesName', option: '', el: 'txt', class: 'w2'}, {label: '城鄉類型', labelWidth: '100px', rule: 'cityType', model: 'cityType', option: 'cityType', el: 'slt', class: 'w2'}, {label: '方案設計附件', labelWidth: '120px', rule: '', model: 'fileId', option: '', el: 'btn', class: 'w2'}, {label: '是否需要網絡調整', labelWidth: '', rule: 'netChange', model: 'netChange', option: 'netChange', el: 'slt', class: 'w2'}, {label: '是否更換末端設備', labelWidth: '', rule: 'devChange', model: 'devChange', option: 'devChange', el: 'slt', class: 'w2'} ], deviceInfo: { ywzsb: serviceType === 'PON' ? [ // 默認PON {label: '機房', labelWidth: '90px', rule: '' , model: 'siteRoom', option: '', el: 'ipt', class: 'w2', focus: true, placeholder: '點擊查詢'}, {label: '設備名稱', labelWidth: '90px', rule: '', model: 'deviceName', option: '', el: 'ipt', class: 'w2', focus: true, placeholder: '點擊查詢'}, {label: '設備端口', labelWidth: '90px', rule: '', model: 'devicePort', option: '', el: 'ipt', class: 'w2', focus: true, placeholder: '點擊查詢'}, {label: '延伸設備', labelWidth: '90px', rule: '', model: 'deviceExtend', option: '', el: 'ipt', class: 'w2', focus: true, placeholder: '點擊查詢'} ] : [ // 裸光纖、傳輸下沉、傳輸延伸(ywzsb) {label: '機房', labelWidth: '', rule: '' , model: 'siteRoom', option: '', el: 'ipt', class: 'w2', focus: true, placeholder: '點擊查詢'}, {label: '站點', labelWidth: '', rule: '', model: 'site', option: '', el: 'ipt', class: 'w2'}, {label: '設備名稱', labelWidth: '', rule: '', model: 'deviceName', option: '', el: 'ipt', class: 'w2', focus: true, placeholder: '點擊查詢'}, {label: '設備端口', labelWidth: '', rule: '', model: 'devicePort', option: '', el: 'ipt', class: 'w2', focus: true, placeholder: '點擊查詢'}, ], sitsb: serviceType === 'PON' ? [ {label: '機房名稱', labelWidth: '', rule: '' , model: 'siteRoom', option: '', el: 'ipt', class: 'w2'}, {label: '站點名稱', labelWidth: '', rule: '', model: 'site', option: '', el: 'ipt', class: 'w2'}, {label: '匯聚交換機', labelWidth: '', rule: '', model: 'switch', option: '', el: 'ipt', class: 'w2'}, {label: '匯聚交換機端口', labelWidth: '', rule: '', model: 'switchPort', option: '', el: 'ipt', class: 'w2'}, {label: 'SR/BARS', labelWidth: '', rule: '' , model: 'srbars', option: '', el: 'ipt', class: 'w2'}, {label: 'SR/BARS端口', labelWidth: '', rule: '', model: 'srbarsPort', option: '', el: 'ipt', class: 'w2'}, {label: 'IP地址類型', labelWidth: '', rule: 'IPType', model: 'IPType', option: 'IPType', el: 'slt', class: 'w2'}, {label: 'IP地址', labelWidth: '', rule: 'IPAddr', model: 'IPAddr', option: '', el: 'ipt', class: 'w2'}, {label: '子網掩碼', labelWidth: '', rule: 'netmask', model: 'netmask', option: '', el: 'ipt', class: 'w2'}, {label: 'VLAN ID', labelWidth: '', rule: 'vlanId', model: 'vlanId', option: '', el: 'ipt', class: 'w2'} ] : serviceType === '裸光纖' ? [ // 裸光纖 {label: '機房名稱', labelWidth: '', rule: '' , model: 'siteRoom', option: '', el: 'ipt', class: 'w2', focus: true, placeholder: '點擊查詢'}, {label: '站點名稱', labelWidth: '', rule: '', model: 'site', option: '', el: 'ipt', class: 'w2'}, {label: 'SR', labelWidth: '', rule: '', model: 'SR', option: '', el: 'ipt', class: 'w2', focus: true, placeholder: '點擊查詢'}, {label: 'SR端口', labelWidth: '', rule: '', model: 'SRPort', option: '', el: 'ipt', class: 'w2', focus: true, placeholder: '點擊查詢'}, {label: 'BARS', labelWidth: '', rule: '' , model: 'BARS', option: '', el: 'ipt', class: 'w2', focus: true, placeholder: '點擊查詢'}, {label: 'BARS端口', labelWidth: '', rule: '', model: 'BARSPort', option: '', el: 'ipt', class: 'w2', focus: true, placeholder: '點擊查詢'}, ] : [ // 傳輸下沉、傳輸延伸 ] } } }, methods:{ async checkRequired() { let checkName = ['base','sitsb'];//表單校驗定義ref let text; for(let key of checkName){ if(this.$refs[key]){ this.$refs[key].validate((valid) => { if(!valid){ text = '請檢查必填項'; }else { return false; } }); } } if(text){ this.$message.warning(text); return false; } let _res_ = await this.saveFasjData('', true);//頁面表單要保存后才能提交 if(!!_res_ && _res_.code === 200){ this.commit(_param, _url);//保存表單再提交 }else{ this.$message.error(_res_.msg) } }, async commit(param, url) { this.loadings.body = true; let _res = await postDataRequest(url, param); this.loadings.body = false; if (_res && _res.code === 200) { this.$message.success("提交成功"); this.$router.go(-1); } } } } </script> 
        
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178

什么是 Vite?

前端達人

一、什么是 Vite 

Vite 是 vue 的作者尤雨溪在開發 vue3.0 的時候開發的一個 web 開發構建工具。由于其原生 ES 模塊導入方式,可以實現閃電般的冷服務器啟動。

二、Vite 和 Webpack 區別

Vite 優勢:

  1. vite 開發服務器啟動速度比 webpack 快
    webpack 會先打包,然后啟動開發服務器,請求服務器時直接給予打包結果。
    vite 在啟動開發服務器時不需要打包,也就意味著不需要分析模塊的依賴、不需要編譯,因此啟動速度非常快。當瀏覽器請求某個模塊時,再根據需要對模塊內容進行編譯。這種按需動態編譯的方式,極大的縮減了編譯時間,項目越復雜、模塊越多,vite的優勢越明顯。
  2. 由于現代瀏覽器本身就支持ES Module,會自動向依賴的Module發出請求。vite充分利用這一點,將開發環境下的模塊文件,就作為瀏覽器要執行的文件,而不是像webpack那樣進行打包合并。
  3. vite 熱更新比 webpack 快
    在 HMR 方面,當改動了一個模塊后,vite僅需讓瀏覽器重新請求該模塊即可,不像webpack那樣需要把該模塊的相關依賴模塊全部編譯一次,效率更高。
  4. vite 使用esbuild(Go 編寫) 預構建依賴,比 webpack 的 nodejs,快 10-100 倍。

Vite 劣勢:

  1. 生態不及webpack,加載器、插件不夠豐富
  2. 打包到生產環境時,vite使用傳統的 rollup(也可以自己手動安裝webpack來)進行打包
  3. 項目的開發瀏覽器要支持 ES Module,而且不能識別 CommonJS 語法

其他區別:

     1. 打包原理的區別

webpack
webpack打包原理
 
vite打包原理

     2. 項目入口文件的區別
         
項目根目錄的 index.html 是 Vite 項目的入口文件,而 webpack 的入口文件是 webpack 配置 entry 中指定的 js 文件。

三、Esbuild

Esbuild 是一款基于 Go 語言開發的 javascript 打包工具,最大的一個特征就是

通過官網提供的一張圖,我們可以清晰的看到 Esbuild 的表現是多么優秀:

Esbuild 之所以能這么快,主要原因有兩個:

  • Go 語言開發,可以多線程打包,代碼直接編譯成機器碼;

    Webpack 一直被人詬病構建速度慢,主要原因是在打包構建過程中,存在大量的 resolve、load、transform、parse 操作(詳見 為什么有人說 vite 快,有人卻說 vite 慢?- 快速的冷啟動 ),而這些操作通常是通過 javascript 代碼來執行的。要知道,javascript 并不是什么高效的語言,在執行過程中要先編譯后執行,還是單線程并且不能利用多核 cpu 優勢,和 Go 語言相比,效率很低。

  • 可充分利用多核 cpu 優勢;

關鍵 API - transfrom & build

Esbuild 并不復雜,它對外提供了兩個 API:transform 和 build,使用起來非常簡單。

transfrom,轉換的意思,將 ts、jsx、tsx 等格式的內容轉化為 js。 transfrom 只負責文件內容轉換,并不會生成一個新的文件。

build,構建的意思,根據指定的單個或者多個入口,分析依賴,并使用 loader 將不同格式的內容轉化為 js 內容,生成一個或多個 bundle 文件。

Esbuild 在 Vite 中的巧妙使用

我們來看看Vite 是怎么利用 Esbuild 來做預構建和內容轉換的。

預構建

為什么要做預構建?原因有兩點:

  • 將非 ESM 規范的代碼轉換為符合 ESM 規范的代碼;

  • 將第三方依賴內部的多個文件合并為一個,減少 http 請求數量;

middlewares 中內容轉換

Vite 中源文件的轉換是在 dev server 啟動以后通過 middlewares 實現的。

當瀏覽器發起請求以后,dev sever 會通過相應的 middlewares 對請求做處理,然后將處理以后的內容返回給瀏覽器。

middlewares 對源文件的處理,分為 resolve、load、transform、parser 四個過程:

  1. resolve - 解析 url,找到源文件的絕對路徑;

  2. load - 加載源文件。如果是第三方依賴,直接將預構建內容返回給瀏覽器;如果是業務代碼,繼續 transformparser。

  3. transfrom - 對源文件內容做轉換,即 ts -> jsless -> css 等。轉換完成的內容可以直接返回給瀏覽器了。

  4. parser - 對轉換以后的內容做分析,找到依賴模塊,對依賴模塊做預轉換 - pre transform 操作,即重復 1 - 4。

    pre transform 是 Vite 做的一個優化點。預轉換的內容會先做緩存,等瀏覽器發起請求以后,如果已經完成轉換,直接將緩存的內容返回給瀏覽器。

Vite 在處理步驟 3 時,是通過 esbuild.transform 實現的,對比 Webpack 使用各個 loader 處理源文件,那是非常簡單、快捷的。

四、關于 Vite 的一些其他知識

  • 在工程中不是所有的引用模塊都是ES寫法,可能是CommonJS 和 UMD 、AMD 等等,這個時候Vite 會進行預構建,將其轉換為ESM模塊,以支持Vite。
  • 對于JSX、或者TS 等需要編譯的文件,Vite是用esbuild來進行編譯的。

五、Webpack 和 Rollup 區別

經驗法則:對于應用使用 webpack,對于類庫使用 Rollup。

如果你需要代碼拆分(Code Splitting),或者你有很多靜態資源需要處理,再或者你構建的項目需要引入很多CommonJS模塊的依賴,那么 webpack 是個很不錯的選擇。

如果您的代碼庫是基于 ES2015 模塊的,而且希望你寫的代碼能夠被其他人直接使用,你需要的打包工具可能是 Rollup 。

藍藍設計建立了UI設計分享群,每天會分享國內外的一些優秀設計,如果有興趣的話,可以進入一起成長學習,請加藍小助,微信號:ben_lanlan,報下信息,藍小助會請您入群。歡迎您加入噢~~希望得到建議咨詢、商務合作,也請與我們聯系01063334945。


分享此文一切功德,皆悉回向給文章原作者及眾讀者.
免責聲明:藍藍設計尊重原作者,文章的版權歸原作者。如涉及版權問題,請及時與我們取得聯系,我們立即更正或刪除。


藍藍設計m.skdbbs.com )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務、UI設計公司、界面設計公司、UI設計服務公司、數據可視化設計公司、UI交互設計公司、高端網站設計公司、UI咨詢、用戶體驗公司、軟件界面設計公司

nodejs--圖片上傳

前端達人

前端部分

html部分


  1. <div class="add">
  2. <p>商品名稱: <input type="text" class="productName"></p>
  3. <p>商品價格: <input type="number" class="price" ></p>
  4. <!-- multiple: 允許同時上傳多張圖片 -->
  5. <!-- <p>商品圖片: <input type="file" class="file" multiple="multiple"></p> -->
  6. <p>商品圖片: <input type="file" class="file"></p>
  7. <p><button class="add-btn">添加商品</button></p>
  8. </div>
  9. <script src="js/axios.js"></script>
  10. <script src="js/util.js"></script>
  11. <script src="js/upload.js"></script>

upload.js


  1. // 新建表單數據對象,用來存儲上傳的文件及上傳的其它數據
  2. let param = new FormData()
  3. $(".file").onchange = function(){
  4. //獲取圖片信息
  5. let file = this.files[0]
  6. //"file"為前后端約定vb的屬性名
  7. param.append("file",file)
  8. }
  9. $(".add-btn").onclick = function(){
  10. let productName = $(".productName").value;
  11. let price = $(".price").value;
  12. param.append("productName",productName)
  13. param.append("price",price)
  14. axios.post("/product",param,{
  15. headers: {
  16. // 默認提交的類型
  17. // "content-type": "application/json"
  18. // 復雜的表單數據(只要上傳文件,就必須是下面的類型)
  19. "content-type": "multipart/form-data"
  20. }
  21. })
  22. .then((res)=>{
  23. console.log(res.data);
  24. })
  25. }

postman

 

Express后端部分

使用multer實現圖片上傳

下載

npm i multer -S

引入


  1. const multer = require("multer")
  2. const path = require("path")

配置

注意: 該文件在/router文件夾中,而uploads存放上傳圖片文件夾在根目錄


  1. var storage = multer.diskStorage({
  2. // 配置文件上傳后存儲的路徑
  3. destination: function (req, file, cb) {
  4. // NodeJS的兩個全局變量
  5. // console.log(__dirname); //獲取當前文件在服務器上的完整目錄
  6. // console.log(__filename); //獲取當前文件在服務器上的完整路徑
  7. cb(null, path.join(__dirname,'../uploads'))
  8. },
  9. // 配置文件上傳后存儲的路徑和文件名
  10. filename: function (req, file, cb) {
  11. console.log('file',file);
  12. cb(null, Date.now() + path.extname(file.originalname))
  13. }
  14. })
  15. var upload = multer({ storage: storage })

在路由中使用


  1. //添加商品
  2. router.post("/product",upload.single("file1"),(req,res)=>{
  3. //接收普通文本參數
  4. let {productName,price} = req.body;
  5. 、接收上傳文件數據 -->
  6. let imgUrl = req.file.filename;
  7. let sql = "insert into product (productName,price,imgUrl) values (?,?,?)"
  8. conn.query(sql,[productName, price , imgUrl],(err,result)=>{
  9. if (err){
  10. console.log('增加失敗');
  11. return;
  12. }
  13. let data;
  14. if (result.affectedRows === 1){
  15. data = {
  16. code: 0,
  17. msg: '添加成功'
  18. }
  19. }else{
  20. data = {
  21. code: 1,
  22. msg: '添加失敗'
  23. }
  24. }
  25. res.send(data)
  26. })
  27. })

如果抽離路由模塊中的處理函數upload.single("file1")寫在Router模塊

實現寫在抽取的模塊 

 NODEJS--express圖片上傳 - 簡書

如果req.body為空,可以用nodejs后臺文件上傳模塊connect-multiparty

使用方法如下:

1.  安裝模塊

npm install connect-multiparty --save

2.  引入模塊

var multipart = require('connect-multiparty');

var multipartMiddleware = multipart();

3.  使用模塊

const express = require('express')

const router = express.Router()

router.post('/formdata',multipartMiddleware, function (req,res) {

console.log(req.query)

//分別返回body,文件屬性,以及文件存放地址

});
————————————————
原文鏈接:https://blog.csdn.net/zjwengyidong/article/details/51407903




藍藍設計建立了UI設計分享群,每天會分享國內外的一些優秀設計,如果有興趣的話,可以進入一起成長學習,請加藍小助,微信號:ben_lanlan,報下信息,藍小助會請您入群。歡迎您加入噢~~希望得到建議咨詢、商務合作,也請與我們聯系01063334945。


分享此文一切功德,皆悉回向給文章原作者及眾讀者.
免責聲明:藍藍設計尊重原作者,文章的版權歸原作者。如涉及版權問題,請及時與我們取得聯系,我們立即更正或刪除。


藍藍設計m.skdbbs.com )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 平面設計服務、UI設計公司、界面設計公司、UI設計服務公司、數據可視化設計公司、UI交互設計公司、高端網站設計公司、UI咨詢、用戶體驗公司、軟件界面設計公司

HTML生日快樂-生日祝福(煙花+粒子動畫)

前端達人

一、HTML頁面制作

1、更換title

在HappyBirthday/HappyBirthday.html中的title換成相應人的名字

 
  1. <head>
  2. <meta charset="utf-8">
  3. <title>XXX生日快樂</title>
  4. <style>
  5. html,body{
  6. margin:0px;
  7. width:100%;
  8. height:100%;
  9. overflow:hidden;
  10. background:linear-gradient(to left top,blue, #ffc0cb);
  11. }
  12. </style>
  13. <link href="favicon.ico" rel="shortcut icon">
  14. </head>

2、粒子名字

在粒子展示祝福的名字進行更換

 在HappyBirthday/js/index.js#44行處修改

 
  1. if (i !== -1) {
  2. S.UI.simulate(decodeURI(action).substring(i + 3));
  3. } else {
  4. S.UI.simulate('|#countdown 3||祝|XXX|生日快樂|祝你|生日快樂|祝你幸福|祝你健康|前途光明|祝你|生日快樂!|#icon heart|#icon heart-empty|#icon heart');
  5. }

3、粒子顏色

修改粒子動畫展示的顏色,視頻中使用了粉色(255,192,203)

HappyBirthday/js/index.js#417行處修改

 
  1. S.Dot = function (x, y) {
  2. this.p = new S.Point({
  3. x: x,
  4. y: y,
  5. z: 5,
  6. a: 1,
  7. h: 0
  8. });
  9. this.e = 0.07;
  10. this.s = true;
  11. this.c = new S.Color(255, 192, 203, this.p.a);
  12. this.t = this.clone();
  13. this.q = [];
  14. };

4、設備兼容

在原版代碼中,僅僅在電腦瀏覽器有一個較為好的展示效果,在手機瀏覽器上字顯示效果不佳以及延時不足,但是無法正常顯示,主要調整了粒子間距和延時時間

粒子間距:先設置默認間距為8(手機較好顯示),然后判斷屏幕是否大于手機一般尺寸,調整大一點13(平板和電腦較好顯示)。

粒子間距變小,數量變多,加載起來就慢。

HappyBirthday/js/index.js#525行處修改

 
  1. if ((window.innerWidth>500 && window.innerHeight>500)){
  2. gap = 13;
  3. }

延時時間:當粒子數量變多,加載慢, 按照原作者設置的時間來展示,可能上一個字沒展示完就要去展示下一個字,導致變成一坨。

HappyBirthday/js/index.js#119行處修改

HappyBirthday/js/index.js#177行處修改

 
  1. // 118行
  2. var delay1,delay2;
  3. delay1 = 3000;
  4. delay2 = 5000;
  5. // 177行
  6. if (window.innerWidth>500 && window.innerHeight>500){
  7. delay1 = 1000;
  8. delay2 = 2000;
  9. }

5、音樂播放

由于在某些設備上,無法自動播放音樂,需要通過點擊觸發,增加點擊愛心,開始播放。

二、阿里云部署

通過部署在阿里云,可以通過網址進行訪問。

我租了一個阿里云,通過簡單部署靜態頁面就可以訪問。

(如果有兄弟緊急使用,也可以叫我幫忙部署一下,哈

1、開放80端口

找到自己的實例,點擊完全組,配置開放一個80端口 

開放80端口

2、安裝httpd

yum -y install httpd

 3、啟動httpd

 
  1. service httpd start
  2. service httpd status

 啟動之后可以看到如下畫面

 4、移動httpd.conf

默認會發布var/www/html下面的網頁

cp /etc/httpd/conf/httpd.conf /var/www/html

5、上傳資源到var/www/html

 
  1. # 解壓壓縮包
  2. unzip HappyBirthday.zip
  3. # 刪除壓縮包
  4. rm -rf HappyBirthday.zip

6、重啟hhtpd

 service httpd restart

7、地址訪問

http://8.130.106.21/HappyBirthday/HappyBirthday.html

藍藍設計建立了UI設計分享群,每天會分享國內外的一些優秀設計,如果有興趣的話,可以進入一起成長學習,請加藍小助,微信號:ben_lanlan,報下信息,藍小助會請您入群。歡迎您加入噢~~希望得到建議咨詢、商務合作,也請與我們聯系01063334945。

分享此文一切功德,皆悉回向給文章原作者及眾讀者. 免責聲明:藍藍設計尊重原作者,文章的版權歸原作者。如涉及版權問題,請及時與我們取得聯系,我們立即更正或刪除。

藍藍設計m.skdbbs.com )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 平面設計服務、UI設計公司、界面設計公司、UI設計服務公司、數據可視化設計公司、UI交互設計公司、高端網站設計公司、UI咨詢、用戶體驗公司、軟件界面設計公司

超全面的B端設計規范指南(一):設計原則

博博

前言

B 端設計離不開設計規范這個話題,而做好設計規范是一個龐大復雜工程,很多人對這些處于一知半解狀態,在這個系列文章里我通過結合自己平時的項目案例來談談自己對 B 端設計規范的一些理解,希望可以帶來一些啟發。

本篇先談談設計規范制作的指導思想--設計原則,后續文章再展開講一下常見各種組件的設計規范。

一、設計規范作用

設計規范作為 B 端設計中非常重要的一環,它的作用主要體現在以下三個方面:

超全面的B端設計規范指南(一):設計原則

在日常工作中,當項目組收到一個新的需求時,如果已經具備了成熟的設計規范體系,其工作效率往往會得到很好的提升。最后上線的頁面不用走查還原度。以下是具體工作流程:

超全面的B端設計規范指南(一):設計原則

二、設計原則

通過前面內容我們知道了設計規范對于產品設計意義重大,那么制定設計規范制定依據又是什么呢?這里就要引出設計原則這個話題,設計原則是設計規范的總的綱領,所有的設計規范都應當以設計原則為基準。設計原則主要包含以下內容:

超全面的B端設計規范指南(一):設計原則

接下來就圍繞設計原則清晰、高效、友好、可控這四個方面展開講解。

1. 清晰

清晰原則主要從視覺角度讓界面信息傳達合理,提高用戶信息獲取效率。主要包含對比,親密,對齊,重復四個方面。

① 對比:

對比是指界面中為了區分信息層級,強化元素對比度,使用的很常見的一種手段,例如下圖中利用大色塊按鈕與線框按鈕形成對比來凸顯關鍵按鈕;又比如通過對文字字號加大,字體加粗,顏色加深來與弱文案形成對比,凸顯關鍵文字信息。

超全面的B端設計規范指南(一):設計原則

② 親密:

如果信息之間關聯性越高,它們之間的距離就應該越接近,也越像一個視覺單元;反之,則它們的距離就應該越遠,也越像多個視覺單元。親密性的根本目的是實現組織性,讓用戶對頁面結構和信息層次一目了然。

超全面的B端設計規范指南(一):設計原則

③ 對齊:

在界面設計中,將元素進行對齊,既符合了用戶的認知特點(我們往往傾向使知覺對象的直線延續還是直線,曲線延續還是曲線),也能引導視用戶視覺流,讓用戶更流暢地接收信息。

超全面的B端設計規范指南(一):設計原則

④ 重復:

重復是指相同的元素在項目中重復引用,作用是可以有效降低用戶的學習成本,同時提高這些元素之間的關聯性。

超全面的B端設計規范指南(一):設計原則

2. 高效

高效原則體現在便捷、輕量、簡化、一致幾個方面,目的是通過合理的方式讓產品操作更加便捷;交互體驗與內容更加輕量和簡化;以及產品風格保持一致。下面結合幾個常見案例說明如何應用這一原則。

① 合理利用拖拽--便捷、輕量:

在涉及到諸如上傳文件,排序,滑動輸入,搭建等需求時,合理采用拖拽交互往往可以打造更加便捷用戶體驗。

超全面的B端設計規范指南(一):設計原則

② 盡量減少不必要的跳轉--便捷、輕量:

用戶操作過程盡量減少跳轉,以實現交互減步長,從而使用戶操作更高效輕量。例如能用原位操作就不考慮展開收起;能用展開收起就不用氣泡...依次類推(優先級從高到低:原位 > 展開收起 > 氣泡 > 彈窗 > 抽屜 > 新頁面)

超全面的B端設計規范指南(一):設計原則

③ 放大點擊熱區--便捷:

放大可點擊按鈕熱區,相對于較小點擊熱區,具備更絲滑操作體驗。

超全面的B端設計規范指南(一):設計原則

④ 懸停即現--輕量:

利用懸停即現,避免信息過于重復啰嗦,簡化頁面提高閱讀體驗。

超全面的B端設計規范指南(一):設計原則

⑤ 折疊次要功能--簡化:

頁面功能按鈕過多時,可將次要按鈕收納到一起,點擊時再展開,外面只展示高頻操作或重要按鈕,保證頁面內容簡潔。

超全面的B端設計規范指南(一):設計原則

⑥ 統一樣式--一致:

一致性是指在不同頁面中相同操作應保持一致視覺與交互樣式,可有降低用戶學習成本與企業開發成本。

超全面的B端設計規范指南(一):設計原則

3. 友好

友好原則應貫穿用戶操作前,操作中以及操作后三個階段,給予用戶及時反饋與幫助。

① 操作前:

在用戶操作前給到合適的引導與幫助,有效減少用戶迷茫感。

超全面的B端設計規范指南(一):設計原則

② 操作中:

通過交互效果以及頁面樣式讓用戶可以清晰感知到自己當前操作。

超全面的B端設計規范指南(一):設計原則

③ 操作后:

利用界面中元素變化清晰直觀展示當前的狀態

超全面的B端設計規范指南(一):設計原則

4. 可控

可控主要體現在自由和導航兩個方面。

① 自由:

自由即指用戶可以自由完成一些操作,例如回退,撤銷,終止等。

超全面的B端設計規范指南(一):設計原則

② 導航:

導航是指用戶隨時知曉當前所在位置,而且可以利用導航隨意到達目標頁面。

超全面的B端設計規范指南(一):設計原則

通過本篇內容我們大概知道了制作設計規范主要方向,那么具體到每個組件上,我們該如何去設計呢?后續篇章將細分聊聊如何去設計 B 端常見組件的一些內容。

部分參考資料:

  1. 《B 端產品設計-Mia》
  2. 《Ant Design》



作者:huang。亮      來源:優設網



藍藍設計建立了UI設計分享群,每天會分享國內外的一些優秀設計,如果有興趣的話,可以進入一起成長學習,請加微信ban_lanlan,報下信息,藍小助會請您入群。歡迎您加入噢~~

希望得到建議咨詢、商務合作,也請與我們聯系01063334945。 



分享此文一切功德,皆悉回向給文章原作者及眾讀者. 免責聲明:藍藍設計尊重原作者,文章的版權歸原作者。如涉及版權問題,請及時與我們取得聯系,我們立即更正或刪除。 



藍藍設計m.skdbbs.com )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務、UI設計公司、界面設計公司、UI設計服務公司、數據可視化設計公司、UI交互設計公司、高端網站設計公司、UI咨詢、用戶體驗公司、軟件界面設計公司

日歷

鏈接

個人資料

藍藍設計的小編 http://m.skdbbs.com

存檔

92国产精品视频_亚洲a级在线观看_国产精品电影观看_国产精品免费观看在线_精品伊人久久97_亚洲人成在线观_尤物九九久久国产精品的特点_成人激情在线播放_成人黄色大片在线免费观看_亚洲成人精品久久久_久久免费视频在线观看_久久精品国产一区_国产一区二区三区18_亚洲欧美中文字幕在线一区_日韩美女中文字幕_日韩视频免费在线
亚洲综合欧美| 亚洲免费视频网站| 久久97视频| 欧美日韩国产在线播放| 亚洲青青青在线视频| 国产精品久久久久婷婷二区次| 欧美色国产精品| 国产精品高清亚洲| 国产三区视频在线观看| 久久久久美女| 蜜桃传媒视频麻豆第一区免费观看| 欧美a级一区| 国产精品久久久久av蜜臀| 色欲综合视频天天天| 中文字幕有码在线观看| 亚洲天堂男人天堂| 亚洲男人天堂网| 国产福利一区二区三区视频在线| www.久久久久久久久| 国产精品久久久久久久久久东京| 国产精品揄拍一区二区| 国产精品豆花视频| 国产盗摄xxxx视频xxx69| 国产午夜精品免费一区二区三区| 精品久久久久久亚洲国产300| 中文字幕国产一区二区| 亚洲精品国产综合久久| 成人av动漫在线| 91麻豆精品国产自产在线观看一区| 亚洲夂夂婷婷色拍ww47| 国产精品视频在线看| 91中文字幕精品永久在线| 亚洲美女激情视频| 紧缚捆绑精品一区二区| 欧美a一级片| www.youjizz.com在线| 欧美性猛交xxxx乱大交退制版| 国产成人精品一区二区三区福利| 日韩有码一区二区三区| 国语自产精品视频在线看抢先版结局| 国产精品videosex性欧美| 午夜精品亚洲一区二区三区嫩草| 久久66热偷产精品| 正在播放一区二区| 亚洲精品不卡在线| 精品日本12videosex| 久久久久久久综合日本| 色综合亚洲精品激情狠狠| 99精品在线直播| 成人国产一区二区| 91久久中文字幕| av资源亚洲| 国产成人午夜性a一级毛片| 好吊妞国产欧美日韩免费观看网站| 久久免费国产精品| 精品一区免费| 精品国产乱码久久久久久影片| 日韩黄色av| 色噜噜狠狠一区二区三区果冻| 3d动漫一区二区三区在线观看| 色琪琪一区二区三区亚洲区| 国产三级电影在线播放| 欧美 亚欧 日韩视频在线| 一本久久综合亚洲鲁鲁| 一区二区三区视频免费在线观看| 懂色一区二区三区av片| 久久99国产精品二区高清软件| 国产日韩欧美在线观看| 亚洲裸体俱乐部裸体舞表演av| 国产精品护士白丝一区av| 国产午夜精品全部视频在线播放| 朝桐光一区二区| 久久男人av资源站| 欧美在线性视频| 一本到高清视频免费精品| 天海翼精品一区二区三区| 天堂av一区二区三区在线播放| 久久综合狠狠综合久久激情| 精品日本一区二区三区在线观看| 五月天一区二区三区| 亚洲最新视频在线观看| av不卡在线| 蜜臀av一区二区三区| 欧美一区二区三区公司| 欧美日韩福利| 97久久香蕉国产线看观看| 一区二区自拍| 欧美丰满少妇xxxbbb| 国产69精品久久99不卡| 国产一区二区三区免费在线| 色噜噜狠狠狠综合曰曰曰| 激情久久一区| 性色av一区二区三区| 欧美激情乱人伦| 精品极品在线| 成人欧美一区二区三区在线观看| 亚洲日本va| 依依成人精品视频| 日韩一区二区在线免费观看| 91老司机精品视频| 亚洲精品国产精品国自产观看浪潮| 日韩av大片免费看| 日韩一区二区免费高清| 亚洲成人免费观看| 亚洲国产欧美一区二区三区丁香婷| 欧美亚洲国产bt| 日韩精品一区二区在线观看| 久久久久久久久久久国产| 91蜜桃婷婷狠狠久久综合9色| 亚洲欧洲国产精品一区| a在线播放不卡| 日韩欧美一区二区视频在线播放| 亚洲a级在线播放观看| 国产欧美日韩不卡免费| 久久777国产线看观看精品| 欧美极品少妇xxxxⅹ喷水| 欧美日韩网址| 香蕉av777xxx色综合一区| 91精品麻豆日日躁夜夜躁| 久久福利网址导航| 国产亚洲高清一区| 亚洲国产欧美一区二区三区同亚洲| 四虎精品一区二区免费| 国产欧美丝袜| 一区二区三区日韩| 欧美性生活大片免费观看网址| 亚洲v天堂v手机在线| 久久精品免费电影| 影音先锋日韩资源| 精品亚洲免费视频| 日本视频在线免费观看| 国产99久久久欧美黑人| 精品国产伦一区二区三区免费| 九九热这里只有在线精品视| 91精品婷婷国产综合久久竹菊| 欧美主播福利视频| 丁香综合av| 亚洲性人人天天夜夜摸| 亚洲区在线播放| 老司机精品影院| 精品国产乱码久久久久久老虎| 久久精品观看| 二区三区四区高清视频在线观看| 国产精品久久久久久久久免费相片| 国产激情视频在线观看| 国产精品美乳一区二区免费| 亚洲欧美日韩在线高清直播| 激情久久中文字幕| 国产日韩欧美在线看| 亚洲视频一区二区在线观看| 欧美中日韩一区二区三区| 亚洲高清久久| 加勒比色综合久久久久久久久| 久久精品久久久精品美女| 在线不卡欧美精品一区二区三区| 亚洲精品成人久久电影| 亚洲欧美二区三区| 亚洲最大av在线| 亚洲成av人片乱码色午夜| 四虎精品一区二区免费| 日本免费视频在线观看| 5566av亚洲| 99精品国产在热久久| a篇片在线观看网站|