zx/app/common/repositories/user/UserInfoRepository.php

251 lines
8.6 KiB
PHP
Raw Normal View History

2024-07-02 15:32:59 +08:00
<?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\user;
use app\common\dao\user\UserInfoDao;
use app\common\dao\user\UserSignDao;
use app\common\repositories\BaseRepository;
use app\common\repositories\system\config\ConfigValueRepository;
use FormBuilder\Factory\Elm;
use Swoole\Database\MysqliException;
use think\exception\ValidateException;
use think\facade\Db;
use think\facade\Route;
/**
* @mixin UserInfoDao
*/
class UserInfoRepository extends BaseRepository
{
protected $type = [
'input' => ['label' => '文本', 'type' => 'varchar(255)', 'value' => '', 'default' => ''],
'int' => ['label' => '数字', 'type' => 'int(11)', 'value' => 0, 'default' => 0],
'phone' => ['label' => '手机号', 'type' => 'varchar(11)', 'value' => '', 'default' => ''],
'date' => ['label' => '时间', 'type' => 'date', 'value' => null,'default' => 'NULL'],
'radio' => ['label' => '单选', 'type' => 'tinyint(1)', 'value' => 0, 'default' => 0],
'address' => ['label' => '地址', 'type' => 'varchar(255)', 'value' => '', 'default' => ''],
'id_card' => ['label' => '身份证', 'type' => 'varchar(255)', 'value' => '', 'default' => ''],
'email' => ['label' => '邮箱', 'type' => 'varchar(255)', 'value' => '', 'default' => ''],
];
const FIXED_FIELD = ['uid'];
/**
* @var UserInfoDao
*/
protected $dao;
/**
* UserSignRepository constructor.
* @param UserInfoDao $dao
*/
public function __construct(UserInfoDao $dao)
{
$this->dao = $dao;
}
// 验证是否是有效的列名
protected function isValidColumnName($columnName)
{
// 检查是否以字母开头,只包含字母、数字和下划线
if (!preg_match('/^[a-z][a-z0-9_]*$/', $columnName)) {
throw new ValidateException("无效的列名: {$columnName}");
}
}
public function executeSql($db, $sql, $params = [])
{
try {
$db->execute($sql, $params);
} catch (MysqliException $exception) {
throw new ValidateException($exception->getMessage());
}
}
/**
* 创建字段
* @param array $data
* @param $type
* @return bool
*
* @date 2023/09/25
* @author yyw
*/
protected function changeField(array $data, $type = true)
{
// 获取数据库连接实例
$db = Db::connect();
//操作的数据表
$tableName = env('database.prefix', 'eb_') . 'user_fields';
// 操作的字段名称
$fieldName = $data['field'];
// 验证字段端名是否合法
$this->isValidColumnName($fieldName);
//
if ($type) {
// 字段类型,可以根据需要进行修改
$fieldType = $this->type[$data['type']]['type'] ?? 'varchar(255)';
$comment = $data['title'] ?: $data['msg'];
$default = $this->type[$data['type']]['default'];
$sql = "ALTER TABLE `$tableName` ADD COLUMN `$fieldName` $fieldType NULL DEFAULT '$default' COMMENT '$comment'";
} else {
$sql = "ALTER TABLE `$tableName` DROP COLUMN `$fieldName`";
}
$this->executeSql($db, $sql);
return true;
}
/**
* 删除字段
* @param string $fieldName
* @return bool
*
* @date 2023/09/25
* @author yyw
*/
protected function deleteField(string $fieldName)
{
// 验证字段名称是否有效
$this->isValidColumnName($fieldName);
// 获取数据库连接实例
$db = Db::connect();
// 操作的数据表
$tableName = env('database.prefix', 'eb_') . 'user_fields';
// 构建 SQL 删除字段的语句
$sql = "ALTER TABLE `$tableName` DROP COLUMN `$fieldName`";
$this->executeSql($db, $sql);
return true;
}
public function getList(array $where = [], int $page = 1, int $limit = 10)
{
$query = $this->dao->getSearch($where);
$count = $query->count();
$list = $query->order(['sort', 'create_time' => 'ASC'])->select()->each(function ($item) {
return $item->type_name = $this->type[$item->type]['label'];
});
$avatar = systemConfig('user_default_avatar');
return compact('count', 'list', 'avatar');
}
public function createFrom()
{
$action = Route::buildUrl('systemUserInfoCreate')->build();
$form = Elm::createForm($action, [
Elm::select('type', '字段类型:')->options($this->getType())->control([
[
'value' => 'radio',
'rule' => [
Elm::textarea('content', '配置内容')->placeholder('请输入配置内容')->required()
]
]
])->required(),
Elm::input('title', '字端名称:')->placeholder('请输入字端名称')->required(),
Elm::input('field', '字段key')->placeholder('请输入字段key')->required(),
Elm::input('msg', '提示信息:')->placeholder('请输入提示信息')->required()
]);
return $form->setTitle('添加字段');
}
public function create(array $data)
{
// 验证类型
if (!isset($this->type[$data['type']])) {
throw new ValidateException('字段类型异常');
}
if ($data['type'] == 'radio' && (!is_array($data['content']) || count($data['content']) < 2)) {
throw new ValidateException('请至少创建两个选项');
}
$data['content'] = json_encode($data['content']);
$data['sort'] = 999;
return Db::transaction(function () use ($data) {
$this->changeField($data);
$this->dao->create($data);
});
}
public function saveAll(array $data = [])
{
app()->make(ConfigValueRepository::class)->setFormData(['user_default_avatar' => $data['avatar']], 0);
//保存用户表单
if (!empty($data['user_extend_info'])) {
foreach ($data['user_extend_info'] as $sort => $item) {
if (!isset($item['field']) || !isset($item['is_used']) || !isset($item['is_require']) || !isset($item['is_show'])) {
throw new ValidateException('参数不能为空');
}
if (!in_array($item['is_used'], [0, 1]) || !in_array($item['is_require'], [0, 1]) || !in_array($item['is_show'], [0, 1])) {
throw new ValidateException('参数类性错误');
}
$this->dao->query([])->where('field', $item['field'])->update(['is_used' => $item['is_used'], 'is_require' => $item['is_require'], 'is_show' => $item['is_show'], 'sort' => $sort]);
}
}
return true;
}
public function delete(int $id)
{
$info = $this->dao->get($id);
if (empty($info) || empty($info['field'])) {
throw new ValidateException('表单数据异常');
}
if ($info['is_default']) {
throw new ValidateException('默认表单不能删除');
}
return Db::transaction(function () use ($info, $id) {
$this->deleteField($info['field']);
$this->dao->delete($id);
});
}
public function getType()
{
$res = [];
foreach ($this->type as $k => $v) {
$v['value'] = $k;
unset($v['type']);
$res[] = $v;
}
return $res;
}
public function getSelectList()
{
return $this->dao->getSearch(['is_used' => 1])->whereNotIn('type', ['radio', 'date'])->order(['sort', 'create_time' => 'ASC'])->column('title as label,field as value');
}
/**
* 验证字段是否为默认字段
* @param string $fields
* @return bool
*/
public function getFieldsIsItDefault(string $field)
{
return (bool)$this->getSearch(['field' => $field])->value('is_default', 0);
}
}