20 Commits

Author SHA1 Message Date
dongpd
aa28d09d93 fix bug + thêm mẫu người mới trên thiết bị 2025-09-25 21:13:56 +07:00
9960469007 Update controllers/ApiController.php 2024-11-22 02:03:33 +00:00
6ae14302fd Bổ sung các tính năng điều khiển engine 2023-09-21 14:46:52 +07:00
d8fe80034e Update controllers/ListManagementController.php 2023-07-05 03:22:38 +00:00
7c8014ca87 Update config/params.php
update test -> 6
2023-06-30 03:42:21 +00:00
8918a58746 Update config/params.php 2023-06-30 03:24:49 +00:00
5a3074ff4a update db 2023-06-30 10:21:17 +07:00
8ec330d21d Update config/params.php 2023-06-30 02:57:04 +00:00
0dce5700b5 chmod db 2023-06-29 16:40:50 +07:00
d4cc9654d8 Update config/params.php 2023-06-29 08:49:48 +00:00
a26cf27d08 update chmod 2023-06-29 14:24:38 +07:00
c29719d73e update system information 2023-06-29 13:49:03 +07:00
e4e080266a fix bug empty logs 2023-06-19 11:30:46 +07:00
82a5b0d0ad update not insert duplicate logs 2023-06-14 13:49:01 +07:00
21cc5f2050 add logs api synclogs 2023-06-12 14:36:07 +07:00
ea202ccc3f update file_get_content timeout 2023-06-09 11:59:55 +07:00
58a5522642 fix bug exception get logs 2023-06-09 11:48:30 +07:00
476f01098f update is_connected with dynamic server 2023-01-16 15:33:02 +07:00
5450124be9 update dhcp check 2022-11-18 09:46:24 +07:00
8954a2fc25 update change up from server lite 2022-10-20 10:34:27 +07:00
26 changed files with 1167 additions and 208 deletions

View File

@@ -2,8 +2,11 @@
return [
'adminEmail' => 'admin@example.com',
"type" => "BiFace", // BiFace, BiTable
"maxLogs" => 50000,
"maxPicture" => 9999,
"version" => "1.0.7",
"autoSyncLog" => false
"autoSyncLog" => false,
"timeoutRequestServer" => 4,
"test" => 6
];

View File

@@ -58,6 +58,7 @@ class ApiController extends Controller {
public function actionGetLogs() {
if (Yii::$app->request->post()) {
Yii::$app->response->format = "json";
$post = Yii::$app->request->bodyParams;
$time = date_format(date_create_from_format('Y-m-d H:i:s', $post['time']), 'U');
$key = common::generateRandomString();
@@ -73,6 +74,11 @@ class ApiController extends Controller {
@unlink("/var/www/html/BiFace_Server_Lite/web/data/uploads/face/" . $lastLogs->image);
$lastLogs->delete();
}
$lastLogs = CaptureLogs::find()->andWhere(["staff_id" => $post['id']])->orderBy(["time" => SORT_DESC])->limit(1)->one();
if ($lastLogs && ($time - $lastLogs->time) < 1) {
file_put_contents("log_connect_server.txt", "\n[" . date("H:i:s d/m/Y") . "] duplicate face " . $post["id"], FILE_APPEND);
return ["status" => "success"];
}
$model = new CaptureLogs();
$logs = $model->create([
@@ -85,7 +91,10 @@ class ApiController extends Controller {
$ip = "https://dev-dc.beetai.com";
if ($server_ip)
$ip = $server_ip->data;
if ($this->is_connected() && $logs) {
$parseUrl = parse_url($ip);
$host = $parseUrl['host'];
$port = isset($parseUrl['port']) ? $parseUrl['port'] : 80;
if ($this->is_connected($host, $port) && $logs) {
$device_id = \app\models\SyncUrl::findOne(['key_config' => 'device_id']);
$id_camera = 0;
if ($device_id)
@@ -104,23 +113,25 @@ class ApiController extends Controller {
$data[] = "123"; //person_id
$data[] = "+7"; //timezone
$text = implode("|", $data);
$res = json_decode(file_get_contents($ip . "/api/box/face_recognition_auth_v2?token=" . $tk, false, stream_context_create([
'http' => [
'header' => "Content-Type: application/json",
'method' => "POST",
'content' => json_encode([
'image' => base64_encode(file_get_contents("/var/www/html/BiFace_Server_Lite/web/data/uploads/face/" . $fileName)),
'data' => common::rsaEncode($text),
'confidence' => isset($post["confidence"]["percent1"]) ? $post["confidence"]["percent1"] : 0
])
]
$res = json_decode(@file_get_contents($ip . "/api/box/face_recognition_auth_v2?token=" . $tk, false, stream_context_create([
'http' => [
'timeout' => Yii::$app->params['timeoutRequestServer'],
'header' => "Content-Type: application/json",
'method' => "POST",
'content' => json_encode([
'image' => base64_encode(file_get_contents("/var/www/html/BiFace_Server_Lite/web/data/uploads/face/" . $fileName)),
'data' => common::rsaEncode($text),
'confidence' => isset($post["confidence"]["percent1"]) ? $post["confidence"]["percent1"] : 0
])
]
])), true);
if ($res['status'] == 10000) {
if ($res && $res['status'] == 10000) {
$logsInfo->sync_status = 1;
$logsInfo->save();
} else {
file_put_contents("log_connect_server.txt", "\n[" . date("H:i:s d/m/Y") . "] /api/box/face_recognition_auth_v2 timeout " . $ip, FILE_APPEND);
}
}
Yii::$app->response->format = "json";
return ["status" => "success"];
}
}
@@ -337,17 +348,19 @@ class ApiController extends Controller {
public function actionSync() {
Yii::$app->response->format = "json";
if ($this->is_connected()) {
$server_ip = \app\models\SyncUrl::findOne(['key_config' => 'server_api']);
$ip = "https://dev-dc.beetai.com";
if ($server_ip)
$ip = $server_ip->data;
$server_ip = \app\models\SyncUrl::findOne(['key_config' => 'server_api']);
$ip = "https://dev-dc.beetai.com";
if ($server_ip)
$ip = $server_ip->data;
$parseUrl = parse_url($ip);
$host = $parseUrl['host'];
$port = isset($parseUrl['port']) ? $parseUrl['port'] : 80;
if ($this->is_connected($host, $port)) {
$device_id = \app\models\SyncUrl::findOne(['key_config' => 'device_id']);
$id_camera = 0;
if ($device_id)
$id_camera = intval($device_id->data);
$ls = CaptureLogs::find()->andWhere(['sync_status' => null])->all();
$tk = "";
$token = \app\models\SyncUrl::findOne(['key_config' => 'token']);
if ($token)
@@ -356,25 +369,31 @@ class ApiController extends Controller {
if (file_exists("/var/www/html/BiFace_Server_Lite/web/data/uploads/face/" . $value->image)) {
$staffInfo = ListManagement::findOne($value->staff_id);
$confidence = json_decode($value->confidence, true);
$res = json_decode(file_get_contents($ip . "/api/oem/face_recognition?token=" . $tk, false, stream_context_create([
'http' => [
'header' => "Content-Type: application/json",
'method' => "POST",
'content' => json_encode([
'image' => base64_encode(file_get_contents("/var/www/html/BiFace_Server_Lite/web/data/uploads/face/" . $value->image)),
'camera_id' => strval($id_camera),
'frametime' => date("Y-m-d H:i:s", $value->time),
'idCard' => $staffInfo ? strval($staffInfo->code) : "0",
'idObject' => $staffInfo ? $staffInfo->staff_id : "",
"person_id" => "123",
"timezone" => "+7",
'confidence' => isset($confidence['percent1']) ? floatval($confidence['percent1']) : 0
])
]
$data = [];
$data[] = strval($id_camera); //camera_id
$data[] = date("Y-m-d H:i:s", $value->time); //frametime
$data[] = $staffInfo ? strval($staffInfo->code) : "0"; //idCard
$data[] = $staffInfo ? $staffInfo->staff_id : ""; //idObject
$data[] = "123"; //person_id
$data[] = "+7"; //timezone
$text = implode("|", $data);
$res = json_decode(@file_get_contents($ip . "/api/box/face_recognition_auth_v2?token=" . $tk, false, stream_context_create([
'http' => [
'timeout' => Yii::$app->params['timeoutRequestServer'],
'header' => "Content-Type: application/json",
'method' => "POST",
'content' => json_encode([
'image' => base64_encode(file_get_contents("/var/www/html/BiFace_Server_Lite/web/data/uploads/face/" . $value->image)),
'data' => common::rsaEncode($text),
'confidence' => isset($confidence['percent1']) ? floatval($confidence['percent1']) : 0
])
]
])), true);
if ($res['status'] == 10000) {
if ($res && $res['status'] == 10000) {
$value->sync_status = 1;
$value->save();
} else {
file_put_contents("log_connect_server.txt", "\n[" . date("H:i:s d/m/Y") . "][SYNC] face_recognition_auth_v2 timeout " . $ip, FILE_APPEND);
}
} else {
$value->delete();
@@ -384,14 +403,16 @@ class ApiController extends Controller {
return ["status" => true];
}
function is_connected($ip = "google.com") {
$connected = @fsockopen($ip, 80);
//website, port (try 80 or 443)
function is_connected($host, $port) {
$connected = @fsockopen($host, $port);
//website, port (try 80 or 443)
if ($connected) {
$is_conn = true; //action when connected
fclose($connected);
// file_put_contents("log_connect_server.txt", "\n" . date("H:i:s d/m/Y") . " connected " . $host . ":" . $port, FILE_APPEND);
} else {
$is_conn = false; //action in connection failure
file_put_contents("log_connect_server.txt", "\n[" . date("H:i:s d/m/Y") . "] disconnected " . $host . ":" . $port, FILE_APPEND);
}
return $is_conn;
}
@@ -486,15 +507,18 @@ class ApiController extends Controller {
}
public function actionTest() {
// $updating = \app\models\SyncUrl::findOne(['key_config' => 'token']);
$updating = \app\models\SyncUrl::find()->all();
foreach ($updating as $key => $value) {
echo $value->key_config . " " . $value->data . "<br>";
}
exit();
$server_ip = \app\models\SyncUrl::findOne(['key_config' => 'server_api']);
$ip = "https://dev-dc.beetai.com";
if ($server_ip)
$ip = $server_ip->data;
$parseUrl = parse_url($ip);
$host = $parseUrl['host'];
$port = isset($parseUrl['port']) ? $parseUrl['port'] : 80;
$this->is_connected($host, $port);
}
public function actionReGenFeature() {
@file_get_contents("http://localhost:2305/update-feature");
\app\models\SyncUrl::deleteAll(['key_config' => 'log_process_status']);
$updating = \app\models\SyncUrl::findOne(['key_config' => 'updating']);
if (!$updating) {
@@ -583,6 +607,12 @@ class ApiController extends Controller {
if ($value['action'] == "remove_info")
$result = $this->removeInfo($value);
if ($value['action'] == "insert_door_open")
$result = $this->insertSchedule($value);
if ($value['action'] == "remove_door_open")
$result = $this->removeSchedule($value);
if ($value['action'] == "reset_all") {
\Yii::$app->db->createCommand()->truncateTable('capture_logs')->execute();
\Yii::$app->db->createCommand()->truncateTable('list_management')->execute();
@@ -593,7 +623,7 @@ class ApiController extends Controller {
if (Yii::$app->params['autoSyncLog'])
file_put_contents("logs.txt", $count . "\t" . $value['action'] . "\t" . $value['files_name'][0] . "\t" . ($result ? "true" : "false") . "\t" . $processTime . "\t" . $value['name'] . "\n", FILE_APPEND);
if (in_array($value['action'], ['insert_image', 'remove_image', 'insert_info', 'remove_info', 'reset_all'])) {
if (in_array($value['action'], ['insert_image', 'remove_image', 'insert_info', 'remove_info', 'reset_all', 'insert_door_open', 'remove_door_open'])) {
if ($result)
$infomation[] = [
"obj_Log" => $value['obj_Log'],
@@ -765,6 +795,59 @@ class ApiController extends Controller {
return false;
}
public function insertSchedule($data) {
$model = new Schedule();
$info = ListManagement::findOne(['staff_id' => $data['id']]);
$schedule = Schedule::findOne(['staff_id' => $info->id, 'id_door_calendar' => $data['id_door_calendar']]);
if ($schedule) {
$schedule->from_time = $data['time_in'];
$schedule->to_time = $data['time_out'];
$schedule->from_date = $this->formatDateSchedule($data['day_in']);
$schedule->to_date = $this->formatDateSchedule($data['day_out']);
$schedule->date_of_week = $this->formatDayOfWeekSchedule($data['day_of_week']);
return $schedule->save();
} else {
return $model->create([
'staff_id' => $info->id,
'from_time' => $data['time_in'],
'to_time' => $data['time_out'],
'from_date' => $this->formatDateSchedule($data['day_in']),
'to_date' => $this->formatDateSchedule($data['day_out']),
'date_of_week' => $this->formatDayOfWeekSchedule($data['day_of_week']),
'id_door_calendar' => $data['id_door_calendar']
]);
}
}
public function removeSchedule($data) {
$info = ListManagement::findOne(['staff_id' => $data['id']]);
if ($info) {
$schedule = \app\models\Schedule::findOne([
'id_door_calendar' => $data['id_door_calendar'],
'staff_id' => $info->id
]);
if ($schedule)
$schedule->delete();
}
return true;
}
public function formatDateSchedule($date) {
$temp = explode(" ", $date);
$parse = explode("-", $temp[0]);
return $parse[2] . "/" . $parse[1] . "/" . $parse[0];
}
public function formatDayOfWeekSchedule($dayOfWeek) {
$days = [];
$temp = explode("|", $dayOfWeek);
foreach ($temp as $key => $value) {
if ($value != "")
$days[] = intval($value) + 2;
}
return implode(",", $days);
}
public function actionCheckOpenDoor() {
if (Yii::$app->request->post()) {
$post = Yii::$app->request->bodyParams;
@@ -800,4 +883,20 @@ class ApiController extends Controller {
}
}
public function actionCheckTimeEngine() {
Yii::$app->response->format = "json";
$config_engine = ["start_at" => "00:00", "end_at" => "23:59"];
$engine_time_config = \app\models\SyncUrl::findOne(['key_config' => 'engine_time_config']);
if ($engine_time_config)
$config_engine = json_decode($engine_time_config->data, true);
$start_at = date_format(date_create_from_format('H:i:s d/m/Y', $config_engine['start_at'] . ":00 " . date("d/m/Y")), 'U');
$end_at = date_format(date_create_from_format('H:i:s d/m/Y', $config_engine['end_at'] . ":59 " . date("d/m/Y")), 'U');
$now = time();
if ($now < $start_at || $now > $end_at)
return ["status" => false];
return ["status" => true];
}
}

View File

@@ -14,9 +14,21 @@ class ConfigController extends Controller {
public function init() {
parent::init();
}
public function beforeAction($action) {
if (!parent::beforeAction($action)) {
return false;
}
Yii::$app->language = Yii::$app->session->get("language") ? Yii::$app->session->get("language")["name"] : Yii::$app->language;
if (Yii::$app->user->isGuest)
return $this->redirect(['/site/login']);
if (Yii::$app->user->isGuest) {
$this->redirect(['/site/login']);
return false;
}
return true;
}
/**
@@ -159,6 +171,10 @@ class ConfigController extends Controller {
public function actionIndex() {
$this->view->title = Yii::t("app", "CAU_HINH_MAY_CHU");
if (Yii::$app->params['type'] != "BiFace")
return $this->redirect(['cau-hinh-ip']);
if (Yii::$app->user->identity->username != "admin")
return $this->redirect(['cau-hinh-nhan-dien']);
$options = [
'http' => [
'header' => "Content-Type: application/json",
@@ -174,7 +190,8 @@ class ConfigController extends Controller {
}
return $this->render('index', [
"servermqtt" => $servermqtt === "" ? $ip . ":1883" : $servermqtt,
"url" => isset($temp[2]) ? $temp[2] : $ip . ":5001"
"url" => isset($temp[2]) ? $temp[2] : $ip . ":5001",
"menu" => $this->renderPartial("menu", ["tab" => "server_config"])
]);
}
@@ -259,6 +276,8 @@ class ConfigController extends Controller {
return true;
} else {
$this->view->title = Yii::t("app", "CAU_HINH_NHAN_DIEN");
if (Yii::$app->params['type'] != "BiFace")
return $this->redirect(['cau-hinh-ip']);
$tempConfig = json_decode(file_get_contents("http://localhost:4004/ReadEngineConfig", false, stream_context_create([
'http' => [
'header' => "Content-Type: application/json",
@@ -290,7 +309,8 @@ class ConfigController extends Controller {
$config_json = json_decode($checkConfig['data'], true);
return $this->render('config', [
"config_json" => \app\widgets\ConfigTree::widget(['configLists' => $config_json, 'isRoot' => true, 'parent_id' => 'node', 'parent_key' => ''])
"config_json" => \app\widgets\ConfigTree::widget(['configLists' => $config_json, 'isRoot' => true, 'parent_id' => 'node', 'parent_key' => '']),
"menu" => $this->renderPartial("menu", ["tab" => "engine_config"])
]);
}
}
@@ -415,6 +435,7 @@ class ConfigController extends Controller {
if (!$checkConfig['status']) {
return ['status' => false, 'text' => ''];
} else {
@file_get_contents("http://localhost:4004/SetupMedia");
return ['status' => true, 'url' => Url::to(['cau-hinh-thiet-bi'])];
}
}
@@ -422,6 +443,10 @@ class ConfigController extends Controller {
public function actionCauHinhThietBi() {
$this->view->title = Yii::t("app", "CAU_HINH_THIET_BI");
if (Yii::$app->params['type'] != "BiFace")
return $this->redirect(['cau-hinh-ip']);
if (Yii::$app->user->identity->username != "admin")
return $this->redirect(['cau-hinh-nhan-dien']);
$tempConfig = json_decode(file_get_contents("http://localhost:4004/ReadEngineConfig", false, stream_context_create([
'http' => [
@@ -452,7 +477,8 @@ class ConfigController extends Controller {
}
return $this->render('device', [
"server_api" => \app\models\SyncUrl::findOne(['key_config' => 'server_api']),
"device_id" => \app\models\SyncUrl::findOne(['key_config' => 'device_id'])
"device_id" => \app\models\SyncUrl::findOne(['key_config' => 'device_id']),
"menu" => $this->renderPartial("menu", ["tab" => "device_config"])
]);
}
@@ -486,4 +512,263 @@ class ConfigController extends Controller {
}
}
public $subnet = [
"0.0.0.0" => "/0",
"128.0.0.0" => "/1",
"192.0.0.0" => "/2",
"224.0.0.0" => "/3",
"240.0.0.0" => "/4",
"248.0.0.0" => "/5",
"252.0.0.0" => "/6",
"254.0.0.0" => "/7",
"255.0.0.0" => "/8",
"255.128.0.0" => "/9",
"255.192.0.0" => "/10",
"255.224.0.0" => "/11",
"255.240.0.0" => "/12",
"255.248.0.0" => "/13",
"255.252.0.0" => "/14",
"255.254.0.0" => "/15",
"255.255.0.0" => "/16",
"255.255.128.0" => "/17",
"255.255.192.0" => "/18",
"255.255.224.0" => "/19",
"255.255.240.0" => "/20",
"255.255.248.0" => "/21",
"255.255.252.0" => "/22",
"255.255.254.0" => "/23",
"255.255.255.0" => "/24",
"255.255.255.128" => "/25",
"255.255.255.192" => "/26",
"255.255.255.224" => "/27",
"255.255.255.240" => "/28",
"255.255.255.248" => "/29",
"255.255.255.252" => "/30",
"255.255.255.254" => "/31",
"255.255.255.255" => "/32"
];
public function actionCauHinhIp() {
if (Yii::$app->request->post()) {
Yii::$app->response->format = "json";
$post = Yii::$app->request->post();
if (!$post['dhcp'] && !isset($this->subnet[$post['subnet_mask']]))
return ["status" => false];
$post['subnet_mask'] = isset($this->subnet[$post['subnet_mask']]) ? $this->subnet[$post['subnet_mask']] : "";
$options = [
'http' => [
'header' => "Content-Type: application/json",
'method' => "POST",
'content' => json_encode($post),
]
];
json_decode(@file_get_contents("http://localhost:4004/SetIP", false, stream_context_create($options)), true);
return ["status" => true, "url" => "http://" . $post['device_ip']];
} else {
$this->view->title = Yii::t("app", "CAU_HINH_IP");
$options = [
'http' => [
'header' => "Content-Type: application/json",
'method' => "POST"
]
];
$network = json_decode(@file_get_contents("http://localhost:4004/Network", false, stream_context_create($options)), true);
return $this->render('ip', [
"menu" => $this->renderPartial("menu", ["tab" => "ip_config"]),
"network" => $network
]);
}
}
public function actionSystemInfo() {
if (Yii::$app->request->isAjax) {
Yii::$app->response->format = "json";
$options = [
'http' => [
'header' => "Content-Type: application/json",
'method' => "POST"
]
];
@file_get_contents("http://localhost:4004/Reboot", false, stream_context_create($options));
return ["status" => true];
} else {
$this->view->title = Yii::t("app", "THONG_TIN_HE_THONG");
$version = \app\models\SyncUrl::findOne(['key_config' => 'version']);
$info = $version ? $version->data : "Pro 4.27.13 (Jul 19 2021 11:49)";
$temp = explode("(", $info);
$ver = trim($temp[0]);
$build_time = str_replace(")", "", $temp[1]);
return $this->render('system-info', [
"version" => $ver,
"build_time" => $build_time
]);
}
}
public function getConfigJson() {
$tempConfig = json_decode(file_get_contents("http://localhost:4004/ReadEngineConfig", false, stream_context_create([
'http' => [
'header' => "Content-Type: application/json",
'method' => "POST"
]
])), true);
if (!$tempConfig['status'])
return $this->redirect(['/config']);
$engineConfig = json_decode($tempConfig['data'], true);
if (count($engineConfig['data']['engines']) == 0)
return $this->redirect(['/config']);
$checkConfig = json_decode(file_get_contents("http://localhost:4004/ReadConfig", false, stream_context_create([
'http' => [
'header' => "Content-Type: application/json",
'method' => "POST",
'content' => json_encode([
'path' => $engineConfig['data']['engines'][0]['path']
])
]
])), true);
if (!$checkConfig['status'])
return $this->redirect(['/config']);
$config_json = $this->config_json;
if ($checkConfig['status'])
$config_json = json_decode($checkConfig['data'], true);
return $config_json;
}
public function actionDieuKhienThietBi() {
$this->view->title = Yii::t("app", "DIEU_KHIEN_THIET_BI");
$config_json = $this->getConfigJson();
$config_engine = ["start_at" => "00:00", "end_at" => "23:59"];
$engine_time_config = \app\models\SyncUrl::findOne(['key_config' => 'engine_time_config']);
if ($engine_time_config)
$config_engine = json_decode($engine_time_config->data, true);
return $this->render('dieu-khien-thiet-bi', [
"background" => $config_json['background'],
"config_engine" => $config_engine,
"config_light" => isset($config_json['open_door']['light']) ? $config_json['open_door']['light'] : false,
"engineStatus" => json_decode(@file_get_contents("http://localhost:4004/EngineStatus"), true),
"menu" => $this->renderPartial("menu", ["tab" => "device_controller"])
]);
}
public function actionControlEngine($status) {
if (Yii::$app->request->isAjax) {
$options = [
'http' => [
'header' => "Content-Type: application/json",
'method' => "POST",
'content' => json_encode(["action" => $status]),
]
];
json_decode(@file_get_contents("http://localhost:4004/ControlEngine", false, stream_context_create($options)), true);
return $status;
}
}
public function actionSaveTimeLightConfig() {
if (Yii::$app->request->post()) {
$post = Yii::$app->request->post();
$config_json = $this->getConfigJson();
$config_json['open_door']['light'] = [
"enable" => $post['enable'],
"start_at" => $post['start_at'],
"end_at" => $post['end_at']
];
$options = [
'http' => [
'header' => "Content-Type: application/json",
'method' => "POST"
]
];
$tempConfig = json_decode(file_get_contents("http://localhost:4004/ReadEngineConfig", false, stream_context_create($options)), true);
if (!$tempConfig['status'])
return false;
$engineConfig = json_decode($tempConfig['data'], true);
$engineConfig['data']['engines'][0]['isConfig'] = "1";
file_get_contents("http://localhost:4004/SaveEngineConfig", false, stream_context_create([
'http' => [
'header' => "Content-Type: application/json",
'method' => "POST",
'content' => json_encode([
'path' => $engineConfig['data']['engines'][0]['path'],
'config' => $engineConfig,
'configEngine' => json_encode($config_json, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE)
])
]
]));
return true;
}
}
public function actionSaveTimeEngineConfig() {
if (Yii::$app->request->post()) {
$post = Yii::$app->request->post();
$engine_time_config = \app\models\SyncUrl::findOne(['key_config' => 'engine_time_config']);
$config_engine = ["start_at" => $post['start_at'], "end_at" => $post['end_at']];
if ($engine_time_config) {
$engine_time_config->data = json_encode($config_engine);
$engine_time_config->save();
} else {
$model = new \app\models\SyncUrl();
$model->create([
'key_config' => 'engine_time_config',
'data' => json_encode($config_engine)
]);
}
return true;
}
}
public function actionBackground() {
if (Yii::$app->request->post()) {
$model = new \app\models\UploadForm();
$path = "bg";
$url = $model->UploadGlobal("image", ["PNG", "JPG", "JPEG", "GIF"], $path);
$config_json = $this->getConfigJson();
$config_json['background'] = "/uploads" . $url;
$options = [
'http' => [
'header' => "Content-Type: application/json",
'method' => "POST"
]
];
$tempConfig = json_decode(file_get_contents("http://localhost:4004/ReadEngineConfig", false, stream_context_create($options)), true);
if (!$tempConfig['status'])
return false;
$engineConfig = json_decode($tempConfig['data'], true);
$engineConfig['data']['engines'][0]['isConfig'] = "1";
file_get_contents("http://localhost:4004/SaveEngineConfig", false, stream_context_create([
'http' => [
'header' => "Content-Type: application/json",
'method' => "POST",
'content' => json_encode([
'path' => $engineConfig['data']['engines'][0]['path'],
'config' => $engineConfig,
'configEngine' => json_encode($config_json, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE)
])
]
]));
return true;
}
}
public function actionSound() {
if (Yii::$app->request->post()) {
$model = new \app\models\UploadForm();
$path = "audio";
$model->UploadSound("sound", ["WAV"], $path);
return true;
}
}
}

View File

@@ -102,15 +102,15 @@ class ListManagementController extends Controller {
if ($check)
return ["status" => false];
$features = common::requestToEngine("/get-feature", [
"image_paths" => [
["url" => "/var/www/html/BiFace_Server_Lite/web/data/uploads/face/" . $data['image'], "type" => "raw"]
]
"image_paths" => [
["url" => "/var/www/html/BiFace_Server_Lite/web/data/uploads/face/" . $data['image'], "type" => "raw"]
]
]);
if (!$features['status'])
return ["status" => false];
$features = json_decode($features['data'], true);
$data['image'] = json_encode([
[
[
"url" => $data['image'],
"features" => $features['results'][0]['feature'],
"features512" => isset($features['results'][0]['feature512']) ? $features['results'][0]['feature512'] : []
@@ -149,9 +149,9 @@ class ListManagementController extends Controller {
$fileName = $url;
$features = common::requestToEngine("/get-feature", [
"image_paths" => [
["url" => "/var/www/html/BiFace_Server_Lite/web/data/uploads/face/" . $fileName, "type" => "raw"]
]
"image_paths" => [
["url" => "/var/www/html/BiFace_Server_Lite/web/data/uploads/face/" . $fileName, "type" => "raw"]
]
]);
if (!$features['status'])
return ["status" => false, "text" => Yii::t("app", "ENGINE_KHONG_HOAT_DONG")];
@@ -193,15 +193,15 @@ class ListManagementController extends Controller {
$fileName = $url;
$features = common::requestToEngine("/get-feature", [
"image_paths" => [
["url" => "/var/www/html/BiFace_Server_Lite/web/data/uploads/face/" . $fileName, "type" => "raw"]
]
"image_paths" => [
["url" => "/var/www/html/BiFace_Server_Lite/web/data/uploads/face/" . $fileName, "type" => "raw"]
]
]);
if (!$features['status'])
return ["status" => false, "text" => Yii::t("app", "ENGINE_KHONG_HOAT_DONG")];
$features = json_decode($features['data'], true);
$data['image'] = json_encode([
[
[
"url" => $fileName,
"urlOld" => $url,
"features" => $features['results'][0]['feature'],
@@ -254,9 +254,9 @@ class ListManagementController extends Controller {
$fileName = $data['image'];
$features = common::requestToEngine("/get-feature", [
"image_paths" => [
["url" => "/var/www/html/BiFace_Server_Lite/web/data/uploads/face/" . $fileName, "type" => "raw"]
]
"image_paths" => [
["url" => "/var/www/html/BiFace_Server_Lite/web/data/uploads/face/" . $fileName, "type" => "raw"]
]
]);
if (!$features['status'])
return ["status" => false, "text" => Yii::t("app", "ENGINE_KHONG_HOAT_DONG")];
@@ -297,7 +297,7 @@ class ListManagementController extends Controller {
$model = $this->findModel($data['id']);
$images = json_decode($model->image, true);
foreach ($images as $k => $v) {
unlink("/var/www/html/BiFace_Server_Lite/web/data/uploads/face/" . $v['url']);
@unlink("/var/www/html/BiFace_Server_Lite/web/data/uploads/face/" . $v['url']);
}
common::updateFeature([
"cmd" => "delete",
@@ -379,9 +379,9 @@ class ListManagementController extends Controller {
Yii::$app->response->format = "json";
$url = $model->UploadFile("AnhNhanVien", ["PNG", "JPG", "JPEG", "GIF"], "temp");
$features = common::requestToEngine("/get-feature", [
"image_paths" => [
["url" => "/var/www/html/BiFace_Server_Lite/web/" . $url, "type" => "crop"]
]
"image_paths" => [
["url" => "/var/www/html/BiFace_Server_Lite/web/" . $url, "type" => "crop"]
]
]);
if (!$features['status'])
return ["status" => false];
@@ -510,10 +510,10 @@ class ListManagementController extends Controller {
$temp["saveIMG"] = round(($finish - $start), 4);
$start = $this->getCurrentTime();
$features = common::requestToEngine("/get-feature", [
"image_paths" => [
["url" => "/var/www/html/BiFace_Server_Lite/web/data/uploads/face/" . $fileName, "type" => "raw"]
],
"type" => "128"
"image_paths" => [
["url" => "/var/www/html/BiFace_Server_Lite/web/data/uploads/face/" . $fileName, "type" => "raw"]
],
"type" => "128"
]);
if (!$features['status'])
return false;
@@ -705,12 +705,12 @@ class ListManagementController extends Controller {
$staff = ListManagement::findOne(['id' => $post['code']]);
Yii::$app->response->format = "json";
return [
"name" => $staff->name,
"gender" => $staff->gender,
"birthday" => date("d/m/Y", $staff->birthday),
"telephone" => $staff->telephone,
"department" => $staff->address,
"abbreviated_name" => $staff->abbreviated_name
"name" => $staff ? $staff->name : "",
"gender" => $staff ? $staff->gender : "",
"birthday" => $staff ? date("d/m/Y", $staff->birthday) : "",
"telephone" => $staff ? $staff->telephone : "",
"department" => $staff ? $staff->address : "",
"abbreviated_name" => $staff ? $staff->abbreviated_name : ""
];
}
}
@@ -849,12 +849,12 @@ class ListManagementController extends Controller {
if ($post['editAll'] == "true" && isset($post['lists'])) {
foreach ($post['lists'] as $key => $value) {
$schedule = \app\models\Schedule::findOne([
'from_time' => $model->from_time,
'to_time' => $model->to_time,
'from_date' => $model->from_date,
'to_date' => $model->to_date,
'date_of_week' => $model->date_of_week,
'staff_id' => $value
'from_time' => $model->from_time,
'to_time' => $model->to_time,
'from_date' => $model->from_date,
'to_date' => $model->to_date,
'date_of_week' => $model->date_of_week,
'staff_id' => $value
]);
if ($schedule) {
$schedule->from_time = $post['fromTime'];
@@ -903,12 +903,12 @@ class ListManagementController extends Controller {
if ($post['editAll'] == "true" && isset($post['lists'])) {
foreach ($post['lists'] as $key => $value) {
$schedule = \app\models\Schedule::findOne([
'from_time' => $model->from_time,
'to_time' => $model->to_time,
'from_date' => $model->from_date,
'to_date' => $model->to_date,
'date_of_week' => $model->date_of_week,
'staff_id' => $value
'from_time' => $model->from_time,
'to_time' => $model->to_time,
'from_date' => $model->from_date,
'to_date' => $model->to_date,
'date_of_week' => $model->date_of_week,
'staff_id' => $value
]);
if ($schedule)
$schedule->delete();
@@ -926,5 +926,4 @@ class ListManagementController extends Controller {
];
}
}
}

BIN
db/app.db Normal file → Executable file

Binary file not shown.

View File

@@ -8,12 +8,14 @@
return [
"CAU_HINH" => "Configuration",
"CAU_HINH_THIET_BI" => "Device Configuration",
"CAU_HINH_MAY_CHU" => "Server Configuration",
"CAU_HINH_NHAN_DIEN" => "Recognition Configuration",
"DEVICE_CONFIG" => "",
"SERVER_CONFIG" => "",
"ENGINE_CONFIG" => "",
"CAU_HINH_THIET_BI" => "Device Config",
"CAU_HINH_MAY_CHU" => "Server Config",
"CAU_HINH_NHAN_DIEN" => "Recognition Config",
"CAU_HINH_IP" => "IP Config",
"DEVICE_CONFIG" => " ",
"SERVER_CONFIG" => " ",
"ENGINE_CONFIG" => " ",
"IP_CONFIG" => " ",
"SERVER_MQTT" => "server_mqtt",
"URL" => "url",
"LUU_LAI" => "Save",
@@ -157,5 +159,22 @@ return [
"AP_DUNG_CHO_TAT_CA_DOI_TUONG_DA_CHON" => "Apply to all selected objects",
"XOA_LICH_TRINH" => "Delete schedule",
"BAN_CO_CHAC_CHAN_MUON_XOA_LICH_TRINH_NAY_KHONG" => "Are you sure you want to delete this schedule?",
"SO_SANH_MAT" => "Face comparison"
"SO_SANH_MAT" => "Face comparison",
"BAN_CO_CHAC_CHAN_MUON_DOI_IP_KHONG" => "Are you sure you want to change the device's IP address?",
"THONG_TIN_HE_THONG" => "System Information",
"REBOOT" => "Reboot",
"BAN_CO_CHAC_CHAN_MUON_REBOOT_KHONG" => "Are you sure you want to reboot?",
"DIEU_KHIEN_THIET_BI" => "Device controller",
"DEVICE_CONTROLLER" => " ",
"DIEU_KHIEN_CHUONG_TRINH_NHAN_DIEN" => "Control recognition program",
"ON" => "On",
"OFF" => "Off",
"THOI_GIAN_HOAT_DONG_CUA_THIET_BI" => "Device operating time",
"THOI_GIAN_BAT_DEN" => "Time to turn on the light",
"BACKGROUND" => "Background",
"BACKGROUND_DESCRIPTION" => "Maximum size 3.5MB (recommended resolution 1280x640px)",
"AM_THANH" => "Sound",
"THOI_GIAN_KHONG_DUOC_DE_TRONG" => "Time cannot be left blank",
"THONG_TIN_DA_DUOC_LUU_LAI" => "The information has been saved",
"CHON_AM_THANH" => "Select sound"
];

View File

@@ -11,9 +11,11 @@ return [
"CAU_HINH_THIET_BI" => "デバイス構成",
"CAU_HINH_MAY_CHU" => " サーバ構成",
"CAU_HINH_NHAN_DIEN" => "認識構成",
"CAU_HINH_IP" => "IP 構成",
"DEVICE_CONFIG" => "Device config",
"SERVER_CONFIG" => "Server config",
"ENGINE_CONFIG" => "Engine config",
"IP_CONFIG" => "IP config",
"SERVER_MQTT" => "server_mqtt",
"URL" => "url",
"LUU_LAI" => "保存する",
@@ -157,5 +159,22 @@ return [
"AP_DUNG_CHO_TAT_CA_DOI_TUONG_DA_CHON" => "選択したすべてのオブジェクトに適用",
"XOA_LICH_TRINH" => "スケジュールを削除",
"BAN_CO_CHAC_CHAN_MUON_XOA_LICH_TRINH_NAY_KHONG" => "このスケジュールを削除してもよろしいですか?",
"SO_SANH_MAT" => "顔比較"
"SO_SANH_MAT" => "顔比較",
"BAN_CO_CHAC_CHAN_MUON_DOI_IP_KHONG" => "デバイスの IP アドレスを変更してもよろしいですか?",
"THONG_TIN_HE_THONG" => "システムインフォメーション",
"REBOOT" => "リブート",
"BAN_CO_CHAC_CHAN_MUON_REBOOT_KHONG" => "再起動してもよろしいですか?",
"DIEU_KHIEN_THIET_BI" => "コントローラ",
"DEVICE_CONTROLLER" => "Device controller",
"DIEU_KHIEN_CHUONG_TRINH_NHAN_DIEN" => "制御認識プログラム",
"ON" => "On",
"OFF" => "Off",
"THOI_GIAN_HOAT_DONG_CUA_THIET_BI" => "デバイスの動作時間",
"THOI_GIAN_BAT_DEN" => "ライトをつける時間です",
"BACKGROUND" => "背景",
"BACKGROUND_DESCRIPTION" => "最大サイズ 3.5MB (推奨解像度 1280x640px)",
"AM_THANH" => "",
"THOI_GIAN_KHONG_DUOC_DE_TRONG" => "時間を空白のままにすることはできません",
"THONG_TIN_DA_DUOC_LUU_LAI" => "情報が保存されました",
"CHON_AM_THANH" => "サウンドを選択する"
];

View File

@@ -11,9 +11,11 @@ return [
"CAU_HINH_THIET_BI" => "Cấu hình thiết bị",
"CAU_HINH_MAY_CHU" => "Cấu hình máy chủ",
"CAU_HINH_NHAN_DIEN" => "Cấu hình nhận diện",
"CAU_HINH_IP" => "Cấu hình IP",
"DEVICE_CONFIG" => "Device config",
"SERVER_CONFIG" => "Server config",
"ENGINE_CONFIG" => "Engine config",
"IP_CONFIG" => "IP config",
"SERVER_MQTT" => "server_mqtt",
"URL" => "url",
"LUU_LAI" => "Lưu lại",
@@ -157,5 +159,22 @@ return [
"AP_DUNG_CHO_TAT_CA_DOI_TUONG_DA_CHON" => "Áp dụng cho tất cả đối tượng đã chọn",
"XOA_LICH_TRINH" => "Xóa lịch trình",
"BAN_CO_CHAC_CHAN_MUON_XOA_LICH_TRINH_NAY_KHONG" => "Bạn có chắc chắn muốn xóa lịch trình này không?",
"SO_SANH_MAT" => "So sánh mặt"
"SO_SANH_MAT" => "So sánh mặt",
"BAN_CO_CHAC_CHAN_MUON_DOI_IP_KHONG" => "Bạn có chắc chắn muốn thay đổi địa chỉ IP của thiết bị không?",
"THONG_TIN_HE_THONG" => "Thông tin hệ thống",
"REBOOT" => "Khởi động lại thiết bị",
"BAN_CO_CHAC_CHAN_MUON_REBOOT_KHONG" => "Bạn có chắc chắn muốn khởi động lại thiết bị không?",
"DIEU_KHIEN_THIET_BI" => "Điều khiển thiết bị",
"DEVICE_CONTROLLER" => "Device controller",
"DIEU_KHIEN_CHUONG_TRINH_NHAN_DIEN" => "Điều khiển chương trình nhận diện",
"ON" => "Bật",
"OFF" => "Tắt",
"THOI_GIAN_HOAT_DONG_CUA_THIET_BI" => "Thời gian hoạt động của thiết bị",
"THOI_GIAN_BAT_DEN" => "Thời gian bật đèn",
"BACKGROUND" => "Hình nền",
"BACKGROUND_DESCRIPTION" => "Kích thước tối đa 3.5MB (độ phân giải khuyến nghị 1280x640px)",
"AM_THANH" => "Âm thanh",
"THOI_GIAN_KHONG_DUOC_DE_TRONG" => "Thời gian không được để trống",
"THONG_TIN_DA_DUOC_LUU_LAI" => "Thông tin đã được lưu lại",
"CHON_AM_THANH" => "Chọn âm thanh"
];

View File

@@ -131,6 +131,33 @@ class UploadForm extends Model {
}
}
public function UploadSound($file, $fileTypes, $path) {
$root = \Yii::getAlias('@app') . '/web/data';
$LocalPath = "/" . $path;
$RootFolder = $root . $LocalPath;
$destfile = "welcome_en.wav";
if (!empty($_FILES)) {
$tempFile = $_FILES[$file]['tmp_name'];
$targetPath = $RootFolder;
if (!file_exists($targetPath)) {
@mkdir($targetPath, 0777, true);
}
$targetFile = $targetPath . '/' . $destfile;
$targetFileLocal = $LocalPath . '/' . $destfile;
$fileParts = pathinfo($_FILES[$file]['name']);
if (in_array(strtoupper($fileParts['extension']), $fileTypes)) {
move_uploaded_file($tempFile, $targetFile);
if (file_exists($targetFile)) {
return $targetFileLocal;
} else {
return false;
}
} else {
return 2;
}
}
}
//Move file
public function MoveFile($file, $folder) {
$currentStorage = Storage::findOne(['stt' => 1])->folder;

View File

@@ -1,7 +1,7 @@
copy.src.files=false
copy.src.on.open=false
copy.src.target=
remote.connection=BiFace-99bab6
remote.connection=tungbt-c365ac
remote.directory=/BiFace_Server_Lite
remote.upload=ON_SAVE
run.as=REMOTE

0
runtime/temp.txt Normal file → Executable file
View File

View File

@@ -36,31 +36,40 @@ use yii\widgets\ActiveForm;
<!-- Collect the nav links, forms, and other content for toggling -->
<div class="collapse navbar-collapse pull-left" id="navbar-collapse">
<ul class="nav navbar-nav">
<li class="<?php if (Yii::$app->controller->id == "config") echo "active"; ?>">
<li class="<?php if (Yii::$app->controller->id == "config" && Yii::$app->controller->action->id != "system-info") echo "active"; ?>">
<a href="<?php echo yii\helpers\Url::to(['/config/cau-hinh-thiet-bi']); ?>">
<i class="fa fa-cogs"></i> <?php echo Yii::t("app", "CAU_HINH"); ?>
</a>
</li>
<li>
<a href="<?php echo yii\helpers\Url::to(['/config/reset']); ?>" onclick="common.resetForm(this);return false;">
<i class="fa fa-refresh"></i> <?php echo Yii::t("app", "RESET_THIET_BI"); ?>
</a>
</li>
<li class="<?php if (Yii::$app->controller->id == "list-management") echo "active"; ?>">
<a href="<?php echo yii\helpers\Url::to(['/list-management']); ?>">
<i class="fa fa-list"></i> <?php echo Yii::t("app", "QUAN_LY_MAU"); ?>
</a>
</li>
<li class="dropdown <?php if (in_array(Yii::$app->controller->id, ['capture-logs', 'control-logs'])) echo "active"; ?>">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" aria-expanded="false">
<i class="fa fa-list-alt"></i> <?php echo Yii::t("app", "LICH_SU_HE_THONG"); ?>
</a>
<ul class="dropdown-menu" role="menu">
<li><a href="<?php echo \yii\helpers\Url::to(['/capture-logs']); ?>"><i class="fa fa-camera"></i> <?php echo Yii::t("app", "LICH_SU_HE_THONG"); ?></a></li>
<li><a href="<?php echo \yii\helpers\Url::to(['/control-logs']); ?>"><i class="fa fa-database"></i> <?php echo Yii::t("app", "DANH_SACH_NHAN_DIEN"); ?></a></li>
<li><a href="<?php echo \yii\helpers\Url::to(['/capture-logs/face-comparison']); ?>"><i class="fa fa-users"></i> <?php echo Yii::t("app", "SO_SANH_MAT"); ?></a></li>
</ul>
</li>
<?php if (Yii::$app->params['type'] === "BiFace") { ?>
<?php if (Yii::$app->user->identity->username == "admin") { ?>
<li>
<a href="<?php echo yii\helpers\Url::to(['/config/reset']); ?>" onclick="common.resetForm(this);return false;">
<i class="fa fa-refresh"></i> <?php echo Yii::t("app", "RESET_THIET_BI"); ?>
</a>
</li>
<?php } ?>
<li class="<?php if (Yii::$app->controller->id == "list-management") echo "active"; ?>">
<a href="<?php echo yii\helpers\Url::to(['/list-management']); ?>">
<i class="fa fa-list"></i> <?php echo Yii::t("app", "QUAN_LY_MAU"); ?>
</a>
</li>
<li class="dropdown <?php if (in_array(Yii::$app->controller->id, ['capture-logs', 'control-logs'])) echo "active"; ?>">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" aria-expanded="false">
<i class="fa fa-list-alt"></i> <?php echo Yii::t("app", "LICH_SU_HE_THONG"); ?>
</a>
<ul class="dropdown-menu" role="menu">
<li><a href="<?php echo \yii\helpers\Url::to(['/capture-logs']); ?>"><i class="fa fa-camera"></i> <?php echo Yii::t("app", "LICH_SU_HE_THONG"); ?></a></li>
<li><a href="<?php echo \yii\helpers\Url::to(['/control-logs']); ?>"><i class="fa fa-database"></i> <?php echo Yii::t("app", "DANH_SACH_NHAN_DIEN"); ?></a></li>
<li><a href="<?php echo \yii\helpers\Url::to(['/capture-logs/face-comparison']); ?>"><i class="fa fa-users"></i> <?php echo Yii::t("app", "SO_SANH_MAT"); ?></a></li>
</ul>
</li>
<li class="<?php if (Yii::$app->controller->id == "config" && Yii::$app->controller->action->id == "system-info") echo "active"; ?>">
<a href="<?php echo yii\helpers\Url::to(['/config/system-info']); ?>">
<i class="fa fa-info-circle"></i> <?php echo Yii::t("app", "THONG_TIN_HE_THONG"); ?>
</a>
</li>
<?php } ?>
</ul>
</div>
<div class="navbar-custom-menu">

View File

@@ -49,7 +49,7 @@
'format' => "raw",
'contentOptions' => ['class' => 'text-center'],
'headerOptions' => ['class' => 'text-center'],
'value' => \app\helpers\CaptureLogsGrid::image()
'value' => \app\helpers\CaptureLogsGrid::image(true)
],
[
'attribute' => 'confidence',

View File

@@ -142,32 +142,8 @@
<div class="container-fluid">
<br>
<div class="row">
<div class="col-md-8">
<div class="mt-element-step">
<div class="row step-thin">
<div class="col-md-4 bg-grey mt-step-col">
<div class="mt-step-number bg-white font-grey">1</div>
<div class="mt-step-title uppercase font-grey-cascade" style="cursor: pointer;" onclick="window.location = '{Url::to(['/config/cau-hinh-thiet-bi'])}';">
{Yii::t("app", "CAU_HINH_THIET_BI")}
</div>
<div class="mt-step-content font-grey-cascade">{Yii::t("app", "DEVICE_CONFIG")}</div>
</div>
<div class="col-md-4 bg-grey mt-step-col">
<div class="mt-step-number bg-white font-grey">2</div>
<div class="mt-step-title uppercase font-grey-cascade" style="cursor: pointer;" onclick="window.location = '{Url::to(['/config'])}';">
{Yii::t("app", "CAU_HINH_MAY_CHU")}
</div>
<div class="mt-step-content font-grey-cascade">{Yii::t("app", "SERVER_CONFIG")}</div>
</div>
<div class="col-md-4 bg-grey mt-step-col active">
<div class="mt-step-number bg-white font-grey">3</div>
<div class="mt-step-title uppercase font-grey-cascade" style="cursor: pointer;" onclick="window.location = '{Url::to(['/config/cau-hinh-nhan-dien'])}';">
{Yii::t("app", "CAU_HINH_NHAN_DIEN")}
</div>
<div class="mt-step-content font-grey-cascade">{Yii::t("app", "ENGINE_CONFIG")}</div>
</div>
</div>
</div>
<div class="col-md-12">
{$menu}
</div>
</div>
<br>

View File

@@ -16,32 +16,8 @@
<div class="container-fluid">
<br>
<div class="row">
<div class="col-md-8">
<div class="mt-element-step">
<div class="row step-thin">
<div class="col-md-4 bg-grey mt-step-col active">
<div class="mt-step-number bg-white font-grey">1</div>
<div class="mt-step-title uppercase font-grey-cascade" style="cursor: pointer;" onclick="window.location = '{Url::to(['/config/cau-hinh-thiet-bi'])}';">
{Yii::t("app", "CAU_HINH_THIET_BI")}
</div>
<div class="mt-step-content font-grey-cascade">{Yii::t("app", "DEVICE_CONFIG")}</div>
</div>
<div class="col-md-4 bg-grey mt-step-col">
<div class="mt-step-number bg-white font-grey">2</div>
<div class="mt-step-title uppercase font-grey-cascade" style="cursor: pointer;" onclick="window.location = '{Url::to(['/config'])}';">
{Yii::t("app", "CAU_HINH_MAY_CHU")}
</div>
<div class="mt-step-content font-grey-cascade">{Yii::t("app", "SERVER_CONFIG")}</div>
</div>
<div class="col-md-4 bg-grey mt-step-col">
<div class="mt-step-number bg-white font-grey">3</div>
<div class="mt-step-title uppercase font-grey-cascade" style="cursor: pointer;" onclick="window.location = '{Url::to(['/config/cau-hinh-nhan-dien'])}';">
{Yii::t("app", "CAU_HINH_NHAN_DIEN")}
</div>
<div class="mt-step-content font-grey-cascade">{Yii::t("app", "ENGINE_CONFIG")}</div>
</div>
</div>
</div>
<div class="col-md-12">
{$menu}
</div>
</div>
<br>

View File

@@ -0,0 +1,114 @@
{extends file=$smarty.current_dir|cat:'/../extends.tpl'}
{use class="yii\helpers\Url"}
{use class="app\assets\ConfigAsset"}
{ConfigAsset::register($this)|void}
{block name='content'}
<style>
.input-group{
width: 100%;
}
.table-striped > tbody > tr:nth-of-type(odd) {
background-color: #d1d1d1;
}
.form-group{
margin: 0;
}
</style>
<div class="container-fluid">
<br>
<div class="row">
<div class="col-md-12">
{$menu}
</div>
</div>
<br>
<div class="row">
<div class="col-md-4 col-md-push-1">
<table class="table table-bordered table-striped" style="background: #fff;">
<tbody>
<tr>
<th style="width: 50%;">{Yii::t("app","DIEU_KHIEN_CHUONG_TRINH_NHAN_DIEN")}</th>
<td>
<div class="btn-group">
<button class="btn-control-engine btn btn-{if $engineStatus.status}success{else}default{/if}" onclick="controlEngine(this);" data-href="{Url::to(['control-engine', 'status'=>"on"])}">
{Yii::t("app","ON")}
</button>
<button class="btn-control-engine btn btn-{if $engineStatus.status}default{else}danger{/if}" onclick="controlEngine(this);" data-href="{Url::to(['control-engine', 'status'=>"off"])}">
{Yii::t("app","OFF")}
</button>
</div>
</td>
</tr>
<tr>
<th>{Yii::t("app","THOI_GIAN_HOAT_DONG_CUA_THIET_BI")}</th>
<td>
<div class="form-group">
<div class="input-group">
<div class="input-group-addon">{Yii::t("app","FROM")}</div>
<input type="text" class="form-control" name="EngineBegin" id="EngineBegin" value="{$config_engine.start_at|default:""}">
<div class="input-group-addon">{Yii::t("app","TO")}</div>
<input type="text" class="form-control" name="EngineEnd" id="EngineEnd" value="{$config_engine.end_at|default:""}">
<div class="input-group-btn">
<button id='btn-save-light' class="btn btn-primary" onclick="saveTimeEngineConfig(this);" data-href="{Url::to(['save-time-engine-config'])}">
<i class="fa fa-floppy-o"></i>
</button>
</div>
</div>
</div>
</td>
</tr>
<tr>
<th>{Yii::t("app","THOI_GIAN_BAT_DEN")}</th>
<td>
<div class="btn-group">
<button class="btn-control-light btn btn-{if $config_light.enable==="1"}success{else}default{/if}" onclick="controlSetupLight(this, true);">
{Yii::t("app","ON")}
</button>
<button class="btn-control-light btn btn-{if $config_light.enable==="1"}default{else}danger{/if}" onclick="controlSetupLight(this, false);">
{Yii::t("app","OFF")}
</button>
</div>
<div id="time-light-config" class="form-group {if $config_light.enable==="0"}hidden{/if}">
<div class="input-group">
<div class="input-group-addon">{Yii::t("app","FROM")}</div>
<input type="text" class="form-control" name="LightBegin" id="LightBegin" value="{$config_light.start_at|default:""}">
<div class="input-group-addon">{Yii::t("app","TO")}</div>
<input type="text" class="form-control" name="LightEnd" id="LightEnd" value="{$config_light.end_at|default:""}">
<div class="input-group-btn">
<button id='btn-save-light' class="btn btn-primary" onclick="saveTimeLightConfig(this);" data-href="{Url::to(['save-time-light-config'])}" data-enable='{$config_light.enable}'>
<i class="fa fa-floppy-o"></i>
</button>
</div>
</div>
</div>
</td>
</tr>
<tr>
<th>{Yii::t("app","BACKGROUND")}</th>
<td>
<input type="file" name="image" id="image">
<input type="hidden" name="url_upload_background" value="{Url::to(['background'])}">
<div>
{if $background!=""}
<img src="/data{$background}" width="100%" class="img-thumbnail">
{/if}
<i class="text-red"><span class="fa fa-info-circle"></span> {Yii::t("app","BACKGROUND_DESCRIPTION")}</i>
</div>
</td>
</tr>
<tr>
<th>{Yii::t("app","AM_THANH")}</th>
<td>
<input type="file" name="sound" id="sound">
<input type="hidden" name="url_upload_sound" value="{Url::to(['sound'])}">
<div>
<a href="/data/audio/welcome_en.wav">welcome_en.wav</a>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
{/block}

View File

@@ -16,32 +16,8 @@
<div class="container-fluid">
<br>
<div class="row">
<div class="col-md-8">
<div class="mt-element-step">
<div class="row step-thin">
<div class="col-md-4 bg-grey mt-step-col">
<div class="mt-step-number bg-white font-grey">1</div>
<div class="mt-step-title uppercase font-grey-cascade" style="cursor: pointer;" onclick="window.location = '{Url::to(['/config/cau-hinh-thiet-bi'])}';">
{Yii::t("app", "CAU_HINH_THIET_BI")}
</div>
<div class="mt-step-content font-grey-cascade">{Yii::t("app", "DEVICE_CONFIG")}</div>
</div>
<div class="col-md-4 bg-grey mt-step-col active">
<div class="mt-step-number bg-white font-grey">2</div>
<div class="mt-step-title uppercase font-grey-cascade" style="cursor: pointer;" onclick="window.location = '{Url::to(['/config'])}';">
{Yii::t("app", "CAU_HINH_MAY_CHU")}
</div>
<div class="mt-step-content font-grey-cascade">{Yii::t("app", "SERVER_CONFIG")}</div>
</div>
<div class="col-md-4 bg-grey mt-step-col">
<div class="mt-step-number bg-white font-grey">3</div>
<div class="mt-step-title uppercase font-grey-cascade" style="cursor: pointer;" onclick="window.location = '{Url::to(['/config/cau-hinh-nhan-dien'])}';">
{Yii::t("app", "CAU_HINH_NHAN_DIEN")}
</div>
<div class="mt-step-content font-grey-cascade">{Yii::t("app", "ENGINE_CONFIG")}</div>
</div>
</div>
</div>
<div class="col-md-12">
{$menu}
</div>
</div>
<br>

68
views/config/ip.tpl Normal file
View File

@@ -0,0 +1,68 @@
{extends file=$smarty.current_dir|cat:'/../extends.tpl'}
{use class="yii\helpers\Url"}
{use class="yii\grid\GridView"}
{use class="app\assets\ConfigAsset"}
{ConfigAsset::register($this)|void}
{block name='content'}
<style>
.input-group-addon{
width: 120px;
font-weight: bold;
}
.input-group{
width: 100%;
}
</style>
<div class="container-fluid">
<br>
<div class="row">
<div class="col-md-12">
{$menu}
</div>
</div>
<br>
<div class="row">
<div class="col-md-3">
<div class="form-group" id="dhcp">
<input type='checkbox' name='dhcp' id='dhcp_check' value="" {if $network.dhcp=="yes"}checked=""{/if}> DHCP
</div>
<div class="form-group" id="device_ip">
<div class="input-group">
<div class="input-group-addon">{Yii::t("app", "IP Address")}</div>
<input type="input" class="form-control" name="device_ip" value="{$network.ip_address|default:""}">
</div>
</div>
<div class="form-group" id="subnet_mask">
<div class="input-group">
<div class="input-group-addon">{Yii::t("app", "Subnet Mask")}</div>
<input type="input" class="form-control" name="subnet_mask" value="{$network.subnet_mask|default:""}">
</div>
</div>
<div class="form-group" id="gateway">
<div class="input-group">
<div class="input-group-addon">{Yii::t("app", "Gateway")}</div>
<input type="input" class="form-control" name="gateway" value="{$network.gateway|default:""}">
</div>
</div>
<div class="form-group" id="dns1">
<div class="input-group">
<div class="input-group-addon">{Yii::t("app", "DNS1")}</div>
<input type="input" class="form-control" name="dns1" value="{$network.dns1|default:""}">
</div>
</div>
<div class="form-group" id="dns2">
<div class="input-group">
<div class="input-group-addon">{Yii::t("app", "DNS2")}</div>
<input type="input" class="form-control" name="dns2" value="{$network.dns2|default:""}">
</div>
</div>
<div class="text-center">
<button class="btn btn-primary" onclick="changeIP(this);" data-href="{Url::to(['/config/cau-hinh-ip'])}">
<i class="fa fa-floppy-o"></i> {Yii::t("app", "LUU_LAI")}
</button>
</div>
</div>
</div>
</div>
</div>
{/block}

45
views/config/menu.tpl Normal file
View File

@@ -0,0 +1,45 @@
{use class="yii\helpers\Url"}
{if Yii::$app->params["type"]==="BiFace"}
{$username=Yii::$app->user->identity->username}
<div class="mt-element-step">
<div class="row step-thin">
{if $username=='admin'}
<div class="col-md-2 bg-grey mt-step-col {if $tab=="device_config"}active{/if}">
<div class="mt-step-number bg-white font-grey">1</div>
<div class="mt-step-title uppercase font-grey-cascade" style="cursor: pointer;" onclick="window.location = '{Url::to(['/config/cau-hinh-thiet-bi'])}';">
{Yii::t("app", "CAU_HINH_THIET_BI")}
</div>
<div class="mt-step-content font-grey-cascade">{Yii::t("app", "DEVICE_CONFIG")}</div>
</div>
<div class="col-md-2 bg-grey mt-step-col {if $tab=="server_config"}active{/if}">
<div class="mt-step-number bg-white font-grey">2</div>
<div class="mt-step-title uppercase font-grey-cascade" style="cursor: pointer;" onclick="window.location = '{Url::to(['/config'])}';">
{Yii::t("app", "CAU_HINH_MAY_CHU")}
</div>
<div class="mt-step-content font-grey-cascade">{Yii::t("app", "SERVER_CONFIG")}</div>
</div>
{/if}
<div class="col-md-2 bg-grey mt-step-col {if $tab=="engine_config"}active{/if}">
<div class="mt-step-number bg-white font-grey">{if $username=='admin'}3{else}1{/if}</div>
<div class="mt-step-title uppercase font-grey-cascade" style="cursor: pointer;" onclick="window.location = '{Url::to(['/config/cau-hinh-nhan-dien'])}';">
{Yii::t("app", "CAU_HINH_NHAN_DIEN")}
</div>
<div class="mt-step-content font-grey-cascade">{Yii::t("app", "ENGINE_CONFIG")}</div>
</div>
<div class="col-md-2 bg-grey mt-step-col {if $tab=="ip_config"}active{/if}">
<div class="mt-step-number bg-white font-grey">{if $username=='admin'}4{else}2{/if}</div>
<div class="mt-step-title uppercase font-grey-cascade" style="cursor: pointer;" onclick="window.location = '{Url::to(['/config/cau-hinh-ip'])}';">
{Yii::t("app", "CAU_HINH_IP")}
</div>
<div class="mt-step-content font-grey-cascade">{Yii::t("app", "IP_CONFIG")}</div>
</div>
<div class="col-md-2 bg-grey mt-step-col {if $tab=="device_controller"}active{/if}">
<div class="mt-step-number bg-white font-grey">{if $username=='admin'}5{else}3{/if}</div>
<div class="mt-step-title uppercase font-grey-cascade" style="cursor: pointer;" onclick="window.location = '{Url::to(['/config/dieu-khien-thiet-bi'])}';">
{Yii::t("app", "DIEU_KHIEN_THIET_BI")}
</div>
<div class="mt-step-content font-grey-cascade">{Yii::t("app", "DEVICE_CONTROLLER")}</div>
</div>
</div>
</div>
{/if}

View File

@@ -0,0 +1,57 @@
{extends file=$smarty.current_dir|cat:'/../extends.tpl'}
{use class="yii\helpers\Url"}
{use class="app\assets\ConfigAsset"}
{ConfigAsset::register($this)|void}
{block name='content'}
<style>
.input-group-addon{
width: 120px;
font-weight: bold;
}
.input-group{
width: 100%;
}
.table-striped > tbody > tr:nth-of-type(odd) {
background-color: #d1d1d1;
}
</style>
<div class="container-fluid">
<br>
<div class="row">
<div class="col-md-3 col-md-push-1">
<table class="table table-bordered table-striped" style="background: #fff;">
<thead>
<tr style="background-color: #3c8dbc;color:#fff;">
<th colspan="2">{Yii::t("app", "THONG_TIN_HE_THONG")|upper}</th>
</tr>
</thead>
<tbody>
<tr>
<th>CPU</th>
<td>ARM Mali-450 penta-core</td>
</tr>
<tr>
<th>MemTotal</th>
<td>2.0 GiB</td>
</tr>
<tr>
<th>DiskTotal</th>
<td>16.0 GiB</td>
</tr>
<tr>
<th>Software version number</th>
<td>{$version}</td>
</tr>
<tr>
<th>Build time</th>
<td>{$build_time}</td>
</tr>
</tbody>
</table>
<button class="btn btn-danger" onclick="reboot(this);" data-href="{Url::to(['system-info'])}">
<i class="fa fa-refresh"></i> {Yii::t("app","REBOOT")}
</button>
</div>
</div>
</div>
{/block}

View File

@@ -32,6 +32,11 @@
<input type="hidden" name="ENGINE_KHONG_HOAT_DONG" value="{Yii::t("app", "ENGINE_KHONG_HOAT_DONG")}">
<input type="hidden" name="HAY_CHON_DOI_TUONG_DE_GAN_LICH_TRINH" value="{Yii::t("app", "HAY_CHON_DOI_TUONG_DE_GAN_LICH_TRINH")}">
<input type="hidden" name="BAN_CO_CHAC_CHAN_MUON_XOA_LICH_TRINH_NAY_KHONG" value="{Yii::t("app", "BAN_CO_CHAC_CHAN_MUON_XOA_LICH_TRINH_NAY_KHONG")}">
<input type="hidden" name="BAN_CO_CHAC_CHAN_MUON_DOI_IP_KHONG" value="{Yii::t("app", "BAN_CO_CHAC_CHAN_MUON_DOI_IP_KHONG")}">
<input type="hidden" name="BAN_CO_CHAC_CHAN_MUON_REBOOT_KHONG" value="{Yii::t("app", "BAN_CO_CHAC_CHAN_MUON_REBOOT_KHONG")}">
<input type="hidden" name="THOI_GIAN_KHONG_DUOC_DE_TRONG" value="{Yii::t("app", "THOI_GIAN_KHONG_DUOC_DE_TRONG")}">
<input type="hidden" name="THONG_TIN_DA_DUOC_LUU_LAI" value="{Yii::t("app", "THONG_TIN_DA_DUOC_LUU_LAI")}">
<input type="hidden" name="CHON_AM_THANH" value="{Yii::t("app", "CHON_AM_THANH")}">
<div id="blocking" class="fade modal" role="dialog" tabindex="-1">
<div class="modal-dialog" style="top: 50%;margin-top: -45px;">
@@ -46,6 +51,19 @@
</div>
</div>
</div>
<div id="reboot-blocking" class="fade modal" role="dialog" tabindex="-1">
<div class="modal-dialog" style="top: 50%;margin-top: -45px;">
<div class="modal-content" style="background-color: transparent;box-shadow: none;">
<div class="modal-body">
<div id='modelContent' class="text-center">
<i class="fa fa-spinner fa-pulse fa-5x fa-fw" style="color: #fff;"></i>
<br>
<b style="color: #fff;font-size: 25px;">Đang khởi động lại thiết bị, vui lòng chờ trong vài phút và tải lại trang!</b>
</div>
</div>
</div>
</div>
</div>
<div id="uploadBlock" class="fade modal" role="dialog" tabindex="-1">
<div class="modal-dialog" style="top: 50%;margin-top: -45px;">
<div class="modal-content" style="background-color: transparent;box-shadow: none;">

0
web/assets/temp.txt Normal file → Executable file
View File

View File

@@ -1,8 +1,8 @@
<?php
// comment out the following two lines when deployed to production
//defined('YII_DEBUG') or define('YII_DEBUG', true);
//defined('YII_ENV') or define('YII_ENV', 'dev');
defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'dev');
require __DIR__ . '/../vendor/autoload.php';
require __DIR__ . '/../vendor/yiisoft/yii2/Yii.php';

View File

@@ -1,7 +1,24 @@
$(function () {
common.dateTimePickerByClass("datepicker", "HH:mm DD/MM/YYYY");
common.dateTimePickerDay("birthday");
$("#Code").select2();
$("#Code").select2({
tags: true,
createTag: function (params) {
return {
id: params.term,
text: params.term,
newOption: true
};
},
templateResult: function (data) {
var $result = $("<span></span>");
$result.text(data.text);
if (data.newOption) {
$result.append(" <em>(Thêm mới)</em>");
}
return $result;
}
});
$("input[name='AllData']").change(function () {
if ($('input[name=AllData]').is(':checked')) {
window.location = $("input[name='URL']").val() + "?all=true" + "&from=" + $("input[name='From']").val() + "&to=" + $("input[name='To']").val();
@@ -26,6 +43,12 @@ function _form(e) {
var confidence = JSON.parse($(e).attr("data-confidence"));
$("#closest-img").attr("src", confidence.img != "" ? confidence.img : "/images/user2-160x160.jpg");
$("#closest-name").html(confidence.name + " [" + confidence.score + "]");
clearData();
}
function clearData() {
$('#Code').val("").trigger('change');
}
function _close() {

View File

@@ -1,5 +1,10 @@
$(function () {
common.dateTimePickerHour("LightBegin");
common.dateTimePickerHour("LightEnd");
common.dateTimePickerHour("EngineBegin");
common.dateTimePickerHour("EngineEnd");
btnBackground($("input[name='url_upload_background']").val(), "", '.png,.jpg,.jpeg,.gif', 3.5);
btnSound($("input[name='url_upload_sound']").val(), "", '.wav', 3.5);
});
function saveStep1(e) {
var servermqtt = $("input[name='servermqtt']").val();
@@ -115,4 +120,224 @@ function SaveConfigDevice(e) {
common.ajaxError();
}
});
}
function ValidateIPaddress(ipaddress) {
if (/^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/.test(ipaddress))
return true;
return false;
}
function validData(inputName) {
var ip = $("input[name='" + inputName + "']").val();
if (ip == "" && document.getElementById('dhcp_check').checked)
return true;
if (!ValidateIPaddress(ip)) {
common.error(inputName, "");
return false;
} else {
common.success(inputName);
return true;
}
}
function validDNS(inputName) {
var dns = $("input[name='" + inputName + "']").val();
if (dns == "")
return true;
return validData(inputName);
}
function changeIP(e) {
var valid = validData("device_ip");
valid = validData("subnet_mask");
valid = validData("gateway");
valid = validDNS("dns1");
valid = validDNS("dns2");
if (!valid)
return;
if (confirm($("input[name='BAN_CO_CHAC_CHAN_MUON_DOI_IP_KHONG']").val())) {
common.modalBlock(true);
$.ajax({
url: $(e).attr("data-href"),
type: 'POST',
data: {
device_ip: $("input[name='device_ip']").val(),
subnet_mask: $("input[name='subnet_mask']").val(),
gateway: $("input[name='gateway']").val(),
dns1: $("input[name='dns1']").val(),
dns2: $("input[name='dns2']").val(),
dhcp: document.getElementById('dhcp_check').checked
},
success: function (data) {
common.modalBlock(false);
if (!data.status)
common.error("subnet_mask", "");
else
window.location = data.url;
},
error: function (jqXHR, textStatus, errorThrown) {
common.modalBlock(false);
common.ajaxError();
}
});
}
}
function reboot(e) {
if (confirm($("input[name='BAN_CO_CHAC_CHAN_MUON_REBOOT_KHONG']").val())) {
$("#reboot-blocking").modal({
keyboard: false,
backdrop: false
});
$.ajax({
url: $(e).attr("data-href"),
type: 'POST',
success: function (data) {
},
error: function (jqXHR, textStatus, errorThrown) {
// $("#reboot-blocking").modal("hide");
// common.ajaxError();
}
});
}
}
function controlEngine(e) {
common.modalBlock(true);
$.ajax({
url: $(e).attr("data-href"),
type: 'POST',
success: function (data) {
common.modalBlock(false);
$(".btn-control-engine").removeClass("btn-success").removeClass("btn-danger").addClass("btn-default");
$(e).removeClass("btn-default").addClass(data == "on" ? "btn-success" : "btn-danger");
},
error: function (jqXHR, textStatus, errorThrown) {
common.modalBlock(false);
common.ajaxError();
}
});
}
function controlSetupLight(e, status) {
if (status)
$("#time-light-config").removeClass("hidden");
else
$("#time-light-config").addClass("hidden");
$("#btn-save-light").attr("data-enable", status ? "1" : "0");
$(".btn-control-light").removeClass("btn-success").removeClass("btn-danger").addClass("btn-default");
$(e).removeClass("btn-default").addClass(status ? "btn-success" : "btn-danger");
if (!status)
$("#btn-save-light").trigger("click");
}
function saveTimeLightConfig(e) {
var enable = $(e).attr("data-enable");
var start_at = $("input[name='LightBegin']").val();
var end_at = $("input[name='LightEnd']").val();
if (enable === "1" && (start_at == "" || end_at == "")) {
alert($("input[name='THOI_GIAN_KHONG_DUOC_DE_TRONG']").val());
return;
}
common.modalBlock(true);
$.ajax({
url: $(e).attr("data-href"),
type: 'POST',
data: {
enable: enable,
start_at: start_at,
end_at: end_at
},
success: function (data) {
common.modalBlock(false);
if (data)
notification.success($("input[name='THONG_TIN_DA_DUOC_LUU_LAI']").val(), 2000);
else
notification.danger($("input[name='CO_LOI_XAY_RA_HAY_THU_LAI']").val(), 2000);
},
error: function (jqXHR, textStatus, errorThrown) {
common.modalBlock(false);
common.ajaxError();
}
});
}
function saveTimeEngineConfig(e) {
var start_at = $("input[name='EngineBegin']").val();
var end_at = $("input[name='EngineEnd']").val();
if (start_at == "" || end_at == "") {
alert($("input[name='THOI_GIAN_KHONG_DUOC_DE_TRONG']").val());
return;
}
common.modalBlock(true);
$.ajax({
url: $(e).attr("data-href"),
type: 'POST',
data: {
start_at: start_at,
end_at: end_at
},
success: function (data) {
common.modalBlock(false);
if (data)
notification.success($("input[name='THONG_TIN_DA_DUOC_LUU_LAI']").val(), 2000);
else
notification.danger($("input[name='CO_LOI_XAY_RA_HAY_THU_LAI']").val(), 2000);
},
error: function (jqXHR, textStatus, errorThrown) {
common.modalBlock(false);
common.ajaxError();
}
});
}
function btnBackground(mUrl, className, extension, fileSize) {
var fData = {
UploadFile: true,
Name: className
};
fData[common.csrfParam] = common.csrf;
new afuButton({
uploadURI: mUrl,
formData: fData,
wrap: {
tagName: 'div',
classes: ''
},
fileExtension: extension,
fileSizeLimit: fileSize,
classes: 'btn btn-default btn-xs file-paperclip-' + className,
fakeInputContent: '<span class=\'fa fa-picture-o\'></span> ' + $("input[name='CHON_HINH_ANH']").val(),
onUploaded: function (data) {
common.uploadBlock(false);
window.location.reload(true);
}
}).addInstance('image' + className);
$(".file-paperclip-" + className).closest("div").attr("style", "display:inline-block;");
}
function btnSound(mUrl, className, extension, fileSize) {
var fData = {
UploadFile: true,
Name: className
};
fData[common.csrfParam] = common.csrf;
new afuButton({
uploadURI: mUrl,
formData: fData,
wrap: {
tagName: 'div',
classes: ''
},
fileExtension: extension,
fileSizeLimit: fileSize,
classes: 'btn btn-default btn-xs file-paperclip-' + className,
fakeInputContent: '<span class=\'fa fa-file\'></span> ' + $("input[name='CHON_AM_THANH']").val(),
onUploaded: function (data) {
common.uploadBlock(false);
notification.success($("input[name='THONG_TIN_DA_DUOC_LUU_LAI']").val(), 2000);
}
}).addInstance('sound' + className);
$(".file-paperclip-" + className).closest("div").attr("style", "display:inline-block;");
}

View File

@@ -17,8 +17,10 @@ class ConfigTree extends Widget {
public function run() {
$public_root = ['engine', 'recognition', 'open_door', 'screen', 'lang', 'camera'];
$public_cfg = ['engine|cam_id', 'engine|server_authen', 'recognition|server_recog', 'open_door|enable', 'open_door|port_name', 'screen|banner', 'lang', 'camera|rgb', 'camera|ir', 'camera|rgb|url', 'camera|ir|url'];
// $public_root = ['engine', 'recognition', 'open_door', 'screen', 'lang', 'camera'];
// $public_cfg = ['engine|cam_id', 'engine|server_authen', 'recognition|server_recog', 'open_door|enable', 'open_door|port_name', 'screen|banner', 'lang', 'camera|rgb', 'camera|ir', 'camera|rgb|url', 'camera|ir|url'];
$public_root = ['open_door', 'screen', 'lang', 'play_sound', 'background', 'filter', 'ads'];
$public_cfg = ['open_door|door_1', 'open_door|door_2', 'open_door|light', 'open_door|light|enable', 'open_door|light|start_at', 'open_door|light|end_at', 'filter|enable', 'filter|show_name', 'filter|urls', 'screen|banner', 'lang', 'ads|enable', 'ads|get_rules', 'ads|check_new_every', 'ads|ads_type', 'ads|show_video_after', 'ads|audio'];
return $this->render("config-tree", [
"configLists" => $this->configLists,