diff --git a/.env.development b/.env.development index 790b66bd..a6ee4e59 100644 --- a/.env.development +++ b/.env.development @@ -6,7 +6,7 @@ VITE_PUBLIC_PATH = / # Cross-domain proxy, you can configure multiple # Please note that no line breaks -VITE_PROXY = [["/basic-api","http://lcny.sk797.cn"],["/upload","http://lcny.sk797.cn/api/web/upload"]] +VITE_PROXY = [["/basic-api","http://lcny.sk797.cn"],["/upload","http://lcny.sk797.cn/api/web/upload"],['/live','https://open.ys7.com']] # Delete console VITE_DROP_CONSOLE = false diff --git a/package.json b/package.json index 320adba3..2b89d179 100644 --- a/package.json +++ b/package.json @@ -51,6 +51,7 @@ "crypto-js": "^4.1.1", "dayjs": "^1.11.1", "echarts": "^5.3.2", + "ezuikit-js": "^7.7.6", "flv.js": "^1.6.2", "intro.js": "^5.1.0", "lodash-es": "^4.17.21", @@ -66,6 +67,7 @@ "sortablejs": "^1.15.0", "tinymce": "^5.10.3", "vditor": "^3.8.13", + "video.js": "^8.6.0", "vue": "^3.2.33", "vue-i18n": "^9.1.9", "vue-json-pretty": "^2.0.6", diff --git a/src/api/sys/model/userModel.ts b/src/api/sys/model/userModel.ts index f48fcf68..a4fca981 100644 --- a/src/api/sys/model/userModel.ts +++ b/src/api/sys/model/userModel.ts @@ -2,40 +2,40 @@ * @description: Login interface parameters */ export interface LoginParams { - username: string; - password: string; + username: string + password: string } export interface RoleInfo { - roleName: string; - value: string; + roleName: string + value: string } /** * @description: Login interface return value */ export interface LoginResultModel { - info: GetUserInfoModel; - token: string; - permissions: RoleInfo; + info: GetUserInfoModel + token: string + permissions: RoleInfo } /** * @description: Get user information return value */ export interface GetUserInfoModel { - info: UserInfo; - permissions: RoleInfo[]; + info: UserInfo + permissions_slug: string[] } export interface UserInfo { - id: string | number; - username: string; - name: string; - avatar: string; - created_at: string; - updated_at: string; - department: string; - phone: string | number; - status: string | number; - is_enable: string | number; + id: string | number + username: string + name: string + avatar: string + created_at: string + updated_at: string + department: string + phone: string | number + status: string | number + is_enable: string | number } diff --git a/src/api/sys/other.ts b/src/api/sys/other.ts index 6339839f..7397ef2a 100644 --- a/src/api/sys/other.ts +++ b/src/api/sys/other.ts @@ -214,7 +214,10 @@ export function getAgriculturalDeviceBasic(params, mode: ErrorMessageMode = 'non return defHttp.get( { url: '/api/agricultural-device-basic', - params, + params: { + all: 1, + ...params, + }, }, { errorMessageMode: mode, @@ -417,12 +420,12 @@ export function updateRecommend(params, mode: ErrorMessageMode = 'none') { ) } /** - * @description:修改设备推荐状态 + * @description: */ export function devicePoints(type, mode: ErrorMessageMode = 'none') { return defHttp.get( { - url: `/api/agricultural-device-points?type=${type}`, + url: `/api/agricultural-device-points?type=${type}&all=1`, }, { errorMessageMode: mode, diff --git a/src/components/LiveVideo/flv.vue b/src/components/LiveVideo/flv.vue new file mode 100644 index 00000000..065c4779 --- /dev/null +++ b/src/components/LiveVideo/flv.vue @@ -0,0 +1,56 @@ + + + + diff --git a/src/components/LiveVideo/index.vue b/src/components/LiveVideo/index.vue new file mode 100644 index 00000000..3977c0ff --- /dev/null +++ b/src/components/LiveVideo/index.vue @@ -0,0 +1,30 @@ + + diff --git a/src/components/LiveVideo/m3up.vue b/src/components/LiveVideo/m3up.vue new file mode 100644 index 00000000..41a18ff6 --- /dev/null +++ b/src/components/LiveVideo/m3up.vue @@ -0,0 +1,59 @@ + + + + diff --git a/src/hooks/web/usePermission.ts b/src/hooks/web/usePermission.ts index 069e7534..2f8e8809 100644 --- a/src/hooks/web/usePermission.ts +++ b/src/hooks/web/usePermission.ts @@ -67,11 +67,13 @@ export function usePermission() { if ([PermissionModeEnum.ROUTE_MAPPING, PermissionModeEnum.ROLE].includes(permMode)) { if (!isArray(value)) { - return userStore.getRoleList?.includes(value as RoleEnum) + return userStore.getPermissions?.includes(value as RoleEnum) } - return (intersection(value, userStore.getRoleList) as RoleEnum[]).length > 0 + return (intersection(value, userStore.getPermissions) as RoleEnum[]).length > 0 } + if (userStore.getRoleList.includes(RoleEnum.SUPER)) return true + if (PermissionModeEnum.BACK === permMode) { const allCodeList = permissionStore.getPermCodeList as string[] if (!isArray(value)) { diff --git a/src/layouts/default/header/index.vue b/src/layouts/default/header/index.vue index 66ec5da6..48e05483 100644 --- a/src/layouts/default/header/index.vue +++ b/src/layouts/default/header/index.vue @@ -39,7 +39,7 @@ -
+
数据看板
diff --git a/src/router/guard/permissionGuard.ts b/src/router/guard/permissionGuard.ts index a6dcdd93..2f72b4b5 100644 --- a/src/router/guard/permissionGuard.ts +++ b/src/router/guard/permissionGuard.ts @@ -8,6 +8,7 @@ import { useUserStoreWithOut } from '/@/store/modules/user' import { PAGE_NOT_FOUND_ROUTE } from '/@/router/routes/basic' import { RootRoute } from '/@/router/routes' +import { usePermission } from '/@/hooks/web/usePermission' const LOGIN_PATH = PageEnum.BASE_LOGIN @@ -43,6 +44,7 @@ export function createPermissionGuard(router: Router) { } } catch {} } + next() return } @@ -91,6 +93,13 @@ export function createPermissionGuard(router: Router) { } if (permissionStore.getIsDynamicAddedRoute) { + if (to.path === '/v') { + const { hasPermission } = usePermission() + if (!hasPermission('endpoint.data_dashboard')) { + return next({ path: '/', replace: true }) + } + } + next() return } diff --git a/src/router/index.ts b/src/router/index.ts index a021ae97..0c0203ac 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -27,8 +27,6 @@ export const router = createRouter({ // reset router export function resetRouter() { - console.log('====') - router.getRoutes().forEach((route) => { const { name } = route if (name && !WHITE_NAME_LIST.includes(name as string)) { diff --git a/src/router/routes/modules/base.ts b/src/router/routes/modules/base.ts index 70fd72c9..a5ce5a43 100644 --- a/src/router/routes/modules/base.ts +++ b/src/router/routes/modules/base.ts @@ -15,6 +15,7 @@ const main: AppRouteModule = { path: 'basics', name: 'Basics', meta: { + permission: ['admin'], title: '全市基础数据', // icon: 'ion:key-outline', }, @@ -25,6 +26,7 @@ const main: AppRouteModule = { component: () => import('/@/views/base/city-data/index.vue'), meta: { title: '城镇数据', + permission: 'endpoint.town_street.index', }, }, { @@ -33,6 +35,7 @@ const main: AppRouteModule = { component: () => import('/@/views/base/base-data/index.vue'), meta: { title: '基地数据', + permission: 'endpoint.agricultural_basic.index', }, }, ], @@ -51,6 +54,7 @@ const main: AppRouteModule = { component: () => import('/@/views/base/crops/town-crops/index.vue'), meta: { title: '城镇农作物', + permission: 'endpoint.town_crops.index', }, }, { @@ -59,6 +63,7 @@ const main: AppRouteModule = { component: () => import('/@/views/base/crops/base-crops/index.vue'), meta: { title: '基地农作物', + permission: 'endpoint.crops.index', }, }, ], @@ -77,6 +82,7 @@ const main: AppRouteModule = { component: () => import('/@/views/base/crop-yields/town-yields/index.vue'), meta: { title: '城镇产量', + permission: 'endpoint.town_crops_output.index', }, }, { @@ -85,6 +91,7 @@ const main: AppRouteModule = { component: () => import('/@/views/base/crop-yields/base-yields/index.vue'), meta: { title: '基地产量', + permission: 'endpoint.crops_output.index', }, }, ], @@ -103,6 +110,7 @@ const main: AppRouteModule = { component: () => import('/@/views/base/estate/shrim-price/index.vue'), meta: { title: '稻虾价格', + permission: 'endpoint.rice_shrimp_prices.index', }, }, { @@ -111,6 +119,7 @@ const main: AppRouteModule = { component: () => import('/@/views/base/estate/shrim-price/week.vue'), meta: { title: '稻虾每周价格', + permission: 'endpoint.rice_shrimp_weekly_prices.index', }, }, { @@ -119,6 +128,7 @@ const main: AppRouteModule = { component: () => import('/@/views/base/estate/shrimp-industries/index.vue'), meta: { title: '稻虾产业', + permission: 'endpoint.rice_shrimp_industries.index', }, }, { @@ -127,6 +137,7 @@ const main: AppRouteModule = { component: () => import('/@/views/base/estate/shrimp-flows/index.vue'), meta: { title: '稻虾流向', + permission: 'endpoint.rice_shrimp_flows.index', }, }, { @@ -135,6 +146,7 @@ const main: AppRouteModule = { component: () => import('/@/views/base/estate/materiels/index.vue'), meta: { title: '大宗物资', + permission: 'endpoint.materiels.index', }, }, ], diff --git a/src/router/routes/modules/device.ts b/src/router/routes/modules/device.ts index b6c14f7f..c1a07ec3 100644 --- a/src/router/routes/modules/device.ts +++ b/src/router/routes/modules/device.ts @@ -17,6 +17,7 @@ const main: AppRouteModule = { component: () => import('/@/views/device/management/index.vue'), meta: { title: '设备管理', + permission: 'endpoint.device.index', }, }, { @@ -25,6 +26,7 @@ const main: AppRouteModule = { component: () => import('/@/views/device/warning/index.vue'), meta: { title: '警报明细', + permission: 'endpoint.warnings.index', }, }, ], diff --git a/src/router/routes/modules/main.ts b/src/router/routes/modules/main.ts index c2028f96..0319a2fa 100644 --- a/src/router/routes/modules/main.ts +++ b/src/router/routes/modules/main.ts @@ -17,6 +17,7 @@ const main: AppRouteModule = { component: () => import('/@/views/main/meteorological/index.vue'), meta: { title: '气象监测', + permission: 'endpoint.weather.index', }, }, { @@ -25,6 +26,7 @@ const main: AppRouteModule = { component: () => import('/@/views/main/monitor/index.vue'), meta: { title: '智能监控', + permission: 'endpoint.camera.index', }, }, { @@ -33,6 +35,7 @@ const main: AppRouteModule = { component: () => import('/@/views/main/soil-monitoring/index.vue'), meta: { title: '土壤监控', + permission: 'endpoint.soil.index', }, }, { @@ -41,6 +44,7 @@ const main: AppRouteModule = { component: () => import('/@/views/main/water-quality/index.vue'), meta: { title: '水质监控', + permission: 'endpoint.water.index', }, }, { @@ -49,6 +53,7 @@ const main: AppRouteModule = { component: () => import('/@/views/main/insect-monitors/index.vue'), meta: { title: '昆虫性诱监测', + permission: 'endpoint.insect.index', }, }, { @@ -57,6 +62,7 @@ const main: AppRouteModule = { component: () => import('/@/views/main/pests/index.vue'), meta: { title: '虫情监测', + permission: 'endpoint.worm_statics.index', }, }, { @@ -65,6 +71,7 @@ const main: AppRouteModule = { component: () => import('/@/views/main/insecticidal-lamp/index.vue'), meta: { title: '杀虫灯监测', + permission: 'endpoint.insecticidal_lamp.index', }, }, ], diff --git a/src/router/routes/modules/system.ts b/src/router/routes/modules/system.ts index cf2014a5..6a471b4c 100644 --- a/src/router/routes/modules/system.ts +++ b/src/router/routes/modules/system.ts @@ -17,6 +17,7 @@ const main: AppRouteModule = { component: () => import('/@/views/system/role/index.vue'), meta: { title: '角色管理', + permission: 'endpoint.admin_roles.index', }, }, { @@ -25,6 +26,7 @@ const main: AppRouteModule = { component: () => import('/@/views/system/account/index.vue'), meta: { title: '账号管理', + permission: 'endpoint.admin_roles.index', }, }, { @@ -33,6 +35,7 @@ const main: AppRouteModule = { component: () => import('/@/views/system/log/index.vue'), meta: { title: '系统日志', + permission: 'endpoint.operation_log.index', }, }, { @@ -41,6 +44,7 @@ const main: AppRouteModule = { component: () => import('/@/views/system/links/index.vue'), meta: { title: '友情链接', + permission: 'endpoint.friend_links.index', }, }, ], diff --git a/src/store/modules/permission.ts b/src/store/modules/permission.ts index 9542522c..f8510f01 100644 --- a/src/store/modules/permission.ts +++ b/src/store/modules/permission.ts @@ -23,6 +23,7 @@ import { getPermCode } from '/@/api/sys/user' import { useMessage } from '/@/hooks/web/useMessage' import { PageEnum } from '/@/enums/pageEnum' +import { RoleEnum } from '/@/enums/roleEnum' interface PermissionState { // Permission code list @@ -115,17 +116,21 @@ export const usePermissionStore = defineStore({ const appStore = useAppStoreWithOut() let routes: AppRouteRecordRaw[] = [] + + const permissionList = toRaw(userStore.getPermissions) || [] const roleList = toRaw(userStore.getRoleList) || [] const { permissionMode = projectSetting.permissionMode } = appStore.getProjectConfig // 路由过滤器 在 函数filter 作为回调传入遍历使用 const routeFilter = (route: AppRouteRecordRaw) => { const { meta } = route + if (roleList.includes(RoleEnum.SUPER)) return true // 抽出角色 - const { roles } = meta || {} - if (!roles) return true + const { permission } = meta || {} + if (!permission) return false // 进行角色权限判断 - return roleList.some((role) => roles.includes(role)) + + return permissionList.some((e) => permission === e) } const routeRemoveIgnoreFilter = (route: AppRouteRecordRaw) => { @@ -184,8 +189,9 @@ export const usePermissionStore = defineStore({ case PermissionModeEnum.ROUTE_MAPPING: // 对非一级路由进行过滤 routes = filter(asyncRoutes, routeFilter) + // 对一级路由再次根据角色权限过滤 - routes = routes.filter(routeFilter) + // routes = routes.filter(routeFilter) // 将路由转换成菜单 const menuList = transformRouteToMenu(routes, true) // 移除掉 ignoreRoute: true 的路由 非一级路由 diff --git a/src/store/modules/user.ts b/src/store/modules/user.ts index 5198b03d..327be345 100644 --- a/src/store/modules/user.ts +++ b/src/store/modules/user.ts @@ -23,6 +23,7 @@ interface UserState { roleList: RoleEnum[] sessionTimeout?: boolean lastUpdateTime: number + permissions: string[] } export const useUserStore = defineStore({ @@ -38,6 +39,7 @@ export const useUserStore = defineStore({ sessionTimeout: false, // Last fetch time lastUpdateTime: 0, + permissions: [], }), getters: { getUserInfo(): UserInfo { @@ -55,6 +57,9 @@ export const useUserStore = defineStore({ getLastUpdateTime(): number { return this.lastUpdateTime }, + getPermissions(): string[] { + return this.permissions + }, }, actions: { setToken(info: string | undefined) { @@ -65,6 +70,9 @@ export const useUserStore = defineStore({ this.roleList = roleList setAuthCache(ROLES_KEY, roleList) }, + setPermissions(permissions: string[]) { + this.permissions = permissions + }, setUserInfo(info: UserInfo | null) { this.userInfo = info this.lastUpdateTime = new Date().getTime() @@ -125,15 +133,21 @@ export const useUserStore = defineStore({ }, async getUserInfoAction(): Promise { if (!this.getToken) return null - const { info, permissions }: GetUserInfoModel = await getUserInfo() - const userInfo: UserInfo = Object.assign({}, info, { roles: permissions }) - const { roles = [] } = userInfo - if (isArray(roles)) { - const roleList = roles.map((item) => item.value) as RoleEnum[] - this.setRoleList(roleList) + const { info, permissions_slug }: GetUserInfoModel = await getUserInfo() + const userInfo: UserInfo = Object.assign({}, info, { + permissions: permissions_slug, + roles: [], + }) + + if (isArray(permissions_slug)) { + this.setPermissions(permissions_slug) } else { - userInfo.roles = [] - this.setRoleList([]) + userInfo.permissions = [] + this.setPermissions([]) + } + + if (userInfo.username === 'admin') { + this.setRoleList([RoleEnum.SUPER]) } this.setUserInfo(userInfo) return userInfo diff --git a/src/views/base/base-data/index.vue b/src/views/base/base-data/index.vue index a5a91f85..95d24fe8 100644 --- a/src/views/base/base-data/index.vue +++ b/src/views/base/base-data/index.vue @@ -2,16 +2,27 @@