diff --git a/package-lock.json b/package-lock.json
index fe03b36..6b22e3e 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -15,6 +15,7 @@
"pinia": "^2.1.7",
"vue": "^3.4.21",
"vue-draggable-plus": "^0.4.1",
+ "vue-grid-layout-v3": "^3.1.2",
"vue-i18n": "^9.10.2",
"vue-router": "^4.3.0",
"vuetify": "^3.6.5"
@@ -274,6 +275,102 @@
"integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==",
"dev": true
},
+ "node_modules/@interactjs/actions": {
+ "version": "1.10.27",
+ "resolved": "https://registry.npmjs.org/@interactjs/actions/-/actions-1.10.27.tgz",
+ "integrity": "sha512-FCRg5KwB+stkPcAMx/Cn0fgGP6p4LyMX9S/Upcn/W+hpYme31bPi54PCqmOebzz6myTthN6zFf9jMyLOqtI/gg==",
+ "optionalDependencies": {
+ "@interactjs/interact": "1.10.27"
+ },
+ "peerDependencies": {
+ "@interactjs/core": "1.10.27",
+ "@interactjs/utils": "1.10.27"
+ }
+ },
+ "node_modules/@interactjs/auto-scroll": {
+ "version": "1.10.27",
+ "resolved": "https://registry.npmjs.org/@interactjs/auto-scroll/-/auto-scroll-1.10.27.tgz",
+ "integrity": "sha512-zPg5TnVsZv+9Hnt4qnbxLvBMf+rIWHkoJVoSETEbLNaj90C8hIyr0pVwukSUySSgDhCgQ7np0f3pg4INLq9beQ==",
+ "optionalDependencies": {
+ "@interactjs/interact": "1.10.27"
+ },
+ "peerDependencies": {
+ "@interactjs/utils": "1.10.27"
+ }
+ },
+ "node_modules/@interactjs/auto-start": {
+ "version": "1.10.27",
+ "resolved": "https://registry.npmjs.org/@interactjs/auto-start/-/auto-start-1.10.27.tgz",
+ "integrity": "sha512-ECLBO/nxmaF1knncJKIE5F7la3KKRgEkn0Cu2JTPOYj9xy/LpfYElo3wkRHsodgOqF651nR70GK2/IzPR2lO9A==",
+ "optionalDependencies": {
+ "@interactjs/interact": "1.10.27"
+ },
+ "peerDependencies": {
+ "@interactjs/core": "1.10.27",
+ "@interactjs/utils": "1.10.27"
+ }
+ },
+ "node_modules/@interactjs/core": {
+ "version": "1.10.27",
+ "resolved": "https://registry.npmjs.org/@interactjs/core/-/core-1.10.27.tgz",
+ "integrity": "sha512-SliUr/3ZbLAdED8LokzYzWHWMdCB5Cq+UnpXuRy+BIod1j97m4IUFf/D1iIKUBBjBcucgXbz28z96WnenVCB7Q==",
+ "peerDependencies": {
+ "@interactjs/utils": "1.10.27"
+ }
+ },
+ "node_modules/@interactjs/dev-tools": {
+ "version": "1.10.27",
+ "resolved": "https://registry.npmjs.org/@interactjs/dev-tools/-/dev-tools-1.10.27.tgz",
+ "integrity": "sha512-YolmBwRaKH1gWbvyLeV3m5QSwtD38lOZnCBA87PCAlcd9PQAC2gb03fEPeEyD336bE20oLB8f0WZt4Wre+afiw==",
+ "optionalDependencies": {
+ "@interactjs/interact": "1.10.27",
+ "vue": "3"
+ },
+ "peerDependencies": {
+ "@interactjs/modifiers": "1.10.27",
+ "@interactjs/utils": "1.10.27"
+ }
+ },
+ "node_modules/@interactjs/interact": {
+ "version": "1.10.27",
+ "resolved": "https://registry.npmjs.org/@interactjs/interact/-/interact-1.10.27.tgz",
+ "integrity": "sha512-XdH3A2UUzjEFGGJgFuJlhiz99tE8jB8xNh/DmnoMuL6uOQPxNA+sWRnzEVjG0+zY2P3/dbhEpi4Cn3FLPzydwA==",
+ "dependencies": {
+ "@interactjs/core": "1.10.27",
+ "@interactjs/utils": "1.10.27"
+ }
+ },
+ "node_modules/@interactjs/modifiers": {
+ "version": "1.10.27",
+ "resolved": "https://registry.npmjs.org/@interactjs/modifiers/-/modifiers-1.10.27.tgz",
+ "integrity": "sha512-ei/qfoQ+9/8k6WzNzdNqHI6cWkIV576N4Ap16r5CoqOWwhA6Xzj3OMHf1g0t1O4eSq2HdJsVJn3eLNfw9HsbeQ==",
+ "dependencies": {
+ "@interactjs/snappers": "1.10.27"
+ },
+ "optionalDependencies": {
+ "@interactjs/interact": "1.10.27"
+ },
+ "peerDependencies": {
+ "@interactjs/core": "1.10.27",
+ "@interactjs/utils": "1.10.27"
+ }
+ },
+ "node_modules/@interactjs/snappers": {
+ "version": "1.10.27",
+ "resolved": "https://registry.npmjs.org/@interactjs/snappers/-/snappers-1.10.27.tgz",
+ "integrity": "sha512-HZLZ0XSi6HI08OmTv/HKG6AltQoaKAALLQ+KDW92utj3XSgw7oren0KsWUKPhaPg3Av7R1jFQd08s+uafqIlLw==",
+ "optionalDependencies": {
+ "@interactjs/interact": "1.10.27"
+ },
+ "peerDependencies": {
+ "@interactjs/utils": "1.10.27"
+ }
+ },
+ "node_modules/@interactjs/utils": {
+ "version": "1.10.27",
+ "resolved": "https://registry.npmjs.org/@interactjs/utils/-/utils-1.10.27.tgz",
+ "integrity": "sha512-+qfLOio2OxQqg1cXSnRaCl+N8MQDQLDS9w+aOGxH8YLAhIMyt7Asxx/46//sT8orgsi16pmlBPtngPHT9s8zKw=="
+ },
"node_modules/@intlify/core-base": {
"version": "9.10.2",
"resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.10.2.tgz",
@@ -1436,6 +1533,11 @@
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
"dev": true
},
+ "node_modules/batch-processor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/batch-processor/-/batch-processor-1.0.0.tgz",
+ "integrity": "sha512-xoLQD8gmmR32MeuBHgH0Tzd5PuSZx71ZsbhVxOCRbgktZEPe4SQy7s9Z50uPp0F/f7iw2XmkHN2xkgbMfckMDA=="
+ },
"node_modules/binary-extensions": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
@@ -2098,6 +2200,14 @@
}
}
},
+ "node_modules/element-resize-detector": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/element-resize-detector/-/element-resize-detector-1.2.4.tgz",
+ "integrity": "sha512-Fl5Ftk6WwXE0wqCgNoseKWndjzZlDCwuPTcoVZfCP9R3EHQF8qUtr3YUPNETegRBOKqQKPW3n4kiIWngGi8tKg==",
+ "dependencies": {
+ "batch-processor": "1.0.0"
+ }
+ },
"node_modules/emoji-regex": {
"version": "9.2.2",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
@@ -5114,6 +5224,21 @@
"eslint": ">=6.0.0"
}
},
+ "node_modules/vue-grid-layout-v3": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/vue-grid-layout-v3/-/vue-grid-layout-v3-3.1.2.tgz",
+ "integrity": "sha512-4VB6pel2OklFNnFSUVg4wXwx/fKuKKvnhleLyscwk5ay7aEFk+HghcVKbComg+EgMvjuPzZ7hgIES3FlxuVK6w==",
+ "dependencies": {
+ "@interactjs/actions": "^1.10.27",
+ "@interactjs/auto-scroll": "^1.10.27",
+ "@interactjs/auto-start": "^1.10.27",
+ "@interactjs/dev-tools": "^1.10.27",
+ "@interactjs/interact": "^1.10.27",
+ "@interactjs/modifiers": "^1.10.27",
+ "element-resize-detector": "^1.2.4",
+ "mitt": "^3.0.1"
+ }
+ },
"node_modules/vue-i18n": {
"version": "9.10.2",
"resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.10.2.tgz",
diff --git a/package.json b/package.json
index de3bf70..4564802 100644
--- a/package.json
+++ b/package.json
@@ -23,6 +23,7 @@
"pinia": "^2.1.7",
"vue": "^3.4.21",
"vue-draggable-plus": "^0.4.1",
+ "vue-grid-layout-v3": "^3.1.2",
"vue-i18n": "^9.10.2",
"vue-router": "^4.3.0",
"vuetify": "^3.6.5"
diff --git a/src/locales/en.ts b/src/locales/en.ts
index fab8bfc..640aeee 100644
--- a/src/locales/en.ts
+++ b/src/locales/en.ts
@@ -37,6 +37,7 @@ export default {
wifi: "Wi-Fi",
about: "About",
uart: "Uart",
+ at: "AT Command",
feedback: "Feedback",
close: "Close",
update: "Update",
diff --git a/src/locales/fr.ts b/src/locales/fr.ts
index d3d43fb..8daba3d 100644
--- a/src/locales/fr.ts
+++ b/src/locales/fr.ts
@@ -37,6 +37,7 @@ export default {
wifi: "Wi-Fi",
about: "À propos",
uart: "Uart",
+ at: "Commande AT",
feedback: "Feedback",
close: "Fermer",
update: "Mise à jour",
diff --git a/src/locales/zh.ts b/src/locales/zh.ts
index 74d2c1b..ce1e502 100644
--- a/src/locales/zh.ts
+++ b/src/locales/zh.ts
@@ -37,6 +37,7 @@ export default {
wifi: "Wi-Fi",
about: "关于",
uart: "UART",
+ at: "AT命令",
feedback: "反馈",
close: "关闭",
update: "更新",
diff --git a/src/router/index.ts b/src/router/index.ts
index 06b7b01..a08ad0d 100644
--- a/src/router/index.ts
+++ b/src/router/index.ts
@@ -5,6 +5,7 @@ import About from '@/views/About.vue'
import Uart from '@/views/Uart.vue'
import Page404 from '@/views/404.vue'
import Update from '@/views/Update.vue'
+import AtCommand from '@/views/AtCommand.vue'
import {translate} from "@/locales";
import {isOTAEnabled} from "@/composables/buildMode";
import {reactive, watch} from "vue";
@@ -66,6 +67,10 @@ const router = createRouter({
path: '/uart:ext(.*)',
meta: { titleKey: 'page.uart' },
component: Uart,
+ }, {
+ path: '/at:ext(.*)',
+ meta: { titleKey: 'page.at' },
+ component: AtCommand,
}, {
path: '/feedback:ext(.*)',
meta: { titleKey: 'page.feedback' },
diff --git a/src/views/AtCommand.vue b/src/views/AtCommand.vue
new file mode 100644
index 0000000..3572375
--- /dev/null
+++ b/src/views/AtCommand.vue
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/views/navigation/NavBar.vue b/src/views/navigation/NavBar.vue
index d8cb1d2..58f6ca4 100644
--- a/src/views/navigation/NavBar.vue
+++ b/src/views/navigation/NavBar.vue
@@ -194,11 +194,14 @@ const menuItems: ComputedRef- = computed(() => ([
const sideBarItems: ComputedRef
- = computed(() => {
const items: Item[] = [
{
+ name: translate("page.wifi"),
+ href: "/wifi",
+ }, {
name: translate("page.uart"),
href: "/uart",
}, {
- name: translate("page.wifi"),
- href: "/wifi",
+ name: translate("page.at"),
+ href: "/at",
}, {
name: translate("page.about"),
href: "/about",