Skip to content

实际案例-业务办理

1 插件功能设计

插件用途:支持用户提交开通手机卡的办理请求,客服接收后手动联系处理。

1.1 插件使用流程说明

1.1.1 用户流程(业务视角)

  1. 用户访问网站域名,进入西瓜分类信息首页: plugin.php?id=xigua_hb

  2. 点击“手机计划办理”入口,跳转至插件页面: plugin.php?id=xigua_simtelecom

  3. 页面展示所有可选套餐内容,用户选择套餐项。

  4. 用户填写办理表单:姓名、手机号(必填,需验证)、地址、电子邮箱。

  5. 用户勾选同意协议并提交。

  6. 系统接收后执行以下操作:

    • 验证信息合法性;
    • 自动生成唯一订单编号(如:SIM20240527-00001);
    • 将数据写入数据库表;
    • 发送邮件通知后台客服。
  7. 客服查看邮件后联系用户处理订单。

  8. 后台管理者可在 Discuz 后台查看并更新处理状态。

1.2 功能模块分解(技术视角)

1.2.1 前端模块

  • 套餐选择区域

    • 形式:单选框或图文列表(多选一,必选)
    • 显示:套餐名、价格、说明
  • 信息录入表单

    • 姓名(必填)
    • 手机号码(必填)
    • 地址(必填)
    • 邮箱(必填)
    • 协议确认(必选)
  • 提交逻辑

    • 校验表单项
    • 弹窗反馈提交成功/失败
    • 自动生成订单编号(规则:SIM + 日期 + 序号)

该表单需在用户点击“提交申请”按钮时进行严格的数据校验,确保信息完整、格式正确,并避免垃圾或无效数据写入数据库。校验需覆盖前端(用户体验)和后端(安全保障)两个层面。

校验字段列表与要求

字段名称 表单字段名 是否必填 验证规则 校验层级 错误提示
套餐选择 package 必须选择一个非空项 前端 + 后端 请选择套餐
姓名 username 非空 前端 + 后端 请输入姓名
手机号码 phone 仅限中国大陆号段(11位)或北美号段(10位) 前端 + 后端 请输入有效的中国或北美手机号
邮箱地址 email 标准 Email 格式 前端 + 后端 请输入有效邮箱地址
联系地址 address 非空,最大长度 100 个字符 前端 + 后端 地址不能为空且不超过100字符
协议勾选 N/A 用户必须勾选同意协议项 前端 请阅读并同意《办理协议》和《隐私协议》

说明补充:

  • 手机号验证规则:
    • 中国大陆手机号:^1[3-9]\d{9}$
    • 美国/加拿大手机号:^\d{10}$(默认不含区号)
  • 邮箱格式规则:
    • 使用正则:/[@\s]+@[@\s]+.[@\s]+$/
  • 地址字段限制:
    • TEXT 类型,但前端需限制输入长度不超过 100 字符,避免滥用
  • 协议勾选:
    • 不勾选则禁止提交,仅需前端控制

校验责任分层说明

校验内容 前端是否实现 后端是否必须实现 原因
必填项检查 避免空值插入数据库
正则格式检查 防止脚本绕过前端
协议勾选 可选 用户交互为主,服务器一般不校验
异常提示 ✅(alert()) ✅(showmessage()) 及时反馈用户错误

1.2.2 后端服务处理

  • 数据存储

    • 表结构保存字段:套餐名、用户信息、提交时间、订单编号、处理状态
  • 邮件通知

    • 提交成功后自动发送邮件给客服邮箱

1.3 后台管理功能(管理员视角)

  • 订单状态更新

    • 管理员可筛选所有订单,查看详细信息
    • 支持更新处理状态(未处理 / 已联系 / 已完成)
  • 管理界面建议

    • 可留出“处理人”字段用于分配任务
    • 可在插件后台菜单中添加管理页入口(admin.inc.php)

1.4 后续可扩展内容(预留)

  • 支持短信验证码(阿里云短信接口)
  • 支持小程序 API 接口提交
  • 支持用户端查询订单状态
  • 记录操作日志便于跟踪办理过程

1.5 订单编号规则说明

格式:SIMYYYYMMDD-00001
说明:
- SIM:业务类型前缀
- YYYYMMDD:年月日
- 00001:当天提交递增流水号

2 插件开发总流程(开发视角 + 初始化流程融合)

2.1 开启开发模式(环境准备)

  • 本地路径:D:\3 Work\58halifax\58haiwailife\MyDev\xigua_simtelecom
  • 打开 VSCode + Chrome DevTools,开启移动模拟器
  • 可同步 SSH 到服务器部署测试路径

2.2 创建插件目录结构(Discuz 规范)

xigua_simtelecom/
├── file/                         # ⬅️ 用户上传资料 / 客服二维码图片
│   └── CSWechatBQ.png            # 示例:客服微信二维码
├── inc/
│   └── xigua_simtelecom_order.inc.php     # 商户端订单处理
├── table/
│   └── table_xigua_simtelecom.php         # 数据表封装
├── template/
│   ├── front/
│   │   └── manage_order_list.htm          # PC端订单查看
│   ├── static/
│   │   ├── custom.css
│   │   └── iconfont.woff2
│   └── touch/
│       ├── user_order_form.htm            # ✅ 用户提交订单页
│       ├── manage_order_list.htm          # ✅ 商户订单列表
│       ├── dialog_noupdate.htm
│       ├── dialog_privacy.htm
│       ├── dialog_success_update.htm
│       ├── dialog_terms.htm
│       ├── common_header.php
│       └── common_footer.php
├── plugin.xml
├── install.php / uninstall.php
├── xigua_simtelecom.inc.php              # 插件默认入口
└── xigua_simtelecom.lang.php

上传至云服务器:

  • 打开 MobaXterm,使用 SSH 连接你的生产环境
  • 登录后,左侧“SFTP”窗口将自动显示远程文件系统
  • 浏览到远程路径
  • 拖拽到文件完成上传临时目录:/home/ecs-user/tmp/xigua_simtelecom
  • 在服务器上拷贝到目标目录: rsync -av --update /home/ecs-user/tmp/xigua_simtelecom/ /www/wwwroot/58haiwai_life/source/plugin/xigua_simtelecom/
  • 或使用命令行: scp -r ....

2.3 编写插件描述文件 plugin.xml

  • 设置 <identifier>xigua_simtelecom</identifier>
  • 指定 <directory>source/plugin/xigua_simtelecom/</directory>
  • 添加语言文件、后台菜单、扩展项(可选)
  • 注册安装/卸载脚本:
<?xml version="1.0" encoding="utf-8"?>
<plugin>
  <identifier>xigua_simtelecom</identifier>
  <name>电信业务办理</name>
  <version>1.0</version>
  <description>提供用户提交手机卡开通请求的插件,适配移动端</description>
  <copyright>西蒙2.0</copyright>
  <directory>source/plugin/xigua_simtelecom/</directory>
  <language>./xigua_simtelecom.lang.php</language>
  <script>xigua_simtelecom.inc.php</script>
  <installfile>install.php</installfile>
  <uninstallfile>uninstall.php</uninstallfile>
  <modules>
  </modules>
</plugin>

2.4 设计数据表结构(可选)

  • 表名建议:pre_xigua_simtelecom_log
  • 封装类命名:table_simtelecom.php
  • 类继承 discuz_table 并实现 insert() 方法
  • 配合 install.php 自动建表
install.php
<?php
if (!defined('IN_DISCUZ') || !defined('IN_ADMINCP')) {
    exit('Access Denied');
}

$sql = <<<EOF
CREATE TABLE IF NOT EXISTS `pre_xigua_simtelecom_log` (
  `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `orderid` VARCHAR(30) NOT NULL DEFAULT '',
  `username` VARCHAR(100) NOT NULL DEFAULT '',
  `phone` VARCHAR(20) NOT NULL DEFAULT '',
  `package` VARCHAR(100) NOT NULL DEFAULT '',
  `address` TEXT,
  `email` VARCHAR(100) DEFAULT '',
  `status` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '0=未处理, 1=已联系, 2=已完成',
  `operator` VARCHAR(50) DEFAULT '' COMMENT '客服处理人',
  `dateline` INT(10) UNSIGNED NOT NULL DEFAULT 0,
  PRIMARY KEY (`id`),
  UNIQUE KEY `orderid` (`orderid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

ALTER TABLE pre_xigua_simtelecom_log
  ADD COLUMN uid INT(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '用户ID',
  ADD COLUMN username_dz VARCHAR(50) NOT NULL DEFAULT '' COMMENT 'Discuz用户名',
  ADD COLUMN userip VARCHAR(45) NOT NULL DEFAULT '' COMMENT '用户IP地址';

EOF;

runquery($sql);
$finish = true;
uninstall.php
<?php
if (!defined('IN_DISCUZ') || !defined('IN_ADMINCP')) {
    exit('Access Denied');
}

$sql = <<<EOF
DROP TABLE IF EXISTS `pre_xigua_simtelecom_log`;
EOF;

runquery($sql);
$finish = true;

2.5 编写插件主逻辑入口 .inc.php

  • 判断是否 POST 提交
  • 表单校验 → 写入数据库 → 返回 showmessage
  • 否则加载模板
xigua_simtelecom.inc.php
<?php
// 防止非法访问(Discuz常规保护机制)
if (!defined('IN_DISCUZ')) {
    exit('Access Denied');
}


// 引入数据表封装类,便于操作自定义数据表(本插件为 table_xigua_simtelecom)
require_once DISCUZ_ROOT.'./source/plugin/xigua_simtelecom/table/table_xigua_simtelecom.php';

// 加载语言缓存(Discuz 平台预定义机制)
loadcache('pluginlanguage_template');

// 引入插件语言包(多语言支持)
// 使用 @ 忽略加载失败时的 PHP warning
@include_once DISCUZ_ROOT . './data/plugindata/xigua_simtelecom.lang.php';

// 将插件语言包注入 $_G['lang'] 全局变量,供模板/JS 使用
if (isset($lang) && is_array($lang)) {
    $_G['lang'] = array_merge($_G['lang'], $lang);
}


// 点击协议文字跳转至独立页面
if ($_GET['mod'] == 'protocol' && in_array($_GET['doc'], ['terms', 'privacy'])) {
    $tpl = "touch/protocol_" . $_GET['doc'];
    include template("xigua_simtelecom:$tpl");
    exit;
}


// 插入函数定义
/**
 * 从插件后台配置中读取套餐选项并返回键值数组
 * 支持配置格式:每行一个套餐名称,或用中文分号“;”分隔
 *
 * @return array 示例:['package1' => '基础套餐', 'package2' => '增强套餐', ...]
 */
function xigua_get_packages() {
    global $_G;

    $packages = array();
    $raw = $_G['cache']['plugin']['xigua_simtelecom']['package_options'] ?? '';

    // 分割:支持 \n、\r\n、中文分号;
    $option_lines = preg_split("/\r?\n|;/", $raw);
    $i = 1;
    foreach ($option_lines as $line) {
        $line = trim($line);
        if ($line !== '') {
            $packages['package' . $i] = $line;
            $i++;
        }
    }
    return $packages;
}


// 判断是否为 POST 请求,并校验表单哈希(防 CSRF 攻击)
if ($_SERVER['REQUEST_METHOD'] === 'POST' && submitcheck('ordersubmit')) {

    // 获取并过滤表单字段,防止 XSS 注入
    $username = dhtmlspecialchars(trim($_POST['username']));
    $phone    = dhtmlspecialchars(trim($_POST['phone']));
    $address  = dhtmlspecialchars(trim($_POST['address']));
    $email    = dhtmlspecialchars(trim($_POST['email']));

    // 读取套餐映射
    $packages = xigua_get_packages();
    // 获取套餐编号和映射中文名
    $package = dhtmlspecialchars(trim($_POST['package']));
    $package_display = $packages[$package] ?? $package;


    // 强制校验协议勾选字段(防用户跳过前端校验提交)
    if (empty($_POST['agree'])) {
        showmessage('请先阅读并同意协议');
    }

    // 校验:姓名为必填项
    if (!$username) {
        showmessage('请填写姓名');
    }

    // 校验:手机号为必填项
    if (!$phone) {
        showmessage('请填写手机号');
    }

    // 校验:手机号支持中国/北美(10或11位数字)
    if (!preg_match('/^(1[3-9]\d{9}|[2-9]\d{2}[2-9]\d{2}\d{4})$/', $phone)) {
        showmessage('请输入有效的中国或北美手机号(不需输入国家代码)');
    }

    // 校验:邮箱格式建议使用内置过滤器,更准确
    if (!$email || !filter_var($email, FILTER_VALIDATE_EMAIL)) {
        showmessage('请输入有效邮箱地址');
    }

    // 校验:地址不能为空且不超过100字符(注意中文字符需用 mb_strlen)
    if (!$address || mb_strlen($address, 'UTF-8') > 100) {
        showmessage('地址不能为空,且不超过100个字符');
    }


    // 生成唯一订单编号:SIM + 年月日时分秒 + 4位随机数
    $orderid = 'SIM' . date('YmdHis') . random(4, 1);

    // 构造插入数据库所需数据结构
    $data = array(
        'orderid'  => $orderid,
        'username' => $username,
        'phone'    => $phone,
        'package'  => $package_display,
        'address'  => $address,
        'email'    => $email,
        'dateline'    => TIMESTAMP, // 当前 UNIX 时间戳
        'uid'         => $_G['uid'] ?? 0, // 当前用户 ID(游客为0)
        'username_dz' => $_G['username'] ?? '', // 当前用户在 Discuz 系统中的用户名
        'userip'      => $_G['clientip'] ?? '', // 记录 IP,便于风控分析
    );

    // 使用封装类执行插入操作,符合插件开发规范
    $table = new table_xigua_simtelecom();
    $table->insert($data);





    // 发送通知邮件至客服
    include_once libfile('function/mail');

    // 获取套餐中文名(来自前面生成的 $packages 数组)
    $packages = xigua_get_packages();
    $package_display = $packages[$package] ?? $package;

    // 当前时间格式化
    $time_str = date('Y-m-d H:i:s');

    $message_body = <<<EOF
    有一位用户提交了SIM卡业务申请,信息如下:<br>
    姓名:{$username}<br>
    手机号:{$phone}<br>
    邮箱:{$email}<br>
    套餐:{$package_display}<br>
    地址:{$address}<br>
    提交时间:{$time_str}<br>
    用户IP:{$_G['clientip']}<br>
    UID/用户名:{$_G['uid']} / {$_G['username']}<br>
    EOF;

    sendmail('284641883@qq.com', '【新订单通知】SIM卡业务申请提交成功', $message_body);

    // 返回跳转
    // showmessage('提交成功,我们会尽快与您联系', 'plugin.php?id=xigua_simtelecom', array(), '', 3); // 3 表示页面跳转
    // exit;
    //showmessage('提交成功,我们会尽快与您联系', 'plugin.php?id=xigua_simtelecom', array(), array('refreshtime' => 5, 'alert' => 'right'));
    // 成功提示页
    $tpl = checkmobile() ? 'touch/success_dialog' : 'success_dialog';
    include template("xigua_simtelecom:$tpl");
    exit;

} else {
    // 从插件配置读取套餐选项
    $packages = xigua_get_packages();

    // 非提交请求:根据访问设备类型加载不同模板
    $tpl = checkmobile() ? 'touch/front_order_form' : 'front_order_form';
    include template("xigua_simtelecom:$tpl");
}
table_simtelecom.php
<?php

if (!defined('IN_DISCUZ')) {
    exit('Access Denied');
}

class table_xigua_simtelecom extends discuz_table {

    public function __construct() {
        // 设置数据表名称,Discuz 会自动加前缀 pre_
        $this->_table = 'xigua_simtelecom_log';
        $this->_pk = 'id';

        parent::__construct();
    }

    /**
     * 插入新数据
     * @param array $data 插入的数据数组
     * @return int 返回插入记录的主键ID
     */
    public function insert($data) {
        if (!is_array($data) || empty($data)) {
            return 0;
        }
        return DB::insert($this->_table, $data, true);
    }

    /**
     * 根据订单ID获取记录
     * @param string $orderid
     * @return array|null
     */
    public function fetch_by_orderid($orderid) {
        return DB::fetch_first("SELECT * FROM %t WHERE orderid=%s", array($this->_table, $orderid));
    }

    /**
     * 获取所有记录(用于后台展示)
     * @param int $start 起始
     * @param int $limit 数量
     * @return array
     */
    public function fetch_all($start = 0, $limit = 20) {
        return DB::fetch_all("SELECT * FROM %t ORDER BY dateline DESC LIMIT %d, %d", array($this->_table, $start, $limit));
    }
}

2.6 编写表单模板 .htm 文件

  • 模拟微信小程序/移动风格
  • 使用 {$lang['key']} 调用语言
  • 支持响应式布局
  • 校验用户输入
front_order_form.htm
<!DOCTYPE html>
<!-- 保留原有多系统 class,可用于响应式样式控制 -->
<html lang="zh-cmn-Hans" class="pixel-ratio-2 retina ios ios-16 ios-16-6 ios-gt-15 ios-gt-14 ios-gt-13 ios-gt-12 ios-gt-11 ios-gt-10 ios-gt-9 ios-gt-8 ios-gt-7 ios-gt-6">
<head>
  <meta charset="UTF-8">
  <!-- viewport-fit=cover 可配合安全区域适配 iOS 刘海屏 -->
  <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover">
  <title>58海外</title>
  <link rel="stylesheet" href="source/plugin/xigua_simtelecom/template/static/custom.css">

</head>
<body>

<!-- 页头模板 -->
<!--{template xigua_simtelecom:touch/common_header}-->

<!-- 表单区域 -->
<!-- 表单区域容器,避让顶部 header 与底部 footer -->
<div class="page__content" style="padding-top: 2.2rem; padding-bottom: 2.6rem;">
  <!-- 表单开始 -->
  <form method="post" autocomplete="off" action="plugin.php?id=xigua_simtelecom" class="weui-form">
    <!-- CSRF 防护字段 -->
    <input type="hidden" name="formhash" value="{FORMHASH}">

    <!-- 提交标识字段 -->
    <input type="hidden" name="ordersubmit" value="yes">

    <!-- 套餐选择(动态) -->
    <div class="weui-cell weui-cell_select">
      <div class="weui-cell__bd">
        <select class="weui-select" name="package" required>
          <option value="">{$lang['simtelecom_package']}</option>
          <!--{loop $packages $key $val}-->
            <option value="{$key}">{$val}</option>
          <!--{/loop}-->
        </select>
      </div>
    </div>


    <!-- 姓名输入框:添加 required + maxlength 限制 -->
    <div class="weui-cell">
      <div class="weui-cell__bd">
        <input class="weui-input"
               type="text"
               name="username"
               placeholder="{$lang['simtelecom_name']}"
               required
               maxlength="20" />
        <!-- 姓名限制最多 30 字符,避免溢出和非法内容 -->
      </div>
    </div>

    <!-- 手机号输入框:添加 required + maxlength(中国手机号11位) -->
    <div class="weui-cell">
      <div class="weui-cell__bd">
        <input class="weui-input"
               type="tel"
               name="phone"
               placeholder="{$lang['simtelecom_phone']}"
               required
               maxlength="15" />
        <!-- 最大长度留出扩展空间(国际用户) -->
      </div>
    </div>

    <!-- 邮箱输入框:添加 required + maxlength 限制 -->
    <div class="weui-cell">
      <div class="weui-cell__bd">
        <input class="weui-input"
               type="email"
               name="email"
               placeholder="{$lang['simtelecom_email']}"
               required
               maxlength="50" />
        <!-- 邮箱最大长度常规建议 50 字符以内 -->
      </div>
    </div>

    <!-- 地址输入框:添加 required + maxlength 限制(100 字) -->
    <div class="weui-cell">
      <div class="weui-cell__bd">
        <textarea class="weui-textarea"
                  rows="2"
                  name="address"
                  placeholder="{$lang['simtelecom_address']}"
                  required
                  maxlength="100"></textarea>
        <!-- 限制最大 100 字,防止后端字段溢出 -->
      </div>
    </div>

    <!-- 协议勾选区域(用户必须同意协议) -->
    <div style="padding: 1em;" class="">
      <div style="display: flex; align-items: center; gap: 0.5em; font-size: 0.8em; flex-wrap: nowrap;">
        <input type="checkbox" name="agree" value="1" required="" style="width: 1.1em !important; height: 1.1em !important;">
        <span class="weui-agree__text" style="line-height: 1.6; flex: 1; word-break: break-word;">
          我已阅读并同意
          <a href="plugin.php?id=xigua_simtelecom&amp;mod=protocol&amp;doc=terms" style="color: #337ab7; text-decoration: none;">《办理协议》</a>
          <a href="plugin.php?id=xigua_simtelecom&amp;mod=protocol&amp;doc=privacy" style="color: #337ab7; text-decoration: none;">《隐私协议》</a>
        </span>
      </div>
    </div>

    <!-- 提交按钮:保留 JS 触发,按钮 type 设为 button 避免误提交 -->
    <div class="weui-btn-area" style="margin: 0.1em auto 0.1em !important;">
      <button type="button"
              class="weui-btn weui-btn_primary"
              aria-label="提交申请">{$lang['simtelecom_submit']}</button>
    </div>

    <!-- 办理须知公告栏 -->
    <div style="
      margin: 0.2em auto 0.5em;
      padding: 0.5em 0.5em;
      max-width: 95%;
      font-size: 0.58rem;
      color: #555;
      background-color: #f8f8f8;
      border-radius: 2px;
      line-height: 1.8;
    ">
      <strong style="display:block; margin-bottom: 0.1em;">办理须知:</strong>
      1. 我们联合电信是专业的电信服务商,已有 20+ 年行业经验,与多家大型电信公司合作,提供高质量的服务,信誉卓著。<br>
      2. 电信套餐计划可能会不定期调整,您提交订单后,我们的客服人员将在工作时间 15 分钟内与您联系,确认套餐有效性并协助您选择最合适的方案。<br>
      3. 可根据需要提供上门办理服务。
    </div>

</div>

<!-- 错误提示容器:样式简单但兼容性强,支持移动端 -->
<div id="toast" style="
  display: none;
  background: #ff552e;
  color: white;
  padding: 10px;
  border-radius: 5px;
  position: fixed;
  top: 20%;
  left: 50%;
  transform: translateX(-50%);
  z-index: 9999;
  max-width: 80%;
  font-size: 14px;
  text-align: center;">
  <p id="toastMsg"></p>
</div>


<!-- 前端校验逻辑增强版:含重复提交锁 + 转义 + 可访问性支持 -->
<script>
  document.addEventListener('DOMContentLoaded', function () {
    const btn = document.querySelector('.weui-btn_primary');
    const form = document.querySelector('.weui-form');
    const toast = document.getElementById('toast');
    const toastMsg = document.getElementById('toastMsg');
    // 提示框安全转义输出
    function escapeHtml(str) {
      return str.replace(/[&<>'\"]/g, c => ({
        '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', '\'': '&#39;'
      }[c]));
    }

    function showToast(msg) {
      toastMsg.innerHTML = escapeHtml(msg);
      toast.style.display = 'block';
      setTimeout(() => { toast.style.display = 'none'; }, 2000);
    }

    // 表单按钮点击绑定校验逻辑
    btn.addEventListener('click', function () {
    // 防止重复提交(4秒内锁定按钮)
    if (btn.disabled) return;
    btn.disabled = true;
    setTimeout(() => { btn.disabled = false; }, 4000);

    const pkg = form.package.value.trim();
    const name = form.username.value.trim();
    const phone = form.phone.value.trim();
    const email = form.email.value.trim();
    const address = form.address.value.trim();
    const agree = form.querySelector('input[name="agree"]').checked;

    const phoneReg = /^(1[3-9]\d{9}|[2-9]\d{2}[2-9]\d{2}\d{4})$/;
    const emailReg = /^[^@\s]+@[^@\s]+\.[^@\s]+$/;

    if (!pkg) { showToast('请选择套餐计划'); return; }
    if (!name) { showToast('请输入您的姓名'); return; }
    if (!phone || !phoneReg.test(phone)) { showToast('请输入有效的中国或北美手机号(不需输入国家代码)'); return; }
    if (!email || !emailReg.test(email)) { showToast('请输入正确邮箱'); return; }
    if (!address || address.length > 100) { showToast('请填写地址(不超过100字)'); return; }
    if (!agree) { showToast('请勾选协议'); return; }

    // 只在校验通过后提交表单
    form.submit(); 

  });
});
</script>



<!-- 页脚模板 -->
<!--{template xigua_simtelecom:touch/common_footer}-->



</body>

</html>
common_header.php
<!-- 页面顶部头部栏 -->
<header class="x_header bgcolor_11 cl f15">

  <!-- 左侧返回按钮,使用浏览器后退功能 -->
  <a class="z f14" href="javascript:window.history.go(-1);">
    <!-- 返回图标(通过 iconfont 字体图标显示) -->
    <i class="iconfont icon-fanhuijiantou w15"></i>返回
  </a>
  <!-- 中间标题文本,显示当前页面名称 -->
  <div class="navtitle">电信业务办理</div>

</header>
common_footer.php
<!-- 简化移动端底部模板 -->
<!-- 底部导航栏,使用 WeUI 组件样式 -->
<div class="weui-tabbar">

  <!-- 首页 Tab 按钮,当前处于选中状态 -->
  <a href="plugin.php?id=xigua_hb" class="weui-tabbar__item weui-bar__item_on">
    <i class="iconfont icon-home_fill_light weui-tabbar__icon"></i>
    <p class="weui-tabbar__label">首页</p>
  </a>

  <!-- 发布 Tab 按钮,带有发布按钮的特殊圆形背景 -->
  <a href="plugin.php?id=xigua_hb&amp;ac=pub&amp;needlogin=1" class="weui-tabbar__item weui-bar__item_on showpubfont">
    <div class="pub_circle"></div>
    <i class="iconfont icon-fabu1 weui-tabbar__icon"></i>
    <p class="weui-tabbar__label pub_circle_p" style="color:#555!important">发布</p>
  </a>

  <!-- 我的 Tab 按钮 -->
  <a href="plugin.php?id=xigua_hb&ac=my&needlogin=1" class="weui-tabbar__item">
    <i class="iconfont icon-wode weui-tabbar__icon"></i>
    <p class="weui-tabbar__label">我的</p>
  </a>

</div>

2.7 引用样式文件 .css

  • 复用西瓜插件中主色调/字体样式 (custom.css,iconfont.css,iconfont.woff2,iconfont.ttf等)

2.8 编写语言文件 .lang.php

  • 命名为 xigua_simtelecom.lang.php
xigua_simtelecom.lang.php
<?php

$lang = array(
  'simtelecom_package' => '请选择套餐计划',
  'simtelecom_name' => '您的姓名',
  'simtelecom_phone' => '您的手机号码(中国或美加手机号码,不需要输入国家代码)',
  'simtelecom_email' => '您的电子邮箱',
  'simtelecom_address' => '您的住址',
  'simtelecom_submit' => '提交订单',
);

2.9 编写 install/uninstall.php(自动建表)

install.php
<?php
if (!defined('IN_DISCUZ') || !defined('IN_ADMINCP')) {
    exit('Access Denied');
}

$sql = <<<EOF
CREATE TABLE IF NOT EXISTS `pre_xigua_simtelecom_log` (
  `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `orderid` VARCHAR(30) NOT NULL DEFAULT '',
  `username` VARCHAR(100) NOT NULL DEFAULT '',
  `phone` VARCHAR(20) NOT NULL DEFAULT '',
  `package` VARCHAR(100) NOT NULL DEFAULT '',
  `address` TEXT,
  `email` VARCHAR(100) DEFAULT '',
  `status` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '0=未处理, 1=已联系, 2=已完成',
  `operator` VARCHAR(50) DEFAULT '' COMMENT '客服处理人',
  `dateline` INT(10) UNSIGNED NOT NULL DEFAULT 0,
  PRIMARY KEY (`id`),
  UNIQUE KEY `orderid` (`orderid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
EOF;

runquery($sql);
$finish = true;
uninstall.php
<?php
if (!defined('IN_DISCUZ') || !defined('IN_ADMINCP')) {
    exit('Access Denied');
}

$sql = <<<EOF
DROP TABLE IF EXISTS `pre_xigua_simtelecom_log`;
EOF;

runquery($sql);
$finish = true;

2.10 本地测试与部署

  • 在 Discuz 后台 → 插件 → 安装 xigua_simtelecom
  • 访问地址测试:plugin.php?id=xigua_simtelecom
  • 用 Chrome 模拟器(F12) → 手机尺寸调试样式
  • 验证:
  • 表单是否提交成功
  • 数据是否写入(可用 SQL 工具查看)
  • 页面是否兼容移动端显示

3 可扩展功能

  • 插件配置项:plugin.xml → <vars> 添加配置(如启用开关)
    • 在插件后台「变量」页配置套餐内容(如:basic=基础套餐, plus=增强套餐)
    • 前端