今天我们的“本地云”练手项目开工第二天,总结了前一天大家的反应,来记录个日报。
前一日日报汇总
先来汇总一下前一个工作日大家的日报情况:
号码牌 | 日报 |
---|---|
1号 (组长) | https://blog.csdn.net/qq_43762191/article/details/106803860 |
2号 | https://blog.csdn.net/qq_45792305/article/details/106821952 |
3号 | https://blog.csdn.net/blackcamouflage/article/details/106815639 |
4号 | https://blog.csdn.net/luyaozhima/article/details/106807415 |
5号 | https://blog.csdn.net/jxy0219/article/details/106818773 |
6号 | https://blog.csdn.net/weixin_44784684/article/details/106819508 |
7号 | 已失联 |
8号(组长) | https://blog.csdn.net/qq_42151344/article/details/106819026 |
9号 | https://blog.csdn.net/qq_46485161/article/details/106819291 |
总结:说实话呢,还是有上心的人。
昨日计划任务完成情况
完成
今日规划
需求分析。
实际计划
需求分析,项目整体框架设计,数据库设计与实现
完成情况:
整体框架(这种还是比较喜欢手绘,虽然字不好看,但是手写就是有种不一样的感觉)
数据库设计(我觉得这个项目两个表就够了)
数据库板块设计:
整个模块只开放数据库操作类的接口。
数据库实现:
初代代码
//DB_base.h
#ifndef DB_BASE_H
#define DB_BASE_H
#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#include<sstream>
#include<sqlite3.h>
#include<string.h>
using namespace std;
//数据库单例
class DB_base
{
public:
static DB_base* instence(char* name);//获取数据库单例
/*对查询结果进行操作*/
//这三条函数都可以做公用
int return_serch_num(char* sql);//返回查询记录数
int ireturn_serch(char* sql);//获取查询结果(单一结果)
char* creturn_serch(char* sql);//获取查询结果(单一结果)
bool excute(char* sql);
private:
DB_base(char* name);
~DB_base();
static DB_base* My_DB;//实例
static sqlite3* db;//数据库文件句柄
};
#endif
//DB_base.cpp
#include "DB_base.h"
#include <stdlib.h>
#include <stdio.h>
DB_base* DB_base::My_DB = NULL;
sqlite3* DB_base::db = NULL;
//我只有一个数据库,所以不用传入名字了
DB_base::DB_base(char* name) //打开数据库
{
int rc = sqlite3_open(name, &db);
if (rc != SQLITE_OK)
{
printf("%s", sqlite3_errmsg(db));
exit(0);
}
}
DB_base::~DB_base()
{
sqlite3_close(db);
}
DB_base* DB_base::instence(char* name)
{
if (!My_DB)
{
My_DB = new DB_base(name);
}
return My_DB;
}
bool DB_base::excute(char* order) //这个用来传创建表的语句
{
int nRow, nColumn;
int rc;
char* errMsg;
char** dbResult;
//执行SQL语句
rc = sqlite3_get_table(db, order, &dbResult, &nRow, &nColumn, &errMsg);
//判断是否成功
if (rc != SQLITE_OK){
printf("%s", sqlite3_errmsg(db));
return false;
}
else
return true;
}
//对查询结果进行操作
int DB_base::return_serch_num(char* sql)
{
int rc, num;
char* errMsg;
char** dbResult;
int nRow = 0, nColumn = 0;
rc = sqlite3_get_table(db, sql, &dbResult, &nRow, &nColumn, &errMsg);
if (rc == SQLITE_OK)
{
num = nRow;
return num;
}
else
return 0;
}
int DB_base::ireturn_serch(char* sql)
{
char* errMsg;
char** dbResult;
int nRow = 0, nColumn = 0;
int rc;
int result;
rc = sqlite3_get_table(db, sql, &dbResult, &nRow, &nColumn, &errMsg);
if (rc == SQLITE_OK)
{
result = atoi(dbResult[nColumn]);
sqlite3_free_table(dbResult);
return result;
}
else
return 0;
}
char* DB_base::creturn_serch(char* sql)
{
char* errMsg;
char** dbResult;
int nRow = 0, nColumn = 0;
int rc;
rc = sqlite3_get_table(db, sql, &dbResult, &nRow, &nColumn, &errMsg);
if (rc == SQLITE_OK)
{
return dbResult[nColumn];
}
else
return NULL;
}
//DB_init.h
#include"DB_base.h"
class DB_init
{
private:
DB_base* My_DB;
void DB_create();
void table_create();
public:
void commmand();
};
//DB_init.cpp
#include "DB_init.h"
void DB_init::DB_create() {
char* name = new char[10];
sprintf(name, "FTP.db");
My_DB = DB_base::instence(name);
delete name;
}
void DB_init::table_create() {
char* sql = new char[120];
sprintf(sql, "select count(*) from sqlite_master where type = 'table' and name = 'UserMsg'");
if (!My_DB->ireturn_serch(sql))
{
sprintf(sql, "create table UserMsg(id int primary key,pwd int,tel text,dir_id int)");
My_DB->excute(sql);
sprintf(sql, "create table FileMsg(file_name text primary key,owner_id int,mode int,dir_id int,file_id int)");
My_DB->excute(sql);
sprintf(sql, "insert into UserMsg values(100000,123456,'18039027069',1)");
My_DB->excute(sql);
sprintf(sql, "create table DirMsg(dir_id int primary key,dir_name text,grade int,owner_id int)");
My_DB->excute(sql);
}
delete sql;
}
void DB_init::commmand() {
DB_create();
table_create();
}
//DB_command.h
#include"DB_init.h"
class DB_command
{
private:
DB_base* My_DB;
public:
DB_command();
//增
bool add_user(int id,int pwd,char* tel);
bool add_file(char* file_name,int owner_id,int mode,int dir_id);
bool add_list(int id,int pwd,int father_dir,char* dir_name);
//删
bool del_user(int user_id,int pwd);
bool del_file(int user_id,int pwd,char* file_name);
bool del_list(int user_id,int pwd,int dir_id);
//查
bool login(int user_id,int pwd);
int pwd(int user_id,char* tel);
void file_list(int user_id,int pwd,int dir_id, char* ret);
bool download(int user_id,int pwd,char* file_name);
//改
bool cpwd(int user_id, int old_pwd, int new_id);
bool cfile_addr(int user_id,int pwd,char* file_name, int old_dir, int new_dir);
bool cmode(int user_id,int pwd,char* file_name, int new_mode);
};
//DB_command.cpp
#include "DB_command.h"
DB_command::DB_command() {
DB_init* init = new DB_init();
init->commmand();
delete init;
char* name = new char[10];
sprintf(name, "FTP.db");
My_DB = DB_base::instence(name);
delete name;
}
//增
bool DB_command::add_user(int id, int pwd, char* tel) {
//先查一下该用户是否已存在
char* sql = new char[120];
int ret = 0;
sprintf(sql, "select pwd from UserMsg where id = %d", id);
if (int a = My_DB->return_serch_num(sql) == 1) {
cout << "user already in" << endl;
}
else {
//查询目录id使用情况
sprintf(sql, "select max(dir_id) from Dir_Msg");
int max = My_DB->ireturn_serch(sql) + 1;
sprintf(sql, "insert into UserMsg values(%d,%d,%s,%d)", id, pwd, tel, max);
ret = My_DB->excute(sql);
}
delete sql;
return ret;
}
bool DB_command::add_file(char* file_name, int owner_id, int mode, int dir_id) {
//先确定目录是否有问题
char* sql = new char[120];
int ret = 0;
sprintf(sql, "select owner_id from Dir_Msg where dir_id = %d", dir_id);
if (My_DB->return_serch_num(sql)) {
//再对文件id进行安排
sprintf(sql, "select max(file_id) from File_Msg where dir_id = %d", dir_id);
int file_id = My_DB->ireturn_serch(sql) + 1;
//之后将文件数据写入
sprintf(sql, "insert into FileMsg values(%s,%d,%d,%d,%d)", file_name, owner_id, mode, dir_id, file_id);
ret = My_DB->excute(sql);
}
else {
cout << "dir is not exit" << endl;
}
delete sql;
return ret;
}
bool DB_command::add_list(int id, int pwd, int father_dir, char* dir_name) {
// 先确定目录是否有问题
char* sql = new char[120];
int ret = 0;
sprintf(sql, "select owner_id from Dir_Msg where dir_name = %s", dir_name);
if (My_DB->return_serch_num(sql)) {
cout << "dir is exit" << endl;
}
else {
//生成新目录
sprintf(sql, "select dir_grade from Dir_Msg where dir_id = %d",father_dir);
int dir_grade = My_DB->ireturn_serch(sql) + 1;
sprintf(sql, "select max(dir_id) from Dir_Msg");
int dir_id = My_DB->ireturn_serch(sql) + 1;
sprintf(sql, "insert into DirMsg values(%d,%s,%d,%d)",dir_id, dir_name,dir_grade,id);
ret = My_DB->excute(sql);
}
delete sql;
return ret;
}
//删
bool DB_command::del_user(int user_id,int pwd) {
char* sql = new char[120];
sprintf(sql, "delete from FileMsg where owner_id = %d and pwd = %d", user_id,pwd);
int ret = My_DB->excute(sql);
if (ret) {
sprintf(sql, "delete from UserMsg where id = %d", user_id);
ret = My_DB->excute(sql);
}
delete sql;
return ret;
}
bool DB_command::del_file(int user_id, int pwd, char* file_name) {
if (login(user_id, pwd)) {
char* sql = new char[120];
sprintf(sql, "delete from FileMsg where user_id = %d and file_name = %s", user_id, file_name);
int ret = My_DB->excute(sql);
delete sql;
return ret;
}
else {
cout << "del file defeat" << endl;
return false;
}
}
bool DB_command::del_list(int user_id, int pwd, int dir_id) {
if (login(user_id, pwd)) {
char* sql = new char[120];
sprintf(sql, "delete from FileMsg where user_id = %d and dir_id = %d", user_id, dir_id);
int ret = My_DB->excute(sql);
if (ret) {
sprintf(sql, "delete from DirMsg where dir_grade = %d", dir_id);
ret = My_DB->return_serch_num(sql);
if (ret) {
cout << "there still some file under this dir" << endl;
}
else {
sprintf(sql, "delete from DirMsg where dir_id = %d", dir_id);
ret = My_DB->excute(sql);
}
}
else {
cout << "del dir defeat" << endl;
}
delete sql;
return ret;
}
else {
cout << "del dir defeat" << endl;
return false;
}
}
//查
bool DB_command::login(int user_id, int pwd) {
char* sql = new char[120];
sprintf(sql, "select pwd from UserMsg where id = %d", user_id);
int ret = My_DB->ireturn_serch(sql);
delete sql;
if (pwd == ret)
return true;
else
return false;
}
int DB_command::pwd(int user_id, char* tel) {
char* sql = new char[120];
sprintf(sql, "select pwd from UserMsg where id = %d and tel = %s", user_id,tel);
int ret = My_DB->ireturn_serch(sql);
delete sql;
return ret;
}
void DB_command::file_list(int user_id, int pwd, int dir_id, char* ret){
if (login(user_id, pwd)) {
char* sql = new char[120];
sprintf(sql, "select file_name from FileMsg where owner_id = %d and dir_id = %d", user_id, dir_id);
ret = My_DB->creturn_serch(sql);
sprintf(sql, "select dir_name from DirMsg where dir_grade = %d",dir_id);
strcpy(ret, My_DB->creturn_serch(sql));
delete sql;
}
else
cout << "can't get file list" << endl;
}
bool DB_command::download(int user_id, int pwd, char* file_name) {
if (login(user_id, pwd)) {
char* sql = new char[120];
sprintf(sql, "select file_id from File_Msg where file_name = %s", file_name);
int ret = My_DB->ireturn_serch(sql);
delete sql;
return ret;
}
else {
cout << "del defeat" << endl;
return false;
}
}
//改
bool DB_command::cpwd(int user_id, int old_pwd, int new_id) {
char* sql = new char[120];
sprintf(sql, "update UserMsg set pwd = %d where id = %d and pwd = %d", user_id, old_pwd, new_id);
int ret = My_DB->excute(sql);
delete sql;
return ret;
}
bool DB_command::cfile_addr(int user_id, int pwd, char* file_name, int old_dir, int new_dir) {
//修改目录前,先判断目标目录是否存在
if (login(user_id, pwd)) {
char* sql = new char[120];
sprintf(sql, "select owner_id from Dir_Msg where dir_id = %d", new_dir);
int id = My_DB->ireturn_serch(sql);
int ret = 0;
if (user_id == id) {
sprintf(sql, "update FileMsg set dir_id = %d where owner_id = %d and dir_id = %d and file_name = %s", new_dir, user_id, old_dir, file_name);
ret = My_DB->excute(sql);
}
else {
cout << "aim dir is not exit" << endl;
}
delete sql;
return false;
}
else {
cout << "del dir defeat" << endl;
return false;
}
}
bool DB_command::cmode(int user_id, int pwd, char* file_name, int new_mode){
//确定文件是不是他的
if (login(user_id, pwd)) {
char* sql = new char[120];
sprintf(sql, "update FileMsg set mode = %d where owner_id = %d and file_name = %d", new_mode, user_id, file_name);
int ret = My_DB->excute(sql);
delete sql;
return ret;
}
else {
cout << "have no mode to change mode" << endl;
return false;
}
}
下午做一个测试类来进行对数据库模块的测试,为什么要对每个类进行测试我在
<重构3>
这篇博客里讲的清楚了。