项目背景
传统的项目管理,主要依托于人类手工作业,效率不能保证,可能因为人为因素会导致资源浪费、沟通不畅导致信息不对等,难以把握项目进度。项目的存储主要依赖于大量的纸质文件存储,会存在丢失和更新不及时的情况,以及难以翻阅,难以得到关键信息等因素。
随着互联网技术的发展,越来越多的企业,一个企业所掌管的项目数量越来越多,成千上百个项目的管理,以传统的项目管理若为依托,效率和误差等一些问题逐渐成为最主要的因素,因此基于互联网的项目管理系统成为当务之急,迫切成为一个企业能否良好发展的必要因素之一。
项目概述
项目管理系统在向众企业提供一个基于互联网的项目管理系统,使其可以摒弃传统项目管理带来的种种风险和效率问题。该项目是基于Linux系统,Linux系统是以应用为中心,以计算机技术为基础,软硬件可剪裁,以及开源等优点。成为更多企业更喜爱的系统之一。采用哈希存储,可以基于文件某一属性直接定位到查找地方,节省查找时间。
一个大型的项目管理系统,可以支持项目管理的多个方面,包括项目计划、进度跟踪、资源管理、任务分配、沟通协作、问题解决和报告等,可以帮助团队或组织有效地规划、执行和监控项目。因此该项目管理系统主要实现对项目的新增功能,删除功能,修改功能已及查询功能,同时对现已存在的项目进行及时的文件导出导入等功能,提供良好的用户体验,同时提高项目管理的效率以及可以避免人为因素的风险问题。
项目流程图
代码实现
头文件
#ifndef _MYHEAD_H_
#define _MYHEAD_H_
//头文件
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
//宏定义
#define SIZE 20
//变量
typedef struct project
{
//项目编号
int id;
//项目名称
char name[20];
//项目负责人
char man[10];
//项目进度
float schedule;
//项目预计成本;
float proCost;
//项目实际成本
float actCost;
//项目状态
char state[10];
}data_type;
typedef struct linkNode
{
data_type data;
struct linkNode* next;
}linkNode;
typedef struct Hash
{
linkNode* pArr[SIZE];
int count; //项目个数
int lastId;//最后一个项目id
}Hash;
//函数声明
//创建hash表
Hash* createHash(void);
//导入信息
int inputProject(Hash* pHash);
//菜单
int menu();
//位置函数
int hashfun(int id);
//创建链接点
linkNode* createNode();
//插入
int insert(Hash* pHash, data_type item);
//显示
int show(Hash* pHash);
//删除
int deletepro(Hash * pHash, int id);
//搜索
int search(Hash* pHash, int id, data_type* pData);
//修改
int alter(Hash* pHash, data_type item);
//导出信息
int output(Hash* pHash);
//销毁
int destroy(Hash** pphash);
//枚举
typedef enum myenum
{
Hash_NULL,
INPUT_ERR,
LINK_NULL,
OK,
ID_ERR,
}myenum;
#endif
主函数
#include "../include/myhead.h"
//主函数
int main(void)
{
int opt = 0;
int id = 0;
data_type item;
int op = 0;
int result = 0;
//进入主程序
//创建hash表
Hash* pHash = NULL;
pHash = createHash();
if(!pHash) return Hash_NULL;
//hash 表创建好 加载文件中的数据到hash表中
result = inputProject(pHash);
if(result != OK) return -1;
//加载菜单
while(1)
{
op = menu();
if(-1 == op) break;
switch(op)
{
case 1:
// 新增项目
puts("请输入项目名称");
scanf("%s", item.name);
item.id = pHash->lastId+1;
pHash->lastId++;
puts("请输入项目负责人");
scanf("%s", item.man);
puts("请输入项目进度");
scanf("%f", &item.schedule);
puts("请输入预计成本");
scanf("%f", &item.proCost);
puts("请输入实际成本");
scanf("%f", &item.actCost);
puts("请输入项目状态");
scanf("%s", item.state);
result = insert(pHash, item);
break;
case 2:
//删除项目
puts("请输入要删除项目的id");
scanf("%d", &id);
result = deletepro(pHash, id);
break;
case 3:
//查询
puts("请输入要查询项目的id");
scanf("%d", &id);
result = search(pHash, id, &item);
break;
case 4:
//修改项目
puts("请输入要修改项目的id");
scanf("%d", &id);
search(pHash, id, &item);
while(1)
{
puts("请输入你要修改的项目属性");
puts("(1--项目名称)(2--项目负责人)(3--项目进度)(4--项目预计成本)(5--项目实际成本)(6--项目状态)(-1--退出)");
scanf("%d", &opt);
if(-1 == opt) break;
switch(opt)
{
case 1:
puts("请输入项目名称");
scanf("%s", item.name);
break;
case 2:
puts("请输入项目负责人");
scanf("%s", item.man);
break;
case 3:
puts("请输入项目进度");
scanf("%f", &item.schedule);
break;
case 4:
puts("请输入项目预计成本");
scanf("%f", &item.proCost);
break;
case 5:
puts("请输入项目实际成本");
scanf("%f", &item.actCost);
break;
case 6:
puts("请输入项目状态");
scanf("%s", item.state);
break;
default:
puts("请输入正确选项");
}
}
result = alter(pHash, item);
break;
case 5:
//展示项目
result = show(pHash);
break;
default:
puts("请输入正确选项");
}
switch(result)
{
case Hash_NULL:
puts("Hash_NULL");
break;
case INPUT_ERR:
puts("INPUT_ERR");
break;
case LINK_NULL:
puts("LINK_NULL");
break;
case OK:
puts("OK");
break;
case ID_ERR:
puts("ID_ERR");
break;
}
}
//自动导入
result = output(pHash);
if(result != OK) return -1;
//销毁
printf("释放前%p\n", pHash);
destroy(&pHash);
printf("释放后%p\n", pHash);
return 0;
}
插入
#include "../include/myhead.h"
//新增项目信息
int insert(Hash* pHash, data_type item)
{
linkNode* plink = NULL;
int pos = 0;
// 入参判度
if(!pHash) return Hash_NULL;
//通过id获得插入位置
pos = hashfun(item.id);
//创建链结点
plink = createNode();
if(!plink) return LINK_NULL;
//赋值
plink->data = item;
//保护后面结点
plink->next = pHash->pArr[pos];
pHash->pArr[pos] = plink;
pHash->count++;
return OK;
}
删除
#include "../include/myhead.h"
//删除项目
int deletepro(Hash* pHash, int id)
{
linkNode* pTmp = NULL;
//入参判断
if(!pHash) return Hash_NULL;
if(id < 0 || id > pHash->lastId) return ID_ERR;
//找位置
int pos = hashfun(id);
pTmp = pHash->pArr[pos];
if(!pTmp) return ID_ERR;
while(pTmp)
{
if(pTmp->data.id == id)
{
strcpy(pTmp->data.state,"已删除");
pHash->count--;
break;
}
pTmp = pTmp->next;
}
return OK;
}
修改
#include "../include/myhead.h"
//修改项目
int alter(Hash* pHash, data_type item )
{
linkNode* pTmp = NULL;
//入参判断
if(!pHash) return Hash_NULL;
//找位置
int pos = hashfun(item.id);
pTmp = pHash->pArr[pos];
if(!pTmp) return ID_ERR;
while(pTmp)
{
if(pTmp->data.id == item.id)
{
pTmp->data = item;
break;
}
pTmp = pTmp->next;
}
return OK;
}
查找
#include "../include/myhead.h"
//搜索
int search(Hash* pHash, int id, data_type* pData)
{
linkNode* pTmp = NULL;
//入参判断
if(!pHash) return Hash_NULL;
if(id < 0 || id > pHash->lastId) return ID_ERR;
//查找位置
int pos = hashfun(id);
pTmp = pHash->pArr[pos];
if(!pTmp) return ID_ERR;
while(pTmp)
{
if(pTmp->data.id == id)
{
puts("------------------------");
printf("项目编号:%d\n", pTmp->data.id);
printf("项目名称:%s\n", pTmp->data.name);
printf("项目负责人:%s\n", pTmp->data.man);
printf("项目进度:%.2f%%\n", pTmp->data.schedule);
printf("项目预计成本:%.2f万元\n", pTmp->data.proCost);
printf("项目实际成本:%.2f万元\n", pTmp->data.actCost);
printf("项目状态:%s\n", pTmp->data.state);
puts("------------------------");
*pData = pTmp->data;
break;
}
pTmp = pTmp->next;
}
return OK;
}
展示
#include "../include/myhead.h"
//展示项目
int show(Hash* pHash)
{
linkNode* pTmp = NULL;
//入参判断
if(!pHash) return Hash_NULL;
for(int i = 0; i < SIZE; i++)
{
pTmp = pHash->pArr[i];
while(pTmp)
{
puts("-----------------------------");
printf("项目编号:%d\n", pTmp->data.id);
printf("项目名称:%s\n", pTmp->data.name);
printf("项目负责人:%s\n", pTmp->data.man);
printf("项目进度:%.2f%%\n", pTmp->data.schedule);
printf("项目预计成本:%.2f万元\n", pTmp->data.proCost);
printf("项目实际成本:%.2f万元\n", pTmp->data.actCost);
printf("项目状态:%s\n",pTmp->data.state);
puts("-----------------------------");
pTmp = pTmp->next;
}
}
return OK;
}
销毁
#include "../include/myhead.h"
//销毁
int destroy(Hash** pphash)
{
linkNode* pDel = NULL;
linkNode* pTmp = NULL;
//入参判断
if(!(*pphash)) return Hash_NULL;
//释放各个单链表中的各个结点
for(int i = 0; i < SIZE; i++)
{
pTmp = (*pphash)->pArr[i];
while(pTmp)
{
//头删
pDel = pTmp;
pTmp = pTmp->next;
free(pDel);
pDel = NULL;
}
}
free(*pphash);
*pphash = NULL;
return OK;
}
创建hash表
#include "../include/myhead.h"
//创建hash表
Hash* createHash(void)
{
Hash* pHash = (Hash*)malloc(sizeof(Hash));
if(!pHash) return NULL;
memset(pHash, 0, sizeof(Hash));
return pHash;
}
创建Node结点
#include "../include/myhead.h"
//创建链结点
linkNode* createNode()
{
linkNode* plink = NULL;
plink = (linkNode*)malloc(sizeof(linkNode));
if(!plink) return NULL;
memset(plink, 0 ,sizeof(plink));
return plink;
}
计算存储位置
#include "../include/myhead.h"
//找到插入的位置
int hashfun(int id)
{
int pos = 0;
pos = id % 19;
return pos;
}
导出
#include "../include/myhead.h"
//导入文件
int inputProject(Hash* pHash)
{
data_type messageData;
if(!pHash) return Hash_NULL;
//打开文件
int fr = open("message.txt", O_RDONLY);
if(fr < 0)
{
perror("open error");
}
else
{
puts("打开文件成功!");
//导入
while(1)
{
int rd_count = read(fr, &messageData, sizeof(data_type));
if(0 == rd_count)
{
puts("导入信息完毕");
break;
}
else if(rd_count < 0)
{
perror("导入失败");
break;
}
else
{
//将读到的信息添加到Hash表中
insert(pHash, messageData);
pHash->lastId++;
}
}
}
close(fr);
return OK;
}
导出
#include "../include/myhead.h"
//导出信息
int output(Hash* pHash)
{
int fw = 0;
//入参判断
if(!pHash) return Hash_NULL;
//打开文件
fw = open("message.txt", O_WRONLY | O_CREAT | O_TRUNC, 0664);
if(fw < 0)
{
perror("open error");
}
else
{
//更新文件
for(int i = 0; i < SIZE; i++)
{
linkNode* pTmp = pHash->pArr[i];
while(pTmp)
{
//写入
int wr_count = write(fw, &pTmp->data, sizeof(data_type));
if(0 == wr_count)
{
printf("写入空\n");
break;
}
else if(wr_count < 0)
{
printf("写入失败\n");
break;
}
pTmp = pTmp->next;
}
}
}
close(fw);
puts("更新成功\n");
return OK;
}
makefile
最高层级
ALL:
make -C ./src/
make -C ./obj/
.PHONY:clear
clear:
rm obj/*.o
rm bin/*
src目录下
ALL:../obj/main.o ../obj/menu.o ../obj/hashFun.o ../obj/createHash.o ../obj/createNode.o ../obj/inputProject.o ../obj/insertProject.o ../obj/showProject.o ../obj/deleteProject.o ../obj/searchProject.o ../obj/alterProject.o ../obj/outputProject.o ../obj/destroyProject.o
../obj/main.o:main.c
gcc -c $< -o $@
../obj/menu.o:menu.c
gcc -c $< -o $@
../obj/hashFun.o:hashFun.c
gcc -c $< -o $@
../obj/createHash.o:createHash.c
gcc -c $< -o $@
../obj/createNode.o:createNode.c
gcc -c $< -o $@
../obj/inputProject.o:inputProject.c
gcc -c $< -o $@
../obj/insertProject.o:insertProject.c
gcc -c $< -o $@
../obj/showProject.o:showProject.c
gcc -c $< -o $@
../obj/deleteProject.o:deleteProject.c
gcc -c $< -o $@
../obj/searchProject.o:searchProject.c
gcc -c $< -o $@
../obj/alterProject.o:alterProject.c
gcc -c $< -o $@
../obj/outputProject.o:outputProject.c
gcc -c $< -o $@
../obj/destroyProject.o:destroyProject.c
gcc -c $< -o $@
obj目录下
ALL:
gcc *.o -o ../bin/main