You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
476 lines
18 KiB
476 lines
18 KiB
9 months ago
|
<?php
|
||
|
|
||
|
// +----------------------------------------------------------------------
|
||
|
// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
|
||
|
// +----------------------------------------------------------------------
|
||
|
// | Copyright (c) 2016~2022 https://www.crmeb.com All rights reserved.
|
||
|
// +----------------------------------------------------------------------
|
||
|
// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
|
||
|
// +----------------------------------------------------------------------
|
||
|
// | Author: CRMEB Team <admin@crmeb.com>
|
||
|
// +----------------------------------------------------------------------
|
||
|
|
||
|
|
||
|
namespace app\common\repositories\system\config;
|
||
|
|
||
|
|
||
|
use app\common\dao\system\config\SystemConfigDao;
|
||
|
use app\common\model\system\config\SystemConfigClassify;
|
||
|
use app\common\repositories\BaseRepository;
|
||
|
use app\common\repositories\system\CacheRepository;
|
||
|
use FormBuilder\Exception\FormBuilderException;
|
||
|
use FormBuilder\Factory\Elm;
|
||
|
use FormBuilder\Form;
|
||
|
use think\db\exception\DataNotFoundException;
|
||
|
use think\db\exception\DbException;
|
||
|
use think\db\exception\ModelNotFoundException;
|
||
|
use think\facade\Db;
|
||
|
use think\facade\Route;
|
||
|
|
||
|
/**
|
||
|
* Class ConfigRepository
|
||
|
* @package crmeb\repositories\system\config
|
||
|
* @mixin SystemConfigDao
|
||
|
*/
|
||
|
class ConfigRepository extends BaseRepository
|
||
|
{
|
||
|
const TYPES = ['input' => '文本框', 'number' => '数字框', 'textarea' => '多行文本框', 'radio' => '单选框', 'switches' => '开关', 'checkbox' => '多选框', 'select' => '下拉框', 'file' => '文件上传', 'image' => '图片上传', 'images' => '多图片上传', 'color' => '颜色选择框'];
|
||
|
|
||
|
/**
|
||
|
* ConfigRepository constructor.
|
||
|
* @param SystemConfigDao $dao
|
||
|
*/
|
||
|
public function __construct(SystemConfigDao $dao)
|
||
|
{
|
||
|
$this->dao = $dao;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param int $merId
|
||
|
* @param SystemConfigClassify $configClassify
|
||
|
* @param array $configs
|
||
|
* @param array $formData
|
||
|
* @return Form
|
||
|
* @throws FormBuilderException
|
||
|
* @author xaboy
|
||
|
* @day 2020-04-23
|
||
|
*/
|
||
|
public function formRule(int $merId, SystemConfigClassify $configClassify, array $configs, array $formData = [])
|
||
|
{
|
||
|
$components = $this->getRule($configs, $merId);
|
||
|
|
||
|
$form = Elm::createForm(Route::buildUrl($merId ? 'merchantConfigSave' : 'configSave', ['key' => $configClassify->classify_key])->build(), $components);
|
||
|
return $form->setTitle($configClassify->classify_name)->formData(array_filter($formData, function ($item) {
|
||
|
return $item !== '' && !is_null($item);
|
||
|
}));
|
||
|
}
|
||
|
|
||
|
public function getRule(array $configs, $merId)
|
||
|
{
|
||
|
$components = [];
|
||
|
foreach ($configs as $config) {
|
||
|
$component = $this->getComponent($config, $merId);
|
||
|
$components[] = $component;
|
||
|
}
|
||
|
return $components;
|
||
|
}
|
||
|
|
||
|
public function getComponent($config, $merId)
|
||
|
{
|
||
|
switch ($config['config_type']) {
|
||
|
case 'image':
|
||
|
$component = Elm::frameImage($config['config_key'], $config['config_name'], '/' . config('admin.' . ($merId ? 'merchant' : 'admin') . '_prefix') . '/setting/uploadPicture?field=' . $config['config_key'] . '&type=1')->modal(['modal' => false])->width('896px')->height('480px')->props(['footer' => false]);
|
||
|
break;
|
||
|
case 'images':
|
||
|
$component = Elm::frameImage($config['config_key'], $config['config_name'], '/' . config('admin.' . ($merId ? 'merchant' : 'admin') . '_prefix') . '/setting/uploadPicture?field=' . $config['config_key'] . '&type=2')->maxLength(5)->modal(['modal' => false])->width('896px')->height('480px')->props(['footer' => false]);
|
||
|
break;
|
||
|
case 'file':
|
||
|
$component = Elm::uploadFile($config['config_key'], $config['config_name'], rtrim(systemConfig('site_url'), '/') . Route::buildUrl('configUpload', ['field' => 'file'])->build())->headers(['X-Token' => request()->token()]);
|
||
|
break;
|
||
|
case 'select':
|
||
|
//notbreak
|
||
|
case 'checkbox':
|
||
|
//notbreak
|
||
|
case 'radio':
|
||
|
$options = array_map(function ($val) {
|
||
|
[$value, $label] = explode(':', $val, 2);
|
||
|
return compact('value', 'label');
|
||
|
}, explode("\n", $config['config_rule']));
|
||
|
$component = Elm::{$config['config_type']}($config['config_key'], $config['config_name'])->options($options);
|
||
|
break;
|
||
|
case 'switches':
|
||
|
$component = Elm::{$config['config_type']}($config['config_key'], $config['config_name'])->activeText('开')->inactiveText('关');
|
||
|
break;
|
||
|
default:
|
||
|
$component = Elm::{$config['config_type']}($config['config_key'], $config['config_name']);
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
if ($config['required']) $component->required();
|
||
|
|
||
|
if ($config['config_props'] ?? '') {
|
||
|
$props = @parse_ini_string($config['config_props'], false, INI_SCANNER_TYPED);
|
||
|
if (is_array($props)) {
|
||
|
$guidance_uri = $props['guidance_uri'] ?? '';
|
||
|
$guidance_image = $props['guidance_image'] ?? '';
|
||
|
if ($guidance_image) {
|
||
|
$config['guidance'] = [
|
||
|
'uri' => $guidance_uri,
|
||
|
'image' => $guidance_image,
|
||
|
];
|
||
|
}
|
||
|
unset($props['guidance_image'], $props['guidance_uri']);
|
||
|
$component->props($props);
|
||
|
if (isset($props['required']) && $props['required']) {
|
||
|
$component->required();
|
||
|
}
|
||
|
if (isset($props['defaultValue'])) {
|
||
|
$component->value($props['defaultValue']);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
if ($config['info']) {
|
||
|
$component->appendRule('suffix', [
|
||
|
'type' => 'guidancePop',
|
||
|
'props' => [
|
||
|
'info' => $config['info'],
|
||
|
'url' => $config['guidance']['uri'] ?? '',
|
||
|
'image' => $config['guidance']['image'] ?? '',
|
||
|
]
|
||
|
]);
|
||
|
}
|
||
|
return $component;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param int $id
|
||
|
* @param int $status
|
||
|
* @return int
|
||
|
* @throws DbException
|
||
|
* @author xaboy
|
||
|
* @day 2020-03-31
|
||
|
*/
|
||
|
public function switchStatus(int $id, int $status)
|
||
|
{
|
||
|
return $this->dao->update($id, compact('status'));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param SystemConfigClassify $configClassify
|
||
|
* @param int $merId
|
||
|
* @return Form
|
||
|
* @throws DataNotFoundException
|
||
|
* @throws DbException
|
||
|
* @throws FormBuilderException
|
||
|
* @throws ModelNotFoundException
|
||
|
* @author xaboy
|
||
|
* @day 2020-04-22
|
||
|
*/
|
||
|
public function cidByFormRule(SystemConfigClassify $configClassify, int $merId)
|
||
|
{
|
||
|
$config = $this->dao->cidByConfig($configClassify->config_classify_id, $merId == 0 ? 0 : 1);
|
||
|
$keys = $config->column('config_key');
|
||
|
return $this->formRule($merId, $configClassify, $config->toArray(), app()->make(ConfigValueRepository::class)->more($keys, $merId));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param int|null $id
|
||
|
* @param array $formData
|
||
|
* @return Form
|
||
|
* @throws FormBuilderException
|
||
|
* @author xaboy
|
||
|
* @day 2020-03-31
|
||
|
*/
|
||
|
public function form(?int $id = null, array $formData = []): Form
|
||
|
{
|
||
|
$form = Elm::createForm(is_null($id) ? Route::buildUrl('configSettingCreate')->build() : Route::buildUrl('configSettingUpdate', ['id' => $id])->build());
|
||
|
$form->setRule([
|
||
|
Elm::cascader('config_classify_id', '上级分类')->options(function () {
|
||
|
$configClassifyRepository = app()->make(ConfigClassifyRepository::class);
|
||
|
return array_merge([['value' => 0, 'label' => '请选择']], $configClassifyRepository->options());
|
||
|
})->props(['props' => ['checkStrictly' => true, 'emitPath' => false]]),
|
||
|
Elm::select('user_type', '后台类型', 0)->options([
|
||
|
['label' => '总后台配置', 'value' => 0],
|
||
|
['label' => '商户后台配置', 'value' => 1],
|
||
|
])->requiredNum(),
|
||
|
Elm::input('config_name', '配置名称')->required(),
|
||
|
Elm::input('config_key', '配置key')->required(),
|
||
|
Elm::textarea('info', '说明'),
|
||
|
Elm::select('config_type', '配置类型')->options(function () {
|
||
|
$options = [];
|
||
|
foreach (self::TYPES as $value => $label) {
|
||
|
$options[] = compact('value', 'label');
|
||
|
}
|
||
|
return $options;
|
||
|
})->required(),
|
||
|
Elm::textarea('config_rule', '选择项'),
|
||
|
Elm::textarea('config_props', '配置'),
|
||
|
Elm::number('sort', '排序', 0)->precision(0)->max(99999),
|
||
|
Elm::switches('required', '必填', 0)->activeValue(1)->inactiveValue(0)->inactiveText('关')->activeText('开'),
|
||
|
Elm::switches('status', '是否显示', 1)->activeValue(1)->inactiveValue(0)->inactiveText('关')->activeText('开'),
|
||
|
]);
|
||
|
|
||
|
return $form->setTitle(is_null($id) ? '添加配置' : '编辑配置')->formData($formData);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param int $id
|
||
|
* @return Form
|
||
|
* @throws DataNotFoundException
|
||
|
* @throws DbException
|
||
|
* @throws FormBuilderException
|
||
|
* @throws ModelNotFoundException
|
||
|
* @author xaboy
|
||
|
* @day 2020-03-31
|
||
|
*/
|
||
|
public function updateForm(int $id)
|
||
|
{
|
||
|
return $this->form($id, $this->dao->get($id)->toArray());
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param array $where
|
||
|
* @param int $page
|
||
|
* @param int $limit
|
||
|
* @return array
|
||
|
* @throws DataNotFoundException
|
||
|
* @throws DbException
|
||
|
* @throws ModelNotFoundException
|
||
|
* @author xaboy
|
||
|
* @day 2020-03-31
|
||
|
*/
|
||
|
public function lst(array $where, int $page, int $limit)
|
||
|
{
|
||
|
$query = $this->dao->search($where);
|
||
|
$count = $query->count();
|
||
|
$list = $query->page($page, $limit)->withAttr('typeName', function ($value, $data) {
|
||
|
return self::TYPES[$data['config_type']];
|
||
|
})->hidden(['config_classify_id'])->append(['typeName'])->select();
|
||
|
return compact('count', 'list');
|
||
|
}
|
||
|
|
||
|
public function tabForm($group, $merId)
|
||
|
{
|
||
|
$make = app()->make(ConfigClassifyRepository::class);
|
||
|
$list = $make->children($group->config_classify_id, 'config_classify_id,classify_key,classify_name,info');
|
||
|
$children = [];
|
||
|
foreach ($list as $item) {
|
||
|
$_children = $this->cidByFormRule($make->keyByData($item['classify_key']), $merId)->formRule();
|
||
|
if ($item['info']) {
|
||
|
array_unshift($_children, [
|
||
|
'type' => 'el-alert',
|
||
|
'props' => [
|
||
|
'type' => 'warning',
|
||
|
'closable' => false,
|
||
|
'title' => $item['info']
|
||
|
]
|
||
|
], ['type' => 'div', 'style' => ['height' => '20px', 'width' => '100%']]);
|
||
|
}
|
||
|
$children[] = [
|
||
|
'type' => 'el-tab-pane',
|
||
|
'props' => [
|
||
|
'label' => $item['classify_name'],
|
||
|
'name' => $item['classify_key']
|
||
|
],
|
||
|
'children' => $_children
|
||
|
];
|
||
|
}
|
||
|
if ($group['classify_key'] === 'distribution_tabs') {
|
||
|
$action = Route::buildUrl('configOthersSettingUpdate')->build();
|
||
|
} else {
|
||
|
$action = Route::buildUrl($merId ? 'merchantConfigSave' : 'configSave', ['key' => $group['classify_key']])->build();
|
||
|
}
|
||
|
return Elm::createForm($action, [
|
||
|
[
|
||
|
'type' => 'el-tabs',
|
||
|
'native' => true,
|
||
|
'props' => [
|
||
|
'value' => $list[0]['classify_key'] ?? ''
|
||
|
],
|
||
|
'children' => $children
|
||
|
]
|
||
|
])->setTitle($group['classify_name']);
|
||
|
}
|
||
|
|
||
|
public function uploadForm()
|
||
|
{
|
||
|
$config = $this->getWhere(['config_key' => 'upload_type']);
|
||
|
$rule = $this->getComponent($config, 0)->value(systemConfig('upload_type'));
|
||
|
$make = app()->make(ConfigClassifyRepository::class);
|
||
|
$rule->control([
|
||
|
[
|
||
|
'value' => '1',
|
||
|
'rule' => $this->cidByFormRule($make->keyByData('local'), 0)->formRule()
|
||
|
],
|
||
|
[
|
||
|
'value' => '2',
|
||
|
'rule' => $this->cidByFormRule($make->keyByData('qiniuyun'), 0)->formRule()
|
||
|
],
|
||
|
[
|
||
|
'value' => '3',
|
||
|
'rule' => $this->cidByFormRule($make->keyByData('aliyun_oss'), 0)->formRule()
|
||
|
],
|
||
|
[
|
||
|
'value' => '4',
|
||
|
'rule' => $this->cidByFormRule($make->keyByData('tengxun'), 0)->formRule()
|
||
|
],
|
||
|
[
|
||
|
'value' => '5',
|
||
|
'rule' => $this->cidByFormRule($make->keyByData('huawei_obs'), 0)->formRule()
|
||
|
],
|
||
|
[
|
||
|
'value' => '6',
|
||
|
'rule' => $this->cidByFormRule($make->keyByData('ucloud'), 0)->formRule()
|
||
|
],
|
||
|
]);
|
||
|
return Elm::createForm(Route::buildUrl('systemSaveUploadConfig')->build(), [$rule])->setTitle('上传配置');
|
||
|
}
|
||
|
|
||
|
public function saveUpload($data)
|
||
|
{
|
||
|
$configValueRepository = app()->make(ConfigValueRepository::class);
|
||
|
$uploadType = $data['upload_type'] ?? '1';
|
||
|
$key = '';
|
||
|
switch ($uploadType) {
|
||
|
case 1:
|
||
|
$key = 'local';
|
||
|
break;
|
||
|
case 2:
|
||
|
$key = 'qiniuyun';
|
||
|
break;
|
||
|
case 3:
|
||
|
$key = 'aliyun_oss';
|
||
|
break;
|
||
|
case 4:
|
||
|
$key = 'tengxun';
|
||
|
break;
|
||
|
case 5:
|
||
|
$key = 'huawei_obs';
|
||
|
break;
|
||
|
case 6:
|
||
|
$key = 'ucloud';
|
||
|
break;
|
||
|
|
||
|
}
|
||
|
|
||
|
Db::transaction(function () use ($data, $key, $uploadType, $configValueRepository) {
|
||
|
$configValueRepository->setFormData([
|
||
|
'upload_type' => $uploadType
|
||
|
], 0);
|
||
|
if ($key) {
|
||
|
$make = app()->make(ConfigClassifyRepository::class);
|
||
|
if (!($cid = $make->keyById($key))) return app('json')->fail('保存失败');
|
||
|
$configValueRepository->save($cid, $data, 0);
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
|
||
|
public function wechatForm()
|
||
|
{
|
||
|
$formData['wechat_chekc_file'] = app()->make(CacheRepository::class)->getWhere(['key' => 'wechat_chekc_file']);
|
||
|
if ($formData['wechat_chekc_file'] && !is_file($formData['wechat_chekc_file'])) $formData['wechat_chekc_file'] = '';
|
||
|
|
||
|
$form = Elm::createForm(Route::buildUrl('configWechatUploadSet')->build());
|
||
|
|
||
|
$form->setRule([
|
||
|
Elm::uploadFile('wechat_chekc_file', '上传校验文件', rtrim(systemConfig('site_url'), '/') . Route::buildUrl('configUploadName', ['field' => 'file'])->build())->headers(['X-Token' => request()->token()]),
|
||
|
]);
|
||
|
return $form->setTitle('上传校验文件')->formData($formData);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 替换appid
|
||
|
* @param string $appid
|
||
|
* @param string $projectanme
|
||
|
*/
|
||
|
public function updateConfigJson($appId = '', $projectName = '', $path = '')
|
||
|
{
|
||
|
$fileUrl = $path . "/download/project.config.json";
|
||
|
$string = file_get_contents($fileUrl); //加载配置文件
|
||
|
// 替换appid
|
||
|
$appIdOld = '/"appid"(.*?),/';
|
||
|
$appIdNew = '"appid"' . ': ' . '"' . $appId . '",';
|
||
|
$string = preg_replace($appIdOld, $appIdNew, $string); // 正则查找然后替换
|
||
|
// 替换小程序名称
|
||
|
$projectNameOld = '/"projectname"(.*?),/';
|
||
|
$projectNameNew = '"projectname"' . ': ' . '"' . $projectName . '",';
|
||
|
$string = preg_replace($projectNameOld, $projectNameNew, $string); // 正则查找然后替换
|
||
|
$newFileUrl = $path . "/download/project.config.json";
|
||
|
@file_put_contents($newFileUrl, $string); // 写入配置文件
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 替换url
|
||
|
* @param $url
|
||
|
*/
|
||
|
public function updateUrl($url, $path)
|
||
|
{
|
||
|
$fileUrl = $path . "/download/common/vendor.js";
|
||
|
|
||
|
$string = file_get_contents($fileUrl); //加载配置文件
|
||
|
$string = str_replace('https://mer.crmeb.net', $url, $string); // 正则查找然后替换
|
||
|
|
||
|
$ws = str_replace('https', 'wss', $url);
|
||
|
$string = str_replace('wss://mer.crmeb.net', $ws, $string); // 正则查找然后替换
|
||
|
|
||
|
$newFileUrl = $path . "/download/common/vendor.js";
|
||
|
@file_put_contents($newFileUrl, $string); // 写入配置文件
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 关闭直播
|
||
|
* @param int $iszhibo
|
||
|
*/
|
||
|
public function updateAppJson($path)
|
||
|
{
|
||
|
$fileUrl = $path . "/download/app.json";
|
||
|
$string = file_get_contents($fileUrl); //加载配置文件
|
||
|
$pats = '/,
|
||
|
"plugins": \{
|
||
|
"live-player-plugin": \{
|
||
|
"version": "(.*?)",
|
||
|
"provider": "(.*?)"
|
||
|
}
|
||
|
}/';
|
||
|
$string = preg_replace($pats, '', $string); // 正则查找然后替换
|
||
|
$newFileUrl = $path . "/download/app.json";
|
||
|
@file_put_contents($newFileUrl, $string); // 写入配置文件
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 去掉菜单
|
||
|
* @param int $iszhibo
|
||
|
*/
|
||
|
public function updateRouteJson($path)
|
||
|
{
|
||
|
$fileUrl = $path . "/download/app.json";
|
||
|
$string = file_get_contents($fileUrl); //加载配置文件
|
||
|
$pats = '/
|
||
|
{
|
||
|
"pagePath": "pages\/plant_grass\/index",
|
||
|
"iconPath": "static\/images\/5-001.png",
|
||
|
"selectedIconPath": "static\/images\/5-002.png",
|
||
|
"text": "逛逛"
|
||
|
},/';
|
||
|
$string = preg_replace($pats, '', $string); // 正则查找然后替换
|
||
|
$newFileUrl = $path . "/download/app.json";
|
||
|
@file_put_contents($newFileUrl, $string); // 写入配置文件
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* TODO 请求方式
|
||
|
* @param $path
|
||
|
* @param bool $plant
|
||
|
* @author Qinii
|
||
|
* @day 1/4/22
|
||
|
*/
|
||
|
public function updatePlantJson(string $path, int $plant)
|
||
|
{
|
||
|
$fileUrl = $path . "/download/common/vendor.js";
|
||
|
$string = file_get_contents($fileUrl); //加载配置文件
|
||
|
$string = str_replace('"-openPlantGrass-"', $plant ? 'true' : 'false', $string); // 正则查找然后替换
|
||
|
$newFileUrl = $path . "/download/common/vendor.js";
|
||
|
@file_put_contents($newFileUrl, $string); // 写入配置文件
|
||
|
}
|
||
|
}
|