简易版局域网云盘(利用MySQL+Python实现)

MySQL文件代码如下:

-- MySQL dump 10.13  Distrib 5.7.43, for Win64 (x86_64)
--
-- Host: localhost    Database: files
-- ------------------------------------------------------
-- Server version	5.7.43

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Current Database: `files`
--

CREATE DATABASE /*!32312 IF NOT EXISTS*/ `files` /*!40100 DEFAULT CHARACTER SET utf8 */;

USE `files`;

--
-- Table structure for table `file_data`
--

DROP TABLE IF EXISTS `file_data`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `file_data` (
  `FILE_ID` int(6) NOT NULL,
  `FILE_NAME` varchar(50) DEFAULT NULL,
  `FILE_DATAS` longtext,
  `CREATE_FILE_DATE` datetime DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`FILE_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `file_data`
--

LOCK TABLES `file_data` WRITE;
/*!40000 ALTER TABLE `file_data` DISABLE KEYS */;
/*!40000 ALTER TABLE `file_data` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `user`
--

DROP TABLE IF EXISTS `user`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `user` (
  `UserNo` int(4) NOT NULL AUTO_INCREMENT COMMENT '用户编号',
  `UserName` varchar(12) DEFAULT NULL,
  `PassWord` varchar(18) DEFAULT NULL COMMENT '密码',
  PRIMARY KEY (`UserNo`),
  UNIQUE KEY `UserName` (`UserName`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `user`
--

LOCK TABLES `user` WRITE;
/*!40000 ALTER TABLE `user` DISABLE KEYS */;
/*!40000 ALTER TABLE `user` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

-- Dump completed on 2023-10-19 18:51:34

Python代码如下:

import os
import getpass
import base64
import pymysql
from time import sleep

user = 'cm9vdA=='
pwd = 'WHlMaW56YzEyMy4='
host = 'MTkyLjE2OC4yMS4yMjk='
port = 'MzMwNg=='

try:
    mysql = pymysql.connect(user=base64.b64decode(user).decode("utf8"),
                            passwd=base64.b64decode(pwd).decode("utf8"), 
                            host=base64.b64decode(host).decode("utf8"), 
                            port=int(base64.b64decode(port).decode("utf8")))
    # 创建游标
    cursor = mysql.cursor()
except:
    print("连接超时...\n即将关闭程序")
    sleep(1.5)
    exit(1)

class Cloud_disk:

    def HomePage():
        while True:
            print(f"\n{'/******** 云盘系统 ********/':^25}\n")
            print(f"{'|   1.登录   |':^25}\n{'|   2.注册   |':^25}\n{'|   3.退出   |':^25}\n\t\t\t----COPYRIGHT : CN_Lin")
            options = input(">>")
            if options == '1':
                os.system("cls")
                Cloud_disk.Login()
            elif options == '2':
                os.system("cls")
                Cloud_disk.sign_on()
            elif options =='3':
                # 退出
                exit(1)
            else:
                os.system("cls")
                print("无此选项!!!")

    """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

    # 登陆模块
    def Login():

        adminuser = "TGluLg=="
        adminpwd = "WHlMaW56Yw=="

        # sql = 'select UserName, PassWord from files.user'
        # cursor.execute(sql)
        # user_connect = cursor.fetchall()        # 获取查询数据

        times=4
        print(f"\n{'/*登录中心*/':^25}\n")
        while times:
            user = input("账户: ")
            pwd = getpass.getpass("密码: ")

            # 直接从数据库中查询当前用户与密码,可以解决人多用循环速度慢的问题
            sql = f'select UserName, PassWord from files.user where UserName="{user}"'
            cursor.execute(sql)
            user_connects = cursor.fetchall()        # 获取查询数据

            for user_connect in user_connects:      # user_connect 用户信息   [0]是用户名   [1] 是密码
                if(user == user_connect[0] and pwd == user_connect[1]):
                    if(user == base64.b64decode(adminuser).decode("utf8") and pwd == base64.b64decode(adminpwd).decode("utf8")):
                        os.system("cls")
                        print("\n/*管理员*/\n")
                        Cloud_disk.admin()
                    else:
                        os.system("cls")
                        while True:
                            options = input("\n\t /** 功能 **/\n\n 1.上传\n 2.下载\n 3.返回\n\n >> ")
                            if options == '1':
                                Cloud_disk.upload()
                            elif options == '2':
                                Cloud_disk.download()
                            elif options == '3':
                                return 0
                            else:
                                print("ERROR! 无此项 重新输入\n")
                            os.system("cls")
                                
            times-=1
            print(f"账户或密码错误,请重试!'\n/*剩余{times}次机会*/\n")
        print("! 账户锁定1分钟 !\n")
        sleep(60)
        os.system("cls")

    """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""        

    # 注册模块    
    def sign_on():
        print(f"\n{'/*注册中心*/':^25}\n")
        while True:
            user = input("账户: ")
            pwd = getpass.getpass("密码: ")
            pwds = getpass.getpass("\n再次确认密码: ")
            if pwd == pwds:
                if(len(user)>12 or len(pwd)>18):
                    print("账户长度不能超过12\n密码长度不能超过18!\n")
                    continue
                else:
                    sql_1 = 'select UserNo from files.user'
                    cursor.execute(sql_1)
                    scont = cursor.fetchall()
                    sql_2 = f"insert into files.user values({len(scont)+1},'{user}','{pwd}')"

                    try:
                        cursor.execute(sql_2)
                        mysql.commit()
                        cursor.fetchall()
                        print(f"注册成功!\n请妥善保管好您的\n账户: {user}\n密码:{pwd}\n及即将返回主页!\n")
                        Cloud_disk.Login()
                        break
                    except:
                        print("注册失败!")
                        Cloud_disk.sign_on()
            else:
                os.system("cls")
                print("亲,两次密码输滴不正确哟!\n")

    """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

    # MySQL管理员模块
    def admin():
        while True:
            sql = input("Mysql >")
            if sql == 'exit':
                Cloud_disk.HomePage()
            else:
                try:
                    cursor.execute(sql)
                    conts = cursor.fetchall()
                    mysql.commit()
                    for cont in conts:
                        print(list(cont))
                    print("\nQuery OK!\n")
                except:
                    print("SQL语句有误!\n")
        

    """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""   

    # 上传模块
    def sqlupload(file_path):
        # 查询服务器的数据量
        nums_sql = f"select FILE_ID from files.file_data"
        cursor.execute(nums_sql)
        mysql.commit()

        nums = cursor.fetchall()

        with open(file_path,"rb") as F1:
                    content = F1.read()
        file_name = os.path.split(file_path)[1]
                
        content = base64.b64encode(content).decode("utf8")
        sql = f"insert into files.file_data(FILE_ID, FILE_NAME, FILE_DATAS) values({len(nums)+1},'{file_name}','{content}')"

        cursor.execute(sql)
        mysql.commit()
        print(f"{file_name}上传成功!\n") 



    def upload():

        # 记录文件夹中的文件
        FILES = []

        while True:
            file_path = input("文件地址 > ")

            # 设置中途返回
            if file_path == 'exit':
                break
                
            # 上传文件夹中的数据
            if os.path.isdir(file_path):
                print("\n当前需要上传的文件如下: \n+--------------------------+")
                nums= 0
                for Fs in os.listdir(file_path):
                    if(os.path.isfile(os.path.join(file_path,Fs))):
                        print(f"|{nums}. {Fs}")
                        FILES.append(os.path.join(file_path,Fs))
                        nums += 1
                
                input("+--------------------------+\n按任意键确定开始...\n")
                for FisP in FILES:
                    Cloud_disk.sqlupload(FisP)

            # 上传文件
            else:
                if os.path.isfile(file_path):
                    Cloud_disk.sqlupload(file_path)
            
                else:
                    print("! 请输入正确的文件地址 !\n")
                    continue
                
          

    """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""   

    # 下载模块
    def download():

        # 用于记录文件是否全部下完
        count = 0
        Filecount = 1
        FIles = []

        state = True        
        while state:
            if(count == Filecount):
                os.system("cls")
                print(f"{FIles} 文件下载成功\n")
            sql = 'select FILE_ID, FILE_NAME from files.file_data'
            cursor.execute(sql)
            lists = cursor.fetchall()
            mysql.commit()

            # 文件编号存储
            FileNo = []
            INPUTNo = []

            # 记录文件
            record_file = []

            # 查询存储文件的列表
            print("\n[编号]  [名称]")
            for ls in lists:
                print(list(ls))
                FileNo.append(ls[0])
        
            
            numbers = input("\n[温馨提示]: 用逗号隔开可以多选文件哦!\n文件编号>> ")

            # 设置中途返回
            if numbers == 'exit':
                state = False
            
            # 记录下载次数
            record = 0
        
            # 任务列表
            INPUTNo = numbers.split(",")
            for number in INPUTNo:

                # 判断是否是数字
                if number.isdigit() and int(number) in FileNo:
                    # 获取文件数据
                    dsql = f'select FILE_NAME, FILE_DATAS from files.file_data where FILE_ID = {number}'
                    cursor.execute(dsql)
                    datas = cursor.fetchall()
                    mysql.commit()

                    for data in datas:
                        file_datas = data

                        # 解码
                        file_data = base64.b64decode(file_datas[1])

                        # 只输入一次地址
                        if record == 0:
                            while True:
                                faddr = input("下载地址>> ")
                                if faddr == 'exit':
                                    state = False
                                if faddr == 'C:' or faddr == 'c:':
                                    print("无权限访问C盘根目录, 请重新输入\n")
                                    continue
                                else:
                                    break
                        try:
                            with open(faddr+'\\'+file_datas[0],"wb") as file:
                                file.write(file_data)
                        except:
                            print("! 请输入正确的文件夹地址 !\n")
                            continue
                
                        print(f"\n{file_datas[0]}下载成功!\n")
                        record_file.append(file_datas[0])
                        record += 1
                else:
                    os.system("cls")
                    print(f"{record_file} {len(record_file)}个文件下载成功, 但发现了一处错误: ")
                    print(f"! 无效的'{number}', 文件未下载成功, 请选择正确的编号 !")
                    break
            count = record
            Filecount = len(INPUTNo)
            FIles = record_file


if  __name__ == '__main__':
    disk = Cloud_disk
    disk.HomePage()
    

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值