From 877747bbc54331d268b6cd8d51a741345ff759db Mon Sep 17 00:00:00 2001
From: achenc1013 <1013199991@qq.com>
Date: Tue, 4 Mar 2025 23:48:47 +0800
Subject: [PATCH] Add files via upload
https://yunce.wk9988.cn/
---
1.jpg | 2 +
env.py | 91 ++++++++++++++
main.js | 114 +++++++++++++++++
microshop.sql | 206 ++++++++++++++++++++++++++++++
setting.json | 3 +
style.css | 311 ++++++++++++++++++++++++++++++++++++++++++++++
可恶的黑客.pcapng | Bin 0 -> 273776 bytes
7 files changed, 727 insertions(+)
create mode 100644 1.jpg
create mode 100644 env.py
create mode 100644 main.js
create mode 100644 microshop.sql
create mode 100644 setting.json
create mode 100644 style.css
create mode 100644 可恶的黑客.pcapng
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.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.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 0000000000000000000000000000000000000000..e1f517a8d6774f14647b5b0ba4c476eda862ca1e
GIT binary patch
literal 273776
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