From c7b70471b2c778c02078a89b8f27cb97f7ad93f1 Mon Sep 17 00:00:00 2001 From: ljw <84855512@qq.com> Date: Mon, 28 Oct 2024 14:25:41 +0800 Subject: [PATCH] add share address book --- src/api/address_book.js | 1 - src/api/address_book_collection.js | 39 +++ src/api/address_book_collection_rule.js | 46 ++++ src/api/user.js | 8 + src/components/icons/platform.vue | 33 +++ src/router/index.js | 13 +- src/styles/style.scss | 8 +- src/utils/i18n/en.json | 36 +++ src/utils/i18n/ko.json | 36 +++ src/utils/i18n/ru.json | 36 +++ src/utils/i18n/zh_CN.json | 39 +++ src/views/address_book/collection.js | 95 +++++++ src/views/address_book/collection.vue | 122 +++++++++ src/views/address_book/index.js | 84 +++++- src/views/address_book/index.vue | 83 +++--- src/views/address_book/rule.js | 112 ++++++++ src/views/address_book/rule.vue | 127 +++++++++ src/views/my/address_book/collection.vue | 91 +++++++ src/views/my/address_book/index.vue | 55 ++-- src/views/my/address_book/indexv2.vue | 313 +++++++++++++++++++++++ src/views/my/tag/index.vue | 43 +++- src/views/tag/index.js | 52 +++- src/views/tag/index.vue | 70 ++--- 23 files changed, 1436 insertions(+), 106 deletions(-) create mode 100644 src/api/address_book_collection.js create mode 100644 src/api/address_book_collection_rule.js create mode 100644 src/components/icons/platform.vue create mode 100644 src/views/address_book/collection.js create mode 100644 src/views/address_book/collection.vue create mode 100644 src/views/address_book/rule.js create mode 100644 src/views/address_book/rule.vue create mode 100644 src/views/my/address_book/collection.vue create mode 100644 src/views/my/address_book/indexv2.vue diff --git a/src/api/address_book.js b/src/api/address_book.js index d333fbf..3414da2 100644 --- a/src/api/address_book.js +++ b/src/api/address_book.js @@ -52,4 +52,3 @@ export function shareByWebClient (data) { data, }) } - diff --git a/src/api/address_book_collection.js b/src/api/address_book_collection.js new file mode 100644 index 0000000..55d366f --- /dev/null +++ b/src/api/address_book_collection.js @@ -0,0 +1,39 @@ +import request from '@/utils/request' + +export function list (params) { + return request({ + url: '/address_book_collection/list', + params, + }) +} + +export function detail (id) { + return request({ + url: `/address_book_collection/detail/${id}`, + }) +} + +export function create (data) { + return request({ + url: '/address_book_collection/create', + method: 'post', + data, + }) +} + +export function update (data) { + return request({ + url: '/address_book_collection/update', + method: 'post', + data, + }) +} + +export function remove (data) { + return request({ + url: '/address_book_collection/delete', + method: 'post', + data, + }) +} + diff --git a/src/api/address_book_collection_rule.js b/src/api/address_book_collection_rule.js new file mode 100644 index 0000000..b0a78f1 --- /dev/null +++ b/src/api/address_book_collection_rule.js @@ -0,0 +1,46 @@ +import request from '@/utils/request' + +export function list (params) { + return request({ + url: '/address_book_collection_rule/list', + params, + }) +} + +export function detail (id) { + return request({ + url: `/address_book_collection_rule/detail/${id}`, + }) +} + +export function create (data) { + return request({ + url: '/address_book_collection_rule/create', + method: 'post', + data, + }) +} + +export function update (data) { + return request({ + url: '/address_book_collection_rule/update', + method: 'post', + data, + }) +} + +export function remove (data) { + return request({ + url: '/address_book_collection_rule/delete', + method: 'post', + data, + }) +} + +export function batchCreate (data) { + return request({ + url: '/address_book_collection_rule/batchCreate', + method: 'post', + data, + }) +} diff --git a/src/api/user.js b/src/api/user.js index a26eb8f..19be1f0 100644 --- a/src/api/user.js +++ b/src/api/user.js @@ -74,3 +74,11 @@ export function myOauth () { method: 'post', }) } + +export function groupUsers (data) { + return request({ + url: '/user/groupUsers', + method: 'post', + data + }) +} diff --git a/src/components/icons/platform.vue b/src/components/icons/platform.vue new file mode 100644 index 0000000..969da74 --- /dev/null +++ b/src/components/icons/platform.vue @@ -0,0 +1,33 @@ + + + + + diff --git a/src/router/index.js b/src/router/index.js index 370f2c5..e4fb363 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -54,6 +54,12 @@ export const asyncRoutes = [ meta: { title: 'Info', icon: 'User' /*keepAlive: true*/ }, component: () => import('@/views/my/info.vue'), }, + { + path: 'address_book_collection', + name: 'MyAddressBookCollection', + meta: { title: 'AddressBookName', icon: 'Collection' /*keepAlive: true*/ }, + component: () => import('@/views/my/address_book/collection.vue'), + }, { path: 'address_book', name: 'MyAddressBookList', @@ -105,7 +111,12 @@ export const asyncRoutes = [ meta: { title: 'UserEdit', hide: true }, component: () => import('@/views/user/edit.vue'), }, - + { + path: 'addressBookName', + name: 'UserAddressBookName', + meta: { title: 'AddressBookNameManage', icon: 'Collection' /*keepAlive: true*/ }, + component: () => import('@/views/address_book/collection.vue'), + }, { path: 'addressBook', name: 'UserAddressBook', diff --git a/src/styles/style.scss b/src/styles/style.scss index 47ae7d0..7724e89 100644 --- a/src/styles/style.scss +++ b/src/styles/style.scss @@ -8,6 +8,7 @@ $sideBarWidth: 210px; --basicBlack: #000000; --basicWhite: #ffffff; --primaryColor: #409eff; + --tag-bg-color: #efefef; } .list-body { @@ -29,15 +30,18 @@ $sideBarWidth: 210px; } } -.table-actions{ - .el-button{ +.table-actions { + .el-button { margin-top: 5px; margin-bottom: 5px; margin-left: 5px; margin-right: 5px; } } + html.dark { /* 自定义深色背景颜色 */ //--el-bg-color: #626aef; + --tag-bg-color: #24252b; + --basicBlack: #fff; } diff --git a/src/utils/i18n/en.json b/src/utils/i18n/en.json index 715a783..861e862 100644 --- a/src/utils/i18n/en.json +++ b/src/utils/i18n/en.json @@ -399,5 +399,41 @@ }, "ToLocal": { "One": "To Local" + }, + "AddressBookName": { + "One": "Address Book Name" + }, + "AddRule": { + "One": "Add Rule" + }, + "ShareRules": { + "One": "Share Rules" + }, + "Rule": { + "One": "Rule" + }, + "Read": { + "One": "Read" + }, + "ReadWrite": { + "One": "Read And Write" + }, + "FullControl": { + "One": "Full Control" + }, + "ShareTo": { + "One": "Share To" + }, + "MyAddressBook": { + "One": "My Address Book" + }, + "AddressBook": { + "One": "Address Book" + }, + "AddressBookNameManage": { + "One": "Address Book Names" + }, + "MyAddressBookTips": { + "One": "\"My Address Book\" is the default of the system, cannot be modified or deleted" } } diff --git a/src/utils/i18n/ko.json b/src/utils/i18n/ko.json index c411a33..19b390b 100644 --- a/src/utils/i18n/ko.json +++ b/src/utils/i18n/ko.json @@ -385,5 +385,41 @@ }, "ToLocal": { "One": "로컬로" + }, + "AddressBookName": { + "One": "주소록 이름" + }, + "AddRule": { + "One": "규칙 추가" + }, + "ShareRules": { + "One": "공유 규칙" + }, + "Rule": { + "One": "규칙" + }, + "Read": { + "One": "읽기" + }, + "ReadWrite": { + "One": "읽기/쓰기" + }, + "FullControl": { + "One": "전체 제어" + }, + "ShareTo": { + "One": "공유 대상" + }, + "MyAddressBook": { + "One": "내 주소록" + }, + "AddressBook": { + "One": "주소록" + }, + "AddressBookNameManage": { + "One": "주소록 이름 관리" + }, + "MyAddressBookTips": { + "One": "\"내 주소록\"은 시스템의 기본값이며 수정하거나 삭제할 수 없습니다." } } diff --git a/src/utils/i18n/ru.json b/src/utils/i18n/ru.json index b5a18b5..80bd7d6 100644 --- a/src/utils/i18n/ru.json +++ b/src/utils/i18n/ru.json @@ -399,6 +399,42 @@ }, "ToLocal": { "One": "К локальному" + }, + "AddressBookName": { + "One": "Имя адресной книги" + }, + "AddRule": { + "One": "Добавить правило" + }, + "ShareRules": { + "One": "Правила обмена" + }, + "Rule": { + "One": "Правило" + }, + "Read": { + "One": "Чтение" + }, + "ReadWrite": { + "One": "Чтение и запись" + }, + "FullControl": { + "One": "Полный доступ" + }, + "ShareTo": { + "One": "Поделиться с" + }, + "MyAddressBook": { + "One": "Моя адресная книга" + }, + "AddressBook": { + "One": "Адресная книга" + }, + "AddressBookNameManage": { + "One": "именами адресных книг" + }, + "MyAddressBookTips": { + "One": "«Моя адресная книга» является стандартным для системы, не может быть изменена или удалена" } } diff --git a/src/utils/i18n/zh_CN.json b/src/utils/i18n/zh_CN.json index 9189a47..9631e84 100644 --- a/src/utils/i18n/zh_CN.json +++ b/src/utils/i18n/zh_CN.json @@ -385,5 +385,44 @@ }, "ToLocal": { "One": "到本地" + }, + "AddressBookName": { + "One": "地址簿名称" + }, + "AddressBookCollection": { + "One": "地址簿集" + }, + "AddRule": { + "One": "添加规则" + }, + "ShareRules": { + "One": "分享规则" + }, + "Rule": { + "One": "规则" + }, + "Read": { + "One": "读取" + }, + "ReadWrite": { + "One": "读写" + }, + "FullControl": { + "One": "完全控制" + }, + "ShareTo": { + "One": "分享给" + }, + "MyAddressBook": { + "One": "我的地址簿" + }, + "AddressBook": { + "One": "地址簿" + }, + "AddressBookNameManage": { + "One": "地址簿名称" + }, + "MyAddressBookTips": { + "One": "\"我的地址簿\"是系统默认,不可修改、删除" } } diff --git a/src/views/address_book/collection.js b/src/views/address_book/collection.js new file mode 100644 index 0000000..62aee3e --- /dev/null +++ b/src/views/address_book/collection.js @@ -0,0 +1,95 @@ +import { reactive, ref } from 'vue' +import { create, list, remove, update } from '@/api/address_book_collection' +import { ElMessage, ElMessageBox } from 'element-plus' +import { T } from '@/utils/i18n' + +export function useRepositories (is_my) { + const listRes = reactive({ + list: [], total: 0, loading: false, + }) + const listQuery = reactive({ + page: 1, + page_size: 10, + is_my, + name: null, + user_id: null, + }) + + const getList = async () => { + listRes.loading = true + const res = await list(listQuery).catch(_ => false) + listRes.loading = false + if (res) { + listRes.list = res.data.list + listRes.total = res.data.total + } + } + const handlerQuery = () => { + if (listQuery.page === 1) { + getList() + } else { + listQuery.page = 1 + } + } + + const del = async (row) => { + const cf = await ElMessageBox.confirm(T('Confirm?', { param: T('Delete') }), { + confirmButtonText: T('Confirm'), + cancelButtonText: T('Cancel'), + type: 'warning', + }).catch(_ => false) + if (!cf) { + return false + } + + const res = await remove({ id: row.id }).catch(_ => false) + if (res) { + ElMessage.success(T('OperationSuccess')) + getList() + } + } + + const formVisible = ref(false) + const formData = reactive({ + id: 0, + name: '', + }) + + const toEdit = (row) => { + formVisible.value = true + //将row中的数据赋值给formData + Object.keys(formData).forEach(key => { + formData[key] = row[key] + }) + + } + const toAdd = () => { + formVisible.value = true + //重置formData + Object.keys(formData).forEach(key => { + formData[key] = undefined + }) + + } + const submit = async () => { + const api = formData.id ? update : create + const res = await api(formData).catch(_ => false) + if (res) { + ElMessage.success(T('OperationSuccess')) + formVisible.value = false + getList() + } + } + return { + listRes, + listQuery, + getList, + handlerQuery, + del, + formVisible, + formData, + toEdit, + toAdd, + submit, + } +} diff --git a/src/views/address_book/collection.vue b/src/views/address_book/collection.vue new file mode 100644 index 0000000..99c70cc --- /dev/null +++ b/src/views/address_book/collection.vue @@ -0,0 +1,122 @@ + + + + + diff --git a/src/views/address_book/index.js b/src/views/address_book/index.js index 476f63f..1fbd396 100644 --- a/src/views/address_book/index.js +++ b/src/views/address_book/index.js @@ -1,20 +1,40 @@ -import { reactive, ref } from 'vue' +import { reactive, ref, watch } from 'vue' import { create, list, remove, update } from '@/api/address_book' import { ElMessage, ElMessageBox } from 'element-plus' import { T } from '@/utils/i18n' +import { useRepositories as useCollectionRepositories } from '@/views/address_book/collection' +import { useRepositories as useTagRepositories } from '@/views/tag/index' +import { loadAllUsers } from '@/global' + +export function useRepositories (is_my = 0) { + + const { allUsers, getAllUsers } = loadAllUsers() + + const { + listRes: collectionListRes, + listQuery: collectionListQuery, + getList: getCollectionList, + } = useCollectionRepositories(is_my) + collectionListQuery.page_size = 9999 + const { + listRes: tagListRes, + listQuery: tagListQuery, + getList: getTagList, + } = useTagRepositories(is_my) + tagListQuery.page_size = 9999 -export function useRepositories (user_id) { const listRes = reactive({ list: [], total: 0, loading: false, }) const listQuery = reactive({ page: 1, page_size: 10, - is_my: 0, + is_my, id: null, user_id: null, username: null, hostname: null, + collection_id: null, }) const getList = async () => { @@ -52,10 +72,10 @@ export function useRepositories (user_id) { } const platformList = [ - { label: 'Windows', value: 'Windows' }, - { label: 'Linux', value: 'Linux' }, - { label: 'Mac OS', value: 'Mac OS' }, - { label: 'Android', value: 'Android' }, + { label: 'Windows', value: 'Windows', icon: 'windows' }, + { label: 'Linux', value: 'Linux', icon: 'linux' }, + { label: 'Mac OS', value: 'Mac OS', icon: 'mac' }, + { label: 'Android', value: 'Android', icon: 'android' }, ] const formVisible = ref(false) const formData = reactive({ @@ -76,6 +96,7 @@ export function useRepositories (user_id) { 'user_id': null, user_ids: [], 'username': '', + collection_id: null, }) const toEdit = (row) => { @@ -84,6 +105,10 @@ export function useRepositories (user_id) { Object.keys(formData).forEach(key => { formData[key] = row[key] }) + collectionListQuery.user_id = row.user_id + getCollectionList() + tagListQuery.collection_id = row.collection_id + getTagList() } const toAdd = () => { @@ -126,6 +151,36 @@ export function useRepositories (user_id) { shareToWebClientForm.hash = row.hash shareToWebClientVisible.value = true } + + const changeQueryUser = async (val) => { + tagListRes.list = [] + listQuery.collection_id = null + if (!val) { + collectionListRes.list = [] + } else { + collectionListQuery.user_id = val + getCollectionList() + } + } + const changeUser = async (val) => { + tagListRes.list = [] + formData.tags = [] + formData.collection_id = 0 + if (!val) { + collectionListRes.list = [] + } else { + collectionListQuery.user_id = val + getCollectionList() + } + } + const changeCollection = async (val) => { + tagListRes.list = [] + formData.tags = [] + tagListQuery.user_id = formData.user_id + tagListQuery.collection_id = val + getTagList() + } + return { listRes, listQuery, @@ -141,5 +196,20 @@ export function useRepositories (user_id) { shareToWebClientVisible, shareToWebClientForm, toShowShare, + + collectionListQuery, + getCollectionList, + collectionListRes, + + tagListQuery, + getTagList, + tagListRes, + + allUsers, + getAllUsers, + + changeQueryUser, + changeUser, + changeCollection, } } diff --git a/src/views/address_book/index.vue b/src/views/address_book/index.vue index c1222d8..e72025a 100644 --- a/src/views/address_book/index.vue +++ b/src/views/address_book/index.vue @@ -1,9 +1,9 @@ + + + - - @@ -81,6 +97,12 @@ > + + + + + + @@ -116,7 +138,7 @@ - + + + diff --git a/src/views/my/address_book/collection.vue b/src/views/my/address_book/collection.vue new file mode 100644 index 0000000..87039ad --- /dev/null +++ b/src/views/my/address_book/collection.vue @@ -0,0 +1,91 @@ + + + + + diff --git a/src/views/my/address_book/index.vue b/src/views/my/address_book/index.vue index 86c0923..accccf5 100644 --- a/src/views/my/address_book/index.vue +++ b/src/views/my/address_book/index.vue @@ -1,7 +1,13 @@