CREATE TABLE category (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
parent_id INT DEFAULT 0, -- 0 代表頂級
level TINYINT NOT NULL, -- 1/2/3
sort INT DEFAULT 0,
FOREIGN KEY (parent_id) REFERENCES category(id)
);
<select id="level1"><option value="0">請選擇一級</option></select>
<select id="level2" style="display:none"><option value="0">請選擇二級</option></select>
<select id="level3" style="display:none"><option value="0">請選擇三級</option></select>
<button id="btnAdd">新增子分類</button>
<script>
function loadChildren(parentId, $targetSelect, nextSelectId) {
$.get('/api/categories', { parentId }, function(list) {
$targetSelect.empty().append('');
list.forEach(c => $targetSelect.append(``));
$targetSelect.show();
$(`#${nextSelectId}`).hide().empty().append('');
});
}
$('#level1').change(function() {
var pid = $(this).val();
if (pid != '0') loadChildren(pid, $('#level2'), 'level3');
else { $('#level2, #level3').hide(); }
});
$('#level2').change(function() {
var pid = $(this).val();
if (pid != '0') loadChildren(pid, $('#level3'), '');
else $('#level3').hide();
});
$('#btnAdd').click(function() {
var pid = $('#level3').val() || $('#level2').val() || $('#level1').val();
if (pid == '0') return alert('請選擇父分類');
var name = prompt('輸入新分類名稱:');
if (!name) return;
$.post('/api/categories', { name, parentId: pid }, function(res) {
if (res.success) {
alert('新增成功');
// 刷新對應下拉框
$(`#level${res.data.level}`).trigger('change');
} else alert(res.msg);
});
});
</script>
參考「省市區三級聯動」成熟模式,分類管理本質相同,切勿重造輪子。