+ Реализовано: просмотр параметров сервера и возможность редактирования
This commit is contained in:
Alexander Zhirov 2023-06-04 21:50:36 +03:00
parent 69ab43a4ec
commit 7a71bb7e01
13 changed files with 247 additions and 63 deletions

View File

@ -1,38 +1,38 @@
create table if not exists da_groups ( create table if not exists da_groups (
da_name varchar(20) not null, da_name varchar(20) not null,
da_comment varchar(100) default null, da_comment varchar(100) default null,
constraint da_groups_pk primary key (da_name) constraint da_groups_pk primary key (da_name)
); );
insert into da_groups (da_name, da_comment) insert into da_groups (da_name, da_comment)
values values
('general', 'Общие контакты'), ('general', 'Общие контакты'),
('work', 'Рабочие контакты'), ('work', 'Рабочие контакты'),
('personal', 'Личные контакты'); ('personal', 'Личные контакты');
create table if not exists da_lists ( create table if not exists da_lists (
da_name varchar(20) not null, da_name varchar(20) not null,
da_comment varchar(100) default null, da_comment varchar(100) default null,
constraint da_lists_pk primary key (da_name) constraint da_lists_pk primary key (da_name)
); );
insert into da_lists (da_name, da_comment) insert into da_lists (da_name, da_comment)
values values
('general', 'Общий'), ('general', 'Общий'),
('whitelist', 'Белый'), ('whitelist', 'Белый'),
('blacklist', 'Черный'); ('blacklist', 'Черный');
create table if not exists da_numbers ( create table if not exists da_numbers (
da_number varchar(12) not null, da_number varchar(12) not null,
da_group varchar(20) not null default 'general', da_group varchar(20) not null default 'general',
da_list varchar(20) not null default 'general', da_list varchar(20) not null default 'general',
da_all_cc int not null default 0, da_all_cc int not null default 0,
da_white_cc int not null default 0, da_white_cc int not null default 0,
da_black_cc int not null default 0, da_black_cc int not null default 0,
da_comment varchar(100) default null, da_comment varchar(100) default null,
constraint da_numbers_pk primary key (da_number), constraint da_numbers_pk primary key (da_number),
foreign key (da_group) references da_groups (da_name) on delete set null on update cascade, foreign key (da_group) references da_groups (da_name) on delete set null on update cascade,
foreign key (da_list) references da_lists (da_name) on delete set null on update cascade foreign key (da_list) references da_lists (da_name) on delete set null on update cascade
); );
create table if not exists da_sms ( create table if not exists da_sms (
@ -51,13 +51,13 @@ create table if not exists da_ussd_type (
); );
insert into da_ussd_type (da_id, da_comment) insert into da_ussd_type (da_id, da_comment)
values values
('0', 'Уведомление'), ('0', 'Уведомление'),
('1', 'Запрос'), ('1', 'Запрос'),
('2', 'Прервано сетью'), ('2', 'Прервано сетью'),
('3', 'Ответ другого локального клиента'), ('3', 'Ответ другого локального клиента'),
('4', 'Операция не поддерживается'), ('4', 'Операция не поддерживается'),
('5', 'Тайм-аут сети'); ('5', 'Тайм-аут сети');
create table if not exists da_ussd ( create table if not exists da_ussd (
da_id bigserial not null, da_id bigserial not null,
@ -69,9 +69,10 @@ create table if not exists da_ussd (
); );
create table if not exists da_server ( create table if not exists da_server (
da_address varchar(50) not null, da_id int not null default 1,
da_transparent_mode bool not null default false, da_transparent_mode bool not null default false,
da_internal_number varchar(12) not null, da_internal_number varchar(12) not null,
da_external_number varchar(12) not null, da_external_number varchar(12) not null,
constraint da_server_pk primary key (da_address) da_external_number_on bool not null default true,
constraint da_server_pk primary key (da_id)
); );

View File

@ -9,7 +9,7 @@ $(document).ready(function () {
0: () => { loadNumbers() }, 0: () => { loadNumbers() },
1: () => { loadSMS() }, 1: () => { loadSMS() },
2: () => { loadUSSD() }, 2: () => { loadUSSD() },
3: () => {} 3: () => { loadServerInfo() }
}; };
let lists = { let lists = {
@ -23,7 +23,7 @@ $(document).ready(function () {
0: () => { generateListGroupNumbers($("#accordion-numbers .ui-accordion-content-active")) }, 0: () => { generateListGroupNumbers($("#accordion-numbers .ui-accordion-content-active")) },
1: () => { generateListGroupSMS($("#accordion-sms .ui-accordion-content-active")) }, 1: () => { generateListGroupSMS($("#accordion-sms .ui-accordion-content-active")) },
2: () => { generateListGroupUSSD($("#accordion-ussd .ui-accordion-content-active")) }, 2: () => { generateListGroupUSSD($("#accordion-ussd .ui-accordion-content-active")) },
3: () => { noticer.success('Вкладка "Сервер"') } 3: () => {}
}; };
$("button").button(); $("button").button();
@ -36,7 +36,7 @@ $(document).ready(function () {
activate: function( event, ui ) { activate: function( event, ui ) {
lists[$(this).tabs( "option", "active" )](); lists[$(this).tabs( "option", "active" )]();
$("#add-number").button( "option", "disabled", $(this).tabs( "option", "active" ) > 0 ); $("#add-number").button( "option", "disabled", $(this).tabs( "option", "active" ) > 0 );
// $("#search").attr( "disabled", $("#search").val("") && $(this).tabs( "option", "active" ) > 1 ); $("#update-group").button( "option", "disabled", $(this).tabs( "option", "active" ) > 2 );
} }
}); });
@ -61,6 +61,7 @@ $(document).ready(function () {
loadNumbers(); loadNumbers();
loadSMS(); loadSMS();
loadUSSD(); loadUSSD();
loadServerInfo();
$("body").fadeTo(500, 1); $("body").fadeTo(500, 1);
}) })
@ -608,3 +609,63 @@ function delUSSD(panel, currentWindow) {
noticer.error(error.message); noticer.error(error.message);
}); });
} }
/************************************************************************************
Обработка таблицы информации о сервере
************************************************************************************/
function loadServerInfo() {
request('serverinfo', 'text').then(data => {
data.error ? noticer.error(data.message) : showServerInfo(data);
}).catch(error => {
noticer.error(error.message);
});
}
function showServerInfo(data) {
$("#tabs-server").html(data);
$("#server-external-number-on").checkboxradio();
$("#server-transparent-mode").checkboxradio();
$("#server-button").button({ icon: "ui-icon-disk", disabled: true });
$(".server-input").on("change paste cut keydown", () => {
if ($("#server-button").button( "option", "disabled")) {
noticer.warning('Некоторые параметры сервера были изменены');
$("#server-button").button( "option", "disabled", false);
}
});
$("#server-button").click(() => {
writeServerInfo();
});
}
function writeServerInfo() {
let pattern_number = /^\+7\d{10}$/g;
let internal_number = $("#server-internal-number").val();
let external_number = $("#server-external-number").val();
let external_number_on = $("#server-external-number-on").is(":checked");
let transparent_mode = $("#server-transparent-mode").is(":checked");
let error = false;
if (external_number.match(pattern_number) === null) { noticer.warning("Внешний номер не соответствует формату +7XXXXXXXXXX"); error = true; }
if (error) return;
request('writeserverinfo', 'json', {
internal_number: internal_number,
external_number: external_number,
external_number_on: external_number_on,
transparent_mode: transparent_mode
}).then(data => {
data.error ?
noticer.error(data.message) :
$("#server-button").button( "option", "disabled", true) && noticer.success("Параметры сервера были сохранены")
}).catch(error => {
noticer.error(error.message);
});
}

View File

@ -71,7 +71,7 @@ input {
margin-top: 20px margin-top: 20px
} }
.content table { .table-content {
width: 100%; width: 100%;
border-collapse: collapse; border-collapse: collapse;
border-spacing: 0; border-spacing: 0;
@ -125,15 +125,28 @@ tr.row:hover, tr.row:nth-child(even):hover {
/* EDIT NUMBER */ /* EDIT NUMBER */
.number-label, .sms-label, .ussd-label { .number-label, .sms-label, .ussd-label, .server-label {
color: #333; color: #333;
text-align: right; text-align: right;
} }
.number-value { .number-value, .server-value {
height: 30px; height: 30px;
} }
.server-value {
text-align: left;
padding-left: 10px;
}
.server-input {
height: 100%;
}
.server-button {
margin-top: 30px;
}
.sms-label-text, .ussd-label-text { .sms-label-text, .ussd-label-text {
vertical-align:top vertical-align:top
} }

View File

@ -19,6 +19,7 @@ import structures;
import requests.numbers; import requests.numbers;
import requests.sms; import requests.sms;
import requests.ussd; import requests.ussd;
import requests.server;
static ServerInfo serverInfo; static ServerInfo serverInfo;
@ -223,6 +224,12 @@ void postReq(HTTPServerRequest req, HTTPServerResponse res) {
case "delussd": case "delussd":
sendDelUSSD(req, res); sendDelUSSD(req, res);
break; break;
case "serverinfo":
getServerInfo(req, res);
break;
case "writeserverinfo":
sendWriteServerInfo(req, res);
break;
default: default:
res.redirect("/"); res.redirect("/");
} }

30
source/requests/server.d Normal file
View File

@ -0,0 +1,30 @@
module requests.server;
import vibe.vibe;
import response;
import structures;
import sql;
import singlog;
import std.regex;
// Получить информацию о сервере
void getServerInfo(HTTPServerRequest req, HTTPServerResponse res) {
auto dataServer = sqlGetServerInfo();
render!("server.dt", dataServer)(res);
}
void sendWriteServerInfo(HTTPServerRequest req, HTTPServerResponse res) {
ServerDB server = deserializeJson!ServerDB(req.json);
if (!server.external_number.matchFirst(regex(r"^\+7\d{10}$", "g"))) {
res.send(true, "Внешний номер не соответствует формату +7XXXXXXXXXX");
return;
}
if (!sqlUpdateServerInfo(server)) {
res.send(true, "Не удалось записать параметры сервера");
return;
}
res.send();
}

View File

@ -6,11 +6,9 @@ import structures;
import std.conv; import std.conv;
/* /***********************************************************
Запросы для таблицы номеров телефонов
Запросы для таблицы номеров телефонов ***********************************************************/
*/
GroupDB[] sqlGetListGroups() { GroupDB[] sqlGetListGroups() {
GroupDB[] groups; GroupDB[] groups;
@ -207,11 +205,9 @@ bool sqlInsertNumber(NumberDB number) {
return true; return true;
} }
/* /***********************************************************
Запросы для таблицы SMS
Запросы для таблицы SMS ***********************************************************/
*/
SMSDB[] sqlGetSMSNumbers() { SMSDB[] sqlGetSMSNumbers() {
SMSDB[] numbers; SMSDB[] numbers;
@ -306,11 +302,9 @@ bool sqlDeleteSMS(int idsms) {
return true; return true;
} }
/* /***********************************************************
Запросы для таблицы USSD
Запросы для таблицы USSD ***********************************************************/
*/
USSDDB[] sqlGetUSSDNumbers() { USSDDB[] sqlGetUSSDNumbers() {
USSDDB[] numbers; USSDDB[] numbers;
@ -408,3 +402,53 @@ bool sqlDeleteUSSD(int idussd) {
} }
return true; return true;
} }
/***********************************************************
Запросы для таблицы информации о сервере
***********************************************************/
ServerDB sqlGetServerInfo() {
ServerDB server;
try {
auto queryResult = pgsql.sql(
"select
case when da_transparent_mode then 1 else 0 end da_transparent_mode,
da_internal_number,
da_external_number,
case when da_external_number_on then 1 else 0 end da_external_number_on
from da_server
where da_id = 1"
);
foreach (row; queryResult) {
server.transparent_mode = row["da_transparent_mode"].to!int.to!bool;
server.internal_number = row["da_internal_number"];
server.external_number = row["da_external_number"];
server.external_number_on = row["da_external_number_on"].to!int.to!bool;
}
} catch (Exception e) {
log.e("Не удалось выполнить запрос к БД. " ~ e.msg);
}
return server;
}
bool sqlUpdateServerInfo(ServerDB server) {
try {
pgsql.sql(
"update da_server set
da_transparent_mode = ?,
da_internal_number = ?,
da_external_number = ?,
da_external_number_on = ?
where da_id = 1",
server.transparent_mode,
server.internal_number,
server.external_number,
server.external_number_on
);
} catch (Exception e) {
log.e("Ошибка обновления параметров сервера в БД. " ~ e.msg);
return false;
}
return true;
}

View File

@ -53,3 +53,10 @@ struct USSDDB {
string type_comment; string type_comment;
string text; string text;
} }
struct ServerDB {
bool transparent_mode;
string internal_number;
string external_number;
bool external_number_on;
}

View File

@ -1,3 +1,3 @@
module version_; module version_;
enum dasterVersion = "v0.0.6"; enum dasterVersion = "v0.0.8";

View File

@ -35,6 +35,4 @@ body
div#tabs-numbers div#tabs-numbers
div#tabs-sms div#tabs-sms
div#tabs-ussd div#tabs-ussd
p Список результатов USSD запросов
div#tabs-server div#tabs-server
p Информация о сервере

View File

@ -2,7 +2,7 @@ div#accordion-numbers
- foreach (group; listGroups) - foreach (group; listGroups)
h3 #{group.comment} h3 #{group.comment}
div.group-content(data-group-name='#{group.name}') div.group-content(data-group-name='#{group.name}')
table table.table-content
thead.head thead.head
tr tr
th Номер th Номер
@ -12,5 +12,5 @@ div#accordion-numbers
th Черные звонки th Черные звонки
th Комментарий th Комментарий
div.body-rows div.body-rows
table table.table-content
tbody.body tbody.body

View File

@ -2,12 +2,12 @@ div#accordion-sms
- foreach (number; numbers) - foreach (number; numbers)
h3 На номер #{number.to} h3 На номер #{number.to}
div.group-content(data-to='#{number.to}') div.group-content(data-to='#{number.to}')
table table.table-content
thead.head thead.head
tr tr
th.sms-content-width Дата th.sms-content-width Дата
th.sms-content-width От кого th.sms-content-width От кого
th Текст сообщения th Текст сообщения
div.body-rows div.body-rows
table table.table-content
tbody.body tbody.body

View File

@ -2,12 +2,12 @@ div#accordion-ussd
- foreach (number; numbers) - foreach (number; numbers)
h3 На номер #{number.to} h3 На номер #{number.to}
div.group-content(data-to='#{number.to}') div.group-content(data-to='#{number.to}')
table table.table-content
thead.head thead.head
tr tr
th.ussd-content-width Дата th.ussd-content-width Дата
th.ussd-content-width-type Тип th.ussd-content-width-type Тип
th Текст сообщения th Текст сообщения
div.body-rows div.body-rows
table table.table-content
tbody.body tbody.body

23
views/server.dt Normal file
View File

@ -0,0 +1,23 @@
div#server-data
table
tbody
tr
td.server-label Внутренний номер:
td.server-value
input.input-focus.server-input#server-internal-number(type="text", value="#{dataServer.internal_number}")
td.server-value
tr
td.server-label Внешний номер:
td.server-value
input.input-focus.server-input#server-external-number(type="text", value="#{dataServer.external_number}")
td.server-value
label(for="server-external-number-on") Использовать
input.server-input#server-external-number-on(name="server-external-number-on", type="checkbox", checked="#{dataServer.external_number_on}")
tr
td.server-label Прозрачный режим:
td.server-value
label(for="server-transparent-mode") Включен
input.server-input#server-transparent-mode(name="server-transparent-mode", type="checkbox", checked="#{dataServer.transparent_mode}")
td.server-value
div.server-button
button#server-button Сохранить изменения