migration start
							
								
								
									
										238
									
								
								back_users.sql
									
									
									
									
									
								
							
							
						
						| @ -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 */; | ||||
|  | ||||
							
								
								
									
										2
									
								
								func.js
									
									
									
									
									
								
							
							
						
						| @ -157,7 +157,7 @@ module.exports.img_recolor = (res,image,color) => { | ||||
|             image: image, | ||||
|             colors: { | ||||
|               type: 'hex', | ||||
|               targetColor: "#FFFFFF", | ||||
|               targetColor: "#c8c8c8", | ||||
|               replaceColor: `#${color}` | ||||
|             }, | ||||
|             deltaE: 10 | ||||
|  | ||||
							
								
								
									
										29
									
								
								index.js
									
									
									
									
									
								
							
							
						
						| @ -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; | ||||
|  | ||||
							
								
								
									
										50
									
								
								object.js
									
									
									
									
									
								
							
							
						
						| @ -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"){ | ||||
|  | ||||
| @ -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"}); | ||||
|  | ||||
| After Width: | Height: | Size: 88 KiB | 
| After Width: | Height: | Size: 90 KiB | 
| Before Width: | Height: | Size: 88 KiB After Width: | Height: | Size: 96 KiB | 
| Before Width: | Height: | Size: 86 KiB After Width: | Height: | Size: 95 KiB | 
| After Width: | Height: | Size: 95 KiB | 
| After Width: | Height: | Size: 95 KiB | 
| After Width: | Height: | Size: 89 KiB | 
| Before Width: | Height: | Size: 85 KiB After Width: | Height: | Size: 93 KiB | 
| After Width: | Height: | Size: 93 KiB | 
| After Width: | Height: | Size: 94 KiB | 
| After Width: | Height: | Size: 90 KiB | 
| After Width: | Height: | Size: 90 KiB | 
| After Width: | Height: | Size: 92 KiB | 
| Before Width: | Height: | Size: 134 KiB After Width: | Height: | Size: 164 KiB | 
| @ -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; | ||||
|  | ||||
| @ -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"){ | ||||
|             document.getElementById("obj_color_div").style.display = "flex"; | ||||
|             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"]); | ||||
|         } | ||||
|  | ||||
| @ -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> | ||||
|  | ||||
|  | ||||
							
								
								
									
										63
									
								
								views/admin/objects/object_colors.ejs
									
									
									
									
									
										Normal 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> | ||||
| @ -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) | ||||
|                             edit_get_objs(); | ||||
|                         } | ||||
|                     }); | ||||
|                 } | ||||
|  | ||||
| @ -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>Всего: </h1> <h1 id="users_count">0</h1></div> | ||||
|         <div style="display: flex;margin: auto 0px;">с <div id="users_from">0</div> по <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); | ||||
|                     } | ||||
|                 }); | ||||
|             } | ||||
|         } | ||||
|  | ||||
| @ -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> | ||||
|  | ||||
| @ -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}) %> | ||||
| @ -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; | ||||
|             }); | ||||
|         } | ||||
|  | ||||
| @ -88,7 +88,4 @@ | ||||
|     </style> | ||||
| </head> | ||||
| <body> | ||||
|     <script> | ||||
|         let domen = "puzzle.nor.su"; | ||||
|     </script> | ||||
|  | ||||
|  | ||||