diff --git a/src/api/device/instance.ts b/src/api/device/instance.ts index ceb17116..0465df68 100644 --- a/src/api/device/instance.ts +++ b/src/api/device/instance.ts @@ -114,6 +114,14 @@ export const isExists = (id: string) => server.get(`/device-instance/${id}/exist */ export const update = (data: Partial) => data.id ? server.patch(`/device-instance`, data) : server.post(`/device-instance`, data) +/** + * 修改设备信息 + * @param id 设备id + * @param data 设备信息 + * @returns + */ +export const modify = (id: string, data: Partial) => server.put(`/device-instance/${id}`, data) + /** * 获取配置信息 * @param id 设备id diff --git a/src/api/link/log.ts b/src/api/link/log.ts new file mode 100644 index 00000000..c0e68404 --- /dev/null +++ b/src/api/link/log.ts @@ -0,0 +1,7 @@ +import server from '@/utils/request'; + +export const queryAccess = (data: object) => + server.post(`/logger/access/_query`, data); + +export const querySystem = (data: object) => + server.post(`/logger/system/_query`, data); diff --git a/src/api/link/protocol.ts b/src/api/link/protocol.ts new file mode 100644 index 00000000..e1a88586 --- /dev/null +++ b/src/api/link/protocol.ts @@ -0,0 +1,10 @@ +import server from '@/utils/request'; + +export const detail = (id: string) => server.get(`/gateway/device/${id}`); + +export const save = (data: Object) => server.post(`/gateway/device`, data); + +export const list = (data: Object) => + server.post(`/protocol/_query`, data); + +export const remove = (id: string) => server.remove(`/gateway/device/${id}`); diff --git a/src/api/media/dashboard.ts b/src/api/media/dashboard.ts new file mode 100644 index 00000000..9e8a2e40 --- /dev/null +++ b/src/api/media/dashboard.ts @@ -0,0 +1,10 @@ +import server from '@/utils/request' +import type { Agg, AggPlaying } from '@/views/media/DashBoard/typings' + +export default { + // 录像数量 + agg: () => server.get(`/media/record/file/agg`), + // 播放中数量 + aggPlaying: () => server.get(`/media/channel/playing/agg`), + +} \ No newline at end of file diff --git a/src/api/media/home.ts b/src/api/media/home.ts new file mode 100644 index 00000000..8385fd80 --- /dev/null +++ b/src/api/media/home.ts @@ -0,0 +1,9 @@ +import server from '@/utils/request' + +export default { + // 设备数量 + deviceCount: () => server.get(`/media/device/_count`), + // 通道数量 + channelCount: () => server.post(`/media/channel/_count`), + +} \ No newline at end of file diff --git a/src/api/system/menu.ts b/src/api/system/menu.ts index a8e6a60e..9f2c8ebd 100644 --- a/src/api/system/menu.ts +++ b/src/api/system/menu.ts @@ -14,4 +14,6 @@ export const getMenuInfo_api = (id:string) => server.get(`/menu/${id}`); // 编辑菜单信息 export const saveMenuInfo_api = (data: object) => server.patch(`/menu`, data); // 新增菜单信息 -export const addMenuInfo_api = (data: object) => server.post(`/menu`, data); \ No newline at end of file +export const addMenuInfo_api = (data: object) => server.post(`/menu`, data); +// 删除菜单信息 +export const delMenuInfo_api = (id: string) => server.remove(`/menu/${id}`); \ No newline at end of file diff --git a/src/components/AIcon/index.tsx b/src/components/AIcon/index.tsx index 1a21e6ff..7a8a21b3 100644 --- a/src/components/AIcon/index.tsx +++ b/src/components/AIcon/index.tsx @@ -45,6 +45,7 @@ const iconKeys = [ 'InfoCircleOutlined', 'SearchOutlined', 'EllipsisOutlined', + 'ClockCircleOutlined' ] const Icon = (props: {type: string}) => { diff --git a/src/components/CardBox/index.vue b/src/components/CardBox/index.vue index 0915064a..dee607c8 100644 --- a/src/components/CardBox/index.vue +++ b/src/components/CardBox/index.vue @@ -2,22 +2,21 @@
- - - -
- -
-
- - +
+ +
+ +
+ + +
- - +
+
@@ -201,6 +200,13 @@ const handleClick = () => { margin-right: 16px; } + .card-item-body { + display: flex; + flex-direction: column; + flex-grow: 1; + width: 0; + } + .card-state { position: absolute; top: 30px; diff --git a/src/components/Table/index.module.less b/src/components/Table/index.module.less index 98a53a92..e3f9ebc1 100644 --- a/src/components/Table/index.module.less +++ b/src/components/Table/index.module.less @@ -1,9 +1,9 @@ .jtable-body { width: 100%; - padding: 0 24px 24px; + padding: 16px 24px 24px; background-color: white; .jtable-body-header { - padding: 16px 0; + padding-bottom: 16px; display: flex; justify-content: space-between; align-items: center; diff --git a/src/components/Table/index.tsx b/src/components/Table/index.tsx index 232cc992..45929b39 100644 --- a/src/components/Table/index.tsx +++ b/src/components/Table/index.tsx @@ -40,11 +40,11 @@ export interface ActionsType { children?: ActionsType[]; } -export interface JColumnProps extends ColumnProps{ +export interface JColumnProps extends ColumnProps { scopedSlots?: boolean; // 是否为插槽 true: 是 false: 否 } -export interface JTableProps extends TableProps{ +export interface JTableProps extends TableProps { request?: (params?: Record) => Promise>; cardBodyClass?: string; columns: JColumnProps[]; @@ -53,8 +53,8 @@ export interface JTableProps extends TableProps{ // actions?: ActionsType[]; noPagination?: boolean; rowSelection?: TableProps['rowSelection']; - cardProps?: Record; - dataSource?: Record[]; + cardProps?: Record; + dataSource?: Record[]; gridColumn?: number; /** * 用于不同分辨率 @@ -62,10 +62,11 @@ export interface JTableProps extends TableProps{ * gridColumns[1] 1440 ~ 1600 分辨率; * gridColumns[2] > 1600 分辨率; */ - gridColumns?: number[]; - alertRender?: boolean; - type?: keyof typeof TypeEnum; - defaultParams?: Record; + gridColumns?: number[]; + alertRender?: boolean; + type?: keyof typeof TypeEnum; + defaultParams?: Record; + bodyStyle?: Record; } const JTable = defineComponent({ @@ -88,13 +89,17 @@ const JTable = defineComponent({ type: String, default: '' }, + bodyStyle: { + type: Object, + default: {} + }, columns: { type: Array, default: () => [] }, params: { type: Object, - default: () => {} + default: () => { } }, model: { type: [String, undefined], @@ -142,7 +147,7 @@ const JTable = defineComponent({ } } } as any, - setup(props: JTableProps ,{ slots, emit, expose }){ + setup(props: JTableProps, { slots, emit, expose }) { const simpleImage = Empty.PRESENTED_IMAGE_SIMPLE const _model = ref(props.model ? props.model : ModelEnum.CARD); // 模式切换 const column = ref(props.gridColumn || 4); @@ -174,9 +179,9 @@ const JTable = defineComponent({ */ const handleSearch = async (_params?: Record) => { loading.value = true - if(props.request) { + if (props.request) { const resp = await props.request({ - pageIndex: 0, + pageIndex: 0, pageSize: 12, ...props.defaultParams, ..._params, @@ -185,14 +190,14 @@ const JTable = defineComponent({ ...(_params?.terms || []) ] }) - if(resp.status === 200){ - if(props.type === 'PAGE'){ + if (resp.status === 200) { + if (props.type === 'PAGE') { // 判断如果是最后一页且最后一页为空,就跳转到前一页 - if(resp.result.total && resp.result.pageSize && resp.result.pageIndex && resp.result?.data?.length === 0) { + if (resp.result.total && resp.result.pageSize && resp.result.pageIndex && resp.result?.data?.length === 0) { handleSearch({ ..._params, pageSize: pageSize.value, - pageIndex: pageIndex.value > 0 ? pageIndex.value - 1 : 0, + pageIndex: pageIndex.value > 0 ? pageIndex.value - 1 : 0, }) } else { _dataSource.value = resp.result?.data || [] @@ -204,31 +209,30 @@ const JTable = defineComponent({ _dataSource.value = resp?.result || [] } } else { - _dataSource.value = [] + _dataSource.value = [] } } else { - console.log(props?.dataSource) _dataSource.value = props?.dataSource || [] } loading.value = false } watch( - () => props.params, + () => props.params, (newValue) => { handleSearch(newValue) - }, - {deep: true, immediate: true} + }, + { deep: true, immediate: true } ) watch( - () => props.dataSource, - (newValue) => { - if(props.dataSource){ + () => props.dataSource, + () => { + if (props.dataSource && !props.request) { handleSearch(props.params) } - }, - {deep: true, immediate: true} + }, + { deep: true, immediate: true } ) onMounted(() => { @@ -241,6 +245,10 @@ const JTable = defineComponent({ window.onresize = null }) + watchEffect(() => { + // console.log(props.bodyStyle) + }) + /** * 刷新数据 * @param _params @@ -256,10 +264,10 @@ const JTable = defineComponent({ /** * 导出方法 */ - expose({ reload }) - + expose({ reload }) + return () => -
+
{/* 顶部左边插槽 */} @@ -278,7 +286,7 @@ const JTable = defineComponent({
{ _model.value = ModelEnum.TABLE }}> - +
} @@ -288,66 +296,66 @@ const JTable = defineComponent({
{ props.alertRender && props?.rowSelection && props?.rowSelection?.selectedRowKeys && props.rowSelection.selectedRowKeys?.length ? -
- { - emit('cancelSelect') - }} - closeText={取消选择} - /> -
: null +
+ { + emit('cancelSelect') + }} + closeText={取消选择} + /> +
: null } { _model.value === ModelEnum.CARD ? -
- { - _dataSource.value.length ? -
- { - _dataSource.value.map(item => slots.card ? -
- {slots.card(item)} -
: null - ) - } -
: -
- } -
: -
- ) => { - const {column, record} = dt; - if((column?.key || column?.dataIndex) && column?.scopedSlots && (slots?.[column?.dataIndex] || slots?.[column?.key])) { - const _key = column?.key || column?.dataIndex - return slots?.[_key]!(record) - } else { - return record?.[column?.dataIndex] || '' +
+ { + _dataSource.value.length ? +
+ { + _dataSource.value.map(item => slots.card ? +
+ {slots.card(item)} +
: null + ) + } +
: +
+ } +
: +
+
) => { + const { column, record } = dt; + if ((column?.key || column?.dataIndex) && column?.scopedSlots && (slots?.[column?.dataIndex] || slots?.[column?.key])) { + const _key = column?.key || column?.dataIndex + return slots?.[_key]!(record) + } else { + return record?.[column?.dataIndex] || '' + } } - } - }} - /> - + }} + /> + } {/* 分页 */} { (!!_dataSource.value.length) && !props.noPagination && props.type === 'PAGE' &&
- (slots: Slots, props: Record, pr } return (props[prop] || slots[prop]?.()) as T; } + + +/** + * 修改Select参数column的值 + * @param e // 查询参数 e + * @param column {Object} {需要修改的值: 修改后的值} + * { + username: 'context.username', + } + */ +export const modifySearchColumnValue = (e: any, column: object) => { + e.terms.forEach((item: any) => { + item.terms.forEach((t: any) => { + if (column[t.column]) { + t.column = column[t.column]; + } + }); + }); + return e; +}; \ No newline at end of file diff --git a/src/views/Log/Access/index.vue b/src/views/Log/Access/index.vue new file mode 100644 index 00000000..48679537 --- /dev/null +++ b/src/views/Log/Access/index.vue @@ -0,0 +1,255 @@ + + diff --git a/src/views/Log/System/index.vue b/src/views/Log/System/index.vue new file mode 100644 index 00000000..982cc922 --- /dev/null +++ b/src/views/Log/System/index.vue @@ -0,0 +1,246 @@ + + + + diff --git a/src/views/Log/index.vue b/src/views/Log/index.vue new file mode 100644 index 00000000..9193b21f --- /dev/null +++ b/src/views/Log/index.vue @@ -0,0 +1,28 @@ + + diff --git a/src/views/Log/typings.d.ts b/src/views/Log/typings.d.ts new file mode 100644 index 00000000..bccebed0 --- /dev/null +++ b/src/views/Log/typings.d.ts @@ -0,0 +1,31 @@ +export type AccessLogItem = { + id: string; + context: any; + describe: string; + exception: string; + httpHeaders: any; + httpMethod: string; + ip: string; + method: string; + parameters: any; + requestTime: number; + responseTime: number; + target: string; + url: string; + action: string; +}; + +export type SystemLogItem = { + id: string; + className: string; + context: any; + createTime: number; + exceptionStack: string; + level: string; + lineNumber: number; + message: string; + methodName: string; + name: string; + threadId: string; + threadName: string; +}; diff --git a/src/views/device/Instance/Detail/Info/components/Config/Save.vue b/src/views/device/Instance/Detail/Info/components/Config/Save.vue new file mode 100644 index 00000000..724cc25c --- /dev/null +++ b/src/views/device/Instance/Detail/Info/components/Config/Save.vue @@ -0,0 +1,105 @@ + + + \ No newline at end of file diff --git a/src/views/device/Instance/Detail/Info/components/Config/index.vue b/src/views/device/Instance/Detail/Info/components/Config/index.vue index 4d7b0d78..6909b405 100644 --- a/src/views/device/Instance/Detail/Info/components/Config/index.vue +++ b/src/views/device/Instance/Detail/Info/components/Config/index.vue @@ -1,6 +1,6 @@ @@ -34,6 +35,7 @@ import { useInstanceStore } from "@/store/instance" import { ConfigMetadata } from "@/views/device/Product/typings" import { getConfigMetadata, _deploy, configurationReset } from '@/api/device/instance' import { message } from "ant-design-vue" +import Save from './Save.vue' const instanceStore = useInstanceStore() const visible = ref(false) @@ -78,4 +80,11 @@ const resetBtn = async () => { } } } + +const saveBtn = () => { + visible.value = false + if(instanceStore.current.id){ + instanceStore.refresh(instanceStore.current.id) + } +} \ No newline at end of file diff --git a/src/views/device/Instance/Detail/Running/Event/index.vue b/src/views/device/Instance/Detail/Running/Event/index.vue new file mode 100644 index 00000000..bb863222 --- /dev/null +++ b/src/views/device/Instance/Detail/Running/Event/index.vue @@ -0,0 +1,68 @@ + + + \ No newline at end of file diff --git a/src/views/device/Instance/Detail/Running/Property/PropertyCard.vue b/src/views/device/Instance/Detail/Running/Property/PropertyCard.vue new file mode 100644 index 00000000..d21fb23d --- /dev/null +++ b/src/views/device/Instance/Detail/Running/Property/PropertyCard.vue @@ -0,0 +1,114 @@ + + + + + \ No newline at end of file diff --git a/src/views/device/Instance/Detail/Running/Property/ValueRender.vue b/src/views/device/Instance/Detail/Running/Property/ValueRender.vue new file mode 100644 index 00000000..44681001 --- /dev/null +++ b/src/views/device/Instance/Detail/Running/Property/ValueRender.vue @@ -0,0 +1,14 @@ + + + \ No newline at end of file diff --git a/src/views/device/Instance/Detail/Running/Property/index.vue b/src/views/device/Instance/Detail/Running/Property/index.vue new file mode 100644 index 00000000..24ed16b6 --- /dev/null +++ b/src/views/device/Instance/Detail/Running/Property/index.vue @@ -0,0 +1,166 @@ + + + + + \ No newline at end of file diff --git a/src/views/device/Instance/Detail/Running/index.vue b/src/views/device/Instance/Detail/Running/index.vue index e2e39b8a..e97db6d1 100644 --- a/src/views/device/Instance/Detail/Running/index.vue +++ b/src/views/device/Instance/Detail/Running/index.vue @@ -1,46 +1,120 @@ + + \ No newline at end of file diff --git a/src/views/home/components/StepCard.vue b/src/views/home/components/StepCard.vue index 661de226..fdeabe9d 100644 --- a/src/views/home/components/StepCard.vue +++ b/src/views/home/components/StepCard.vue @@ -117,11 +117,14 @@ const objToParams = (source: object): string => { } .box-list { - grid-template-columns: repeat(5, 1fr); - display: grid; - grid-column-gap: 66px; + // grid-template-columns: repeat(5, 1fr); + // display: grid; + // grid-column-gap: 66px; + display: flex; + gap: 66px; .list-item { + flex: 1; position: relative; .box-top { position: relative; diff --git a/src/views/iot-card/CardManagement/Detail/index.vue b/src/views/iot-card/CardManagement/Detail/index.vue index 3e1a330d..fffa20e5 100644 --- a/src/views/iot-card/CardManagement/Detail/index.vue +++ b/src/views/iot-card/CardManagement/Detail/index.vue @@ -1,6 +1,6 @@ + diff --git a/src/views/link/Log/Access/index.vue b/src/views/link/Log/Access/index.vue deleted file mode 100644 index 9c87e8c8..00000000 --- a/src/views/link/Log/Access/index.vue +++ /dev/null @@ -1,6 +0,0 @@ - - diff --git a/src/views/link/Log/System/index.vue b/src/views/link/Log/System/index.vue deleted file mode 100644 index 1fd97c0d..00000000 --- a/src/views/link/Log/System/index.vue +++ /dev/null @@ -1,6 +0,0 @@ - - diff --git a/src/views/link/Log/index.vue b/src/views/link/Log/index.vue deleted file mode 100644 index 4fbaf127..00000000 --- a/src/views/link/Log/index.vue +++ /dev/null @@ -1,17 +0,0 @@ - - diff --git a/src/views/link/Protocol/Save/index.vue b/src/views/link/Protocol/Save/index.vue new file mode 100644 index 00000000..9a60a0be --- /dev/null +++ b/src/views/link/Protocol/Save/index.vue @@ -0,0 +1,37 @@ + + + + diff --git a/src/views/link/Protocol/index.vue b/src/views/link/Protocol/index.vue new file mode 100644 index 00000000..8798fe9c --- /dev/null +++ b/src/views/link/Protocol/index.vue @@ -0,0 +1,327 @@ + + + diff --git a/src/views/link/Protocol/typings.d.ts b/src/views/link/Protocol/typings.d.ts new file mode 100644 index 00000000..91ac930a --- /dev/null +++ b/src/views/link/Protocol/typings.d.ts @@ -0,0 +1,7 @@ +import type { BaseItem } from '@/utils/typings'; + +type ProtocolItem = { + state: number; + type: string; + configuration: Record; +} & BaseItem; diff --git a/src/views/media/DashBoard/components/Card.vue b/src/views/media/DashBoard/components/Card.vue new file mode 100644 index 00000000..498d600a --- /dev/null +++ b/src/views/media/DashBoard/components/Card.vue @@ -0,0 +1,7 @@ + + + + + diff --git a/src/views/media/DashBoard/components/TopCard.vue b/src/views/media/DashBoard/components/TopCard.vue new file mode 100644 index 00000000..8e7469a4 --- /dev/null +++ b/src/views/media/DashBoard/components/TopCard.vue @@ -0,0 +1,94 @@ + + + + + diff --git a/src/views/media/DashBoard/index.less b/src/views/media/DashBoard/index.less new file mode 100644 index 00000000..870c54fe --- /dev/null +++ b/src/views/media/DashBoard/index.less @@ -0,0 +1,38 @@ +.media-dash-board { + .top-card-items { + margin-bottom: 12px; + + .top-card-item { + width: 25%; + padding: 6px 24px; + border: 1px solid #e3e3e3; + + .top-card-top { + display: flex; + padding: 12px 0; + + .top-card-top-left { + width: 80px; + } + + .top-card-top-right { + .top-card-total { + font-weight: bold; + font-size: 20px; + } + } + } + + .top-card-bottom { + display: flex; + justify-content: space-between; + padding: 12px 0; + border-top: 1px solid #e3e3e3; + } + } + } + + .media-dash-board-body { + border: 1px solid #f0f0f0; + } +} diff --git a/src/views/media/DashBoard/index.vue b/src/views/media/DashBoard/index.vue new file mode 100644 index 00000000..94dcb0f2 --- /dev/null +++ b/src/views/media/DashBoard/index.vue @@ -0,0 +1,93 @@ + + + + + diff --git a/src/views/media/DashBoard/typings.d.ts b/src/views/media/DashBoard/typings.d.ts new file mode 100644 index 00000000..2a2a62f2 --- /dev/null +++ b/src/views/media/DashBoard/typings.d.ts @@ -0,0 +1,16 @@ +export type Agg = { + duration: number + total: number +} + +export type AggPlaying = { + playerTotal: number + playingTotal: number +} + +export type Footer = { + title: string; + value: number; + status?: "default" | "error" | "success" | "warning" | "processing" +} + diff --git a/src/views/media/Home/components/BasicCountCard.vue b/src/views/media/Home/components/BasicCountCard.vue new file mode 100644 index 00000000..53cb6d36 --- /dev/null +++ b/src/views/media/Home/components/BasicCountCard.vue @@ -0,0 +1,118 @@ + + + + + diff --git a/src/views/media/Home/index.vue b/src/views/media/Home/index.vue new file mode 100644 index 00000000..a0f26df9 --- /dev/null +++ b/src/views/media/Home/index.vue @@ -0,0 +1,104 @@ + + + + + diff --git a/src/views/media/Home/typings.d.ts b/src/views/media/Home/typings.d.ts new file mode 100644 index 00000000..995964b8 --- /dev/null +++ b/src/views/media/Home/typings.d.ts @@ -0,0 +1,24 @@ +type BaseItem = { + id: string; + name: string; +}; +type State = { + value: string; + text: string; +}; + +export type DeviceItem = { + photoUrl?: string; + channelNumber: number; + createTime: number; + firmware: string; + gatewayId: string; + host: string; + manufacturer: string; + model: string; + port: number; + provider: string; + state: State; + streamMode: string; + transport: string; +} & BaseItem; diff --git a/src/views/notice/Config/index.vue b/src/views/notice/Config/index.vue index 043206a2..6fe54e10 100644 --- a/src/views/notice/Config/index.vue +++ b/src/views/notice/Config/index.vue @@ -47,6 +47,7 @@ @@ -63,12 +68,14 @@ + + diff --git a/src/views/system/Menu/components/ButtonAddDialog.vue b/src/views/system/Menu/components/ButtonAddDialog.vue index 0099a601..0a54e5df 100644 --- a/src/views/system/Menu/components/ButtonAddDialog.vue +++ b/src/views/system/Menu/components/ButtonAddDialog.vue @@ -1,11 +1,15 @@ - +