From 0d4b005f4e5872be6e91fe966b6178f6a4702017 Mon Sep 17 00:00:00 2001 From: kuaifan Date: Fri, 29 Nov 2024 21:11:16 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E6=9B=B4=E6=96=B0=20AI=20=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E6=9B=B4=E5=A4=9A=E6=A8=A1=E5=9E=8B=E5=92=8C=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E6=8F=90=E7=A4=BA=E8=AF=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Controllers/Api/DialogController.php | 6 +- app/Http/Controllers/Api/SystemController.php | 40 +- app/Models/Setting.php | 36 ++ app/Models/UserBot.php | 2 +- app/Tasks/BotReceiveMsgTask.php | 134 ++---- docker-compose.yml | 7 +- docker/nginx/default.conf | 2 +- .../assets/js/pages/manage/application.vue | 16 +- .../assets/js/pages/manage/messenger.vue | 2 +- .../manage/setting/components/SystemAibot.vue | 393 +++++++++++++----- 10 files changed, 371 insertions(+), 267 deletions(-) diff --git a/app/Http/Controllers/Api/DialogController.php b/app/Http/Controllers/Api/DialogController.php index 2fa19b363..ae0a508af 100755 --- a/app/Http/Controllers/Api/DialogController.php +++ b/app/Http/Controllers/Api/DialogController.php @@ -957,7 +957,8 @@ class DialogController extends AbstractController * @apiGroup dialog * @apiName msg__stream * - * @apiParam {Number} dialog_id 对话ID + * @apiParam {String} [type] 消息类型(暂时无用,预留) + * - ai: 默认 * @apiParam {Number} userid 通知会员ID * @apiParam {String} stream_url 流动消息地址 * @@ -967,7 +968,6 @@ class DialogController extends AbstractController */ public function msg__stream() { - // $dialog_id = intval(Request::input('dialog_id')); $userid = intval(Request::input('userid')); $stream_url = trim(Request::input('stream_url')); // @@ -975,6 +975,8 @@ class DialogController extends AbstractController return Base::retError('参数错误'); } // + $stream_url = '/ai' . preg_replace('/^\/ai/?', '/', $stream_url); + // $params = [ 'userid' => $userid, 'msg' => [ diff --git a/app/Http/Controllers/Api/SystemController.php b/app/Http/Controllers/Api/SystemController.php index 9accd920e..b94d00009 100755 --- a/app/Http/Controllers/Api/SystemController.php +++ b/app/Http/Controllers/Api/SystemController.php @@ -97,10 +97,10 @@ class SystemController extends AbstractController return Base::retError('自动归档时间不可大于100天!'); } } - if ($all['voice2text'] == 'open' && empty(Base::settingFind('aibotSetting', 'openai_key'))) { + if ($all['voice2text'] == 'open' && !Setting::AIOpen()) { return Base::retError('开启语音转文字功能需要在应用中开启 ChatGPT AI 机器人。'); } - if ($all['translation'] == 'open' && empty(Base::settingFind('aibotSetting', 'openai_key'))) { + if ($all['translation'] == 'open' && !Setting::AIOpen()) { return Base::retError('开启翻译功能需要在应用中开启 ChatGPT AI 机器人。'); } if ($all['system_alias'] == env('APP_NAME')) { @@ -282,7 +282,7 @@ class SystemController extends AbstractController * * @apiParam {String} type * - get: 获取(默认) - * - save: 保存设置(参数:['openai_key', 'openai_agency', 'claude_token', 'claude_agency']) + * - save: 保存设置(参数:[...]) * @apiSuccess {Number} ret 返回状态码(1正确、0错误) * @apiSuccess {String} msg 返回信息(错误描述) * @apiSuccess {Object} data 返回数据 @@ -293,32 +293,13 @@ class SystemController extends AbstractController // $type = trim(Request::input('type')); $setting = Base::setting('aibotSetting'); - - $keys = [ - 'openai_key', - 'openai_agency', - 'openai_model', - 'claude_token', - 'claude_agency', - 'wenxin_key', - 'wenxin_secret', - 'wenxin_model', - 'qianwen_key', - 'qianwen_model', - 'gemini_key', - 'gemini_model', - 'gemini_agency', - 'zhipu_key', - 'zhipu_model', - ]; - if ($type == 'save') { if (env("SYSTEM_SETTING") == 'disabled') { return Base::retError('当前环境禁止修改'); } $all = Request::input(); foreach ($all as $key => $value) { - if (!in_array($key, $keys)) { + if (!isset($setting[$key])) { unset($all[$key]); } } @@ -335,7 +316,7 @@ class SystemController extends AbstractController WebSocketDialogMsg::sendMsg(null, $dialog->id, 'template', $tempMsg, $botUser->userid, true, false, true); } } - if ($backup['claude_token'] != $setting['claude_token']) { + if ($backup['claude_key'] != $setting['claude_key']) { $botUser = User::botGetOrCreate('ai-claude'); if ($botUser && $dialog = WebSocketDialog::checkUserDialog($botUser, $user->userid)) { WebSocketDialogMsg::sendMsg(null, $dialog->id, 'template', $tempMsg, $botUser->userid, true, false, true); @@ -367,15 +348,10 @@ class SystemController extends AbstractController } } // - $setting['openai_model'] = $setting['openai_model'] ?: 'gpt-3.5-turbo'; - $setting['wenxin_model'] = $setting['wenxin_model'] ?: 'eb-instant'; - $setting['qianwen_model'] = $setting['qianwen_model'] ?: 'qwen-v1'; - $setting['gemini_model'] = $setting['gemini_model'] ?: 'gemini-1.0-pro'; - $setting['zhipu_model'] = $setting['zhipu_model'] ?: 'glm-4'; if (env("SYSTEM_SETTING") == 'disabled') { - foreach ($keys as $item) { - if (strlen($setting[$item]) > 12) { - $setting[$item] = substr($setting[$item], 0, 4) . str_repeat('*', strlen($setting[$item]) - 8) . substr($setting[$item], -4); + foreach ($setting as $key => $item) { + if (str_contains($key, '_key')) { + $setting[$key] = substr($item, 0, 4) . str_repeat('*', strlen($item) - 8) . substr($item, -4); } } } diff --git a/app/Models/Setting.php b/app/Models/Setting.php index ae9b2e582..0cd1dfd51 100644 --- a/app/Models/Setting.php +++ b/app/Models/Setting.php @@ -51,14 +51,50 @@ class Setting extends AbstractModel $value['task_default_time'] = ['09:00', '18:00']; } break; + case 'fileSetting': $value['permission_pack_type'] = $value['permission_pack_type'] ?: 'all'; $value['permission_pack_userids'] = is_array($value['permission_pack_userids']) ? $value['permission_pack_userids'] : []; break; + + case 'aibotSetting': + if ($value['claude_token'] && empty($value['claude_key'])) { + $value['claude_key'] = $value['claude_token']; + } + $array = []; + $aiList = ['openai', 'claude', 'gemini', 'zhipu', 'qianwen', 'wenxin']; + $fieldList = ['key', 'model', 'agency', 'system', 'secret']; + foreach ($aiList as $aiName) { + foreach ($fieldList as $fieldName) { + $key = $aiName . '_' . $fieldName; + $array[$key] = $value[$key] ?: match ($key) { + 'openai_model' => 'gpt-4o-mini', + 'claude_model' => 'claude-3-5-sonnet-latest', + 'gemini_model' => 'gemini-1.5-flash', + 'zhipu_model' => 'glm-4', + 'qianwen_model' => 'qwen-turbo', + 'wenxin_model' => 'ernie-4.0-8k', + default => '', + }; + } + } + $value = $array; + break; } return $value; } + /** + * 是否开启AI + * @param $ai + * @return bool + */ + public static function AIOpen($ai = 'openai') + { + $array = Base::setting('aibotSetting'); + return !!$array[$ai . '_key']; + } + /** * 验证邮箱地址(过滤忽略地址) * @param $array diff --git a/app/Models/UserBot.php b/app/Models/UserBot.php index 3c1e55ef0..e4f94efd5 100644 --- a/app/Models/UserBot.php +++ b/app/Models/UserBot.php @@ -177,7 +177,7 @@ class UserBot extends AbstractModel ]; default: - if (preg_match('/^ai-(.*?)@bot.system$/', $email)) { + if (preg_match('/^ai-(.*?)@bot\.system$/', $email)) { return [ [ 'key' => '%3A.clear', diff --git a/app/Tasks/BotReceiveMsgTask.php b/app/Tasks/BotReceiveMsgTask.php index 4c0c5749d..e63b8b431 100644 --- a/app/Tasks/BotReceiveMsgTask.php +++ b/app/Tasks/BotReceiveMsgTask.php @@ -409,113 +409,33 @@ class BotReceiveMsgTask extends AbstractTask $userBot = null; $extras = []; $errorContent = null; - switch ($botUser->email) { - // ChatGPT 机器人 - case 'ai-openai@bot.system': - $setting = Base::setting('aibotSetting'); - $webhookUrl = "{$serverUrl}/ai/openai/send"; - $extras = [ - 'openai_key' => $setting['openai_key'], - 'openai_agency' => $setting['openai_agency'], - 'openai_model' => $setting['openai_model'], - 'server_url' => $serverUrl, - 'chunk_size' => 7, - ]; - if (empty($extras['openai_key'])) { - $errorContent = '机器人未启用。'; - } elseif (in_array($this->client['platform'], ['win', 'mac', 'web']) - && !Base::judgeClientVersion("0.29.11", $this->client['version'])) { - $errorContent = '当前客户端版本低(所需版本≥v0.29.11)。'; - } - break; - // Claude 机器人 - case 'ai-claude@bot.system': - $setting = Base::setting('aibotSetting'); - $webhookUrl = "{$serverUrl}/ai/claude/send"; - $extras = [ - 'claude_token' => $setting['claude_token'], - 'claude_agency' => $setting['claude_agency'], - 'server_url' => $serverUrl, - ]; - if (empty($extras['claude_token'])) { - $errorContent = '机器人未启用。'; - } elseif (in_array($this->client['platform'], ['win', 'mac', 'web']) - && !Base::judgeClientVersion("0.29.11", $this->client['version'])) { - $errorContent = '当前客户端版本低(所需版本≥v0.29.11)。'; - } - break; - // Wenxin 机器人 - case 'ai-wenxin@bot.system': - $setting = Base::setting('aibotSetting'); - $webhookUrl = "{$serverUrl}/ai/wenxin/send"; - $extras = [ - 'wenxin_key' => $setting['wenxin_key'], - 'wenxin_secret' => $setting['wenxin_secret'], - 'wenxin_model' => $setting['wenxin_model'], - 'server_url' => $serverUrl, - ]; - if (empty($extras['wenxin_key'])) { - $errorContent = '机器人未启用。'; - } elseif (in_array($this->client['platform'], ['win', 'mac', 'web']) - && !Base::judgeClientVersion("0.29.11", $this->client['version'])) { - $errorContent = '当前客户端版本低(所需版本≥v0.29.12)。'; - } - break; - // QianWen 机器人 - case 'ai-qianwen@bot.system': - $setting = Base::setting('aibotSetting'); - $webhookUrl = "{$serverUrl}/ai/qianwen/send"; - $extras = [ - 'qianwen_key' => $setting['qianwen_key'], - 'qianwen_model' => $setting['qianwen_model'], - 'server_url' => $serverUrl, - ]; - if (empty($extras['qianwen_key'])) { - $errorContent = '机器人未启用。'; - } elseif (in_array($this->client['platform'], ['win', 'mac', 'web']) - && !Base::judgeClientVersion("0.29.11", $this->client['version'])) { - $errorContent = '当前客户端版本低(所需版本≥v0.29.12)。'; - } - break; - // Gemini 机器人 - case 'ai-gemini@bot.system': - $setting = Base::setting('aibotSetting'); - $webhookUrl = "{$serverUrl}/ai/gemini/send"; - $extras = [ - 'gemini_key' => $setting['gemini_key'], - 'gemini_model' => $setting['gemini_model'], - 'gemini_agency' => $setting['gemini_agency'], - 'gemini_timeout' => 20, - 'server_url' => $serverUrl, - ]; - if (empty($extras['gemini_key'])) { - $errorContent = '机器人未启用。'; - } elseif (in_array($this->client['platform'], ['win', 'mac', 'web']) - && !Base::judgeClientVersion("0.29.11", $this->client['version'])) { - $errorContent = '当前客户端版本低(所需版本≥v0.29.12)。'; - } - break; - // 智谱清言 机器人 - case 'ai-zhipu@bot.system': - $setting = Base::setting('aibotSetting'); - $webhookUrl = "{$serverUrl}/ai/zhipu/send"; - $extras = [ - 'zhipu_key' => $setting['zhipu_key'], - 'zhipu_model' => $setting['zhipu_model'], - 'server_url' => $serverUrl, - ]; - if (empty($extras['zhipu_key'])) { - $errorContent = '机器人未启用。'; - } elseif (in_array($this->client['platform'], ['win', 'mac', 'web']) - && !Base::judgeClientVersion("0.29.11", $this->client['version'])) { - $errorContent = '当前客户端版本低(所需版本≥v0.29.12)。'; - } - break; - // 其他机器人 - default: - $userBot = UserBot::whereBotId($botUser->userid)->first(); - $webhookUrl = $userBot?->webhook_url; - break; + if (preg_match('/^ai-(.*?)@bot\.system$/', $botUser->email, $matches)) { + $setting = Base::setting('aibotSetting'); + $type = $matches[1]; + $extras = [ + 'model_type' => match ($type) { + 'qianwen' => 'qwen', + default => $type, + }, + 'model_name' => $setting[$type . '_model'], + 'system_message' => $setting[$type . '_system'], + 'api_key' => $setting[$type . '_key'], + 'agency' => $setting[$type . '_agency'], + 'server_url' => $serverUrl, + ]; + if ($type === 'wenxin') { + $extras['api_key'] .= ':' . $setting['wenxin_secret']; + } + if (empty($extras[$type . '_key'])) { + $errorContent = '机器人未启用。'; + } elseif (in_array($this->client['platform'], ['win', 'mac', 'web']) + && !Base::judgeClientVersion("0.29.11", $this->client['version'])) { + $errorContent = '当前客户端版本低(所需版本≥v0.29.11)。'; + } + $webhookUrl = "{$serverUrl}/ai/chat"; + } else { + $userBot = UserBot::whereBotId($botUser->userid)->first(); + $webhookUrl = $userBot?->webhook_url; } if ($errorContent) { WebSocketDialogMsg::sendMsg(null, $msg->dialog_id, 'template', [ diff --git a/docker-compose.yml b/docker-compose.yml index 16a3d375a..9d9aabed2 100755 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -167,10 +167,15 @@ services: ai: container_name: "dootask-ai-${APP_ID}" - image: "kuaifan/dooai:0.2.1" + image: "kuaifan/dootask-ai:0.0.5" + environment: + REDIS_HOST: "${REDIS_HOST}" + REDIS_PORT: "${REDIS_PORT}" networks: extnetwork: ipv4_address: "${APP_IPPR}.12" + depends_on: + - redis restart: unless-stopped okr: diff --git a/docker/nginx/default.conf b/docker/nginx/default.conf index bdb317065..24a822508 100644 --- a/docker/nginx/default.conf +++ b/docker/nginx/default.conf @@ -195,7 +195,7 @@ server { proxy_set_header Scheme $scheme; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; - proxy_pass http://ai:8881/; + proxy_pass http://ai:5001/; } } diff --git a/resources/assets/js/pages/manage/application.vue b/resources/assets/js/pages/manage/application.vue index 0a171e64a..bb84f867e 100644 --- a/resources/assets/js/pages/manage/application.vue +++ b/resources/assets/js/pages/manage/application.vue @@ -47,7 +47,7 @@ - +
{{ $L('AI 机器人') }} @@ -73,14 +73,19 @@
+ +
+ +
+
- +
- +
@@ -93,11 +98,6 @@
- -
- -
-
diff --git a/resources/assets/js/pages/manage/messenger.vue b/resources/assets/js/pages/manage/messenger.vue index eb18df809..c6100bfde 100644 --- a/resources/assets/js/pages/manage/messenger.vue +++ b/resources/assets/js/pages/manage/messenger.vue @@ -834,7 +834,7 @@ export default { } } } else if (dialog.type == 'user') { - if (this.systemConfig.server_closeai === 'close' && /^ai-(.*?)@bot.system/.test(dialog.email)) { + if (this.systemConfig.server_closeai === 'close' && /^ai-(.*?)@bot\.system/.test(dialog.email)) { return false } } diff --git a/resources/assets/js/pages/manage/setting/components/SystemAibot.vue b/resources/assets/js/pages/manage/setting/components/SystemAibot.vue index cdea4a0b1..09e290684 100644 --- a/resources/assets/js/pages/manage/setting/components/SystemAibot.vue +++ b/resources/assets/js/pages/manage/setting/components/SystemAibot.vue @@ -6,120 +6,57 @@ :rules="ruleData" v-bind="formOptions" @submit.native.prevent> -
-

ChatGPT

+
+

{{ type }}

- - -
{{$L('访问OpenAI网站查看')}}: https://platform.openai.com/account/api-keys
-
- - - - - - -
{{$L('例如:http://proxy.com 或 socks5://proxy.com')}}
-
-
-
-
-

Claude

-
- - -
{{$L('登录')}} https://claude.ai {{$L('查看 Cookie 中的 sessionKey 便是')}}
-
- - -
{{$L('例如:http://proxy.com 或 socks5://proxy.com')}}
-
-
-
-
-

文心一言 (Wenxin)

-
- - - - - - - - - - - - -
-
-
-

通义千问 (Qianwen)

-
- - - - - - - - -
-
-
-

Gemini

-
- - - - - - - - - - -
{{$L('例如:http://proxy.com 或 socks5://proxy.com')}}
-
-
-
-
-

智谱清言

-
- - - - - - - - +
@@ -131,7 +68,7 @@ export default { name: "SystemAibot", props: { type: { - default: 'all' + default: '' } }, data() { @@ -139,17 +76,247 @@ export default { loadIng: 0, formData: {}, ruleData: {}, + aiConfig: { + ChatGPT: { + fields: [ + { + label: 'API Key', + prop: 'openai_key', + type: 'password', + placeholder: 'OpenAI API Key', + tipPrefix: '访问OpenAI网站查看', + link: 'https://platform.openai.com/account/api-keys' + }, + { + label: '模型', + prop: 'openai_model', + type: 'select', + options: [ + { value: 'gpt-4' }, + { value: 'gpt-4-turbo' }, + { value: 'gpt-4o' }, + { value: 'gpt-4o-mini' }, + { value: 'gpt-3.5-turbo' }, + { value: 'gpt-3.5-turbo-16k' }, + { value: 'gpt-3.5-turbo-0125' }, + { value: 'gpt-3.5-turbo-1106' } + ], + tipPrefix: '查看说明', + link: 'https://platform.openai.com/docs/models' + }, + { + label: '使用代理', + prop: 'openai_agency', + placeholder: '支持 http 或 socks 代理', + tip: '例如:http://proxy.com 或 socks5://proxy.com' + }, + { + label: '默认提示词', + prop: 'openai_system', + type: 'textarea', + placeholder: '请输入默认提示词', + tip: '例如:你是一个人开发的AI助手' + } + ] + }, + Claude: { + fields: [ + { + label: 'API Key', + prop: 'claude_key', + type: 'password', + placeholder: 'Claude API Key', + link: 'https://docs.anthropic.com/en/api/getting-started' + }, + { + label: '模型', + prop: 'claude_model', + type: 'select', + options: [ + { value: 'claude-3-opus-20240229' }, + { value: 'claude-3-sonnet-20240229' }, + { value: 'claude-2.1' }, + { value: 'claude-2.0' } + ], + tipPrefix: '查看说明', + link: 'https://docs.anthropic.com/en/docs/about-claude/models' + }, + { + label: '使用代理', + prop: 'claude_agency', + placeholder: '支持 http 或 socks 代理', + tip: '例如:http://proxy.com 或 socks5://proxy.com' + }, + { + label: '默认提示词', + prop: 'claude_system', + type: 'textarea', + placeholder: '请输入默认提示词', + tip: '例如:你是一个人开发的AI助手' + } + ] + }, + Gemini: { + fields: [ + { + label: 'API Key', + prop: 'gemini_key', + type: 'password', + placeholder: 'Gemini API Key', + link: 'https://makersuite.google.com/app/apikey' + }, + { + label: '模型', + prop: 'gemini_model', + type: 'select', + options: [ + { value: 'gemini-pro' }, + { value: 'gemini-pro-vision' } + ], + tipPrefix: '查看说明', + link: 'https://ai.google.dev/models/gemini' + }, + { + label: '使用代理', + prop: 'gemini_agency', + placeholder: '仅支持 http 代理', + tip: '例如:http://proxy.com 或 https://proxy.com' + }, + { + label: '默认提示词', + prop: 'gemini_system', + type: 'textarea', + placeholder: '请输入默认提示词', + tip: '例如:你是一个人开发的AI助手' + } + ] + }, + Zhipu: { + fields: [ + { + label: 'API Key', + prop: 'zhipu_key', + type: 'password', + placeholder: 'Zhipu API Key', + link: 'https://bigmodel.cn/usercenter/apikeys' + }, + { + label: '模型', + prop: 'zhipu_model', + type: 'select', + options: [ + { value: 'glm-4' }, + { value: 'glm-4v' }, + { value: 'glm-3-turbo' } + ], + tipPrefix: '查看说明', + link: 'https://open.bigmodel.cn/dev/api' + }, + { + label: '使用代理', + prop: 'zhipu_agency', + placeholder: '支持 http 或 socks 代理', + tip: '例如:http://proxy.com 或 socks5://proxy.com' + }, + { + label: '默认提示词', + prop: 'zhipu_system', + type: 'textarea', + placeholder: '请输入默认提示词', + tip: '例如:你是一个人开发的AI助手' + } + ] + }, + Qianwen: { + fields: [ + { + label: 'API Key', + prop: 'qianwen_key', + type: 'password', + placeholder: 'Qianwen API Key', + link: 'https://help.aliyun.com/zh/model-studio/developer-reference/get-api-key' + }, + { + label: '模型', + prop: 'qianwen_model', + type: 'select', + options: [ + { value: 'qwen-turbo' }, + { value: 'qwen-plus' }, + { value: 'qwen-max' }, + { value: 'qwen-max-longcontext' } + ], + tipPrefix: '查看说明', + link: 'https://help.aliyun.com/zh/model-studio/getting-started/models' + }, + { + label: '使用代理', + prop: 'qianwen_agency', + placeholder: '支持 http 或 socks 代理', + tip: '例如:http://proxy.com 或 socks5://proxy.com' + }, + { + label: '默认提示词', + prop: 'qianwen_system', + type: 'textarea', + placeholder: '请输入默认提示词', + tip: '例如:你是一个人开发的AI助手' + } + ] + }, + Wenxin: { + fields: [ + { + label: 'API Key', + prop: 'wenxin_key', + type: 'password', + placeholder: 'Wenxin API Key', + link: 'https://console.bce.baidu.com/qianfan/ais/console/applicationConsole/application' + }, + { + label: 'Secret Key', + prop: 'wenxin_secret', + type: 'password', + placeholder: 'Wenxin Secret Key', + link: 'https://console.bce.baidu.com/qianfan/ais/console/applicationConsole/application' + }, + { + label: '模型', + prop: 'wenxin_model', + type: 'select', + options: [ + { value: 'ernie-bot-4' }, + { value: 'ernie-bot-8k' }, + { value: 'ernie-bot-turbo' }, + { value: 'ernie-bot' } + ], + tipPrefix: '查看说明', + link: 'https://cloud.baidu.com/doc/WENXINWORKSHOP/s/Blfmc9dlf' + }, + { + label: '使用代理', + prop: 'wenxin_agency', + placeholder: '支持 http 或 socks 代理', + tip: '例如:http://proxy.com 或 socks5://proxy.com' + }, + { + label: '默认提示词', + prop: 'wenxin_system', + type: 'textarea', + placeholder: '请输入默认提示词', + tip: '例如:你是一个人开发的AI助手' + } + ] + } + } } }, - mounted() { this.systemSetting(); }, - computed: { ...mapState(['formOptions']), }, - methods: { submitForm() { this.$refs.formData.validate((valid) => { @@ -158,11 +325,9 @@ export default { } }) }, - resetForm() { this.formData = $A.cloneJSON(this.formDatum_bak); }, - systemSetting(save) { this.loadIng++; this.$store.dispatch("call", {