diff --git a/CHANGELOG.md b/CHANGELOG.md index d4681076..33ca253f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ - feat: |UI| 随机生成地址时不超过最大长度 - feat: |UI| 邮件时间显示浏览器时区,可在设置中切换显示为 UTC 时间 +- feat: 支持转移邮件到其他用户 ## v0.7.6 diff --git a/db/schema.sql b/db/schema.sql index 5967627e..153f66f3 100644 --- a/db/schema.sql +++ b/db/schema.sql @@ -10,7 +10,7 @@ CREATE TABLE IF NOT EXISTS raw_mails ( CREATE INDEX IF NOT EXISTS idx_raw_mails_address ON raw_mails(address); CREATE TABLE IF NOT EXISTS address ( - id INTEGER PRIMARY KEY, + id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT UNIQUE, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP diff --git a/frontend/src/main.js b/frontend/src/main.js index 63f8050d..d6f7d272 100644 --- a/frontend/src/main.js +++ b/frontend/src/main.js @@ -2,12 +2,8 @@ import { createApp } from 'vue' import App from './App.vue' import { createI18n } from 'vue-i18n' import router from './router' -import { registerSW } from 'virtual:pwa-register' import { createHead } from '@unhead/vue' -const disablePwa = import.meta.env.VITE_PWA_DISABLED === 'true'; - -if (!disablePwa) registerSW({ immediate: true }) const i18n = createI18n({ legacy: false, // you must set `false`, to use Composition API locale: 'zh', // set locale diff --git a/frontend/src/views/user/AddressManagement.vue b/frontend/src/views/user/AddressManagement.vue index ea702e70..384350dc 100644 --- a/frontend/src/views/user/AddressManagement.vue +++ b/frontend/src/views/user/AddressManagement.vue @@ -20,9 +20,12 @@ const { locale, t } = useI18n({ mail_count: 'Mail Count', send_count: 'Send Count', actions: 'Actions', - changeMailAddress: 'Change Mail Address', + changeMailAddress: 'Change Address', unbindAddress: 'Unbind Address', unbindAddressTip: 'Before unbinding, please switch to this email address and save the email address credential.', + transferAddress: 'Transfer Address', + targetUserEmail: 'Target User Email', + transferAddressTip: 'Transfer address to another user will remove the address from your account and transfer it to another user. Are you sure to transfer the address?' }, zh: { success: '成功', @@ -30,14 +33,21 @@ const { locale, t } = useI18n({ mail_count: '邮件数量', send_count: '发送数量', actions: '操作', - changeMailAddress: '切换邮箱地址', + changeMailAddress: '切换地址', unbindAddress: '解绑地址', unbindAddressTip: '解绑前请切换到此邮箱地址并保存邮箱地址凭证。', + transferAddress: '转移地址', + targetUserEmail: '目标用户邮箱', + transferAddressTip: '转移地址到其他用户将会从你的账户中移除此地址并转移给其他用户。确定要转移地址吗?' } } }); const data = ref([]) +const showTranferAddress = ref(false) +const currentAddress = ref("") +const currentAddressId = ref(0) +const targetUserEmail = ref('') const changeMailAddress = async (address_id) => { try { @@ -70,6 +80,35 @@ const unbindAddress = async (address_id) => { } } +const transferAddress = async () => { + if (!targetUserEmail.value) { + message.error("targetUserEmail is required"); + return; + } + if (!currentAddressId.value) { + message.error("currentAddressId is required"); + return; + } + try { + const res = await api.fetch(`/user_api/transfer_address`, { + method: 'POST', + body: JSON.stringify({ + address_id: currentAddressId.value, + target_user_email: targetUserEmail.value + }) + }); + message.success(t('transferAddress') + " " + t('success')); + await fetchData(); + showTranferAddress.value = false; + currentAddressId.value = 0; + currentAddress.value = ""; + targetUserEmail.value = ""; + } catch (error) { + console.log(error) + message.error(error.message || "error"); + } +} + const fetchData = async () => { try { const { results, count: addressCount } = await api.fetch( @@ -138,6 +177,18 @@ const columns = [ default: () => `${t('changeMailAddress')}?` } ), + h(NButton, + { + tertiary: true, + type: "primary", + onClick: () => { + currentAddressId.value = row.id; + currentAddress.value = row.name; + showTranferAddress.value = true; + } + }, + { default: () => t('transferAddress') } + ), h(NPopconfirm, { onPositiveClick: () => unbindAddress(row.id) @@ -164,6 +215,18 @@ onMounted(async () => {