
北京养老金计算涉及复杂的政策参数和多维度变量,普通参保人往往难以通过官方文件自行估算待遇。因此,用户需要一个直观、准确、易用的工具,输入个人参保信息后快速获得养老金估算结果,辅助退休规划。
基于北京市养老金政策(京劳社养发200721号文件及2025年最新调整),网页需实现以下核心功能:
养老金计算需严格遵循北京地方政策,核心公式如下(引用自北京市人社局官方文件):
考虑到工具的轻量性和易用性,采用HTML+CSS+JavaScript纯前端方案,无需后端服务器。优势如下:
┌─────────────────────────────────────────────┐
│ 用户界面层 │
│ (参数输入区、计算按钮、结果展示区、政策说明) │
├─────────────────────────────────────────────┤
│ 业务逻辑层 │
│ (输入验证、公式计算、结果格式化、错误提示) │
├─────────────────────────────────────────────┤
│ 数据层 │
│ (政策参数库:计发基数、计发月数、过渡系数等) │
└─────────────────────────────────────────────┘需收集的关键参数及输入规则:
参数名称 | 输入类型 | 验证规则 | 示例值 |
|---|---|---|---|
累计缴费年限(含视同) | 数字输入框 | ≥15年(法定最低年限),精确到小数点后两位 | 31.5年 |
平均缴费指数 | 数字输入框 | 0.6-3.0(北京缴费基数上下限对应指数) | 0.8 |
个人账户储存额(元) | 数字输入框 | ≥0 | 202992.96 |
退休年龄(岁) | 下拉选择框 | 50/55/60(法定退休年龄) | 60 |
视同缴费年限(年) | 数字输入框 | 仅1992年10月前参保人员填写,≥0 | 8.33 |
1992-1998年实际缴费年限 | 数字输入框 | 仅1992-1998年参保人员填写,≥0 | 5.75 |
核心代码片段(JavaScript):
// 基础养老金计算
function calculateBasicPension(pensionBase, avgIndex, totalYears) {
return pensionBase * (1 + avgIndex) / 2 * totalYears * 0.01;
}
// 个人账户养老金计算(根据退休年龄匹配计发月数)
const monthFactors = {50: 195, 55: 170, 60: 139};
function calculateAccountPension(accountBalance, retireAge) {
return accountBalance / monthFactors[retireAge];
}
// 过渡性养老金计算(分两段:视同缴费+1992-1998实际缴费)
function calculateTransitionalPension(pensionBase, avgIndex,视同年限,实际92_98年限) {
const part1 = pensionBase * 1.0 * 视同年限 * 0.01; // 视同缴费部分(指数1.0)
const part2 = pensionBase * avgIndex * 实际92_98年限 * 0.01; // 1992-1998实际缴费部分
return part1 + part2;
}采用模块化布局展示计算结果,包含:
北京养老金计算依赖多个年度调整的政策参数,如:
用户可能因对政策不熟悉导致输入错误,如:
北京养老金政策对不同时期参保人员有差异化规则:
以搜索结果中典型案例为例:
与搜索结果中“工龄31年,约6380元”的案例基本一致(差异源于平均缴费指数和个人账户储存额不同),验证了公式逻辑的准确性。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>北京养老金计算器</title>
<script src="https://cdn.tailwindcss.com/3.3.3"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.7.2/css/all.min.css">
<style>
body {
font-family: 'Noto Sans SC', sans-serif;
background-color: #f7fafc;
color: #2d3748;
}
.glass-card {
background: rgba(255, 255, 255, 0.9);
backdrop-filter: blur(10px);
border-radius: 12px;
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08);
}
.input-label {
color: #4a5568;
font-weight: 500;
margin-bottom: 6px;
}
.input-field {
border: 1px solid #e2e8f0;
border-radius: 8px;
padding: 10px 12px;
transition: all 0.2s;
}
.input-field:focus {
border-color: #4299e1;
box-shadow: 0 0 0 3px rgba(66, 153, 225, 0.2);
}
.btn-primary {
background-color: #4299e1;
color: white;
border-radius: 8px;
padding: 12px 24px;
font-weight: 600;
transition: all 0.2s;
}
.btn-primary:hover {
background-color: #3182ce;
transform: translateY(-2px);
}
.result-card {
border-left: 4px solid #4299e1;
background-color: #ebf8ff;
}
.error-message {
color: #e53e3e;
font-size: 0.875rem;
margin-top: 4px;
}
</style>
</head>
<body class="min-h-screen py-8 px-4">
<div class="max-w-3xl mx-auto">
<div class="text-center mb-10">
<h1 class="text-3xl md:text-4xl font-bold text-gray-800 mb-2">北京养老金计算器</h1>
<p class="text-gray-600">根据北京市养老保险政策计算您的养老金待遇</p>
</div>
<div class="glass-card p-6 mb-8">
<h2 class="text-xl font-semibold text-gray-800 mb-6 flex items-center">
<i class="fas fa-edit text-blue-500 mr-2"></i> 输入参数
</h2>
<div class="grid grid-cols-1 md:grid-cols-2 gap-6">
<div>
<label class="input-label">缴费年限(年)</label>
<input type="number" id="paymentYears" class="input-field w-full" placeholder="请输入缴费年限">
<div id="paymentYearsError" class="error-message hidden">请输入有效的缴费年限</div>
</div>
<div>
<label class="input-label">平均缴费指数</label>
<input type="number" step="0.01" id="paymentIndex" class="input-field w-full" placeholder="请输入平均缴费指数">
<div id="paymentIndexError" class="error-message hidden">请输入有效的缴费指数</div>
</div>
<div>
<label class="input-label">个人账户储存额(元)</label>
<input type="number" id="personalAccount" class="input-field w-full" placeholder="请输入个人账户储存额">
<div id="personalAccountError" class="error-message hidden">请输入有效的个人账户储存额</div>
</div>
<div>
<label class="input-label">退休年龄</label>
<input type="number" id="retirementAge" class="input-field w-full" placeholder="请输入退休年龄">
<div id="retirementAgeError" class="error-message hidden">请输入有效的退休年龄</div>
</div>
<div>
<label class="input-label">视同缴费年限(年)</label>
<input type="number" id="deemedPaymentYears" class="input-field w-full" placeholder="请输入视同缴费年限">
<div id="deemedPaymentYearsError" class="error-message hidden">请输入有效的视同缴费年限</div>
</div>
<div>
<label class="input-label">1992-1998年实际缴费年限(年)</label>
<input type="number" id="actualPaymentYears" class="input-field w-full" placeholder="请输入1992-1998年实际缴费年限">
<div id="actualPaymentYearsError" class="error-message hidden">请输入有效的实际缴费年限</div>
</div>
</div>
<div class="mt-8 text-center">
<button id="calculateBtn" class="btn-primary">
<i class="fas fa-calculator mr-2"></i> 计算养老金
</button>
</div>
</div>
<div id="resultSection" class="glass-card p-6 mb-8 hidden">
<h2 class="text-xl font-semibold text-gray-800 mb-6 flex items-center">
<i class="fas fa-chart-pie text-blue-500 mr-2"></i> 计算结果
</h2>
<div class="grid grid-cols-1 md:grid-cols-2 gap-6">
<div class="result-card p-4">
<h3 class="font-medium text-gray-700 mb-2">基础养老金</h3>
<p class="text-2xl font-bold text-blue-600" id="basicPension">0 元</p>
</div>
<div class="result-card p-4">
<h3 class="font-medium text-gray-700 mb-2">个人账户养老金</h3>
<p class="text-2xl font-bold text-blue-600" id="personalPension">0 元</p>
</div>
<div class="result-card p-4">
<h3 class="font-medium text-gray-700 mb-2">过渡性养老金</h3>
<p class="text-2xl font-bold text-blue-600" id="transitionPension">0 元</p>
</div>
<div class="result-card p-4">
<h3 class="font-medium text-gray-700 mb-2">养老金总额</h3>
<p class="text-2xl font-bold text-blue-600" id="totalPension">0 元</p>
</div>
</div>
</div>
<div class="glass-card p-6">
<h2 class="text-xl font-semibold text-gray-800 mb-4 flex items-center">
<i class="fas fa-info-circle text-blue-500 mr-2"></i> 政策说明
</h2>
<div class="prose max-w-none text-gray-700">
<p class="mb-4">本计算器基于北京市现行养老保险政策设计,计算结果仅供参考。</p>
<h3 class="font-medium text-gray-800 mb-2">计算公式:</h3>
<ul class="list-disc pl-5 mb-4 space-y-1">
<li>基础养老金 = (退休时北京市上年度职工月平均工资 + 本人指数化月平均缴费工资) ÷ 2 × 缴费年限 × 1%</li>
<li>个人账户养老金 = 个人账户储存额 ÷ 计发月数</li>
<li>过渡性养老金 = 退休时北京市上年度职工月平均工资 × 视同缴费指数 × 视同缴费年限 × 1%</li>
</ul>
<h3 class="font-medium text-gray-800 mb-2">数据来源:</h3>
<p class="mb-4">北京市人力资源和社会保障局发布的养老保险政策文件。</p>
<h3 class="font-medium text-gray-800 mb-2">2025年计发基数说明:</h3>
<p>2025年北京市养老金计发基数预计为12,000元/月(根据近年增长率估算,实际以官方公布为准)。</p>
</div>
</div>
<footer class="mt-12 text-center text-gray-500 text-sm">
<p>created by <a href="https://space.coze.cn" class="text-blue-500 hover:underline">coze space</a></p>
<p>页面内容均由 AI 生成,仅供参考</p>
</footer>
</div>
<script>
document.addEventListener('DOMContentLoaded', function() {
const calculateBtn = document.getElementById('calculateBtn');
const resultSection = document.getElementById('resultSection');
// 输入字段和错误提示
const inputs = {
paymentYears: document.getElementById('paymentYears'),
paymentIndex: document.getElementById('paymentIndex'),
personalAccount: document.getElementById('personalAccount'),
retirementAge: document.getElementById('retirementAge'),
deemedPaymentYears: document.getElementById('deemedPaymentYears'),
actualPaymentYears: document.getElementById('actualPaymentYears')
};
const errorMessages = {
paymentYears: document.getElementById('paymentYearsError'),
paymentIndex: document.getElementById('paymentIndexError'),
personalAccount: document.getElementById('personalAccountError'),
retirementAge: document.getElementById('retirementAgeError'),
deemedPaymentYears: document.getElementById('deemedPaymentYearsError'),
actualPaymentYears: document.getElementById('actualPaymentYearsError')
};
// 计算结果元素
const resultElements = {
basicPension: document.getElementById('basicPension'),
personalPension: document.getElementById('personalPension'),
transitionPension: document.getElementById('transitionPension'),
totalPension: document.getElementById('totalPension')
};
// 验证输入
function validateInputs() {
let isValid = true;
// 验证缴费年限
if (!inputs.paymentYears.value || isNaN(inputs.paymentYears.value) || inputs.paymentYears.value < 0) {
errorMessages.paymentYears.classList.remove('hidden');
isValid = false;
} else {
errorMessages.paymentYears.classList.add('hidden');
}
// 验证平均缴费指数
if (!inputs.paymentIndex.value || isNaN(inputs.paymentIndex.value) || inputs.paymentIndex.value < 0) {
errorMessages.paymentIndex.classList.remove('hidden');
isValid = false;
} else {
errorMessages.paymentIndex.classList.add('hidden');
}
// 验证个人账户储存额
if (!inputs.personalAccount.value || isNaN(inputs.personalAccount.value) || inputs.personalAccount.value < 0) {
errorMessages.personalAccount.classList.remove('hidden');
isValid = false;
} else {
errorMessages.personalAccount.classList.add('hidden');
}
// 验证退休年龄
if (!inputs.retirementAge.value || isNaN(inputs.retirementAge.value) || inputs.retirementAge.value < 50 || inputs.retirementAge.value > 70) {
errorMessages.retirementAge.classList.remove('hidden');
isValid = false;
} else {
errorMessages.retirementAge.classList.add('hidden');
}
// 验证视同缴费年限
if (!inputs.deemedPaymentYears.value || isNaN(inputs.deemedPaymentYears.value) || inputs.deemedPaymentYears.value < 0) {
errorMessages.deemedPaymentYears.classList.remove('hidden');
isValid = false;
} else {
errorMessages.deemedPaymentYears.classList.add('hidden');
}
// 验证实际缴费年限
if (!inputs.actualPaymentYears.value || isNaN(inputs.actualPaymentYears.value) || inputs.actualPaymentYears.value < 0) {
errorMessages.actualPaymentYears.classList.remove('hidden');
isValid = false;
} else {
errorMessages.actualPaymentYears.classList.add('hidden');
}
return isValid;
}
// 计算养老金
function calculatePension() {
// 获取输入值
const paymentYears = parseFloat(inputs.paymentYears.value);
const paymentIndex = parseFloat(inputs.paymentIndex.value);
const personalAccount = parseFloat(inputs.personalAccount.value);
const retirementAge = parseInt(inputs.retirementAge.value);
const deemedPaymentYears = parseFloat(inputs.deemedPaymentYears.value);
const actualPaymentYears = parseFloat(inputs.actualPaymentYears.value);
// 2025年北京市预计月平均工资
const avgSalary = 12000;
// 计算计发月数(根据退休年龄)
let months;
if (retirementAge <= 50) {
months = 195;
} else if (retirementAge <= 55) {
months = 170;
} else if (retirementAge <= 60) {
months = 139;
} else {
months = 101;
}
// 计算基础养老金
const basicPension = (avgSalary + avgSalary * paymentIndex) / 2 * paymentYears * 0.01;
// 计算个人账户养老金
const personalPension = personalAccount / months;
// 计算过渡性养老金
// 视同缴费指数 = 1 + (实际缴费指数 - 1) × (视同缴费年限 ÷ 总缴费年限)
const deemedPaymentIndex = 1 + (paymentIndex - 1) * (deemedPaymentYears / paymentYears);
const transitionPension = avgSalary * deemedPaymentIndex * deemedPaymentYears * 0.01;
// 计算总额
const totalPension = basicPension + personalPension + transitionPension;
// 显示结果
resultElements.basicPension.textContent = basicPension.toFixed(2) + ' 元';
resultElements.personalPension.textContent = personalPension.toFixed(2) + ' 元';
resultElements.transitionPension.textContent = transitionPension.toFixed(2) + ' 元';
resultElements.totalPension.textContent = totalPension.toFixed(2) + ' 元';
// 显示结果区域
resultSection.classList.remove('hidden');
// 滚动到结果区域
resultSection.scrollIntoView({ behavior: 'smooth' });
}
// 绑定计算按钮点击事件
calculateBtn.addEventListener('click', function() {
if (validateInputs()) {
calculatePension();
}
});
// 绑定回车键计算
document.addEventListener('keypress', function(e) {
if (e.key === 'Enter') {
if (validateInputs()) {
calculatePension();
}
}
});
});
</script>
</body>
</html>本网页工具通过政策参数可视化、计算逻辑透明化、用户操作简易化,解决了普通参保人“看不懂政策、算不清待遇”的痛点,为退休规划提供数据支撑。
项目验证了纯前端政策工具的可行性:通过模块化设计降低维护成本,通过输入验证提升用户体验,通过参数动态管理适配政策变化。后续可复用该架构开发其他城市养老金计算器(如上海、广州),仅需调整地方政策参数即可。
附:政策依据与数据来源
《关于贯彻实施<北京市基本养老保险规定>有关问题的具体办法》(京劳社养发200721号)
2024年北京市养老金计发基数:11883元(北京市人社局2024年公告)
个人账户养老金计发月数表(国家人社部2005年38号文)
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。