当前位置: 首页 > article >正文

python:基于django的html订单提交页面

前言

        这里给出一个基于django的html订单提交页面,具有文件上传订单提交两个功能,使用javascript来代理实现交互功能。

        注意:这只是前端html代码和css代码,没有包含后端数据处理

代码

         service.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>服务详情页面</title>
    <link rel="stylesheet" href="/static/css/all.min.css">
    <link rel="stylesheet" href="/static/css/detail_css.css">
    <link rel="stylesheet" href="/static/css/back_page.css">
</head>
<body>
<!-- 返回链接,使用图片作为图标 -->
    <a href="javascript:history.back()" class="back-link">
        <img src="/static/image/back.png" alt="返回" />
    </a>
    <div class="container">
        <h1>服务详情页面</h1>

        <div class="service-info">
            <h2>{{ service.service_name }}</h2>
            <p>{{ service.service_desc }}</p>
            <p>服务收费:¥ {{ service.price }} 元/次</p>
        </div>

        <div class="provider-list">
            <h2>可选服务商</h2>
                <div class="provider">
                    <label for="provider-select">选择服务商:</label>
                    <select id="provider-select">
                        {% for server in servers %}
                            <option title="完成单数量:{{ server.all_done }} | 完单率 {{ server.success_rate }} %" value="{{ server.user_id }}">{{ server.username }}(
                                <span style="color: red;">完成单数量:{{ server.all_done }}</span> |
                                <span style="color: yellow;">完单率{{ server.success_rate }} %</span>
                            )</option>
                        {% endfor %}
                        <!-- 更多服务商... -->
                    </select>
                </div>
        </div>

        <div class="order-config">
            <h2>订单配置参数</h2>
            <label for="order-quantity">文字要求:</label>
            <input id="desc_text" placeholder="尽量简短" />

            <!-- 文件上传表单 -->
            <label for="fileInput">选择文件 (最多10个,单个文件不超过10MB):</label>
            <input type="file" id="fileInput" name="fileInput" multiple>
            <input type="hidden" id="fileListInput" name="file_list" value="" hidden/>
            <input type="submit" id="file_upload" name="file_upload" onclick="uploadFile()" value="上传文件">

        </div>

        <button class="submit-button" onclick="uploadOrder()">提交订单</button>
    </div>
</body>

<script>
    function uploadFile() {
        const fileInput = document.getElementById("fileInput");
        const files = fileInput.files;
        var selectElement = document.getElementById("provider-select");

        // 获取所选的 option
        var selectedOption = selectElement.options[selectElement.selectedIndex];
        
        if (!selectedOption) {
            alert('请选择执行者!');
            return;
        }


        if (files.length === 0) {
            alert('请先选择文件');
            return;
        }

        // 创建 FormData 对象
        const formData = new FormData();
        for (let i = 0; i < files.length; i++) {
            formData.append('files', files[i]);
        }

        fetch('/file/upload', {
            method: 'POST',
            body: formData
        })
        .then(response => response.json())
        .then(data => {
            if (data.status === true) {
                document.getElementById('fileListInput').value = data.msg;
                alert("文件上传成功");
            } else {
                alert("文件上传失败: " + data.msg);
            }
        })
        .catch(error => {
            console.error('文件上传失败:', error);
            alert("文件上传失败,请重试");
        });
    }

    function uploadOrder() {
        var fileInput = document.getElementById("fileListInput").value;
        var desc_text = document.getElementById("desc_text").value;
        var selectElement = document.getElementById("provider-select");
        var type_no = {{ type_no }};

        // 获取所选的 option
        var selectedOption = selectElement.options[selectElement.selectedIndex];
        
        if (!selectedOption) {
            alert('请选择执行者!');
            return;
        }
        
        // 获取选中项的值和文本
        var selectedValue = selectedOption.value; // 选项的值


        if (fileInput.trim() === "" && desc_text.trim() === "") {
            alert('文件或内容不可同时为空项,请填入您的要求!');
            return;
        }

        var jsonData = JSON.stringify({
            "file_str": fileInput,
            "desc_text": desc_text,
            "performer": selectedValue,
            "type_no": type_no,
        });

        fetch('', {
            method: 'POST',
            headers: {
                    'Content-Type': 'application/json',
                },
            body: jsonData
        })
        .then(response => response.json())
        .then(data => {
            if (data.status === true) {
                alert("订单提交成功");
                window.location.href = '/order/detail?order_id=' + data.msg;
            } else {
                alert("订单提交失败: " + data.msg);
            }
        })
        .catch(error => {
            console.error('订单提交失败:', error);
            alert("订单提交失败,请重试");
        });
    }
</script>

</html>

         detail_css.css

body {
    font-family: Arial, sans-serif;
    margin: 0;
    padding: 0;
    background-color: #f4f4f4;
}
.container {
    width: 80%;
    margin: 20px auto;
    background: #fff;
    padding: 20px;
    border-radius: 8px;
    box-shadow: 0 2px 5px rgba(0,0,0,0.1);
}
h1 {
    text-align: center;
    margin-bottom: 20px;
    color: #333;
}
.service-info, .provider-list, .order-config {
    margin-bottom: 20px;
}
.service-info {
    border-bottom: 1px solid #ddd;
    padding-bottom: 10px;
}
.provider-list {
    border-bottom: 1px solid #ddd;
    padding-bottom: 10px;
}
.provider {
    padding: 10px;
    border: 1px solid #ddd;
    border-radius: 5px;
    margin-bottom: 10px;
    background-color: #f9f9f9;
}
.provider h3 {
    margin: 0;
    color: #444;
}
.provider p {
    margin: 5px 0;
    color: #666;
}
.order-config label {
    display: block;
    margin: 10px 0 5px;
    color: #333;
}
.order-config input, .order-config select, .order-config textarea {
    width: calc(100% - 22px);
    padding: 10px;
    border: 1px solid #ddd;
    border-radius: 5px;
    margin-bottom: 10px;
    box-sizing: border-box;
}
.submit-button {
    display: block;
    width: 100%;
    padding: 15px;
    background-color: #4CAF50;
    color: #fff;
    border: none;
    border-radius: 5px;
    font-size: 16px;
    cursor: pointer;
    text-align: center;
}
.submit-button:hover {
    background-color: #45a049;
}
.provider select {
    width: 100%;
    padding: 10px;
    border: 1px solid #ddd;
    border-radius: 5px;
}


http://www.kler.cn/a/322726.html

相关文章:

  • FPGA开发-逻辑分析仪的应用-数字频率计的设计
  • 使用Python和BeautifulSoup进行网页抓取:通过Python编程语言,结合BeautifulSoup库,可以轻松地从网站上抓取所需的信息。
  • 场景营销在企业定制开发 AI 智能名片 S2B2C 商城小程序中的应用与价值
  • Visual Studio 2017 快捷键设置-批量注释和批量取消注释
  • 人工智能与SEO优化中的关键词策略解析
  • 若点集A=B则A必能恒等变换地变为B=A这一几何常识推翻直线(平面)公理
  • 小程序振动
  • 从零开始Ubuntu24.04上Docker构建自动化部署(三)Docker安装Nginx
  • centos8 升级openssh-9.8p1
  • 《C++开源贡献:提升职业竞争力的新途径》
  • 搜索引擎onesearch3实现解释和升级到Elasticsearch v8系列(四)-搜索
  • Spark Job 对象 详解
  • ‌[AI问答] Auto-sklearn‌ 与 scikit-learn 区别
  • 【SpringCloud】环境和工程搭建
  • 数据分析学习之学习路线
  • AI 将会促生哪些新的职业?
  • AT89C51 利用SBIT寻址,并且在内存中实现伪动态密码的混淆
  • gRPC协议简介
  • C++的动态数组
  • 统信服务器操作系统【targetcli部署】
  • HarmonyOS应用开发(组件库)--组件模块化开发、工具包、设计模式(持续更新)
  • 【hadoop安装】
  • 微服务的优点及在云原生时代的合理落地方式
  • 光伏发电生活废水处理设备产地货源
  • 828华为云征文|华为云Flexus云服务器X实例之openEuler系统下搭建MaxKB开源知识库问答系统
  • 中国的互联网电商,终于还是“连上了”