This commit is contained in:
Your Name
2026-07-22 10:18:59 +08:00
parent 2530ddada6
commit 0fb03d0bca
618 changed files with 19445 additions and 3 deletions
+197
View File
@@ -0,0 +1,197 @@
<?php
namespace app\controller\api;
use app\model\AiModel;
use app\model\Conversation as ConversationModel;
use app\model\MembershipLevel;
use app\model\Message;
use app\model\SystemSetting;
use app\model\User;
use app\model\UserDailyStat;
use app\service\SettingsService;
class Admin extends BaseApi
{
public function users()
{
$page = max(1, (int) $this->request->get('page', 1));
$limit = min(50, max(1, (int) $this->request->get('limit', 20)));
$query = User::alias('u')
->leftJoin('membership_levels ml', 'u.membership_level_id = ml.id')
->field('u.id,u.username,u.email,u.nickname,u.role,u.status,u.membership_level_id,u.created_at,u.last_login_at,ml.name as membership_name')
->order('u.id', 'desc');
$total = (clone $query)->count();
$list = $query->page($page, $limit)->select();
return $this->success(['list' => $list, 'total' => $total]);
}
public function updateUser($id)
{
$input = $this->request->put();
$allowed = ['nickname', 'role', 'status', 'membership_level_id'];
$data = [];
foreach ($allowed as $field) {
if (array_key_exists($field, $input)) {
$data[$field] = $input[$field];
}
}
if (empty($data)) {
return $this->error('无更新内容');
}
User::where('id', $id)->update($data);
return $this->success(null, '更新成功');
}
public function conversations()
{
$page = max(1, (int) $this->request->get('page', 1));
$limit = min(50, max(1, (int) $this->request->get('limit', 20)));
$userId = $this->request->get('user_id');
$query = ConversationModel::alias('c')
->join('users u', 'c.user_id = u.id')
->whereNull('c.deleted_at')
->field('c.*,u.username,u.email')
->order('c.updated_at', 'desc');
if ($userId) {
$query->where('c.user_id', $userId);
}
return $this->success($query->page($page, $limit)->select());
}
public function stats()
{
return $this->success([
'users' => User::count(),
'conversations' => ConversationModel::whereNull('deleted_at')->count(),
'messages' => Message::count(),
'today_messages' => (int) UserDailyStat::where('stat_date', date('Y-m-d'))->sum('message_count'),
]);
}
public function settings()
{
$rows = SystemSetting::select();
$settings = [];
foreach ($rows as $row) {
$decoded = json_decode($row->setting_value, true);
$settings[$row->setting_key] = [
'value' => json_last_error() === JSON_ERROR_NONE ? $decoded : $row->setting_value,
'description' => $row->description,
];
}
return $this->success($settings);
}
public function updateSettings()
{
$input = $this->request->put();
foreach ($input as $key => $value) {
SettingsService::set($key, $value);
}
return $this->success(null, '设置已更新');
}
public function models()
{
$list = AiModel::field('id,name,model_id,api_base_url,max_tokens,temperature,is_default,enabled,sort_order')
->order('sort_order')
->select();
return $this->success($list);
}
public function createModel()
{
$input = $this->request->post();
$model = AiModel::create([
'name' => $input['name'],
'model_id' => $input['model_id'],
'api_base_url' => $input['api_base_url'] ?? 'https://api.openai.com/v1',
'api_key' => $input['api_key'],
'max_tokens' => $input['max_tokens'] ?? 4096,
'temperature' => $input['temperature'] ?? 0.7,
'is_default' => (int) ($input['is_default'] ?? 0),
'enabled' => (int) ($input['enabled'] ?? 1),
'sort_order' => $input['sort_order'] ?? 0,
]);
if (!empty($input['is_default'])) {
AiModel::where('id', '<>', $model->id)->update(['is_default' => 0]);
}
return $this->success(['id' => $model->id], '创建成功');
}
public function updateModel($id)
{
$input = $this->request->put();
$allowed = ['name', 'model_id', 'api_base_url', 'api_key', 'max_tokens', 'temperature', 'is_default', 'enabled', 'sort_order'];
$data = [];
foreach ($allowed as $field) {
if (array_key_exists($field, $input)) {
$data[$field] = $input[$field];
}
}
if (empty($data)) {
return $this->error('无更新内容');
}
AiModel::where('id', $id)->update($data);
if (!empty($input['is_default'])) {
AiModel::where('id', '<>', $id)->update(['is_default' => 0]);
}
return $this->success(null, '更新成功');
}
public function deleteModel($id)
{
AiModel::destroy($id);
return $this->success(null, '删除成功');
}
public function memberships()
{
$levels = MembershipLevel::order('sort_order')->select();
return $this->success($levels);
}
public function updateMembership($id)
{
$input = $this->request->put();
$data = [];
foreach (['name', 'max_conversations', 'max_messages_per_day', 'max_upload_size_mb', 'sort_order'] as $field) {
if (isset($input[$field])) {
$data[$field] = $input[$field];
}
}
if (isset($input['permissions'])) {
$data['permissions'] = $input['permissions'];
}
if (isset($input['allowed_models'])) {
$data['allowed_models'] = $input['allowed_models'];
}
if (empty($data)) {
return $this->error('无更新内容');
}
MembershipLevel::where('id', $id)->update($data);
return $this->success(null, '更新成功');
}
}