修改插件代码格式
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
yiqiu
2025-11-21 13:01:04 +08:00
parent 5834ab9a74
commit b05595e090
3 changed files with 409 additions and 48 deletions

369
dev.md Normal file
View File

@@ -0,0 +1,369 @@
一、目录和文件
1、目录使用小写+下划线如admin/ 、 product_divert/
2、类库、函数文件统一以.php为后缀如app.php 、common.php
3、类的文件名均以命名空间定义并且命名空间的路径和类库文件所在路径一致如ProductModel.php对应ProductModel类命名空间app\common\model对应路径app/common/model/
4、类包含接口和Trait文件采用驼峰法命名首字母大写类名包括接口和Trait和文件名保持一致统一采用驼峰法命名首字母大写其它文件采用小写+下划线命名如类文件app/common/logic/ConfigOptionsLogic.php对应ConfigOpitonsLogic类公共函数文件app/common.php
5、目录结构
finance 财务系统
├─app 应用目录
│ ├─admin 后台
│ │ ├─controller 控制器目录
│ │ ├─model 模型目录(业务逻辑写这里或逻辑类里)
│ │ ├─validate 验证器目录
│ ├─home 前台
│ │ ├─controller 控制器目录
│ │ ├─model 模型目录
│ │ ├─validate 验证器目录
│ ├─common 公共目录
│ │ ├─logic 逻辑类目录
│ │ ├─model 模型目录(前后台通用模型方法写这里面的model类)
│ ├─command 命令行目录
│ │ ├─Cron.php 系统默认定时任务文件
│ ├─excption 错误处理目录
│ ├─http 网关目录
│ │ ├─middleware 中间件目录
│ ├─common.php 公共函数文件(写函数注释,比较通用的方式先写好如curl)
│ ├─middleware.php 中间件定义文件
├─cron 定时任务
│ ├─cron.php 定时任务
├─config 全局配置目录
│ ├─app.php 应用配置
│ ├─cache.php 缓存配置
│ ├─console.php 控制台配置
│ ├─cookie.php Cookie配置
│ ├─database.php 数据库配置
│ ├─filesystem.php 文件磁盘配置
│ ├─lang.php 多语言配置
│ ├─log.php 日志配置
│ ├─middleware.php 中间件配置
│ ├─route.php URL和路由配置
│ ├─session.php Session配置
│ ├─trace.php Trace配置
├─route 路由目录
│ ├─admin.php 后台路由
│ ├─home.php 前台路由
├─public WEB目录对外访问目录
│ ├─index.php 入口文件
│ ├─admin 后台模板目录
│ ├─home 前台模板目录
│ ├─plugins 插件目录
│ ├─.htaccess 用于apache的重写
├─runtime 应用的运行时目录(可写,可定制)
├─vendor Composer类库目录
6、使用模型方式进行增删改查写在app/common/model/下前后台通用例子创建订单建立文件app/common/model/OrderModel.phpcreate()创建订单;
7、逻辑类写在app/common/logic/下例子ProvisionLogic.php服务模块逻辑类等
二、函数和类、属性命名
1、类的命名采用驼峰法首字母大写例如 User、UserType
2、函数的命名使用小写字母和下划线小写字母开头的方式例如 get_client_ip公共函数文件app/common.php统一使用此方式命名
3、方法的命名使用驼峰法首字母小写例如 getUserName
4、属性的命名使用驼峰法首字母小写例如 tableName、instance
5、特例以双下划线__打头的函数或方法作为魔术方法例如 __call 和 __autoload
6、变量的命名使用驼峰法首字母小写例如 $tableName。实例化类的变量和类名同名大驼峰变量例如$User。逻辑类中的变量加后缀例如$SmsLogic。
三、常量和配置
1、常量以大写字母和下划线命名例如 APP_PATH
2、配置参数以小写字母和下划线命名例如 url_route_on 和url_convert
3、环境变量定义使用大写字母和下划线命名例如APP_DEBUG
四、数据库表说明
1、数据库表采用 innodb引擎
2、utf8mb4字符集
3、带自增主键
4、有默认值(text这类类型除外)
5、字符串类型的一定要有默认值不要用NULL
6、创建表一定要有字段说明;
7、日期存时间戳所以日期类型用int(11)
8、价格相关数据用 decimal(10,2)有的可能需要更高的精度decimal(10,5)
9、适当添加索引参考数据库表索引建立
10、数据库里不使用存储过程、视图、函数、触发器、事件否则维护麻烦
11、数据表和字段采用小写加下划线方式命名并注意字段名不要以下划线开头例如 idcsmart_accounts表和 amount_out字段不建议使用驼峰和中文作为数据表及字段命名。
12、数据库表不使用外键
13、数据库用5.7,开启严格模式。
14、表与表关联的ID要带表名。例如product_id。
15、表或字段读取不需要写as例如client c。
16、搜索参数名$keywords。分页$page 条数:$limit 排序:$orderby 升序降序:$sort desc asc ;
17、
五、智简魔方代码规范
1、控制器方法中尽量只写传参验证、json返回业务逻辑写在model里或者逻辑类里
2、控制器里只有接口方法不要写多余的方法在控制器文件中其他方法、逻辑写model里或者逻辑类里、或者公共函数里
3、除接口返回json格式外其他函数方法一律返回单个值或者数组
4、更改框架核心代码、基类控制器时一定要商量并写好更改的文档做好记录
5、函数超过两个参数采用数组方式传入讨论这个涉及到后面可能会不断的增加传入参数
6、公共函数里 尽量不使用数据库操作用use 引用模型类;
7、不要实例化控制器
8、变量赋值运算前后添加空格。例如$td .= '</td>';
9、类函数名后面的花括号紧跟后面换行写。例如class CartController extends CommonController
{
10、注释格式
①api接口和类里面方法的注释格式
/**
* @title title
* @desc desc
* @author author
* @version version
* @url url
* @method method
* @namespace namespace
* @param type name default desc validate
* @return type name default desc
*/
如果当前default没有的话可以用 - 占位validate没有的话可以不写
return的参数如果仅返回单个数据并无变量名称是type之后的参数可以不填
方法的param如果有顺序的话需要按顺序写
param和return后面的参数以空格隔开参数的内容之中不能存在空格
例如
/**
* @title 节点分组列表
* @desc 节点分组列表
* @author hh
* @version v1
* @url node_groups
* @method GET
* @param int $page 1 页数
* @param int $per_page 20 每页条数
* @param string $orderby id 排序(id,name)
* @param string $sort desc 排序方向
* @param string $search - 搜索
* @param string $list_type page 获取类型(all,page),all会忽略页数直接返回所有
* @return int $data[].id - 节点分组ID
* @return string $data[].name - 节点分组名称
* @return string $data[].description - 节点分组名称
* @return string $data[].create_time - 创建时间
* @return int $data[].node[].id - 使用节点ID
* @return string $data[].node[].name - 使用节点名称
* @return int $meta.total - 总条数
* @return int $meta.total_page - 总页数
* @return int $meta.page - 当前页
* @return int $meta.per_page - 每页条数
*/
②公共方法的注释格式
/**
* @title title
* @desc desc
* @author author
* @version version
* @param type name default desc validate
* @return type name default desc
*/
如果当前default没有的话可以用 - 占位validate没有的话可以不写
return的参数如果仅返回单个数据并无变量名称是type之后的参数可以不填
方法的param如果有顺序的话需要按顺序写
param和return后面的参数以空格隔开参数的内容之中不能存在空格
/**
* @title 获取客户端IP地址
* @desc 获取客户端IP地址
* @author hh
* @version v1
* @param integer $type 返回类型0返回IP地址1返回IPV4地址数字
* @param boolean $adv 是否进行高级模式获取(有可能被伪装)
* @return string
*/
六、其他
1、前端传值用json后端统一返回json格式数据
2、返回数组一律转化为对象
3、所有函数都需要写清楚文档
4、状态码200返回正确 400返回错误 302重定向 500系统错误401登录失效,404无权限
5、数据返回格式
{
“status”:200/400/302/500,
"msg":"success message",
"data":{
}
}
6、控制器的函数中不要写参数
8、php使用7.4
9、注意不要使用php 语言结构或函数 来作为方法、变量;
10、公共语言 写在后台的语言文件; 键值 小写+下划线;
11、语言文件写法success_message => ‘请求成功’
字段统一
备注字段统一用 notes varchar(1000)
支付字段统一用 gateway
产品id统一用 product_id
用户id统一用 client_id
计费周期字段统一用 billing_cycle

View File

@@ -2,32 +2,28 @@
namespace addon\theme_configurator\controller;
use addon\theme_configurator\model\ThemeConfigModel;
use app\admin\controller\PluginAdminBaseController;
use think\App;
use app\event\controller\PluginAdminBaseController;
use think\Response;
/**
* 后台主题配置控制器
*
* 注意:结构尽量与官方示例插件保持一致,避免因基类或构造方式不一致导致 500。
*/
class ThemeController extends PluginAdminBaseController
{
protected ThemeConfigModel $model;
public function __construct(App $app = null)
{
parent::__construct($app);
$this->model = new ThemeConfigModel();
}
/**
* 获取配置
*/
public function config(): Response
{
$model = new ThemeConfigModel();
$config = $model->getConfig();
return json([
'status' => 200,
'msg' => lang_plugins('theme_configurator_success'),
'data' => $this->model->getConfig(),
'data' => $config,
]);
}
@@ -37,6 +33,8 @@ class ThemeController extends PluginAdminBaseController
public function save(): Response
{
$param = $this->request->param();
// 与前端 payload 结构保持一致,只取需要的字段入库
$payload = [
'seo' => $param['seo'] ?? [],
'header_nav' => $param['header_nav'] ?? [],
@@ -45,13 +43,13 @@ class ThemeController extends PluginAdminBaseController
'friendly_link' => $param['friendly_link'] ?? [],
'banner' => $param['banner'] ?? [],
'side' => $param['side'] ?? [],
// 额外配置:荣誉、合作伙伴、反馈类型
'feedback_type' => $param['feedback_type'] ?? [],
'honor' => $param['honor'] ?? [],
'partner' => $param['partner'] ?? [],
];
$config = $this->model->saveConfig($payload);
$model = new ThemeConfigModel();
$config = $model->saveConfig($payload);
return json([
'status' => 200,

View File

@@ -2,55 +2,49 @@
namespace addon\theme_configurator\controller\clientarea;
use addon\theme_configurator\model\ThemeConfigModel;
use app\home\controller\PluginBaseController;
use think\App;
use app\event\controller\PluginBaseController;
use think\Response;
/**
* 前台主题配置读取控制器
*
* 返回给 BlackFruit-UI 的 /console/v1/common 同结构数据
*/
class ThemeController extends PluginBaseController
{
protected ThemeConfigModel $model;
public function __construct(App $app = null)
{
parent::__construct($app);
$this->model = new ThemeConfigModel();
}
/**
* 返回给 BlackFruit-UI 的 /console/v1/common 同结构数据
* 读取配置并按 /console/v1/common 扁平结构返回
*/
public function config(): Response
{
$config = $this->model->getConfig();
$model = new ThemeConfigModel();
$config = $model->getConfig();
$data = [
'enterprise_name' => $config['site_config']['enterprise_name'] ?? '',
'enterprise_telephone' => $config['site_config']['enterprise_telephone'] ?? '',
'enterprise_mailbox' => $config['site_config']['enterprise_mailbox'] ?? '',
'enterprise_qrcode' => $config['site_config']['enterprise_qrcode'] ?? '',
'official_website_logo' => $config['site_config']['official_website_logo'] ?? '',
'icp_info' => $config['site_config']['icp_info'] ?? '',
'icp_info_link' => $config['site_config']['icp_info_link'] ?? '',
'public_security_network_preparation' => $config['site_config']['public_security_network_preparation'] ?? '',
'public_security_network_preparation_link' => $config['site_config']['public_security_network_preparation_link'] ?? '',
'telecom_appreciation' => $config['site_config']['telecom_appreciation'] ?? '',
'copyright_info' => $config['site_config']['copyright_info'] ?? '',
'terms_service_url' => $config['site_config']['terms_service_url'] ?? '',
'terms_privacy_url' => $config['site_config']['terms_privacy_url'] ?? '',
'cloud_product_link' => $config['site_config']['cloud_product_link'] ?? '',
'dcim_product_link' => $config['site_config']['dcim_product_link'] ?? '',
'enterprise_name' => $config['site_config']['enterprise_name'] ?? '',
'enterprise_telephone' => $config['site_config']['enterprise_telephone'] ?? '',
'enterprise_mailbox' => $config['site_config']['enterprise_mailbox'] ?? '',
'enterprise_qrcode' => $config['site_config']['enterprise_qrcode'] ?? '',
'official_website_logo' => $config['site_config']['official_website_logo'] ?? '',
'icp_info' => $config['site_config']['icp_info'] ?? '',
'icp_info_link' => $config['site_config']['icp_info_link'] ?? '',
'public_security_network_preparation' => $config['site_config']['public_security_network_preparation'] ?? '',
'public_security_network_preparation_link' => $config['site_config']['public_security_network_preparation_link'] ?? '',
'telecom_appreciation' => $config['site_config']['telecom_appreciation'] ?? '',
'copyright_info' => $config['site_config']['copyright_info'] ?? '',
'terms_service_url' => $config['site_config']['terms_service_url'] ?? '',
'terms_privacy_url' => $config['site_config']['terms_privacy_url'] ?? '',
'cloud_product_link' => $config['site_config']['cloud_product_link'] ?? '',
'dcim_product_link' => $config['site_config']['dcim_product_link'] ?? '',
// 以下字段需与 /console/v1/common 保持一致的扁平结构
'honor' => $config['honor'] ?? ($config['site_config']['honor'] ?? []),
'partner' => $config['partner'] ?? ($config['site_config']['partner'] ?? []),
'friendly_link' => $config['friendly_link'] ?? [],
'banner' => $config['banner'] ?? [],
'header_nav' => $config['header_nav'] ?? [],
'footer_nav' => $config['footer_nav'] ?? [],
'side_floating_window' => $config['side'] ?? [],
'feedback_type' => $config['feedback_type'] ?? ($config['site_config']['feedback_type'] ?? []),
'honor' => $config['honor'] ?? ($config['site_config']['honor'] ?? []),
'partner' => $config['partner'] ?? ($config['site_config']['partner'] ?? []),
'friendly_link' => $config['friendly_link'] ?? [],
'banner' => $config['banner'] ?? [],
'header_nav' => $config['header_nav'] ?? [],
'footer_nav' => $config['footer_nav'] ?? [],
'side_floating_window' => $config['side'] ?? [],
'feedback_type' => $config['feedback_type'] ?? ($config['site_config']['feedback_type'] ?? []),
];
return json([