This commit is contained in:
2026-01-05 14:33:21 +08:00
commit ee348b4925
451 changed files with 39954 additions and 0 deletions
@@ -0,0 +1,33 @@
<?php
namespace app\{{controllerModule}}\controller;
use app\common\controller\BaseController;
use app\common\traits\crud\CrudControllerTrait;
use app\{{serviceModule}}\service\{{serviceName}}Service;
class {{controllerName}}Controller extends BaseController
{
use CrudControllerTrait;
protected $service;
public function __construct()
{
$this->service = new {{serviceName}}Service();
}
/**
* 列表页数据格式化
*
* @param array $data
* @return array
*/
// protected function indexFormat($data)
// {
// if (isset($data['created_at']))
// $data['created_at'] = date('Y-m-d H:i:s', $data['created_at']);
// if (isset($data['updated_at']))
// $data['updated_at'] = date('Y-m-d H:i:s', $data['updated_at']);
// return $data;
// }
}
@@ -0,0 +1,365 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>客户信息 - {{order_no}}</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
}
body {
background: linear-gradient(135deg, #f8f9fa 0%, #e9ecef 100%);
min-height: 100vh;
display: flex;
justify-content: center;
align-items: center;
padding: 20px;
color: #343a40;
}
.email-container {
max-width: 800px;
width: 100%;
background: white;
border-radius: 15px;
overflow: hidden;
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);
border-top: 5px solid #4361ee;
}
.email-header {
background: linear-gradient(120deg, #4361ee, #3a0ca3);
color: white;
padding: 30px;
text-align: center;
position: relative;
}
.header-content {
position: relative;
z-index: 2;
}
.logo {
font-size: 2.5rem;
margin-bottom: 15px;
color: white;
}
h1 {
font-size: 1.8rem;
margin-bottom: 10px;
font-weight: 600;
}
.subtitle {
font-size: 1.1rem;
opacity: 0.9;
max-width: 600px;
margin: 0 auto;
}
.sn-badge {
background: #ff9e00;
color: white;
padding: 6px 15px;
border-radius: 20px;
font-size: 0.9rem;
font-weight: 600;
display: inline-block;
margin-top: 15px;
}
.email-body {
padding: 40px;
}
.info-grid {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 25px;
margin-bottom: 30px;
}
.info-card {
background: #f8f9fa;
border-radius: 10px;
padding: 20px;
transition: all 0.3s ease;
border-left: 4px solid #4361ee;
}
.info-card:hover {
transform: translateY(-5px);
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.05);
}
.card-title {
font-size: 1rem;
color: #6c757d;
margin-bottom: 12px;
display: flex;
align-items: center;
}
.card-title i {
margin-right: 10px;
color: #4361ee;
}
.card-value {
font-size: 1.2rem;
font-weight: 600;
color: #212529;
}
.status-container {
background: #e7f5ff;
border-radius: 10px;
padding: 25px;
margin: 30px 0;
display: flex;
justify-content: space-between;
align-items: center;
border: 1px dashed #4dabf7;
}
.status-badge {
padding: 8px 20px;
border-radius: 30px;
font-weight: 600;
font-size: 0.9rem;
}
.status-badge.copper {
background: #cd7f32;
color: white;
}
.status-badge.pending {
background: #ffd8a8;
color: #e67700;
}
.details-section {
background: #f8f9fa;
border-radius: 10px;
padding: 25px;
margin-top: 30px;
}
.section-title {
font-size: 1.3rem;
margin-bottom: 20px;
color: #212529;
display: flex;
align-items: center;
border-bottom: 2px solid #dee2e6;
padding-bottom: 12px;
}
.section-title i {
margin-right: 10px;
color: #4361ee;
}
.details-content {
line-height: 1.8;
color: #495057;
}
.email-footer {
background: #f1f3f5;
padding: 25px;
text-align: center;
color: #868e96;
font-size: 0.9rem;
border-top: 1px solid #dee2e6;
}
.footer-links {
display: flex;
justify-content: center;
gap: 20px;
margin-top: 15px;
}
.footer-links a {
color: #495057;
text-decoration: none;
transition: color 0.3s;
}
.footer-links a:hover {
color: #4361ee;
}
@media (max-width: 768px) {
.info-grid {
grid-template-columns: 1fr;
}
.action-buttons {
flex-direction: column;
}
.email-header {
padding: 20px;
}
.email-body {
padding: 25px;
}
}
@media (max-width: 768px) {
.status-container {
flex-direction: column;
}
.status-item {
width: 100%;
display: flex;
justify-content: space-between;
}
.left{
width: 100%;
margin-bottom: 20px;
}
.right{
width: 100%;
}
.copper{
text-align: center;
}
}
</style>
</head>
<body>
<div class="email-container">
<div class="email-header">
<div class="header-content">
<div class="logo">
<i class="fas fa-user-tie"></i>
</div>
<h1>客户信息详情</h1>
<!--<p class="subtitle">此邮件包含客户详细信息及业务状态,请及时处理</p>-->
<div class="sn-badge">编号: {{order_no}}</div>
</div>
</div>
<div class="email-body">
<div class="info-grid">
<div class="info-card">
<div class="card-title">
<i class="fas fa-user"></i> 客户名称
</div>
<div class="card-value">{{contacts}}</div>
</div>
<div class="info-card">
<div class="card-title">
<i class="fas fa-phone"></i> 电话
</div>
<div class="card-value">{{tel}}</div>
</div>
<div class="info-card">
<div class="card-title">
<i class="fas fa-globe"></i> 国家/地区
</div>
<div class="card-value">{{country}}</div>
</div>
<div class="info-card">
<div class="card-title">
<i class="fas fa-chart-line"></i> 渠道
</div>
<div class="card-value">{{channel}}</div>
</div>
<div class="info-card">
<div class="card-title">
<i class="fas fa-envelope"></i> 邮箱
</div>
<div class="card-value">{{email}}</div>
</div>
<div class="info-card">
<div class="card-title">
<i class="fab fa-whatsapp"></i> WhatsApp
</div>
<div class="card-value">{{whatsapp}}</div>
</div>
<div class="info-card">
<div class="card-title">
<i class="fas fa-user-plus"></i> 发布人
</div>
<div class="card-value">{{enter_user_id}}</div>
</div>
<div class="info-card">
<div class="card-title">
<i class="fas fa-user-check"></i> 跟踪人
</div>
<div class="card-value">{{recipient}}</div>
</div>
</div>
<div class="status-container">
<div class="left">
<div class="card-title">
<i class="fas fa-history"></i> 录单时间
</div>
<div class="card-value">{{r_time}}</div>
</div>
<div class="right">
<div class="card-title">
<i class="fas fa-medal"></i> 商机等级
</div>
<div class="status-badge copper">{{quality}}</div>
</div>
</div>
<div class="details-section">
<h3 class="section-title">
<i class="fas fa-file-alt"></i> 详情内容
</h3>
<div class="details-content">
{{content}}
</div>
</div>
</div>
<div class="email-footer">
<p>© 2025 客户关系管理系统 | 企业客户管理平台</p>
<div class="footer-links">
<a href="https://www.hnxinyouhe.com"><i class="fas fa-globe"></i> 公司官网</a>
<a href="https://www.hnxinyouhe.com"><i class="fas fa-headset"></i> 支持中心</a>
<a href="https://www.hnxinyouhe.com"><i class="fas fa-lock"></i> 隐私政策</a>
</div>
<p style="margin-top: 15px;">此邮件为系统自动生成,请勿直接回复</p>
</div>
</div>
<script>
// 添加简单的交互效果
document.addEventListener('DOMContentLoaded', function() {
const infoCards = document.querySelectorAll('.info-card');
infoCards.forEach(card => {
card.addEventListener('click', function() {
this.classList.toggle('active');
});
});
});
</script>
</body>
</html>
@@ -0,0 +1,17 @@
<?php
namespace app\{{logicModule}}\logic;
use app\common\traits\crud\CrudLogicTrait;
use app\{{modelModule}}\model\{{modelName}};
class {{logicName}}Logic
{
use CrudLogicTrait;
/**
* 指定当前要操作的模型
*/
protected string $modelClass = {{modelName}}::class;
}
@@ -0,0 +1,49 @@
<?php
namespace app\{{modelModule}}\model;
use support\Model;
class {{modelName}} extends Model
{
/**
* The connection name for the model.
*
* @var string|null
*/
protected $connection = 'mysql';
/**
* The table associated with the model.
*
* @var string
*/
protected $table = '{{table}}';
/**
* The primary key associated with the table.
*
* @var string
*/
protected $primaryKey = 'id';
/**
* Indicates if the model should be timestamped.
*
* @var bool
*/
public $timestamps = true;
protected $dateFormat = 'U';
/**
* 允许自动填充模型字段
*/
protected $fillable = [{{fillable}}];
/**
* 不允许自动填充模型字段
*/
protected $guarded = [];
}
@@ -0,0 +1,31 @@
<?php
namespace app\{{serviceModule}}\service;
use app\{{validateModule}}\validate\{{validateName}}Validate;
use app\common\traits\crud\CrudServiceTrait;
use app\{{modelModule}}\model\{{modelName}};
class {{serviceName}}Service
{
use CrudServiceTrait;
/**
* 指定当前要操作的模型
*/
protected string $modelClass = {{modelName}}::class;
/**
* 验证器
*/
protected $validator = {{validateName}}Validate::class;
/**
* 获取验证器
*/
public function getValidator()
{
return new $this->validator;
}
}
@@ -0,0 +1,29 @@
<?php
namespace app\{{validateModule}}\validate;
use think\Validate;
class {{validateName}}Validate extends Validate
{
// 规则
protected $rule = [
];
// 提示
protected $message = [
];
// 场景
protected $scene = [
'store' => [
],
'update' => [
]
];
}
@@ -0,0 +1,103 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>邮箱提醒</title>
<style type="text/css">
body {
font-family: Arial, sans-serif;
line-height: 1.6;
color: #333333;
margin: 0;
padding: 0;
background-color: #f5f5f5;
}
.email-container {
max-width: 600px;
margin: 0 auto;
background-color: #ffffff;
}
.header {
padding: 20px;
background-color: #0056b3;
color: white;
text-align: center;
}
.content {
padding: 20px;
}
.button {
display: inline-block;
padding: 10px 20px;
background-color: #0056b3;
color: white !important;
text-decoration: none;
border-radius: 4px;
font-weight: bold;
margin: 10px 0;
}
.footer {
padding: 15px;
text-align: center;
font-size: 12px;
color: #777777;
background-color: #f0f0f0;
}
@media only screen and (max-width: 480px) {
.email-container {
width: 100%;
}
.button {
display: block;
text-align: center;
}
}
</style>
</head>
<body>
<!--[if mso]>
<style type="text/css">
.button {
background-color: #0056b3 !important;
color: white !important;
}
</style>
<![endif]-->
<table class="email-container" width="100%" cellspacing="0" cellpadding="0" border="0" align="center">
<tr>
<td class="header">
<h1>付款单提醒</h1>
</td>
</tr>
<tr>
<td class="content">
<p>您好,</p>
<p>您有新的付款单待处理。请及时查看:</p>
<ul>
<li>付款单编号:{{code}}</li>
<li>付款主体:{{payment_entity}}</li>
<li>问题描述:{{content}}</li>
{{reply}}
</ul>
<p>请点击下方按钮立即查看详情:</p>
<div style="text-align: center;">
<a href="https://x.hnxinyouhe.com" class="button" style="color: white; text-decoration: none;">立即查看</a>
</div>
<!--<p>如果您未请求此操作,请忽略此邮件或联系我们的客服团队。</p>-->
</td>
</tr>
<tr>
<td class="footer">
<p>© 2025 河南新友合科技有限公司. 保留所有权利。</p>
<p>这是系统自动发送的邮件,请勿直接回复。</p>
</td>
</tr>
</table>
</body>
</html>
@@ -0,0 +1,103 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>邮箱提醒</title>
<style type="text/css">
body {
font-family: Arial, sans-serif;
line-height: 1.6;
color: #333333;
margin: 0;
padding: 0;
background-color: #f5f5f5;
}
.email-container {
max-width: 600px;
margin: 0 auto;
background-color: #ffffff;
}
.header {
padding: 20px;
background-color: #0056b3;
color: white;
text-align: center;
}
.content {
padding: 20px;
}
.button {
display: inline-block;
padding: 10px 20px;
background-color: #0056b3;
color: white !important;
text-decoration: none;
border-radius: 4px;
font-weight: bold;
margin: 10px 0;
}
.footer {
padding: 15px;
text-align: center;
font-size: 12px;
color: #777777;
background-color: #f0f0f0;
}
@media only screen and (max-width: 480px) {
.email-container {
width: 100%;
}
.button {
display: block;
text-align: center;
}
}
</style>
</head>
<body>
<!--[if mso]>
<style type="text/css">
.button {
background-color: #0056b3 !important;
color: white !important;
}
</style>
<![endif]-->
<table class="email-container" width="100%" cellspacing="0" cellpadding="0" border="0" align="center">
<tr>
<td class="header">
<h1>工单提醒</h1>
</td>
</tr>
<tr>
<td class="content">
<p>你好,</p>
<p>你有新的工单待处理。请及时查看:</p>
<ul>
<li>工单编号:{{code}}</li>
<li>工单分类:{{category}}</li>
<li>问题描述:{{content}}</li>
{{reply}}
</ul>
<p>请点击下方按钮立即查看详情:</p>
<div style="text-align: center;">
<a href="https://x.hnxinyouhe.com" class="button" style="color: white; text-decoration: none;">立即查看</a>
</div>
<!--<p>如果您未请求此操作,请忽略此邮件或联系我们的客服团队。</p>-->
</td>
</tr>
<tr>
<td class="footer">
<p>© 2025 河南新友合科技有限公司. 保留所有权利。</p>
<p>这是系统自动发送的邮件,请勿直接回复。</p>
</td>
</tr>
</table>
</body>
</html>