migration start

This commit is contained in:
N0rdye 2023-09-18 16:36:07 +05:00
parent 898391ef3b
commit ba9bfda202
31 changed files with 451 additions and 15740 deletions

View File

@ -2,10 +2,10 @@
-- version 5.2.1
-- https://www.phpmyadmin.net/
--
-- Хост: db
-- Время создания: Июл 01 2023 г., 08:40
-- Версия сервера: 8.0.33
-- Версия PHP: 8.1.19
-- Хост: 192.168.2.72
-- Время создания: Сен 18 2023 г., 11:34
-- Версия сервера: 8.1.0
-- Версия PHP: 8.2.9
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
START TRANSACTION;
@ -21,13 +21,6 @@ SET time_zone = "+00:00";
-- База данных: `users`
--
CREATE USER 'user'@'%' IDENTIFIED WITH mysql_native_password BY 'user';
GRANT CREATE, ALTER, DROP, INSERT, UPDATE, DELETE, SELECT, REFERENCES, RELOAD on *.* TO 'user'@'%' WITH GRANT OPTION;
-- CREATE DATABASE IF NOT EXISTS `users` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
-- USE `users`;
-- --------------------------------------------------------
--
@ -37,15 +30,61 @@ GRANT CREATE, ALTER, DROP, INSERT, UPDATE, DELETE, SELECT, REFERENCES, RELOAD on
CREATE TABLE `admins` (
`id` int NOT NULL,
`login` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
`uid` int NOT NULL
`uid` int NOT NULL,
`rights` int NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
--
-- Дамп данных таблицы `admins`
--
INSERT INTO `admins` (`id`, `login`, `uid`) VALUES
(18, 'admin', 34);
INSERT INTO `admins` (`id`, `login`, `uid`, `rights`) VALUES
(58, 'n0rdye', 35, 3),
(91, 'admin', 72, 3),
(103, 'Stolyarchuk.E', 92, 3),
(108, 'andreeva.u', 96, 3);
-- --------------------------------------------------------
--
-- Структура таблицы `color_palette`
--
CREATE TABLE `color_palette` (
`id` int NOT NULL,
`color` tinytext NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
--
-- Дамп данных таблицы `color_palette`
--
INSERT INTO `color_palette` (`id`, `color`) VALUES
(20, '43368D'),
(21, '41AB34'),
(22, 'F7EA55'),
(23, 'E5231F'),
(24, 'F39223'),
(25, '009FE3'),
(26, 'CEE8EA'),
(27, 'B9D585'),
(28, 'F4F2C7'),
(29, 'E699A7'),
(30, 'F9C771'),
(31, 'B7A3C7');
-- --------------------------------------------------------
--
-- Структура таблицы `logs`
--
CREATE TABLE `logs` (
`id` int NOT NULL,
`date` date DEFAULT NULL,
`time` time NOT NULL,
`log` text NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-- --------------------------------------------------------
@ -55,14 +94,70 @@ INSERT INTO `admins` (`id`, `login`, `uid`) VALUES
CREATE TABLE `objects` (
`id` int NOT NULL,
`name` text NOT NULL,
`img` text NOT NULL,
`height` smallint NOT NULL,
`width` smallint NOT NULL,
`description` mediumtext NOT NULL,
`gid` int NOT NULL DEFAULT '0'
`name` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
`img` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
`height` double NOT NULL,
`width` double NOT NULL,
`cost` float NOT NULL,
`gid` int NOT NULL DEFAULT '0',
`colors` tinyint(1) NOT NULL DEFAULT '0',
`pid` int NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
--
-- Дамп данных таблицы `objects`
--
INSERT INTO `objects` (`id`, `name`, `img`, `height`, `width`, `cost`, `gid`, `colors`, `pid`) VALUES
(81, 'KeyBoard~g~не$основное', '/img/object/KeyBoard~g~не$основное/main.jpg', 45, 100, 200, 24, 0, 1),
(98, 'Настенная$панель$домик~g~Настенные$панели~p~Оборудование', '/img/object/Настенная$панель$домик~g~Настенные$панели~p~Оборудование/main.png', 100, 64, 17420, 73, 1, 2),
(127, 'Бизиборд$«Лисичка»~g~основное~p~Оборудование', '/img/object/Бизиборд$«Лисичка»~g~основное~p~Оборудование/main.png', 30, 90, 13660, 20, 0, 2);
-- --------------------------------------------------------
--
-- Структура таблицы `object_groups`
--
CREATE TABLE `object_groups` (
`id` int NOT NULL,
`name` varchar(500) NOT NULL,
`count` int NOT NULL,
`pid` int NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
--
-- Дамп данных таблицы `object_groups`
--
INSERT INTO `object_groups` (`id`, `name`, `count`, `pid`) VALUES
(20, 'основное', 1, 2),
(24, 'не$основное', 7, 1),
(73, 'Настенные$панели', 1, 2);
-- --------------------------------------------------------
--
-- Структура таблицы `object_partition`
--
CREATE TABLE `object_partition` (
`id` int NOT NULL,
`name` varchar(1000) NOT NULL,
`groups` longtext NOT NULL,
`count` int NOT NULL,
`no-cost` tinyint(1) NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
--
-- Дамп данных таблицы `object_partition`
--
INSERT INTO `object_partition` (`id`, `name`, `groups`, `count`, `no-cost`) VALUES
(1, 'Помехи$на$стене', '24', 1, 1),
(2, 'Оборудование', '20,73', 2, 0),
(9, 'Бизиборды', '', 0, 0);
-- --------------------------------------------------------
--
@ -74,7 +169,9 @@ CREATE TABLE `projects` (
`name` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
`uid` int NOT NULL,
`body` json NOT NULL,
`img` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL
`img` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
`creation_date` datetime DEFAULT NULL,
`last_change_date` datetime DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-- --------------------------------------------------------
@ -89,6 +186,16 @@ CREATE TABLE `sids` (
`uid` int NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
--
-- Дамп данных таблицы `sids`
--
INSERT INTO `sids` (`id`, `sid`, `uid`) VALUES
(331, 'c2d58f63-52b2-4678-92f7-fb1bdeb404dc%%/#e621', 96),
(342, '468bfba7-cc8d-45b9-822b-ed9359b67942%%/#e621', 72),
(350, 'bd21222c-bd8a-460b-b3e9-32b210759720%%/#e621', 92),
(354, '5538d163-b71e-4604-aef2-5c000a577eca%%/#e621', 35);
-- --------------------------------------------------------
--
@ -99,7 +206,7 @@ CREATE TABLE `users` (
`id` int NOT NULL,
`login` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
`pass` varchar(1000) NOT NULL,
`admin` int DEFAULT '0',
`admin` tinyint(1) DEFAULT '0',
`uuid` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
@ -108,7 +215,12 @@ CREATE TABLE `users` (
--
INSERT INTO `users` (`id`, `login`, `pass`, `admin`, `uuid`) VALUES
(34, 'admin', 'admin', 1, '7a910a34-8b80-4a60-8445-2400920be5d3%admin%%4a576825-deea-403d-bf0b-46bb98bb80fd#621');
(35, 'n0rdye', '595', 1, '3bcb0c63-359a-4ec1-b7ad-49aa78a010ec%n0rdye%%bed10840-d365-4980-8b93-c018b5757217#621'),
(72, 'admin', 'Gfzkmybr72', 1, '19e70eed-e370-43b3-894f-8192bda656b6%%U2FsdGVkX1+Wwk7/EIIpOOysfRnlDY5Q8TgojbYWxZo=#e621'),
(76, 'voloshina.e', 'Volo1508', 0, '9c1fe660-dc56-4a0b-98c2-6eb4d7b3498a%%U2FsdGVkX18N+JSSFfr5TRLFkmGDLwlz7mhATO/pJmU=#e621'),
(91, 'sychov.a', 'Sych1808!', 0, 'f921ba23-723c-4cb4-b5a6-e24ffbb9d181%%U2FsdGVkX19C2YLx2D1IZEVNuM/qFZjWoI37vxioL2E=#e621'),
(92, 'Stolyarchuk.E', 'Sto2108!', 1, '3e5ac53e-f46e-4f9d-94fd-c761ce17c799%%U2FsdGVkX1/9C2IykLtuoHXA9isJjqBADD3+s1D5cVY=#e621'),
(96, 'andreeva.u', 'Andr2908', 1, 'c2e8cb66-5d80-4905-9cc0-4830d448960e%%andreeva.u#e621');
--
-- Индексы сохранённых таблиц
@ -121,10 +233,37 @@ ALTER TABLE `admins`
ADD PRIMARY KEY (`id`),
ADD UNIQUE KEY `uid` (`uid`) USING BTREE;
--
-- Индексы таблицы `color_palette`
--
ALTER TABLE `color_palette`
ADD PRIMARY KEY (`id`);
--
-- Индексы таблицы `logs`
--
ALTER TABLE `logs`
ADD PRIMARY KEY (`id`);
--
-- Индексы таблицы `objects`
--
ALTER TABLE `objects`
ADD PRIMARY KEY (`id`),
ADD KEY `gid` (`gid`),
ADD KEY `pid` (`pid`);
--
-- Индексы таблицы `object_groups`
--
ALTER TABLE `object_groups`
ADD PRIMARY KEY (`id`),
ADD KEY `object_groups_ibfk_1` (`pid`);
--
-- Индексы таблицы `object_partition`
--
ALTER TABLE `object_partition`
ADD PRIMARY KEY (`id`);
--
@ -155,31 +294,55 @@ ALTER TABLE `users`
-- AUTO_INCREMENT для таблицы `admins`
--
ALTER TABLE `admins`
MODIFY `id` int NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=19;
MODIFY `id` int NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=109;
--
-- AUTO_INCREMENT для таблицы `color_palette`
--
ALTER TABLE `color_palette`
MODIFY `id` int NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=35;
--
-- AUTO_INCREMENT для таблицы `logs`
--
ALTER TABLE `logs`
MODIFY `id` int NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=5417;
--
-- AUTO_INCREMENT для таблицы `objects`
--
ALTER TABLE `objects`
MODIFY `id` int NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=20;
MODIFY `id` int NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=141;
--
-- AUTO_INCREMENT для таблицы `object_groups`
--
ALTER TABLE `object_groups`
MODIFY `id` int NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=74;
--
-- AUTO_INCREMENT для таблицы `object_partition`
--
ALTER TABLE `object_partition`
MODIFY `id` int NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=11;
--
-- AUTO_INCREMENT для таблицы `projects`
--
ALTER TABLE `projects`
MODIFY `id` int NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=27;
MODIFY `id` int NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=69;
--
-- AUTO_INCREMENT для таблицы `sids`
--
ALTER TABLE `sids`
MODIFY `id` int NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=72;
MODIFY `id` int NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=355;
--
-- AUTO_INCREMENT для таблицы `users`
--
ALTER TABLE `users`
MODIFY `id` int NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=35;
MODIFY `id` int NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=97;
--
-- Ограничения внешнего ключа сохраненных таблиц
@ -189,19 +352,32 @@ ALTER TABLE `users`
-- Ограничения внешнего ключа таблицы `admins`
--
ALTER TABLE `admins`
ADD CONSTRAINT `admins_ibfk_1` FOREIGN KEY (`uid`) REFERENCES `users` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT;
ADD CONSTRAINT `admins_ibfk_1` FOREIGN KEY (`uid`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT;
--
-- Ограничения внешнего ключа таблицы `objects`
--
ALTER TABLE `objects`
ADD CONSTRAINT `objects_ibfk_1` FOREIGN KEY (`gid`) REFERENCES `object_groups` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT,
ADD CONSTRAINT `objects_ibfk_2` FOREIGN KEY (`pid`) REFERENCES `object_partition` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT;
--
-- Ограничения внешнего ключа таблицы `object_groups`
--
ALTER TABLE `object_groups`
ADD CONSTRAINT `object_groups_ibfk_1` FOREIGN KEY (`pid`) REFERENCES `object_partition` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT;
--
-- Ограничения внешнего ключа таблицы `projects`
--
ALTER TABLE `projects`
ADD CONSTRAINT `projects_ibfk_1` FOREIGN KEY (`uid`) REFERENCES `users` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT;
ADD CONSTRAINT `projects_ibfk_1` FOREIGN KEY (`uid`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT;
--
-- Ограничения внешнего ключа таблицы `sids`
--
ALTER TABLE `sids`
ADD CONSTRAINT `sids_ibfk_1` FOREIGN KEY (`uid`) REFERENCES `users` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT;
ADD CONSTRAINT `sids_ibfk_1` FOREIGN KEY (`uid`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT;
COMMIT;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;

View File

@ -157,7 +157,7 @@ module.exports.img_recolor = (res,image,color) => {
image: image,
colors: {
type: 'hex',
targetColor: "#FFFFFF",
targetColor: "#c8c8c8",
replaceColor: `#${color}`
},
deltaE: 10

View File

@ -189,6 +189,17 @@ app.post("/object/group/get", (req,res) => {try{
} catch (error) {func.log("router single object getting error - "+error);}
})
// colors
app.post("/object/colors/get", (req,res) => {try{
let inp = req.body;
let cook = req.cookies;
// func.log(inp["name"]);
func.sid(cook,res,()=>{
obj.load_colors(inp,cook,res);
})
} catch (error) {func.log("router single object getting error - "+error);}
})
/// admin
app.get("/admin", (req,res) =>{try {
@ -217,6 +228,24 @@ app.get("/get_logs", (req,res) => {
try{let cook = req.cookies;func.sid(cook,res,()=>{func.logs_file(res);})}
catch (error) {func.log("router logs download error - "+error);}
})
app.post("/admin/colors/new", (req,res) => {try{
let inp = req.body;
let cook = req.cookies;
// func.log(inp["name"]);
func.sid(cook,res,()=>{
obj.new_color(inp,cook,res);
})
} catch (error) {func.log("router single object getting error - "+error);}
})
app.post("/admin/colors/delete", (req,res) => {try{
let inp = req.body;
let cook = req.cookies;
// func.log(inp["name"]);
func.sid(cook,res,()=>{
obj.del_color(inp,cook,res);
})
} catch (error) {func.log("router single object getting error - "+error);}
})
app.post("/admin/objects/new", (req,res) => {try{
let inp = req.body;
let cook = req.cookies;

View File

@ -10,7 +10,7 @@ module.exports.loads = (inp,cook,res)=>{
let gin
if (typeof inp["gid"] == 'undefined' || inp["gid"] == null) gin = "1 OR 1=1"
else gin = inp["gid"]
db.ggv("objects","`name`,`id`,`height`,`width`,`cost`,`gid`,`colors`","gid",`${gin}`,(odata)=>{
db.ggv("objects","`name`,`id`,`height`,`width`,`cost`,`gid`,`colors`,`pid`","gid",`${gin}`,(odata)=>{
// func.log(odata);
res.send({out:"good",body:odata});
})
@ -42,7 +42,7 @@ module.exports.new = (inp,cook,res)=>{
res.send({out:"bad",err:"name"});
}
else if (db_name[0] == null){
db.nr("objects","`cost`,`name`,`img`,`height`,`width`,`gid`,`colors`",`'${inp["cost"]}','${inp["name"]}~g~${gname["name"]}~p~${pname["name"]}','${img_path}','${inp["height"]}','${inp["width"]}','${inp["gid"]}','${inp["colors"]}'`,true);
db.nr("objects","`cost`,`name`,`img`,`height`,`width`,`gid`,`colors`,`pid`",`'${inp["cost"]}','${inp["name"]}~g~${gname["name"]}~p~${pname["name"]}','${img_path}','${inp["height"]}','${inp["width"]}','${inp["gid"]}','${inp["colors"]}','${gname["pid"]}'`,true);
db.sv("object_groups","count",`(count + 1)`,"id",inp["gid"],()=>{},true,true)
func.log(`admin object created name:${inp["name"]} group:${gname["name"]}`);
res.send({out:"good"});
@ -56,7 +56,7 @@ module.exports.new = (inp,cook,res)=>{
})
function save_img(data,name,callback) {
let img = imageDataURI.decode(data);
if (!fs.existsSync(`public/img/object/${name}`)){fs.mkdirSync(`public/img/object/${name}`);fs.mkdirSync(`public/img/object/${name}/colored`);}
if (!fs.existsSync(`public/img/object/${name}`)){fs.mkdirSync(`public/img/object/${name}`);}
fs.writeFile(`public/img/object/${name}/main.${img.imageType.split("/").at(-1)}`, img.dataBuffer,()=>{
if(callback)callback(`/img/object/${name}/main.${img.imageType.split("/").at(-1)}`);
});
@ -66,6 +66,42 @@ module.exports.new = (inp,cook,res)=>{
}
}
module.exports.new_color = (inp,cook,res)=>{
try {
db.fv("color_palette","color",inp["color"],(in_db)=>{in_db = in_db[0];
if(typeof in_db == 'undefined'){
db.nr("color_palette","color",`'${inp["color"]}'`,true,(db)=>{
res.send({out:"good"});
func.log(`admin added new color:${inp["color"]}`)
})
}else{
res.send({out:"bad"});
}
})
} catch (error) {
func.log("backend object creating error - "+error);
}
}
module.exports.del_color = (inp,cook,res)=>{
try {
db.dl("color_palette","id",inp["id"],(in_db)=>{
res.send({out:"good"});
func.log(`admin deleted color:${inp["color"]}`)
},true);
} catch (error) {
func.log("backend object creating error - "+error);
}
}
module.exports.load_colors = (inp,cook,res)=>{
try {
db.gav("color_palette","0",(in_db)=>{
res.send({out:"good",body:in_db})
})
} catch (error) {
func.log("backend object creating error - "+error);
}
}
module.exports.save = (inp,cook,res)=>{
try {
// let changed = [];
@ -96,19 +132,21 @@ module.exports.save = (inp,cook,res)=>{
fs.rm(`public/img/object/${db_data["name"]}`, { recursive: true }, () => {
// fs.unlink(db_data["img"],()=>{});
save_img(value,db_data["name"],(path)=>{
// console.log(db_data["name"]);
db.sv("objects",key,path,"id",inp["id"],()=>{
chack_if_last(key)
},true);
})
function save_img(data,name,callback) {
let img = imageDataURI.decode(data);
if (!fs.existsSync(`public/img/object/${name}`)){fs.mkdirSync(`public/img/object/${name}`);fs.mkdirSync(`public/img/object/${name}/colored`);}}
if (!fs.existsSync(`public/img/object/${name}`)){fs.mkdirSync(`public/img/object/${name}`);}
fs.writeFile(`public/img/object/${name}/main.${img.imageType.split("/").at(-1)}`, img.dataBuffer,()=>{
if(callback)callback(`/img/object/${name}/main.${img.imageType.split("/").at(-1)}`);
});
});
}
})
})
}
else if (key != "name"){

View File

@ -71,6 +71,8 @@ module.exports.save = (inp,cook,res)=>{
try {
db.gv("users","uuid",`'${cook["uuid"]}'`, (udata)=>{ udata = udata[0]
db.gv("projects","uid",udata["id"],(pdata)=>{
var date = moment().format('YYYY-MM-DD');
var time = moment().format('hh:mm:ss');
let projin = null;
// func.log(pdata);
pdata.forEach(projt => {
@ -82,14 +84,13 @@ module.exports.save = (inp,cook,res)=>{
if(projin == null){
// func.log("proj not in");
// func.log(pname,udata["id"],proj);
var date = moment().format('YYYY-MM-DD');
var time = moment().format('hh:mm:ss');
func.log(`good boy ${udata["uuid"]} created project ${inp["name"]} from ${cook["sid"]}`);
db.nr("projects","`uid`,`name`,`body`,`img`,creation_date",`'${udata["id"]}','${inp["name"]}','${inp["proj"]}','${inp["img"]}','${date+"T"+time}'`);
res.send({out:"good"});
} else if (projin != null){
db.sv("projects","body",inp["proj"],"id",projin["id"],()=>{});
if(inp["img"] != "") db.sv("projects","img",inp["img"],"id",projin["id"],()=>{},"user");
db.sv("projects","last_change_date",`${date+"T"+time}`,"id",projin["id"],()=>{});
if(inp["img"] != "") db.sv("projects","img",inp["img"],"id",projin["id"],()=>{});
func.log(`good boy ${udata["uuid"]} saved project ${projin["name"]} from ${cook["sid"]}`);
// func.log("proj in");
res.send({out:"good"});

Binary file not shown.

Before

Width:  |  Height:  |  Size: 88 KiB

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 86 KiB

After

Width:  |  Height:  |  Size: 95 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 85 KiB

After

Width:  |  Height:  |  Size: 93 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 134 KiB

After

Width:  |  Height:  |  Size: 164 KiB

View File

@ -99,6 +99,21 @@ function get_sid(){
});
}
function load_colors(callback){
$.post( "/object/colors/get", {})
.done(function( res ) {
if(res["out"] == "good"){
if(callback)callback(res["body"])
}
});
}
function clear_palette(){
Object.values(document.getElementsByClassName("color_palette")).forEach(element => {
element.style.border = "0px blue solid";
});
}
function load_groups(callback,groups,admin = false){
let select = document.getElementById("group");
// let name = select.options[select.selectedIndex].text;

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -50,12 +50,14 @@ function create(clas,x,y,color = null,id,size){
}
}
function make(img){
// console.log(db_data);
obj.src = img;
obj.title = `${db_data["name"].replaceAll("$"," ").split("/g")[0]}\nцена:${db_data["cost"]}\nширина:${db_data["width"]}см высота:${db_data["height"]}см`;
obj.title = `${db_data["name"].replaceAll("$"," ").split("~g")[0]}\nцена:${db_data["cost"]}\nширина:${db_data["width"]}см высота:${db_data["height"]}см`;
obj.setAttribute("cost",db_data["cost"])
obj.setAttribute("colors",Boolean(db_data["colors"]))
obj.setAttribute("img",img)
obj.setAttribute("gid",db_data["gid"])
obj.setAttribute("pid",db_data["pid"])
obj.setAttribute("color",color)
// drag.transform = `translate(${drag.getAttribute("data-y")}px, ${drag.getAttribute("data-y")}px) scale(${db_data["width"] * cm_mod} ${db_data["height"] * cm_mod})`;
if(size){
@ -78,7 +80,13 @@ function obj_click(id){
let obj = document.getElementById(id);
cur_obj = id;
if (obj.getAttribute("colors") == "true"){
clear_palette();
obj_colors_load(()=>{
document.getElementById("obj_color_div").style.display = "flex";
if( document.getElementById(`color_${obj.getAttribute("color")}`) != null){
document.getElementById(`color_${obj.getAttribute("color")}`).style.border = "1px blue solid"
}
});
}
else{
document.getElementById("obj_color_div").style.display = "none";
@ -148,7 +156,7 @@ function calc_total(start = false){
if(key != "height"&&key!="width"&key!="total"){
// console.log(Object.keys(value).length);
// console.log(objs_store[key]);
if(objs_store[key] != null && objs_store[key]["cost"] > 0){
if(objs_store[key] != null && objs_store[key]["cost"] > 0 && JSON.parse(document.getElementById(`group_drop-${objs_store[key]["pid"]}`).getAttribute("no-cost")) == false){
// console.log(key,value);
total += parseInt(parseInt(objs_store[key]["cost"]) * Object.keys(value).length);
let obj_cost_div = document.createElement("li");
@ -196,9 +204,6 @@ function load(objss){
if (keys == "color"){
document.getElementById("wall").style.backgroundColor = values;
}
if (keys == "grided"){
document.getElementById("wall").style.backgroundColor = values;
}
if (keys == Object.keys(objs).at(-1)){
loaded();
proj_state = "loaded";
@ -285,7 +290,7 @@ function load_objs(callback,group){
if(res["out"] == "good"){
// console.log(res["body"]);
res["body"].forEach(element => {
objs_store[`${element["name"]}`] = {height:element["height"],width:element["width"],id:element["id"],name:element["name"],cost:element["cost"],colors:element["colors"]}
objs_store[`${element["name"]}`] = {height:element["height"],width:element["width"],id:element["id"],name:element["name"],cost:element["cost"],colors:element["colors"],gid:element["gid"],pid:element["pid"]}
});
callback(res["body"]);
}

View File

@ -11,6 +11,7 @@
<!-- <h1 style="text-align: center;">объект</h1> -->
<%- include('../admin/objects/object_groups.ejs') %>
<%- include('../admin/objects/object_creation.ejs') %>
<%- include('../admin/objects/object_colors.ejs') %>
<%- include('../admin/objects/object_edit.ejs') %>
</section>

View File

@ -0,0 +1,63 @@
<div id="admin_colors" style="display: flex;justify-content: space-between;margin-top: 4vh;">
<div id="obj_color_div" style="justify-content: space-between; width: 50vw;display: flex;">
<label for="obj_colors" style="min-width: 10vw;float: left;">цвет объекта</label>
<div id="obj_colors" style="display: flex; width: 30vw;overflow: auto;"></div>
</div>
<div id="inp">
<input type="color" id="new_color" style="margin: auto;">
<button onclick="new_color()" class="btn_blue">добавить цвет</button>
<button onclick="del_color()" class="btn_blue">удалить цвет</button>
</div>
</div>
<script>
let cur_color = "";
obj_colors_load();
function obj_colors_load() {
let div = document.getElementById("obj_colors");
div.innerHTML = "";
load_colors((colors)=>{
Object.entries(colors).forEach(([key,value]) => {
// console.log(value);
let color_div = document.createElement("div");
color_div.style = `background-color: #${value["color"]}; border-radius: 50%;height: 2vw;min-width: 2vw;margin-inline: 0.5vw;`;
color_div.classList.add("color_palette");
color_div.id=`color_${value["color"]}`;
color_div.setAttribute("color_id",`${value["id"]}`)
color_div.setAttribute("onclick",`clear_palette();document.getElementById('color_${value["color"]}').style.border = "1px blue solid";cur_color = 'color_${value["color"]}';`)
color_div.title = `#${value["color"]}`;
div.append(color_div);
});
})
}
function new_color(){
let color = document.getElementById("new_color").value.replace("#","");
let wait_msg = msg("добавление цвета",{type:"wait"})
$.post( "/admin/colors/new", {color:color})
.done(function( res ) {
if(res["out"] == "good"){
msg_del(wait_msg.id);
msg("цвет добавлен");
obj_colors_load();
console.log(res["body"]);
}
else if (res["out"] == "bad"){
msg_del(wait_msg.id);
msg("цвет уже добавлен");
}
});
}
function del_color(){
let color_id = document.getElementById(cur_color).getAttribute("color_id")
let wait_msg = msg("удаление цвета",{type:"wait"})
$.post( "/admin/colors/delete", {id:color_id})
.done(function( res ) {
if(res["out"] == "good"){
msg_del(wait_msg.id);
msg("цвет удалён");
obj_colors_load();
console.log(res["body"]);
}
});
}
</script>

View File

@ -48,10 +48,11 @@
let color_check = document.getElementById("obj_color_check");
let old_prev = document.getElementById("img_prev").src;
if(color_check.checked == true){
obj_colors_load();
removeImageBackground(document.getElementById("img_prev").src).then((out)=>{
document.getElementById("img_prev").src = out;
})
msg("при измении цвета все цвета кроме прозрачного изменятся",{type:"help",time:10});
msg("помните что только hex:#c8c8c8 или rgb:200,200,200 цвета будут заменины при смене цвета ",{type:"help",time:10});
}
else{
document.getElementById("img_prev").src = old_prev;
@ -235,9 +236,7 @@
}
else if(res["out"] == "good"){
msg("товар добавлен");
setTimeout(()=>{
edit_get_objs();
},5000)
}
});
}

View File

@ -43,15 +43,15 @@
</div>
</div>
<section id="users_section">
<div style="height: 430px;">
<div style="height: 360px;">
<li id="first_user"><div>Логин</div><div>Превилегии</div><div>Функции</div></li>
<ul id="user_list"></ul>
</div>
<div style="display: flex;justify-content: space-between;margin: auto;">
<div style="display: flex;"><h1>Всего:&nbsp;</h1> <h1 id="users_count">0</h1></div>
<div style="display: flex;margin: auto 0px;">с&nbsp;<div id="users_from">0</div>&nbsp;по&nbsp;<div id="users_to">10</div></div>
<div style="margin: auto 0px;"><button onclick="if(users_from-load_interval>=0){users_from-=load_interval;load_users_data(users_from);}" class="btn_gray">< 10 назад</button></div>
<div style="margin: auto 0px;"><button onclick="users_from+=load_interval;load_users_data(users_from);" class="btn_gray">даллее ></button></div>
<div style="margin: auto 0px;"><button id="back_btn" class="btn_gray">< 10 назад</button></div>
<div style="margin: auto 0px;"><button id="forw_btn" class="btn_gray">даллее ></button></div>
</div>
</section>
@ -59,10 +59,32 @@
<script>
let users_from = 0;
let load_interval = 5;
function user_count_check(){
if(parseInt(document.getElementById("users_count").innerText) >= parseInt(document.getElementById("users_to").innerText)){
document.getElementById("forw_btn").classList = "btn_blue";
document.getElementById("forw_btn").setAttribute("onclick",`users_from+=load_interval;load_users_data(users_from);`);
}
else{
document.getElementById("forw_btn").setAttribute("onclick",``);
document.getElementById("forw_btn").classList = "btn_gray";
}
if(parseInt(document.getElementById("users_from").innerText) == 0){
document.getElementById("back_btn").setAttribute("onclick",``);
document.getElementById("back_btn").classList = "btn_gray";
}
else{
document.getElementById("back_btn").setAttribute("onclick",`if(users_from-load_interval>=0){users_from-=load_interval;load_users_data(users_from);};`);
document.getElementById("back_btn").classList = "btn_blue";
}
}
load_users_data(users_from);
function load_users_data(from,by_name=false){
// if(to == "forward") {users_from+=load_interval;}
// else if(to == "back") {users_from-=load_interval;}
document.getElementById("back_btn").setAttribute("onclick",``);
document.getElementById("forw_btn").setAttribute("onclick",``);
document.getElementById("user_list").innerHTML = "";
document.getElementById("users_from").innerText = from;
document.getElementById("users_to").innerText = from+load_interval;
@ -80,6 +102,7 @@
user_sec.append(user_pass);user_sec.append(user_name);user_sec.append(user_prevs);user_sec.append(user_buttons);
document.getElementById("user_list").append(user_sec);
user_count_check();
});
}
else if (res["out"] == "bad"){
@ -90,6 +113,7 @@
else{
let login = ask("имя");
if (login != ""){
form = 0;
$.post( "/admin/users/find",{login:login,from:from,load_interval:load_interval})
.done(function( res ) {
if(res["out"] == "good"){
@ -104,6 +128,10 @@
document.getElementById("user_list").append(user_sec);
});
}
else if(res["out"] == "bad"){
msg("нет пользователя с таким иминем")
load_users_data(users_from);
}
});
}
}

View File

@ -12,7 +12,7 @@
<input type="text" id="login" name="login" value="" placeholder="Логин" class="btn_white" style="text-align: center; padding-inline: 5vw;">
<input type="submit" onclick='reg();' value="Зарегистрировать" class="btn_blue">
<div>
<label for="admin_check">Админ. привелегии</label>
<label for="admin_check" style="margin: auto;">Админ. привелегии</label>
<input type="checkbox" name="admin" value='false' id="admin_check" onchange="admin_ch()">
</div>
</div>

View File

@ -60,9 +60,9 @@
}
});
}
function new_proj(){
function new_proj(objs = null){
let name = ask("please enter project name");
let objs = { height:"2",width:"4"};
objs = (objs == null)? { height:"2",width:"4"}:objs;
if(name != null && name!= "" && name!=" " && typeof name != "undefined" && name!="undefined"){
$.post( "/save_proj", {proj:JSON.stringify(objs),name:name,img:"/img/proj_placeholder.webp"})
.done(function( res ) {
@ -84,7 +84,7 @@
projs.forEach(proj => {
console.log(proj);
let div = document.getElementById("projs_div");
div.innerHTML += `<button id='proj_${proj["name"]}' class='proj'>
div.innerHTML += `<button id='proj_${proj["name"]}' proj_id='${proj["id"]}' class='proj'>
<img src='${proj["img"]}' alt='${proj["name"]}' class="p_img" onclick="goto('/proj/load/${proj["name"]}')">
<div class="p_props">
<div class="p_left" style="text-align:left">
@ -93,8 +93,8 @@
</div>
<div class="p_right">
<img src="/img/icon/edit.svg" style="width:24px;height:24px" onclick="">
<img src="/img/icon/copy.svg" style="width:24px;height:24px" onclick="">
<img src="/img/icon/download.svg" style="width:24px;height:24px" onclick="download_proj('${proj["id"]}','${proj["name"]}')">
<img src="/img/icon/copy.svg" style="width:24px;height:24px" onclick="copy_proj('${proj["name"]}')">
<img src="/img/icon/download.svg" style="width:24px;height:24px" onclick="downloadImg('${proj["img"]}','${proj["name"]}');msg('скачивание');">
<img src="/img/icon/trash.svg" style="width:24px;height:24px" onclick="del_proj('${proj["name"]}')">
</div>
</div>
@ -122,5 +122,14 @@
})
}
}
function copy_proj(proj){
$.post( "/load_proj",{name:proj})
.done(function( res ) {
if(res["out"] == "good"){
new_proj(JSON.parse(res["body"]))
}
})
}
</script>
<%- include('./static/end.ejs',{soc:true}) %>

View File

@ -189,22 +189,9 @@
<div class="inputs" style="display: flex;justify-content: space-between;height: 5vh;">
<div id="obj_color_div" style="justify-content: space-evenly; width: 50vw;display: none;transform: translateX(30%);">
<label for="obj_color" style="width: 10vw;">цвет объекта</label>
<label for="obj_colors" style="min-width: 10vw;">цвет объекта</label>
<div id="obj_colors" style="display: flex; width: 30vw;overflow: auto;"></div>
<!-- <input id="obj_color" type="color" onchange="obj_color_change(event)"> -->
<div style="display: flex;justify-content: space-evenly; width: 30vw;">
<div style="background-color: #43368D; border-radius: 50%;height: 2vw;width: 2vw;" color="#43368D" onclick="obj_color_change('43368D')"></div>
<div style="background-color: #41AB34; border-radius: 50%;height: 2vw;width: 2vw;" color="#41AB34" onclick="obj_color_change('41AB34')"></div>
<div style="background-color: #F7EA55; border-radius: 50%;height: 2vw;width: 2vw;" color="#F7EA55" onclick="obj_color_change('F7EA55')"></div>
<div style="background-color: #E5231F; border-radius: 50%;height: 2vw;width: 2vw;" color="#E5231F" onclick="obj_color_change('E5231F')"></div>
<div style="background-color: #F39223; border-radius: 50%;height: 2vw;width: 2vw;" color="#F39223" onclick="obj_color_change('F39223')"></div>
<div style="background-color: #009FE3; border-radius: 50%;height: 2vw;width: 2vw;" color="#009FE3" onclick="obj_color_change('009FE3')"></div>
<div style="background-color: #CEE8EA; border-radius: 50%;height: 2vw;width: 2vw;" color="#CEE8EA" onclick="obj_color_change('CEE8EA')"></div>
<div style="background-color: #B9D585; border-radius: 50%;height: 2vw;width: 2vw;" color="#B9D585" onclick="obj_color_change('B9D585')"></div>
<div style="background-color: #F4F2C7; border-radius: 50%;height: 2vw;width: 2vw;" color="#F4F2C7" onclick="obj_color_change('F4F2C7')"></div>
<div style="background-color: #E699A7; border-radius: 50%;height: 2vw;width: 2vw;" color="#E699A7" onclick="obj_color_change('E699A7')"></div>
<div style="background-color: #F9C771; border-radius: 50%;height: 2vw;width: 2vw;" color="#F9C771" onclick="obj_color_change('F9C771')"></div>
<div style="background-color: #B7A3C7; border-radius: 50%;height: 2vw;width: 2vw;" color="#B7A3C7" onclick="obj_color_change('B7A3C7')"></div>
</div>
</div>
</div>
<div class="inputs" style="display: flex;justify-content: space-between;">
@ -309,7 +296,7 @@
}
function img_download(){
msg("добавить на фото стоимость ?",{type:"ask",res:(out)=>{
msg("добавить на фото стоимость?",{type:"ask",res:(out)=>{
let wait_msg = msg("делаем фото",{type:"wait"})
proj_img((src)=>{
msg("изображение проекта готово",{time:3})
@ -331,6 +318,7 @@
}
html2canvas(document.getElementById("drags"),{
y:7,
x:2,
width:width,
logging:false,
scale:5
@ -348,6 +336,27 @@
});
}
function obj_colors_load(callback) {
let div = document.getElementById("obj_colors");
div.innerHTML = "";
load_colors((colors)=>{
Object.entries(colors).forEach(([key,value]) => {
// console.log(value);
let color_div = document.createElement("div");
color_div.style = `background-color: #${value["color"]}; border-radius: 50%;height: 2vw;min-width: 2vw;margin-inline: 0.5vw;`;
color_div.classList.add("color_palette");
color_div.id=`color_${value["color"]}`;
color_div.setAttribute("color",`${value["color"]}`)
color_div.setAttribute("onclick",`clear_palette();document.getElementById('color_${value["color"]}').style.border = "1px blue solid";obj_color_change('${value["color"]}')`)
color_div.title = `#${value["color"]}`;
div.append(color_div);
if(key = Object.keys(colors).at(-1)){
if(callback)callback();
}
});
})
}
function obj_color_change(color,in_obj = null){
if(color != "null"){
if (proj_state == "loaded"){objs_back.push(JSON.parse(JSON.stringify(objs)));}
@ -355,6 +364,7 @@
// console.log(color);
color_change(color,obj.getAttribute("img"),(img)=>{
obj.src = img;
obj.setAttribute("color",color)
objs[obj.classList[0]][obj.id]["color"] = color;
});
}

View File

@ -88,7 +88,4 @@
</style>
</head>
<body>
<script>
let domen = "puzzle.nor.su";
</script>