diff --git a/src/api/owner/ownerApi.js b/src/api/owner/ownerApi.js new file mode 100644 index 0000000..75eeea7 --- /dev/null +++ b/src/api/owner/ownerApi.js @@ -0,0 +1,153 @@ +import request from '@/utils/request' +import { getCommunityId } from '@/api/community/communityApi' + +// 查询业主列表 +export function queryOwners(params) { + return new Promise((resolve, reject) => { + params.communityId = getCommunityId() + request({ + url: '/owner.queryOwners', + method: 'get', + params + }).then(response => { + const res = response.data + if (res.code == 0) { + resolve(res) + } else { + reject(new Error(res.msg || '查询业主列表失败')) + } + }).catch(error => { + reject(error) + }) + }) +} + +// 保存业主 +export function saveOwner(data) { + return new Promise((resolve, reject) => { + data.communityId = getCommunityId() + request({ + url: '/owner.saveOwner', + method: 'post', + data + }).then(response => { + const res = response.data + if (res.code == 0) { + resolve(res) + } else { + reject(new Error(res.msg || '保存业主失败')) + } + }).catch(error => { + reject(error) + }) + }) +} + +// 编辑业主 +export function editOwner(data) { + return new Promise((resolve, reject) => { + data.communityId = getCommunityId() + request({ + url: '/owner.editOwner', + method: 'post', + data + }).then(response => { + const res = response.data + if (res.code == 0) { + resolve(res) + } else { + reject(new Error(res.msg || '编辑业主失败')) + } + }).catch(error => { + reject(error) + }) + }) +} + +// 删除业主 +export function deleteOwner(data) { + return new Promise((resolve, reject) => { + data.communityId = getCommunityId() + request({ + url: '/owner.deleteOwner', + method: 'post', + data + }).then(response => { + const res = response.data + if (res.code == 0) { + resolve(res) + } else { + reject(new Error(res.msg || '删除业主失败')) + } + }).catch(error => { + reject(error) + }) + }) +} + +// 上传图片 +export function uploadImage(data) { + return new Promise((resolve, reject) => { + const formData = new FormData() + formData.append('uploadFile', data.file) + formData.append('communityId', getCommunityId()) + + request({ + url: 'uploadImage', + method: 'post', + data: formData, + headers: { + 'Content-Type': 'multipart/form-data' + } + }).then(response => { + const res = response.data + if (res.code == 0) { + resolve(res) + } else { + reject(new Error(res.msg || '上传图片失败')) + } + }).catch(error => { + reject(error) + }) + }) +} + +// 获取属性规格 +export function getAttrSpec(specCd) { + return new Promise((resolve, reject) => { + request({ + url: '/attrSpec.listAttrSpecs', + method: 'get', + params: { specCd, communityId: getCommunityId() } + }).then(response => { + const res = response.data + if (res.code == 0) { + resolve(res.data) + } else { + reject(new Error(res.msg || '获取属性规格失败')) + } + }).catch(error => { + reject(error) + }) + }) +} + +// 获取属性值 +export function getAttrValue(specCd) { + return new Promise((resolve, reject) => { + request({ + url: '/attrValue.listAttrValues', + method: 'get', + params: { specCd, communityId: getCommunityId() } + }).then(response => { + const res = response.data + if (res.code == 0) { + resolve(res.data) + } else { + reject(new Error(res.msg || '获取属性值失败')) + } + }).catch(error => { + reject(error) + }) + }) +} \ No newline at end of file diff --git a/src/components/owner/addOwner.vue b/src/components/owner/addOwner.vue new file mode 100644 index 0000000..09a90e3 --- /dev/null +++ b/src/components/owner/addOwner.vue @@ -0,0 +1,274 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {{ $t('common.upload') }} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/components/owner/deleteOwner.vue b/src/components/owner/deleteOwner.vue new file mode 100644 index 0000000..849a17b --- /dev/null +++ b/src/components/owner/deleteOwner.vue @@ -0,0 +1,47 @@ + + + {{ $t('listOwner.confirmDelete') }} + + + + + + \ No newline at end of file diff --git a/src/components/owner/editOwner.vue b/src/components/owner/editOwner.vue new file mode 100644 index 0000000..08093e7 --- /dev/null +++ b/src/components/owner/editOwner.vue @@ -0,0 +1,280 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {{ $t('common.upload') }} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/components/room/searchRoom.vue b/src/components/room/searchRoom.vue new file mode 100644 index 0000000..1d5cd12 --- /dev/null +++ b/src/components/room/searchRoom.vue @@ -0,0 +1,184 @@ + + + + + + + + + + + + + + {{ $t('searchRoom.search') }} + + + + {{ $t('searchRoom.reset') }} + + + + + + + + + {{ row.floorNum }}{{ $t('searchRoom.building') }} + + + + + {{ row.unitNum }}{{ $t('searchRoom.unit') }} + + + + + {{ row.roomNum }}{{ $t('searchRoom.room') }} + + + + + {{ row.layer }}{{ $t('searchRoom.floor') }} + + + + + + {{ $t('searchRoom.choose') }} + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/i18n/commonLang.js b/src/i18n/commonLang.js index 47602af..26df550 100644 --- a/src/i18n/commonLang.js +++ b/src/i18n/commonLang.js @@ -40,6 +40,7 @@ export const messages = { enabled: 'Enabled', disabled: 'Disabled', import: 'Import', + remark: 'Remark', } }, zh: { @@ -83,6 +84,7 @@ export const messages = { enabled: '启用', disabled: '禁用', import: '导入', + remark: '备注', } } } \ No newline at end of file diff --git a/src/i18n/index.js b/src/i18n/index.js index ae90d3c..36e2aa8 100644 --- a/src/i18n/index.js +++ b/src/i18n/index.js @@ -127,6 +127,7 @@ import { messages as addRoomViewMessages } from '../views/room/addRoomViewLang' import { messages as roomBindOwnerMessages } from '../views/owner/roomBindOwnerLang' import { messages as deleteOwnerRoomMessages } from '../views/owner/deleteOwnerRoomLang' import { messages as shopsMessages } from '../views/room/shopsLang' +import { messages as listOwnerMessages } from '../views/owner/listOwnerLang' Vue.use(VueI18n) @@ -258,6 +259,7 @@ const messages = { ...roomBindOwnerMessages.en, ...deleteOwnerRoomMessages.en, ...shopsMessages.en, + ...listOwnerMessages.en, }, zh: { ...loginMessages.zh, @@ -385,6 +387,7 @@ const messages = { ...roomBindOwnerMessages.zh, ...deleteOwnerRoomMessages.zh, ...shopsMessages.zh, + ...listOwnerMessages.zh, } } diff --git a/src/router/index.js b/src/router/index.js index 4ae20da..295edd5 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -621,6 +621,17 @@ const routes = [ name: '/pages/property/shops', component: () => import('@/views/room/shopsList.vue') }, + { + path: '/pages/property/listOwner', + name: '/pages/property/listOwner', + component: () => import('@/views/owner/listOwner.vue') + }, + { + path: '/views/owner/ownerBindRoom', + name: '/views/owner/ownerBindRoom', + component: () => import('@/views/owner/ownerBindRoom.vue') + }, + // 其他子路由可以在这里添加 ] }, diff --git a/src/views/owner/listOwner.vue b/src/views/owner/listOwner.vue new file mode 100644 index 0000000..39e2b0a --- /dev/null +++ b/src/views/owner/listOwner.vue @@ -0,0 +1,468 @@ + + + + + + + + {{ item.name }} + + + + + + + + + {{ $t('listOwner.searchTitle') }} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {{ $t('listOwner.buttons.search') }} + + + {{ $t('listOwner.buttons.reset') }} + + + + + + + + + + {{ $t('listOwner.ownerInfo') }} + + {{ $t('listOwner.buttons.add') }} + + + + + + + + + + + + + {{ scope.row.name }} + {{ scope.row.concactPerson }} + + + + + + + + + + {{ scope.row.sex === 0 ? $t('listOwner.gender.male') : $t('listOwner.gender.female') }} + + + + + + {{ scope.row.idCard || '-' }} + + + + + + + + {{ scope.row.concactLink || '-' }} + + + + + + {{ scope.row.address || '-' }} + + + + + + + {{ scope.row.roomCount || 0 }} + + + + + + + + {{ scope.row.memberCount || 0 }} + + - + + + + + + + {{ scope.row.carCount || 0 }} + + + + + + + + {{ scope.row.oweFee || '0.00' }} + + + + + + + {{ scope.row.listValues[index] || '-' }} + + + + + + + + {{ $t('listOwner.buttons.edit') }} + + + + {{ $t('listOwner.actions.editOwner') }} + + + {{ $t('listOwner.actions.deleteOwner') }} + + + {{ $t('listOwner.actions.addRoom') }} + + + {{ $t('listOwner.buttons.unbindRoom') }} + + + + + + {{ $t('listOwner.buttons.member') }} + + + + {{ $t('listOwner.buttons.detail') }} + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/views/owner/listOwnerLang.js b/src/views/owner/listOwnerLang.js new file mode 100644 index 0000000..128a7c3 --- /dev/null +++ b/src/views/owner/listOwnerLang.js @@ -0,0 +1,128 @@ +export const messages = { + en: { + listOwner: { + title: 'Owner Management', + searchTitle: 'Search Conditions', + ownerInfo: 'Owner Information', + selectRoom: 'Select Room', + role: { + all: 'All', + owner: 'Owner', + tenant: 'Tenant' + }, + personType: { + personal: 'Personal', + company: 'Company' + }, + personTypeName:'Person Type', + gender: { + male: 'Male', + female: 'Female' + }, + columns: { + face: 'Face', + name: 'Name', + type: 'Type', + role: 'Role', + gender: 'Gender', + idCard: 'ID Card', + phone: 'Phone', + backupPhone: 'Backup Phone', + address: 'Address', + rooms: 'Rooms', + members: 'Members', + cars: 'Cars', + debts: 'Debts', + operation: 'Operation' + }, + placeholders: { + name: 'Please enter name', + room: 'Building-Unit-Room', + phone: 'Please enter phone', + idCard: 'Please enter ID card' + }, + buttons: { + search: 'Search', + reset: 'Reset', + add: 'Add', + save: 'Save', + cancel: 'Cancel', + edit: 'Edit', + delete: 'Delete', + bindRoom: 'Bind Room', + unbindRoom: 'Unbind Room', + member: 'Member', + detail: 'Detail' + }, + actions: { + editOwner: 'Edit Owner', + deleteOwner: 'Delete Owner', + addRoom: 'Add Room' + }, + confirmDelete: 'Are you sure to delete?' + } + }, + zh: { + listOwner: { + title: '业主管理', + searchTitle: '查询条件', + ownerInfo: '业主信息', + selectRoom: '选择房屋', + role: { + all: '全部', + owner: '业主', + tenant: '租客' + }, + personType: { + personal: '个人', + company: '公司' + }, + personTypeName:'人员类型', + gender: { + male: '男', + female: '女' + }, + columns: { + face: '人脸', + name: '客户名称', + type: '人员类型', + role: '人员角色', + gender: '性别', + idCard: '证件号', + phone: '联系手机', + backupPhone: '备用手机', + address: '地址', + rooms: '房屋数', + members: '业主成员', + cars: '车辆数', + debts: '欠费', + operation: '操作' + }, + placeholders: { + name: '请输入客户名称', + room: '楼栋-单元-房屋', + phone: '请输入联系方式', + idCard: '请输入业主身份证号' + }, + buttons: { + search: '查询', + reset: '重置', + add: '添加', + save: '保存', + cancel: '取消', + edit: '修改', + delete: '删除', + bindRoom: '入住房屋', + unbindRoom: '房屋解绑', + member: '成员', + detail: '详情' + }, + actions: { + editOwner: '修改业主', + deleteOwner: '删除业主', + addRoom: '入住房屋' + }, + confirmDelete: '确认是否删除!' + } + } +} \ No newline at end of file diff --git a/src/views/owner/ownerBindRoom.vue b/src/views/owner/ownerBindRoom.vue new file mode 100644 index 0000000..8039451 --- /dev/null +++ b/src/views/owner/ownerBindRoom.vue @@ -0,0 +1,193 @@ + + + + + {{ $t('roomBindOwner.title') }} + + + {{ $t('common.back') }} + + + + + + + + + + + + + + + + + {{ $t('listOwner.selectRoom') }} + + + + + + + + + + + + + + + + + + + + + + {{ $t('common.submit') }} + + + + + + + + + + + \ No newline at end of file diff --git a/src/views/owner/roomBindOwnerList.vue b/src/views/owner/roomBindOwnerList.vue index da36285..4aa3dca 100644 --- a/src/views/owner/roomBindOwnerList.vue +++ b/src/views/owner/roomBindOwnerList.vue @@ -1,8 +1,8 @@ - - {{ $t('roomBindOwner.title') }} + + {{ $t('roomBindOwner.title') }} {{ $t('common.back') }} @@ -179,9 +179,7 @@ export default { } .header-tools { - position: absolute; - top: 20px; - right: 20px; + } .text-right { diff --git a/src/views/room/roomLang.js b/src/views/room/roomLang.js index 1d584bf..a91564b 100644 --- a/src/views/room/roomLang.js +++ b/src/views/room/roomLang.js @@ -359,6 +359,25 @@ export const messages = { successMessage: 'Unit deleted successfully', errorMessage: 'Failed to delete unit' }, + searchRoom: { + title: 'Select Room', + floorNumPlaceholder: 'Enter building number', + roomNumPlaceholder: 'Enter room number', + search: 'Search', + reset: 'Reset', + roomId: 'Room ID', + floorNum: 'Building Number', + unitNum: 'Unit Number', + roomNum: 'Room Number', + layer: 'Floor', + operation: 'Operation', + choose: 'Choose', + building: 'Building', + unit: 'Unit', + room: 'Room', + floor: 'Floor', + loadFailed: 'Failed to load room information' + } }, zh: { roomList: { @@ -720,5 +739,24 @@ export const messages = { successMessage: '单元删除成功', errorMessage: '删除单元失败' }, + searchRoom: { + title: '选择房屋', + floorNumPlaceholder: '输入小区楼编号', + roomNumPlaceholder: '输入房屋编号', + search: '查询', + reset: '重置', + roomId: '房屋ID', + floorNum: '楼栋编号', + unitNum: '单元编号', + roomNum: '房屋编号', + layer: '楼层', + operation: '操作', + choose: '选择', + building: '号楼', + unit: '单元', + room: '室', + floor: '层', + loadFailed: '加载房屋信息失败' + } } } \ No newline at end of file
{{ $t('listOwner.confirmDelete') }}