3 changed files with 898 additions and 1 deletions
@ -0,0 +1,891 @@ |
|||||
|
<template> |
||||
|
<div class="home"> |
||||
|
<div class="top"> |
||||
|
<h1>📈股票知识评测系统</h1> |
||||
|
<p>全方面评估您的股票投资知识水平,获取个性化学习建议</p> |
||||
|
</div> |
||||
|
|
||||
|
|
||||
|
|
||||
|
<div class="clearfix"> |
||||
|
<div class="content"> |
||||
|
<div class="block"> |
||||
|
<div class="schedule" :style="{ width: progress + '%' }"></div> |
||||
|
</div> |
||||
|
<div class="question-block" v-if="currentQuestion"> |
||||
|
<div class="question"> |
||||
|
<span class="text-lg font-bold mr-2">{{ currentQuestionIndex + 1 }}、</span> |
||||
|
{{ currentQuestion.question }} |
||||
|
</div> |
||||
|
<div class="options"> |
||||
|
<label |
||||
|
class="option" |
||||
|
:class="{ 'selected': selectedOption === option.value }" |
||||
|
v-for="option in currentQuestion.options" |
||||
|
:key="option.value" |
||||
|
> |
||||
|
<input |
||||
|
type="radio" |
||||
|
:name="'answer' + (currentQuestionIndex + 1)" |
||||
|
:value="option.value" |
||||
|
v-model="selectedOption" |
||||
|
> |
||||
|
<span class="label">{{ option.label }}</span> |
||||
|
</label> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="question-block" v-if="currentQuestion"> |
||||
|
<div class="question"> |
||||
|
<span class="text-lg font-bold mr-2">{{ currentQuestionIndex + 2 }}、</span> |
||||
|
{{ currentQuestion.question }} |
||||
|
</div> |
||||
|
<div class="options"> |
||||
|
<label |
||||
|
class="option" |
||||
|
:class="{ 'selected': selectedOption === option.value }" |
||||
|
v-for="option in currentQuestion.options" |
||||
|
:key="option.value" |
||||
|
> |
||||
|
<input |
||||
|
type="radio" |
||||
|
:name="'answer' + (currentQuestionIndex + 2)" |
||||
|
:value="option.value" |
||||
|
v-model="selectedOption" |
||||
|
> |
||||
|
<span class="label">{{ option.label }}</span> |
||||
|
</label> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<div class="nav-buttons"> |
||||
|
<button |
||||
|
class="nav-btn prev" |
||||
|
@click="prevQuestion" |
||||
|
:disabled="currentQuestionIndex === 0" |
||||
|
> |
||||
|
← 上一题 |
||||
|
</button> |
||||
|
<button |
||||
|
class="nav-btn next" |
||||
|
@click="nextQuestion" |
||||
|
:disabled="currentQuestionIndex === questions.length - 1" |
||||
|
> |
||||
|
下一题 → |
||||
|
</button> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<div class="right"> |
||||
|
<div class="time-module"> |
||||
|
<h3>⏰ 考试时间</h3> |
||||
|
<div class="current-time">{{ currentTime }}</div> |
||||
|
<div class="countdown">倒计时: {{ countdown }}</div> |
||||
|
</div> |
||||
|
|
||||
|
<div class="question-nav"> |
||||
|
<h3>📝 题目导航</h3> |
||||
|
<div class="question-grid"> |
||||
|
<div |
||||
|
class="question-number" |
||||
|
:class="getQuestionStatusClass(i)" |
||||
|
@click="goToQuestion(i)" |
||||
|
v-for="i in questions.length" |
||||
|
:key="i" |
||||
|
> |
||||
|
{{ i }} |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="pagination"> |
||||
|
<button |
||||
|
class="pagination-btn" |
||||
|
@click="changePage(page - 1)" |
||||
|
:disabled="page === 1" |
||||
|
> |
||||
|
上一页 |
||||
|
</button> |
||||
|
<span>第 {{ page }} 页 / 共 {{ totalPages }} 页</span> |
||||
|
<button |
||||
|
class="pagination-btn" |
||||
|
@click="changePage(page + 1)" |
||||
|
:disabled="page === totalPages" |
||||
|
> |
||||
|
下一页 |
||||
|
</button> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<div class="statistics"> |
||||
|
<h3>📊 答题统计</h3> |
||||
|
<div class="statistics-item"> |
||||
|
<span class="statistics-label">总题数:</span> |
||||
|
<span class="statistics-value">{{ questions.length }}</span> |
||||
|
</div> |
||||
|
<div class="statistics-item"> |
||||
|
<span class="statistics-label">已答题数:</span> |
||||
|
<span class="statistics-value">{{ answeredCount }}</span> |
||||
|
</div> |
||||
|
<div class="statistics-item"> |
||||
|
<span class="statistics-label">未答题数:</span> |
||||
|
<span class="statistics-value">{{ questions.length - answeredCount }}</span> |
||||
|
</div> |
||||
|
<div class="statistics-item"> |
||||
|
<span class="statistics-label">完成率:</span> |
||||
|
<span class="statistics-value">{{ completionRate.toFixed(1) }}%</span> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<button |
||||
|
class="submit-btn" |
||||
|
@click="submitTest" |
||||
|
:disabled="answeredCount === 0" |
||||
|
> |
||||
|
🚀 提交试卷 |
||||
|
</button> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
// 股票知识题目数据 |
||||
|
const stockQuestions = [ |
||||
|
{ |
||||
|
id: 1, |
||||
|
question: "以下哪项不是股票的基本特征?", |
||||
|
options: [ |
||||
|
{ value: "A", label: "A. 收益性" }, |
||||
|
{ value: "B", label: "B. 风险性" }, |
||||
|
{ value: "C", label: "C. 流动性" }, |
||||
|
{ value: "D", label: "D. 固定性" } |
||||
|
], |
||||
|
answer: "D" |
||||
|
}, |
||||
|
{ |
||||
|
id: 2, |
||||
|
question: "股票市场中,'IPO'的全称是什么?", |
||||
|
options: [ |
||||
|
{ value: "A", label: "A. Initial Public Offering" }, |
||||
|
{ value: "B", label: "B. International Public Offering" }, |
||||
|
{ value: "C", label: "C. Initial Private Offering" }, |
||||
|
{ value: "D", label: "D. International Private Offering" } |
||||
|
], |
||||
|
answer: "A" |
||||
|
}, |
||||
|
{ |
||||
|
id: 3, |
||||
|
question: "以下哪个指标不属于股票的技术分析指标?", |
||||
|
options: [ |
||||
|
{ value: "A", label: "A. MACD" }, |
||||
|
{ value: "B", label: "B. KDJ" }, |
||||
|
{ value: "C", label: "C. ROE" }, |
||||
|
{ value: "D", label: "D. RSI" } |
||||
|
], |
||||
|
answer: "C" |
||||
|
}, |
||||
|
{ |
||||
|
id: 4, |
||||
|
question: "股票代码以'60'开头的是哪个交易所的股票?", |
||||
|
options: [ |
||||
|
{ value: "A", label: "A. 深圳证券交易所" }, |
||||
|
{ value: "B", label: "B. 上海证券交易所" }, |
||||
|
{ value: "C", label: "C. 香港交易所" }, |
||||
|
{ value: "D", label: "D. 美国纳斯达克" } |
||||
|
], |
||||
|
answer: "B" |
||||
|
}, |
||||
|
{ |
||||
|
id: 5, |
||||
|
question: "以下哪项不属于基本面分析的范畴?", |
||||
|
options: [ |
||||
|
{ value: "A", label: "A. 公司财务报表分析" }, |
||||
|
{ value: "B", label: "B. 行业发展趋势分析" }, |
||||
|
{ value: "C", label: "C. 宏观经济环境分析" }, |
||||
|
{ value: "D", label: "D. 股票价格走势图分析" } |
||||
|
], |
||||
|
answer: "D" |
||||
|
}, |
||||
|
{ |
||||
|
id: 6, |
||||
|
question: "股票交易中,'涨停板'是指股票价格上涨到什么程度后停止交易?", |
||||
|
options: [ |
||||
|
{ value: "A", label: "A. 5%" }, |
||||
|
{ value: "B", label: "B. 10%" }, |
||||
|
{ value: "C", label: "C. 15%" }, |
||||
|
{ value: "D", label: "D. 20%" } |
||||
|
], |
||||
|
answer: "B" |
||||
|
}, |
||||
|
{ |
||||
|
id: 7, |
||||
|
question: "以下哪个不是股票指数?", |
||||
|
options: [ |
||||
|
{ value: "A", label: "A. 上证指数" }, |
||||
|
{ value: "B", label: "B. 深证成指" }, |
||||
|
{ value: "C", label: "C. 恒生指数" }, |
||||
|
{ value: "D", label: "D. GDP指数" } |
||||
|
], |
||||
|
answer: "D" |
||||
|
}, |
||||
|
{ |
||||
|
id: 8, |
||||
|
question: "股票投资中,'PE比率'指的是什么?", |
||||
|
options: [ |
||||
|
{ value: "A", label: "A. 市盈率" }, |
||||
|
{ value: "B", label: "B. 市净率" }, |
||||
|
{ value: "C", label: "C. 收益率" }, |
||||
|
{ value: "D", label: "D. 波动率" } |
||||
|
], |
||||
|
answer: "A" |
||||
|
}, |
||||
|
{ |
||||
|
id: 9, |
||||
|
question: "以下哪种订单类型可以确保以指定价格或更好的价格成交?", |
||||
|
options: [ |
||||
|
{ value: "A", label: "A. 市价单" }, |
||||
|
{ value: "B", label: "B. 限价单" }, |
||||
|
{ value: "C", label: "C. 止损单" }, |
||||
|
{ value: "D", label: "D. 止盈单" } |
||||
|
], |
||||
|
answer: "B" |
||||
|
}, |
||||
|
{ |
||||
|
id: 10, |
||||
|
question: "股票市场中,'熊市'指的是什么市场状态?", |
||||
|
options: [ |
||||
|
{ value: "A", label: "A. 市场持续上涨" }, |
||||
|
{ value: "B", label: "B. 市场持续下跌" }, |
||||
|
{ value: "C", label: "C. 市场震荡整理" }, |
||||
|
{ value: "D", label: "D. 市场活跃度低" } |
||||
|
], |
||||
|
answer: "B" |
||||
|
}, |
||||
|
{ |
||||
|
id: 11, |
||||
|
question: "以下哪项不是影响股票价格的因素?", |
||||
|
options: [ |
||||
|
{ value: "A", label: "A. 公司业绩" }, |
||||
|
{ value: "B", label: "B. 宏观经济数据" }, |
||||
|
{ value: "C", label: "C. 投资者情绪" }, |
||||
|
{ value: "D", label: "D. 公司员工数量" } |
||||
|
], |
||||
|
answer: "D" |
||||
|
}, |
||||
|
{ |
||||
|
id: 12, |
||||
|
question: "股票交易的最小单位是什么?", |
||||
|
options: [ |
||||
|
{ value: "A", label: "A. 1股" }, |
||||
|
{ value: "B", label: "B. 10股" }, |
||||
|
{ value: "C", label: "C. 100股" }, |
||||
|
{ value: "D", label: "D. 1000股" } |
||||
|
], |
||||
|
answer: "C" |
||||
|
}, |
||||
|
{ |
||||
|
id: 13, |
||||
|
question: "以下哪个不是股票的分类?", |
||||
|
options: [ |
||||
|
{ value: "A", label: "A. 普通股" }, |
||||
|
{ value: "B", label: "B. 优先股" }, |
||||
|
{ value: "C", label: "C. 蓝筹股" }, |
||||
|
{ value: "D", label: "D. 债券股" } |
||||
|
], |
||||
|
answer: "D" |
||||
|
}, |
||||
|
{ |
||||
|
id: 14, |
||||
|
question: "股票投资中的'分散投资'策略主要是为了降低什么风险?", |
||||
|
options: [ |
||||
|
{ value: "A", label: "A. 系统性风险" }, |
||||
|
{ value: "B", label: "B. 非系统性风险" }, |
||||
|
{ value: "C", label: "C. 市场风险" }, |
||||
|
{ value: "D", label: "D. 流动性风险" } |
||||
|
], |
||||
|
answer: "B" |
||||
|
}, |
||||
|
{ |
||||
|
id: 15, |
||||
|
question: "以下哪项不是技术分析的假设前提?", |
||||
|
options: [ |
||||
|
{ value: "A", label: "A. 市场行为涵盖一切信息" }, |
||||
|
{ value: "B", label: "B. 价格沿趋势移动" }, |
||||
|
{ value: "C", label: "C. 历史会重演" }, |
||||
|
{ value: "D", label: "D. 公司价值决定股票价格" } |
||||
|
], |
||||
|
answer: "D" |
||||
|
}, |
||||
|
{ |
||||
|
id: 16, |
||||
|
question: "股票市场中,'量价关系'指的是什么?", |
||||
|
options: [ |
||||
|
{ value: "A", label: "A. 股票价格与成交量的关系" }, |
||||
|
{ value: "B", label: "B. 股票价格与公司价值的关系" }, |
||||
|
{ value: "C", label: "C. 股票价格与市场指数的关系" }, |
||||
|
{ value: "D", label: "D. 股票价格与市盈率的关系" } |
||||
|
], |
||||
|
answer: "A" |
||||
|
}, |
||||
|
{ |
||||
|
id: 17, |
||||
|
question: "以下哪个指标反映了公司的盈利能力?", |
||||
|
options: [ |
||||
|
{ value: "A", label: "A. 资产负债率" }, |
||||
|
{ value: "B", label: "B. 净利润率" }, |
||||
|
{ value: "C", label: "C. 流动比率" }, |
||||
|
{ value: "D", label: "D. 资产周转率" } |
||||
|
], |
||||
|
answer: "B" |
||||
|
}, |
||||
|
{ |
||||
|
id: 18, |
||||
|
question: "股票交易中,'T+1'制度指的是什么?", |
||||
|
options: [ |
||||
|
{ value: "A", label: "A. 当天买入的股票当天可以卖出" }, |
||||
|
{ value: "B", label: "B. 当天买入的股票次日才能卖出" }, |
||||
|
{ value: "C", label: "C. 当天卖出的股票当天可以买入" }, |
||||
|
{ value: "D", label: "D. 当天卖出的股票次日才能买入" } |
||||
|
], |
||||
|
answer: "B" |
||||
|
}, |
||||
|
{ |
||||
|
id: 19, |
||||
|
question: "以下哪项不是股票投资的风险?", |
||||
|
options: [ |
||||
|
{ value: "A", label: "A. 市场风险" }, |
||||
|
{ value: "B", label: "B. 信用风险" }, |
||||
|
{ value: "C", label: "C. 通胀风险" }, |
||||
|
{ value: "D", label: "D. 固定收益风险" } |
||||
|
], |
||||
|
answer: "D" |
||||
|
}, |
||||
|
{ |
||||
|
id: 20, |
||||
|
question: "股票市场中,'龙头股'指的是什么?", |
||||
|
options: [ |
||||
|
{ value: "A", label: "A. 市值最大的股票" }, |
||||
|
{ value: "B", label: "B. 涨幅最大的股票" }, |
||||
|
{ value: "C", label: "C. 在行业中具有领先地位的股票" }, |
||||
|
{ value: "D", label: "D. 分红最高的股票" } |
||||
|
], |
||||
|
answer: "C" |
||||
|
}, |
||||
|
{ |
||||
|
id: 21, |
||||
|
question: "以下哪项不是基本面分析的指标?", |
||||
|
options: [ |
||||
|
{ value: "A", label: "A. 每股收益(EPS)" }, |
||||
|
{ value: "B", label: "B. 净资产收益率(ROE)" }, |
||||
|
{ value: "C", label: "C. 相对强弱指数(RSI)" }, |
||||
|
{ value: "D", label: "D. 资产负债率" } |
||||
|
], |
||||
|
answer: "C" |
||||
|
}, |
||||
|
{ |
||||
|
id: 22, |
||||
|
question: "股票投资中的'止损'策略主要是为了什么?", |
||||
|
options: [ |
||||
|
{ value: "A", label: "A. 限制损失" }, |
||||
|
{ value: "B", label: "B. 锁定利润" }, |
||||
|
{ value: "C", label: "C. 增加收益" }, |
||||
|
{ value: "D", label: "D. 降低交易成本" } |
||||
|
], |
||||
|
answer: "A" |
||||
|
}, |
||||
|
{ |
||||
|
id: 23, |
||||
|
question: "以下哪个不是股票市场的参与者?", |
||||
|
options: [ |
||||
|
{ value: "A", label: "A. 个人投资者" }, |
||||
|
{ value: "B", label: "B. 机构投资者" }, |
||||
|
{ value: "C", label: "C. 中央银行" }, |
||||
|
{ value: "D", label: "D. 上市公司" } |
||||
|
], |
||||
|
answer: "C" |
||||
|
}, |
||||
|
{ |
||||
|
id: 24, |
||||
|
question: "股票市场中,'成交量'指的是什么?", |
||||
|
options: [ |
||||
|
{ value: "A", label: "A. 股票成交的金额" }, |
||||
|
{ value: "B", label: "B. 股票成交的数量" }, |
||||
|
{ value: "C", label: "C. 股票成交的笔数" }, |
||||
|
{ value: "D", label: "D. 股票成交的频率" } |
||||
|
], |
||||
|
answer: "B" |
||||
|
}, |
||||
|
{ |
||||
|
id: 25, |
||||
|
question: "以下哪项不是影响股票市场的宏观经济因素?", |
||||
|
options: [ |
||||
|
{ value: "A", label: "A. GDP增长率" }, |
||||
|
{ value: "B", label: "B. 通货膨胀率" }, |
||||
|
{ value: "C", label: "C. 公司管理层变动" }, |
||||
|
{ value: "D", label: "D. 利率水平" } |
||||
|
], |
||||
|
answer: "C" |
||||
|
} |
||||
|
]; |
||||
|
|
||||
|
export default { |
||||
|
name: 'TextView', |
||||
|
data() { |
||||
|
return { |
||||
|
questions: stockQuestions, |
||||
|
currentQuestionIndex: 0, |
||||
|
selectedOption: '', |
||||
|
answers: {}, // 存储用户答案,格式:{ questionId: selectedOption } |
||||
|
page: 1, |
||||
|
questionsPerPage: 25, // 每页显示25个题目(5×5) |
||||
|
startTime: new Date(), |
||||
|
countdownMinutes: 60, // 考试时间60分钟 |
||||
|
currentTime: '', |
||||
|
countdown: '', |
||||
|
timer: null |
||||
|
}; |
||||
|
}, |
||||
|
computed: { |
||||
|
currentQuestion() { |
||||
|
return this.questions[this.currentQuestionIndex]; |
||||
|
}, |
||||
|
totalPages() { |
||||
|
return Math.ceil(this.questions.length / this.questionsPerPage); |
||||
|
}, |
||||
|
answeredCount() { |
||||
|
return Object.keys(this.answers).length; |
||||
|
}, |
||||
|
completionRate() { |
||||
|
return (this.answeredCount / this.questions.length) * 100; |
||||
|
}, |
||||
|
progress() { |
||||
|
return this.completionRate; |
||||
|
} |
||||
|
}, |
||||
|
watch: { |
||||
|
currentQuestionIndex() { |
||||
|
// 当切换题目时,更新选中的选项 |
||||
|
this.selectedOption = this.answers[this.currentQuestion.id] || ''; |
||||
|
|
||||
|
// 更新当前页码 |
||||
|
this.page = Math.ceil((this.currentQuestionIndex + 1) / this.questionsPerPage); |
||||
|
}, |
||||
|
selectedOption() { |
||||
|
// 当选中选项时,保存到答案对象 |
||||
|
if (this.selectedOption) { |
||||
|
this.$set(this.answers, this.currentQuestion.id, this.selectedOption); |
||||
|
} |
||||
|
} |
||||
|
}, |
||||
|
methods: { |
||||
|
// 获取题目状态样式 |
||||
|
getQuestionStatusClass(questionNumber) { |
||||
|
const index = questionNumber - 1; |
||||
|
const questionId = this.questions[index].id; |
||||
|
|
||||
|
if (index === this.currentQuestionIndex) { |
||||
|
return 'current'; |
||||
|
} else if (this.answers[questionId]) { |
||||
|
return 'answered'; |
||||
|
} else { |
||||
|
return 'normal'; |
||||
|
} |
||||
|
}, |
||||
|
// 跳转到指定题目 |
||||
|
goToQuestion(questionNumber) { |
||||
|
const index = questionNumber - 1; |
||||
|
if (index >= 0 && index < this.questions.length) { |
||||
|
this.currentQuestionIndex = index; |
||||
|
} |
||||
|
}, |
||||
|
// 上一题 |
||||
|
prevQuestion() { |
||||
|
if (this.currentQuestionIndex > 0) { |
||||
|
this.currentQuestionIndex--; |
||||
|
} |
||||
|
}, |
||||
|
// 下一题 |
||||
|
nextQuestion() { |
||||
|
if (this.currentQuestionIndex < this.questions.length - 1) { |
||||
|
this.currentQuestionIndex++; |
||||
|
} |
||||
|
}, |
||||
|
// 切换页码 |
||||
|
changePage(newPage) { |
||||
|
if (newPage >= 1 && newPage <= this.totalPages) { |
||||
|
this.page = newPage; |
||||
|
// 跳转到当前页的第一题 |
||||
|
const firstQuestionIndex = (newPage - 1) * this.questionsPerPage; |
||||
|
this.goToQuestion(firstQuestionIndex + 1); |
||||
|
} |
||||
|
}, |
||||
|
// 更新当前时间 |
||||
|
updateCurrentTime() { |
||||
|
const now = new Date(); |
||||
|
const hours = now.getHours().toString().padStart(2, '0'); |
||||
|
const minutes = now.getMinutes().toString().padStart(2, '0'); |
||||
|
const seconds = now.getSeconds().toString().padStart(2, '0'); |
||||
|
this.currentTime = `${hours}:${minutes}:${seconds}`; |
||||
|
}, |
||||
|
// 更新倒计时 |
||||
|
updateCountdown() { |
||||
|
const now = new Date(); |
||||
|
const elapsedMinutes = (now - this.startTime) / (1000 * 60); |
||||
|
const remainingMinutes = Math.max(0, this.countdownMinutes - elapsedMinutes); |
||||
|
|
||||
|
const minutes = Math.floor(remainingMinutes).toString().padStart(2, '0'); |
||||
|
const seconds = Math.floor((remainingMinutes % 1) * 60).toString().padStart(2, '0'); |
||||
|
|
||||
|
this.countdown = `${minutes}:${seconds}`; |
||||
|
|
||||
|
// 如果倒计时结束,自动提交试卷 |
||||
|
if (remainingMinutes <= 0) { |
||||
|
this.submitTest(); |
||||
|
} |
||||
|
}, |
||||
|
// 提交试卷 |
||||
|
submitTest() { |
||||
|
if (confirm('确定要提交试卷吗?提交后将无法修改答案。')) { |
||||
|
// 计算得分 |
||||
|
let score = 0; |
||||
|
this.questions.forEach(question => { |
||||
|
if (this.answers[question.id] === question.answer) { |
||||
|
score++; |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
const percentage = (score / this.questions.length) * 100; |
||||
|
|
||||
|
// 显示结果 |
||||
|
alert(`考试结束!\n您的得分:${score}/${this.questions.length} (${percentage.toFixed(1)}%)`); |
||||
|
|
||||
|
// 可以在这里添加更详细的结果分析 |
||||
|
// 例如,显示错题、推荐学习内容等 |
||||
|
} |
||||
|
} |
||||
|
}, |
||||
|
mounted() { |
||||
|
// 初始化当前时间和倒计时 |
||||
|
this.updateCurrentTime(); |
||||
|
this.updateCountdown(); |
||||
|
|
||||
|
// 设置定时器,每秒更新一次时间和倒计时 |
||||
|
this.timer = setInterval(() => { |
||||
|
this.updateCurrentTime(); |
||||
|
this.updateCountdown(); |
||||
|
}, 1000); |
||||
|
|
||||
|
// 初始化选中的选项 |
||||
|
this.selectedOption = this.answers[this.currentQuestion.id] || ''; |
||||
|
}, |
||||
|
beforeDestroy() { |
||||
|
// 清除定时器 |
||||
|
if (this.timer) { |
||||
|
clearInterval(this.timer); |
||||
|
} |
||||
|
} |
||||
|
}; |
||||
|
</script> |
||||
|
|
||||
|
<style scoped> |
||||
|
/* 这里放置之前的所有CSS样式 */ |
||||
|
* { |
||||
|
margin: 0; |
||||
|
padding: 0; |
||||
|
box-sizing: border-box; |
||||
|
} |
||||
|
body { |
||||
|
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; |
||||
|
background-color: #f5f7fa; |
||||
|
} |
||||
|
.home { |
||||
|
min-height: 100vh; |
||||
|
width: 100%; |
||||
|
background-color: #24293c; |
||||
|
overflow: auto; |
||||
|
padding: 20px; |
||||
|
} |
||||
|
.top { |
||||
|
background: linear-gradient(135deg, #0c4a6e 0%, #075985 100%); |
||||
|
color: white; |
||||
|
padding: 30px; |
||||
|
margin-bottom: 30px; |
||||
|
border-radius: 10px; |
||||
|
box-shadow: 0 10px 30px rgba(0,0,0,0.3); |
||||
|
position: relative; |
||||
|
overflow: hidden; |
||||
|
text-align: center; |
||||
|
} |
||||
|
.top h1 { |
||||
|
font-size: 2.2em; |
||||
|
margin-bottom: 10px; |
||||
|
background: none; |
||||
|
} |
||||
|
.top p { |
||||
|
font-size: 1.1em; |
||||
|
opacity: 0.9; |
||||
|
background: none; |
||||
|
} |
||||
|
.block { |
||||
|
background: rgba(139, 141, 145, 0.7); |
||||
|
width: 90%; |
||||
|
height: 10px; |
||||
|
border-radius: 5px; |
||||
|
margin: 0 auto 30px; |
||||
|
overflow: hidden; |
||||
|
position: relative; |
||||
|
box-shadow: inset 0 0 10px rgba(0,0,0,0.3); |
||||
|
} |
||||
|
.schedule { |
||||
|
background: linear-gradient(90deg, #0ea5e9 0%, #38bdf8 100%); |
||||
|
height: 100%; |
||||
|
width: 15%; |
||||
|
transition: width 0.5s cubic-bezier(0.34, 1.56, 0.64, 1); |
||||
|
position: relative; |
||||
|
} |
||||
|
.content { |
||||
|
float: left; |
||||
|
width: calc(65% - 20px); |
||||
|
border: #183954 solid 2px; |
||||
|
border-radius: 10px; |
||||
|
color: #f1f5f9; |
||||
|
padding: 20px 40px 50px; |
||||
|
margin-right: 20px; |
||||
|
background-color: #2a3147; |
||||
|
} |
||||
|
.question-block { |
||||
|
border: #183954 solid 2px; |
||||
|
border-radius: 10px; |
||||
|
padding: 20px 40px; |
||||
|
margin-bottom: 30px; |
||||
|
background-color: #2f374d; |
||||
|
} |
||||
|
.question { |
||||
|
font-size: 1.3em; |
||||
|
line-height: 1.8; |
||||
|
margin-bottom: 25px; |
||||
|
color: #f1f5f9; |
||||
|
font-weight: 500; |
||||
|
} |
||||
|
.options { |
||||
|
display: flex; |
||||
|
flex-direction: column; |
||||
|
gap: 15px; |
||||
|
} |
||||
|
.option { |
||||
|
border: #183954 solid 2px; |
||||
|
border-radius: 10px; |
||||
|
padding: 12px 15px; |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
cursor: pointer; |
||||
|
transition: all 0.3s ease; |
||||
|
background-color: #374151; |
||||
|
} |
||||
|
.option:hover { |
||||
|
border-color: #3b82f6; |
||||
|
background-color: #4b5563; |
||||
|
} |
||||
|
.option input { |
||||
|
margin-right: 15px; |
||||
|
width: 18px; |
||||
|
height: 18px; |
||||
|
accent-color: #3b82f6; |
||||
|
} |
||||
|
.option .label { |
||||
|
font-size: 1.1em; |
||||
|
color: #e5e7eb; |
||||
|
} |
||||
|
.option.selected { |
||||
|
border-color: #3b82f6; |
||||
|
background-color: rgba(59, 130, 246, 0.2); |
||||
|
} |
||||
|
.right { |
||||
|
float: right; |
||||
|
width: calc(35% - 20px); |
||||
|
border: #183954 solid 2px; |
||||
|
border-radius: 10px; |
||||
|
color: #f1f5f9; |
||||
|
padding: 20px; |
||||
|
background-color: #2a3147; |
||||
|
} |
||||
|
.time-module, .question-nav, .statistics { |
||||
|
border: #183954 solid 2px; |
||||
|
border-radius: 10px; |
||||
|
padding: 15px; |
||||
|
margin-bottom: 20px; |
||||
|
background-color: #2f374d; |
||||
|
} |
||||
|
.time-module h3, .question-nav h3, .statistics h3 { |
||||
|
margin-bottom: 15px; |
||||
|
color: #f1f5f9; |
||||
|
font-size: 1.2em; |
||||
|
border-bottom: 1px solid #374151; |
||||
|
padding-bottom: 10px; |
||||
|
} |
||||
|
.current-time { |
||||
|
font-size: 1.8em; |
||||
|
font-weight: bold; |
||||
|
color: #3b82f6; |
||||
|
text-align: center; |
||||
|
margin-bottom: 10px; |
||||
|
} |
||||
|
.countdown { |
||||
|
font-size: 1.5em; |
||||
|
color: #f59e0b; |
||||
|
text-align: center; |
||||
|
} |
||||
|
.question-grid { |
||||
|
display: grid; |
||||
|
grid-template-columns: repeat(5, 1fr); |
||||
|
gap: 10px; |
||||
|
margin-top: 15px; |
||||
|
} |
||||
|
.question-number { |
||||
|
width: 40px; |
||||
|
height: 40px; |
||||
|
border-radius: 8px; |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
justify-content: center; |
||||
|
font-weight: bold; |
||||
|
cursor: pointer; |
||||
|
transition: all 0.3s ease; |
||||
|
} |
||||
|
.question-number.normal { |
||||
|
background-color: #374151; |
||||
|
border: 1px solid #4b5563; |
||||
|
} |
||||
|
.question-number.answered { |
||||
|
background-color: #10b981; |
||||
|
border: 1px solid #059669; |
||||
|
} |
||||
|
.question-number.current { |
||||
|
background-color: #3b82f6; |
||||
|
border: 1px solid #2563eb; |
||||
|
transform: scale(1.1); |
||||
|
} |
||||
|
.question-number:hover { |
||||
|
transform: scale(1.1); |
||||
|
} |
||||
|
.pagination { |
||||
|
display: flex; |
||||
|
justify-content: center; |
||||
|
margin-top: 20px; |
||||
|
gap: 10px; |
||||
|
} |
||||
|
.pagination-btn { |
||||
|
padding: 8px 15px; |
||||
|
border-radius: 8px; |
||||
|
border: none; |
||||
|
background-color: #3b82f6; |
||||
|
color: white; |
||||
|
font-weight: bold; |
||||
|
cursor: pointer; |
||||
|
transition: all 0.3s ease; |
||||
|
} |
||||
|
.pagination-btn:hover { |
||||
|
background-color: #2563eb; |
||||
|
} |
||||
|
.pagination-btn:disabled { |
||||
|
background-color: #4b5563; |
||||
|
cursor: not-allowed; |
||||
|
} |
||||
|
.nav-buttons { |
||||
|
display: flex; |
||||
|
justify-content: space-between; |
||||
|
margin-top: 30px; |
||||
|
} |
||||
|
.nav-btn { |
||||
|
padding: 10px 20px; |
||||
|
border-radius: 8px; |
||||
|
border: none; |
||||
|
background-color: #3b82f6; |
||||
|
color: white; |
||||
|
font-weight: bold; |
||||
|
cursor: pointer; |
||||
|
transition: all 0.3s ease; |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
gap: 5px; |
||||
|
} |
||||
|
.nav-btn:hover { |
||||
|
background-color: #2563eb; |
||||
|
} |
||||
|
.nav-btn.prev { |
||||
|
background-color: #4b5563; |
||||
|
} |
||||
|
.nav-btn.prev:hover { |
||||
|
background-color: #374151; |
||||
|
} |
||||
|
.nav-btn:disabled { |
||||
|
background-color: #4b5563; |
||||
|
cursor: not-allowed; |
||||
|
} |
||||
|
.statistics-item { |
||||
|
display: flex; |
||||
|
justify-content: space-between; |
||||
|
margin-bottom: 10px; |
||||
|
padding-bottom: 10px; |
||||
|
border-bottom: 1px solid #374151; |
||||
|
} |
||||
|
.statistics-item:last-child { |
||||
|
border-bottom: none; |
||||
|
} |
||||
|
.statistics-label { |
||||
|
color: #e5e7eb; |
||||
|
} |
||||
|
.statistics-value { |
||||
|
font-weight: bold; |
||||
|
color: #3b82f6; |
||||
|
} |
||||
|
.submit-btn { |
||||
|
width: 100%; |
||||
|
padding: 15px; |
||||
|
border-radius: 10px; |
||||
|
border: none; |
||||
|
background-color: #10b981; |
||||
|
color: white; |
||||
|
font-size: 1.2em; |
||||
|
font-weight: bold; |
||||
|
cursor: pointer; |
||||
|
transition: all 0.3s ease; |
||||
|
margin-top: 20px; |
||||
|
} |
||||
|
.submit-btn:hover { |
||||
|
background-color: #059669; |
||||
|
} |
||||
|
.clearfix::after { |
||||
|
content: ""; |
||||
|
clear: both; |
||||
|
display: table; |
||||
|
} |
||||
|
@media (max-width: 1200px) { |
||||
|
.content, .right { |
||||
|
float: none; |
||||
|
width: 100%; |
||||
|
margin-right: 0; |
||||
|
margin-bottom: 20px; |
||||
|
} |
||||
|
} |
||||
|
@media (max-width: 768px) { |
||||
|
.content { |
||||
|
padding: 15px 20px 30px; |
||||
|
} |
||||
|
.question-block { |
||||
|
padding: 15px 20px; |
||||
|
} |
||||
|
.question { |
||||
|
font-size: 1.1em; |
||||
|
} |
||||
|
.option .label { |
||||
|
font-size: 1em; |
||||
|
} |
||||
|
.question-grid { |
||||
|
grid-template-columns: repeat(5, 1fr); |
||||
|
} |
||||
|
.question-number { |
||||
|
width: 35px; |
||||
|
height: 35px; |
||||
|
font-size: 0.9em; |
||||
|
} |
||||
|
} |
||||
|
</style> |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue