我来帮你设计本地美食测评评分工具。这是一个结合创新创业与新媒体运营的实用项目,通过量化评分帮助消费者决策,我会提供模块化代码、文档和知识点总结。
代码实现(单文件HTML整合版)
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>本地美食测评评分工具</title>
<style>
* { margin: 0; padding: 0; box-sizing: border-box; font-family: "PingFang SC", "Microsoft YaHei", sans-serif; }
body { background: #f8f9fa; padding: 20px; color: #333; line-height: 1.6; }
.container { max-width: 600px; margin: 0 auto; background: white; border-radius: 12px; padding: 30px; box-shadow: 0 3px 15px rgba(0,0,0,0.08); }
h1 { text-align: center; color: #e63946; margin-bottom: 25px; font-size: 26px; }
.form-group { margin-bottom: 20px; }
label { display: block; margin-bottom: 8px; font-weight: 600; color: #495057; }
input, select, button { width: 100%; padding: 12px 15px; border: 1px solid #ced4da; border-radius: 6px; font-size: 16px; }
input:focus, select:focus { outline: none; border-color: #e63946; box-shadow: 0 0 0 3px rgba(230,57,70,0.1); }
button { background: #e63946; color: white; border: none; cursor: pointer; transition: all 0.3s; margin-top: 10px; font-weight: 500; }
button:hover { background: #d90429; transform: translateY(-1px); }
.result-card { background: #fff9f9; border-left: 4px solid #e63946; padding: 20px; border-radius: 8px; margin-top: 25px; display: none; }
.score-badge { display: inline-block; background: #e63946; color: white; padding: 5px 12px; border-radius: 20px; font-weight: bold; margin: 10px 0; }
.reason { color: #6c757d; font-size: 14px; margin-top: 8px; }
.error { color: #dc3545; font-size: 14px; margin-top: 5px; display: none; }
@media (max-width: 480px) { .container { padding: 20px; } h1 { font-size: 22px; } }
</style>
</head>
<body>
<div class="container">
<h1>本地美食测评评分工具</h1>
<!-- 输入表单 -->
<div class="form-group">
<label for="foodName">美食名称</label>
<input type="text" id="foodName" placeholder="如:老巷口牛肉面">
<div class="error" id="nameError">请输入美食名称</div>
</div>
<div class="form-group">
<label for="tasteScore">口味评分 (1-5星)</label>
<select id="tasteScore">
<option value="">请选择口味评分</option>
<option value="5">★★★★★ (惊艳)</option>
<option value="4">★★★★☆ (优秀)</option>
<option value="3">★★★☆☆ (良好)</option>
<option value="2">★★☆☆☆ (一般)</option>
<option value="1">★☆☆☆☆ (较差)</option>
</select>
<div class="error" id="tasteError">请选择口味评分</div>
</div>
<div class="form-group">
<label for="priceRange">价格区间 (元)</label>
<select id="priceRange">
<option value="">请选择价格区间</option>
<option value="low">低价 (<30元)</option>
<option value="medium">中价 (30-80元)</option>
<option value="high">高价 (>80元)</option>
</select>
<div class="error" id="priceError">请选择价格区间</div>
</div>
<button id="evaluateBtn">生成测评评分</button>
<!-- 结果展示 -->
<div class="result-card" id="resultCard">
<h3 id="resultName"></h3>
<div class="score-badge">综合评分: <span id="totalScore"></span>/5</div>
<p>口味评分: <span id="tasteResult"></span> | 价格区间: <span id="priceResult"></span></p>
<p class="reason" id="recommendReason"></p>
<p class="reason" id="suggestion"></p>
</div>
</div>
<script>
/**
* 本地美食测评评分工具 - 模块化JavaScript实现
* 版本: 1.0.0 | 适配: ES6+ | 兼容: 现代浏览器
* 创新创业: 基于用户评价的量化决策工具 | 新媒体运营: 可视化评分增强传播
*/
// ==================== 配置模块 (Config) ====================
const Config = {
// 评分权重 (创新创业: 用户调研得出口味权重更高)
weights: { taste: 0.6, price: 0.4 },
// 价格区间映射 (新媒体运营: 消费者敏感的价格分段)
priceMap: {
low: { range: "<30元", score: 5, desc: "超值实惠" },
medium: { range: "30-80元", score: 3, desc: "性价比适中" },
high: { range: ">80元", score: 1, desc: "高端消费" }
},
// 推荐理由库 (新媒体运营: 增强内容吸引力)
reasonLib: {
high: ["口味出众,值得为体验买单", "食材优质,适合特殊场合"],
medium: ["口味与价格平衡,日常首选", "口碑稳定,复购率高"],
low: ["平价美味,学生党福音", "街边宝藏,性价比之王"]
}
};
// ==================== 评分算法模块 (ScoreCalculator) ====================
const ScoreCalculator = {
/**
* 计算综合评分 (创新创业: 量化决策模型)
* @param {number} tasteScore - 口味评分(1-5)
* @param {string} priceKey - 价格区间key(low/medium/high)
* @returns {number} 综合评分(1-5,保留1位小数)
*/
calculateTotalScore(tasteScore, priceKey) {
const tasteWeight = Config.weights.taste * tasteScore;
const priceScore = Config.priceMap[priceKey].score;
const priceWeight = Config.weights.price * priceScore;
return Number((tasteWeight + priceWeight).toFixed(1));
},
/**
* 获取推荐理由 (新媒体运营: 增强说服力)
* @param {number} totalScore - 综合评分
* @param {string} priceKey - 价格区间key
* @returns {string} 推荐理由
*/
getRecommendReason(totalScore, priceKey) {
const reasons = Config.reasonLib[priceKey];
return reasons[Math.floor(Math.random() * reasons.length)];
}
};
// ==================== UI交互模块 (UI) ====================
const UI = {
/**
* 显示错误信息
* @param {string} elementId - 错误元素ID
*/
showError(elementId) {
document.getElementById(elementId).style.display = 'block';
},
/**
* 隐藏错误信息
* @param {string} elementId - 错误元素ID
*/
hideError(elementId) {
document.getElementById(elementId).style.display = 'none';
},
/**
* 渲染测评结果 (用户体验: 直观展示核心信息)
* @param {Object} result - 测评结果对象
*/
renderResult(result) {
document.getElementById('resultName').textContent = result.name;
document.getElementById('totalScore').textContent = result.totalScore;
document.getElementById('tasteResult').textContent = `${result.tasteScore}星`;
document.getElementById('priceResult').textContent = result.priceRange;
document.getElementById('recommendReason').textContent = `推荐理由: ${result.reason}`;
// 生成消费建议 (创新创业: 差异化建议)
const suggestion = result.totalScore >= 4 ?
"强烈推荐尝试!" : result.totalScore >= 3 ?
"值得一试,看个人偏好" : "建议先观望其他选择";
document.getElementById('suggestion').textContent = `消费建议: ${suggestion}`;
document.getElementById('resultCard').style.display = 'block';
},
/**
* 重置表单
*/
resetForm() {
document.getElementById('foodName').value = '';
document.getElementById('tasteScore').value = '';
document.getElementById('priceRange').value = '';
document.getElementById('resultCard').style.display = 'none';
'nameError', 'tasteError', 'priceError'\].forEach(id =\> this.hideError(id)); } }; // ==================== 主程序模块 (Main) ==================== const Main = { init() { // 绑定测评按钮事件 document.getElementById('evaluateBtn').addEventListener('click', () =\> this.handleEvaluate()); // 绑定输入验证 \['foodName', 'tasteScore', 'priceRange'\].forEach(id =\> { document.getElementById(id).addEventListener('input', () =\> { UI.hideError(\`${id.replace('foodName','name')}Error\`); }); }); }, /\*\* \* 处理测评请求 (核心流程控制) \*/ handleEvaluate() { // 1. 获取输入值 const foodName = document.getElementById('foodName').value.trim(); const tasteScore = parseInt(document.getElementById('tasteScore').value); const priceRange = document.getElementById('priceRange').value; // 2. 输入校验 let isValid = true; if (!foodName) { UI.showError('nameError'); isValid = false; } if (!tasteScore) { UI.showError('tasteError'); isValid = false; } if (!priceRange) { UI.showError('priceError'); isValid = false; } if (!isValid) return; // 3. 执行评分算法 const totalScore = ScoreCalculator.calculateTotalScore(tasteScore, priceRange); const priceInfo = Config.priceMap\[priceRange\]; const reason = ScoreCalculator.getRecommendReason(totalScore, priceRange); // 4. 渲染结果 UI.renderResult({ name: foodName, tasteScore, priceRange: priceInfo.range, totalScore, reason }); } }; // 页面加载完成后初始化 window.addEventListener('DOMContentLoaded', () =\> Main.init()); \ \