first commit
This commit is contained in:
21
vendor/webman/think-orm/LICENSE
vendored
Normal file
21
vendor/webman/think-orm/LICENSE
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2022 webman
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
2
vendor/webman/think-orm/README.md
vendored
Normal file
2
vendor/webman/think-orm/README.md
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
# think-orm
|
||||
webman think-orm plugin
|
||||
14
vendor/webman/think-orm/composer.json
vendored
Normal file
14
vendor/webman/think-orm/composer.json
vendored
Normal file
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"name": "webman/think-orm",
|
||||
"type": "library",
|
||||
"license": "MIT",
|
||||
"require": {
|
||||
"workerman/webman-framework": "^1.2.1",
|
||||
"topthink/think-orm": "^2.0.53"
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Webman\\ThinkOrm\\": "src"
|
||||
}
|
||||
}
|
||||
}
|
||||
90
vendor/webman/think-orm/src/Install.php
vendored
Normal file
90
vendor/webman/think-orm/src/Install.php
vendored
Normal file
@@ -0,0 +1,90 @@
|
||||
<?php
|
||||
namespace Webman\ThinkOrm;
|
||||
|
||||
class Install
|
||||
{
|
||||
const WEBMAN_PLUGIN = true;
|
||||
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
protected static $pathRelation = [];
|
||||
|
||||
/**
|
||||
* Install
|
||||
* @return void
|
||||
*/
|
||||
public static function install()
|
||||
{
|
||||
$config_file = config_path() . '/bootstrap.php';
|
||||
$config = include $config_file;
|
||||
if(!in_array(ThinkOrm::class , $config ?? [])) {
|
||||
$config_file_content = file_get_contents($config_file);
|
||||
$config_file_content = preg_replace('/\];/', " Webman\ThinkOrm\ThinkOrm::class,\n];", $config_file_content);
|
||||
file_put_contents($config_file, $config_file_content);
|
||||
}
|
||||
$thinkorm_file = config_path() . '/thinkorm.php';
|
||||
if (!is_file($thinkorm_file)) {
|
||||
copy(__DIR__ . '/config/thinkorm.php', $thinkorm_file);
|
||||
}
|
||||
static::installByRelation();
|
||||
}
|
||||
|
||||
/**
|
||||
* Uninstall
|
||||
* @return void
|
||||
*/
|
||||
public static function uninstall()
|
||||
{
|
||||
$config_file = config_path() . '/bootstrap.php';
|
||||
$config = include $config_file;
|
||||
if(in_array(ThinkOrm::class, $config ?? [])) {
|
||||
$config_file = config_path() . '/bootstrap.php';
|
||||
$config_file_content = file_get_contents($config_file);
|
||||
$config_file_content = preg_replace('/ {0,4}Webman\\\\ThinkOrm\\\\ThinkOrm::class,?\r?\n?/', '', $config_file_content);
|
||||
file_put_contents($config_file, $config_file_content);
|
||||
}
|
||||
$thinkorm_file = config_path() . '/thinkorm.php';
|
||||
if (is_file($thinkorm_file)) {
|
||||
unlink($thinkorm_file);
|
||||
}
|
||||
self::uninstallByRelation();
|
||||
}
|
||||
|
||||
/**
|
||||
* installByRelation
|
||||
* @return void
|
||||
*/
|
||||
public static function installByRelation()
|
||||
{
|
||||
foreach (static::$pathRelation as $source => $dest) {
|
||||
if ($pos = strrpos($dest, '/')) {
|
||||
$parent_dir = base_path().'/'.substr($dest, 0, $pos);
|
||||
if (!is_dir($parent_dir)) {
|
||||
mkdir($parent_dir, 0777, true);
|
||||
}
|
||||
}
|
||||
//symlink(__DIR__ . "/$source", base_path()."/$dest");
|
||||
copy_dir(__DIR__ . "/$source", base_path()."/$dest");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* uninstallByRelation
|
||||
* @return void
|
||||
*/
|
||||
public static function uninstallByRelation()
|
||||
{
|
||||
foreach (static::$pathRelation as $source => $dest) {
|
||||
$path = base_path()."/$dest";
|
||||
if (!is_dir($path) && !is_file($path)) {
|
||||
continue;
|
||||
}
|
||||
/*if (is_link($path) {
|
||||
unlink($path);
|
||||
}*/
|
||||
remove_dir($path);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
49
vendor/webman/think-orm/src/ThinkOrm.php
vendored
Normal file
49
vendor/webman/think-orm/src/ThinkOrm.php
vendored
Normal file
@@ -0,0 +1,49 @@
|
||||
<?php
|
||||
|
||||
namespace Webman\ThinkOrm;
|
||||
|
||||
use Webman\Bootstrap;
|
||||
use Workerman\Timer;
|
||||
use think\Paginator;
|
||||
use think\facade\Db;
|
||||
use think\db\connector\Mysql;
|
||||
|
||||
class ThinkOrm implements Bootstrap
|
||||
{
|
||||
// 进程启动时调用
|
||||
public static function start($worker)
|
||||
{
|
||||
$config = config('thinkorm');
|
||||
$default = $config['default'] ?? false;
|
||||
$connections = $config['connections'] ?? [];
|
||||
// 配置
|
||||
Db::setConfig($config);
|
||||
// 维持mysql心跳
|
||||
if ($worker) {
|
||||
Timer::add(55, function () use ($connections, $default) {
|
||||
if (!class_exists(Mysql::class, false)) {
|
||||
return;
|
||||
}
|
||||
foreach ($connections as $key => $item) {
|
||||
if ($item['type'] == 'mysql') {
|
||||
try {
|
||||
if ($key == $default) {
|
||||
Db::query('select 1');
|
||||
} else {
|
||||
Db::connect($key)->query('select 1');
|
||||
}
|
||||
} catch (Throwable $e) {}
|
||||
}
|
||||
}
|
||||
Db::getDbLog(true);
|
||||
});
|
||||
}
|
||||
Paginator::currentPageResolver(function ($pageName = 'page') {
|
||||
$page = request()->input($pageName, 1);
|
||||
if (filter_var($page, FILTER_VALIDATE_INT) !== false && (int)$page >= 1) {
|
||||
return (int)$page;
|
||||
}
|
||||
return 1;
|
||||
});
|
||||
}
|
||||
}
|
||||
450
vendor/webman/think-orm/src/_ide_helper.php
vendored
Normal file
450
vendor/webman/think-orm/src/_ide_helper.php
vendored
Normal file
@@ -0,0 +1,450 @@
|
||||
<?php
|
||||
|
||||
namespace think\facade {
|
||||
|
||||
class Db
|
||||
{
|
||||
/**
|
||||
* 指定当前数据表名(不含前缀)
|
||||
* @access public
|
||||
* @param string $name 不含前缀的数据表名字
|
||||
* @return \think\Db
|
||||
*/
|
||||
public static function name(string $name)
|
||||
{
|
||||
/** @var \think\Db $instance */
|
||||
return $instance->name($name);
|
||||
}
|
||||
/**
|
||||
* 指定当前操作的数据表
|
||||
* @access public
|
||||
* @param mixed $table 表名
|
||||
* @return \think\Db
|
||||
*/
|
||||
public static function table($table)
|
||||
{
|
||||
/** @var \think\Db $instance */
|
||||
return $instance->table($table);
|
||||
}
|
||||
|
||||
/**
|
||||
* 执行数据库事务
|
||||
* @access public
|
||||
* @param callable $callback 数据操作方法回调
|
||||
* @return mixed
|
||||
*/
|
||||
public static function transaction(callable $callback)
|
||||
{
|
||||
/** @var \think\Db $instance */
|
||||
return $instance->transaction($callback);
|
||||
}
|
||||
|
||||
/**
|
||||
* 启动事务
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public static function startTrans(): void
|
||||
{
|
||||
/** @var \think\Db $instance */
|
||||
$instance->startTrans();
|
||||
}
|
||||
|
||||
/**
|
||||
* 用于非自动提交状态下面的查询提交
|
||||
* @access public
|
||||
* @return void
|
||||
* @throws \PDOException
|
||||
*/
|
||||
public static function commit(): void
|
||||
{
|
||||
/** @var \think\Db $instance */
|
||||
$instance->commit();
|
||||
}
|
||||
|
||||
/**
|
||||
* 事务回滚
|
||||
* @access public
|
||||
* @return void
|
||||
* @throws \PDOException
|
||||
*/
|
||||
public static function rollback(): void
|
||||
{
|
||||
/** @var \think\Db $instance */
|
||||
$instance->rollback();
|
||||
}
|
||||
/**
|
||||
* 执行查询 返回数据集
|
||||
* @access public
|
||||
* @param string $sql sql指令
|
||||
* @param array $bind 参数绑定
|
||||
* @return array
|
||||
* @throws \think\db\exception\BindParamException
|
||||
* @throws \PDOException
|
||||
*/
|
||||
public function query(string $sql, array $bind = []): array
|
||||
{
|
||||
/** @var \think\Db $instance */
|
||||
return $instance->query($sql,$bind);
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置从主服务器读取数据
|
||||
* @access public
|
||||
* @param bool $readMaster 是否从主服务器读取
|
||||
* @return \think\Db
|
||||
*/
|
||||
public function master(bool $readMaster = true)
|
||||
{
|
||||
/** @var \think\Db $instance */
|
||||
return $instance->master($readMaster);
|
||||
}
|
||||
/**
|
||||
* 执行语句
|
||||
* @access public
|
||||
* @param string $sql sql指令
|
||||
* @param array $bind 参数绑定
|
||||
* @return int
|
||||
* @throws \think\db\exception\BindParamException
|
||||
* @throws \PDOException
|
||||
*/
|
||||
public function execute(string $sql, array $bind = []): int
|
||||
{
|
||||
/** @var \think\Db $instance */
|
||||
return $instance->execute($sql,$bind);
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建/切换数据库连接查询
|
||||
* @access public
|
||||
* @param string|null $name 连接配置标识
|
||||
* @param bool $force 强制重新连接
|
||||
* @return \think\db\BaseQuery
|
||||
*/
|
||||
public function connect(string $name = null, bool $force = false): \think\db\BaseQuery
|
||||
{
|
||||
|
||||
/** @var \think\Db $instance */
|
||||
return $instance->connect($name,$force);
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置配置对象
|
||||
* @access public
|
||||
*
|
||||
* @param Config $config 配置对象
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public static function setConfig($config): void
|
||||
{
|
||||
|
||||
/** @var \think\Db $instance */
|
||||
$instance->setConfig($config);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取配置参数
|
||||
* @access public
|
||||
*
|
||||
* @param string $name 配置参数
|
||||
* @param mixed $default 默认值
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public static function getConfig(string $name = '', $default = null)
|
||||
{
|
||||
|
||||
/** @var \think\Db $instance */
|
||||
return $instance->getConfig($name, $default);
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置Event对象
|
||||
*
|
||||
* @param Event $event
|
||||
*/
|
||||
public static function setEvent(Event $event): void
|
||||
{
|
||||
|
||||
/** @var \think\Db $instance */
|
||||
$instance->setEvent($event);
|
||||
}
|
||||
|
||||
/**
|
||||
* 注册回调方法
|
||||
* @access public
|
||||
*
|
||||
* @param string $event 事件名
|
||||
* @param callable $callback 回调方法
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public static function event(string $event, callable $callback): void
|
||||
{
|
||||
|
||||
/** @var \think\Db $instance */
|
||||
$instance->event($event, $callback);
|
||||
}
|
||||
|
||||
/**
|
||||
* 触发事件
|
||||
* @access public
|
||||
*
|
||||
* @param string $event 事件名
|
||||
* @param mixed $params 传入参数
|
||||
* @param bool $once
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public static function trigger(string $event, $params = null, bool $once = false)
|
||||
{
|
||||
|
||||
/** @var \think\Db $instance */
|
||||
return $instance->trigger($event, $params, $once);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
namespace think {
|
||||
|
||||
/**
|
||||
* @method static \think\db\Query where(mixed $field, string $op = null, mixed $condition = null) 查询条件
|
||||
* @method static \think\db\Query whereTime(string $field, string $op, mixed $range = null) 查询日期和时间
|
||||
* @method static \think\db\Query whereBetweenTime(string $field, mixed $startTime, mixed $endTime) 查询日期或者时间范围
|
||||
* @method static \think\db\Query whereBetweenTimeField(string $startField, string $endField) 查询当前时间在两个时间字段范围
|
||||
* @method static \think\db\Query whereYear(string $field, string $year = 'this year') 查询某年
|
||||
* @method static \think\db\Query whereMonth(string $field, string $month = 'this month') 查询某月
|
||||
* @method static \think\db\Query whereDay(string $field, string $day = 'today') 查询某日
|
||||
* @method static \think\db\Query whereRaw(string $where, array $bind = []) 表达式查询
|
||||
* @method static \think\db\Query whereExp(string $field, string $condition, array $bind = []) 字段表达式查询
|
||||
* @method static \think\db\Query when(mixed $condition, mixed $query, mixed $otherwise = null) 条件查询
|
||||
* @method static \think\db\Query join(mixed $join, mixed $condition = null, string $type = 'INNER') JOIN查询
|
||||
* @method static \think\db\Query view(mixed $join, mixed $field = null, mixed $on = null, string $type = 'INNER') 视图查询
|
||||
* @method static \think\db\Query with(mixed $with) 关联预载入
|
||||
* @method static \think\db\Query count(string $field) Count统计查询
|
||||
* @method static \think\db\Query min(string $field) Min统计查询
|
||||
* @method static \think\db\Query max(string $field) Max统计查询
|
||||
* @method static \think\db\Query sum(string $field) SUM统计查询
|
||||
* @method static \think\db\Query avg(string $field) Avg统计查询
|
||||
* @method static \think\db\Query field(mixed $field, boolean $except = false) 指定查询字段
|
||||
* @method static \think\db\Query fieldRaw(string $field, array $bind = []) 指定查询字段
|
||||
* @method static \think\db\Query union(mixed $union, boolean $all = false) UNION查询
|
||||
* @method static \think\db\Query limit(mixed $offset, integer $length = null) 查询LIMIT
|
||||
* @method static \think\db\Query order(mixed $field, string $order = null) 查询ORDER
|
||||
* @method static \think\db\Query orderRaw(string $field, array $bind = []) 查询ORDER
|
||||
* @method static \think\db\Query cache(mixed $key = null, integer $expire = null) 设置查询缓存
|
||||
* @method mixed value(string $field) 获取某个字段的值
|
||||
* @method array column(string $field, string $key = '') 获取某个列的值
|
||||
* @method Model find(mixed $data = null) 查询单个记录 不存在返回Null
|
||||
* @method Model findOrEmpty(mixed $data = null) 查询单个记录 不存在返回空模型
|
||||
* @method \think\model\Collection select(mixed $data = null) 查询多个记录
|
||||
* @method Model withAttr(array $name, \Closure $closure) 动态定义获取器
|
||||
*/
|
||||
class Model
|
||||
{
|
||||
|
||||
/**
|
||||
* 指定当前数据表名(不含前缀)
|
||||
* @access public
|
||||
* @param string $name 不含前缀的数据表名字
|
||||
* @return \think\Db
|
||||
*/
|
||||
public static function name(string $name)
|
||||
{
|
||||
/** @var \think\Db $instance */
|
||||
return $instance->name($name);
|
||||
}
|
||||
/**
|
||||
* 指定当前操作的数据表
|
||||
* @access public
|
||||
* @param mixed $table 表名
|
||||
* @return \think\Db
|
||||
*/
|
||||
public static function table($table)
|
||||
{
|
||||
/** @var \think\Db $instance */
|
||||
return $instance->table($table);
|
||||
}
|
||||
|
||||
/**
|
||||
* 执行数据库事务
|
||||
* @access public
|
||||
* @param callable $callback 数据操作方法回调
|
||||
* @return mixed
|
||||
*/
|
||||
public static function transaction(callable $callback)
|
||||
{
|
||||
/** @var \think\Db $instance */
|
||||
return $instance->transaction($callback);
|
||||
}
|
||||
|
||||
/**
|
||||
* 启动事务
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public static function startTrans(): void
|
||||
{
|
||||
/** @var \think\Db $instance */
|
||||
$instance->startTrans();
|
||||
}
|
||||
|
||||
/**
|
||||
* 用于非自动提交状态下面的查询提交
|
||||
* @access public
|
||||
* @return void
|
||||
* @throws \PDOException
|
||||
*/
|
||||
public static function commit(): void
|
||||
{
|
||||
/** @var \think\Db $instance */
|
||||
$instance->commit();
|
||||
}
|
||||
|
||||
/**
|
||||
* 事务回滚
|
||||
* @access public
|
||||
* @return void
|
||||
* @throws \PDOException
|
||||
*/
|
||||
public static function rollback(): void
|
||||
{
|
||||
/** @var \think\Db $instance */
|
||||
$instance->rollback();
|
||||
}
|
||||
/**
|
||||
* 执行查询 返回数据集
|
||||
* @access public
|
||||
* @param string $sql sql指令
|
||||
* @param array $bind 参数绑定
|
||||
* @return array
|
||||
* @throws \think\db\exception\BindParamException
|
||||
* @throws \PDOException
|
||||
*/
|
||||
public function query(string $sql, array $bind = []): array
|
||||
{
|
||||
/** @var \think\Db $instance */
|
||||
return $instance->query($sql,$bind);
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置从主服务器读取数据
|
||||
* @access public
|
||||
* @param bool $readMaster 是否从主服务器读取
|
||||
* @return \think\Db
|
||||
*/
|
||||
public function master(bool $readMaster = true)
|
||||
{
|
||||
/** @var \think\Db $instance */
|
||||
return $instance->master($readMaster);
|
||||
}
|
||||
/**
|
||||
* 执行语句
|
||||
* @access public
|
||||
* @param string $sql sql指令
|
||||
* @param array $bind 参数绑定
|
||||
* @return int
|
||||
* @throws \think\db\exception\BindParamException
|
||||
* @throws \PDOException
|
||||
*/
|
||||
public function execute(string $sql, array $bind = []): int
|
||||
{
|
||||
/** @var \think\Db $instance */
|
||||
return $instance->execute($sql,$bind);
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建/切换数据库连接查询
|
||||
* @access public
|
||||
* @param string|null $name 连接配置标识
|
||||
* @param bool $force 强制重新连接
|
||||
* @return \think\db\BaseQuery
|
||||
*/
|
||||
public function connect(string $name = null, bool $force = false): \think\db\BaseQuery
|
||||
{
|
||||
|
||||
/** @var \think\Db $instance */
|
||||
return $instance->connect($name,$force);
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置配置对象
|
||||
* @access public
|
||||
*
|
||||
* @param Config $config 配置对象
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public static function setConfig($config): void
|
||||
{
|
||||
|
||||
/** @var \think\Db $instance */
|
||||
$instance->setConfig($config);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取配置参数
|
||||
* @access public
|
||||
*
|
||||
* @param string $name 配置参数
|
||||
* @param mixed $default 默认值
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public static function getConfig(string $name = '', $default = null)
|
||||
{
|
||||
|
||||
/** @var \think\Db $instance */
|
||||
return $instance->getConfig($name, $default);
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置Event对象
|
||||
*
|
||||
* @param Event $event
|
||||
*/
|
||||
public static function setEvent(Event $event): void
|
||||
{
|
||||
|
||||
/** @var \think\Db $instance */
|
||||
$instance->setEvent($event);
|
||||
}
|
||||
|
||||
/**
|
||||
* 注册回调方法
|
||||
* @access public
|
||||
*
|
||||
* @param string $event 事件名
|
||||
* @param callable $callback 回调方法
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public static function event(string $event, callable $callback): void
|
||||
{
|
||||
|
||||
/** @var \think\Db $instance */
|
||||
$instance->event($event, $callback);
|
||||
}
|
||||
|
||||
/**
|
||||
* 触发事件
|
||||
* @access public
|
||||
*
|
||||
* @param string $event 事件名
|
||||
* @param mixed $params 传入参数
|
||||
* @param bool $once
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public static function trigger(string $event, $params = null, bool $once = false)
|
||||
{
|
||||
|
||||
/** @var \think\Db $instance */
|
||||
return $instance->trigger($event, $params, $once);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
31
vendor/webman/think-orm/src/config/thinkorm.php
vendored
Normal file
31
vendor/webman/think-orm/src/config/thinkorm.php
vendored
Normal file
@@ -0,0 +1,31 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'default' => 'mysql',
|
||||
'connections' => [
|
||||
'mysql' => [
|
||||
// 数据库类型
|
||||
'type' => 'mysql',
|
||||
// 服务器地址
|
||||
'hostname' => '127.0.0.1',
|
||||
// 数据库名
|
||||
'database' => 'test',
|
||||
// 数据库用户名
|
||||
'username' => 'root',
|
||||
// 数据库密码
|
||||
'password' => '123456',
|
||||
// 数据库连接端口
|
||||
'hostport' => '3306',
|
||||
// 数据库连接参数
|
||||
'params' => [],
|
||||
// 数据库编码默认采用utf8
|
||||
'charset' => 'utf8',
|
||||
// 数据库表前缀
|
||||
'prefix' => '',
|
||||
// 断线重连
|
||||
'break_reconnect' => true,
|
||||
// 关闭SQL监听日志
|
||||
'trigger_sql' => false,
|
||||
],
|
||||
],
|
||||
];
|
||||
Reference in New Issue
Block a user