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 @@
- 新增基地
+
+ 新增基地
+
- 编辑
+ 编辑
- 新增
+
+ 新增
+
- 新增
+
+ 新增
+
- 新增农作物
+
+ 新增农作物
+
- 新增农作物
+
+ 新增农作物
+
- 新增
+
+ 新增
+
- 新增
+
+ 新增
+
- 新增
+
+ 新增
+
- 新增
+
+ 新增
+
- 新增
+
+ 新增
+
@@ -33,15 +34,17 @@