Compare commits
9 Commits
feb45a405d
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| ba08d5a499 | |||
|
8bffef5ffe
|
|||
|
d3a40a04ab
|
|||
|
ad0a91150e
|
|||
| 2f510aa096 | |||
| c623f02aa5 | |||
| 065e66a992 | |||
| de16667568 | |||
| 52085f21b5 |
18
.vscode/launch.json
vendored
Normal file
18
.vscode/launch.json
vendored
Normal file
@@ -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": [
|
||||
"<node_internals>/**"
|
||||
],
|
||||
"program": "${workspaceFolder}\\src\\index.js"
|
||||
}
|
||||
]
|
||||
}
|
||||
3
.vscode/settings.json
vendored
Normal file
3
.vscode/settings.json
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"Codegeex.RepoIndex": true
|
||||
}
|
||||
20
index.html
Normal file
20
index.html
Normal file
@@ -0,0 +1,20 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Document</title>
|
||||
<script src="https://libs.cdnjs.net/jquery/3.7.1/jquery.min.js"></script>
|
||||
<script>
|
||||
$(document).ready(() => {
|
||||
$.getJSON('/ten', (data) => {
|
||||
$('#content').text(JSON.stringify(data));
|
||||
})
|
||||
})
|
||||
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="content"></div>
|
||||
</body>
|
||||
</html>
|
||||
21
main.http
21
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"
|
||||
"truename": "艾志坚"
|
||||
}
|
||||
|
||||
###
|
||||
DELETE {{url}}/user/66e0fc98bfe90d5ebc373fad
|
||||
|
||||
###
|
||||
GET http://172.31.2.82:25565
|
||||
|
||||
|
||||
783
package-lock.json
generated
783
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -13,8 +13,8 @@
|
||||
"author": "hbk01",
|
||||
"license": "GPL-3.0-or-later",
|
||||
"dependencies": {
|
||||
"dotenv": "^16.3.1",
|
||||
"express": "^4.18.2",
|
||||
"mongoose": "^8.0.3"
|
||||
"mongoose": "^8.0.3",
|
||||
"nodemon": "^3.1.0"
|
||||
}
|
||||
}
|
||||
|
||||
18
pm2.config.cjs
Normal file
18
pm2.config.cjs
Normal file
@@ -0,0 +1,18 @@
|
||||
module.exports = {
|
||||
apps: [{
|
||||
name: "labplus-server",
|
||||
script: "./src/index.js",
|
||||
watch: [
|
||||
"src"
|
||||
],
|
||||
ignore_watch: [
|
||||
"node_modules"
|
||||
],
|
||||
env: {
|
||||
"NODE_ENV": "production",
|
||||
"PORT": 80,
|
||||
// TODO: change to your own username and password
|
||||
"DATABASE_URI": "mongodb://USERNAME:PASSWORD@localhost:27017/labplus",
|
||||
}
|
||||
}]
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
export const apps = [{
|
||||
name: "labplus-server",
|
||||
script: "./src/index.js",
|
||||
watch: [
|
||||
"src"
|
||||
],
|
||||
ignore_watch: [
|
||||
"node_modules"
|
||||
],
|
||||
env: {
|
||||
"NODE_ENV": "production"
|
||||
}
|
||||
}]
|
||||
58
src/controllers/sample.js
Normal file
58
src/controllers/sample.js
Normal file
@@ -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
|
||||
@@ -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 })
|
||||
})
|
||||
})
|
||||
|
||||
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,17 +31,16 @@ router.post("/", (req, res) => {
|
||||
})
|
||||
|
||||
router.put("/:id", async (req, res) => {
|
||||
const user = await User.findByIdAndUpdate(req.params.id, req.body, { new: true })
|
||||
await User.findByIdAndUpdate(req.params.id, req.body, { new: true }).then((user) => {
|
||||
res.json(user)
|
||||
})
|
||||
})
|
||||
|
||||
router.delete("/:id", async (req, res) => {
|
||||
const user = await User.findByIdAndDelete(req.params.id).then(() => {
|
||||
res.json({
|
||||
"message": "User deleted successfully"
|
||||
})
|
||||
}).catch((err) => {
|
||||
res.json({ error: err })
|
||||
await User.findByIdAndDelete(req.params.id)
|
||||
.populate("status")
|
||||
.then((user) => {
|
||||
res.json(user)
|
||||
})
|
||||
})
|
||||
|
||||
|
||||
50
src/index.js
50
src/index.js
@@ -1,22 +1,60 @@
|
||||
import Express from "express"
|
||||
import dotenv from "dotenv"
|
||||
import router from "./router.js"
|
||||
import mongoose from "mongoose"
|
||||
|
||||
dotenv.config()
|
||||
|
||||
const app = Express()
|
||||
const PORT = process.env.PORT || 8080
|
||||
const DATABASE_URL = process.env.DATABASE_URL || "mongodb://localhost:27017/labplus"
|
||||
|
||||
mongoose.connect(DATABASE_URL)
|
||||
mongoose.connect(process.env.DATABASE_URI)
|
||||
const db = mongoose.connection
|
||||
db.on("error", (error) => console.error(error))
|
||||
|
||||
db.on("error", console.error.bind(console, "connection error:"))
|
||||
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, () => {
|
||||
|
||||
@@ -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 }
|
||||
})
|
||||
|
||||
@@ -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)
|
||||
24
src/models/sample.js
Normal file
24
src/models/sample.js
Normal file
@@ -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 L414-5KR-7-240703-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)
|
||||
12
src/models/status.js
Normal file
12
src/models/status.js
Normal file
@@ -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)
|
||||
@@ -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()
|
||||
})
|
||||
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
import express from "express"
|
||||
import user from "./controllers/user.js"
|
||||
import sample from "./controllers/sample.js"
|
||||
|
||||
const router = express.Router({
|
||||
caseSensitive: true
|
||||
})
|
||||
|
||||
router.use("/user", user)
|
||||
router.use("/sample", sample)
|
||||
|
||||
export default router
|
||||
Reference in New Issue
Block a user