commit 4eec4841a58173aa7219295eaa34258e66f1464c
Author: qubiaobiao <3294694717@qq.com>
Date: Fri Mar 27 17:41:29 2026 +0800
北斗应用技术培训考试题库
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..8ee54e8
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,30 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+.DS_Store
+dist
+dist-ssr
+coverage
+*.local
+
+/cypress/videos/
+/cypress/screenshots/
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
+
+*.tsbuildinfo
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..511a442
--- /dev/null
+++ b/README.md
@@ -0,0 +1,29 @@
+# open-map-assistant
+
+This template should help get you started developing with Vue 3 in Vite.
+
+## Recommended IDE Setup
+
+[VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) (and disable Vetur).
+
+## Customize configuration
+
+See [Vite Configuration Reference](https://vitejs.dev/config/).
+
+## Project Setup
+
+```sh
+npm install
+```
+
+### Compile and Hot-Reload for Development
+
+```sh
+npm run dev
+```
+
+### Compile and Minify for Production
+
+```sh
+npm run build
+```
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..3fde5e5
--- /dev/null
+++ b/index.html
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+ 题库
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/jsconfig.json b/jsconfig.json
new file mode 100644
index 0000000..5a1f2d2
--- /dev/null
+++ b/jsconfig.json
@@ -0,0 +1,8 @@
+{
+ "compilerOptions": {
+ "paths": {
+ "@/*": ["./src/*"]
+ }
+ },
+ "exclude": ["node_modules", "dist"]
+}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..20abf94
--- /dev/null
+++ b/package.json
@@ -0,0 +1,36 @@
+{
+ "name": "bd-training-exam-topic",
+ "version": "0.0.0",
+ "private": true,
+ "type": "module",
+ "scripts": {
+ "dev": "vite --port=7023",
+ "build": "vite build",
+ "preview": "vite preview"
+ },
+ "dependencies": {
+ "@element-plus/icons-vue": "^2.3.1",
+ "axios": "^1.6.8",
+ "bd-training-exam-topic": "file:",
+ "core-js": "^3.37.0",
+ "crypto-js": "^4.2.0",
+ "element-plus": "^2.7.2",
+ "fingerprintjs2": "^2.1.4",
+ "moment": "^2.30.1",
+ "pinia": "^2.1.7",
+ "pinia-plugin-persist": "^1.0.0",
+ "vue": "^3.4.21",
+ "vue-i18n": "^9.13.1",
+ "vue-router": "^4.3.0",
+ "zipson": "^0.2.12"
+ },
+ "devDependencies": {
+ "@vitejs/plugin-vue": "^5.0.4",
+ "autoprefixer": "^10.4.19",
+ "postcss": "^8.4.38",
+ "tailwindcss": "^3.4.3",
+ "unplugin-auto-import": "^0.17.5",
+ "unplugin-vue-components": "^0.27.0",
+ "vite": "^5.2.8"
+ }
+}
diff --git a/postcss.config.js b/postcss.config.js
new file mode 100644
index 0000000..6ef5c58
--- /dev/null
+++ b/postcss.config.js
@@ -0,0 +1,6 @@
+export default {
+ plugins: {
+ tailwindcss: {},
+ autoprefixer: {}
+ }
+}
\ No newline at end of file
diff --git a/public/favicon.ico b/public/favicon.ico
new file mode 100644
index 0000000..1b51f8f
Binary files /dev/null and b/public/favicon.ico differ
diff --git a/src/App.vue b/src/App.vue
new file mode 100644
index 0000000..206df00
--- /dev/null
+++ b/src/App.vue
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
diff --git a/src/api/index.js b/src/api/index.js
new file mode 100644
index 0000000..a18f7c6
--- /dev/null
+++ b/src/api/index.js
@@ -0,0 +1,63 @@
+import axios from "axios";
+import router from "../router";
+
+// 添加请求拦截器
+axios.interceptors.request.use(function (config) {
+ // 在发送请求之前做些什么
+ if (localStorage.data && localStorage.data !== "" && localStorage.data !== null && localStorage.data !== undefined && localStorage.data !== NaN) {
+ if (config.headers) {
+ config.headers.authorization = localStorage.data;
+ }
+ }
+ return config;
+}, function (error) {
+ // 对请求错误做些什么
+ return Promise.reject(error);
+});
+
+// 转到登录页面
+const toLogin = () => {
+ // localStorage.clear();
+ router.push({ path: '/initialService' });
+};
+
+// 添加响应拦截器
+let result = true;
+axios.interceptors.response.use(function (response) {
+ // 2xx 范围内的状态码都会触发该函数。
+ // 对响应数据做点什么
+ if (response.data.code === 200) {
+ if ("data" in response.data) {
+ localStorage.setItem("data", response.data.data);
+ }
+ }
+ if (response.data.code === 401 && result) {
+ result = false;
+ setTimeout(() => {
+ result = true;
+ }, 1000);
+ toLogin();
+ }
+ return response;
+}, function (error) {
+ // 超出 2xx 范围的状态码都会触发该函数。
+ // 对响应错误做点什么
+ return Promise.reject(error);
+});
+
+export default {
+ get(url, query = {}) {
+ return axios.get(url, {
+ params: query
+ });
+ },
+ post(url, body) {
+ return axios.post(url, body);
+ },
+ put(url, body) {
+ return axios.put(url, body);
+ },
+ del(url) {
+ return axios.delete(url);
+ },
+}
\ No newline at end of file
diff --git a/src/api/url.js b/src/api/url.js
new file mode 100644
index 0000000..7abf578
--- /dev/null
+++ b/src/api/url.js
@@ -0,0 +1,14 @@
+export default {
+ // 题库登录接口
+ login: "/bdTrainingExamTopic/login",
+ // 获取题库登录状态接口
+ loginStatus: "/bdTrainingExamTopic/loginStatus",
+ // 获取单选题接口
+ radio: "/bdTrainingExamTopic/radio",
+ // 获取多选题接口
+ multiple: "/bdTrainingExamTopic/multiple",
+ // 获取判断题接口
+ judgment: "/bdTrainingExamTopic/judgment",
+ // 获取问答题接口
+ interlocution: "/bdTrainingExamTopic/interlocution",
+}
\ No newline at end of file
diff --git a/src/assets/bdjy.png b/src/assets/bdjy.png
new file mode 100644
index 0000000..0ec3c35
Binary files /dev/null and b/src/assets/bdjy.png differ
diff --git a/src/assets/bdjyLogo.png b/src/assets/bdjyLogo.png
new file mode 100644
index 0000000..f437e49
Binary files /dev/null and b/src/assets/bdjyLogo.png differ
diff --git a/src/assets/bdqhLogo.png b/src/assets/bdqhLogo.png
new file mode 100644
index 0000000..ee9c6bd
Binary files /dev/null and b/src/assets/bdqhLogo.png differ
diff --git a/src/assets/bg.jpg b/src/assets/bg.jpg
new file mode 100644
index 0000000..a0c96e4
Binary files /dev/null and b/src/assets/bg.jpg differ
diff --git a/src/assets/certificate.jpg b/src/assets/certificate.jpg
new file mode 100644
index 0000000..0d5c60b
Binary files /dev/null and b/src/assets/certificate.jpg differ
diff --git a/src/assets/default.png b/src/assets/default.png
new file mode 100644
index 0000000..91ba9e6
Binary files /dev/null and b/src/assets/default.png differ
diff --git a/src/assets/exam.jpg b/src/assets/exam.jpg
new file mode 100644
index 0000000..bc3da51
Binary files /dev/null and b/src/assets/exam.jpg differ
diff --git a/src/assets/favicon.ico b/src/assets/favicon.ico
new file mode 100644
index 0000000..1b51f8f
Binary files /dev/null and b/src/assets/favicon.ico differ
diff --git a/src/assets/img/BDThemeLesson.jpg b/src/assets/img/BDThemeLesson.jpg
new file mode 100644
index 0000000..4e02fc1
Binary files /dev/null and b/src/assets/img/BDThemeLesson.jpg differ
diff --git a/src/assets/img/comprehensivePracticalActivities.jpg b/src/assets/img/comprehensivePracticalActivities.jpg
new file mode 100644
index 0000000..f141db6
Binary files /dev/null and b/src/assets/img/comprehensivePracticalActivities.jpg differ
diff --git a/src/assets/img/correctExample.png b/src/assets/img/correctExample.png
new file mode 100644
index 0000000..9af852d
Binary files /dev/null and b/src/assets/img/correctExample.png differ
diff --git a/src/assets/img/ephemeris_search.jpg b/src/assets/img/ephemeris_search.jpg
new file mode 100644
index 0000000..97b31de
Binary files /dev/null and b/src/assets/img/ephemeris_search.jpg differ
diff --git a/src/assets/img/errorsExample.png b/src/assets/img/errorsExample.png
new file mode 100644
index 0000000..8fdfd6a
Binary files /dev/null and b/src/assets/img/errorsExample.png differ
diff --git a/src/assets/img/interferenceSimulation.png b/src/assets/img/interferenceSimulation.png
new file mode 100644
index 0000000..ef4d111
Binary files /dev/null and b/src/assets/img/interferenceSimulation.png differ
diff --git a/src/assets/img/mapTheCampus.jpg b/src/assets/img/mapTheCampus.jpg
new file mode 100644
index 0000000..060d3ea
Binary files /dev/null and b/src/assets/img/mapTheCampus.jpg differ
diff --git a/src/assets/img/nmea0183-thumbnail.jpg b/src/assets/img/nmea0183-thumbnail.jpg
new file mode 100644
index 0000000..336d2e9
Binary files /dev/null and b/src/assets/img/nmea0183-thumbnail.jpg differ
diff --git a/src/assets/img/tdt-thumbnail.jpg b/src/assets/img/tdt-thumbnail.jpg
new file mode 100644
index 0000000..4ab3dcd
Binary files /dev/null and b/src/assets/img/tdt-thumbnail.jpg differ
diff --git a/src/assets/img/trajectory.jpg b/src/assets/img/trajectory.jpg
new file mode 100644
index 0000000..ab682d4
Binary files /dev/null and b/src/assets/img/trajectory.jpg differ
diff --git a/src/assets/logo.png b/src/assets/logo.png
new file mode 100644
index 0000000..ee9c6bd
Binary files /dev/null and b/src/assets/logo.png differ
diff --git a/src/assets/logo.svg b/src/assets/logo.svg
new file mode 100644
index 0000000..7565660
--- /dev/null
+++ b/src/assets/logo.svg
@@ -0,0 +1 @@
+
diff --git a/src/assets/main.css b/src/assets/main.css
new file mode 100644
index 0000000..2c350cf
--- /dev/null
+++ b/src/assets/main.css
@@ -0,0 +1,9 @@
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
+
+@layer components {
+ .w-h-full {
+ @apply w-full h-full m-0 p-0 overflow-hidden;
+ }
+}
\ No newline at end of file
diff --git a/src/assets/qrcode.jpg b/src/assets/qrcode.jpg
new file mode 100644
index 0000000..1ca11ac
Binary files /dev/null and b/src/assets/qrcode.jpg differ
diff --git a/src/assets/training.jpg b/src/assets/training.jpg
new file mode 100644
index 0000000..b3e58be
Binary files /dev/null and b/src/assets/training.jpg differ
diff --git a/src/components/database/interlocution.vue b/src/components/database/interlocution.vue
new file mode 100644
index 0000000..1b0b777
--- /dev/null
+++ b/src/components/database/interlocution.vue
@@ -0,0 +1,83 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/database/judgment.vue b/src/components/database/judgment.vue
new file mode 100644
index 0000000..8ed2c46
--- /dev/null
+++ b/src/components/database/judgment.vue
@@ -0,0 +1,93 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/database/multiple.vue b/src/components/database/multiple.vue
new file mode 100644
index 0000000..30f9241
--- /dev/null
+++ b/src/components/database/multiple.vue
@@ -0,0 +1,93 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/database/radio.vue b/src/components/database/radio.vue
new file mode 100644
index 0000000..4897da0
--- /dev/null
+++ b/src/components/database/radio.vue
@@ -0,0 +1,93 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/operate/jump.vue b/src/components/operate/jump.vue
new file mode 100644
index 0000000..5fdce56
--- /dev/null
+++ b/src/components/operate/jump.vue
@@ -0,0 +1,38 @@
+
+
+ 第 {{ id - min + 1 }} 题
+
+
+
+ 共 {{ count }} 题
+
+
+
+
+
+
diff --git a/src/components/operate/page.vue b/src/components/operate/page.vue
new file mode 100644
index 0000000..d6c762b
--- /dev/null
+++ b/src/components/operate/page.vue
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/page/login.vue b/src/components/page/login.vue
new file mode 100644
index 0000000..0a1387c
--- /dev/null
+++ b/src/components/page/login.vue
@@ -0,0 +1,137 @@
+
+
+
+
+
+
+
+
+
+
+ 登录
+
+ 清除
+
+
+
+
+
+
+
diff --git a/src/components/page/main.vue b/src/components/page/main.vue
new file mode 100644
index 0000000..babbedc
--- /dev/null
+++ b/src/components/page/main.vue
@@ -0,0 +1,82 @@
+
+
+
+
+
+ 单选题
+
+
+ 多选题
+
+
+ 判断题
+
+
+ 问答题
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/topic/interlocution.vue b/src/components/topic/interlocution.vue
new file mode 100644
index 0000000..e9d43d2
--- /dev/null
+++ b/src/components/topic/interlocution.vue
@@ -0,0 +1,19 @@
+
+
+ 难度:{{
+ topic.difficulty == "0" ? "简单" : topic.difficulty == "1" ? "普通" : "困难"
+ }}
+
+
+
+ 题目:{{ topic.stem }}
+
+
+ 答案:{{ topic.answer }}
+
+
+
+
+
diff --git a/src/components/topic/judgment.vue b/src/components/topic/judgment.vue
new file mode 100644
index 0000000..1b36a05
--- /dev/null
+++ b/src/components/topic/judgment.vue
@@ -0,0 +1,44 @@
+
+
+ 难度:{{
+ topic.difficulty == "0" ? "简单" : topic.difficulty == "1" ? "普通" : "困难"
+ }}
+
+
+
+ 题目:{{ topic.stem }}
+
+
+ 正确
+ 错误
+
+
+
+ 答案:{{ topic.answer ? "正确" : "错误" }}
+
+
+
+
+
+
diff --git a/src/components/topic/multiple.vue b/src/components/topic/multiple.vue
new file mode 100644
index 0000000..1b250fc
--- /dev/null
+++ b/src/components/topic/multiple.vue
@@ -0,0 +1,96 @@
+
+
+ 难度:{{
+ topic.difficulty == "0" ? "简单" : topic.difficulty == "1" ? "普通" : "困难"
+ }}
+
+
+
+ 题目:{{ topic.stem }}
+
+
+
+
+
+
+
+
+
+
+
+
+ 查看答案
+
+
+
+
+ 答案:{{ topic.answer }}
+
+
+
+
+
+
diff --git a/src/components/topic/radio.vue b/src/components/topic/radio.vue
new file mode 100644
index 0000000..e9595a9
--- /dev/null
+++ b/src/components/topic/radio.vue
@@ -0,0 +1,54 @@
+
+
+ 难度:{{
+ topic.difficulty == "0" ? "简单" : topic.difficulty == "1" ? "普通" : "困难"
+ }}
+
+
+
+ 题目:{{ topic.stem }}
+
+
+
+ A:{{ topic.options_a }}
+
+
+ B:{{ topic.options_b }}
+
+
+ C:{{ topic.options_c }}
+
+
+ D:{{ topic.options_d }}
+
+
+
+
+ 答案:{{ topic.answer }}
+
+
+
+
+
+
diff --git a/src/main.js b/src/main.js
new file mode 100644
index 0000000..5233019
--- /dev/null
+++ b/src/main.js
@@ -0,0 +1,23 @@
+import './assets/main.css';
+
+import { createApp } from 'vue';
+import { createPinia } from 'pinia';
+import piniaPersist from 'pinia-plugin-persist';
+import ElementPlus from 'element-plus';
+import zhCn from 'element-plus/es/locale/lang/zh-cn';
+import 'element-plus/dist/index.css';
+import { AES_Encrypt } from '@/utils/aes.js';
+
+import App from './App.vue';
+import router from './router';
+
+const pinia = createPinia();
+pinia.use(piniaPersist);
+
+const app = createApp(App);
+app.config.globalProperties.$AES_Encrypt = AES_Encrypt //全局加密
+app.use(pinia);
+app.use(ElementPlus, { locale: zhCn });
+app.use(router);
+
+app.mount('#app');
\ No newline at end of file
diff --git a/src/router/index.js b/src/router/index.js
new file mode 100644
index 0000000..ca61576
--- /dev/null
+++ b/src/router/index.js
@@ -0,0 +1,46 @@
+import { createRouter, createWebHistory } from 'vue-router'
+
+const router = createRouter({
+ history: createWebHistory(import.meta.env.BASE_URL),
+ routes: [
+ {
+ path: '/404page',
+ name: '404page',
+ meta: { label: "404页面" },
+ component: () => import('../views/404page.vue')
+ },
+ {
+ path: '/initialService',
+ name: 'initialService',
+ meta: { label: "登录页面" },
+ component: () => import('../views/InitialService.vue')
+ },
+ {
+ path: '/main',
+ name: 'main',
+ meta: { label: "主页面" },
+ component: () => import('../views/Main.vue')
+ }
+ ]
+});
+
+router.beforeEach((to, from, next) => {
+ if (to.matched.length === 0) {
+ if (to.path == "/") {
+ router.push({ path: '/main' });
+ } else if (to.path == "/initialService") {
+ router.push({ path: '/initialService' });
+ } else {
+ router.push({ path: '/404page' });
+ }
+ } else {
+ next();
+ if(localStorage.length == 0) {
+ setTimeout(() => {
+ router.push({ path: '/initialService' });
+ }, 1000);
+ }
+ }
+});
+
+export default router
diff --git a/src/utils/aes.js b/src/utils/aes.js
new file mode 100644
index 0000000..074611a
--- /dev/null
+++ b/src/utils/aes.js
@@ -0,0 +1,29 @@
+import CryptoJS from 'crypto-js'
+
+const KEY = CryptoJS.enc.Utf8.parse('BDQH');
+
+export const AES_Encrypt = (plaintext) => {
+ let ciphertext = CryptoJS.AES.encrypt(plaintext, KEY, {
+ mode: CryptoJS.mode.ECB,
+ padding: CryptoJS.pad.Pkcs7
+ }).toString();
+ return ciphertext;
+}
+
+export const encrypt = (plaintext) => {
+ if(plaintext !== null && plaintext !== undefined && plaintext !== "") {
+ return CryptoJS.AES.encrypt(plaintext, KEY, {
+ mode: CryptoJS.mode.ECB,
+ padding: CryptoJS.pad.Pkcs7
+ }).toString();
+ }
+}
+
+export const decrypt = (plaintext) => {
+ if(plaintext !== null && plaintext !== undefined && !plaintext == "") {
+ return CryptoJS.AES.decrypt(plaintext, KEY, {
+ mode: CryptoJS.mode.ECB,
+ padding: CryptoJS.pad.Pkcs7
+ }).toString(CryptoJS.enc.Utf8);
+ }
+}
\ No newline at end of file
diff --git a/src/views/404page.vue b/src/views/404page.vue
new file mode 100644
index 0000000..0377877
--- /dev/null
+++ b/src/views/404page.vue
@@ -0,0 +1,21 @@
+
+
+ 404 not found
+
+ 您搜索的页面不存在
+
+ 返回首页
+
+
+
+
+
+
diff --git a/src/views/InitialService.vue b/src/views/InitialService.vue
new file mode 100644
index 0000000..a1a74b5
--- /dev/null
+++ b/src/views/InitialService.vue
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/Main.vue b/src/views/Main.vue
new file mode 100644
index 0000000..69de38e
--- /dev/null
+++ b/src/views/Main.vue
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tailwind.config.js b/tailwind.config.js
new file mode 100644
index 0000000..1f9ce20
--- /dev/null
+++ b/tailwind.config.js
@@ -0,0 +1,13 @@
+/** @type {import('tailwindcss').Config} */
+export default {
+ purge: ['./index.html', './src/**/*.{vue,js,ts,jsx,tsx}'],
+ darkMode: false, // or 'media' or 'class'
+ content: [],
+ theme: {
+ extend: {},
+ },
+ variants: {
+ extend: {},
+ },
+ plugins: [],
+}
\ No newline at end of file
diff --git a/vite.config.js b/vite.config.js
new file mode 100644
index 0000000..0a3c62d
--- /dev/null
+++ b/vite.config.js
@@ -0,0 +1,44 @@
+import { fileURLToPath, URL } from 'node:url'
+
+import { defineConfig } from 'vite'
+import vue from '@vitejs/plugin-vue'
+import AutoImport from 'unplugin-auto-import/vite'
+import Components from 'unplugin-vue-components/vite'
+import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ base: './',
+ publicPath: './',
+ plugins: [
+ vue(),
+ AutoImport({
+ resolvers: [ElementPlusResolver()],
+ }),
+ Components({
+ resolvers: [ElementPlusResolver()],
+ }),
+ ],
+ resolve: {
+ alias: {
+ '@': fileURLToPath(new URL('./src', import.meta.url))
+ }
+ },
+ server: {
+ //用来配置跨域
+ host: '127.0.0.1',
+ port: 7033,
+ proxy: {
+ '/authentication': {
+ target: 'http://127.0.0.1:8011',//鉴权服务器地址
+ changeOrigin: true,
+ rewrite: (path) => path.replace(/^\/authentication/, '')
+ },
+ '/bdTrainingExamTopic': {
+ target: 'http://127.0.0.1:8021',//目标服务器地址
+ changeOrigin: true,
+ rewrite: (path) => path.replace(/^\/bdTrainingExamTopic/, '')
+ },
+ }
+ }
+})