diff --git a/1.jpg b/1.jpg new file mode 100644 index 0000000..33de3f8 --- /dev/null +++ b/1.jpg @@ -0,0 +1,2 @@ +import os +os.system('ls') \ No newline at end of file diff --git a/env.py b/env.py new file mode 100644 index 0000000..68feded --- /dev/null +++ b/env.py @@ -0,0 +1,91 @@ +from __future__ import with_statement + +import logging +from logging.config import fileConfig + +from flask import current_app + +from alembic import context + +# this is the Alembic Config object, which provides +# access to the values within the .ini file in use. +config = context.config + +# Interpret the config file for Python logging. +# This line sets up loggers basically. +fileConfig(config.config_file_name) +logger = logging.getLogger('alembic.env') + +# add your model's MetaData object here +# for 'autogenerate' support +# from myapp import mymodel +# target_metadata = mymodel.Base.metadata +config.set_main_option( + 'sqlalchemy.url', + str(current_app.extensions['migrate'].db.get_engine().url).replace( + '%', '%%')) +target_metadata = current_app.extensions['migrate'].db.metadata + +# other values from the config, defined by the needs of env.py, +# can be acquired: +# my_important_option = config.get_main_option("my_important_option") +# ... etc. + + +def run_migrations_offline(): + """Run migrations in 'offline' mode. + + This configures the context with just a URL + and not an Engine, though an Engine is acceptable + here as well. By skipping the Engine creation + we don't even need a DBAPI to be available. + + Calls to context.execute() here emit the given string to the + script output. + + """ + url = config.get_main_option("sqlalchemy.url") + context.configure( + url=url, target_metadata=target_metadata, literal_binds=True + ) + + with context.begin_transaction(): + context.run_migrations() + + +def run_migrations_online(): + """Run migrations in 'online' mode. + + In this scenario we need to create an Engine + and associate a connection with the context. + + """ + + # this callback is used to prevent an auto-migration from being generated + # when there are no changes to the schema + # reference: http://alembic.zzzcomputing.com/en/latest/cookbook.html + def process_revision_directives(context, revision, directives): + if getattr(config.cmd_opts, 'autogenerate', False): + script = directives[0] + if script.upgrade_ops.is_empty(): + directives[:] = [] + logger.info('No changes in schema detected.') + + connectable = current_app.extensions['migrate'].db.get_engine() + + with connectable.connect() as connection: + context.configure( + connection=connection, + target_metadata=target_metadata, + process_revision_directives=process_revision_directives, + **current_app.extensions['migrate'].configure_args + ) + + with context.begin_transaction(): + context.run_migrations() + + +if context.is_offline_mode(): + run_migrations_offline() +else: + run_migrations_online() diff --git a/main.js b/main.js new file mode 100644 index 0000000..b617d2c --- /dev/null +++ b/main.js @@ -0,0 +1,114 @@ +// 轮播图功能 +document.addEventListener('DOMContentLoaded', function() { + const carousel = document.querySelector('.carousel-items'); + const items = document.querySelectorAll('.carousel-item'); + const totalItems = items.length; + let currentIndex = 0; + + // 自动轮播函数 + function autoSlide() { + currentIndex = (currentIndex + 1) % totalItems; + carousel.style.transform = `translateX(-${currentIndex * 100}%)`; + } + + // 设置自动轮播间隔 + setInterval(autoSlide, 5000); + + // 分类切换功能 + const categoryItems = document.querySelectorAll('.category-item'); + const softwareCards = document.querySelectorAll('.software-card'); + + categoryItems.forEach(item => { + item.addEventListener('click', () => { + categoryItems.forEach(cat => cat.classList.remove('active')); + item.classList.add('active'); + + const category = item.dataset.category; + + softwareCards.forEach(card => { + if (category === 'ALL' || card.dataset.category === category) { + card.style.display = 'block'; + } else { + card.style.display = 'none'; + } + }); + }); + }); + + // 下载记录功能 + const downloadHistoryBtn = document.querySelector('.download-history-btn'); + const downloadHistoryPopup = document.querySelector('.download-history-popup'); + const historyList = document.querySelector('.history-list'); + + // 模拟下载记录数据 + const downloadHistory = []; + + // 显示/隐藏下载记录悬浮窗 + downloadHistoryBtn.addEventListener('click', (e) => { + e.stopPropagation(); + downloadHistoryPopup.classList.toggle('active'); + updateHistoryList(); + }); + + // 点击其他地方关闭悬浮窗 + document.addEventListener('click', (e) => { + if (!downloadHistoryPopup.contains(e.target) && + !downloadHistoryBtn.contains(e.target)) { + downloadHistoryPopup.classList.remove('active'); + } + }); + + // 添加下载记录 + function addDownloadRecord(software) { + const record = { + name: software.name, + icon: software.icon, + time: new Date().toLocaleString() + }; + downloadHistory.unshift(record); + updateHistoryList(); + } + + // 更新下载记录列表 + function updateHistoryList() { + historyList.innerHTML = downloadHistory.length ? + downloadHistory.map(record => ` +
+ ${record.name} +
+
${record.name}
+
${record.time}
+
+
+ `).join('') : + '
暂无下载记录
'; + } + + // 动态加载软件列表 + function loadSoftwareList() { + fetch('php/get_software_list.php') + .then(response => response.json()) + .then(data => { + if (data.success) { + const softwareGrid = document.querySelector('.software-grid'); + softwareGrid.innerHTML = data.data.map(software => ` + +
+ ${software.name} +
+
+

${software.name}

+

${software.description}

+
+ ${software.category} +
+
+
+ `).join(''); + } + }); + } + + // 初始加载软件列表 + loadSoftwareList(); +}); \ No newline at end of file diff --git a/microshop.sql b/microshop.sql new file mode 100644 index 0000000..19c40ac --- /dev/null +++ b/microshop.sql @@ -0,0 +1,206 @@ +/* + Navicat Premium Data Transfer + + Source Server : localhost_3306 + Source Server Type : MySQL + Source Server Version : 80040 (8.0.40) + Source Host : localhost:3306 + Source Schema : microshop + + Target Server Type : MySQL + Target Server Version : 80040 (8.0.40) + File Encoding : 65001 + + Date: 26/02/2025 20:25:44 +*/ + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for alembic_version +-- ---------------------------- +DROP TABLE IF EXISTS `alembic_version`; +CREATE TABLE `alembic_version` ( + `version_num` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + PRIMARY KEY (`version_num`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of alembic_version +-- ---------------------------- +INSERT INTO `alembic_version` VALUES ('543e1103ac3c'); + +-- ---------------------------- +-- Table structure for order_items +-- ---------------------------- +DROP TABLE IF EXISTS `order_items`; +CREATE TABLE `order_items` ( + `id` int NOT NULL AUTO_INCREMENT, + `order_id` int NULL DEFAULT NULL, + `product_id` int NULL DEFAULT NULL, + `quantity` int NULL DEFAULT NULL, + `points_per_item` int NULL DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE, + INDEX `order_id`(`order_id` ASC) USING BTREE, + INDEX `product_id`(`product_id` ASC) USING BTREE, + CONSTRAINT `order_items_ibfk_1` FOREIGN KEY (`order_id`) REFERENCES `orders` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `order_items_ibfk_2` FOREIGN KEY (`product_id`) REFERENCES `products` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB AUTO_INCREMENT = 18 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of order_items +-- ---------------------------- +INSERT INTO `order_items` VALUES (1, 1, 1, 1, 10); +INSERT INTO `order_items` VALUES (2, 2, 1, 2, 10); +INSERT INTO `order_items` VALUES (3, 3, 1, 1, 10); +INSERT INTO `order_items` VALUES (4, 4, 1, 30, 10); +INSERT INTO `order_items` VALUES (5, 5, 1, 16, 10); +INSERT INTO `order_items` VALUES (6, 6, 1, 1, 10); +INSERT INTO `order_items` VALUES (7, 7, 1, 1, 10); +INSERT INTO `order_items` VALUES (8, 8, 1, 1, 10); +INSERT INTO `order_items` VALUES (9, 9, 1, 1, 10); +INSERT INTO `order_items` VALUES (10, 10, 1, 1, 10); +INSERT INTO `order_items` VALUES (11, 11, 1, 5, 10); +INSERT INTO `order_items` VALUES (12, 12, 1, 1, 10); +INSERT INTO `order_items` VALUES (13, 13, 1, 1, 10); +INSERT INTO `order_items` VALUES (14, 14, 1, 1, 10); +INSERT INTO `order_items` VALUES (15, 15, 1, 1, 10); +INSERT INTO `order_items` VALUES (17, 17, 1, 36, 10); + +-- ---------------------------- +-- Table structure for orders +-- ---------------------------- +DROP TABLE IF EXISTS `orders`; +CREATE TABLE `orders` ( + `id` int NOT NULL AUTO_INCREMENT, + `user_id` int NULL DEFAULT NULL, + `order_number` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + `secret_key` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + `total_points` int NULL DEFAULT NULL, + `status` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + `created_at` datetime NULL DEFAULT NULL, + `updated_at` datetime NULL DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `ix_orders_secret_key`(`secret_key` ASC) USING BTREE, + UNIQUE INDEX `ix_orders_order_number`(`order_number` ASC) USING BTREE, + INDEX `user_id`(`user_id` ASC) USING BTREE, + CONSTRAINT `orders_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB AUTO_INCREMENT = 18 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of orders +-- ---------------------------- +INSERT INTO `orders` VALUES (1, 2, '2025022522223866', '44cc664d-d314-49cc-b141-c5221cde342e', 10, 'cancelled', '2025-02-25 10:29:48', '2025-02-25 10:56:10'); +INSERT INTO `orders` VALUES (2, 2, '2025022530429894', '94f8f948-1127-4116-a5ba-3d4d531cbb07', 20, 'completed', '2025-02-25 11:53:31', '2025-02-25 11:54:28'); +INSERT INTO `orders` VALUES (3, 2, '2025022525981056', '35a27ea2-1d77-4343-9020-159f7fea8a6c', 10, 'completed', '2025-02-25 12:00:23', '2025-02-26 20:08:23'); +INSERT INTO `orders` VALUES (4, 2, '2025022519473399', '026517f6-50e8-4232-b5e3-b967b3611763', 300, 'cancelled', '2025-02-25 12:07:13', '2025-02-25 12:08:02'); +INSERT INTO `orders` VALUES (5, 2, '2025022519814097', '27415b0c-02c5-46b6-a8d4-1eac5632160e', 160, 'completed', '2025-02-25 12:09:36', '2025-02-26 20:08:46'); +INSERT INTO `orders` VALUES (6, 2, '2025022618118952', '49dc241e-e4ad-464f-8e96-05459ac12182', 10, 'completed', '2025-02-26 05:28:47', '2025-02-26 20:08:42'); +INSERT INTO `orders` VALUES (7, 2, '2025022616425925', '9dbc780c-8d1b-42f6-896b-ff46db4d9938', 10, 'completed', '2025-02-26 07:21:07', '2025-02-26 20:08:39'); +INSERT INTO `orders` VALUES (8, 2, '2025022623399158', 'b58b8cdb-a420-41d1-9ecd-503b53a0eed3', 10, 'completed', '2025-02-26 07:41:33', '2025-02-26 20:08:35'); +INSERT INTO `orders` VALUES (9, 2, '2025022610810765', '9a2edf37-6e60-4c68-81f2-fddbbf82da8f', 10, 'completed', '2025-02-26 08:10:50', '2025-02-26 20:08:31'); +INSERT INTO `orders` VALUES (10, 2, '2025022620747209', '6907aa6e-a071-4143-bb23-890f30aa9534', 10, 'completed', '2025-02-26 08:13:50', '2025-02-26 20:08:27'); +INSERT INTO `orders` VALUES (11, 2, '2025022632966151', 'bda40ae9-53dd-4780-bc06-d9961a361cd9', 50, 'cancelled', '2025-02-26 08:15:29', '2025-02-26 08:15:49'); +INSERT INTO `orders` VALUES (12, 2, '2025022624779102', '07350e7f-a301-472f-a49a-e2a173eaef62', 10, 'cancelled', '2025-02-26 16:19:19', '2025-02-26 16:19:51'); +INSERT INTO `orders` VALUES (13, 2, '2025022617063456', 'ad5e50d7-c247-4354-8977-960156218eef', 10, 'completed', '2025-02-26 17:25:16', '2025-02-26 20:08:19'); +INSERT INTO `orders` VALUES (14, 2, '2025022626865785', 'f357bd2d-d83a-47c8-bc8d-4ca1456da82a', 10, 'completed', '2025-02-26 17:27:36', '2025-02-26 20:08:15'); +INSERT INTO `orders` VALUES (15, 2, '2025022631005279', 'b8e66525-f8db-4740-ae12-8439b4b24327', 10, 'completed', '2025-02-26 17:44:12', '2025-02-26 20:08:12'); +INSERT INTO `orders` VALUES (17, 2, '2025022612107035', '128c8129-e6aa-41d9-9505-0cd0651449f2', 360, 'completed', '2025-02-26 17:54:24', '2025-02-26 17:54:37'); + +-- ---------------------------- +-- Table structure for points_records +-- ---------------------------- +DROP TABLE IF EXISTS `points_records`; +CREATE TABLE `points_records` ( + `id` int NOT NULL AUTO_INCREMENT, + `user_id` int NULL DEFAULT NULL, + `points` int NOT NULL, + `action` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + `created_at` datetime NULL DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE, + INDEX `user_id`(`user_id` ASC) USING BTREE, + CONSTRAINT `points_records_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB AUTO_INCREMENT = 23 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of points_records +-- ---------------------------- +INSERT INTO `points_records` VALUES (1, 2, 3, '其他', '其他获得3积分', '2025-02-26 06:04:47'); +INSERT INTO `points_records` VALUES (5, 2, 3, '其他', '其他获得3积分', '2025-02-26 14:12:37'); +INSERT INTO `points_records` VALUES (9, 2, -10, '消费', '消费消费10积分', '2025-02-26 15:21:07'); +INSERT INTO `points_records` VALUES (10, 2, -10, '消费', '消费消费10积分', '2025-02-26 15:41:33'); +INSERT INTO `points_records` VALUES (11, 2, -10, '消费', '消费消费10积分', '2025-02-26 16:10:50'); +INSERT INTO `points_records` VALUES (12, 2, -10, '消费', '消费消费10积分', '2025-02-26 16:13:50'); +INSERT INTO `points_records` VALUES (13, 2, -50, '消费', '消费消费50积分', '2025-02-26 16:15:29'); +INSERT INTO `points_records` VALUES (14, 2, -10, '消费', '消费消费10积分', '2025-02-26 16:19:19'); +INSERT INTO `points_records` VALUES (15, 2, -10, '消费', '消费消费10积分', '2025-02-26 17:25:16'); +INSERT INTO `points_records` VALUES (16, 2, -10, '消费', '消费消费10积分', '2025-02-26 17:27:36'); +INSERT INTO `points_records` VALUES (17, 2, -10, '消费', '消费消费10积分', '2025-02-26 17:44:12'); +INSERT INTO `points_records` VALUES (18, 2, 1000, '其他', '其他获得1000积分', '2025-02-26 17:52:03'); +INSERT INTO `points_records` VALUES (19, 2, -360, '消费', '消费消费360积分', '2025-02-26 17:54:24'); +INSERT INTO `points_records` VALUES (20, 2, 3, '其他', '其他获得3积分', '2025-02-26 19:50:06'); +INSERT INTO `points_records` VALUES (21, 10, 1, '签到', '每日签到获得积分', '2025-02-26 19:50:14'); +INSERT INTO `points_records` VALUES (22, 10, 100, '其他', '其他获得100积分', '2025-02-26 20:07:47'); + +-- ---------------------------- +-- Table structure for products +-- ---------------------------- +DROP TABLE IF EXISTS `products`; +CREATE TABLE `products` ( + `id` int NOT NULL AUTO_INCREMENT, + `title` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `description` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL, + `price` int NOT NULL, + `image_path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + `stock` int NULL DEFAULT NULL, + `is_active` tinyint(1) NULL DEFAULT NULL, + `created_at` datetime NULL DEFAULT NULL, + `updated_at` datetime NULL DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 8 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of products +-- ---------------------------- +INSERT INTO `products` VALUES (1, '步道乐跑', '此商品为虚拟产品,购买此类商品默认用户承担一定的账号管控风险。人工手动模拟定位,路线不穿墙,配速合理化,降低被BAN风险。欢迎用户选择购买。', 10, 'images/products/cba29f39-895e-432e-aa7a-665aed1034a1_logo.png', 0, 1, '2025-02-25 10:01:55', '2025-02-26 09:54:24'); +INSERT INTO `products` VALUES (2, 'PS图像处理', '接PS人物简修、图片正色、证件照处理、PS作业。如需设计海报、人物精修、精细抠图价格另算。', 99, 'images/products/ed3a1c89-b053-4ec0-a646-e615aabcdf36_IMG_9246.PNG', 999, 1, '2025-02-26 09:24:50', '2025-02-26 11:54:40'); +INSERT INTO `products` VALUES (3, '信息安全与评估培训', '为Luistin讲师代言的知识星球附赠授课,优惠价培训。海量的高价值学习资料风险,购买只会让你赚不会让你亏。信息安全与评估比赛是能够有机会获得免试专升本资格的。', 5999, 'images/products/48f67dbd-344c-46b4-b17c-e0cb19884433_IMG_9241.PNG', 8, 1, '2025-02-26 11:58:22', '2025-02-26 11:58:22'); +INSERT INTO `products` VALUES (4, '云晞实验室', '云晞实验室是由云晞科技开展的知识星球,不定时分享各种各样的基础知识学习资料,价格实惠。', 399, 'images/products/3813c6e5-fdce-41a1-9c91-5c9bfbc6b1d0_IMG_9242.PNG', 10, 1, '2025-02-26 11:59:46', '2025-02-26 11:59:46'); +INSERT INTO `products` VALUES (5, '电脑存储整理', '流氓软件卸载、注册表清理、碎片清理、缓存清理、C盘清理、内存优化。', 59, 'images/products/833c36fc-68ba-40f6-b73d-33d90fb70985_IMG_9244.PNG', 999, 1, '2025-02-26 12:01:36', '2025-02-26 12:01:36'); +INSERT INTO `products` VALUES (6, 'Linux作业指导', '作业指导附赠Linux基础命令资料。', 49, 'images/products/c528131c-aa5a-4d20-94c1-9e55d282dedd_OIP-C.jpg', 999, 1, '2025-02-26 12:05:45', '2025-02-26 12:05:45'); +INSERT INTO `products` VALUES (7, 'eNSP指导', 'eNSP40报错解决、命令指导、基础知识讲解。', 69, 'images/products/3789228d-cbd8-4aa3-96ef-bbb4346def89_OIP-C_1.jpg', 999, 1, '2025-02-26 12:07:19', '2025-02-26 12:07:19'); + +-- ---------------------------- +-- Table structure for users +-- ---------------------------- +DROP TABLE IF EXISTS `users`; +CREATE TABLE `users` ( + `id` int NOT NULL AUTO_INCREMENT, + `username` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + `email` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + `password_hash` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + `points` int NULL DEFAULT NULL, + `is_admin` tinyint(1) NULL DEFAULT NULL, + `last_checkin` date NULL DEFAULT NULL, + `created_at` datetime NULL DEFAULT NULL, + `last_share` date NULL DEFAULT NULL, + `total_points` int NULL DEFAULT NULL, + `invitation_code` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + `invited_by` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + `avatar_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `ix_users_username`(`username` ASC) USING BTREE, + UNIQUE INDEX `ix_users_email`(`email` ASC) USING BTREE, + UNIQUE INDEX `invitation_code`(`invitation_code` ASC) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 11 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of users +-- ---------------------------- +INSERT INTO `users` VALUES (1, 'lucifrix', '1013199991@qq.com', 'pbkdf2:sha256:260000$aMgDbc2s6pwHr9La$77f76ca88499cd008c945e55eb0851db6a4af1954289f65c3fbaa7a5e23661e8', 4, 0, '2025-02-25', '2025-02-25 05:34:06', '2025-02-25', NULL, '44DI87OX', NULL, NULL); +INSERT INTO `users` VALUES (2, 'admin', 'lucifrix@163.com', 'pbkdf2:sha256:260000$ZjtA6Zj7P8CbcUtw$22cefee3333157d61cd2fe475d6dbfb71e3d640529b053a6b3f654f114311783', 645, 1, '2025-02-26', '2025-02-25 05:37:20', '2025-02-26', 1233, 'AI9Z7CT3', NULL, '/static/uploads/avatars/40ba0346709b4a0f82a32be81ee9cdb0.jpg'); +INSERT INTO `users` VALUES (10, 'yunxikeji', '768603120@qq.com', 'pbkdf2:sha256:260000$dIumTpxvnVMfK0By$525ffefb785517dbee3ff4f7bed37fdb2e76fcddce72a323c8572be986400953', 101, 0, '2025-02-26', '2025-02-26 11:50:06', NULL, 101, '0JQKHLLU', 'AI9Z7CT3', '/static/images/default-avatar.png'); + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/setting.json b/setting.json new file mode 100644 index 0000000..d3cb7f8 --- /dev/null +++ b/setting.json @@ -0,0 +1,3 @@ +{ + "launcherCounts": 1 +} \ No newline at end of file diff --git a/style.css b/style.css new file mode 100644 index 0000000..3475d1a --- /dev/null +++ b/style.css @@ -0,0 +1,311 @@ +/* 全局样式重置 */ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: 'PingFang SC', 'Microsoft YaHei', sans-serif; + background: #fff; + color: #333; + min-height: 100vh; + display: flex; + flex-direction: column; +} + +/* 页眉样式 */ +.header { + background: #1E90FF; + padding: 0.8rem 0; + position: fixed; + width: 100%; + top: 0; + z-index: 1000; +} + +.header-content { + max-width: 1400px; + margin: 0 auto; + display: flex; + justify-content: space-between; + align-items: center; + padding: 0 2rem; +} + +.logo img { + height: 32px; +} + +.nav-menu { + display: flex; + gap: 2rem; + align-items: center; +} + +.nav-item { + color: white; + text-decoration: none; + font-size: 0.95rem; + position: relative; +} + +.nav-item.active::after { + content: ''; + position: absolute; + bottom: -5px; + left: 0; + width: 100%; + height: 2px; + background: white; +} + +.user-menu { + display: flex; + align-items: center; + gap: 1.5rem; +} + +.user-menu a { + color: white; + text-decoration: none; +} + +/* 轮播图样式 */ +.carousel-container { + margin-top: 60px; + width: 100%; + height: 400px; + overflow: hidden; + position: relative; +} + +.carousel { + width: 100%; + height: 100%; + position: relative; +} + +.carousel-items { + display: flex; + height: 100%; + transition: transform 0.5s ease-in-out; +} + +.carousel-item { + flex: 0 0 100%; + height: 100%; +} + +.carousel-item img { + width: 100%; + height: 100%; + object-fit: cover; +} + +/* 分类导航样式 */ +.categories { + max-width: 1400px; + margin: 2rem auto; + padding: 0 2rem; + display: flex; + justify-content: center; + gap: 1.5rem; + border-bottom: 1px solid #eee; + padding-bottom: 1rem; +} + +.category-item { + padding: 0.5rem 1.5rem; + border-radius: 4px; + cursor: pointer; + transition: all 0.3s ease; + color: #666; + font-size: 0.9rem; +} + +.category-item.active { + background: #1E90FF; + color: white; +} + +/* 软件展示区样式 */ +.software-grid { + max-width: 1400px; + margin: 0 auto; + padding: 2rem; + display: grid; + grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)); + gap: 2rem; +} + +.software-card { + display: block; + text-decoration: none; + background: white; + border-radius: 8px; + overflow: hidden; + box-shadow: 0 2px 10px rgba(0,0,0,0.05); + transition: all 0.3s ease; + cursor: pointer; + border: 1px solid #eee; +} + +.software-card:hover { + transform: translateY(-5px); + box-shadow: 0 5px 15px rgba(0,0,0,0.1); +} + +.software-image { + position: relative; + padding-top: 56.25%; /* 16:9 比例 */ +} + +.software-image img { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + object-fit: cover; +} + +.software-info { + padding: 1.2rem; +} + +.software-info h3 { + font-size: 1.1rem; + margin-bottom: 0.5rem; + color: #333; +} + +.software-info p { + color: #666; + font-size: 0.85rem; + line-height: 1.5; +} + +/* 添加标签样式 */ +.software-tags { + display: flex; + gap: 0.5rem; + margin-top: 0.8rem; +} + +.tag { + padding: 0.2rem 0.8rem; + background: #f5f7fa; + border-radius: 3px; + font-size: 0.75rem; + color: #666; +} + +/* 页脚样式 */ +.footer { + background: #2c3e50; + color: white; + padding: 2rem 0; + width: 100%; + margin-top: auto; +} + +.footer-content { + max-width: 1200px; + margin: 0 auto; + text-align: center; +} + +/* 修改main样式 */ +main { + flex: 1; + padding-bottom: 2rem; +} + +/* 下载记录按钮和悬浮窗样式 */ +.download-history-container { + position: relative; +} + +.download-history-btn { + background: none; + border: none; + color: white; + cursor: pointer; + display: flex; + align-items: center; + gap: 8px; + font-size: 0.95rem; + padding: 0.5rem 1rem; +} + +.download-history-popup { + position: absolute; + top: 100%; + right: 0; + width: 300px; + background: white; + border-radius: 8px; + box-shadow: 0 4px 12px rgba(0,0,0,0.15); + margin-top: 10px; + display: none; + z-index: 1000; +} + +.download-history-popup.active { + display: block; +} + +.popup-header { + padding: 1rem; + border-bottom: 1px solid #eee; +} + +.popup-header h3 { + color: #333; + font-size: 1rem; + margin: 0; +} + +.popup-content { + max-height: 400px; + overflow-y: auto; +} + +.history-list { + padding: 0.5rem 0; +} + +.history-item { + padding: 0.8rem 1rem; + border-bottom: 1px solid #f5f5f5; + display: flex; + align-items: center; + gap: 1rem; +} + +.history-item:last-child { + border-bottom: none; +} + +.history-item-icon { + width: 40px; + height: 40px; + border-radius: 8px; + object-fit: cover; +} + +.history-item-info { + flex: 1; +} + +.history-item-name { + font-size: 0.9rem; + color: #333; + margin-bottom: 0.2rem; +} + +.history-item-time { + font-size: 0.8rem; + color: #999; +} \ No newline at end of file diff --git a/可恶的黑客.pcapng b/可恶的黑客.pcapng new file mode 100644 index 0000000..e1f517a Binary files /dev/null and b/可恶的黑客.pcapng differ