diff --git a/dist.zip b/dist.zip new file mode 100644 index 0000000..0c5db38 Binary files /dev/null and b/dist.zip differ diff --git a/src/api/business.ts b/src/api/business.ts index 0effb32..dac3822 100644 --- a/src/api/business.ts +++ b/src/api/business.ts @@ -4,6 +4,7 @@ import { ProjectListRes, CreateProjectParam, ProjectDetailRes, + TopBuildingTagsRes, } from '@/types/business'; import { ProjectPaginationParams, @@ -50,8 +51,11 @@ export function updateProject( export function getProjectCityList(): Promise { return axios.get(`project/getCityList`); } - -// ------------- 空间管理 ------------- +// 删除项目 +export function delProject(id: number): Promise { + return axios.get(`project/delProject?id=${id}`); +} +// ------------- 空间管理 ------------- // 创建房源 export function createRoom(params: any): Promise { return axios.post('rooms/createRoom', params); @@ -79,7 +83,7 @@ export function changeRoomStatus(params: any): Promise { // 房源获取头部楼栋tags export function getTopBuildingTagsByProjectId( id: number -): Promise { +): Promise { return axios.get(`roomOver/getTopBuildingTags?project_id=${id}`); } // 房源剖视-数据统计 @@ -90,3 +94,7 @@ export function getStatisticsData(params: any): Promise { export function getRoomOverList(params: any): Promise { return axios.post('roomOver/getRoomList', params); } +// 房源图谱列表 +export function getRoomsGraphList(params: any): Promise { + return axios.post('roomsGraph/getRoomList', params); +} diff --git a/src/api/dashboard.ts b/src/api/dashboard.ts deleted file mode 100644 index 773a104..0000000 --- a/src/api/dashboard.ts +++ /dev/null @@ -1,22 +0,0 @@ -import axios from 'axios'; -import type { TableData } from '@arco-design/web-vue/es/table/interface'; - -export interface ContentDataRecord { - x: string; - y: number; -} - -export function queryContentData() { - return axios.get('/api/content-data'); -} - -export interface PopularRecord { - key: number; - clickNumber: string; - title: string; - increases: number; -} - -export function queryPopularList(params: { type: string }) { - return axios.get('/api/popular/list', { params }); -} diff --git a/src/api/form.ts b/src/api/form.ts deleted file mode 100644 index 0a1ea7c..0000000 --- a/src/api/form.ts +++ /dev/null @@ -1,21 +0,0 @@ -import axios from 'axios'; - -export interface BaseInfoModel { - activityName: string; - channelType: string; - promotionTime: string[]; - promoteLink: string; -} -export interface ChannelInfoModel { - advertisingSource: string; - advertisingMedia: string; - keyword: string[]; - pushNotify: boolean; - advertisingContent: string; -} - -export type UnitChannelModel = BaseInfoModel & ChannelInfoModel; - -export function submitChannelForm(data: UnitChannelModel) { - return axios.post('/api/channel-form/submit', { data }); -} diff --git a/src/api/list.ts b/src/api/list.ts deleted file mode 100644 index 2c58189..0000000 --- a/src/api/list.ts +++ /dev/null @@ -1,56 +0,0 @@ -import axios from 'axios'; -import qs from 'query-string'; -import type { DescData } from '@arco-design/web-vue/es/descriptions/interface'; - -export interface PolicyRecord { - id: string; - number: number; - name: string; - contentType: 'img' | 'horizontalVideo' | 'verticalVideo'; - filterType: 'artificial' | 'rules'; - count: number; - status: 'online' | 'offline'; - createdTime: string; -} - -export interface PolicyParams extends Partial { - current: number; - pageSize: number; -} - -export interface PolicyListRes { - list: PolicyRecord[]; - total: number; -} - -export function queryPolicyList(params: PolicyParams) { - return axios.get('/api/list/policy', { - params, - paramsSerializer: (obj) => { - return qs.stringify(obj); - }, - }); -} - -export interface ServiceRecord { - id: number; - title: string; - description: string; - name?: string; - actionType?: string; - icon?: string; - data?: DescData[]; - enable?: boolean; - expires?: boolean; -} -export function queryInspectionList() { - return axios.get('/api/list/quality-inspection'); -} - -export function queryTheServiceList() { - return axios.get('/api/list/the-service'); -} - -export function queryRulesPresetList() { - return axios.get('/api/list/rules-preset'); -} diff --git a/src/api/message.ts b/src/api/message.ts index e2d60ee..0b22465 100644 --- a/src/api/message.ts +++ b/src/api/message.ts @@ -24,15 +24,3 @@ interface MessageStatus { export function setMessageStatus(data: MessageStatus) { return axios.post('/api/message/read', data); } - -export interface ChatRecord { - id: number; - username: string; - content: string; - time: string; - isCollect: boolean; -} - -export function queryChatList() { - return axios.post('/api/chat/list'); -} diff --git a/src/api/profile.ts b/src/api/profile.ts deleted file mode 100644 index 3083749..0000000 --- a/src/api/profile.ts +++ /dev/null @@ -1,49 +0,0 @@ -import axios from 'axios'; - -export interface ProfileBasicRes { - status: number; - video: { - mode: string; - acquisition: { - resolution: string; - frameRate: number; - }; - encoding: { - resolution: string; - rate: { - min: number; - max: number; - default: number; - }; - frameRate: number; - profile: string; - }; - }; - audio: { - mode: string; - acquisition: { - channels: number; - }; - encoding: { - channels: number; - rate: number; - profile: string; - }; - }; -} - -export function queryProfileBasic() { - return axios.get('/api/profile/basic'); -} - -export type operationLogRes = Array<{ - key: string; - contentNumber: string; - updateContent: string; - status: number; - updateTime: string; -}>; - -export function queryOperationLog() { - return axios.get('/api/operation/log'); -} diff --git a/src/api/user-center.ts b/src/api/user-center.ts deleted file mode 100644 index fb6a53d..0000000 --- a/src/api/user-center.ts +++ /dev/null @@ -1,88 +0,0 @@ -import axios from 'axios'; - -export interface MyProjectRecord { - id: number; - name: string; - description: string; - peopleNumber: number; - contributors: { - name: string; - email: string; - avatar: string; - }[]; -} -export function queryMyProjectList() { - return axios.post('/api/user/my-project/list'); -} - -export interface MyTeamRecord { - id: number; - avatar: string; - name: string; - peopleNumber: number; -} -export function queryMyTeamList() { - return axios.post('/api/user/my-team/list'); -} - -export interface LatestActivity { - id: number; - title: string; - description: string; - avatar: string; -} -export function queryLatestActivity() { - return axios.post('/api/user/latest-activity'); -} - -export function saveUserInfo() { - return axios.post('/api/user/save-info'); -} - -export interface BasicInfoModel { - email: string; - nickname: string; - countryRegion: string; - area: string; - address: string; - profile: string; -} - -export interface EnterpriseCertificationModel { - accountType: number; - status: number; - time: string; - legalPerson: string; - certificateType: string; - authenticationNumber: string; - enterpriseName: string; - enterpriseCertificateType: string; - organizationCode: string; -} - -export type CertificationRecord = Array<{ - certificationType: number; - certificationContent: string; - status: number; - time: string; -}>; - -export interface UnitCertification { - enterpriseInfo: EnterpriseCertificationModel; - record: CertificationRecord; -} - -export function queryCertification() { - return axios.post('/api/user/certification'); -} - -export function userUploadApi( - data: FormData, - config: { - controller: AbortController; - onUploadProgress?: (progressEvent: any) => void; - } -) { - // const controller = new AbortController(); - return axios.post('/api/user/upload', data, config); -} diff --git a/src/api/user.ts b/src/api/user.ts index 01ae8b1..22eca35 100644 --- a/src/api/user.ts +++ b/src/api/user.ts @@ -14,6 +14,14 @@ export interface UserPermissionList { permission: UserPermission[]; } +export interface UserProject { + id: number; + name: string; + image?: string; + imageUrl?: string; + [key: string]: any; +} + export interface UserState { name?: string; avatar?: string; @@ -32,6 +40,8 @@ export interface UserState { certification?: number; role: '' | '*' | 'admin' | 'user'; permission: UserPermission[]; + projects?: UserProject[]; + currentProjectId?: number; } export async function login(data: LoginData) { const result = axios.post('/auth/login', data); diff --git a/src/api/visualization.ts b/src/api/visualization.ts deleted file mode 100644 index 7b74229..0000000 --- a/src/api/visualization.ts +++ /dev/null @@ -1,73 +0,0 @@ -import axios from 'axios'; -import { GeneralChart } from '@/types/global'; - -export interface ChartDataRecord { - x: string; - y: number; - name: string; -} -export interface DataChainGrowth { - quota: string; -} - -export interface DataChainGrowthRes { - count: number; - growth: number; - chartData: { - xAxis: string[]; - data: { name: string; value: number[] }; - }; -} -export function queryDataChainGrowth(data: DataChainGrowth) { - return axios.post('/api/data-chain-growth', data); -} - -export interface PopularAuthorRes { - list: { - ranking: number; - author: string; - contentCount: number; - clickCount: number; - }[]; -} - -export function queryPopularAuthor() { - return axios.get('/api/popular-author/list'); -} - -export interface ContentPublishRecord { - x: string[]; - y: number[]; - name: string; -} - -export function queryContentPublish() { - return axios.get('/api/content-publish'); -} - -export function queryContentPeriodAnalysis() { - return axios.post('/api/content-period-analysis'); -} - -export interface PublicOpinionAnalysis { - quota: string; -} -export interface PublicOpinionAnalysisRes { - count: number; - growth: number; - chartData: ChartDataRecord[]; -} -export function queryPublicOpinionAnalysis(data: DataChainGrowth) { - return axios.post( - '/api/public-opinion-analysis', - data - ); -} -export interface DataOverviewRes { - xAxis: string[]; - data: Array<{ name: string; value: number[]; count: number }>; -} - -export function queryDataOverview() { - return axios.post('/api/data-overview'); -} diff --git a/src/components/common/DataTable.md b/src/components/common/DataTable.md deleted file mode 100644 index 56fd908..0000000 --- a/src/components/common/DataTable.md +++ /dev/null @@ -1,236 +0,0 @@ -# DataTable 组件使用指南 - -## 概述 - -`DataTable` 是一个基于 Arco Design Vue 的 `a-table` 组件封装,提供了统一的分页配置和事件处理,可以在多个页面中复用。 - -## 特性 - -- 🚀 统一的分页配置 -- 📊 支持自定义列配置 -- 🔄 内置加载状态管理 -- 🎯 支持排序和筛选 -- 📱 响应式设计 -- 🎨 可自定义样式 - -## 基础用法 - -### 1. 使用 DataTable 组件 - -```vue - - - -``` - -### 2. 高级配置 - -```vue - -``` - -## Props 说明 - -| 属性 | 类型 | 默认值 | 说明 | -|------|------|--------|------| -| data | TableData[] | [] | 表格数据 | -| columns | TableColumnData[] | [] | 列配置 | -| loading | boolean | false | 加载状态 | -| rowKey | string | 'id' | 行键 | -| pagination | boolean \| PaginationProps | true | 分页配置 | -| bordered | boolean | false | 是否显示边框 | -| size | 'mini' \| 'small' \| 'medium' \| 'large' | 'medium' | 表格大小 | -| stripe | boolean | false | 是否显示斑马纹 | -| tableLayout | 'auto' \| 'fixed' | 'auto' | 表格布局 | -| scroll | object | - | 滚动配置 | -| current | number | 1 | 当前页码 | -| pageSize | number | 10 | 每页条数 | -| total | number | 0 | 总条数 | -| showTotal | boolean | true | 是否显示总数 | -| pageSizeOptions | number[] | [10, 20, 50, 100] | 每页条数选项 | -| showJumper | boolean | true | 是否显示快速跳转 | -| showPageSize | boolean | true | 是否显示每页条数选择器 | - -## Events 说明 - -| 事件名 | 参数 | 说明 | -|--------|------|------| -| page-change | (page: number) | 页码变化 | -| page-size-change | (pageSize: number) | 每页条数变化 | -| selection-change | (selection: TableData[]) | 选择变化 | -| sorter-change | (sorter: any) | 排序变化 | -| filter-change | (filters: any) | 筛选变化 | - -## useDataTable Composable - -`useDataTable` 是一个用于管理表格状态的 composable,提供了以下功能: - -### 返回值 - -| 属性 | 类型 | 说明 | -|------|------|------| -| data | TableData[] | 表格数据 | -| columns | TableColumnData[] | 列配置 | -| loading | boolean | 加载状态 | -| pagination | PaginationProps | 分页配置 | -| current | number | 当前页码 | -| pageSize | number | 每页条数 | -| total | number | 总条数 | -| setData | (data: TableData[]) => void | 设置数据 | -| setColumns | (columns: TableColumnData[]) => void | 设置列配置 | -| setLoading | (loading: boolean) => void | 设置加载状态 | -| setTotal | (total: number) => void | 设置总条数 | -| setCurrent | (current: number) => void | 设置当前页码 | -| setPageSize | (pageSize: number) => void | 设置每页条数 | -| resetPagination | () => void | 重置分页 | - -### 配置选项 - -```typescript -interface UseDataTableOptions { - initialPage?: number; // 初始页码 - initialPageSize?: number; // 初始每页条数 - pageSizeOptions?: number[]; // 每页条数选项 - showTotal?: boolean; // 是否显示总数 - showJumper?: boolean; // 是否显示快速跳转 - showPageSize?: boolean; // 是否显示每页条数选择器 - rowKey?: string; // 行键 - bordered?: boolean; // 是否显示边框 - size?: 'mini' | 'small' | 'medium' | 'large'; // 表格大小 - stripe?: boolean; // 是否显示斑马纹 - tableLayout?: 'auto' | 'fixed'; // 表格布局 -} -``` - -## 最佳实践 - -1. **统一使用 DataTable 组件**:在项目中统一使用 DataTable 组件,避免重复配置分页逻辑。 - -2. **使用 useDataTable composable**:利用 composable 管理表格状态,提高代码复用性。 - -3. **合理配置列插槽**:对于需要自定义渲染的列,使用插槽进行自定义。 - -4. **处理加载状态**:在数据请求时正确设置 loading 状态。 - -5. **分页事件处理**:在分页事件中调用 API 获取对应页的数据。 - -## 注意事项 - -1. 确保在 `main.ts` 中注册了 `DataTable` 组件。 -2. 列配置中的 `slotName` 要与模板中的插槽名称一致。 -3. 数据源需要包含 `rowKey` 指定的字段。 -4. 分页事件处理中应该调用实际的 API 接口。 \ No newline at end of file diff --git a/src/components/common/ImageUpload.md b/src/components/common/ImageUpload.md deleted file mode 100644 index 2eead57..0000000 --- a/src/components/common/ImageUpload.md +++ /dev/null @@ -1,116 +0,0 @@ -# ImageUpload 图片上传组件 - -一个可复用的图片上传组件,支持自定义上传类型、文件大小限制等功能。 - -## 功能特性 - -- 支持图片格式:JPG、PNG、GIF、WEBP -- 可自定义文件大小限制 -- 支持上传进度显示 -- 支持图片预览 -- 支持多文件上传 -- 上传成功后自动回传 URL - -## Props - -| 参数 | 类型 | 默认值 | 说明 | -| ---------- | ------------ | ---------------- | ---------------------------- | -| modelValue | UploadFile[] | [] | 文件列表,支持 v-model | -| uploadType | UploadType | - | 上传类型:1 合同模版,2 图片 | -| maxSize | number | 10 _ 1024 _ 1024 | 最大文件大小(字节) | -| maxCount | number | - | 最大上传数量 | - -## Events - -| 事件名 | 参数 | 说明 | -| ----------------- | -------------------------------------------- | ------------------ | -| update:modelValue | (value: UploadFile[]) | 文件列表更新时触发 | -| upload-success | (file: UploadFile, response: UploadResponse) | 上传成功时触发 | -| upload-error | (error: Error) | 上传失败时触发 | - -## 类型定义 - -```typescript -interface UploadFile { - uid: string; - name: string; - url?: string; - status: 'done' | 'uploading' | 'error'; - percent?: number; -} - -interface UploadResponse { - filename: string; - size: number; - signedPutURL: string; - objectKey?: string; -} - -type UploadType = 1 | 2; // 1合同模版,2图片 -``` - -## 使用示例 - -### 基础用法 - -```vue - - - -``` - -### 自定义文件大小限制 - -```vue - -``` - -### 在表单中使用 - -```vue - -``` - -## 注意事项 - -1. 组件会自动处理文件验证,包括文件大小和格式检查 -2. 上传成功后,文件对象会自动更新 URL 和状态 -3. 支持 v-model 双向绑定,父组件可以直接操作文件列表 -4. 上传类型必须从父组件传入,用于区分不同的上传场景 diff --git a/src/components/tab-bar/readme.md b/src/components/tab-bar/readme.md deleted file mode 100644 index cea5c93..0000000 --- a/src/components/tab-bar/readme.md +++ /dev/null @@ -1,12 +0,0 @@ -## 组件说明 - -该组件非官方最终设计规范,以单独组件存在。 - -同时仅仅提供最基本的功能,后续进行优化及更改。 - - -## Component description - -The component unofficial final design specification exists as a separate component. - -At the same time, only the most basic functions are provided, and subsequent optimizations and changes will be made. \ No newline at end of file diff --git a/src/components/top-menu/index.vue b/src/components/top-menu/index.vue index 8111ba3..beec0fe 100644 --- a/src/components/top-menu/index.vue +++ b/src/components/top-menu/index.vue @@ -1,135 +1,202 @@ \ No newline at end of file + } + diff --git a/src/composables/README.md b/src/composables/README.md deleted file mode 100644 index 3d61804..0000000 --- a/src/composables/README.md +++ /dev/null @@ -1,196 +0,0 @@ -# 分页处理 Composable 使用指南 - -## 概述 - -本项目提供了两个用于处理表格分页的 composable: - -1. `usePagination` - 基础分页事件处理 -2. `useTableWithPagination` - 完整的分页和数据获取集成 - -## usePagination - -### 基础用法 - -```typescript -import usePagination from '@/composables/usePagination'; - -const { handlePageChange, handlePageSizeChange } = usePagination({ - onPageChange: () => getUserListData(), - onPageSizeChange: () => getUserListData(), - resetToFirstPage: true, -}); - -// 在分页事件中使用 -const onPageChange = (page: number) => { - handlePageChange(page, setCurrent); -}; - -const onPageSizeChange = (pageSize: number) => { - handlePageSizeChange(pageSize, setPageSize, setCurrent); -}; -``` - -### 配置选项 - -| 选项 | 类型 | 默认值 | 说明 | -|------|------|--------|------| -| onPageChange | Function | - | 页码变化时的回调函数 | -| onPageSizeChange | Function | - | 每页条数变化时的回调函数 | -| resetToFirstPage | boolean | true | 切换每页条数时是否重置到第一页 | - -## useTableWithPagination - -### 完整用法 - -```typescript -import useTableWithPagination from '@/composables/useTableWithPagination'; - -const { - data: renderData, - columns: projectColumn, - loading, - total, - current, - pageSize, - setColumns, - onPageChange, - onPageSizeChange, - refresh, - updateParams, -} = useTableWithPagination({ - // 数据获取函数 - fetchData: async (params) => { - const { code, data } = await getUserList({ - dept_id: selectedKeys.value[0], - keyword: searchKeyWord.value, - page: params.page, - page_size: params.pageSize, - }); - - if (code === 200) { - const { page, user } = data; - return { - data: Array.isArray(user) ? user : [], - total: typeof page.total === 'number' ? page.total : 0, - }; - } - - return { data: [], total: 0 }; - }, - initialPage: 1, - initialPageSize: 10, - pageSizeOptions: [10, 20, 50, 100], - autoFetch: false, // 不自动获取,等选中部门后再获取 -}); -``` - -### 配置选项 - -| 选项 | 类型 | 默认值 | 说明 | -|------|------|--------|------| -| fetchData | Function | - | 数据获取函数,必须返回 { data, total } | -| initialPage | number | 1 | 初始页码 | -| initialPageSize | number | 10 | 初始每页条数 | -| pageSizeOptions | number[] | [10, 20, 50, 100] | 每页条数选项 | -| extraParams | object | {} | 额外的查询参数 | -| autoFetch | boolean | true | 是否自动获取数据 | -| resetToFirstPage | boolean | true | 切换每页条数时是否重置到第一页 | - -### 返回值 - -| 属性 | 类型 | 说明 | -|------|------|------| -| data | Ref | 表格数据 | -| columns | Ref | 列配置 | -| loading | Ref | 加载状态 | -| total | Ref | 总条数 | -| current | Ref | 当前页码 | -| pageSize | Ref | 每页条数 | -| setColumns | Function | 设置列配置 | -| onPageChange | Function | 页码变化处理 | -| onPageSizeChange | Function | 每页条数变化处理 | -| refresh | Function | 刷新数据 | -| updateParams | Function | 更新查询参数 | - -## 最佳实践 - -### 1. 使用 usePagination(推荐用于简单场景) - -```typescript -// 在现有的 useDataTable 基础上添加分页处理 -const { handlePageChange, handlePageSizeChange } = usePagination({ - onPageChange: () => getUserListData(), - onPageSizeChange: () => getUserListData(), -}); - -const onPageChange = (page: number) => { - handlePageChange(page, setCurrent); -}; - -const onPageSizeChange = (pageSize: number) => { - handlePageSizeChange(pageSize, setPageSize, setCurrent); -}; -``` - -### 2. 使用 useTableWithPagination(推荐用于新页面) - -```typescript -// 完整的分页和数据获取集成 -const { - data: renderData, - columns: projectColumn, - loading, - total, - current, - pageSize, - onPageChange, - onPageSizeChange, - refresh, -} = useTableWithPagination({ - fetchData: async (params) => { - // 你的数据获取逻辑 - return { data: [], total: 0 }; - }, - autoFetch: false, -}); - -// 搜索时刷新数据 -const handleSearch = () => { - refresh(); -}; - -// 删除后刷新数据 -const handleDelete = async (id: number) => { - await deleteItem(id); - refresh(); -}; -``` - -### 3. 处理搜索和筛选 - -```typescript -// 使用 updateParams 更新查询参数 -const handleSearch = () => { - updateParams({ keyword: searchKeyWord.value }); -}; - -// 或者使用 refresh 直接刷新 -const handleSearch = () => { - refresh(); -}; -``` - -## 优势 - -1. **代码复用**:避免在每个页面重复编写分页逻辑 -2. **统一处理**:确保所有页面的分页行为一致 -3. **类型安全**:完整的 TypeScript 类型支持 -4. **易于维护**:分页逻辑集中管理,便于修改和扩展 -5. **自动优化**:自动处理页码重置、加载状态等细节 - -## 注意事项 - -1. `fetchData` 函数必须返回 `{ data, total }` 格式 -2. 使用 `useTableWithPagination` 时,确保 `fetchData` 函数能正确处理错误 -3. 如果需要自定义分页行为,可以使用 `usePagination` 进行更精细的控制 -4. `autoFetch: false` 适用于需要等待用户操作后再获取数据的场景 \ No newline at end of file diff --git a/src/locale/en-US.ts b/src/locale/en-US.ts index b141b23..a4e7433 100644 --- a/src/locale/en-US.ts +++ b/src/locale/en-US.ts @@ -1,10 +1,6 @@ import localeMessageBox from '@/components/message-box/locale/en-US'; import localeLogin from '@/views/login/locale/en-US'; -import localeWorkplace from '@/views/dashboard/workplace/locale/en-US'; - -import localeMonitor from '@/views/dashboard/monitor/locale/en-US'; - import locale403 from '@/views/exception/403/locale/en-US'; import locale404 from '@/views/exception/404/locale/en-US'; import locale500 from '@/views/exception/500/locale/en-US'; @@ -30,9 +26,6 @@ export default { ...localeSettings, ...localeMessageBox, ...localeLogin, - ...localeWorkplace, - - ...localeMonitor, ...locale403, ...locale404, ...locale500, diff --git a/src/locale/zh-CN.ts b/src/locale/zh-CN.ts index 0527698..ce1b398 100644 --- a/src/locale/zh-CN.ts +++ b/src/locale/zh-CN.ts @@ -1,10 +1,6 @@ import localeMessageBox from '@/components/message-box/locale/zh-CN'; import localeLogin from '@/views/login/locale/zh-CN'; -import localeWorkplace from '@/views/dashboard/workplace/locale/zh-CN'; - -import localeMonitor from '@/views/dashboard/monitor/locale/zh-CN'; - import locale403 from '@/views/exception/403/locale/zh-CN'; import locale404 from '@/views/exception/404/locale/zh-CN'; import locale500 from '@/views/exception/500/locale/zh-CN'; @@ -47,6 +43,7 @@ export default { 'menu.business.space': '空间管理', 'menu.business.house-view': '房源剖视', 'menu.business.house-list': '房源列表', + 'menu.business.house-atlas': '房源图谱', 'menu.business.contract': '合同管理', 'menu.business.contract-list': '合同列表', 'menu.business.contract-file': '合同归档', @@ -131,9 +128,6 @@ export default { ...localeSettings, ...localeMessageBox, ...localeLogin, - ...localeWorkplace, - - ...localeMonitor, ...locale403, ...locale404, ...locale500, diff --git a/src/router/routes/externalModules/result.ts b/src/router/routes/externalModules/result.ts deleted file mode 100644 index 3ef1dcb..0000000 --- a/src/router/routes/externalModules/result.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { DEFAULT_LAYOUT } from '../base'; -import { AppRouteRecordRaw } from '../types'; - -const RESULT: AppRouteRecordRaw = { - path: '/result', - name: 'result', - component: DEFAULT_LAYOUT, - redirect: '/result/success', - meta: { - locale: 'menu.result', - icon: 'icon-check-circle', - requiresAuth: true, - order: 5, - isFirst: true, - }, - children: [ - { - path: 'success', - name: 'Success', - component: () => import('@/views/result/success/index.vue'), - meta: { - locale: 'menu.result.success', - requiresAuth: true, - roles: ['admin'], - }, - }, - { - path: 'error', - name: 'Error', - component: () => import('@/views/result/error/index.vue'), - meta: { - locale: 'menu.result.error', - requiresAuth: true, - roles: ['admin'], - }, - }, - ], -}; - -export default RESULT; diff --git a/src/router/routes/externalModules/visualization.ts b/src/router/routes/externalModules/visualization.ts deleted file mode 100644 index 1a7a0bc..0000000 --- a/src/router/routes/externalModules/visualization.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { DEFAULT_LAYOUT } from '../base'; -import { AppRouteRecordRaw } from '../types'; - -const VISUALIZATION: AppRouteRecordRaw = { - path: '/visualization', - name: 'visualization', - component: DEFAULT_LAYOUT, - redirect: '/visualization/data-analysis', - meta: { - locale: 'menu.visualization', - requiresAuth: true, - icon: 'icon-apps', - order: 1, - isFirst: true, - }, - children: [ - { - path: 'data-analysis', - name: 'DataAnalysis', - component: () => import('@/views/visualization/data-analysis/index.vue'), - meta: { - locale: 'menu.visualization.dataAnalysis', - requiresAuth: true, - roles: ['admin'], - }, - }, - { - path: 'multi-dimension-data-analysis', - name: 'MultiDimensionDataAnalysis', - component: () => - import('@/views/visualization/multi-dimension-data-analysis/index.vue'), - meta: { - locale: 'menu.visualization.multiDimensionDataAnalysis', - requiresAuth: true, - roles: ['admin'], - }, - }, - ], -}; - -export default VISUALIZATION; diff --git a/src/router/routes/modules/business.ts b/src/router/routes/modules/business.ts index 75ad318..40810c2 100644 --- a/src/router/routes/modules/business.ts +++ b/src/router/routes/modules/business.ts @@ -69,10 +69,7 @@ const BUSINESS: AppRouteRecordRaw = { path: 'house-list', name: 'business-space-house-list', component: () => - import( - /* webpackChunkName: "business-space" */ - '@/views/business/space/house-list/index.vue' - ), + import('@/views/business/space/house-list/index.vue'), meta: { locale: 'menu.business.house-list', requiresAuth: true, @@ -81,6 +78,20 @@ const BUSINESS: AppRouteRecordRaw = { permissionKey: 'businessHouseList', }, }, + // 房源图谱 + { + path: 'house-atlas', + name: 'business-space-house-atlas', + component: () => + import('@/views/business/space/house-atlas/index.vue'), + meta: { + locale: 'menu.business.house-atlas', + requiresAuth: true, + roles: ['*'], + icon: 'icon-brush', + permissionKey: 'businessHouseAtlas', + }, + }, ], }, // 合同管理 diff --git a/src/router/routes/modules/dashboard.ts b/src/router/routes/modules/dashboard.ts deleted file mode 100644 index 9c16ce5..0000000 --- a/src/router/routes/modules/dashboard.ts +++ /dev/null @@ -1,73 +0,0 @@ -import PageLayout from '@/layout/page-layout.vue'; -import { DEFAULT_LAYOUT } from '../base'; -import { AppRouteRecordRaw } from '../types'; - -const DASHBOARD: AppRouteRecordRaw = { - path: '/dashboard', - name: 'dashboard', - component: DEFAULT_LAYOUT, - redirect: '/dashboard/workplace', - meta: { - locale: 'menu.dashboard.workplace', - requiresAuth: true, - icon: 'icon-dashboard', - order: 1, - isFirst: true, - permissionKey: 'dashboard', - }, - children: [ - { - path: 'workplace', - name: 'Workplace', - component: PageLayout, - redirect: '/dashboard/workplace/step', - meta: { - locale: 'menu.dashboard.workplace', - requiresAuth: true, - roles: ['*'], - icon: 'icon-dashboard', - permissionKey: 'workplace', - // activeMenu: 'dashboard', - }, - children: [ - { - path: 'step', - name: 'Step', - component: () => - import( - /* webpackChunkName: "dashboard-workplace" */ - /* webpackPreload: true */ - '@/views/dashboard/workplace/index.vue' - ), - meta: { - locale: 'menu.form.step', - requiresAuth: true, - roles: ['*'], - icon: 'icon-exclamation-circle', - permissionKey: 'step', - }, - }, - ], - }, - - { - path: 'monitor', - name: 'Monitor', - component: () => - import( - /* webpackChunkName: "dashboard-monitor" */ - '@/views/dashboard/monitor/index.vue' - ), - meta: { - locale: 'menu.dashboard.monitor', - requiresAuth: true, - roles: ['*'], - icon: 'icon-settings', - permissionKey: 'monitor', - // activeMenu: 'dashboard', - }, - }, - ], -}; - -export default DASHBOARD; diff --git a/src/store/modules/user/index.ts b/src/store/modules/user/index.ts index 14efb9d..3fac054 100644 --- a/src/store/modules/user/index.ts +++ b/src/store/modules/user/index.ts @@ -30,6 +30,8 @@ const useUserStore = defineStore('user', { certification: undefined, role: '', permission: [], + projects: undefined, + currentProjectId: undefined, }), // 配置持久化 @@ -37,7 +39,16 @@ const useUserStore = defineStore('user', { key: 'user-store', storage: localStorage, // 只持久化关键的用户信息,排除敏感信息 - pick: ['name', 'avatar', 'role', 'permission', 'accountId', 'email'], + pick: [ + 'name', + 'avatar', + 'role', + 'permission', + 'accountId', + 'email', + 'projects', + 'currentProjectId', + ], }, getters: { diff --git a/src/store/modules/user/types.ts b/src/store/modules/user/types.ts index 64d68c3..160e0f4 100644 --- a/src/store/modules/user/types.ts +++ b/src/store/modules/user/types.ts @@ -1,6 +1,15 @@ import { UserPermission } from '@/types/api'; export type RoleType = '' | '*' | 'admin' | 'user'; + +export interface UserProject { + id: number; + name: string; + image?: string; + imageUrl?: string; + [key: string]: any; +} + export interface UserState { name?: string; avatar?: string; @@ -19,4 +28,6 @@ export interface UserState { certification?: number; role: RoleType; permission: UserPermission[]; + projects?: UserProject[]; + currentProjectId?: number; } diff --git a/src/types/business.ts b/src/types/business.ts index 9e0dfc4..8c4ca1d 100644 --- a/src/types/business.ts +++ b/src/types/business.ts @@ -51,6 +51,7 @@ export interface ProjectItem extends BaseEntity { roomArea: number; rentArea: number; useArea: number; + keepArea: number; rentRate: number; RoomAreaStr: string; // 列表显示的计租面积 RentAreaStr: string; // 列表显示的招商面积 @@ -115,6 +116,17 @@ export type ProjectDetailRes = HttpResponse<{ project: ProjectItem; }>; +// 楼栋标签响应类型 +export interface BuildingTag { + buildingId: number; + projectName: string; + buildingName: string; +} + +export type TopBuildingTagsRes = HttpResponse<{ + tags: BuildingTag[]; +}>; + // 创建房源参数 export interface CreateHouseParam { id?: number; // 编辑时需要 diff --git a/src/utils/router-preload.ts b/src/utils/router-preload.ts index 2e07edb..a433b85 100644 --- a/src/utils/router-preload.ts +++ b/src/utils/router-preload.ts @@ -15,12 +15,6 @@ function preloadRouteComponent(routeName: string): void { '@/views/business/project/index.vue' ); break; - case 'dashboard-workplace': - import( - /* webpackChunkName: "dashboard-workplace" */ - '@/views/dashboard/workplace/index.vue' - ); - break; default: // 未知路由,跳过预加载 break; @@ -63,7 +57,7 @@ export function smartPreload( userRole: string, currentRoute?: RouteLocationNormalized ): void { - const commonRoutes = ['dashboard-workplace']; + const commonRoutes: string[] = []; // 根据用户角色预加载不同的路由 const roleBasedRoutes: Record = { diff --git a/src/views/business/project/drawer/project-info-drawer.vue b/src/views/business/project/drawer/project-info-drawer.vue index c567313..111bc05 100644 --- a/src/views/business/project/drawer/project-info-drawer.vue +++ b/src/views/business/project/drawer/project-info-drawer.vue @@ -7,20 +7,70 @@ unmount-on-close @cancel="handleCancel" > - 项目详情 +
+
+

{{ detailInfo?.name }}

+

+ {{ + detailInfo?.typeName + }} +

+
+
+

{{ detailInfo?.updatedAt }}

+
+ + + {{ $t('edit') }} + +
+ +
+
+
+ +
+ +
+
+ +
+
+

{{ detailInfo?.roomNum }}

+

房源总数

+
+
+

{{ detailInfo?.roomsRentNum }}

+

已出租

+
+
+

{{ + detailInfo?.roomsUnRentNum + }}

+

空置

+
+
+
+ +
@@ -43,4 +245,33 @@ :deep(label.arco-form-item-label) { width: 100% !important; } + + .ring-chart-container { + position: relative; + min-height: 300px; + + .area-summary { + margin-top: 16px; + padding-top: 16px; + border-top: 1px solid var(--color-border-2); + + .summary-item { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 8px; + + .summary-label { + color: var(--color-text-2); + font-size: 14px; + } + + .summary-value { + color: var(--color-text-1); + font-size: 16px; + font-weight: 500; + } + } + } + } diff --git a/src/views/business/project/drawer/project-list-filter-drawer.vue b/src/views/business/project/drawer/project-list-filter-drawer.vue index c2e0b15..a1c5d6d 100644 --- a/src/views/business/project/drawer/project-list-filter-drawer.vue +++ b/src/views/business/project/drawer/project-list-filter-drawer.vue @@ -41,8 +41,8 @@
@@ -51,12 +51,12 @@ diff --git a/src/views/business/space/house-atlas/components/year-timeline.vue b/src/views/business/space/house-atlas/components/year-timeline.vue new file mode 100644 index 0000000..43cf3c6 --- /dev/null +++ b/src/views/business/space/house-atlas/components/year-timeline.vue @@ -0,0 +1,216 @@ + + + + + diff --git a/src/views/business/space/house-atlas/index.vue b/src/views/business/space/house-atlas/index.vue new file mode 100644 index 0000000..8351288 --- /dev/null +++ b/src/views/business/space/house-atlas/index.vue @@ -0,0 +1,413 @@ + + + + + diff --git a/src/views/business/space/house-list/index.vue b/src/views/business/space/house-list/index.vue index 0c00f54..3431e68 100644 --- a/src/views/business/space/house-list/index.vue +++ b/src/views/business/space/house-list/index.vue @@ -91,7 +91,7 @@ type="error" @cancel="handleDel(record?.id)" > - 删除项目 + 删除房源 @@ -132,6 +132,7 @@ import houseInfoDrawer from '../drawer/house-info-drawer.vue'; import houseListFilterDrawer from '../drawer/house-list-filter-drawer.vue'; import { Message } from '@arco-design/web-vue'; + import { PRICE_UNIT_MAP } from '@/constants'; const { t } = useI18n(); const { loading } = useLoading(false); const showDrawer = ref(false); @@ -201,7 +202,11 @@ title: '租金(实时)', dataIndex: 'price', key: 'price', - render: ({ record }) => (Number(record.price) <= 0 ? '-' : record?.price), + render: ({ record }) => { + if (Number(record.price) <= 0) return '-'; + const unit = PRICE_UNIT_MAP.get(record?.priceType); + return `${record?.price} ${unit}`; + }, }, { title: '标签', dataIndex: 'tags', key: 'tags', slotName: 'tags' }, { diff --git a/src/views/business/space/house-view/components/house-view-content.vue b/src/views/business/space/house-view/components/house-view-content.vue new file mode 100644 index 0000000..c95e3e1 --- /dev/null +++ b/src/views/business/space/house-view/components/house-view-content.vue @@ -0,0 +1,595 @@ + + + diff --git a/src/views/business/space/house-view/components/house-view-filter-drawer.vue b/src/views/business/space/house-view/components/house-view-filter-drawer.vue new file mode 100644 index 0000000..7b579ed --- /dev/null +++ b/src/views/business/space/house-view/components/house-view-filter-drawer.vue @@ -0,0 +1,630 @@ + + + + + diff --git a/src/views/business/space/house-view/index.vue b/src/views/business/space/house-view/index.vue index 8832739..adf7dc6 100644 --- a/src/views/business/space/house-view/index.vue +++ b/src/views/business/space/house-view/index.vue @@ -1,3 +1,351 @@ + + diff --git a/src/views/dashboard/monitor/index.vue b/src/views/dashboard/monitor/index.vue deleted file mode 100644 index b77141b..0000000 --- a/src/views/dashboard/monitor/index.vue +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/src/views/dashboard/monitor/locale/en-US.ts b/src/views/dashboard/monitor/locale/en-US.ts deleted file mode 100644 index e3af3a4..0000000 --- a/src/views/dashboard/monitor/locale/en-US.ts +++ /dev/null @@ -1,48 +0,0 @@ -export default { - 'menu.dashboard.monitor': 'Real-time Monitor', - 'monitor.title.chatPanel': 'Chat Window', - 'monitor.title.quickOperation': 'Quick Operation', - 'monitor.title.studioInfo': 'Studio Information', - 'monitor.title.studioPreview': 'Studio Preview', - 'monitor.chat.options.all': 'All', - 'monitor.chat.placeholder.searchCategory': 'Search Category', - 'monitor.chat.update': 'Update', - 'monitor.list.title.order': 'Order', - 'monitor.list.title.cover': 'Cover', - 'monitor.list.title.name': 'Name', - 'monitor.list.title.duration': 'Duration', - 'monitor.list.title.id': 'ID', - 'monitor.list.tip.rotations': 'Rotations ', - 'monitor.list.tip.rest': ', The program list is not visible to viewers', - 'monitor.list.tag.auditFailed': 'Audit Failed', - 'monitor.tab.title.liveMethod': 'Live Method', - 'monitor.tab.title.onlinePopulation': 'Online Population', - 'monitor.liveMethod.normal': 'Normal Live', - 'monitor.liveMethod.flowControl': 'Flow Control Live', - 'monitor.liveMethod.video': 'Video Live', - 'monitor.liveMethod.web': 'Web Live', - 'monitor.editCarousel': 'Edit', - 'monitor.startCarousel': 'Start', - 'monitor.quickOperation.changeClarity': 'Change the Clarity', - 'monitor.quickOperation.switchStream': 'Switch Stream', - 'monitor.quickOperation.removeClarity': 'Remove the Clarity', - 'monitor.quickOperation.pushFlowGasket': 'Push Flow Gasket', - 'monitor.studioInfo.label.studioTitle': 'Studio Title', - 'monitor.studioInfo.label.onlineNotification': 'Online Notification', - 'monitor.studioInfo.label.studioCategory': 'Studio Category', - 'monitor.studioInfo.placeholder.studioTitle': "'s Studio", - 'monitor.studioInfo.btn.fresh': 'Fresh', - 'monitor.studioStatus.title.studioStatus': 'Studio Status', - 'monitor.studioStatus.title.pictureInfo': 'Picture Information', - 'monitor.studioStatus.smooth': 'Smooth', - 'monitor.studioStatus.frameRate': 'Frame', - 'monitor.studioStatus.bitRate': 'Bit', - 'monitor.studioStatus.mainstream': 'Main', - 'monitor.studioStatus.hotStandby': 'Hot', - 'monitor.studioStatus.coldStandby': 'Cold', - 'monitor.studioStatus.line': 'Line', - 'monitor.studioStatus.play': 'Format', - 'monitor.studioStatus.pictureQuality': 'Quality', - 'monitor.studioPreview.studio': 'Studio', - 'monitor.studioPreview.watching': 'watching', -}; diff --git a/src/views/dashboard/monitor/locale/zh-CN.ts b/src/views/dashboard/monitor/locale/zh-CN.ts deleted file mode 100644 index 70962a0..0000000 --- a/src/views/dashboard/monitor/locale/zh-CN.ts +++ /dev/null @@ -1,48 +0,0 @@ -export default { - 'menu.dashboard.monitor': '实时监控', - 'monitor.title.chatPanel': '聊天窗口', - 'monitor.title.quickOperation': '快捷操作', - 'monitor.title.studioInfo': '直播信息', - 'monitor.title.studioPreview': '直播预览', - 'monitor.chat.options.all': '全部', - 'monitor.chat.placeholder.searchCategory': '搜索类目', - 'monitor.chat.update': '更新', - 'monitor.list.title.order': '序号', - 'monitor.list.title.cover': '封面', - 'monitor.list.title.name': '名称', - 'monitor.list.title.duration': '视频时长', - 'monitor.list.title.id': '视频Id', - 'monitor.list.tip.rotations': '轮播次数', - 'monitor.list.tip.rest': ',节目单观众不可见', - 'monitor.list.tag.auditFailed': '审核未通过', - 'monitor.tab.title.liveMethod': '直播方式', - 'monitor.tab.title.onlinePopulation': '在线人数', - 'monitor.liveMethod.normal': '普通直播', - 'monitor.liveMethod.flowControl': '控流直播', - 'monitor.liveMethod.video': '视频直播', - 'monitor.liveMethod.web': '网页开播', - 'monitor.editCarousel': '编辑轮播', - 'monitor.startCarousel': '开始轮播', - 'monitor.quickOperation.changeClarity': '切换清晰度', - 'monitor.quickOperation.switchStream': '主备流切换', - 'monitor.quickOperation.removeClarity': '摘除清晰度', - 'monitor.quickOperation.pushFlowGasket': '推流垫片', - 'monitor.studioInfo.label.studioTitle': '直播标题', - 'monitor.studioInfo.label.onlineNotification': '上线通知', - 'monitor.studioInfo.label.studioCategory': '直播类目', - 'monitor.studioInfo.placeholder.studioTitle': '的直播间', - 'monitor.studioInfo.btn.fresh': '更新', - 'monitor.studioStatus.title.studioStatus': '直播状态', - 'monitor.studioStatus.title.pictureInfo': '画面信息', - 'monitor.studioStatus.smooth': '流畅', - 'monitor.studioStatus.frameRate': '帧率', - 'monitor.studioStatus.bitRate': '码率', - 'monitor.studioStatus.mainstream': '主流', - 'monitor.studioStatus.hotStandby': '热备', - 'monitor.studioStatus.coldStandby': '冷备', - 'monitor.studioStatus.line': '线路', - 'monitor.studioStatus.play': '播放格式', - 'monitor.studioStatus.pictureQuality': '画质', - 'monitor.studioPreview.studio': '直播间', - 'monitor.studioPreview.watching': '在看', -}; diff --git a/src/views/dashboard/workplace/index.vue b/src/views/dashboard/workplace/index.vue deleted file mode 100644 index a681aaa..0000000 --- a/src/views/dashboard/workplace/index.vue +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/src/views/dashboard/workplace/locale/en-US.ts b/src/views/dashboard/workplace/locale/en-US.ts deleted file mode 100644 index 5eef6ad..0000000 --- a/src/views/dashboard/workplace/locale/en-US.ts +++ /dev/null @@ -1,38 +0,0 @@ -export default { - 'menu.dashboard.workplace': 'Workplace', - 'workplace.welcome': 'Welcome!', - 'workplace.balance': 'Balance (CNY)', - 'workplace.order.pending': 'Pending', - 'workplace.order.pendingRenewal': 'Renewal Order', - 'workplace.onlineContent': 'Online Content', - 'workplace.putIn': 'Put In', - 'workplace.newDay': 'Daily Additional Comments', - 'workplace.newFromYesterday': 'New From Yesterday', - 'workplace.minute': 'Min', - 'workplace.docs': 'Documents', - 'workplace.docs.productOverview': 'Product Overview', - 'workplace.docs.userGuide': 'User Guide', - 'workplace.docs.workflow': 'Workflow', - 'workplace.docs.interfaceDocs': 'Interface Docs', - // - 'workplace.contentManagement': 'Content Management', - 'workplace.contentStatistical': 'Content Statistical', - 'workplace.advanced': 'Advanced', - 'workplace.onlinePromotion': 'Online Promotion', - 'workplace.contentPutIn': 'Put In', - 'workplace.announcement': 'Announcement', - 'workplace.recently.visited': 'Recently Visited', - 'workplace.record.nodata': 'No data', - 'workplace.quick.operation': 'Quick Operation', - 'workplace.quickOperation.setup': 'Setup', - 'workplace.allProject': 'All', - 'workplace.loadMore': 'More', - 'workplace.viewMore': 'More', - 'workplace.contentData': 'Content Data', - 'workplace.popularContent': 'Popular Content', - 'workplace.popularContent.text': 'text', - 'workplace.popularContent.image': 'image', - 'workplace.popularContent.video': 'video', - 'workplace.categoriesPercent': 'Categories Percent', - 'workplace.pecs': 'pecs', -}; diff --git a/src/views/dashboard/workplace/locale/zh-CN.ts b/src/views/dashboard/workplace/locale/zh-CN.ts deleted file mode 100644 index 4eebcc8..0000000 --- a/src/views/dashboard/workplace/locale/zh-CN.ts +++ /dev/null @@ -1,37 +0,0 @@ -export default { - 'menu.dashboard.workplace': '工作台', - 'workplace.welcome': '欢迎回来!', - 'workplace.balance': '余额(元)', - 'workplace.order.pending': '待支付', - 'workplace.order.pendingRenewal': '待续费订单', - 'workplace.onlineContent': '线上总内容', - 'workplace.putIn': '投放中内容', - 'workplace.newDay': '日新增评论', - 'workplace.newFromYesterday': '较昨日新增', - 'workplace.minute': '分钟', - 'workplace.docs': '帮助文档', - 'workplace.docs.productOverview': '产品概要', - 'workplace.docs.userGuide': '使用指南', - 'workplace.docs.workflow': '接入流程', - 'workplace.docs.interfaceDocs': '接口文档', - 'workplace.contentManagement': '内容管理', - 'workplace.contentStatistical': '内容分析', - 'workplace.advanced': '高级管理', - 'workplace.onlinePromotion': '线上推广', - 'workplace.contentPutIn': '内容投放', - 'workplace.announcement': '公告', - 'workplace.recently.visited': '最近访问', - 'workplace.record.nodata': '暂无数据', - 'workplace.quick.operation': '快捷操作', - 'workplace.quickOperation.setup': '管理', - 'workplace.allProject': '所有项目', - 'workplace.loadMore': '加载更多', - 'workplace.viewMore': '查看更多', - 'workplace.contentData': '内容数据', - 'workplace.popularContent': '线上热门内容', - 'workplace.popularContent.text': '文本', - 'workplace.popularContent.image': '图片', - 'workplace.popularContent.video': '视频', - 'workplace.categoriesPercent': '内容类型占比', - 'workplace.pecs': '个', -}; diff --git a/src/views/result/error/index.vue b/src/views/result/error/index.vue deleted file mode 100644 index a5c9df3..0000000 --- a/src/views/result/error/index.vue +++ /dev/null @@ -1,44 +0,0 @@ - - - - - diff --git a/src/views/result/success/index.vue b/src/views/result/success/index.vue deleted file mode 100644 index 475589f..0000000 --- a/src/views/result/success/index.vue +++ /dev/null @@ -1,51 +0,0 @@ - - - - - diff --git a/src/views/setting/user/components/mock.json b/src/views/setting/user/components/mock.json deleted file mode 100644 index 7edb5d4..0000000 --- a/src/views/setting/user/components/mock.json +++ /dev/null @@ -1,268 +0,0 @@ -{ - "permission": [ - { - "system_tenant_permission_id": 100, - "tenant_id": 1, - "perm_id": 1, - "id": 1, - "parent_id": 0, - "prem_name": "业务", - "level": 1, - "perm_key": "business", - "prem_type": 1, - "path": "/1/", - "sort": 1, - "visible": 1, - "createdAt": "2024-06-20 10:00:00", - "updatedAt": "2024-06-20 10:00:00", - "children": [ - { - "system_tenant_permission_id": 101, - "tenant_id": 1, - "perm_id": 2, - "id": 2, - "parent_id": 1, - "prem_name": "项目管理", - "level": 2, - "perm_key": "project_manage", - "prem_type": 1, - "path": "/1/2/", - "sort": 1, - "visible": 1, - "createdAt": "2024-06-20 10:01:00", - "updatedAt": "2024-06-20 10:01:00", - "children": [ - { - "system_tenant_permission_id": 102, - "tenant_id": 1, - "perm_id": 3, - "id": 3, - "parent_id": 2, - "prem_name": "查看项目", - "level": 3, - "perm_key": "view_project", - "prem_type": 4, - "path": "/1/2/3/", - "sort": 1, - "visible": 1, - "createdAt": "2024-06-20 10:02:00", - "updatedAt": "2024-06-20 10:02:00", - "children": [ - { - "system_tenant_permission_id": 103, - "tenant_id": 1, - "perm_id": 4, - "id": 4, - "parent_id": 3, - "prem_name": "添加收入目标", - "level": 4, - "perm_key": "add_income_target", - "prem_type": 2, - "path": "/1/2/3/4/", - "sort": 1, - "visible": 1, - "createdAt": "2024-06-20 10:03:00", - "updatedAt": "2024-06-20 10:03:00", - "children": [] - }, - { - "system_tenant_permission_id": 104, - "tenant_id": 1, - "perm_id": 5, - "id": 5, - "parent_id": 3, - "prem_name": "编辑收入目标", - "level": 4, - "perm_key": "edit_income_target", - "prem_type": 2, - "path": "/1/2/3/5/", - "sort": 2, - "visible": 1, - "createdAt": "2024-06-20 10:04:00", - "updatedAt": "2024-06-20 10:04:00", - "children": [] - } - ] - }, - { - "system_tenant_permission_id": 105, - "tenant_id": 1, - "perm_id": 6, - "id": 6, - "parent_id": 2, - "prem_name": "编辑项目", - "level": 3, - "perm_key": "edit_project", - "prem_type": 4, - "path": "/1/2/6/", - "sort": 2, - "visible": 1, - "createdAt": "2024-06-20 10:05:00", - "updatedAt": "2024-06-20 10:05:00", - "children": [ - { - "system_tenant_permission_id": 106, - "tenant_id": 1, - "perm_id": 7, - "id": 7, - "parent_id": 6, - "prem_name": "删除收入目标", - "level": 4, - "perm_key": "delete_income_target", - "prem_type": 2, - "path": "/1/2/6/7/", - "sort": 1, - "visible": 1, - "createdAt": "2024-06-20 10:06:00", - "updatedAt": "2024-06-20 10:06:00", - "children": [] - } - ] - } - ] - }, - { - "system_tenant_permission_id": 107, - "tenant_id": 1, - "perm_id": 8, - "id": 8, - "parent_id": 1, - "prem_name": "合同管理", - "level": 2, - "perm_key": "contract_manage", - "prem_type": 1, - "path": "/1/8/", - "sort": 2, - "visible": 1, - "createdAt": "2024-06-20 10:07:00", - "updatedAt": "2024-06-20 10:07:00", - "children": [ - { - "system_tenant_permission_id": 108, - "tenant_id": 1, - "perm_id": 9, - "id": 9, - "parent_id": 8, - "prem_name": "查看合同", - "level": 3, - "perm_key": "view_contract", - "prem_type": 4, - "path": "/1/8/9/", - "sort": 1, - "visible": 1, - "createdAt": "2024-06-20 10:08:00", - "updatedAt": "2024-06-20 10:08:00", - "children": [ - { - "system_tenant_permission_id": 109, - "tenant_id": 1, - "perm_id": 10, - "id": 10, - "parent_id": 9, - "prem_name": "导出合同", - "level": 4, - "perm_key": "export_contract", - "prem_type": 2, - "path": "/1/8/9/10/", - "sort": 1, - "visible": 1, - "createdAt": "2024-06-20 10:09:00", - "updatedAt": "2024-06-20 10:09:00", - "children": [] - } - ] - } - ] - } - ] - }, - { - "system_tenant_permission_id": 200, - "tenant_id": 1, - "perm_id": 20, - "id": 20, - "parent_id": 0, - "prem_name": "房源视图", - "level": 1, - "perm_key": "house_view", - "prem_type": 1, - "path": "/20/", - "sort": 2, - "visible": 1, - "createdAt": "2024-06-20 11:00:00", - "updatedAt": "2024-06-20 11:00:00", - "children": [ - { - "system_tenant_permission_id": 201, - "tenant_id": 1, - "perm_id": 21, - "id": 21, - "parent_id": 20, - "prem_name": "新建房源", - "level": 2, - "perm_key": "add_house", - "prem_type": 2, - "path": "/20/21/", - "sort": 1, - "visible": 1, - "createdAt": "2024-06-20 11:01:00", - "updatedAt": "2024-06-20 11:01:00", - "children": [] - }, - { - "system_tenant_permission_id": 202, - "tenant_id": 1, - "perm_id": 22, - "id": 22, - "parent_id": 20, - "prem_name": "导入房源", - "level": 2, - "perm_key": "import_house", - "prem_type": 3, - "path": "/20/22/", - "sort": 2, - "visible": 1, - "createdAt": "2024-06-20 11:02:00", - "updatedAt": "2024-06-20 11:02:00", - "children": [ - { - "system_tenant_permission_id": 203, - "tenant_id": 1, - "perm_id": 23, - "id": 23, - "parent_id": 22, - "prem_name": "批量导入", - "level": 3, - "perm_key": "batch_import", - "prem_type": 3, - "path": "/20/22/23/", - "sort": 1, - "visible": 1, - "createdAt": "2024-06-20 11:03:00", - "updatedAt": "2024-06-20 11:03:00", - "children": [ - { - "system_tenant_permission_id": 204, - "tenant_id": 1, - "perm_id": 24, - "id": 24, - "parent_id": 23, - "prem_name": "导入校验", - "level": 4, - "perm_key": "import_check", - "prem_type": 2, - "path": "/20/22/23/24/", - "sort": 1, - "visible": 1, - "createdAt": "2024-06-20 11:04:00", - "updatedAt": "2024-06-20 11:04:00", - "children": [] - } - ] - } - ] - } - ] - } - ] -} \ No newline at end of file diff --git a/src/views/visualization/data-analysis/index.vue b/src/views/visualization/data-analysis/index.vue deleted file mode 100644 index de22ba0..0000000 --- a/src/views/visualization/data-analysis/index.vue +++ /dev/null @@ -1,257 +0,0 @@ - - - - - diff --git a/src/views/visualization/multi-dimension-data-analysis/index.vue b/src/views/visualization/multi-dimension-data-analysis/index.vue deleted file mode 100644 index 367a6a3..0000000 --- a/src/views/visualization/multi-dimension-data-analysis/index.vue +++ /dev/null @@ -1,298 +0,0 @@ - - - - -