diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..d628321 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,18 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "node", + "request": "launch", + "name": "Launch Program", + "envFile": "${workspaceFolder}/.env", + "skipFiles": [ + "/**" + ], + "program": "${workspaceFolder}\\src\\index.js" + } + ] +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..bb14cf9 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "Codegeex.RepoIndex": true +} \ No newline at end of file diff --git a/main.http b/main.http index 75e30d9..18a0af9 100644 --- a/main.http +++ b/main.http @@ -1,4 +1,4 @@ -@url = http://localhost:8001/api +@url = http://localhost:8080/api @json = Content-Type: application/json ### main @@ -10,23 +10,30 @@ GET {{url}} GET {{url}}/user ### -GET {{url}}/user/6592b261ec153ffe0080527f +GET {{url}}/user/66e0fc98bfe90d5ebc373fad ### POST {{url}}/user -Content-Type: application/json +{{json}} { - "username": "dd", - "password": "wwgweaerhgr", + "username": "azj", + "password": "helloworld", "truename": "Davie Dro" } ### -PUT {{url}}/user/6592b261ec153ffe0080527f +PUT {{url}}/user/66e0fc4eb7f0bcce35db2755 {{json}} { - "truename": "张表4" -} \ No newline at end of file + "truename": "艾志坚" +} + +### +DELETE {{url}}/user/66e0fc98bfe90d5ebc373fad + +### +GET http://172.31.2.82:25565 + diff --git a/src/controllers/sample.js b/src/controllers/sample.js new file mode 100644 index 0000000..14a8289 --- /dev/null +++ b/src/controllers/sample.js @@ -0,0 +1,58 @@ +import express from 'express' +import Sample from '../models/sample.js' + +const router = express.Router() + +// GET /sample +router.get('/', async (req, res) => { + let sample = await Sample.find({}).limit(10) + res.json(sample) +}) + +// GET /sample/:id +router.get('/:id', async (req, res) => { + let id = req.params.id + let sample = await Sample.findById(id) + res.json(sample) +}) + +// POST /sample +router.post('/', async (req, res) => { + let sample = new Sample(req.body) + await sample.save().then(() => { + res.json(sample) + }).catch((err) => { + res.json({ error: err }) + }) +}) + +// PUT /sample/:id +router.put('/:id', async (req, res) => { + let id = req.params.id + let sample = req.body + await Sample.findByIdAndUpdate(id, sample, { new: true }, (err, sample) => { + if (err) { + res.json({ error: err }) + } else if (!sample) { + res.json({ error: `Sample ${id} not found` }) + } else { + res.json(sample) + } + }) +}) + +// DELETE /sample/:id +router.delete('/:id', async (req, res) => { + let id = req.params.id + await Sample.findByIdAndDelete(id, (err, sample) => { + if (err) { + res.json({ error: err }) + } else if (!sample) { + res.json({ error: `Sample ${id} not found` }) + } else { + res.json(sample) + } + }) +}) + +export default router \ No newline at end of file diff --git a/src/controllers/user.js b/src/controllers/user.js index 739583c..a93c675 100644 --- a/src/controllers/user.js +++ b/src/controllers/user.js @@ -1,24 +1,29 @@ import express from "express" import User from "../models/user.js" +import Role from "../models/role.js" +import Status from "../models/status.js" const router = express.Router() router.get("/", async (req, res) => { - const a = await User.find({}) - res.json(a) + let user = await User.find({}).populate("status") + res.json(user) }) router.get("/:id", (req, res) => { - User.findById(req.params.id).then((user) => { + User.findById(req.params.id).populate("status").then((user) => { res.json(user) }).catch((err) => { - res.json({error: err}) + res.json({ error: err }) }) }) -router.post("/", (req, res) => { +router.post("/", async (req, res) => { const user = new User(req.body) - user.save().then(() => { + let status = new Status() + await status.save() + user.status = status + await user.save().then(() => { res.json(user) }).catch((err) => { res.json({ error: err }) @@ -26,19 +31,17 @@ router.post("/", (req, res) => { }) router.put("/:id", async (req, res) => { - const user = await User.findByIdAndUpdate(req.params.id, req.body, { new: true }) - res.json(user) -}) - -router.delete("/:id", async (req, res) => { - const user = await User.findByIdAndDelete(req.params.id).then(() => { - res.json({ - "message": "deleted successfully", - user - }) - }).catch((err) => { - res.json({ error: err }) + await User.findByIdAndUpdate(req.params.id, req.body, { new: true }).then((user) => { + res.json(user) }) }) +router.delete("/:id", async (req, res) => { + await User.findByIdAndDelete(req.params.id) + .populate("status") + .then((user) => { + res.json(user) + }) +}) + export default router \ No newline at end of file diff --git a/src/index.js b/src/index.js index db123b2..59e9119 100644 --- a/src/index.js +++ b/src/index.js @@ -14,6 +14,47 @@ db.once("open", () => console.log("Connected to Database")) app.use(Express.json()) app.use(Express.urlencoded({ extended: true })) +// init premission groups +let permissions = { + user_create: { + level: 0, // 0: anyone, 1: user, 2: admin, 3: root + rule: "user_create", + description: "Create new user" + }, + user_change_self_password: { + level: 1, + rule: "user_change_self_password", + description: "change self password" + }, + user_change_password: { + level: 2, + rule: "user_change_password", + description: "change any user password" + }, + user_change_admin_password: { + level: 3, + rule: "user_change_admin_password", + description: "change admin password" + } +} +import Permission from "./models/permission.js" +for (const key in permissions) { + if (Object.prototype.hasOwnProperty.call(permissions, key)) { + let element = new Permission(permissions[key]) + element.save() + } +} + +// TODO 这里有问题, +// init roles +// import Role from "./models/role.js" +// let r = new Role({ +// name: "root", +// permissions: Permission.find({}).exec() +// }) +// r.save() + +// init router app.use("/api", router) app.listen(PORT, () => { diff --git a/src/models/permission.js b/src/models/permission.js index ef39d80..1597115 100644 --- a/src/models/permission.js +++ b/src/models/permission.js @@ -1,6 +1,7 @@ import { Schema, model } from 'mongoose' const permissionSchema = new Schema({ + level: { type: Number, required: true }, rule: { type: String, required: true }, description: { type: String, required: true } }) diff --git a/src/models/role.js b/src/models/role.js index a2d4e09..b149df6 100644 --- a/src/models/role.js +++ b/src/models/role.js @@ -1,14 +1,9 @@ -import { Schema } from 'mongoose' +import { Schema, model } from 'mongoose' +import Permission from './permission.js' const roleSchema = new Schema({ name: { type: String, required: true }, - permissions: [{ type: Schema.Types.ObjectId, ref: 'Permission' }], - status: { - deleted: { type: Boolean, default: false }, - createAt: { type: Date, default: Date.now() }, - deleteAt: { type: Date }, - updateAt: { type: Date, default: Date.now() } - } + permissions:[{ type: Schema.Types.ObjectId, ref: Permission }], }) export default model('Role', roleSchema) \ No newline at end of file diff --git a/src/models/sample.js b/src/models/sample.js new file mode 100644 index 0000000..6fcbfb3 --- /dev/null +++ b/src/models/sample.js @@ -0,0 +1,24 @@ +import { Schema, model } from 'mongoose' + +const sampleSchema = new Schema({ + // L414-5KR-7-240703 + + // 产品名 L414-5KR + productName: { type: String }, + + // 批次号字符串 L414-5KR-7-240703 + batchString: { type: String }, + + // 样品 ID 01 + id: { type: String }, + + // 送样时间 + postTime: { type: Date, default: Date.now }, + + // 测试项目 + testItem: { type: Array, default: [] }, + + status: { type: Schema.Types.ObjectId, ref: 'Status' } +}) + +export default model('Sample', sampleSchema) \ No newline at end of file diff --git a/src/models/status.js b/src/models/status.js new file mode 100644 index 0000000..22c89ec --- /dev/null +++ b/src/models/status.js @@ -0,0 +1,12 @@ +import { Schema, model } from 'mongoose' + +const statusSchema = new Schema({ + locked: { type: Boolean, default: false }, + lockAt: { type: Date }, + lockBy: { type: Schema.Types.ObjectId, ref: 'User' }, + deleted: { type: Boolean, default: false }, + createAt: { type: Date, default: Date.now() }, + deleteAt: { type: Date }, + updateAt: { type: Date, default: Date.now() } +}) +export default model('Status', statusSchema) \ No newline at end of file diff --git a/src/models/user.js b/src/models/user.js index 457e175..9da8c0d 100644 --- a/src/models/user.js +++ b/src/models/user.js @@ -7,26 +7,18 @@ const userSchema = new Schema({ truename: { type: String, required: true }, // 真实名字 role: { type: Schema.Types.ObjectId, ref: 'Role' }, lastLogin: { type: Date }, - status: { - locked: { type: Boolean, default: false }, - lockAt: { type: Date }, - lockBy: { type: Schema.Types.ObjectId, ref: 'User' }, - deleted: { type: Boolean, default: false }, - createAt: { type: Date, default: Date.now() }, - deleteAt: { type: Date }, - updateAt: { type: Date, default: Date.now() } - } + status: { type: Schema.Types.ObjectId, ref: 'Status' } }) // TODO: IT CAN'T WORK ... -userSchema.pre('deleteOne', { document: true }, () => { +userSchema.pre(['deleteOne', 'findByIdAndDelete'], { document: true }, () => { this.status.deleted = true this.status.deleteAt = Date.now() }) userSchema.pre(['findByIdAndUpdate', 'findOneAndUpdate'], (next) => { this.status.updateAt = Date.now() - console.log("gdfg"); + console.log("gdfg") next() })