diff --git a/src/api/account/center.ts b/src/api/account/center.ts index 5523992a..4946c123 100644 --- a/src/api/account/center.ts +++ b/src/api/account/center.ts @@ -1,3 +1,31 @@ import server from '@/utils/request' export const getSsoBinds_api = (): any =>server.get(`/application/sso/me/bindings`) + +// 获取登录用户信息 +export const getMeInfo_api = () => server.get(`/user/detail`); +// 修改登录用户信息 +export const updateMeInfo_api = (data:object) => server.put(`/user/detail`,data); +// 修改登录用户密码 +export const updateMepsd_api = (data:object) => server.put(`/user/passwd`,data); +// 第三方账号解绑 +export const unBind_api = (appId: string) => server.post(`/application/sso/${appId}/unbind/me`); +/** + * 校验字段合法性 + * @param type 类型 + * @param name 值 + */ +export const validateField_api = (type: 'username' | 'password', name: string) => server.post(`/user/${type}/_validate`,name,{ + headers: { + 'Content-Type': 'text/plain' + } +}); +/** + * 校验旧密码是否正确 + * @param password 旧密码 + */ +export const checkOldPassword_api = (password:string) => server.post(`/user/me/password/_validate`,password,{ + headers: { + 'Content-Type': 'text/plain' + } +}); diff --git a/src/api/device/product.ts b/src/api/device/product.ts index f6a31e9d..fc69bd04 100644 --- a/src/api/device/product.ts +++ b/src/api/device/product.ts @@ -1,5 +1,6 @@ +import { OperatorItem } from '@/components/FRuleEditor/Operator/typings' import server from '@/utils/request' -import { DeviceMetadata, ProductItem, DepartmentItem } from '@/views/device/Product/typings' +import { DeviceMetadata, ProductItem, DepartmentItem, MetadataType } from '@/views/device/Product/typings' /** * 根据条件查询产品(不带翻页) diff --git a/src/api/link/protocol.ts b/src/api/link/protocol.ts index b77a782a..c0b3b35d 100644 --- a/src/api/link/protocol.ts +++ b/src/api/link/protocol.ts @@ -3,15 +3,13 @@ import { BASE_API_PATH } from '@/utils/variable'; export const PROTOCOL_UPLOAD = `${BASE_API_PATH}/file/upload`; -export const detail = (id: string) => server.get(`/gateway/device/${id}`); +export const save = (data: Object) => server.post(`/protocol`, data); -export const save = (data: Object) => server.post(`/gateway/device`, data); - -export const update = (data: Object) => server.patch(`/gateway/device`, data); +export const update = (data: Object) => server.patch(`/protocol`, data); export const list = (data: Object) => server.post(`/protocol/_query`, data); -export const remove = (id: string) => server.remove(`/gateway/device/${id}`); +export const remove = (id: string) => server.remove(`/protocol/${id}`); export const querySystemApi = (data: Object) => server.post(`/system/config/scopes`, data); diff --git a/src/api/media/cascade.ts b/src/api/media/cascade.ts index c0b71ded..77e0b5ac 100644 --- a/src/api/media/cascade.ts +++ b/src/api/media/cascade.ts @@ -4,8 +4,6 @@ import type { CascadeItem } from '@/views/media/Cascade/typings' export default { // 列表 list: (data: any) => server.post(`/media/gb28181-cascade/_query`, data), - // 列表字段通道数量, 来自下面接口的total - queryCount: (id: string) => server.post(`/media/gb28181-cascade/${id}/bindings/_query`), // 详情 detail: (id: string): any => server.get(`/media/gb28181-cascade/${id}`), // 新增 @@ -26,4 +24,17 @@ export default { // SIP本地地址 all: () => server.get(`/network/resources/alive/_all`), + // 查询已绑定的通道, list列表字段通道数量, 来自下面接口的total + queryBindChannel: (id: string, data: any) => server.post(`/media/gb28181-cascade/${id}/bindings/_query`, data), + // 绑定通道 + bindChannel: (id: string, data: string[]) => server.post(`/media/gb28181-cascade/${id}/_bind`, data), + // 解绑 + unbindChannel: (id: string, data: string[]) => server.post(`/media/gb28181-cascade/${id}/_unbind`, data), + // 验证国标ID是否存在 + validateField: (id: string, data: string[]): any => server.post(`/media/gb28181-cascade/${id}/gbChannelId/_validate`, data), + // 更改国标ID + updateGbChannelId: (id: string, data: any): any => server.put(`/media/gb28181-cascade/binding/${id}`, data), + // 查询通道分页列表 + queryChannelList: (data: any): any => server.post(`media/channel/_query`, data), + } \ No newline at end of file diff --git a/src/components/AIcon/index.tsx b/src/components/AIcon/index.tsx index 8d349c7a..ce47069b 100644 --- a/src/components/AIcon/index.tsx +++ b/src/components/AIcon/index.tsx @@ -63,7 +63,7 @@ const iconKeys = [ 'HistoryOutlined', 'ToolOutlined', 'FileOutlined', - 'LikeOutlined' + 'LikeOutlined', ] const Icon = (props: {type: string}) => { diff --git a/src/components/Layout/BasicLayout.tsx b/src/components/Layout/BasicLayout.tsx deleted file mode 100644 index 18cfcdf2..00000000 --- a/src/components/Layout/BasicLayout.tsx +++ /dev/null @@ -1,221 +0,0 @@ -import { - computed, - reactive, - unref, - defineComponent, - toRefs, - provide -} from 'vue' - -import type { ExtractPropTypes, PropType, CSSProperties} from 'vue' -import { Layout } from 'ant-design-vue' -import { defaultSettingProps } from './defaultSetting' -import type { BreadcrumbProps, RouteContextProps } from './RouteContext' -import type { - BreadcrumbRender, - CollapsedButtonRender, CustomRender, - HeaderRender, - MenuContentRender, - MenuExtraRender, - MenuHeaderRender, - MenuItemRender, - RightContentRender, - SubMenuItemRender -} from './typings' -import SiderMenuWrapper, { siderMenuProps } from 'components/Layout/components/SiderMenu/SiderMenu' -import { getSlot } from '@/utils/comm' -import { getMenuFirstChildren } from 'components/Layout/utils' -import { pick } from 'lodash-es' -import { routeContextInjectKey } from './RouteContext' -import { HeaderView, headerViewProps } from './components/Header' - -export const basicLayoutProps = { - ...defaultSettingProps, - ...siderMenuProps, - ...headerViewProps, - - breadcrumb: { - type: [Object, Function] as PropType, - default: () => null - }, - breadcrumbRender: { - type: [Object, Function, Boolean] as PropType, - default() { - return null - } - }, - contentStyle: { - type: [String, Object] as PropType, - default: () => { - return null - } - }, - pure: { - type: Boolean, - default: () => false - } -} - -export type BasicLayoutProps = Partial>; - -export default defineComponent({ - name: 'ProLayout', - inheritAttrs: false, - props: basicLayoutProps, - emits: [ - 'update:collapsed', - 'update:open-keys', - 'update:selected-keys', - 'collapse', - 'openKeys', - 'select', - 'menuHeaderClick', - 'menuClick' - ], - setup(props, { emit, attrs, slots }) { - const siderWidth = computed(() => (props.collapsed ? props.collapsedWidth : props.siderWidth)) - - const onCollapse = (collapsed: boolean) => { - emit('update:collapsed', collapsed) - emit('collapse', collapsed) - } - const onOpenKeys = (openKeys: string[] | false) => { - emit('update:open-keys', openKeys) - emit('openKeys', openKeys) - } - const onSelect = (selectedKeys: string[] | false) => { - emit('update:selected-keys', selectedKeys) - emit('select', selectedKeys) - } - const onMenuHeaderClick = (e: MouseEvent) => { - emit('menuHeaderClick', e) - } - const onMenuClick = (args: any) => { - emit('menuClick', args) - } - const headerRender = ( - p: BasicLayoutProps & { - hasSiderMenu: boolean; - headerRender: HeaderRender; - rightContentRender: RightContentRender; - }, - matchMenuKeys?: string[] - ): CustomRender | null => { - if (p.headerRender === false) { - return null - } - return - } - - const breadcrumb = computed(() => ({ - ...props.breadcrumb, - itemRender: getSlot(slots, props, 'breadcrumbRender') as BreadcrumbRender - })) - - const flatMenuData = computed( - () => (props.selectedKeys && getMenuFirstChildren(props.menuData, props.selectedKeys[0])) || []) - - const routeContext = reactive({ - ...(pick(toRefs(props), [ - 'menuData', - 'openKeys', - 'selectedKeys', - 'contentWidth', - 'headerHeight' - ]) as any), - siderWidth, - breadcrumb, - flatMenuData - }) - - provide(routeContextInjectKey, routeContext) - - return () => { - const { - pure, - onCollapse: propsOnCollapse, - onOpenKeys: propsOnOpenKeys, - onSelect: propsOnSelect, - onMenuClick: propsOnMenuClick, - ...restProps - } = props - - const collapsedButtonRender = getSlot(slots, props, 'collapsedButtonRender') - const rightContentRender = getSlot(slots, props, 'rightContentRender') - const customHeaderRender = getSlot(slots, props, 'headerRender') - - // menu - const menuHeaderRender = getSlot(slots, props, 'menuHeaderRender') - const menuExtraRender = getSlot(slots, props, 'menuExtraRender') - const menuContentRender = getSlot(slots, props, 'menuContentRender') - const menuItemRender = getSlot(slots, props, 'menuItemRender') - const subMenuItemRender = getSlot(slots, props, 'subMenuItemRender') - - const headerDom = computed(() => - headerRender( - { - ...props, - hasSiderMenu: true, - menuItemRender, - subMenuItemRender, - menuData: props.menuData, - onCollapse, - onOpenKeys, - onSelect, - onMenuHeaderClick, - rightContentRender, - collapsedButtonRender, - menuExtraRender, - menuContentRender, - headerRender: customHeaderRender, - theme: props.navTheme - }, - [] - ) - ) - - return ( - <> - { - pure ? ( - slots.default?.() - ) : ( - - - - - {headerDom.value} - - {slots.default?.()} - - - - ) - } - - ) - } - } -}) - - - - diff --git a/src/components/Layout/BasicLayoutPage.vue b/src/components/Layout/BasicLayoutPage.vue index ebc3adc4..59079f75 100644 --- a/src/components/Layout/BasicLayoutPage.vue +++ b/src/components/Layout/BasicLayoutPage.vue @@ -1,5 +1,5 @@ + + diff --git a/src/views/account/Center/components/EditPasswordDialog.vue b/src/views/account/Center/components/EditPasswordDialog.vue new file mode 100644 index 00000000..69698c84 --- /dev/null +++ b/src/views/account/Center/components/EditPasswordDialog.vue @@ -0,0 +1,138 @@ + + + + + diff --git a/src/views/account/Center/index.vue b/src/views/account/Center/index.vue index 3687fd51..2846aca1 100644 --- a/src/views/account/Center/index.vue +++ b/src/views/account/Center/index.vue @@ -63,11 +63,27 @@

角色

-

{{ userInfo.roleList.join(',') || '-' }}

+

+ {{ + (userInfo.roleList && + userInfo.roleList + .map((item) => item.name) + .join(',')) || + '-' + }} +

组织

-

{{ userInfo.orgList.join(',') || '-' }}

+

+ {{ + (userInfo.orgList && + userInfo.orgList + .map((item) => item.name) + .join(',')) || + '-' + }} +

邮箱

@@ -78,6 +94,7 @@ type="EditOutlined" class="edit" style="right: 40px" + @click="editInfoVisible = true" />
@@ -94,10 +111,19 @@ >安全性高的密码可以使帐号更安全。建议您定期更换密码,设置一个包含字母,符号或数字中至少两项且长度超过8位的密码 - + + + + + -
+ +

绑定三方账号

-
+ +

首页视图

+
+ + + + + + + + + + + + 确定 +
+ + +
\ No newline at end of file diff --git a/src/views/device/Firmware/Task/Detail/index.vue b/src/views/device/Firmware/Task/Detail/index.vue index dc4f4d29..ef8d17e4 100644 --- a/src/views/device/Firmware/Task/Detail/index.vue +++ b/src/views/device/Firmware/Task/Detail/index.vue @@ -17,19 +17,21 @@
-
- + - 批量重试 - + 批量重试 +
@@ -85,37 +87,27 @@ {{ slotProps.progress }}% @@ -129,7 +121,6 @@ import { taskById, history, historyCount, - queryProduct, startTask, startOneTask, } from '@/api/device/firmware'; @@ -138,8 +129,8 @@ import { getImage } from '@/utils/comm'; import moment from 'moment'; import { cloneDeep } from 'lodash-es'; import Save from './Save.vue'; + const tableRef = ref>({}); -const router = useRouter(); const route = useRoute(); const params = ref>({}); const taskId = route.params?.id as string; @@ -286,7 +277,7 @@ const getActions = (data: Partial>): ActionsType[] => { } const Actions = [ { - key: 'eye', + key: 'view', text: '查看', tooltip: { title: '查看', @@ -297,25 +288,23 @@ const getActions = (data: Partial>): ActionsType[] => { }, }, { - key: 'try', + key: 'update', text: '重试', tooltip: { title: '重试', }, icon: 'RedoOutlined', - onClick: async () => { - handlTry(data.id); + popConfirm: { + title: `确认重试?`, + onConfirm: async () => { + handlTry(data.id); + }, }, }, ]; return Actions; }; -const handlAdd = () => { - current.value = {}; - visible.value = true; -}; - const handlEye = (data: string) => { current.value = data || ''; visible.value = true; @@ -434,4 +423,8 @@ const handleSearch = (e: any) => { } } } +.state-button { + margin-top: -5px; + margin-right: -12px; +} diff --git a/src/views/device/Firmware/Task/index.vue b/src/views/device/Firmware/Task/index.vue index 42e65021..5c60d08d 100644 --- a/src/views/device/Firmware/Task/index.vue +++ b/src/views/device/Firmware/Task/index.vue @@ -13,9 +13,14 @@ :params="params" > @@ -79,7 +74,6 @@ import type { FormDataType } from './type'; const menuStory = useMenuStore(); const tableRef = ref>({}); -const router = useRouter(); const params = ref>({}); const productOptions = ref([]); @@ -174,7 +168,7 @@ const getActions = (data: Partial>): ActionsType[] => { } return [ { - key: 'FileTextOutlined', + key: 'view', text: '升级任务', tooltip: { title: '升级任务', @@ -185,7 +179,7 @@ const getActions = (data: Partial>): ActionsType[] => { }, }, { - key: 'edit', + key: 'update', text: '编辑', tooltip: { title: '编辑', @@ -211,7 +205,7 @@ const getActions = (data: Partial>): ActionsType[] => { ]; }; -const handlUpdate = (data: FormDataType) => { +const handlUpdate = (data: Partial>) => { menuStory.jumpPage( 'device/Firmware/Task', {}, @@ -226,7 +220,7 @@ const handlAdd = () => { current.value = {}; visible.value = true; }; -const handlEdit = (data: FormDataType) => { +const handlEdit = (data: Partial>) => { current.value = _.cloneDeep(data); visible.value = true; }; diff --git a/src/views/device/Instance/Detail/Diagnose/Message/Dialog/index.vue b/src/views/device/Instance/Detail/Diagnose/Message/Dialog/index.vue index 1da53219..0cb6bd97 100644 --- a/src/views/device/Instance/Detail/Diagnose/Message/Dialog/index.vue +++ b/src/views/device/Instance/Detail/Diagnose/Message/Dialog/index.vue @@ -87,11 +87,11 @@ watchEffect(() => { diff --git a/src/views/link/DashBoard/components/Jvm.vue b/src/views/link/DashBoard/components/Jvm.vue index f876e0ae..44671b76 100644 --- a/src/views/link/DashBoard/components/Jvm.vue +++ b/src/views/link/DashBoard/components/Jvm.vue @@ -10,7 +10,9 @@ format="YYYY-MM-DD HH:mm:ss" v-model="data.time" > - + @@ -50,7 +53,7 @@ import { } from './tool.ts'; const chartRef = ref>({}); - +const empty = ref(false); const loading = ref(false); const data = ref({ type: 'hour', @@ -144,6 +147,7 @@ const handleJVMOptions = (optionsData, xAxis) => { : typeDataLine, }; myChart.setOption(options); + xAxis.length === 0 && (empty.value = true); window.addEventListener('resize', function () { myChart.resize(); }); @@ -190,4 +194,7 @@ watch( margin-top: 8px; } } +.empty { + height: 300px; +} diff --git a/src/views/link/DashBoard/components/Network.vue b/src/views/link/DashBoard/components/Network.vue index 2db01cc6..46188f4f 100644 --- a/src/views/link/DashBoard/components/Network.vue +++ b/src/views/link/DashBoard/components/Network.vue @@ -43,12 +43,12 @@
+
-
@@ -67,10 +67,8 @@ import moment from 'moment'; import * as echarts from 'echarts'; const chartRef = ref>({}); - -const flag = ref(true); +const empty = ref(false); const loading = ref(false); -const myChart = ref(null); const data = ref({ type: 'bytesRead', time: { @@ -163,6 +161,7 @@ const handleNetworkOptions = (optionsData, xAxis) => { : typeDataLine, }; myChart.setOption(options); + // xAxis.length === 0 && (empty.value = true); window.addEventListener('resize', function () { myChart.resize(); }); @@ -216,4 +215,7 @@ watch( display: flex; align-items: center; } +.empty { + height: 300px; +} diff --git a/src/views/link/Protocol/Save/index.vue b/src/views/link/Protocol/Save/index.vue index d4ad2ccb..1d73657d 100644 --- a/src/views/link/Protocol/Save/index.vue +++ b/src/views/link/Protocol/Save/index.vue @@ -1,13 +1,9 @@ diff --git a/src/views/media/Cascade/Channel/index.vue b/src/views/media/Cascade/Channel/index.vue new file mode 100644 index 00000000..4939e888 --- /dev/null +++ b/src/views/media/Cascade/Channel/index.vue @@ -0,0 +1,372 @@ + + + + + diff --git a/src/views/media/Cascade/index.vue b/src/views/media/Cascade/index.vue index 21ac2e94..bb05e8b2 100644 --- a/src/views/media/Cascade/index.vue +++ b/src/views/media/Cascade/index.vue @@ -197,12 +197,10 @@