首页 > 编程语言 >tp+javascript 输入框/绑定邮箱

tp+javascript 输入框/绑定邮箱

时间:2022-08-29 20:58:25浏览次数:57  
标签:ok resume javascript json tp 输入框 JSON file id

添加数据库 and 绑定邮箱!!!

 

实现效果:

 

 

数据库设计:

CREATE TABLE `o_my_resume` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL COMMENT '姓名',
  `job` text NOT NULL COMMENT '申请的岗位',
  `tel` varchar(255) NOT NULL COMMENT '手机号码',
  `ip` varchar(255) NOT NULL COMMENT 'IP',
  `addr` text NOT NULL COMMENT '地址',
  `file_id` text NOT NULL COMMENT '简历文件的ID',
  `status` tinyint(1) DEFAULT '1',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '申请日期',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=138 DEFAULT CHARSET=utf8 COMMENT='用户提交的简历';

前端页面:

<div class="job-apply-dialog">
    <div class="job-apply-dialog-inner">
        <div class="close"><i class="iconfont icon-close"></i></div>
        <div class="job-apply-dialog-header">
            <h3>填写简历</h3>
        </div>
        <div class="job-apply-dialog-body">
                <form id="form" method="post" role="form" class="job-apply-dialog-form" enctype="multipart/form-data">
                <div>
                    <label for="job">申请职位:</label>
                    <select name="job" id="job">
                        <volist name="jobs" id="job">
                            <option value="{$job.name}">{$job.name}</option>
                        </volist>
                    </select>
                </div>
                <div class="form-group ly-group">
                    <label for="">姓名:</label>
                    <input type="text" id="name" name="name"  placeholder="请输入姓名">
                </div>
                <div class="form-group ly-group">
                    <label for="">手机号码:</label>
                    <input type="text" id="tel" name="tel"  placeholder="请输入手机号码">
                </div>
                <div class="form-group ly-group">
                    <label for="">地址:</label>
                    <input type="text" id="addr" name="addr" required placeholder="请输入地址">
                </div>
                <div class="form-group ly-group">
                    <label for="">简历:<span class="tip">(请选择 PDF 或 Word,文件小于 5
                            MB)</span></label>
                    <input type="file" id="file" name="file" accept=".pdf, .doc, .docx" required>
                </div>
                <div class="form-group ly-group">
                    <label for="verify">验证码:<span class="tip">(如果验证码看不清,点击图片刷新)</span></label>
                    <div class="verify-block">
                        <input type="text" id="verify" name="verify" required size="4" minlength="4"
                            maxlength="4" placeholder="请输入4位验证码,不区分大小写">
                        <img class="verifyImage" src="/join/verifyImage" alt="验证码图片" width="220"
                            height="60">
                    </div>
                </div>
                <!-- <div class="submit" >
                    <button>提交简历</button>
                </div> -->
                <button type="submit">提交</button>
            </form>
        </div>
    </div>
</div>

script代码:

  <script>
        $('.job-apply-dialog-form').submit(function (event) {
            event.preventDefault();
            var form = event.target;
            var formData = new FormData(form);
            axios({
                method: "POST",
                // url: "/join/sendmsg",
                url: "/join/submitResume",
                data: formData,
                headers: { "Content-Type": "multipart/form-data" },
            }).then(function (response) {
                if (!response.data.ok) {
                    alert(response.data.error_msg);
                    return;
                } else {
                    $('.job-apply-dialog').removeClass('on');
                    alert(response.data.ok_msg);
                }
                console.log(response);
            }).catch(function (error) {
                console.log(error);
            }).then(function () {
                // 无论如何(提交成功与否)验证码都需要更新
                verifyImageEl.src += '?' + Math.random();
            })
        });

        var verifyImageEl = document.querySelector('.verifyImage');
        verifyImageEl.addEventListener('click', function (event) {
            this.src = this.src + '?' + Math.random();
        });
    </script>

php代码:

 public function submitResume()
    {
        if (!IS_POST) {
            // http_response_code(400);
            $this->show(json_encode(
                ['ok' => false, 'error_msg' => 'Invalid HTTP method, not POST'],
                JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT
            ), 'utf-8', 'application/json');
            return;
        }

        $verify = new \Think\Verify();
        if (!$verify->check(I('verify'))) {
            // http_response_code(400);
            $this->show(json_encode(
                ['ok' => false, 'error_msg' => '验证码错误'],
                JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT
            ), 'utf-8', 'application/json');
            return;
        }

        $upload = new \Think\Upload();
        $upload->maxSize = 5 * 1024 * 1024;
        $upload->exts = ['pdf', 'doc', 'docs'];
        $upload->rootPath = './Uploads/';
        $upload->savePath = 'Resume/';
        $info = $upload->uploadOne($_FILES['file']);
        if (!$info) {
            // http_response_code(400);
            $upload->getError();
            $this->show(json_encode(
                ['ok' => false, 'error_msg' => $upload->getError()],
                JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT
            ), 'utf-8', 'application/json');
            return;
        }



        $cont .= "申请职位:{$_POST['job']} \n\r";
        $cont = "姓名:{$_POST['name']} \n\r";
        $cont .= "电话:{$_POST['tel']} \n\r";
        $cont .= "地址:{$_POST['addr']} \n\r";
        $fileUrl = "./Uploads/{$info['savepath']}/{$info['savename']}";

        $file = array(
            $fileUrl
        );
    

        $res = think_send_mail('[email protected]', '您有新消息', '您有新消息', $cont,$file);
 

        // "info": {
        //     "name": "688566 吉贝尔 2020-09-08  关于选举职工代表监事的公告.pdf",
        //     "type": "application\/pdf",
        //     "size": 232146,
        //     "key": 0,
        //     "ext": "pdf",
        //     "md5": "8273ac225f90ed815ae089ec5e8687d2",
        //     "sha1": "b278a09a09ebc696a199551ec289a63076084d1e",
        //     "savename": "6156daca6e86c.pdf",
        //     "savepath": "Resume\/2021-10-01\/"
        // }
        $resume_file_id = M('resume_file')->add($info);
        if (!$resume_file_id) {
            $this->show(json_encode(
                ['ok' => false, 'error_msg' => '文件信息保存到数据库resume_file失败!'],
                JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT
            ), 'utf-8', 'application/json');
            return;
        }


        // job: 合成研究员 (2名)
        // name: a
        // tel: b
        // addr: c
        $result = M('my_resume')->add([
            'job' => I('job'),
            'name' => I('name'),
            'tel' => I('tel'),
            'ip' => get_client_ip(),
            'addr' => I('addr'),
            'file_id' => $resume_file_id,
        ]);


        
        if (!$result) {
            $this->show(json_encode(
                ['ok' => false, 'error_msg' => '简历信息保存到数据库my_resume失败!'],
                JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT
            ), 'utf-8', 'application/json');
            return;
        }
        

        $this->show(json_encode(
            ['ok' => true, 'ok_msg' => '成功提交简历!', 'info' => $info, 'resume_file_id' => $resume_file_id],
            JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT
        ), 'utf-8', 'application/json');

    }

最终结果  效果图:

 

标签:ok,resume,javascript,json,tp,输入框,JSON,file,id
From: https://www.cnblogs.com/gaoyusui/p/16637320.html

相关文章

  • APICloud AVM 封装验证码输入框组件
    AVM(Application-View-Model)前端组件化开发模式基于标准WebComponents组件化思想,提供包含虚拟DOM和Runtime的编程框架avm.js以及多端统一编译工具,完全兼容WebCom......
  • javascript中的constructor
    1.使用constructor   constructor是Object类型的原型属性,它能够返回当前对象的构造器(类型函数)。利用该属性,可以检测是否复合类型数据的类型,如对象,数组和函数等。v......
  • JavaScript设计模式及代码实现——单例模式
    单例模式1定义保证一个类仅有一个实例,并提供一个访问它的全局访问点。2应用时机当一个类的实例被频繁使用,如果重复创建这个实例,会无端消耗资源。比如dialog弹......
  • http1.0、http1.1和http2.0的区别
    1、影响http传输的两个因素带宽和延迟(延迟包括:浏览器阻塞、DNS查询和建立连接)。2、HTTP1.0和HTTP1.1的区别1)长链接:HTTP1.1支持长连接和请求的流水线处理,在一个TCP连接上......
  • http面试之——http3次握手和4次挥手
    面试官常问的关于http建立连接的高频问题:1、说一说http建立连接的过程?2、你刚讲到了3次握手,为什么是3次,2次不行吗?3、SYN攻击是什么?4、那断开连接呢,需要几次?5、为什么是......
  • nginx http code
    301:永久重定向,表示请求的资源分配了新的url,以后应使用新url302:临时重定向,请求的资源临时分配了新的url(response中location所指的地址),本次请求暂时使用新url304:自从上次......
  • 了解异步 JavaScript
    了解异步JavaScriptphotofromunsplash介绍我发现异步JavaScript是大多数初学者最容易混淆的概念之一。我也不容易掌握。虽然我看了很多教程,也阅读了很多关于它的......
  • 为什么在Javascript中声明之前可以访问变量?
    为什么在Javascript中声明之前可以访问变量?毫无疑问,当今最常用和最著名的语言之一是JavaScript,如今它无处不在,我们可以创建Web应用程序和系统,在后端开发API并创建移......
  • DES|3DES|AES|RSA|DH | CA | SSL(HTTPS)
    1、对称密钥算法:加解密速度块,算法使安全的,已知算法无法推出密钥。但是密钥的分发困难。DES:对称密钥算法,是一种块加密算法,只有一个密钥。加解密都是用一个密钥。3DES:与DES......
  • STP生成树
    1、生成树是为了防止二层环路造成的广播风暴。通过阻塞环路的某个端口从而达到消除环路的目的。2、生成树的选举过程:①选举根桥:根据BPDU报文中的BID选举根桥。BID为优先......