Skip to content

Commit 1cdca91

Browse files
committed
新增全部邮件自动刷新
1 parent 454cde6 commit 1cdca91

File tree

7 files changed

+174
-48
lines changed

7 files changed

+174
-48
lines changed

mail-vue/src/components/email-scroll/index.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
<div ref="scroll" class="scroll">
3131
<el-scrollbar ref="scrollbarRef" style="height: 100%">
3232
<div class="scroll-box" :infinite-scroll-immediate="false" v-infinite-scroll="loadData"
33-
infinite-scroll-distance="600">
33+
infinite-scroll-distance="3000">
3434
<div v-if="(skeleton && !loading)" v-for="item in emailList" :key="item.emailId">
3535
<div class="email-row"
3636
:data-checked="item.checked"
@@ -252,7 +252,7 @@ let isMobile = ref(innerWidth < 1367)
252252
let skeletonRows = 0
253253
const queryParam = reactive({
254254
emailId: 0,
255-
size: 30,
255+
size: 50,
256256
});
257257
258258
defineExpose({

mail-vue/src/request/all-email.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,7 @@ export function allEmailDelete(emailIds) {
1111
export function allEmailBatchDelete(params) {
1212
return http.delete('/allEmail/batchDelete', {params: params} )
1313
}
14+
15+
export function allEmailLatest(emailId) {
16+
return http.get('/allEmail/latest', {params: {emailId}, noMsg: true, timeout: 35 * 1000})
17+
}

mail-vue/src/views/all-email/index.vue

Lines changed: 75 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
show-status
1111
actionLeft="4px"
1212
:show-account-icon="false"
13+
:time-sort="params.timeSort"
1314
@jump="jumpContent"
1415
@refresh-before="refreshBefore"
1516
:type="'all-email'"
@@ -87,31 +88,42 @@
8788
<script setup>
8889
import {starAdd, starCancel} from "@/request/star.js";
8990
import emailScroll from "@/components/email-scroll/index.vue"
90-
import {computed, defineOptions, reactive, ref, watch} from "vue";
91+
import {computed, defineOptions, reactive, ref, watch, onMounted} from "vue";
9192
import {useEmailStore} from "@/store/email.js";
9293
import {
9394
allEmailList,
9495
allEmailDelete,
95-
allEmailBatchDelete
96+
allEmailBatchDelete,
97+
allEmailLatest
9698
} from "@/request/all-email.js";
9799
import {Icon} from "@iconify/vue";
98100
import router from "@/router/index.js";
99101
import {useI18n} from 'vue-i18n';
100102
import {toUtc} from "@/utils/day.js";
103+
import {AutoRefreshEnum} from "@/enums/setting-enum.js";
104+
import {sleep} from "@/utils/time-utils.js";
105+
import {useSettingStore} from "@/store/setting.js";
106+
import { useRoute } from 'vue-router'
101107
102108
defineOptions({
103109
name: 'all-email'
104110
})
105111
112+
const route = useRoute()
106113
const {t} = useI18n();
107114
const emailStore = useEmailStore();
115+
const settingStore = useSettingStore();
108116
const clearTime = ref('')
109117
const sysEmailScroll = ref({})
110118
const searchValue = ref('')
111119
const mySelect = ref()
112120
const showBathDelete = ref(false)
113121
const clearLoading = ref(false)
114122
123+
onMounted(() => {
124+
latest();
125+
})
126+
115127
const openSelect = () => {
116128
mySelect.value.toggleMenu()
117129
}
@@ -272,6 +284,67 @@ function jumpContent(email) {
272284
function getEmailList(emailId, size) {
273285
return allEmailList({emailId, size, ...params})
274286
}
287+
288+
async function latest() {
289+
290+
while (true) {
291+
292+
await sleep(1000)
293+
294+
const latestId = sysEmailScroll.value.latestEmail?.emailId
295+
296+
if (settingStore.settings.autoRefresh === AutoRefreshEnum.DISABLED) {
297+
continue
298+
}
299+
300+
if (!latestId && latestId !== 0) {
301+
continue
302+
}
303+
304+
if (route.name !== 'all-email') {
305+
continue
306+
}
307+
308+
309+
if (params.type !== 'receive') {
310+
continue
311+
}
312+
313+
try {
314+
315+
const curTimeSort = params.timeSort
316+
let list = await allEmailLatest(latestId)
317+
318+
if (list.length === 0) {
319+
continue
320+
}
321+
322+
if (params.type !== 'receive') {
323+
continue
324+
}
325+
326+
// 确保回来之后条件没变
327+
if (params.timeSort !== curTimeSort) {
328+
continue
329+
}
330+
331+
for (let email of list) {
332+
333+
sysEmailScroll.value.addItem(email)
334+
await sleep(50)
335+
336+
}
337+
338+
} catch (e) {
339+
if (e.code === 401) {
340+
settingStore.settings.autoRefresh = AutoRefreshEnum.DISABLED;
341+
}
342+
console.error(e)
343+
}
344+
345+
}
346+
}
347+
275348
</script>
276349
<style>
277350

mail-vue/src/views/email/index.vue

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,14 @@ import {defineOptions, h, onMounted, reactive, ref, watch} from "vue";
3333
import {sleep} from "@/utils/time-utils.js";
3434
import router from "@/router/index.js";
3535
import {Icon} from "@iconify/vue";
36-
import {AccountAllReceiveEnum} from "@/enums/account-enum.js";
36+
import { useRoute } from 'vue-router'
3737
import {AutoRefreshEnum} from "@/enums/setting-enum.js";
3838
3939
defineOptions({
4040
name: 'email'
4141
})
4242
43+
const route = useRoute();
4344
const emailStore = useEmailStore();
4445
const accountStore = useAccountStore();
4546
const settingStore = useSettingStore();
@@ -76,6 +77,13 @@ const existIds = new Set();
7677
7778
async function latest() {
7879
while (true) {
80+
81+
await sleep(1000)
82+
83+
if (route.name !== 'email') {
84+
continue;
85+
}
86+
7987
const latestId = scroll.value.latestEmail?.emailId
8088
8189
if (!scroll.value.firstLoad && settingStore.settings.autoRefresh === AutoRefreshEnum.ENABLED) {
@@ -125,10 +133,12 @@ async function latest() {
125133
126134
}
127135
} catch (e) {
136+
if (e.code === 401) {
137+
settingStore.settings.autoRefresh = AutoRefreshEnum.DISABLED;
138+
}
128139
console.error(e)
129140
}
130141
}
131-
await sleep(500)
132142
}
133143
}
134144

mail-worker/src/api/all-email-api.js

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,22 @@ import app from '../hono/hono';
22
import emailService from '../service/email-service';
33
import result from '../model/result';
44

5-
app.get('/allEmail/list',async (c) => {
5+
app.get('/allEmail/list', async (c) => {
66
const data = await emailService.allList(c, c.req.query());
77
return c.json(result.ok(data));
88
})
99

10-
app.delete('/allEmail/delete',async (c) => {
10+
app.delete('/allEmail/delete', async (c) => {
1111
const list = await emailService.physicsDelete(c, c.req.query());
1212
return c.json(result.ok(list));
1313
})
1414

15-
app.delete('/allEmail/batchDelete',async (c) => {
15+
app.delete('/allEmail/batchDelete', async (c) => {
1616
await emailService.batchDelete(c, c.req.query());
1717
return c.json(result.ok());
1818
})
19+
20+
app.get('/allEmail/latest', async (c) => {
21+
const list = await emailService.allEmailLatest(c, c.req.query());
22+
return c.json(result.ok(list));
23+
})

mail-worker/src/security/security.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ const premKey = {
7474
'user:set-status': ['/user/setStatus'],
7575
'user:set-type': ['/user/setType'],
7676
'user:delete': ['/user/delete','/user/deleteAccount'],
77-
'all-email:query': ['/allEmail/list'],
77+
'all-email:query': ['/allEmail/list','/allEmail/latest'],
7878
'all-email:delete': ['/allEmail/delete','/allEmail/batchDelete'],
7979
'setting:query': ['/setting/query'],
8080
'setting:set': ['/setting/set', '/setting/setBackground','/setting/deleteBackground'],

0 commit comments

Comments
 (0)