diff --git a/.prettierrc b/.prettierrc
index d7b13c5..4ccf046 100644
--- a/.prettierrc
+++ b/.prettierrc
@@ -5,5 +5,6 @@
"singleQuote": true,
"trailingComma": "es5",
"bracketSpacing": false,
- "htmlWhitespaceSensitivity": "ignore"
+ "htmlWhitespaceSensitivity": "ignore",
+ "printWidth": 120
}
diff --git a/index.html b/index.html
index 010dba8..585010b 100644
--- a/index.html
+++ b/index.html
@@ -5,6 +5,11 @@
燃谷科技(南京)有限公司
+
+
diff --git a/package.json b/package.json
index 9a69f74..189fe04 100644
--- a/package.json
+++ b/package.json
@@ -10,13 +10,14 @@
},
"dependencies": {
"@vueuse/core": "^13.8.0",
- "axios": "^1.11.0",
+ "axios": "^1.12.2",
"element-plus": "^2.11.1",
"js-cookie": "^3.0.5",
"mitt": "^3.0.1",
"pinia": "^3.0.3",
"pinia-plugin-persistedstate": "^4.5.0",
"terser": "^5.43.1",
+ "v-viewer": "^3.0.11",
"vue": "^3.5.18",
"vue-router": "^4.5.1"
},
diff --git a/public/config.js b/public/config.js
index d3e1383..896640b 100644
--- a/public/config.js
+++ b/public/config.js
@@ -3,3 +3,7 @@ window.GD_KEYS = [
'ed2ea36f8564541569c370254845d93d',
'c1da03827f956a215311c0f5229bddc3',
]
+
+window.config = {
+ baseUrl: 'http://192.168.3.10:9121/',
+}
diff --git a/public/nav/index.js b/public/nav/index.js
index 296f6d5..7531f91 100644
--- a/public/nav/index.js
+++ b/public/nav/index.js
@@ -1,42 +1,40 @@
window.nav = {
header: [
- { id: 1, label: '首页', url: '/', hasChildren: false },
+ {id: 1, label: '首页', url: '/', hasChildren: false},
{
id: 2,
- label: '产品中心',
+ label: '解决方案',
url: '/product',
hasChildren: true,
children: [
{
id: 2.1,
- label: '低空监管体系',
+ label: '空域感知矩阵',
url: '/product/monitorSystem',
hasChildren: false,
},
{
id: 2.2,
- label: '低空远程识别设备',
+ label: '低空智控中枢',
url: '/product/remoteDevice',
hasChildren: false,
},
],
},
// {id: 3, label: '服务与支撑', url: '/services', hasChildren: false},
- { id: 4, label: '新闻中心', url: '/news', hasChildren: false },
- { id: 5, label: '关于我们', url: '/about', hasChildren: false },
- { id: 6, label: '联系我们', url: '/link', hasChildren: false },
+ {id: 4, label: '新闻中心', url: '/news', hasChildren: false},
+ {id: 5, label: '关于我们', url: '/about', hasChildren: false},
+ {id: 6, label: '联系我们', url: '/link', hasChildren: false},
],
footer: [
{
id: 1,
- label: '产品中心',
+ label: '解决方案',
url: '',
hasChildren: true,
children: [
- { id: 1.1, label: '低空监管体系', url: '/product/monitorSystem' },
- { id: 1.2, label: '低空远程识别设备', url: '/product/remoteDevice' },
- { id: 1.3, label: '智能加载服务', url: '/product' },
- { id: 1.4, label: '智能加载服务', url: '/product' },
+ {id: 1.1, label: '空域感知矩阵', url: '/product/monitorSystem'},
+ {id: 1.2, label: '低空智控中枢', url: '/product/remoteDevice'},
],
},
// {
@@ -51,15 +49,15 @@ window.nav = {
// url: '/download',
// hasChildren: false,
// },
- { id: 4, label: '新闻中心', url: '/news', hasChildren: false },
+ {id: 4, label: '新闻中心', url: '/news', hasChildren: false},
{
id: 5,
label: '关于燃谷',
url: '',
hasChildren: true,
children: [
- { id: 5.1, label: '公司简介', url: '/about' },
- { id: 5.2, label: '联系我们', url: '/link' },
+ {id: 5.1, label: '公司简介', url: '/about'},
+ {id: 5.2, label: '联系我们', url: '/link'},
],
},
],
diff --git a/public/static/images/product/1.png b/public/static/images/product/1.png
new file mode 100644
index 0000000..1d0f1db
Binary files /dev/null and b/public/static/images/product/1.png differ
diff --git a/public/static/images/product/2.png b/public/static/images/product/2.png
new file mode 100644
index 0000000..76d9fa2
Binary files /dev/null and b/public/static/images/product/2.png differ
diff --git a/public/static/images/product/3.png b/public/static/images/product/3.png
new file mode 100644
index 0000000..c238949
Binary files /dev/null and b/public/static/images/product/3.png differ
diff --git a/public/static/images/product/4.png b/public/static/images/product/4.png
new file mode 100644
index 0000000..ea9d9de
Binary files /dev/null and b/public/static/images/product/4.png differ
diff --git a/public/static/images/product/5.png b/public/static/images/product/5.png
new file mode 100644
index 0000000..44100c3
Binary files /dev/null and b/public/static/images/product/5.png differ
diff --git a/public/static/images/product/6.png b/public/static/images/product/6.png
new file mode 100644
index 0000000..cc401d2
Binary files /dev/null and b/public/static/images/product/6.png differ
diff --git a/public/static/images/product/7.png b/public/static/images/product/7.png
new file mode 100644
index 0000000..34778bb
Binary files /dev/null and b/public/static/images/product/7.png differ
diff --git a/public/static/images/product/8.png b/public/static/images/product/8.png
new file mode 100644
index 0000000..4e4ceda
Binary files /dev/null and b/public/static/images/product/8.png differ
diff --git a/public/static/images/product/detail/1.png b/public/static/images/product/detail/1.png
new file mode 100644
index 0000000..ca0ac82
Binary files /dev/null and b/public/static/images/product/detail/1.png differ
diff --git a/public/static/images/product/detail/4.png b/public/static/images/product/detail/4.png
new file mode 100644
index 0000000..2a66562
Binary files /dev/null and b/public/static/images/product/detail/4.png differ
diff --git a/public/static/images/product/detail/6.png b/public/static/images/product/detail/6.png
new file mode 100644
index 0000000..faff998
Binary files /dev/null and b/public/static/images/product/detail/6.png differ
diff --git a/src/api/device.js b/src/api/device.js
deleted file mode 100644
index 4635dd9..0000000
--- a/src/api/device.js
+++ /dev/null
@@ -1,19 +0,0 @@
-import request from '@/utils/request'
-
-// 设备设置
-export function deviceSet(data) {
- return request({
- url: '/rangu/rid/setting',
- method: 'post',
- data,
- })
-}
-
-// 设备设置
-export function deviceGet(params) {
- return request({
- url: '/rangu/rid/getting',
- method: 'get',
- params,
- })
-}
diff --git a/src/api/index.js b/src/api/index.js
new file mode 100644
index 0000000..6027946
--- /dev/null
+++ b/src/api/index.js
@@ -0,0 +1,10 @@
+import request from '@/utils/request'
+
+// 获取访问接口
+export function visit(data) {
+ return request({
+ url: '/tracking',
+ method: 'post',
+ data,
+ })
+}
diff --git a/src/components/icon/svgIcon.vue b/src/components/icon/svgIcon.vue
index 2ef1c25..11c0b81 100644
--- a/src/components/icon/svgIcon.vue
+++ b/src/components/icon/svgIcon.vue
@@ -2,7 +2,7 @@
使用:
-->
-
+
+
+
+
ID/无人机低空监管设备 无人机定位设备/无人机飞手定位设备/无人机侦测设备/Remote ID无人机远程识别模块 Remote
+
Remote ID无人机识别设备/符合GB-42590-2023/无人机远程识别发射模块 无人机远程识别设备/无人机RID/Remote
+
ID无人机远程识别广播模块/RID无人机识别/无人机飞手远程定位设备
+
无人机测距模块/无人机侦测监管设备/RID无人机识别/无人机定位器/无人机飞手定位器
+
无人机侦测定位设备/迷你无人机识别模块/低空经济无人机识别设备/单兵无人机侦测识别设备
+
无人机探测器/防撞机无人机定位设备/Remote ID无人机预警仪
+
全向无人机探测设备/无人机定位飞手定位设备/安防安保无人机监测设备/RID无人机识别/Remote ID远程识别模块
+
无人机侦测设备飞手定位飞行轨迹/UAV无线电侦测设备/无人机GPS GNSS定位设备
+
无人机RID广播识别模块/无人机探测飞手定位飞行轨迹/专业级无人机预警侦测设备 无人机航拍防撞设备/无人机Remote
+
ID国标定位侦测设备/低空安防无人机监管 无人机识别跟踪设备/RID无人机定位模块/Remote
+
ID无人机定位跟踪设备带飞手定位飞行轨迹 自主研发无人机侦测定位模块/Remote
+
ID无人机远程识别设备/飞机定位飞行轨迹飞手定位无人机识别模块源头厂家 无人机标签识别设备/Remote
+
+ ID无人机侦测定位设备/远程广播模块识别 无人机远程识别地面站/RID无人机识别/无人机巡检智能识别模块/无人机定位飞手定位
+
+
+
+
+
diff --git a/src/components/swiper/index.vue b/src/components/swiper/index.vue
index 40c23c8..09190a3 100644
--- a/src/components/swiper/index.vue
+++ b/src/components/swiper/index.vue
@@ -1,12 +1,5 @@
-
-
-
+
diff --git a/src/main.js b/src/main.js
index 29fe628..012a344 100644
--- a/src/main.js
+++ b/src/main.js
@@ -16,7 +16,7 @@ import '@/assets/styles/index.scss'
// ====================== 工具和组件 ======================
import {initRem, fontSize} from '@/utils/rem'
-import IconSvg from '_c/icon/svgIcon.vue'
+import IconSvg from '@/components/Icon/svgIcon.vue'
// SVG图标注册
import 'virtual:svg-icons-register'
diff --git a/src/router/index.js b/src/router/index.js
index bef4b84..77b7435 100644
--- a/src/router/index.js
+++ b/src/router/index.js
@@ -1,13 +1,13 @@
-import { createWebHashHistory, createRouter } from 'vue-router'
+import {createWebHashHistory, createRouter} from 'vue-router'
import HomeView from '@/views/homepage/index.vue'
const routes = [
- { path: '/', component: HomeView },
+ {path: '/', component: HomeView},
// ============================================ 产品中心 ============================================
{
path: '/product/monitorSystem',
- name: 'monitorSystem',
+ name: 'MonitorSystem',
component: () => import('@/views/product/monitorSystem.vue'),
meta: {
title: '低空监管体系',
@@ -15,12 +15,20 @@ const routes = [
},
{
path: '/product/remoteDevice',
- name: 'remoteDevice',
+ name: 'RemoteDevice',
component: () => import('@/views/product/remoteDevice.vue'),
meta: {
title: '低空远程识别设备',
},
},
+ {
+ path: '/product/detail',
+ name: 'ProductDetail',
+ component: () => import('@/views/product/detail.vue'),
+ meta: {
+ title: '产品详情',
+ },
+ },
// ============================================ 服务与支撑 ============================================
{
path: '/services',
@@ -41,7 +49,7 @@ const routes = [
},
{
path: '/news/detail',
- name: 'Detail',
+ name: 'NewsDetail',
component: () => import('@/views/news/detail.vue'),
meta: {
title: '新闻详情',
@@ -85,7 +93,7 @@ router.afterEach((to, from) => {
// 只有路径变化时才滚动到顶部
if (to.path !== from.path) {
requestAnimationFrame(() => {
- window.scrollTo({ top: 0, behavior: 'instant' })
+ window.scrollTo({top: 0, behavior: 'instant'})
})
}
})
diff --git a/src/utils/index.js b/src/utils/index.js
index 3eada4b..eacd95d 100644
--- a/src/utils/index.js
+++ b/src/utils/index.js
@@ -4,10 +4,7 @@
* @returns {number} 自适应后的尺寸
*/
export function fontSize(res) {
- let clientWidth =
- window.innerWidth ||
- document.documentElement.clientWidth ||
- document.body.clientWidth
+ let clientWidth = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth
if (!clientWidth) return
let fontSize = clientWidth / 1920
return res * fontSize
@@ -34,3 +31,45 @@ export function randomBgColor(type = 'hex') {
.padStart(6, '0')
)
}
+
+/**
+ * 根据 url 递归查找对应的 label
+ * @param {Array} tree - header 数组
+ * @param {String} path - 要匹配的 url
+ * @returns {String|undefined} 找到返回 label,否则 undefined
+ */
+export function findLabelByUrl(tree, path) {
+ for (const node of tree) {
+ if (node.url === path) return node.label
+ if (node.hasChildren && node.children) {
+ const child = findLabelByUrl(node.children, path)
+ if (child) return child
+ }
+ }
+}
+
+/**
+ * get参数处理
+ * @param {*} params 参数
+ */
+export function tansParams(params) {
+ let result = ''
+ for (const propName of Object.keys(params)) {
+ const value = params[propName]
+ const part = `${encodeURIComponent(propName)}=`
+ if (value !== null && typeof value !== 'undefined') {
+ if (typeof value === 'object') {
+ for (const key of Object.keys(value)) {
+ if (value[key] !== null && typeof value[key] !== 'undefined') {
+ const params = `${propName}[${key}]`
+ const subPart = `${encodeURIComponent(params)}=`
+ result += `${subPart + encodeURIComponent(value[key])}&`
+ }
+ }
+ } else {
+ result += `${part + encodeURIComponent(value)}&`
+ }
+ }
+ }
+ return result
+}
diff --git a/src/utils/request.js b/src/utils/request.js
index 630276b..421dd92 100644
--- a/src/utils/request.js
+++ b/src/utils/request.js
@@ -50,10 +50,7 @@ service.interceptors.response.use(
const {data, config} = response
// 处理二进制数据响应
- if (
- config.responseType === 'blob' ||
- config.responseType === 'arraybuffer'
- ) {
+ if (config.responseType === 'blob' || config.responseType === 'arraybuffer') {
return data
}
@@ -90,15 +87,11 @@ function handleAuthError(config, response) {
const excludeUrls = ['/Token/Logout', '/Token/Access']
if (!excludeUrls.includes(config.url)) {
- ElMessageBox.confirm(
- '登录状态已过期,您可以继续留在该页面,或者重新登录',
- '系统提示',
- {
- confirmButtonText: '重新登录',
- cancelButtonText: '取消',
- type: 'warning',
- }
- )
+ ElMessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', {
+ confirmButtonText: '重新登录',
+ cancelButtonText: '取消',
+ type: 'warning',
+ })
.then(() => {
removeToken()
removeUserTenantInfo()
@@ -127,7 +120,7 @@ function handleNetworkError(message) {
ElMessage({
message: errorMsg,
type: 'error',
- duration: 5 * 1000,
+ duration: 1000,
})
}
diff --git a/src/views/edit/index.vue b/src/views/edit/index.vue
new file mode 100644
index 0000000..e69de29
diff --git a/src/views/homepage/index.vue b/src/views/homepage/index.vue
index 617c45a..f4c3d8b 100644
--- a/src/views/homepage/index.vue
+++ b/src/views/homepage/index.vue
@@ -10,7 +10,7 @@ onMounted(() => {})
@@ -38,7 +38,7 @@ onMounted(() => {})
.page {
.banner {
width: 100%;
- height: auto;
+ height: 100%;
position: relative;
background-color: #333333;
&-link {
@@ -65,10 +65,10 @@ onMounted(() => {})
color: $white;
}
}
- video{
+ video {
padding: 3px;
- width: 100%;
- height: 100%;
+ width: 100%;
+ height: 100%;
border-radius: 8px;
}
}
diff --git a/src/views/layout/pc/footer/components/QRCode.vue b/src/views/layout/pc/footer/components/QRCode.vue
index 4359b58..21c5d3c 100644
--- a/src/views/layout/pc/footer/components/QRCode.vue
+++ b/src/views/layout/pc/footer/components/QRCode.vue
@@ -11,7 +11,7 @@ onMounted(() => {})
![]()
-
熊雨翔
+
市场联系人
@@ -20,9 +20,9 @@ onMounted(() => {})
.QR-code {
width: 100%;
height: 100%;
- display: flex;
- justify-content: center;
- gap: 20px;
+ display: flex;
+ justify-content: center;
+ gap: 20px;
.QR-dev {
width: 150px;
height: 200px;
diff --git a/src/views/layout/pc/header/nav.vue b/src/views/layout/pc/header/nav.vue
index 8897551..f3fd612 100644
--- a/src/views/layout/pc/header/nav.vue
+++ b/src/views/layout/pc/header/nav.vue
@@ -9,7 +9,7 @@ const {navIndex} = storeToRefs(navStore)
// 响应式数据
const navList = ref([])
-const activeIndex = ref(null)
+const activeIndex = ref('/')
// 处理导航选择
const handleSelect = (key) => {
diff --git a/src/views/news/detail.vue b/src/views/news/detail.vue
index 9daef8e..77d5200 100644
--- a/src/views/news/detail.vue
+++ b/src/views/news/detail.vue
@@ -5,9 +5,7 @@ import {useRoute, useRouter} from 'vue-router'
import {newsDetail} from './mock'
const route = useRoute()
-
const detail = route.query
-
detail.artical = newsDetail.find((item) => item.id == route.query.id).article
const router = useRouter()
diff --git a/src/views/product/description.js b/src/views/product/description.js
new file mode 100644
index 0000000..029cb97
--- /dev/null
+++ b/src/views/product/description.js
@@ -0,0 +1,63 @@
+export const advantages = `
+ ★ 提供业界领先的性价比解决方案。
+ ★ 内置4G全网通,无需外接网络,即装即用。
+ ★ 宽电压输入,轻松应对电压不稳等复杂情况。
+ ★ 超低功耗设计,极大节约长期用电与运维成本。
+ ★ 极致轻量,极大拓宽了安装位置与应用场景。
+ ★ 灵活可调的侦测模式,满足从安防到巡检的全场景需求。
+ ★ 具备升级能力,当前投资可平滑演进至更高专业层级。
+ `
+
+export const monitorSystemList = [
+ {
+ id: 1,
+ description: `
+ RGRID-Lite 是一款专为国标无人机远程识别设计的地面监测设备。它能够精准获取低空目标区域内无人机的实时位置、飞手位置、唯一SN识别码等关键信息,并动态显示与记录无人机及飞手的移动轨迹。所有数据实时上传至后台系统,支持长期存储与便捷回溯,为空域监管提供完整的数据支撑。
+ 设备采用轻量化与一体化设计,部署灵活,可快速适配多种复杂安装环境。凭借超低功耗特性,可搭配UPS不间断电源或太阳能供电系统,实现长时间稳定运行。同时,内置4G全网通模块,无需依赖外部网络,彻底解决供电与传输难题。
+ RGRID-Lite 在具备卓越性能的同时,展现出优异的性价比,广泛适用于各类低空监管场景。设备支持功能定制与二次开发,可根据用户需求灵活扩展,是构建低成本、高效率无人机监管体系的理想之选。
+ `,
+ },
+ {
+ id: 2,
+ description: `
+ RGRID-Ped 是一款遵循国标GB42590-2023的便携式无人机远程识别模块。它能够精准监测并获取目标空域内无人机的多项关键数据,包括实时位置、飞手位置、唯一SN识别码、飞行型号、航速与高度等,并实时推送至用户平台。
+ 该模块采用高度集成化设计,体积小巧、功耗极低,具备完善的接口与通信协议,可快速适配并嵌入各类无人机反制、监管或作业设备中,轻松应对有限的内部空间要求。同时,模块支持全方位的二次开发与功能定制,为各类集成应用提供可靠、灵活的低空感知核心。
+ `,
+ },
+ {
+ id: 3,
+ description: `
+ RGRID-Mob 是一款符合国标 GB42590-2023 的便携式无人机远程识别设备,专为机动巡检与快速部署场景设计。它可精准监测目标空域内无人机的实时位置、飞手位置、唯一SN识别码等关键信息,并实时显示与记录无人机与飞手的动态轨迹。所有数据同步上传至后台,支持长期存储与灵活调阅,为空域执法与现场处置提供完整信息支撑。
+ 设备支持多终端协同管理,用户可通过移动端小程序实时查看数据,指挥中心亦能通过大屏系统统览全局。系统具备分级权限管理功能,支持多级账户与设备组网,实现权限分离与协同指挥。手机端集成一键导航功能,可快速定位飞手位置;指挥平台则全面监管辖区内所有设备状态与每架被侦测无人机的详细数据,真正实现“前端机动侦测—后端统一指挥”的一体化管控闭环。
+ RGRID-Mob 重量轻、体积小,可随身挂载,便于野外作业与快速机动。内置4G数据传输模块,开机即用,无需复杂配对,极大提升部署效率与操作便捷性,是应对突发低空监管任务的理想移动侦测终端。
+ `,
+ },
+]
+
+export const remoteDeviceList = [
+ {
+ id: 1,
+ description: `多模态数据融合:直面不同侦测设备的数据壁垒,凭借自研融合算法,呈现深度可靠的全局态势。
+ 体系化平台搭配:作为中枢神经,无缝对接与总览旗下各类专业平台,奠定一站式服务基石。
`,
+ },
+ {
+ id: 2,
+ description: ` 大量设备接入经验:具备广泛的设备兼容性,确保监管网络覆盖无死角。
+ SAAS化架构:支持多租户权限管理,满足不同区域、不同层级管理单位的独立运营与协同监管需求。
`,
+ },
+ {
+ id: 3,
+ description: `大量行业内接入经验:预集成了众多厂商设备接口,极大降低了系统集成难度与成本,体现了卓越的性价比。
+ 体系化平台搭配:与监管平台无缝联动,接收预警并执行指令,形成“侦-识-控”一体的完整闭环。
`,
+ },
+ {
+ id: 4,
+ description: `多模态数据融合:将飞行数据、视频流与AI识别结果深度融合,输出可直接应用的业务洞察。
+ SAAS化架构:支持多团队、多项目并行作业与数据隔离,轻松管理大规模机队。
`,
+ },
+ {
+ id: 5,
+ description: ` 体系化平台搭配:与真实监管平台联动,是“一站式服务”中用于模拟、预测与优化的关键一环。
+ 多模态数据融合:将真实地理信息、仿真数据与实时监管流融合,在虚拟空间中复现最真实的低空场景。
`,
+ },
+]
diff --git a/src/views/product/detail.vue b/src/views/product/detail.vue
new file mode 100644
index 0000000..2cfe1d0
--- /dev/null
+++ b/src/views/product/detail.vue
@@ -0,0 +1,98 @@
+
+
+
+
+
{{ detail.title }} {{ detail.subTitle }}
+
+
+
![]()
+
+
+
+
+
+
+
+
+
+
返回
+
+
+
+
diff --git a/src/views/product/monitorSystem.vue b/src/views/product/monitorSystem.vue
index 2f2baec..c7e694e 100644
--- a/src/views/product/monitorSystem.vue
+++ b/src/views/product/monitorSystem.vue
@@ -1,11 +1,43 @@
@@ -13,55 +45,46 @@ onMounted(() => {})
-
-
{{ item }}
-
-
-
-
-
-
-
{{ item }}
-
-
-
-
-
-
-
{{ item }}
+
+
+
{{ item.title }}
+
{{ item.subTitle }}
+
+
+
+
+
diff --git a/src/views/product/project.vue b/src/views/product/project.vue
new file mode 100644
index 0000000..c548cc9
--- /dev/null
+++ b/src/views/product/project.vue
@@ -0,0 +1,95 @@
+
+
+
+
+
+
+
+
+
+
{{ img.label }}
+
![]()
+
+
+
+
+
+
+
+
+
diff --git a/src/views/product/remoteDevice.vue b/src/views/product/remoteDevice.vue
index 2f2baec..9a1283d 100644
--- a/src/views/product/remoteDevice.vue
+++ b/src/views/product/remoteDevice.vue
@@ -1,11 +1,45 @@
@@ -13,46 +47,23 @@ onMounted(() => {})
-
-
{{ item }}
-
-
-
-
-
-
-
{{ item }}
-
-
-
-
-
-
-
{{ item }}
+
@@ -60,8 +71,21 @@ onMounted(() => {})