453 lines
15 KiB
HTML
453 lines
15 KiB
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;
|
|
}
|
|
|
|
body {
|
|
font-family: "Helvetica Neue", Helvetica, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", 微软雅黑, Arial, sans-serif;
|
|
background-color: #f5f5f5;
|
|
color: #333;
|
|
width: 100%;
|
|
height: 100vh;
|
|
overflow-y: auto;
|
|
}
|
|
|
|
.header {
|
|
background-color: rgb(9, 84, 43);
|
|
color: white;
|
|
padding: 20px 30px;
|
|
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
|
|
}
|
|
|
|
.header h1 {
|
|
font-size: 24px;
|
|
font-weight: 500;
|
|
}
|
|
|
|
.container {
|
|
max-width: 1200px;
|
|
margin: 30px auto;
|
|
padding: 0 30px;
|
|
}
|
|
|
|
.form-card {
|
|
background: #fff;
|
|
border-radius: 8px;
|
|
padding: 30px;
|
|
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
|
|
}
|
|
|
|
.form-row {
|
|
display: flex;
|
|
gap: 30px;
|
|
margin-bottom: 20px;
|
|
align-items: center;
|
|
}
|
|
|
|
.form-group {
|
|
flex: 1;
|
|
}
|
|
|
|
.form-group.narrow {
|
|
flex: 0 0 200px;
|
|
}
|
|
|
|
.form-label {
|
|
display: block;
|
|
font-weight: 500;
|
|
color: #333;
|
|
margin-bottom: 8px;
|
|
font-size: 14px;
|
|
}
|
|
|
|
.form-label.required::after {
|
|
content: "*";
|
|
color: #ff4d4f;
|
|
margin-left: 4px;
|
|
}
|
|
|
|
.form-input {
|
|
width: 100%;
|
|
padding: 10px 12px;
|
|
border: 1px solid #d9d9d9;
|
|
border-radius: 4px;
|
|
font-size: 14px;
|
|
transition: all 0.3s ease;
|
|
background-color: #fafafa;
|
|
}
|
|
|
|
.form-input:focus {
|
|
border-color: #1890ff;
|
|
box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2);
|
|
outline: none;
|
|
background-color: #fff;
|
|
}
|
|
|
|
.form-input.placeholder {
|
|
color: #bfbfbf;
|
|
}
|
|
|
|
.text-editor-container {
|
|
margin-bottom: 30px;
|
|
}
|
|
|
|
.text-editor {
|
|
width: 100%;
|
|
min-height: 400px;
|
|
border: 1px solid #d9d9d9;
|
|
border-radius: 4px;
|
|
padding: 15px;
|
|
font-size: 14px;
|
|
line-height: 1.6;
|
|
resize: vertical;
|
|
transition: all 0.3s ease;
|
|
background-color: #fafafa;
|
|
}
|
|
|
|
.text-editor:focus {
|
|
border-color: #1890ff;
|
|
box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2);
|
|
outline: none;
|
|
background-color: #fff;
|
|
}
|
|
|
|
.toolbar {
|
|
background: #fafafa;
|
|
border: 1px solid #d9d9d9;
|
|
border-bottom: none;
|
|
border-radius: 4px 4px 0 0;
|
|
padding: 10px;
|
|
display: flex;
|
|
gap: 10px;
|
|
flex-wrap: wrap;
|
|
}
|
|
|
|
.toolbar-btn {
|
|
padding: 6px 10px;
|
|
border: 1px solid #d9d9d9;
|
|
border-radius: 3px;
|
|
background: #fff;
|
|
cursor: pointer;
|
|
font-size: 12px;
|
|
transition: all 0.3s ease;
|
|
}
|
|
|
|
.toolbar-btn:hover {
|
|
border-color: #1890ff;
|
|
color: #1890ff;
|
|
}
|
|
|
|
.toolbar-btn.active {
|
|
background: #1890ff;
|
|
color: #fff;
|
|
border-color: #1890ff;
|
|
}
|
|
|
|
.btn {
|
|
padding: 10px 20px;
|
|
border-radius: 5px;
|
|
font-size: 14px;
|
|
font-weight: 500;
|
|
transition: all 0.3s ease;
|
|
display: inline-flex;
|
|
align-items: center;
|
|
gap: 5px;
|
|
border: none;
|
|
cursor: pointer;
|
|
}
|
|
|
|
.btn-primary {
|
|
background-color: #1890ff;
|
|
color: white;
|
|
}
|
|
|
|
.btn-primary:hover {
|
|
background-color: #40a9ff;
|
|
transform: translateY(-2px);
|
|
}
|
|
|
|
.btn-success {
|
|
background-color: #52c41a;
|
|
color: white;
|
|
}
|
|
|
|
.btn-success:hover {
|
|
background-color: #73d13d;
|
|
transform: translateY(-2px);
|
|
}
|
|
|
|
.btn-warning {
|
|
background-color: #faad14;
|
|
color: white;
|
|
}
|
|
|
|
.btn-warning:hover {
|
|
background-color: #ffc53d;
|
|
transform: translateY(-2px);
|
|
}
|
|
|
|
.action-buttons {
|
|
display: flex;
|
|
gap: 10px;
|
|
justify-content: flex-end;
|
|
margin-top: 30px;
|
|
padding-top: 20px;
|
|
border-top: 1px solid #e8e8e8;
|
|
}
|
|
|
|
.content-section {
|
|
background: #fff;
|
|
border-radius: 8px;
|
|
padding: 20px;
|
|
margin-bottom: 20px;
|
|
border-left: 4px solid #1890ff;
|
|
}
|
|
|
|
.section-title {
|
|
font-weight: 600;
|
|
color: #333;
|
|
margin-bottom: 15px;
|
|
font-size: 16px;
|
|
}
|
|
|
|
.rule-item {
|
|
margin-bottom: 15px;
|
|
padding-left: 15px;
|
|
}
|
|
|
|
.rule-item:before {
|
|
content: counter(rule-counter);
|
|
counter-increment: rule-counter;
|
|
font-weight: 600;
|
|
color: #1890ff;
|
|
margin-right: 8px;
|
|
}
|
|
|
|
.sales-rules {
|
|
counter-reset: rule-counter;
|
|
}
|
|
|
|
.presale-rules {
|
|
counter-reset: rule-counter;
|
|
}
|
|
|
|
@media (max-width: 768px) {
|
|
.form-row {
|
|
flex-direction: column;
|
|
gap: 15px;
|
|
}
|
|
|
|
.form-group.narrow {
|
|
flex: 1;
|
|
}
|
|
|
|
.container {
|
|
padding: 0 15px;
|
|
}
|
|
|
|
.form-card {
|
|
padding: 20px;
|
|
}
|
|
|
|
.toolbar {
|
|
padding: 8px;
|
|
gap: 5px;
|
|
}
|
|
|
|
.action-buttons {
|
|
flex-direction: column;
|
|
}
|
|
}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<div class="header">
|
|
<h1>购物须知管理</h1>
|
|
</div>
|
|
|
|
<div class="container">
|
|
<div class="form-card">
|
|
<form id="shoppingNoticeForm">
|
|
<div class="form-row">
|
|
<div class="form-group narrow">
|
|
<label class="form-label required">菜市场:</label>
|
|
<input type="text" class="form-input" value="春申菜市场" readonly>
|
|
<div style="color: #ff4d4f; font-size: 12px; margin-top: 5px;">请选择菜市场</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="form-row">
|
|
<div class="form-group narrow">
|
|
<label class="form-label required">标题:</label>
|
|
<input type="text" class="form-input" value="购物须知">
|
|
</div>
|
|
</div>
|
|
|
|
<div class="text-editor-container">
|
|
<label class="form-label required">内容:</label>
|
|
<div class="toolbar">
|
|
<button type="button" class="toolbar-btn" onclick="execCommand('undo')">↶</button>
|
|
<button type="button" class="toolbar-btn" onclick="execCommand('redo')">↷</button>
|
|
<button type="button" class="toolbar-btn" onclick="formatText('bold')"><strong>B</strong></button>
|
|
<button type="button" class="toolbar-btn" onclick="formatText('italic')"><em>I</em></button>
|
|
<button type="button" class="toolbar-btn" onclick="formatText('underline')"><u>U</u></button>
|
|
<button type="button" class="toolbar-btn" onclick="formatText('strikethrough')"><s>S</s></button>
|
|
<button type="button" class="toolbar-btn" onclick="formatText('subscript')">X₂</button>
|
|
<button type="button" class="toolbar-btn" onclick="formatText('superscript')">X²</button>
|
|
<button type="button" class="toolbar-btn" onclick="insertText('quote')">"</button>
|
|
<button type="button" class="toolbar-btn" onclick="formatText('justifyLeft')">⫷</button>
|
|
<button type="button" class="toolbar-btn" onclick="formatText('justifyCenter')">≡</button>
|
|
<button type="button" class="toolbar-btn" onclick="formatText('justifyRight')">⫸</button>
|
|
<button type="button" class="toolbar-btn" onclick="formatText('justifyFull')">☰</button>
|
|
<button type="button" class="toolbar-btn" onclick="formatText('insertOrderedList')">1.</button>
|
|
<button type="button" class="toolbar-btn" onclick="formatText('insertUnorderedList')">•</button>
|
|
<button type="button" class="toolbar-btn" onclick="formatText('outdent')">⫷</button>
|
|
<button type="button" class="toolbar-btn" onclick="formatText('indent')">⫸</button>
|
|
<button type="button" class="toolbar-btn">—</button>
|
|
<button type="button" class="toolbar-btn">∷</button>
|
|
<button type="button" class="toolbar-btn">⁞</button>
|
|
<button type="button" class="toolbar-btn">🔗</button>
|
|
<button type="button" class="toolbar-btn">🖼</button>
|
|
<button type="button" class="toolbar-btn">📊</button>
|
|
<button type="button" class="toolbar-btn">😊</button>
|
|
<button type="button" class="toolbar-btn">👁</button>
|
|
<button type="button" class="toolbar-btn">🖨</button>
|
|
<button type="button" class="toolbar-btn">🗑</button>
|
|
</div>
|
|
<div class="text-editor" contenteditable="true" id="contentEditor">
|
|
<div class="content-section sales-rules">
|
|
<div class="section-title">售后规则:</div>
|
|
<div class="rule-item">如有卖家原因(商品或配送问题)造成的退货产生的配送费用实家承担,其他原因引起的退货产生的配送费用实家承担。</div>
|
|
<div class="rule-item">收到货物请核对包装和商品的完整,确认收货后如需售后请联系店铺客服。</div>
|
|
</div>
|
|
|
|
<div class="content-section presale-rules">
|
|
<div class="section-title">预售规则:</div>
|
|
<div class="rule-item">商品定金支付成功后,订单即生效,定金不可退。</div>
|
|
<div class="rule-item">补尾款时支付包装费、调度费和配送费,补尾款期内未补尾款视为自动放弃此订单。</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="action-buttons">
|
|
<button type="button" class="btn btn-warning">预览</button>
|
|
<button type="button" class="btn btn-primary">保存</button>
|
|
<button type="button" class="btn btn-success">发布</button>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
|
|
<script>
|
|
// 文本编辑器功能
|
|
function execCommand(command) {
|
|
document.execCommand(command, false, null);
|
|
}
|
|
|
|
function formatText(command) {
|
|
document.execCommand(command, false, null);
|
|
}
|
|
|
|
function insertText(type) {
|
|
const editor = document.getElementById('contentEditor');
|
|
const selection = window.getSelection();
|
|
|
|
if (type === 'quote') {
|
|
document.execCommand('insertHTML', false, '"');
|
|
}
|
|
}
|
|
|
|
// 表单验证
|
|
function validateForm() {
|
|
const market = document.querySelector('input[value="春申菜市场"]');
|
|
const title = document.querySelector('input[value="购物须知"]');
|
|
const content = document.getElementById('contentEditor');
|
|
|
|
if (!market.value.trim()) {
|
|
alert('请选择菜市场');
|
|
return false;
|
|
}
|
|
|
|
if (!title.value.trim()) {
|
|
alert('请填写标题');
|
|
return false;
|
|
}
|
|
|
|
if (!content.textContent.trim()) {
|
|
alert('请填写内容');
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
// 按钮事件处理
|
|
document.addEventListener('DOMContentLoaded', function() {
|
|
const buttons = document.querySelectorAll('.action-buttons .btn');
|
|
|
|
buttons.forEach(button => {
|
|
button.addEventListener('click', function() {
|
|
const action = this.textContent.trim();
|
|
|
|
switch(action) {
|
|
case '预览':
|
|
if (validateForm()) {
|
|
alert('预览功能开发中...');
|
|
}
|
|
break;
|
|
case '保存':
|
|
if (validateForm()) {
|
|
alert('保存成功!');
|
|
}
|
|
break;
|
|
case '发布':
|
|
if (validateForm()) {
|
|
if (confirm('确认发布购物须知吗?发布后将对用户可见。')) {
|
|
alert('发布成功!');
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
});
|
|
});
|
|
|
|
// 工具栏按钮状态切换
|
|
document.querySelectorAll('.toolbar-btn').forEach(btn => {
|
|
btn.addEventListener('click', function(e) {
|
|
e.preventDefault();
|
|
// 可以添加激活状态的切换逻辑
|
|
});
|
|
});
|
|
|
|
// 编辑器焦点处理
|
|
const editor = document.getElementById('contentEditor');
|
|
editor.addEventListener('focus', function() {
|
|
this.style.borderColor = '#1890ff';
|
|
});
|
|
|
|
editor.addEventListener('blur', function() {
|
|
this.style.borderColor = '#d9d9d9';
|
|
});
|
|
});
|
|
|
|
// 菜市场选择功能(模拟)
|
|
document.querySelector('input[value="春申菜市场"]').addEventListener('click', function() {
|
|
const markets = ['春申菜市场', '虹桥菜市场', '浦东菜市场', '徐汇菜市场'];
|
|
const selected = prompt('请选择菜市场:\n' + markets.map((m, i) => `${i + 1}. ${m}`).join('\n'));
|
|
|
|
if (selected && !isNaN(selected) && selected >= 1 && selected <= markets.length) {
|
|
this.value = markets[selected - 1];
|
|
this.nextElementSibling.style.display = 'none';
|
|
}
|
|
});
|
|
</script>
|
|
</body>
|
|
</html> |