Compare commits
merge into: majun:master
majun:backup-before-author-change
majun:chenzhen/feature-20251107115823-股票知识测评
majun:daijiajun/feature-20251107115823-股票知识测评
majun:main
majun:master
majun:milestone-20251107-股票知识测评
pull from: majun:backup-before-author-change
majun:backup-before-author-change
majun:chenzhen/feature-20251107115823-股票知识测评
majun:daijiajun/feature-20251107115823-股票知识测评
majun:main
majun:master
majun:milestone-20251107-股票知识测评
No commits in common. 'master' and 'backup-before-author-change' have entirely different histories.
master
...
backup-bef
26 changed files with 20185 additions and 9 deletions
-
28.gitignore
-
24README.md
-
5babel.config.js
-
19jsconfig.json
-
19514package-lock.json
-
44package.json
-
BINpublic/favicon.ico
-
17public/index.html
-
212src/App.vue
-
BINsrc/assets/logo.png
-
58src/components/HelloWorld.vue
-
31src/components/Layout/Header.vue
-
50src/components/Layout/Sidebar.vue
-
36src/components/Question/QuestionSearch.vue
-
69src/components/Question/QuestionTable.vue
-
38src/components/Tabs/TabNavigation.vue
-
8src/main.js
-
37src/router/index.js
-
0src/views/HomeView.vue
-
0src/views/OneView.vue
-
0src/views/ProblemView.vue
-
0src/views/QuestionManage.vue
-
0src/views/ReportView.vue
-
0src/views/TestView.vue
-
0src/views/WrongQuestion.vue
-
4vue.config.js
@ -1,11 +1,23 @@ |
|||
# ---> Vue |
|||
# gitignore template for Vue.js projects |
|||
# |
|||
# Recommended template: Node.gitignore |
|||
.DS_Store |
|||
node_modules |
|||
/dist |
|||
|
|||
# TODO: where does this rule come from? |
|||
docs/_book |
|||
|
|||
# TODO: where does this rule come from? |
|||
test/ |
|||
# local env files |
|||
.env.local |
|||
.env.*.local |
|||
|
|||
# Log files |
|||
npm-debug.log* |
|||
yarn-debug.log* |
|||
yarn-error.log* |
|||
pnpm-debug.log* |
|||
|
|||
# Editor directories and files |
|||
.idea |
|||
.vscode |
|||
*.suo |
|||
*.ntvs* |
|||
*.njsproj |
|||
*.sln |
|||
*.sw? |
|||
@ -1,2 +1,24 @@ |
|||
# Knowledge_Test_Vue |
|||
# evaluation-system |
|||
|
|||
## Project setup |
|||
``` |
|||
npm install |
|||
``` |
|||
|
|||
### Compiles and hot-reloads for development |
|||
``` |
|||
npm run serve |
|||
``` |
|||
|
|||
### Compiles and minifies for production |
|||
``` |
|||
npm run build |
|||
``` |
|||
|
|||
### Lints and fixes files |
|||
``` |
|||
npm run lint |
|||
``` |
|||
|
|||
### Customize configuration |
|||
See [Configuration Reference](https://cli.vuejs.org/config/). |
|||
@ -0,0 +1,5 @@ |
|||
module.exports = { |
|||
presets: [ |
|||
'@vue/cli-plugin-babel/preset' |
|||
] |
|||
} |
|||
@ -0,0 +1,19 @@ |
|||
{ |
|||
"compilerOptions": { |
|||
"target": "es5", |
|||
"module": "esnext", |
|||
"baseUrl": "./", |
|||
"moduleResolution": "node", |
|||
"paths": { |
|||
"@/*": [ |
|||
"src/*" |
|||
] |
|||
}, |
|||
"lib": [ |
|||
"esnext", |
|||
"dom", |
|||
"dom.iterable", |
|||
"scripthost" |
|||
] |
|||
} |
|||
} |
|||
19514
package-lock.json
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,44 @@ |
|||
{ |
|||
"name": "evaluation-system", |
|||
"version": "0.1.0", |
|||
"private": true, |
|||
"scripts": { |
|||
"serve": "vue-cli-service serve", |
|||
"build": "vue-cli-service build", |
|||
"lint": "vue-cli-service lint" |
|||
}, |
|||
"dependencies": { |
|||
"core-js": "^3.8.3", |
|||
"vue": "^2.6.14", |
|||
"vue-router": "^3.6.5" |
|||
}, |
|||
"devDependencies": { |
|||
"@babel/core": "^7.12.16", |
|||
"@babel/eslint-parser": "^7.12.16", |
|||
"@vue/cli-plugin-babel": "~5.0.0", |
|||
"@vue/cli-plugin-eslint": "~5.0.0", |
|||
"@vue/cli-service": "~5.0.0", |
|||
"eslint": "^7.32.0", |
|||
"eslint-plugin-vue": "^8.0.3", |
|||
"vue-template-compiler": "^2.6.14" |
|||
}, |
|||
"eslintConfig": { |
|||
"root": true, |
|||
"env": { |
|||
"node": true |
|||
}, |
|||
"extends": [ |
|||
"plugin:vue/essential", |
|||
"eslint:recommended" |
|||
], |
|||
"parserOptions": { |
|||
"parser": "@babel/eslint-parser" |
|||
}, |
|||
"rules": {} |
|||
}, |
|||
"browserslist": [ |
|||
"> 1%", |
|||
"last 2 versions", |
|||
"not dead" |
|||
] |
|||
} |
|||
@ -0,0 +1,17 @@ |
|||
<!DOCTYPE html> |
|||
<html lang=""> |
|||
<head> |
|||
<meta charset="utf-8"> |
|||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
|||
<meta name="viewport" content="width=device-width,initial-scale=1.0"> |
|||
<link rel="icon" href="<%= BASE_URL %>favicon.ico"> |
|||
<title><%= htmlWebpackPlugin.options.title %></title> |
|||
</head> |
|||
<body> |
|||
<noscript> |
|||
<strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong> |
|||
</noscript> |
|||
<div id="app"></div> |
|||
<!-- built files will be auto injected --> |
|||
</body> |
|||
</html> |
|||
@ -0,0 +1,212 @@ |
|||
<!--全局样式--> |
|||
<template> |
|||
<div id="app"> |
|||
<Header /> |
|||
<div class="container"> |
|||
<Sidebar /> |
|||
<div class="content"> |
|||
<div class="title">测评系统后台</div> |
|||
<TabNavigation :active-tab="activeTab" @update:activeTab="activeTab = $event" /> |
|||
|
|||
<!-- 内容区域 --> |
|||
<div v-if="activeTab === 'question'" class="question-management"> |
|||
<QuestionSearch /> |
|||
<QuestionTable /> |
|||
</div> |
|||
|
|||
<!-- 其他模块占位 --> |
|||
<div v-else class="placeholder"> |
|||
<p>当前模块内容暂未开发</p> |
|||
</div> |
|||
|
|||
<div class="footer-btn"> |
|||
<button class="btn-red">应用</button> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</template> |
|||
|
|||
<script> |
|||
import Header from './components/Layout/Header.vue' |
|||
import Sidebar from './components/Layout/Sidebar.vue' |
|||
import TabNavigation from './components/Tabs/TabNavigation.vue' |
|||
import QuestionSearch from './components/Question/QuestionSearch.vue' |
|||
import QuestionTable from './components/Question/QuestionTable.vue' |
|||
|
|||
export default { |
|||
name: 'App', |
|||
components: { |
|||
Header, |
|||
Sidebar, |
|||
TabNavigation, |
|||
QuestionSearch, |
|||
QuestionTable |
|||
}, |
|||
data() { |
|||
return { |
|||
activeTab: 'question' |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
<style>/* 保持原有的全局样式 */ |
|||
* { |
|||
margin: 0; |
|||
padding: 0; |
|||
box-sizing: border-box; |
|||
} |
|||
|
|||
body { |
|||
font-family: 'Arial', sans-serif; |
|||
background-color: #f5f5f5; |
|||
} |
|||
|
|||
#app { |
|||
width: 100%; |
|||
height: 100vh; |
|||
display: flex; |
|||
flex-direction: column; |
|||
} |
|||
|
|||
.header { |
|||
height: 60px; |
|||
background-color: white; |
|||
display: flex; |
|||
align-items: center; |
|||
justify-content: flex-start; |
|||
padding-left: 20px; |
|||
box-shadow: 0 2px 4px rgba(0,0,0,0.1); |
|||
} |
|||
|
|||
.logo { |
|||
color: #e74c3c; |
|||
font-weight: bold; |
|||
font-size: 18px; |
|||
} |
|||
|
|||
.container { |
|||
display: flex; |
|||
flex: 1; |
|||
overflow: hidden; |
|||
} |
|||
|
|||
.content { |
|||
flex: 1; |
|||
padding: 20px; |
|||
background-color: white; |
|||
overflow-y: auto; |
|||
} |
|||
|
|||
.title { |
|||
font-size: 20px; |
|||
margin-bottom: 20px; |
|||
color: #333; |
|||
} |
|||
|
|||
.tabs { |
|||
display: flex; |
|||
gap: 10px; |
|||
margin-bottom: 20px; |
|||
} |
|||
|
|||
.tab-btn { |
|||
padding: 8px 16px; |
|||
background-color: #e74c3c; |
|||
color: white; |
|||
border: none; |
|||
border-radius: 4px; |
|||
cursor: pointer; |
|||
transition: opacity 0.3s; |
|||
} |
|||
|
|||
.tab-btn:hover { |
|||
background-color: #c0392b; |
|||
} |
|||
|
|||
.tab-btn.active { |
|||
opacity: 0.5; |
|||
} |
|||
|
|||
.search-area { |
|||
display: flex; |
|||
justify-content: space-between; |
|||
align-items: center; |
|||
margin-bottom: 20px; |
|||
gap: 20px; |
|||
} |
|||
|
|||
.search-item { |
|||
display: flex; |
|||
flex-direction: column; |
|||
min-width: 160px; |
|||
} |
|||
|
|||
.search-item label { |
|||
margin-bottom: 5px; |
|||
font-size: 14px; |
|||
color: #666; |
|||
} |
|||
|
|||
.search-item select, |
|||
.search-item input { |
|||
padding: 8px; |
|||
border: 1px solid #ccc; |
|||
border-radius: 4px; |
|||
font-size: 14px; |
|||
} |
|||
|
|||
.btn-group { |
|||
display: flex; |
|||
gap: 10px; |
|||
} |
|||
|
|||
.btn-red { |
|||
padding: 8px 16px; |
|||
background-color: #e74c3c; |
|||
color: white; |
|||
border: none; |
|||
border-radius: 4px; |
|||
cursor: pointer; |
|||
} |
|||
|
|||
.btn-red.small { |
|||
padding: 4px 10px; |
|||
font-size: 12px; |
|||
} |
|||
|
|||
.table-container { |
|||
width: 100%; |
|||
border-collapse: collapse; |
|||
margin-top: 10px; |
|||
} |
|||
|
|||
table { |
|||
width: 100%; |
|||
border-collapse: collapse; |
|||
background-color: white; |
|||
} |
|||
|
|||
th, |
|||
td { |
|||
padding: 12px; |
|||
text-align: left; |
|||
border-bottom: 1px solid #ddd; |
|||
} |
|||
|
|||
th { |
|||
background-color: #f2f2f2; |
|||
font-weight: normal; |
|||
color: #333; |
|||
} |
|||
|
|||
tr:hover { |
|||
background-color: #f9f9f9; |
|||
} |
|||
|
|||
.footer-btn { |
|||
position: absolute; |
|||
bottom: 20px; |
|||
right: 20px; |
|||
} |
|||
</style> |
|||
|
After Width: 200 | Height: 200 | Size: 6.7 KiB |
@ -0,0 +1,58 @@ |
|||
<template> |
|||
<div class="hello"> |
|||
<h1>{{ msg }}</h1> |
|||
<p> |
|||
For a guide and recipes on how to configure / customize this project,<br> |
|||
check out the |
|||
<a href="https://cli.vuejs.org" target="_blank" rel="noopener">vue-cli documentation</a>. |
|||
</p> |
|||
<h3>Installed CLI Plugins</h3> |
|||
<ul> |
|||
<li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-babel" target="_blank" rel="noopener">babel</a></li> |
|||
<li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-eslint" target="_blank" rel="noopener">eslint</a></li> |
|||
</ul> |
|||
<h3>Essential Links</h3> |
|||
<ul> |
|||
<li><a href="https://vuejs.org" target="_blank" rel="noopener">Core Docs</a></li> |
|||
<li><a href="https://forum.vuejs.org" target="_blank" rel="noopener">Forum</a></li> |
|||
<li><a href="https://chat.vuejs.org" target="_blank" rel="noopener">Community Chat</a></li> |
|||
<li><a href="https://twitter.com/vuejs" target="_blank" rel="noopener">Twitter</a></li> |
|||
<li><a href="https://news.vuejs.org" target="_blank" rel="noopener">News</a></li> |
|||
</ul> |
|||
<h3>Ecosystem</h3> |
|||
<ul> |
|||
<li><a href="https://router.vuejs.org" target="_blank" rel="noopener">vue-router</a></li> |
|||
<li><a href="https://vuex.vuejs.org" target="_blank" rel="noopener">vuex</a></li> |
|||
<li><a href="https://github.com/vuejs/vue-devtools#vue-devtools" target="_blank" rel="noopener">vue-devtools</a></li> |
|||
<li><a href="https://vue-loader.vuejs.org" target="_blank" rel="noopener">vue-loader</a></li> |
|||
<li><a href="https://github.com/vuejs/awesome-vue" target="_blank" rel="noopener">awesome-vue</a></li> |
|||
</ul> |
|||
</div> |
|||
</template> |
|||
|
|||
<script> |
|||
export default { |
|||
name: 'HelloWorld', |
|||
props: { |
|||
msg: String |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<!-- Add "scoped" attribute to limit CSS to this component only --> |
|||
<style scoped> |
|||
h3 { |
|||
margin: 40px 0 0; |
|||
} |
|||
ul { |
|||
list-style-type: none; |
|||
padding: 0; |
|||
} |
|||
li { |
|||
display: inline-block; |
|||
margin: 0 10px; |
|||
} |
|||
a { |
|||
color: #42b983; |
|||
} |
|||
</style> |
|||
@ -0,0 +1,31 @@ |
|||
<!--头部组件--> |
|||
<template> |
|||
<div class="header"> |
|||
<div class="logo">Homily Link</div> |
|||
</div> |
|||
</template> |
|||
|
|||
<script> |
|||
export default { |
|||
// eslint-disable-next-line vue/multi-word-component-names |
|||
name: 'Header' |
|||
} |
|||
</script> |
|||
|
|||
<style scoped> |
|||
.header { |
|||
height: 60px; |
|||
background-color: white; |
|||
display: flex; |
|||
align-items: center; |
|||
justify-content: flex-start; |
|||
padding-left: 20px; |
|||
box-shadow: 0 2px 4px rgba(0,0,0,0.1); |
|||
} |
|||
|
|||
.logo { |
|||
color: #e74c3c; |
|||
font-weight: bold; |
|||
font-size: 18px; |
|||
} |
|||
</style> |
|||
@ -0,0 +1,50 @@ |
|||
<!--侧边栏组件--> |
|||
<template> |
|||
<div class="sidebar"> |
|||
<ul class="sidebar-menu"> |
|||
<li>主页</li> |
|||
<li>发文章</li> |
|||
<li>我的内容</li> |
|||
<li>我的收藏</li> |
|||
<li>评论管理</li> |
|||
<li>账号设置</li> |
|||
<li class="active">测评管理</li> |
|||
</ul> |
|||
</div> |
|||
</template> |
|||
|
|||
<script> |
|||
export default { |
|||
name: 'SideBar' |
|||
} |
|||
</script> |
|||
|
|||
<style scoped> |
|||
.sidebar { |
|||
width: 200px; |
|||
background-color: #f5f5f5; |
|||
height: 100%; |
|||
border-right: 1px solid #ddd; |
|||
} |
|||
|
|||
.sidebar-menu { |
|||
list-style: none; |
|||
padding: 0; |
|||
margin: 0; |
|||
} |
|||
|
|||
.sidebar-menu li { |
|||
padding: 15px 20px; |
|||
cursor: pointer; |
|||
transition: background-color 0.3s; |
|||
} |
|||
|
|||
.sidebar-menu li:hover { |
|||
background-color: #e0e0e0; |
|||
} |
|||
|
|||
.sidebar-menu li.active { |
|||
background-color: #d1ecf1; |
|||
color: #007bff; |
|||
} |
|||
</style> |
|||
@ -0,0 +1,36 @@ |
|||
<!--搜索区域--> |
|||
<template> |
|||
<div class="search-area"> |
|||
<div class="search-item"> |
|||
<label>题目类型</label> |
|||
<select> |
|||
<option>股票知识</option> |
|||
<option>基金知识</option> |
|||
<option>投资策略</option> |
|||
</select> |
|||
</div> |
|||
<div class="search-item"> |
|||
<label>题干查找</label> |
|||
<input type="text" placeholder="请输入题干关键词" /> |
|||
</div> |
|||
<div class="search-item"> |
|||
<label>课程推荐</label> |
|||
<select> |
|||
<option>量能擒牛</option> |
|||
<option>趋势交易</option> |
|||
<option>基本面分析</option> |
|||
</select> |
|||
</div> |
|||
<div class="btn-group"> |
|||
<button class="btn-red">查找</button> |
|||
<button class="btn-red">新增题目</button> |
|||
<button class="btn-red">Excel导出</button> |
|||
</div> |
|||
</div> |
|||
</template> |
|||
|
|||
<script> |
|||
export default { |
|||
name: 'QuestionSearch' |
|||
} |
|||
</script> |
|||
@ -0,0 +1,69 @@ |
|||
<template> |
|||
<div class="table-container"> |
|||
<table> |
|||
<thead> |
|||
<tr> |
|||
<th>ID</th> |
|||
<th>题干</th> |
|||
<th>题目类型</th> |
|||
<th>出错次数</th> |
|||
<th>出错率</th> |
|||
<th>推荐课程</th> |
|||
<th>操作</th> |
|||
</tr> |
|||
</thead> |
|||
<tbody> |
|||
<tr> |
|||
<td>1</td> |
|||
<td>以下哪项不是股票的基本特征?</td> |
|||
<td>股票知识</td> |
|||
<td>50</td> |
|||
<td>50%</td> |
|||
<td>量能擒牛</td> |
|||
<td> |
|||
<button class="btn-red small">查看</button> |
|||
<button class="btn-red small">修改</button> |
|||
<button class="btn-red small">删除</button> |
|||
</td> |
|||
</tr> |
|||
</tbody> |
|||
</table> |
|||
</div> |
|||
</template> |
|||
|
|||
<script> |
|||
export default { |
|||
name: 'QuestionTable' |
|||
} |
|||
</script> |
|||
|
|||
<style scoped> |
|||
.table-container { |
|||
width: 100%; |
|||
border-collapse: collapse; |
|||
margin-top: 10px; |
|||
} |
|||
|
|||
table { |
|||
width: 100%; |
|||
border-collapse: collapse; |
|||
background-color: white; |
|||
} |
|||
|
|||
th, |
|||
td { |
|||
padding: 12px; |
|||
text-align: left; |
|||
border-bottom: 1px solid #ddd; |
|||
} |
|||
|
|||
th { |
|||
background-color: #f2f2f2; |
|||
font-weight: normal; |
|||
color: #333; |
|||
} |
|||
|
|||
tr:hover { |
|||
background-color: #f9f9f9; |
|||
} |
|||
</style> |
|||
@ -0,0 +1,38 @@ |
|||
<!--标签页导航--> |
|||
<template> |
|||
<div class="tabs"> |
|||
<button |
|||
class="tab-btn" |
|||
:class="{ active: activeTab === 'user' }" |
|||
@click="$emit('update:activeTab', 'user')" |
|||
> |
|||
用户数据 |
|||
</button> |
|||
<button |
|||
class="tab-btn" |
|||
:class="{ active: activeTab === 'wrong' }" |
|||
@click="$emit('update:activeTab', 'wrong')" |
|||
> |
|||
错题统计 |
|||
</button> |
|||
<button |
|||
class="tab-btn" |
|||
:class="{ active: activeTab === 'question' }" |
|||
@click="$emit('update:activeTab', 'question')" |
|||
> |
|||
题库管理 |
|||
</button> |
|||
</div> |
|||
</template> |
|||
|
|||
<script> |
|||
export default { |
|||
name: 'TabNavigation', |
|||
props: { |
|||
activeTab: { |
|||
type: String, |
|||
required: true |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
@ -0,0 +1,8 @@ |
|||
import Vue from 'vue' |
|||
import App from './App.vue' |
|||
|
|||
Vue.config.productionTip = false |
|||
|
|||
new Vue({ |
|||
render: h => h(App), |
|||
}).$mount('#app') |
|||
@ -0,0 +1,37 @@ |
|||
import Vue from 'vue' |
|||
import VueRouter from 'vue-router' |
|||
import QuestionManage from '@/views/QuestionManage.vue' |
|||
import UserStatistics from '@/views/UserStatistics.vue' |
|||
import WrongQuestion from '@/views/WrongQuestion.vue' |
|||
|
|||
Vue.use(VueRouter) |
|||
|
|||
const routes = [ |
|||
{ |
|||
path: '/', |
|||
redirect: '/questions' |
|||
}, |
|||
{ |
|||
path: '/questions', |
|||
name: 'QuestionManage', |
|||
component: QuestionManage |
|||
}, |
|||
{ |
|||
path: '/users', |
|||
name: 'UserStatistics', |
|||
component: UserStatistics |
|||
}, |
|||
{ |
|||
path: '/wrong-questions', |
|||
name: 'WrongQuestion', |
|||
component: WrongQuestion |
|||
} |
|||
] |
|||
|
|||
const router = new VueRouter({ |
|||
mode: 'history', |
|||
base: process.env.BASE_URL, |
|||
routes |
|||
}) |
|||
|
|||
export default router |
|||
@ -0,0 +1,4 @@ |
|||
const { defineConfig } = require('@vue/cli-service') |
|||
module.exports = defineConfig({ |
|||
transpileDependencies: true |
|||
}) |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue