TypeScript 语言 实战项目 项目管理系统

TypeScriptamuwap 发布于 1 天前 2 次阅读


TypeScript【1】实战项目:项目管理系统开发指南

项目管理系统(Project Management System,PMS)是现代企业中不可或缺的工具,它可以帮助团队有效地规划、跟踪和管理项目。随着前端技术的发展,TypeScript作为一种强类型JavaScript的超集,因其良好的类型系统和工具链支持,成为了构建大型前端项目的首选语言。本文将围绕TypeScript语言,实战开发一个简单的项目管理系统。

项目背景

本项目旨在开发一个基于Web的项目管理系统,该系统应具备以下功能:

- 用户管理:包括用户注册、登录、权限管理等。
- 项目管理:包括项目创建、任务分配、进度跟踪等。
- 文档管理【2】:包括文档上传、下载、版本控制【3】等。

技术栈

- TypeScript:用于编写类型安全的JavaScript代码。
- React【4】:用于构建用户界面。
- Redux【5】:用于状态管理。
- Ant Design:用于UI组件库。
- express【6】:用于后端服务。
- MongoDB【7】:用于数据库存储。

项目结构


project-management-system/
├── client/
│ ├── src/
│ │ ├── components/
│ │ ├── actions/
│ │ ├── reducers/
│ │ ├── store/
│ │ └── App.tsx
│ ├── public/
│ └── index.html
├── server/
│ ├── src/
│ │ ├── models/
│ │ ├── routes/
│ │ ├── controllers/
│ │ └── server.ts
│ └── package.json
├── .gitignore
├── package.json
└── tsconfig.json

开发步骤

1. 初始化项目

使用`create-react-app`创建React项目,并安装TypeScript支持。

bash
npx create-react-app project-management-system --template typescript
cd project-management-system
npm install

2. 安装依赖

安装必要的npm包。

bash
npm install redux react-redux @types/react-redux express mongoose antd

3. 配置TypeScript

编辑`tsconfig.json`文件,配置TypeScript编译选项。

json
{
"compilerOptions": {
"target": "es5",
"module": "commonjs",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true
},
"include": ["src//"],
"exclude": ["node_modules"]
}

4. 用户管理

4.1 创建用户模型

在`server/src/models`目录下创建`User.ts`文件,定义用户模型。

typescript
import mongoose, { Document, Schema } from 'mongoose';

interface IUser extends Document {
username: string;
password: string;
role: string;
}

const UserSchema: Schema = new Schema({
username: { type: String, required: true },
password: { type: String, required: true },
role: { type: String, required: true }
});

export default mongoose.model('User', UserSchema);

4.2 创建用户控制器

在`server/src/controllers`目录下创建`UserController.ts`文件,定义用户控制器。

typescript
import { Request, Response } from 'express';
import User from '../models/User';

export const register = async (req: Request, res: Response) => {
try {
const { username, password, role } = req.body;
const user = new User({ username, password, role });
await user.save();
res.status(201).send(user);
} catch (error) {
res.status(500).send(error);
}
};

export const login = async (req: Request, res: Response) => {
try {
const { username, password } = req.body;
const user = await User.findOne({ username, password });
if (!user) {
return res.status(401).send('Invalid credentials');
}
res.send(user);
} catch (error) {
res.status(500).send(error);
}
};

4.3 创建用户路由

在`server/src/routes`目录下创建`UserRoutes.ts`文件,定义用户路由。

typescript
import { Router } from 'express';
import UserController from '../controllers/UserController';

const router = Router();

router.post('/register', UserController.register);
router.post('/login', UserController.login);

export default router;

4.4 配置Express

在`server/src/server.ts`文件中配置Express应用,并使用用户路由。

typescript
import express from 'express';
import mongoose from 'mongoose';
import userRoutes from './routes/UserRoutes';

const app = express();
const PORT = process.env.PORT || 3000;

mongoose.connect('mongodb://localhost:27017/project-management-system', {
useNewUrlParser: true,
useUnifiedTopology: true
});

app.use(express.json());
app.use('/api', userRoutes);

app.listen(PORT, () => {
console.log(`Server is running on port ${PORT}`);
});

5. 项目管理

5.1 创建项目模型

在`server/src/models`目录下创建`Project.ts`文件,定义项目模型。

typescript
import mongoose, { Document, Schema } from 'mongoose';

interface IProject extends Document {
name: string;
description: string;
startDate: Date;
endDate: Date;
status: string;
}

const ProjectSchema: Schema = new Schema({
name: { type: String, required: true },
description: { type: String, required: true },
startDate: { type: Date, required: true },
endDate: { type: Date, required: true },
status: { type: String, required: true }
});

export default mongoose.model('Project', ProjectSchema);

5.2 创建项目控制器

在`server/src/controllers`目录下创建`ProjectController.ts`文件,定义项目控制器。

typescript
import { Request, Response } from 'express';
import Project from '../models/Project';

export const createProject = async (req: Request, res: Response) => {
try {
const { name, description, startDate, endDate, status } = req.body;
const project = new Project({ name, description, startDate, endDate, status });
await project.save();
res.status(201).send(project);
} catch (error) {
res.status(500).send(error);
}
};

export const getProjects = async (req: Request, res: Response) => {
try {
const projects = await Project.find();
res.send(projects);
} catch (error) {
res.status(500).send(error);
}
};

5.3 创建项目路由

在`server/src/routes`目录下创建`ProjectRoutes.ts`文件,定义项目路由。

typescript
import { Router } from 'express';
import ProjectController from '../controllers/ProjectController';

const router = Router();

router.post('/projects', ProjectController.createProject);
router.get('/projects', ProjectController.getProjects);

export default router;

5.4 配置Express

在`server/src/server.ts`文件中配置Express应用,并使用项目路由。

typescript
// ... (省略其他代码)

app.use('/api', userRoutes);
app.use('/api', projectRoutes);

// ... (省略其他代码)

6. 文档管理

6.1 创建文档模型

在`server/src/models`目录下创建`Document.ts`文件,定义文档模型。

typescript
import mongoose, { Document, Schema } from 'mongoose';

interface IDocument extends Document {
name: string;
content: string;
version: number;
}

const DocumentSchema: Schema = new Schema({
name: { type: String, required: true },
content: { type: String, required: true },
version: { type: Number, required: true }
});

export default mongoose.model('Document', DocumentSchema);

6.2 创建文档控制器

在`server/src/controllers`目录下创建`DocumentController【8】.ts`文件,定义文档控制器。

typescript
import { Request, Response } from 'express';
import Document from '../models/Document';

export const uploadDocument = async (req: Request, res: Response) => {
try {
const { name, content, version } = req.body;
const document = new Document({ name, content, version });
await document.save();
res.status(201).send(document);
} catch (error) {
res.status(500).send(error);
}
};

export const getDocuments = async (req: Request, res: Response) => {
try {
const documents = await Document.find();
res.send(documents);
} catch (error) {
res.status(500).send(error);
}
};

6.3 创建文档路由

在`server/src/routes`目录下创建`DocumentRoutes.ts`文件,定义文档路由。

typescript
import { Router } from 'express';
import DocumentController from '../controllers/DocumentController';

const router = Router();

router.post('/documents', DocumentController.uploadDocument);
router.get('/documents', DocumentController.getDocuments);

export default router;

6.4 配置Express

在`server/src/server.ts`文件中配置Express应用,并使用文档路由。

typescript
// ... (省略其他代码)

app.use('/api', userRoutes);
app.use('/api', projectRoutes);
app.use('/api', documentRoutes);

// ... (省略其他代码)

总结

本文通过TypeScript语言,实战开发了一个简单的项目管理系统。从用户管理、项目管理到文档管理,我们逐步实现了系统的核心功能。在实际开发中,可以根据需求扩展更多功能,如任务分配、进度跟踪、文档版本控制等。通过本文的学习,读者可以了解到TypeScript在构建大型前端项目中的应用,以及如何使用React、Redux、Express和MongoDB等技术栈进行项目开发。