項(xiàng)目之關(guān)于Summernote的圖片處理和基于SpringMVC的文件上傳(10)
45. 我的問答列表-前端頁面
在index.html頁面,先找到整個(gè)列表區(qū)域的父級(jí),為其添加id,以便于創(chuàng)建Vue對(duì)象:
1
2
找到每個(gè)問題的顯示區(qū)域,為這個(gè)區(qū)域的根級(jí)添加v-for以循環(huán)顯示:
1
2
關(guān)于問題的狀態(tài):
已解決
1
問題的標(biāo)題:
1
問題的內(nèi)容:
eclipse 如何導(dǎo)入項(xiàng)目?
1
2
3
4
5
問題的標(biāo)簽列表:
1
2
3
右下角的更多信息:
風(fēng)繼續(xù)吹 12瀏覽 13分鐘前
1
2
3
顯示圖片:
1
完成后,先利用以上模擬的數(shù)據(jù)進(jìn)行測(cè)試,也就是直接打開瀏覽器,觀察運(yùn)行效果與預(yù)期是否相符!
測(cè)試完成后,在my.js中,向服務(wù)器端發(fā)送請(qǐng)求獲取真實(shí)的數(shù)據(jù),并用于顯示頁面:
let questionsApp = new Vue({ el: '#questionsApp', data: { questions: [] }, methods: { loadMyQuestions: function () { $.ajax({ url: '/api/v1/questions/my', success: function (json) { // json.data.list let data = json.data; let questions = data.list; let statusTexts = ['未回復(fù)', '未解決', '已解決']; let statusClasses = ['badge-warning', 'badge-info', 'badge-success']; for (let i = 0; i < questions.length; i++) { questions[i].statusText = statusTexts[questions[i].status]; questions[i].statusClass = statusClasses[questions[i].status]; questions[i].tagImage = '/img/tags/' + questions[i].tags[0].id + '.jpg'; questions[i].createdTimeText = "未知時(shí)間"; } questionsApp.questions = questions; } }); } }, created: function () { this.loadMyQuestions(); } });
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
關(guān)于將時(shí)間顯示為“剛剛” / “xx分鐘前”等格式的代碼:
let now = new Date().getTime(); let pastTime = (now - new Date(questions[i].createdTime).getTime()) / 1000; let createdTimeText = "未知時(shí)間"; if (pastTime < 60) { // 不足1分鐘 createdTimeText = "剛剛"; } else if (pastTime < 60 * 60) { // 不足1小時(shí) createdTimeText = parseInt(pastTime / 60) + "分鐘前"; } else if (pastTime < 60 * 60 * 24) { createdTimeText = parseInt(pastTime / 60 / 60) + "小時(shí)前"; } else { createdTimeText = parseInt(pastTime / 60 / 60 / 24) + "天前"; } questions[i].createdTimeText = createdTimeText;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
最后,關(guān)于顯示分頁,首先要使得以前加載數(shù)據(jù)的函數(shù)是支持頁碼參數(shù)的:
loadMyQuestions: function (page) { if (!page || page < 1) { page = 1; } $.ajax({ url: '/api/v1/questions/my', data: 'page=' + page, // 省略后續(xù)代碼 }); }
1
2
3
4
5
6
7
8
9
10
關(guān)于分頁的頁面部分的代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
在my.js中,在屬性中聲明pageInfo:
data: { questions: [], pageInfo: null }
1
2
3
4
當(dāng)獲取數(shù)據(jù)后,添加:
questionsApp.pageInfo = data;
1
至此,頁面的顯示已完成,關(guān)于my.js的完整代碼:
let questionsApp = new Vue({ el: '#questionsApp', data: { questions: [ { statusText: '已解決', statusClass: 'badge-success', title: '這是第1個(gè)問題', content: '很嚴(yán)肅的提出了第1個(gè)問題', tags: [ { id: 8, name: 'Java基礎(chǔ)' }, { id: 12, name: 'Spring' }, { id: 15, name: 'SpringBoot' } ], userNickName: '天下第一', hits: '826', createdTimeText: '8小時(shí)之前', tagImage: '/img/tags/8.jpg' }, { statusText: '未回復(fù)', statusClass: 'badge-warning', title: '這是第2個(gè)問題', content: '我也不告訴你是什么問題……', tags: [ { id: 10, name: 'MySQL' }, { id: 17, name: 'SpringSecurity' } ], userNickName: '天下第一', hits: '537', createdTimeText: '15小時(shí)之前', tagImage: '/img/tags/10.jpg' } ], pageInfo: null }, methods: { loadMyQuestions: function (page) { if (!page || page < 1) { page = 1; } $.ajax({ url: '/api/v1/questions/my', data: 'page=' + page, success: function (json) { // json.data.list let data = json.data; let questions = data.list; let statusTexts = ['未回復(fù)', '未解決', '已解決']; let statusClasses = ['badge-warning', 'badge-info', 'badge-success']; for (let i = 0; i < questions.length; i++) { questions[i].statusText = statusTexts[questions[i].status]; questions[i].statusClass = statusClasses[questions[i].status]; questions[i].tagImage = '/img/tags/' + questions[i].tags[0].id + '.jpg'; let now = new Date().getTime(); let pastTime = (now - new Date(questions[i].createdTime).getTime()) / 1000; let createdTimeText = "未知時(shí)間"; if (pastTime < 60) { // 不足1分鐘 createdTimeText = "剛剛"; } else if (pastTime < 60 * 60) { // 不足1小時(shí) createdTimeText = parseInt(pastTime / 60) + "分鐘前"; } else if (pastTime < 60 * 60 * 24) { createdTimeText = parseInt(pastTime / 60 / 60) + "小時(shí)前"; } else { createdTimeText = parseInt(pastTime / 60 / 60 / 24) + "天前"; } questions[i].createdTimeText = createdTimeText; } questionsApp.questions = questions; questionsApp.pageInfo = data; } }); } }, created: function () { this.loadMyQuestions(); } });
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
46. 關(guān)于Summernote的圖片處理
使用Summernote富文本編輯器時(shí),當(dāng)需要處理圖片時(shí),會(huì)自動(dòng)將圖片轉(zhuǎn)換為Base64編碼,當(dāng)提交問題時(shí),圖片的Base64編碼會(huì)作為“問題正文”的一部分提交到服務(wù)器端,最終,會(huì)被存儲(chǔ)到數(shù)據(jù)庫中!使用這種做法,會(huì)急劇增加數(shù)據(jù)庫所占用的存儲(chǔ)空間,對(duì)數(shù)據(jù)庫的檢索性能也會(huì)產(chǎn)生影響,不利于數(shù)據(jù)庫的管理和維護(hù),同時(shí),由于圖片已經(jīng)轉(zhuǎn)換為Base64編碼作為正文的一部分?jǐn)?shù)據(jù),也不利于管理圖片!
Summernote允許在配置Summernote富文本編輯器時(shí)自定義回調(diào)函數(shù),該函數(shù)會(huì)在用戶填寫正文時(shí)選擇圖片會(huì)自動(dòng)調(diào)用,則開發(fā)人員可以配置這個(gè)回調(diào)函數(shù),當(dāng)用戶選擇圖片后,將圖片以文件的形式直接上傳到服務(wù)器端,當(dāng)上傳成功后,再將圖片的路徑返回到客戶端,插入到Summernote中即可!
最后,在Summernote組織的“問題正文”中,關(guān)于圖片可能就只是一段例如