v0.0.8
+ Реализовано: просмотр параметров сервера и возможность редактирования
This commit is contained in:
parent
69ab43a4ec
commit
7a71bb7e01
|
@ -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)
|
||||||
);
|
);
|
||||||
|
|
67
js/script.js
67
js/script.js
|
@ -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);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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("/");
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
|
}
|
74
source/sql.d
74
source/sql.d
|
@ -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;
|
||||||
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
module version_;
|
module version_;
|
||||||
|
|
||||||
enum dasterVersion = "v0.0.6";
|
enum dasterVersion = "v0.0.8";
|
||||||
|
|
|
@ -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 Информация о сервере
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 Сохранить изменения
|
Loading…
Reference in New Issue