202 lines
8.8 KiB
PHP
202 lines
8.8 KiB
PHP
|
<?php
|
|||
|
|
|||
|
/**
|
|||
|
* @Descripttion : FOXCMS 是一款高效的 PHP 多端跨平台内容管理系统
|
|||
|
* @Author : FoxCMS Team
|
|||
|
* @Date : 2023/6/26 19:24
|
|||
|
* @version : V1.08
|
|||
|
* @copyright : ©2021-现在 贵州黔狐科技股份有限公司 版权所有
|
|||
|
* @LastEditTime : 2023/6/26 19:24
|
|||
|
*/
|
|||
|
|
|||
|
namespace app\plus\controller;
|
|||
|
|
|||
|
use app\common\controller\ApiBase;
|
|||
|
use app\common\model\FormField;
|
|||
|
use app\common\model\FormList;
|
|||
|
use PHPMailer\PHPMailer\PHPMailer;
|
|||
|
use think\captcha\facade\Captcha;
|
|||
|
use think\facade\Db;
|
|||
|
use think\Response;
|
|||
|
|
|||
|
class Diyform extends ApiBase
|
|||
|
{
|
|||
|
private $limitTime = 5; //限制时间单位分钟
|
|||
|
|
|||
|
// 接收表单数据
|
|||
|
function receive()
|
|||
|
{
|
|||
|
$param = $this->request->param();
|
|||
|
$locationHref = getFromPage();
|
|||
|
|
|||
|
if ($this->request->isPost()) {
|
|||
|
$id = $param["id"];
|
|||
|
if (empty($id)) {
|
|||
|
$content = "<html><body><script>alert('提交失败'); window.location.href='$locationHref'</script></body></html>";
|
|||
|
$type = "html";
|
|||
|
return Response::create($content, $type, 0);
|
|||
|
} else {
|
|||
|
$formList = FormList::find($id);
|
|||
|
if ($formList['verify'] == 1) { //开启
|
|||
|
if (empty($param['vercode'])) {
|
|||
|
$content = "<html><body><script>alert('验证码不能空'); window.location.href='$locationHref'</script></body></html>";
|
|||
|
$type = "html";
|
|||
|
return Response::create($content, $type, 0);
|
|||
|
}
|
|||
|
if (array_key_exists("vercode", $param) && !captcha_check($param['vercode'])) { //验证码
|
|||
|
$respContent = "<html><body><script>alert('验证码错误');window.location.href='$locationHref'</script></body></html>";
|
|||
|
$type = "html";
|
|||
|
return Response::create($respContent, $type, 0);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
$key = getAccessIP() . "_" . $id; //用于记录时间
|
|||
|
|
|||
|
$commit_type = $formList["commit_type"];
|
|||
|
if ($commit_type == 1) { //同IP在5分钟内,只许提交1次,可免避恶意多次提交。
|
|||
|
$timestamp1 = saveToCache($key);
|
|||
|
if ($timestamp1 != null) {
|
|||
|
$timestampArr = time_diff($timestamp1, time());
|
|||
|
$hours = $timestampArr["hours"]; //小时
|
|||
|
$minutes = $timestampArr["minutes"]; //分钟
|
|||
|
if ($hours <= 0 && $minutes < $this->limitTime) {
|
|||
|
$content = "<html><body><script>alert('频繁提交,请稍候再试'); window.location.href='$locationHref'</script></body></html>";
|
|||
|
$type = "html";
|
|||
|
return Response::create($content, $type, 0);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
if (!$formList) {
|
|||
|
$content = "<html><body><script>alert('提交失败,没找到对应表单');window.location.href='$locationHref'</script></body></html>";
|
|||
|
$type = "html";
|
|||
|
return Response::create($content, $type, 0);
|
|||
|
}
|
|||
|
unset($param["id"]); //移出表单id
|
|||
|
unset($param["vercode"]); //移出表单验证码
|
|||
|
|
|||
|
$formFields = FormField::where(["form_list_id" => $id, "is_require" => 1])->select()->toArray();
|
|||
|
$formData = [];
|
|||
|
if (sizeof($formFields) > 0) {
|
|||
|
$noExistParam = []; //没有必填字段
|
|||
|
$paramNull = []; //必填字段内容为空
|
|||
|
foreach ($formFields as $formField) {
|
|||
|
$isExist = false;
|
|||
|
if (key_exists($formField["name"], $param)) {
|
|||
|
$isExist = true;
|
|||
|
}
|
|||
|
if ($isExist) { //存在判断值是否为空
|
|||
|
if (empty($param[$formField['name']]) || $param[$formField['name']] == null) {
|
|||
|
array_push($paramNull, $formField['name']);
|
|||
|
} else { //不为空的时候处理一下内容
|
|||
|
$fieldVal = $param[$formField['name']];
|
|||
|
$fieldVal = form_replace($fieldVal);
|
|||
|
$param[$formField['name']] = $fieldVal;
|
|||
|
array_push($formData, ['title' => $formField['title'], 'value' => $fieldVal]);
|
|||
|
}
|
|||
|
} else {
|
|||
|
array_push($noExistParam, $formField['name']);
|
|||
|
}
|
|||
|
}
|
|||
|
if (sizeof($noExistParam) > 0) {
|
|||
|
$content = "<html><body><script>alert('提交失败,少了必填字段');window.location.href='$locationHref'</script></body></html>";
|
|||
|
$type = "html";
|
|||
|
return Response::create($content, $type, 0);
|
|||
|
}
|
|||
|
if (sizeof($paramNull) > 0) {
|
|||
|
$content = "<html><body><script>alert('提交失败,必填字段值为空');window.location.href='$locationHref'</script></body></html>";
|
|||
|
$type = "html";
|
|||
|
return Response::create($content, $type, 0);
|
|||
|
}
|
|||
|
}
|
|||
|
$r = Db::table($formList['table_name'])->strict(false)->insert($param);
|
|||
|
if ($r) {
|
|||
|
if ($formList['email_setting'] == 1) { //开启邮件通知
|
|||
|
$this->sendMail($formList['template_id'], $formData);
|
|||
|
}
|
|||
|
saveToCache($key, time()); //记录一下时间
|
|||
|
$content = "<html><body><script>alert('提交成功');window.location.href='$locationHref'</script></body></html>";
|
|||
|
$type = "html";
|
|||
|
return Response::create($content, $type, 200);
|
|||
|
} else {
|
|||
|
$content = "<html><body><script>alert('提交失败');window.location.href='$locationHref'</script></body></html>";
|
|||
|
$type = "html";
|
|||
|
return Response::create($content, $type, 0);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
$content = "<html><body><script>alert('提交失败');window.location.href='$locationHref'</script></body></html>";
|
|||
|
$type = "html";
|
|||
|
return Response::create($content, $type, 0);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 生成验证码
|
|||
|
*/
|
|||
|
public function verify()
|
|||
|
{
|
|||
|
return Captcha::create();
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 发送邮件
|
|||
|
*/
|
|||
|
private function sendMail($template_id, $formData)
|
|||
|
{
|
|||
|
$pmcArr = Db::name('plugin_mail_config')->select();
|
|||
|
if (sizeof($pmcArr) > 0) {
|
|||
|
$pluginMailConfig = $pmcArr[0];
|
|||
|
$pmt = Db::name('plugin_mail_template')->find($template_id);
|
|||
|
$title = $pmt['title'];
|
|||
|
$to = $pluginMailConfig['test_account'];
|
|||
|
$contents = ["<!DOCTYPE html>
|
|||
|
<html>
|
|||
|
<head>
|
|||
|
<title>邮件通知</title>
|
|||
|
<style>
|
|||
|
body { font-family: Arial, sans-serif; }
|
|||
|
.container { max-width: 600px; margin: auto; padding: 20px; border: 1px solid #ddd; }
|
|||
|
h1 {color: #333; }
|
|||
|
p { color: #666; }
|
|||
|
hr {border: 1px solid #ddd; }
|
|||
|
</style>
|
|||
|
</head>
|
|||
|
<body>
|
|||
|
<div class='container'>
|
|||
|
<h1>尊敬的FoxCMS用户</h1>
|
|||
|
<p style='font-size: 16px;'>这是一封来自您网站的通知邮件!</p>
|
|||
|
<p>您网站收到新的表单信息,可登录网后后台“应用-自定义表单”中查看。</p>
|
|||
|
<p style='font-weight: bold'>以下是消息内容</p>
|
|||
|
<hr>
|
|||
|
"];
|
|||
|
$template_content = $pmt['content'];
|
|||
|
foreach ($formData as $key => $fd) {
|
|||
|
$tc = str_replace("__TITLE__", $fd['title'], $template_content);
|
|||
|
$tc = str_replace("__CONTENT__", $fd['value'], $tc);
|
|||
|
array_push($contents, $tc);
|
|||
|
}
|
|||
|
array_push($contents, '</div></body></html>');
|
|||
|
$mail = new PHPMailer();
|
|||
|
$mail->SMTPDebug = 0;
|
|||
|
$mail->isSMTP();
|
|||
|
$mail->SMTPAuth = true;
|
|||
|
$mail->Host = trim($pluginMailConfig['smtp_url']);
|
|||
|
$mail->SMTPSecure = 'ssl';
|
|||
|
$mail->Port = $pluginMailConfig['smtp_port'];
|
|||
|
$mail->Hostname = '';
|
|||
|
$mail->CharSet = 'UTF-8';
|
|||
|
$mail->FromName = 'FoxCMS网站消息';
|
|||
|
$mail->Username = trim($pluginMailConfig['send_account']);
|
|||
|
$mail->Password = trim($pluginMailConfig['auth_code']);
|
|||
|
$mail->From = trim($pluginMailConfig['send_account']);
|
|||
|
$mail->isHTML(true);
|
|||
|
$mail->addAddress($to, '');
|
|||
|
$mail->Subject = $title;
|
|||
|
$mail->Body = implode("", $contents);
|
|||
|
try {
|
|||
|
$mail->send();
|
|||
|
} catch (\Exception $e) {
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|