<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=0.7, maximum-scale=0.7, user-scalable=yes"/>
<title>用餐座次图</title>
<style>
body {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
height: 100vh;
margin: 0;
font-family: Arial, sans-serif;
}
#input-form {
margin-bottom: 20px;
text-align: center;
}
#form-elements {
display: flex;
align-items: center;
gap: 10px;
}
#form-elements input,
#form-elements button {
padding: 4px;
font-weight: bold;
border: 1px solid #88c416;
color: #88c416;
}
#form-elements input {
height: 20px;
color: #88c416;
}
#form-elements button {
cursor: pointer;
height: 30px;
}
#seating {
position: relative;
width: 500px;
height: 500px;
border-radius: 50%;
background-color: #3399FF;
display: flex;
align-items: center;
justify-content: center;
color: white;
text-align: center;
font-weight: bold;
}
.seat {
position: absolute;
width: 60px;
height: 30px;
background: white;
display: flex;
align-items: center;
justify-content: center;
border: 1px solid #88c416;
border-radius: 10px;
cursor: pointer;
}
.seat input {
border: none;
background: transparent;
width: 100%;
text-align: center;
}
#share-button {
border: none;
font-weight: bold;
cursor: pointer;
border-radius: 5px;
}
#share-button:active {
background-color: #66a312;
}
@media print {
#share-button, #input-form, button, label {
display: none;
}
body {-webkit-print-color-adjust: exact;}
}
</style>
</head>
<body>
<form id="input-form">
<label for="table-info" style="color:#66CC00; height:25px; line-height:25px; font-weight:bold; padding:10px;">可拖动人员互换位置,手机端手指在姓名上停留一会在拖动</label><br><br>
<div id="form-elements">
<input type="text" id="table-info" required placeholder="桌号信息">
<input type="text" id="names" required placeholder="张三、李四、王二">
<button type="submit">生成座次</button> <button id="share-button">分享链接</button>
</div>
</form>
<div id="seating">
<div id="table-info-display"></div>
</div><label style="color:#CCCCCC; height:25px; line-height:25px; padding:10px; font-size:10px;">© RainMan</label>
<script>
document.getElementById('input-form').addEventListener('submit', function(event) {
event.preventDefault();
const tableInfo = document.getElementById('table-info').value;
const names = document.getElementById('names').value.split(/[,,、]/).map(name => name.trim());
document.getElementById('table-info-display').textContent = `${tableInfo} (${names.length}人)`;
generateSeating(names);
updateShareLink(tableInfo, names);
});
function generateSeating(names) {
const seating = document.getElementById('seating');
const existingSeats = seating.querySelectorAll('.seat');
existingSeats.forEach(seat => seat.remove());
const numPeople = names.length;
const angleStep = (2 * Math.PI) / numPeople;
for (let i = 0; i < numPeople; i++) {
const angle = i * angleStep - (Math.PI / 2);
const x = 250 + 200 * Math.cos(angle);
const y = 250 + 200 * Math.sin(angle);
const seat = document.createElement('div');
seat.classList.add('seat');
seat.style.left = `${x - 30}px`;
seat.style.top = `${y - 15}px`;
seat.setAttribute('draggable', 'true');
seat.addEventListener('dragstart', dragStart);
seat.addEventListener('dragover', dragOver);
seat.addEventListener('drop', drop);
seat.addEventListener('dragend', dragEnd);
// 添加触摸事件
seat.addEventListener('touchstart', touchStart);
seat.addEventListener('touchmove', touchMove);
seat.addEventListener('touchend', touchEnd);
const input = document.createElement('input');
input.type = 'text';
input.value = names[i];
input.addEventListener('input', updateNamesList);
seat.appendChild(input);
seating.appendChild(seat);
}
}
function updateNamesList() {
const seats = document.querySelectorAll('.seat input');
const names = Array.from(seats).map(input => input.value.trim());
document.getElementById('names').value = names.join('、');
const tableInfo = document.getElementById('table-info').value;
document.getElementById('table-info-display').textContent = `${tableInfo} (${names.filter(name => name !== '').length}人)`;
updateShareLink(tableInfo, names);
}
function updateShareLink(tableInfo, names) {
const baseUrl = window.location.origin + window.location.pathname;
const urlParams = new URLSearchParams();
urlParams.set('tableInfo', tableInfo);
urlParams.set('names', names.join('、'));
const shareLink = `${baseUrl}?${urlParams.toString()}`;
const shareButton = document.getElementById('share-button');
shareButton.onclick = () => {
if (!tableInfo.trim() || names.filter(name => name.trim() !== '').length === 0) {
alert('请先填写桌号和姓名信息');
return;
}
navigator.clipboard.writeText(shareLink).then(() => {
alert('分享链接已复制到剪切板');
}).catch(err => {
alert('复制失败,请手动复制链接');
console.error('Could not copy text: ', err);
});
};
}
function loadFromURL() {
const urlParams = new URLSearchParams(window.location.search);
const tableInfo = urlParams.get('tableInfo');
const names = urlParams.get('names');
if (tableInfo && names) {
document.getElementById('table-info').value = tableInfo;
document.getElementById('names').value = names;
document.getElementById('table-info-display').textContent = `${tableInfo} (${names.split('、').filter(name => name !== '').length}人)`;
generateSeating(names.split('、'));
}
}
let draggedInput;
let touchStartX, touchStartY;
function dragStart(event) {
draggedInput = event.target.querySelector('input');
event.dataTransfer.effectAllowed = 'move';
}
function dragOver(event) {
event.preventDefault();
}
function drop(event) {
event.preventDefault();
const targetInput = event.target.closest('.seat').querySelector('input');
if (targetInput && targetInput !== draggedInput) {
const tempValue = draggedInput.value;
draggedInput.value = targetInput.value;
targetInput.value = tempValue;
updateNamesList();
}
}
function dragEnd() {
draggedInput = null;
}
function touchStart(event) {
const touch = event.touches[0];
touchStartX = touch.clientX;
touchStartY = touch.clientY;
draggedInput = event.target.querySelector('input');
}
function touchMove(event) {
event.preventDefault();
const touch = event.touches[0];
const target = document.elementFromPoint(touch.clientX, touch.clientY);
if (target && target.closest('.seat') && target.closest('.seat') !== draggedInput.closest('.seat')) {
const targetInput = target.closest('.seat').querySelector('input');
if (targetInput && targetInput !== draggedInput) {
const tempValue = draggedInput.value;
draggedInput.value = targetInput.value;
targetInput.value = tempValue;
updateNamesList();
}
}
}
function touchEnd() {
draggedInput = null;
}
loadFromURL();
</script>
</body>
</html>