前端三个页面的连接

main
chantouRichard 2 months ago
parent 1e0cb425f1
commit de19873c67

@ -5,7 +5,7 @@ spring:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/wx_miniapp?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
username: root
password: 1234
password: 123456
mybatis:
mapper-locations: classpath:mapper/*.xml

@ -5,7 +5,7 @@ spring:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/wx_miniapp?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
username: root
password: 1234
password: 123456
mybatis:
mapper-locations: classpath:mapper/*.xml

@ -23,7 +23,8 @@
"@dcloudio/uni-mp-weixin": "3.0.0-4040520250104002",
"@dcloudio/uni-mp-xhs": "3.0.0-4040520250104002",
"@dcloudio/uni-quickapp-webview": "3.0.0-4040520250104002",
"vue": "^3.4.21",
"pinia": "^3.0.2",
"vue": "^3.5.15",
"vue-i18n": "^9.1.9"
},
"devDependencies": {
@ -306,14 +307,18 @@
}
},
"node_modules/@babel/helper-string-parser": {
"version": "7.25.9",
"version": "7.27.1",
"resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
"integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
"license": "MIT",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-validator-identifier": {
"version": "7.25.9",
"version": "7.27.1",
"resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz",
"integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==",
"license": "MIT",
"engines": {
"node": ">=6.9.0"
@ -340,10 +345,12 @@
}
},
"node_modules/@babel/parser": {
"version": "7.27.0",
"version": "7.27.2",
"resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.27.2.tgz",
"integrity": "sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw==",
"license": "MIT",
"dependencies": {
"@babel/types": "^7.27.0"
"@babel/types": "^7.27.1"
},
"bin": {
"parser": "bin/babel-parser.js"
@ -1563,13 +1570,13 @@
}
},
"node_modules/@babel/types": {
"version": "7.27.0",
"resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.27.0.tgz",
"integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==",
"version": "7.27.1",
"resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.27.1.tgz",
"integrity": "sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==",
"license": "MIT",
"dependencies": {
"@babel/helper-string-parser": "^7.25.9",
"@babel/helper-validator-identifier": "^7.25.9"
"@babel/helper-string-parser": "^7.27.1",
"@babel/helper-validator-identifier": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
@ -1758,6 +1765,52 @@
"node": "^14.18.0 || >=16.0.0"
}
},
"node_modules/@dcloudio/uni-cli-shared/node_modules/@vue/reactivity": {
"version": "3.4.21",
"resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.4.21.tgz",
"integrity": "sha512-UhenImdc0L0/4ahGCyEzc/pZNwVgcglGy9HVzJ1Bq2Mm9qXOpP8RyNTjookw/gOCUlXSEtuZ2fUg5nrHcoqJcw==",
"license": "MIT",
"peer": true,
"dependencies": {
"@vue/shared": "3.4.21"
}
},
"node_modules/@dcloudio/uni-cli-shared/node_modules/@vue/runtime-core": {
"version": "3.4.21",
"resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.4.21.tgz",
"integrity": "sha512-pQthsuYzE1XcGZznTKn73G0s14eCJcjaLvp3/DKeYWoFacD9glJoqlNBxt3W2c5S40t6CCcpPf+jG01N3ULyrA==",
"license": "MIT",
"peer": true,
"dependencies": {
"@vue/reactivity": "3.4.21",
"@vue/shared": "3.4.21"
}
},
"node_modules/@dcloudio/uni-cli-shared/node_modules/@vue/runtime-dom": {
"version": "3.4.21",
"resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.4.21.tgz",
"integrity": "sha512-gvf+C9cFpevsQxbkRBS1NpU8CqxKw0ebqMvLwcGQrNpx6gqRDodqKqA+A2VZZpQ9RpK2f9yfg8VbW/EpdFUOJw==",
"license": "MIT",
"peer": true,
"dependencies": {
"@vue/runtime-core": "3.4.21",
"@vue/shared": "3.4.21",
"csstype": "^3.1.3"
}
},
"node_modules/@dcloudio/uni-cli-shared/node_modules/@vue/server-renderer": {
"version": "3.4.21",
"resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.4.21.tgz",
"integrity": "sha512-aV1gXyKSN6Rz+6kZ6kr5+Ll14YzmIbeuWe7ryJl5muJ4uwSwY/aStXTixx76TwkZFJLm1aAlA/HSWEJ4EyiMkg==",
"license": "MIT",
"dependencies": {
"@vue/compiler-ssr": "3.4.21",
"@vue/shared": "3.4.21"
},
"peerDependencies": {
"vue": "3.4.21"
}
},
"node_modules/@dcloudio/uni-cli-shared/node_modules/brace-expansion": {
"version": "2.0.1",
"license": "MIT",
@ -1824,6 +1877,28 @@
}
}
},
"node_modules/@dcloudio/uni-cli-shared/node_modules/vue": {
"version": "3.4.21",
"resolved": "https://registry.npmmirror.com/vue/-/vue-3.4.21.tgz",
"integrity": "sha512-5hjyV/jLEIKD/jYl4cavMcnzKwjMKohureP8ejn3hhEjwhWIhWeuzL2kJAjzl/WyVsgPY56Sy4Z40C3lVshxXA==",
"license": "MIT",
"peer": true,
"dependencies": {
"@vue/compiler-dom": "3.4.21",
"@vue/compiler-sfc": "3.4.21",
"@vue/runtime-dom": "3.4.21",
"@vue/server-renderer": "3.4.21",
"@vue/shared": "3.4.21"
},
"peerDependencies": {
"typescript": "*"
},
"peerDependenciesMeta": {
"typescript": {
"optional": true
}
}
},
"node_modules/@dcloudio/uni-cloud": {
"version": "3.0.0-4040520250104002",
"license": "Apache-2.0",
@ -1886,6 +1961,74 @@
"module-alias": "^2.2.2"
}
},
"node_modules/@dcloudio/uni-h5-vite/node_modules/@vue/reactivity": {
"version": "3.4.21",
"resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.4.21.tgz",
"integrity": "sha512-UhenImdc0L0/4ahGCyEzc/pZNwVgcglGy9HVzJ1Bq2Mm9qXOpP8RyNTjookw/gOCUlXSEtuZ2fUg5nrHcoqJcw==",
"license": "MIT",
"peer": true,
"dependencies": {
"@vue/shared": "3.4.21"
}
},
"node_modules/@dcloudio/uni-h5-vite/node_modules/@vue/runtime-core": {
"version": "3.4.21",
"resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.4.21.tgz",
"integrity": "sha512-pQthsuYzE1XcGZznTKn73G0s14eCJcjaLvp3/DKeYWoFacD9glJoqlNBxt3W2c5S40t6CCcpPf+jG01N3ULyrA==",
"license": "MIT",
"peer": true,
"dependencies": {
"@vue/reactivity": "3.4.21",
"@vue/shared": "3.4.21"
}
},
"node_modules/@dcloudio/uni-h5-vite/node_modules/@vue/runtime-dom": {
"version": "3.4.21",
"resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.4.21.tgz",
"integrity": "sha512-gvf+C9cFpevsQxbkRBS1NpU8CqxKw0ebqMvLwcGQrNpx6gqRDodqKqA+A2VZZpQ9RpK2f9yfg8VbW/EpdFUOJw==",
"license": "MIT",
"peer": true,
"dependencies": {
"@vue/runtime-core": "3.4.21",
"@vue/shared": "3.4.21",
"csstype": "^3.1.3"
}
},
"node_modules/@dcloudio/uni-h5-vite/node_modules/@vue/server-renderer": {
"version": "3.4.21",
"resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.4.21.tgz",
"integrity": "sha512-aV1gXyKSN6Rz+6kZ6kr5+Ll14YzmIbeuWe7ryJl5muJ4uwSwY/aStXTixx76TwkZFJLm1aAlA/HSWEJ4EyiMkg==",
"license": "MIT",
"dependencies": {
"@vue/compiler-ssr": "3.4.21",
"@vue/shared": "3.4.21"
},
"peerDependencies": {
"vue": "3.4.21"
}
},
"node_modules/@dcloudio/uni-h5-vite/node_modules/vue": {
"version": "3.4.21",
"resolved": "https://registry.npmmirror.com/vue/-/vue-3.4.21.tgz",
"integrity": "sha512-5hjyV/jLEIKD/jYl4cavMcnzKwjMKohureP8ejn3hhEjwhWIhWeuzL2kJAjzl/WyVsgPY56Sy4Z40C3lVshxXA==",
"license": "MIT",
"peer": true,
"dependencies": {
"@vue/compiler-dom": "3.4.21",
"@vue/compiler-sfc": "3.4.21",
"@vue/runtime-dom": "3.4.21",
"@vue/server-renderer": "3.4.21",
"@vue/shared": "3.4.21"
},
"peerDependencies": {
"typescript": "*"
},
"peerDependenciesMeta": {
"typescript": {
"optional": true
}
}
},
"node_modules/@dcloudio/uni-h5-vue": {
"version": "3.0.0-4040520250104002",
"license": "Apache-2.0",
@ -1894,6 +2037,142 @@
"@vue/server-renderer": "3.4.21"
}
},
"node_modules/@dcloudio/uni-h5-vue/node_modules/@vue/reactivity": {
"version": "3.4.21",
"resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.4.21.tgz",
"integrity": "sha512-UhenImdc0L0/4ahGCyEzc/pZNwVgcglGy9HVzJ1Bq2Mm9qXOpP8RyNTjookw/gOCUlXSEtuZ2fUg5nrHcoqJcw==",
"license": "MIT",
"peer": true,
"dependencies": {
"@vue/shared": "3.4.21"
}
},
"node_modules/@dcloudio/uni-h5-vue/node_modules/@vue/runtime-core": {
"version": "3.4.21",
"resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.4.21.tgz",
"integrity": "sha512-pQthsuYzE1XcGZznTKn73G0s14eCJcjaLvp3/DKeYWoFacD9glJoqlNBxt3W2c5S40t6CCcpPf+jG01N3ULyrA==",
"license": "MIT",
"peer": true,
"dependencies": {
"@vue/reactivity": "3.4.21",
"@vue/shared": "3.4.21"
}
},
"node_modules/@dcloudio/uni-h5-vue/node_modules/@vue/runtime-dom": {
"version": "3.4.21",
"resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.4.21.tgz",
"integrity": "sha512-gvf+C9cFpevsQxbkRBS1NpU8CqxKw0ebqMvLwcGQrNpx6gqRDodqKqA+A2VZZpQ9RpK2f9yfg8VbW/EpdFUOJw==",
"license": "MIT",
"peer": true,
"dependencies": {
"@vue/runtime-core": "3.4.21",
"@vue/shared": "3.4.21",
"csstype": "^3.1.3"
}
},
"node_modules/@dcloudio/uni-h5-vue/node_modules/@vue/server-renderer": {
"version": "3.4.21",
"resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.4.21.tgz",
"integrity": "sha512-aV1gXyKSN6Rz+6kZ6kr5+Ll14YzmIbeuWe7ryJl5muJ4uwSwY/aStXTixx76TwkZFJLm1aAlA/HSWEJ4EyiMkg==",
"license": "MIT",
"dependencies": {
"@vue/compiler-ssr": "3.4.21",
"@vue/shared": "3.4.21"
},
"peerDependencies": {
"vue": "3.4.21"
}
},
"node_modules/@dcloudio/uni-h5-vue/node_modules/vue": {
"version": "3.4.21",
"resolved": "https://registry.npmmirror.com/vue/-/vue-3.4.21.tgz",
"integrity": "sha512-5hjyV/jLEIKD/jYl4cavMcnzKwjMKohureP8ejn3hhEjwhWIhWeuzL2kJAjzl/WyVsgPY56Sy4Z40C3lVshxXA==",
"license": "MIT",
"peer": true,
"dependencies": {
"@vue/compiler-dom": "3.4.21",
"@vue/compiler-sfc": "3.4.21",
"@vue/runtime-dom": "3.4.21",
"@vue/server-renderer": "3.4.21",
"@vue/shared": "3.4.21"
},
"peerDependencies": {
"typescript": "*"
},
"peerDependenciesMeta": {
"typescript": {
"optional": true
}
}
},
"node_modules/@dcloudio/uni-h5/node_modules/@vue/reactivity": {
"version": "3.4.21",
"resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.4.21.tgz",
"integrity": "sha512-UhenImdc0L0/4ahGCyEzc/pZNwVgcglGy9HVzJ1Bq2Mm9qXOpP8RyNTjookw/gOCUlXSEtuZ2fUg5nrHcoqJcw==",
"license": "MIT",
"peer": true,
"dependencies": {
"@vue/shared": "3.4.21"
}
},
"node_modules/@dcloudio/uni-h5/node_modules/@vue/runtime-core": {
"version": "3.4.21",
"resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.4.21.tgz",
"integrity": "sha512-pQthsuYzE1XcGZznTKn73G0s14eCJcjaLvp3/DKeYWoFacD9glJoqlNBxt3W2c5S40t6CCcpPf+jG01N3ULyrA==",
"license": "MIT",
"peer": true,
"dependencies": {
"@vue/reactivity": "3.4.21",
"@vue/shared": "3.4.21"
}
},
"node_modules/@dcloudio/uni-h5/node_modules/@vue/runtime-dom": {
"version": "3.4.21",
"resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.4.21.tgz",
"integrity": "sha512-gvf+C9cFpevsQxbkRBS1NpU8CqxKw0ebqMvLwcGQrNpx6gqRDodqKqA+A2VZZpQ9RpK2f9yfg8VbW/EpdFUOJw==",
"license": "MIT",
"peer": true,
"dependencies": {
"@vue/runtime-core": "3.4.21",
"@vue/shared": "3.4.21",
"csstype": "^3.1.3"
}
},
"node_modules/@dcloudio/uni-h5/node_modules/@vue/server-renderer": {
"version": "3.4.21",
"resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.4.21.tgz",
"integrity": "sha512-aV1gXyKSN6Rz+6kZ6kr5+Ll14YzmIbeuWe7ryJl5muJ4uwSwY/aStXTixx76TwkZFJLm1aAlA/HSWEJ4EyiMkg==",
"license": "MIT",
"dependencies": {
"@vue/compiler-ssr": "3.4.21",
"@vue/shared": "3.4.21"
},
"peerDependencies": {
"vue": "3.4.21"
}
},
"node_modules/@dcloudio/uni-h5/node_modules/vue": {
"version": "3.4.21",
"resolved": "https://registry.npmmirror.com/vue/-/vue-3.4.21.tgz",
"integrity": "sha512-5hjyV/jLEIKD/jYl4cavMcnzKwjMKohureP8ejn3hhEjwhWIhWeuzL2kJAjzl/WyVsgPY56Sy4Z40C3lVshxXA==",
"license": "MIT",
"peer": true,
"dependencies": {
"@vue/compiler-dom": "3.4.21",
"@vue/compiler-sfc": "3.4.21",
"@vue/runtime-dom": "3.4.21",
"@vue/server-renderer": "3.4.21",
"@vue/shared": "3.4.21"
},
"peerDependencies": {
"typescript": "*"
},
"peerDependenciesMeta": {
"typescript": {
"optional": true
}
}
},
"node_modules/@dcloudio/uni-i18n": {
"version": "3.0.0-4040520250104002",
"license": "Apache-2.0"
@ -4191,68 +4470,131 @@
"version": "6.6.4",
"license": "MIT"
},
"node_modules/@vue/devtools-kit": {
"version": "7.7.6",
"resolved": "https://registry.npmmirror.com/@vue/devtools-kit/-/devtools-kit-7.7.6.tgz",
"integrity": "sha512-geu7ds7tem2Y7Wz+WgbnbZ6T5eadOvozHZ23Atk/8tksHMFOFylKi1xgGlQlVn0wlkEf4hu+vd5ctj1G4kFtwA==",
"license": "MIT",
"dependencies": {
"@vue/devtools-shared": "^7.7.6",
"birpc": "^2.3.0",
"hookable": "^5.5.3",
"mitt": "^3.0.1",
"perfect-debounce": "^1.0.0",
"speakingurl": "^14.0.1",
"superjson": "^2.2.2"
}
},
"node_modules/@vue/devtools-shared": {
"version": "7.7.6",
"resolved": "https://registry.npmmirror.com/@vue/devtools-shared/-/devtools-shared-7.7.6.tgz",
"integrity": "sha512-yFEgJZ/WblEsojQQceuyK6FzpFDx4kqrz2ohInxNj5/DnhoX023upTv4OD6lNPLAA5LLkbwPVb10o/7b+Y4FVA==",
"license": "MIT",
"dependencies": {
"rfdc": "^1.4.1"
}
},
"node_modules/@vue/reactivity": {
"version": "3.5.13",
"dev": true,
"version": "3.5.15",
"resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.5.15.tgz",
"integrity": "sha512-GaA5VUm30YWobCwpvcs9nvFKf27EdSLKDo2jA0IXzGS344oNpFNbEQ9z+Pp5ESDaxyS8FcH0vFN/XSe95BZtHQ==",
"license": "MIT",
"dependencies": {
"@vue/shared": "3.5.13"
"@vue/shared": "3.5.15"
}
},
"node_modules/@vue/reactivity/node_modules/@vue/shared": {
"version": "3.5.13",
"dev": true,
"version": "3.5.15",
"resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.15.tgz",
"integrity": "sha512-bKvgFJJL1ZX9KxMCTQY6xD9Dhe3nusd1OhyOb1cJYGqvAr0Vg8FIjHPMOEVbJ9GDT9HG+Bjdn4oS8ohKP8EvoA==",
"license": "MIT"
},
"node_modules/@vue/runtime-core": {
"version": "3.5.13",
"dev": true,
"version": "3.5.15",
"resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.5.15.tgz",
"integrity": "sha512-CZAlIOQ93nj0OPpWWOx4+QDLCMzBNY85IQR4Voe6vIID149yF8g9WQaWnw042f/6JfvLttK7dnyWlC1EVCRK8Q==",
"license": "MIT",
"dependencies": {
"@vue/reactivity": "3.5.13",
"@vue/shared": "3.5.13"
"@vue/reactivity": "3.5.15",
"@vue/shared": "3.5.15"
}
},
"node_modules/@vue/runtime-core/node_modules/@vue/shared": {
"version": "3.5.13",
"dev": true,
"version": "3.5.15",
"resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.15.tgz",
"integrity": "sha512-bKvgFJJL1ZX9KxMCTQY6xD9Dhe3nusd1OhyOb1cJYGqvAr0Vg8FIjHPMOEVbJ9GDT9HG+Bjdn4oS8ohKP8EvoA==",
"license": "MIT"
},
"node_modules/@vue/runtime-dom": {
"version": "3.4.21",
"version": "3.5.15",
"resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.5.15.tgz",
"integrity": "sha512-wFplHKzKO/v998up2iCW3RN9TNUeDMhdBcNYZgs5LOokHntrB48dyuZHspcahKZczKKh3v6i164gapMPxBTKNw==",
"license": "MIT",
"dependencies": {
"@vue/runtime-core": "3.4.21",
"@vue/shared": "3.4.21",
"@vue/reactivity": "3.5.15",
"@vue/runtime-core": "3.5.15",
"@vue/shared": "3.5.15",
"csstype": "^3.1.3"
}
},
"node_modules/@vue/runtime-dom/node_modules/@vue/reactivity": {
"version": "3.4.21",
"node_modules/@vue/runtime-dom/node_modules/@vue/shared": {
"version": "3.5.15",
"resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.15.tgz",
"integrity": "sha512-bKvgFJJL1ZX9KxMCTQY6xD9Dhe3nusd1OhyOb1cJYGqvAr0Vg8FIjHPMOEVbJ9GDT9HG+Bjdn4oS8ohKP8EvoA==",
"license": "MIT"
},
"node_modules/@vue/server-renderer": {
"version": "3.5.15",
"resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.5.15.tgz",
"integrity": "sha512-Gehc693kVTYkLt6QSYEjGvqvdK2zZ/gf/D5zkgmvBdeB30dNnVZS8yY7+IlBmHRd1rR/zwaqeu06Ij04ZxBscg==",
"license": "MIT",
"dependencies": {
"@vue/shared": "3.4.21"
"@vue/compiler-ssr": "3.5.15",
"@vue/shared": "3.5.15"
},
"peerDependencies": {
"vue": "3.5.15"
}
},
"node_modules/@vue/runtime-dom/node_modules/@vue/runtime-core": {
"version": "3.4.21",
"node_modules/@vue/server-renderer/node_modules/@vue/compiler-core": {
"version": "3.5.15",
"resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.15.tgz",
"integrity": "sha512-nGRc6YJg/kxNqbv/7Tg4juirPnjHvuVdhcmDvQWVZXlLHjouq7VsKmV1hIxM/8yKM0VUfwT/Uzc0lO510ltZqw==",
"license": "MIT",
"dependencies": {
"@vue/reactivity": "3.4.21",
"@vue/shared": "3.4.21"
"@babel/parser": "^7.27.2",
"@vue/shared": "3.5.15",
"entities": "^4.5.0",
"estree-walker": "^2.0.2",
"source-map-js": "^1.2.1"
}
},
"node_modules/@vue/server-renderer": {
"version": "3.4.21",
"node_modules/@vue/server-renderer/node_modules/@vue/compiler-dom": {
"version": "3.5.15",
"resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.15.tgz",
"integrity": "sha512-ZelQd9n+O/UCBdL00rlwCrsArSak+YLZpBVuNDio1hN3+wrCshYZEDUO3khSLAzPbF1oQS2duEoMDUHScUlYjA==",
"license": "MIT",
"dependencies": {
"@vue/compiler-ssr": "3.4.21",
"@vue/shared": "3.4.21"
"@vue/compiler-core": "3.5.15",
"@vue/shared": "3.5.15"
}
},
"peerDependencies": {
"vue": "3.4.21"
"node_modules/@vue/server-renderer/node_modules/@vue/compiler-ssr": {
"version": "3.5.15",
"resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.5.15.tgz",
"integrity": "sha512-gShn8zRREZbrXqTtmLSCffgZXDWv8nHc/GhsW+mbwBfNZL5pI96e7IWcIq8XGQe1TLtVbu7EV9gFIVSmfyarPg==",
"license": "MIT",
"dependencies": {
"@vue/compiler-dom": "3.5.15",
"@vue/shared": "3.5.15"
}
},
"node_modules/@vue/server-renderer/node_modules/@vue/shared": {
"version": "3.5.15",
"resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.15.tgz",
"integrity": "sha512-bKvgFJJL1ZX9KxMCTQY6xD9Dhe3nusd1OhyOb1cJYGqvAr0Vg8FIjHPMOEVbJ9GDT9HG+Bjdn4oS8ohKP8EvoA==",
"license": "MIT"
},
"node_modules/@vue/shared": {
"version": "3.4.21",
"license": "MIT"
@ -4652,6 +4994,15 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/birpc": {
"version": "2.3.0",
"resolved": "https://registry.npmmirror.com/birpc/-/birpc-2.3.0.tgz",
"integrity": "sha512-ijbtkn/F3Pvzb6jHypHRyve2QApOCZDR25D/VnkY2G/lBNcXCTsnsCxgY4k4PkVB7zfwzYbY3O9Lcqe3xufS5g==",
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/antfu"
}
},
"node_modules/bmp-js": {
"version": "0.1.0",
"license": "MIT"
@ -5090,6 +5441,21 @@
"dev": true,
"license": "MIT"
},
"node_modules/copy-anything": {
"version": "3.0.5",
"resolved": "https://registry.npmmirror.com/copy-anything/-/copy-anything-3.0.5.tgz",
"integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==",
"license": "MIT",
"dependencies": {
"is-what": "^4.1.8"
},
"engines": {
"node": ">=12.13"
},
"funding": {
"url": "https://github.com/sponsors/mesqueeb"
}
},
"node_modules/core-js-compat": {
"version": "3.41.0",
"dev": true,
@ -5192,6 +5558,8 @@
},
"node_modules/csstype": {
"version": "3.1.3",
"resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz",
"integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
"license": "MIT"
},
"node_modules/data-urls": {
@ -6386,6 +6754,12 @@
"node": ">= 0.4"
}
},
"node_modules/hookable": {
"version": "5.5.3",
"resolved": "https://registry.npmmirror.com/hookable/-/hookable-5.5.3.tgz",
"integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==",
"license": "MIT"
},
"node_modules/html-encoding-sniffer": {
"version": "2.0.1",
"dev": true,
@ -6656,6 +7030,18 @@
"license": "MIT",
"peer": true
},
"node_modules/is-what": {
"version": "4.1.16",
"resolved": "https://registry.npmmirror.com/is-what/-/is-what-4.1.16.tgz",
"integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==",
"license": "MIT",
"engines": {
"node": ">=12.13"
},
"funding": {
"url": "https://github.com/sponsors/mesqueeb"
}
},
"node_modules/isbinaryfile": {
"version": "5.0.4",
"license": "MIT",
@ -7904,6 +8290,12 @@
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/mitt": {
"version": "3.0.1",
"resolved": "https://registry.npmmirror.com/mitt/-/mitt-3.0.1.tgz",
"integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==",
"license": "MIT"
},
"node_modules/mkdirp": {
"version": "0.5.6",
"license": "MIT",
@ -8213,6 +8605,12 @@
"version": "2.0.3",
"license": "MIT"
},
"node_modules/perfect-debounce": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/perfect-debounce/-/perfect-debounce-1.0.0.tgz",
"integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==",
"license": "MIT"
},
"node_modules/phin": {
"version": "2.9.3",
"license": "MIT"
@ -8238,6 +8636,36 @@
"node": ">=0.10.0"
}
},
"node_modules/pinia": {
"version": "3.0.2",
"resolved": "https://registry.npmmirror.com/pinia/-/pinia-3.0.2.tgz",
"integrity": "sha512-sH2JK3wNY809JOeiiURUR0wehJ9/gd9qFN2Y828jCbxEzKEmEt0pzCXwqiSTfuRsK9vQsOflSdnbdBOGrhtn+g==",
"license": "MIT",
"dependencies": {
"@vue/devtools-api": "^7.7.2"
},
"funding": {
"url": "https://github.com/sponsors/posva"
},
"peerDependencies": {
"typescript": ">=4.4.4",
"vue": "^2.7.0 || ^3.5.11"
},
"peerDependenciesMeta": {
"typescript": {
"optional": true
}
}
},
"node_modules/pinia/node_modules/@vue/devtools-api": {
"version": "7.7.6",
"resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-7.7.6.tgz",
"integrity": "sha512-b2Xx0KvXZObePpXPYHvBRRJLDQn5nhKjXh7vUhMEtWxz1AYNFOVIsh5+HLP8xDGL7sy+Q7hXeUxPHB/KgbtsPw==",
"license": "MIT",
"dependencies": {
"@vue/devtools-kit": "^7.7.6"
}
},
"node_modules/pirates": {
"version": "4.0.6",
"dev": true,
@ -8811,6 +9239,12 @@
"node": ">=0.10.0"
}
},
"node_modules/rfdc": {
"version": "1.4.1",
"resolved": "https://registry.npmmirror.com/rfdc/-/rfdc-1.4.1.tgz",
"integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==",
"license": "MIT"
},
"node_modules/rimraf": {
"version": "3.0.2",
"dev": true,
@ -9408,6 +9842,15 @@
"source-map": "^0.6.0"
}
},
"node_modules/speakingurl": {
"version": "14.0.1",
"resolved": "https://registry.npmmirror.com/speakingurl/-/speakingurl-14.0.1.tgz",
"integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==",
"license": "BSD-3-Clause",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/sprintf-js": {
"version": "1.0.3",
"dev": true,
@ -9520,6 +9963,18 @@
"version": "9.0.1",
"license": "MIT"
},
"node_modules/superjson": {
"version": "2.2.2",
"resolved": "https://registry.npmmirror.com/superjson/-/superjson-2.2.2.tgz",
"integrity": "sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==",
"license": "MIT",
"dependencies": {
"copy-anything": "^3.0.2"
},
"engines": {
"node": ">=16"
}
},
"node_modules/supports-color": {
"version": "7.2.0",
"dev": true,
@ -10011,14 +10466,16 @@
}
},
"node_modules/vue": {
"version": "3.4.21",
"version": "3.5.15",
"resolved": "https://registry.npmmirror.com/vue/-/vue-3.5.15.tgz",
"integrity": "sha512-aD9zK4rB43JAMK/5BmS4LdPiEp8Fdh8P1Ve/XNuMF5YRf78fCyPE6FUbQwcaWQ5oZ1R2CD9NKE0FFOVpMR7gEQ==",
"license": "MIT",
"dependencies": {
"@vue/compiler-dom": "3.4.21",
"@vue/compiler-sfc": "3.4.21",
"@vue/runtime-dom": "3.4.21",
"@vue/server-renderer": "3.4.21",
"@vue/shared": "3.4.21"
"@vue/compiler-dom": "3.5.15",
"@vue/compiler-sfc": "3.5.15",
"@vue/runtime-dom": "3.5.15",
"@vue/server-renderer": "3.5.15",
"@vue/shared": "3.5.15"
},
"peerDependencies": {
"typescript": "*"
@ -10098,6 +10555,62 @@
"vue": "^3.2.0"
}
},
"node_modules/vue/node_modules/@vue/compiler-core": {
"version": "3.5.15",
"resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.15.tgz",
"integrity": "sha512-nGRc6YJg/kxNqbv/7Tg4juirPnjHvuVdhcmDvQWVZXlLHjouq7VsKmV1hIxM/8yKM0VUfwT/Uzc0lO510ltZqw==",
"license": "MIT",
"dependencies": {
"@babel/parser": "^7.27.2",
"@vue/shared": "3.5.15",
"entities": "^4.5.0",
"estree-walker": "^2.0.2",
"source-map-js": "^1.2.1"
}
},
"node_modules/vue/node_modules/@vue/compiler-dom": {
"version": "3.5.15",
"resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.15.tgz",
"integrity": "sha512-ZelQd9n+O/UCBdL00rlwCrsArSak+YLZpBVuNDio1hN3+wrCshYZEDUO3khSLAzPbF1oQS2duEoMDUHScUlYjA==",
"license": "MIT",
"dependencies": {
"@vue/compiler-core": "3.5.15",
"@vue/shared": "3.5.15"
}
},
"node_modules/vue/node_modules/@vue/compiler-sfc": {
"version": "3.5.15",
"resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.5.15.tgz",
"integrity": "sha512-3zndKbxMsOU6afQWer75Zot/aydjtxNj0T2KLg033rAFaQUn2PGuE32ZRe4iMhflbTcAxL0yEYsRWFxtPro8RQ==",
"license": "MIT",
"dependencies": {
"@babel/parser": "^7.27.2",
"@vue/compiler-core": "3.5.15",
"@vue/compiler-dom": "3.5.15",
"@vue/compiler-ssr": "3.5.15",
"@vue/shared": "3.5.15",
"estree-walker": "^2.0.2",
"magic-string": "^0.30.17",
"postcss": "^8.5.3",
"source-map-js": "^1.2.1"
}
},
"node_modules/vue/node_modules/@vue/compiler-ssr": {
"version": "3.5.15",
"resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.5.15.tgz",
"integrity": "sha512-gShn8zRREZbrXqTtmLSCffgZXDWv8nHc/GhsW+mbwBfNZL5pI96e7IWcIq8XGQe1TLtVbu7EV9gFIVSmfyarPg==",
"license": "MIT",
"dependencies": {
"@vue/compiler-dom": "3.5.15",
"@vue/shared": "3.5.15"
}
},
"node_modules/vue/node_modules/@vue/shared": {
"version": "3.5.15",
"resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.15.tgz",
"integrity": "sha512-bKvgFJJL1ZX9KxMCTQY6xD9Dhe3nusd1OhyOb1cJYGqvAr0Vg8FIjHPMOEVbJ9GDT9HG+Bjdn4oS8ohKP8EvoA==",
"license": "MIT"
},
"node_modules/w3c-hr-time": {
"version": "1.0.2",
"dev": true,

@ -25,7 +25,8 @@
"@dcloudio/uni-mp-weixin": "3.0.0-4040520250104002",
"@dcloudio/uni-mp-xhs": "3.0.0-4040520250104002",
"@dcloudio/uni-quickapp-webview": "3.0.0-4040520250104002",
"vue": "^3.4.21",
"pinia": "^3.0.2",
"vue": "^3.5.15",
"vue-i18n": "^9.1.9"
},
"devDependencies": {

@ -2,11 +2,16 @@
<view class="argument-component">
<!-- 动态背景元素 -->
<view class="animated-bg">
<view v-for="i in 6" :key="i" class="bg-circle" :style="getRandomCircleStyle()"></view>
<view
v-for="i in 6"
:key="i"
class="bg-circle"
:style="getRandomCircleStyle()"
></view>
</view>
<!-- 顶部卡片 - 可收缩 -->
<view class="content-card" :class="{ 'collapsed': isCardCollapsed }">
<view class="content-card" :class="{ collapsed: isCardCollapsed }">
<view class="card-header" @click="toggleCard">
<view class="card-icon-wrapper">
<view class="card-icon">
@ -15,11 +20,17 @@
</view>
<view class="card-text">
<view class="card-title">立论助手</view>
<view class="card-content" v-if="!isCardCollapsed">AI</view>
<view class="card-content" v-if="!isCardCollapsed"
>AI辅助构建辩论框架智能生成论点与论据</view
>
</view>
<view class="collapse-icon">
<image
:src="isCardCollapsed ? '/static/icons/arrow-down-s-line.png' : '/static/icons/arrow-up-s-line.png'"
:src="
isCardCollapsed
? '/static/icons/arrow-down-s-line.png'
: '/static/icons/arrow-up-s-line.png'
"
mode="aspectFit"
></image>
</view>
@ -39,6 +50,7 @@
:id="'msg' + index"
class="chat-message"
:class="msg.role === 'user' ? 'from-user' : 'from-ai'"
@longpress="onLongPress(msg, index)"
>
<view class="avatar" v-if="msg.role === 'ai'">AI</view>
<view class="bubble">
@ -74,7 +86,10 @@
auto-height
/>
<button class="send-button-embedded" @click="sendMessage()">
<image src="/static/icons/send-plane-fill.png" mode="aspectFit"></image>
<image
src="/static/icons/send-plane-fill.png"
mode="aspectFit"
></image>
</button>
</view>
</view>
@ -82,19 +97,34 @@
<!-- 底部安全区域 -->
<view class="safe-area-bottom"></view>
<Popup
:visible="showSheet"
buttonText="开始辩论"
@close="showSheet = false"
@click="handleSheetClick"
/>
</view>
</template>
<script>
import { useArgumentStore } from "../stores/ArgumentStore";
import Popup from "./Popup.vue";
export default {
components: { Popup },
data() {
return {
showSheet: false,
storeArg: "",
input: "",
messages: [
{
role: "ai",
content:"哈喽~ 我是辩论助手,很高兴为你服务!请告诉我你想立论的立场和题目。"
}
content:
"哈喽~ 我是辩论助手,很高兴为你服务!请告诉我你想立论的立场和题目。",
},
],
scrollToView: "",
position: "",
@ -103,6 +133,12 @@ export default {
};
},
methods: {
handleSheetClick() {
const pinia = this.$pinia;
const argumentStore = useArgumentStore(pinia);
argumentStore.setArgument(this.storeArg);
this.$emit("start-debate", "argument"); //
},
// /
toggleCard() {
this.isCardCollapsed = !this.isCardCollapsed;
@ -122,7 +158,7 @@ export default {
left: `${x}%`,
top: `${y}%`,
animationDelay: `${delay}s`,
animationDuration: `${duration}s`
animationDuration: `${duration}s`,
};
},
@ -187,6 +223,25 @@ export default {
this.scrollToView = "msg" + (this.messages.length - 1);
});
},
onLongPress(msg, index) {
console.log("长按消息", msg, index);
if (msg.role !== "ai") return;
this.storeArg = msg;
this.showSheet = true;
// uni.showActionSheet({
// itemList: [""],
// success: (res) => {
// if (res.tapIndex === 0) {
// const pinia = this.$pinia;
// const argumentStore = useArgumentStore(pinia);
// argumentStore.setArgument(msg);
// this.$emit("start-debate", msg); //
// }
// },
// });
},
},
};
</script>
@ -198,7 +253,7 @@ export default {
padding: 30rpx;
display: flex;
flex-direction: column;
background: linear-gradient(135deg, #4338CA 0%, #7C3AED 100%);
background: linear-gradient(135deg, #4338ca 0%, #7c3aed 100%);
overflow-x: hidden;
box-sizing: border-box;
padding-bottom: 180rpx; /* 为底部TabBar留出空间 */
@ -219,7 +274,11 @@ export default {
.bg-circle {
position: absolute;
border-radius: 50%;
background: linear-gradient(135deg, rgba(255, 255, 255, 0.05), rgba(255, 255, 255, 0.02));
background: linear-gradient(
135deg,
rgba(255, 255, 255, 0.05),
rgba(255, 255, 255, 0.02)
);
animation: float 20s infinite ease-in-out;
opacity: 0.4;
/* 添加过渡效果 */
@ -227,7 +286,8 @@ export default {
}
@keyframes float {
0%, 100% {
0%,
100% {
transform: translate(0, 0) scale(1);
}
25% {
@ -318,7 +378,7 @@ export default {
}
.card-icon::after {
content: '';
content: "";
position: absolute;
top: -50%;
left: -50%;
@ -338,7 +398,8 @@ export default {
0% {
transform: translateX(-100%) rotate(45deg);
}
20%, 100% {
20%,
100% {
transform: translateX(100%) rotate(45deg);
}
}
@ -363,7 +424,7 @@ export default {
.card-title {
font-size: 36rpx;
color: #FFFFFF;
color: #ffffff;
font-weight: 700;
margin-bottom: 10rpx;
text-shadow: 0 2rpx 4rpx rgba(0, 0, 0, 0.2);
@ -441,7 +502,7 @@ export default {
}
.user-avatar {
background: #F59E0B;
background: #f59e0b;
margin-left: 16rpx;
margin-right: 0;
}
@ -460,33 +521,33 @@ export default {
}
.from-user .bubble {
background: #F59E0B;
color: #FFFFFF;
background: #f59e0b;
color: #ffffff;
border-bottom-right-radius: 4rpx;
font-weight: 500;
}
.from-user .bubble::after {
content: '';
content: "";
position: absolute;
right: -12rpx;
bottom: 0;
width: 0;
height: 0;
border-left: 16rpx solid #F59E0B;
border-left: 16rpx solid #f59e0b;
border-top: 16rpx solid transparent;
transition: all 0.3s ease; /* 添加过渡效果 */
}
.from-ai .bubble {
background: rgba(255, 255, 255, 0.2);
color: #FFFFFF;
color: #ffffff;
border-bottom-left-radius: 4rpx;
min-width: 80rpx;
}
.from-ai .bubble::after {
content: '';
content: "";
position: absolute;
left: -12rpx;
bottom: 0;
@ -509,7 +570,7 @@ export default {
.loading-animation .dot {
width: 12rpx;
height: 12rpx;
background-color: #FFFFFF;
background-color: #ffffff;
border-radius: 50%;
animation: bounce 1.4s infinite ease-in-out both;
}
@ -523,11 +584,13 @@ export default {
}
@keyframes bounce {
0%, 80%, 100% {
0%,
80%,
100% {
transform: scale(0);
}
40% {
transform: scale(1.0);
transform: scale(1);
}
}
@ -547,7 +610,7 @@ export default {
.send-button.left-send {
margin-right: 12rpx;
margin-left: 0;
background: #F59E0B;
background: #f59e0b;
width: 70rpx;
height: 70rpx;
border-radius: 50%;
@ -582,7 +645,7 @@ export default {
border-radius: 20rpx;
padding: 16rpx 20rpx;
font-size: 28rpx;
color: #FFFFFF;
color: #ffffff;
border: 1px solid rgba(255, 255, 255, 0.3);
transition: all 0.3s;
height: 70rpx;
@ -598,7 +661,7 @@ export default {
border-radius: 20rpx;
padding: 16rpx 20rpx 16rpx 90rpx; /* 增加左侧内边距 */
font-size: 28rpx;
color: #FFFFFF;
color: #ffffff;
border: 1px solid rgba(255, 255, 255, 0.3);
transition: all 0.3s;
min-height: 70rpx;
@ -630,7 +693,8 @@ export default {
.send-button-embedded image {
width: 40rpx;
height: 40rpx;
filter: invert(72%) sepia(87%) saturate(1242%) hue-rotate(325deg) brightness(101%) contrast(96%);
filter: invert(72%) sepia(87%) saturate(1242%) hue-rotate(325deg)
brightness(101%) contrast(96%);
}
.input-box::placeholder,
@ -640,7 +704,7 @@ export default {
.input-box:focus,
.textarea-box:focus {
border-color: #F59E0B;
border-color: #f59e0b;
outline: none;
background: rgba(255, 255, 255, 0.25);
}

@ -2,24 +2,38 @@
<view class="debate-component">
<!-- 动态背景元素 -->
<view class="animated-bg">
<view v-for="i in 6" :key="i" class="bg-circle" :style="getRandomCircleStyle()"></view>
<view
v-for="i in 6"
:key="i"
class="bg-circle"
:style="getRandomCircleStyle()"
></view>
</view>
<!-- 顶部卡片 - 可收缩 -->
<view class="content-card" :class="{ 'collapsed': isCardCollapsed }">
<view class="content-card" :class="{ collapsed: isCardCollapsed }">
<view class="card-header" @click="toggleCard">
<view class="card-icon-wrapper">
<view class="card-icon">
<image src="/static/icons/robot-2-line.png" mode="aspectFit"></image>
<image
src="/static/icons/robot-2-line.png"
mode="aspectFit"
></image>
</view>
</view>
<view class="card-text">
<view class="card-title">模拟辩论</view>
<view class="card-content" v-if="!isCardCollapsed">AI</view>
<view class="card-content" v-if="!isCardCollapsed"
>与AI进行实时辩论对练提升应变能力</view
>
</view>
<view class="collapse-icon">
<image
:src="isCardCollapsed ? '/static/icons/arrow-down-s-line.png' : '/static/icons/arrow-up-s-line.png'"
:src="
isCardCollapsed
? '/static/icons/arrow-down-s-line.png'
: '/static/icons/arrow-up-s-line.png'
"
mode="aspectFit"
></image>
</view>
@ -53,6 +67,7 @@
:id="'msg' + index"
class="chat-message"
:class="msg.role === 'user' ? 'from-user' : 'from-ai'"
@longpress="onLongPress()"
>
<view class="avatar" v-if="msg.role === 'ai'">AI</view>
<view class="bubble">
@ -83,7 +98,10 @@
maxlength="1000"
/>
<button class="send-button-embedded" @click="sendMessage()">
<image src="/static/icons/send-plane-fill.png" mode="aspectFit"></image>
<image
src="/static/icons/send-plane-fill.png"
mode="aspectFit"
></image>
</button>
</view>
</view>
@ -91,30 +109,101 @@
<!-- 底部安全区域 -->
<view class="safe-area-bottom"></view>
<Popup
:visible="showSheet"
buttonText="开始复盘"
buttonIcon="🧠"
@close="showSheet = false"
@click="handleSheetClick"
/>
</view>
</template>
<script>
import { useArgumentStore } from "../stores/ArgumentStore";
import { useDebateStore } from "../stores/DebateStore";
import Popup from "./Popup.vue";
export default {
components: { Popup },
props: {
argument: {
type: Object,
required: true,
},
},
mounted() {
const pinia = this.$pinia;
const store = useArgumentStore(pinia);
this.content = store.selectedArgument.content;
},
data() {
return {
showSheet:false,
StoreHistory:"",
input: "",
messages: [
{
role: "ai",
content: "在这里你可以和我进行辩论,现在,辩论开始!请选择一个话题或提出你想讨论的观点。"
}
content:
"在这里你可以和我进行辩论,现在,辩论开始!请选择一个话题或提出你想讨论的观点。",
},
],
scrollToView: "",
content: "",
debateTopics: [
"教育改革", "环境保护", "人工智能", "社会公平", "文化传承", "科技伦理"
"教育改革",
"环境保护",
"人工智能",
"社会公平",
"文化传承",
"科技伦理",
],
selectedTopic: -1,
isCardCollapsed: false, //
};
},
methods: {
handleSheetClick() {
const pinia = this.$pinia;
const store = useDebateStore(pinia);
store.setDebate(this.StoreHistory);
this.$emit("start-review", "debate");
},
onLongPress() {
let history = this.messages
.filter((msg) => !msg.loading)
.map((msg) => {
if (msg.role === "user") {
return `用户:${msg.content}`;
} else if (msg.role === "ai") {
return `AI${msg.content}`;
}
return "";
})
.join("\n");
this.StoreHistory = history;
this.showSheet = true;
// console.log(history);
// uni.showActionSheet({
// itemList: [""],
// success: (res) => {
// if (res.tapIndex === 0) {
// const pinia = this.$pinia;
// const store = useDebateStore(pinia);
// store.setDebate(history);
// this.$emit("start-review", "debate"); //
// // console.log(":",store.selectedDebate.content);
// }
// },
// });
},
// /
toggleCard() {
this.isCardCollapsed = !this.isCardCollapsed;
@ -134,7 +223,7 @@ export default {
left: `${x}%`,
top: `${y}%`,
animationDelay: `${delay}s`,
animationDuration: `${duration}s`
animationDuration: `${duration}s`,
};
},
@ -148,7 +237,7 @@ export default {
//
this.messages.push({
role: "ai",
content: `已选择「${topic}」作为辩论主题。请分享你对这个话题的观点,我们开始辩论吧!`
content: `已选择「${topic}」作为辩论主题。请分享你对这个话题的观点,我们开始辩论吧!`,
});
this.scrollToBottom();
@ -242,7 +331,7 @@ export default {
padding: 30rpx;
display: flex;
flex-direction: column;
background: linear-gradient(135deg, #4338CA 0%, #7C3AED 100%);
background: linear-gradient(135deg, #4338ca 0%, #7c3aed 100%);
overflow-x: hidden;
box-sizing: border-box;
padding-bottom: 180rpx; /* 为底部TabBar留出空间 */
@ -263,7 +352,11 @@ export default {
.bg-circle {
position: absolute;
border-radius: 50%;
background: linear-gradient(135deg, rgba(255, 255, 255, 0.05), rgba(255, 255, 255, 0.02));
background: linear-gradient(
135deg,
rgba(255, 255, 255, 0.05),
rgba(255, 255, 255, 0.02)
);
animation: float 20s infinite ease-in-out;
opacity: 0.4;
/* 添加过渡效果 */
@ -271,7 +364,8 @@ export default {
}
@keyframes float {
0%, 100% {
0%,
100% {
transform: translate(0, 0) scale(1);
}
25% {
@ -362,7 +456,7 @@ export default {
}
.card-icon::after {
content: '';
content: "";
position: absolute;
top: -50%;
left: -50%;
@ -382,7 +476,8 @@ export default {
0% {
transform: translateX(-100%) rotate(45deg);
}
20%, 100% {
20%,
100% {
transform: translateX(100%) rotate(45deg);
}
}
@ -407,7 +502,7 @@ export default {
.card-title {
font-size: 36rpx;
color: #FFFFFF;
color: #ffffff;
font-weight: 700;
margin-bottom: 10rpx;
text-shadow: 0 2rpx 4rpx rgba(0, 0, 0, 0.2);
@ -452,11 +547,11 @@ export default {
}
.topic-pill.active {
background: #F59E0B;
color: #FFFFFF;
background: #f59e0b;
color: #ffffff;
box-shadow: 0 4rpx 15rpx rgba(245, 158, 11, 0.4);
transform: scale(1.05);
border-color: #F59E0B;
border-color: #f59e0b;
}
/* 聊天区域 */
@ -518,7 +613,7 @@ export default {
}
.user-avatar {
background: #F59E0B;
background: #f59e0b;
margin-left: 16rpx;
margin-right: 0;
}
@ -537,33 +632,33 @@ export default {
}
.from-user .bubble {
background: #F59E0B;
color: #FFFFFF;
background: #f59e0b;
color: #ffffff;
border-bottom-right-radius: 4rpx;
font-weight: 500;
}
.from-user .bubble::after {
content: '';
content: "";
position: absolute;
right: -12rpx;
bottom: 0;
width: 0;
height: 0;
border-left: 16rpx solid #F59E0B;
border-left: 16rpx solid #f59e0b;
border-top: 16rpx solid transparent;
transition: all 0.3s ease; /* 添加过渡效果 */
}
.from-ai .bubble {
background: rgba(255, 255, 255, 0.2);
color: #FFFFFF;
color: #ffffff;
border-bottom-left-radius: 4rpx;
min-width: 80rpx;
}
.from-ai .bubble::after {
content: '';
content: "";
position: absolute;
left: -12rpx;
bottom: 0;
@ -586,7 +681,7 @@ export default {
.loading-animation .dot {
width: 12rpx;
height: 12rpx;
background-color: #FFFFFF;
background-color: #ffffff;
border-radius: 50%;
animation: bounce 1.4s infinite ease-in-out both;
}
@ -600,11 +695,13 @@ export default {
}
@keyframes bounce {
0%, 80%, 100% {
0%,
80%,
100% {
transform: scale(0);
}
40% {
transform: scale(1.0);
transform: scale(1);
}
}
@ -621,13 +718,12 @@ export default {
margin-bottom: 20rpx;
}
.textarea-box {
background: rgba(255, 255, 255, 0.2);
border-radius: 20rpx;
padding: 16rpx 20rpx 16rpx 90rpx; /* 增加左侧内边距为发送按钮留出空间 */
font-size: 28rpx;
color: #FFFFFF;
color: #ffffff;
border: 1px solid rgba(255, 255, 255, 0.3);
transition: all 0.3s;
min-height: 70rpx;
@ -641,7 +737,7 @@ export default {
}
.textarea-box:focus {
border-color: #F59E0B;
border-color: #f59e0b;
outline: none;
background: rgba(255, 255, 255, 0.25);
}
@ -649,7 +745,7 @@ export default {
.send-button.left-send {
margin-right: 12rpx;
margin-left: 0;
background: #F59E0B;
background: #f59e0b;
width: 70rpx;
height: 70rpx;
border-radius: 50%;
@ -701,7 +797,8 @@ export default {
.send-button-embedded image {
width: 40rpx;
height: 40rpx;
filter: invert(72%) sepia(87%) saturate(1242%) hue-rotate(325deg) brightness(101%) contrast(96%);
filter: invert(72%) sepia(87%) saturate(1242%) hue-rotate(325deg)
brightness(101%) contrast(96%);
}
/* 底部安全区域 */

@ -0,0 +1,155 @@
<template>
<view v-if="visible" class="custom-purple-sheet">
<!-- 遮罩层 -->
<view class="mask" @click.self="handleMaskClick"></view>
<!-- 弹出内容 -->
<view class="sheet-box">
<view class="header">
<text class="title">请选择操作</text>
</view>
<view class="sheet-item" @click="handleClick">
<view class="button">
<text class="icon">{{ buttonIcon }}</text>
<text class="text">{{ buttonText }}</text>
</view>
</view>
<view class="cancel-btn" @click="handleMaskClick">
取消
</view>
</view>
</view>
</template>
<script setup>
import { defineProps, defineEmits } from 'vue';
const props = defineProps({
visible: {
type: Boolean,
default: false
},
buttonIcon: {
type: String,
default: '🗣️'
},
buttonText: {
type: String,
default: '发起辩论'
}
});
const emit = defineEmits(['close', 'click']);
const handleMaskClick = () => {
emit('close');
};
const handleClick = () => {
emit('click');
};
</script>
<style scoped>
.custom-purple-sheet {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
z-index: 9999;
display: flex;
justify-content: center;
align-items: center;
}
.mask {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.4);
}
.sheet-box {
position: relative;
width: 70%;
max-width: 520rpx;
background-color: #fff;
border-radius: 20rpx;
overflow: hidden;
box-shadow: 0 8rpx 20rpx rgba(106, 27, 154, 0.25);
animation: fadeIn 0.25s ease-out;
}
.header {
padding: 24rpx;
background: linear-gradient(to right, #E1BEE7, #CE93D8);
border-bottom: 1rpx solid #D1B3E0;
}
.title {
font-size: 30rpx;
color: #6A1B9A;
font-weight: bold;
text-align: center;
}
.sheet-item {
padding: 36rpx;
display: flex;
justify-content: center;
align-items: center;
}
.button {
display: flex;
flex-direction: column;
align-items: center;
padding: 20rpx 30rpx;
background-color: #F3E5F5;
border-radius: 16rpx;
transition: background-color 0.2s;
}
.button:active {
background-color: #E1BEE7;
}
.icon {
font-size: 44rpx;
margin-bottom: 8rpx;
color: #6A1B9A;
}
.text {
font-size: 28rpx;
color: #6A1B9A;
font-weight: 500;
}
.cancel-btn {
padding: 24rpx;
text-align: center;
color: #999;
font-size: 28rpx;
border-top: 1rpx solid #F3E5F5;
background-color: #FAFAFA;
}
.cancel-btn:active {
background-color: #F0F0F0;
}
@keyframes fadeIn {
from {
opacity: 0;
transform: translateY(20%);
}
to {
opacity: 1;
transform: translateY(0);
}
}
</style>

@ -2,24 +2,38 @@
<view class="review-component">
<!-- 动态背景元素 -->
<view class="animated-bg">
<view v-for="i in 6" :key="i" class="bg-circle" :style="getRandomCircleStyle()"></view>
<view
v-for="i in 6"
:key="i"
class="bg-circle"
:style="getRandomCircleStyle()"
></view>
</view>
<!-- 顶部卡片 - 可收缩 -->
<view class="content-card" :class="{ 'collapsed': isCardCollapsed }">
<view class="content-card" :class="{ collapsed: isCardCollapsed }">
<view class="card-header" @click="toggleCard">
<view class="card-icon-wrapper">
<view class="card-icon">
<image src="/static/icons/file-chart-line.png" mode="aspectFit"></image>
<image
src="/static/icons/file-chart-line.png"
mode="aspectFit"
></image>
</view>
</view>
<view class="card-text">
<view class="card-title">复盘分析</view>
<view class="card-content" v-if="!isCardCollapsed"></view>
<view class="card-content" v-if="!isCardCollapsed"
>分析辩论过程提供改进建议与优化方向</view
>
</view>
<view class="collapse-icon">
<image
:src="isCardCollapsed ? '/static/icons/arrow-down-s-line.png' : '/static/icons/arrow-up-s-line.png'"
:src="
isCardCollapsed
? '/static/icons/arrow-down-s-line.png'
: '/static/icons/arrow-up-s-line.png'
"
mode="aspectFit"
></image>
</view>
@ -39,6 +53,7 @@
:id="'msg' + index"
class="chat-message"
:class="msg.role === 'user' ? 'from-user' : 'from-ai'"
@longpress="onLongPress(msg, index)"
>
<view class="avatar" v-if="msg.role === 'ai'">AI</view>
<view class="bubble">
@ -69,7 +84,10 @@
maxlength="5000"
/>
<button class="send-button-embedded" @click="sendMessage()">
<image src="/static/icons/send-plane-fill.png" mode="aspectFit"></image>
<image
src="/static/icons/send-plane-fill.png"
mode="aspectFit"
></image>
</button>
</view>
</view>
@ -77,19 +95,45 @@
<!-- 底部安全区域 -->
<view class="safe-area-bottom"></view>
<Popup
:visible="showSheet"
buttonText="导出复盘"
buttonIcon="📤"
@close="showSheet = false"
@click="handleSheetClick"
/>
</view>
</template>
<script>
import { useDebateStore } from "../stores/DebateStore";
import Popup from "./Popup.vue";
export default {
components: { Popup },
props: {
debate: {
type: Object,
required: true,
},
},
mounted() {
const pinia = this.$pinia;
const store = useDebateStore(pinia);
this.content = store.selectedDebate.content;
},
data() {
return {
showSheet: false,
StoreReview: "",
input: "",
messages: [
{
role: "ai",
content: "欢迎使用辩论复盘分析!请粘贴你的辩论记录,我将为你分析优缺点并提供改进建议。"
}
content:
"欢迎使用辩论复盘分析!请粘贴你的辩论记录,我将为你分析优缺点并提供改进建议。",
},
],
scrollToView: "",
content: "",
@ -97,6 +141,25 @@ export default {
};
},
methods: {
handleSheetClick() {
const content = this.StoreReview;
uni.setClipboardData({
data: content,
success: () => {
uni.showToast({ title: "内容已复制", icon: "none" });
},
fail: () => {
uni.showToast({ title: "复制失败", icon: "none", duration: 2000 });
},
});
},
onLongPress(msg, index) {
console.log("长按事件触发");
this.StoreReview = msg.content;
this.showSheet = true;
},
// /
toggleCard() {
this.isCardCollapsed = !this.isCardCollapsed;
@ -116,7 +179,7 @@ export default {
left: `${x}%`,
top: `${y}%`,
animationDelay: `${delay}s`,
animationDuration: `${duration}s`
animationDuration: `${duration}s`,
};
},
@ -193,7 +256,7 @@ export default {
padding: 30rpx;
display: flex;
flex-direction: column;
background: linear-gradient(135deg, #4338CA 0%, #7C3AED 100%);
background: linear-gradient(135deg, #4338ca 0%, #7c3aed 100%);
overflow-x: hidden;
box-sizing: border-box;
padding-bottom: 180rpx; /* 为底部TabBar留出空间 */
@ -214,7 +277,11 @@ export default {
.bg-circle {
position: absolute;
border-radius: 50%;
background: linear-gradient(135deg, rgba(255, 255, 255, 0.05), rgba(255, 255, 255, 0.02));
background: linear-gradient(
135deg,
rgba(255, 255, 255, 0.05),
rgba(255, 255, 255, 0.02)
);
animation: float 20s infinite ease-in-out;
opacity: 0.4;
/* 添加过渡效果 */
@ -222,7 +289,8 @@ export default {
}
@keyframes float {
0%, 100% {
0%,
100% {
transform: translate(0, 0) scale(1);
}
25% {
@ -313,7 +381,7 @@ export default {
}
.card-icon::after {
content: '';
content: "";
position: absolute;
top: -50%;
left: -50%;
@ -333,7 +401,8 @@ export default {
0% {
transform: translateX(-100%) rotate(45deg);
}
20%, 100% {
20%,
100% {
transform: translateX(100%) rotate(45deg);
}
}
@ -358,7 +427,7 @@ export default {
.card-title {
font-size: 36rpx;
color: #FFFFFF;
color: #ffffff;
font-weight: 700;
margin-bottom: 10rpx;
text-shadow: 0 2rpx 4rpx rgba(0, 0, 0, 0.2);
@ -436,7 +505,7 @@ export default {
}
.user-avatar {
background: #F59E0B;
background: #f59e0b;
margin-left: 16rpx;
margin-right: 0;
}
@ -455,33 +524,33 @@ export default {
}
.from-user .bubble {
background: #F59E0B;
color: #FFFFFF;
background: #f59e0b;
color: #ffffff;
border-bottom-right-radius: 4rpx;
font-weight: 500;
}
.from-user .bubble::after {
content: '';
content: "";
position: absolute;
right: -12rpx;
bottom: 0;
width: 0;
height: 0;
border-left: 16rpx solid #F59E0B;
border-left: 16rpx solid #f59e0b;
border-top: 16rpx solid transparent;
transition: all 0.3s ease; /* 添加过渡效果 */
}
.from-ai .bubble {
background: rgba(255, 255, 255, 0.2);
color: #FFFFFF;
color: #ffffff;
border-bottom-left-radius: 4rpx;
min-width: 80rpx;
}
.from-ai .bubble::after {
content: '';
content: "";
position: absolute;
left: -12rpx;
bottom: 0;
@ -504,7 +573,7 @@ export default {
.loading-animation .dot {
width: 12rpx;
height: 12rpx;
background-color: #FFFFFF;
background-color: #ffffff;
border-radius: 50%;
animation: bounce 1.4s infinite ease-in-out both;
}
@ -518,11 +587,13 @@ export default {
}
@keyframes bounce {
0%, 80%, 100% {
0%,
80%,
100% {
transform: scale(0);
}
40% {
transform: scale(1.0);
transform: scale(1);
}
}
@ -574,7 +645,8 @@ export default {
.send-button-embedded image {
width: 40rpx;
height: 40rpx;
filter: invert(72%) sepia(87%) saturate(1242%) hue-rotate(325deg) brightness(101%) contrast(96%);
filter: invert(72%) sepia(87%) saturate(1242%) hue-rotate(325deg)
brightness(101%) contrast(96%);
}
.textarea-box {
@ -582,7 +654,7 @@ export default {
border-radius: 20rpx;
padding: 16rpx 20rpx 16rpx 90rpx; /* 增加左侧内边距为发送按钮留出空间 */
font-size: 28rpx;
color: #FFFFFF;
color: #ffffff;
border: 1px solid rgba(255, 255, 255, 0.3);
transition: all 0.3s;
min-height: 120rpx;
@ -596,7 +668,7 @@ export default {
}
.textarea-box:focus {
border-color: #F59E0B;
border-color: #f59e0b;
outline: none;
background: rgba(255, 255, 255, 0.25);
}

@ -2,9 +2,15 @@ import {
createSSRApp
} from "vue";
import App from "./App.vue";
import { createPinia } from "pinia";
export function createApp() {
const app = createSSRApp(App);
const pinia = createPinia();
app.use(pinia);
return {
app,
pinia,
};
}

@ -1,9 +1,9 @@
<template>
<view class="container">
<HomeCom v-if="activeTab === 0" @tab-change="handleTabChange"/>
<DebateCom v-if="activeTab === 1" />
<ArgumentCom v-if="activeTab === 2" />
<ReviewCom v-if="activeTab === 3" />
<DebateCom v-if="activeTab === 1" @start-review="handleStartReview" :argument="selectedArgument"/>
<ArgumentCom v-if="activeTab === 2" @start-debate="handleStartDebate"/>
<ReviewCom v-if="activeTab === 3" :debate="selectedDebate"/>
<TabBar :activeTab="activeTab" @tab-change="handleTabChange" />
</view>
@ -26,7 +26,9 @@ export default {
},
data() {
return {
activeTab: 0
activeTab: 0,
selectedArgument: null, //
selectedDebate:null
};
},
methods: {
@ -38,6 +40,14 @@ export default {
uni.setNavigationBarTitle({
title: titles[index]
});
},
handleStartDebate(msg) {
this.selectedArgument = msg; //
this.activeTab = 1; //
},
handleStartReview(msg){
this.selectedDebate = msg;
this.activeTab = 3;
}
}
};

@ -0,0 +1,13 @@
// stores/argumentStore.ts
import { defineStore } from 'pinia'
export const useArgumentStore = defineStore('argument', {
state: () => ({
selectedArgument: null
}),
actions: {
setArgument(arg) {
this.selectedArgument = arg
}
}
})

@ -0,0 +1,15 @@
// stores/DebateStore.ts
import { defineStore } from 'pinia'
export const useDebateStore = defineStore('debate', {
state: () => ({
selectedDebate: {
content: '',
},
}),
actions: {
setDebate(content) {
this.selectedDebate.content = content;
}
}
});
Loading…
Cancel
Save