python:基于django的html二维码页面生成功能页面

前言

这里给出一个基于django 的html二维码页面生成功能 页面,具有文件上传和订单提交两个功能,使用javascript来代理实现交互功能(包含无限扩展内容框生成功能)。

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

代码

qrcode_create.html

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/create_qrcode.css">
</head>
<body>
    <h2>产品详情</h2>
    <form id="uploadForm" enctype="multipart/form-data" method="post" action="">
        <input name="code" value="{{ code }}" hidden/>
        <div>
            <label for="page_title">页面标题:</label>
            <input type="text" id="page_title" name="page_title" placeholder="输入标题"  maxlength="64">
        </div>
		<div>
		    <label for="head_title">首行展示标题:</label>
		    <input type="text" id="head_title" name="head_title" placeholder="输入标题"  maxlength="64">
		</div>
		<div>
		    <label for="target_name">目标名称:</label>
		    <input type="text" id="target_name" name="target_name" placeholder="输入标题"  maxlength="64">
		</div>
		<div>
		    <label for="head_imgs_check">轮询图片:</label>
		    <input type="file" id="head_imgs_check" name="file" onchange="uploadFile('head_imgs_check', 'head_imgs')">
            <input type="file" id="head_imgs_check1" name="file" onchange="uploadFile('head_imgs_check1', 'head_imgs')">
            <input type="file" id="head_imgs_check2" name="file" onchange="uploadFile('head_imgs_check2', 'head_imgs')">
		</div>
        <div>
            <label for="content">最后的按钮内容:</label>
            <textarea id="final_button_text" name="final_button_text" placeholder="输入内容"  maxlength="16"></textarea>
        </div>
        <div>
            <label for="fileInput">最后的按钮跳转链接:</label>
            <textarea id="final_button_url" name="final_button_url" placeholder="输入链接地址"></textarea>
        </div>
		<div id="more_checks"></div>
		<button type="button" onclick="addMoreFields()">增加更多字段</button>
        <button type="submit">生成页面二维码</button>
    </form>
</body>
<script>
    // 定义一个全局变量
    var add_num = 0;

    function uploadFile(old_id, id) {
        var fileInput = document.getElementById('fileInput'); // 假设你的文件输入框的 id 是 'fileInput'
        var files = fileInput.files;

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

        if (files.length > 10) {
            alert("文件数量超限");
            return;
        }

        // 检查每个文件的大小
        for (let i = 0; i < files.length; i++) {
            if (files[i].size > 10 * 1024 * 1024) { // 10MB
                alert(`文件 "${files[i].name}" 超过了 10MB 的大小限制。\n`);
                return;
            }
        }

        var formData = new FormData();

        // 遍历所有选中的文件
        for (var i = 0; i < files.length; i++) {
            formData.append('files[]', files[i]); // 使用 'files[]' 作为字段名以处理多个文件
        }

        // 可以根据需要添加其他字段
        formData.append('code', '{{ code }}');

        fetch('/file/upload', {
            method: 'POST',
            body: formData
        })
        .then(response => response.json())
        .then(data => {
            if (data.status === true) {
                document.getElementById(old_id).insertAdjacentHTML('beforeend', `<input type="hidden" name=${id} value="[img]${data.data}">`);
                alert("文件上传成功");

                // 文件上传成功后,将输入框类型改为只读文本框
                var input = document.getElementById(old_id);
                input.setAttribute('type', 'text');
                input.setAttribute('value', '[img]' + data.data);
                input.setAttribute('readonly', 'readonly');
            } else {
                alert("文件上传失败: " + data.msg);
            }
        })
        .catch(error => {
            console.error('文件上传失败:', error);
            alert("文件上传失败,请重试");
        });
    }

    function addMoreFields() {
        // 每次执行时增加 add_num 的值
        add_num++;
        console.log(add_num)
        var additionalFields = `
            <div>
                <label for="contentType">内容类型:</label>
                <input type="radio" id="paragraphOption_${add_num}" name="contentType_${add_num}" value="paragraph" onclick="showContent('paragraph', ${add_num})">段落
                <input type="radio" id="imageOption_${add_num}" name="contentType_${add_num}" value="image" onclick="showContent('image', ${add_num})">图片
            </div>
            <div id="paragraphContent_${add_num}" style="display: none;">
                <label for="additionalContent">段落:</label>
                <textarea id="additionalContent" name="additionalContent" maxlength="255"></textarea>
            </div>
            <div id="imageContent_${add_num}" style="display: none;">
                <label for="additionalFileInput">图片:</label>
                <input type="file" id="additionalFileInput_${add_num}_check" onchange="uploadFile('additionalFileInput_${add_num}_check', 'additionalContent')">
            </div>
        `;
        document.getElementById('more_checks').insertAdjacentHTML('beforeend', additionalFields);
    }

    function showContent(contentType, check_num) {
        console.log(contentType, check_num)
        var paragraphContent = document.getElementById("paragraphContent_" + check_num);
        var imageContent = document.getElementById("imageContent_"  + check_num);

        if (contentType === 'paragraph') {
            paragraphContent.style.display = "block";
            imageContent.style.display = "none";
        } else if (contentType === 'image') {
            paragraphContent.style.display = "none";
            imageContent.style.display = "block";
        }
    }
</script>
</html>

create_qrcode.css

css 复制代码
body {
    font-family: Arial, sans-serif;
    background-color: #f4f4f4;
    margin: 0;
    padding: 20px;
}

h2 {
    color: #333;
}

form {
    background-color: #fff;
    padding: 20px;
    border-radius: 5px;
    box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
    margin-bottom: 20px;
}

div {
    margin-bottom: 10px;
}

label {
    font-weight: bold;
    margin-bottom: 5px;
    display: block;
}

input[type="text"],
textarea {
    width: 100%;
    padding: 8px;
    border: 1px solid #ccc;
    border-radius: 5px;
    box-sizing: border-box;
}

input[type="file"] {
    width: 100%;
    margin-top: 5px;
}

button {
    padding: 10px 20px;
    background-color: #007bff;
    color: #fff;
    border: none;
    border-radius: 5px;
    cursor: pointer;
    transition: background-color 0.3s ease;
}

button:hover {
    background-color: #0056b3;
}

.additional-fields {
    display: none;
}
相关推荐
宸津-代码粉碎机1 小时前
OpenAI 连夜迎战 Grok Bot 和 Muse:AI 智能体从 “会聊天” 到 “能办事”,现在入场还来得及吗
java·大数据·人工智能·分布式·python
Y3815326622 小时前
SERP API 计费口径:credits_charged、执行失败扣费与退款边界
python·搜索引擎
蒸鱼Yuzheng3 小时前
设备端性能工件可靠导出:断点续传、哈希、manifest 与失败恢复
android·自动化测试·python·adb·数据完整性
圆圆讲门店4 小时前
挑选同城获客服务机构时需要考量的核心因素都有哪些?
大数据·网络·人工智能·python
傻啦嘿哟4 小时前
Python的默认参数把我坑惨了,原来写[]和写None的区别这么大
开发语言·python·机器学习
微小冷4 小时前
Python凸优化cvxpy初步
python·机器人·凸优化·数学规划·cvxpy
在世修行5 小时前
干货:显式映射 vs 自动判据
python·插件
xzal125 小时前
Python之简单理解栈和队列
python
lupai5 小时前
维修保养记录精准版 API 对接实战指南
数据库·python
水水不水啊5 小时前
告别杂乱的调试窗口:我用 Python + WebView 写了一个现代化串口助手
python·测试工具·嵌入式·嵌入式开发·串口调试·串口助手