Browse Source

1212

master
lichong 9 months ago
parent
commit
021921dd19
  1. 145
      api/main.py
  2. 3
      front/package.json
  3. 14
      front/src/App.vue
  4. 9
      front/src/api/user.js
  5. 31
      front/src/component/changeItem.vue
  6. 43
      front/src/component/table.vue
  7. 28
      front/src/views/home.vue
  8. 32
      front/src/views/login.vue
  9. 239
      front/src/views/user.vue

145
api/main.py

@ -5,6 +5,7 @@ import hashlib
import json import json
from flask import Flask, render_template, request from flask import Flask, render_template, request
from flask_socketio import SocketIO, Namespace, emit from flask_socketio import SocketIO, Namespace, emit
import time
app = Flask(__name__) app = Flask(__name__)
client = MongoClient("mongodb://localhost:27019/") client = MongoClient("mongodb://localhost:27019/")
@ -115,8 +116,8 @@ def md5_encrypt(data):
def initData(): def initData():
admin = collection.find_one({"isAdmin": 1, "isExit": 1}) admin = collection.find_one({"isAdmin": 1, "isExit": 1})
if admin is None: if admin is None:
# 学校名称、学校代号、专业名称、专业代号、年级、班级、学生姓名、学号、密码、成绩、作弊情况(作弊类型、作弊时间、作弊图片)、考试类型、考试科目、考试时间段、是否是管理员、是否删除、创建时间、更新时间 # 学校名称、学校代号、专业名称、专业代号、年级、班级、学生姓名、学号、密码、成绩、作弊情况(作弊类型、作弊时间、作弊图片)、考试类型、考试科目、考试时间段、考试链接、是否是管理员、是否删除、创建时间、更新时间
# xuexiaomingcheng、xuexiaodaihao、zhuanyemingcheng、zhuanyedaihao、nianji、banji、xueshengxingming、xuehao、mima、chengji、zuobiqingkuang(zuobileixing、zuobishijian、zuobitupian)、kaoshileixing、kaoshikemu、kaoshishijianduan、isAdmin、isExit、chuangjianshijian、gengxinshijian # xuexiaomingcheng、xuexiaodaihao、zhuanyemingcheng、zhuanyedaihao、nianji、banji、xueshengxingming、xuehao、mima、chengji、zuobiqingkuang(zuobileixing、zuobishijian、zuobitupian)、kaoshileixing、kaoshikemu、kaoshishijianduan、kaoshilianjie、isAdmin、isExit、chuangjianshijian、gengxinshijian
user = { user = {
"xuexiaomingcheng": "", "xuexiaomingcheng": "",
"xuexiaodaihao": "", "xuexiaodaihao": "",
@ -132,6 +133,7 @@ def initData():
"kaoshileixing": "", "kaoshileixing": "",
"kaoshikemu": "", "kaoshikemu": "",
"kaoshishijianduan": "", "kaoshishijianduan": "",
"kaoshilianjie": "",
"isAdmin": 1, "isAdmin": 1,
"isExit": 1, "isExit": 1,
"chuangjianshijian": "", "chuangjianshijian": "",
@ -179,36 +181,145 @@ def login():
# 新增用户 # 新增用户
@app.route("/addUser", methods=["post"]) @app.route("/addUser", methods=["post"])
def insert_data(): def insert_data():
user = {"name": "John Doe", "age": 25, "city": "New York"} resData = request.data
collection.insert_one(user) # 检测是否有数据
return "Data inserted successfully!" if not resData:
return {"code": 200, "msg": "无数据", "list": [], "hasError": True}
# 获取到POST过来的数据,转为json形式
userJson = json.loads(resData)
admin = isAdmin(userJson["id"])
print(777, userJson, admin)
if admin:
if userJson["subType"] is "add":
userItem = {
"xuexiaomingcheng": userJson["xuexiaomingcheng"],
"xuexiaodaihao": userJson["xuexiaodaihao"],
"zhuanyemingcheng": userJson["zhuanyemingcheng"],
"zhuanyedaihao": userJson["zhuanyedaihao"],
"nianji": userJson["nianji"],
"banji": userJson["banji"],
"xueshengxingming": userJson["xueshengxingming"],
"xuehao": userJson["xuehao"],
"mima": md5_encrypt(userJson["mima"]),
"chengji": userJson["chengji"],
"zuobiqingkuang": userJson["zuobiqingkuang"],
"kaoshileixing": userJson["kaoshileixing"],
"kaoshikemu": userJson["kaoshikemu"],
"kaoshishijianduan": userJson["kaoshishijianduan"],
"kaoshilianjie": "", # 需要自动生成一个链接
"isAdmin": 0,
"isExit": 1,
"chuangjianshijian": time.strftime(
"%Y-%m-%d %H:%M:%S", time.localtime(time.time())
),
"gengxinshijian": time.strftime(
"%Y-%m-%d %H:%M:%S", time.localtime(time.time())
),
}
collection.insert_one(userItem)
return "新增成功"
# 查询用户 # 查询用户
@app.route("/getUser", methods=["post"]) @app.route("/getUser", methods=["post"])
def query_data(): def query_data():
users = collection.find() resData = request.data
result = "" # 检测是否有数据
for user in users: if not resData:
result += f"Name: {user['name']}, Age: {user['age']}, City: {user['city']}<br>" return {"code": 200, "msg": "请填写信息后登录", "list": [], "hasError": True}
return result # 获取到POST过来的数据,转为json形式
userJson = json.loads(resData)
admin = isAdmin(userJson["id"])
print(777, userJson, admin)
if admin:
users = collection.find()
serialized_data = []
for item in users:
item["_id"] = str(item["_id"]) # 将ObjectId转换为字符串
serialized_data.append(item)
return {
"code": 200,
"msg": "查询成功",
"list": serialized_data,
"hasError": False,
}
else:
return {"code": 200, "msg": "您不是管理员用户", "list": [], "hasError": True}
# 更新用户 # 更新用户
@app.route("/updateUser", methods=["post"]) @app.route("/updateUser", methods=["post"])
def update_data(): def update_data():
query = {"name": "John Doe"} resData = request.data
new_data = {"$set": {"age": 30, "city": "San Francisco"}} # 检测是否有数据
collection.update_one(query, new_data) if not resData:
return "Data updated successfully!" return {"code": 200, "msg": "无数据", "list": [], "hasError": True}
# 获取到POST过来的数据,转为json形式
userJson = json.loads(resData)
admin = isAdmin(userJson["id"])
if admin:
userItem = {
"xuexiaomingcheng": userJson["xuexiaomingcheng"],
"xuexiaodaihao": userJson["xuexiaodaihao"],
"zhuanyemingcheng": userJson["zhuanyemingcheng"],
"zhuanyedaihao": userJson["zhuanyedaihao"],
"nianji": userJson["nianji"],
"banji": userJson["banji"],
"xueshengxingming": userJson["xueshengxingming"],
"xuehao": userJson["xuehao"],
"chengji": userJson["chengji"],
"zuobiqingkuang": userJson["zuobiqingkuang"],
"kaoshileixing": userJson["kaoshileixing"],
"kaoshikemu": userJson["kaoshikemu"],
"kaoshishijianduan": userJson["kaoshishijianduan"],
"gengxinshijian": time.strftime(
"%Y-%m-%d %H:%M:%S", time.localtime(time.time())
),
}
collection.update_one(
{"_id": ObjectId(userJson["userid"])},
{"$set": userItem},
)
return "修改成功"
# 删除用户 # 删除用户
@app.route("/delUser", methods=["post"]) @app.route("/delUser", methods=["post"])
def delete_data(): def delete_data():
query = {"name": "John Doe"} resData = request.data
collection.delete_one(query) # 检测是否有数据
return "Data deleted successfully!" if not resData:
return {"code": 200, "msg": "无数据", "list": [], "hasError": True}
# 获取到POST过来的数据,转为json形式
userJson = json.loads(resData)
admin = isAdmin(userJson["id"])
if admin:
serialized_data = []
for item in userJson["ids"]:
serialized_data.append(ObjectId(item)) # 将ObjectId转换为字符串
collection.delete_many({"_id": {"$in": serialized_data}})
return "删除成功"
# 修改密码
@app.route("/updatePassword", methods=["post"])
def updatePassword():
resData = request.data
# 检测是否有数据
if not resData:
return {"code": 200, "msg": "无数据", "list": [], "hasError": True}
# 获取到POST过来的数据,转为json形式
userJson = json.loads(resData)
admin = isAdmin(userJson["id"])
print(777, userJson, admin)
if admin:
collection.update_one(
{"_id": ObjectId(userJson["userid"])},
{
"$set": {"mima": md5_encrypt(userJson["mima"])},
},
)
return {"code": 200, "msg": "修改成功", "list": [], "hasError": False}
if __name__ == "__main__": if __name__ == "__main__":

3
front/package.json

@ -17,6 +17,7 @@
"nprogress": "^0.2.0", "nprogress": "^0.2.0",
"papaparse": "^5.4.1", "papaparse": "^5.4.1",
"qs": "^6.11.2", "qs": "^6.11.2",
"sqids": "^0.3.0",
"unplugin-auto-import": "^0.17.4", "unplugin-auto-import": "^0.17.4",
"unplugin-vue-components": "^0.26.0", "unplugin-vue-components": "^0.26.0",
"vue": "^3.3.11", "vue": "^3.3.11",
@ -26,4 +27,4 @@
"@vitejs/plugin-vue": "^4.6.2", "@vitejs/plugin-vue": "^4.6.2",
"vite": "^5.0.8" "vite": "^5.0.8"
} }
} }

14
front/src/App.vue

@ -1,13 +1,21 @@
<template> <template>
<router-view /> <el-config-provider :locale="locale">
<router-view />
</el-config-provider>
</template> </template>
<script> <script>
import { ElConfigProvider } from 'element-plus'
import zhCn from 'element-plus/es/locale/lang/zh-cn'
export default { export default {
name: "app", name: "app",
components: {
ElConfigProvider,
},
data() { data() {
return {}; return {
locale: zhCn,
};
}, },
async mounted() { }, async mounted() { },
methods: { methods: {

9
front/src/api/user.js

@ -43,4 +43,11 @@ export function getUser(data) {
data: { ...data, id: localStorage.getItem("userId") }, data: { ...data, id: localStorage.getItem("userId") },
}); });
} }
//修改密码
export function updatePassword(data) {
return _axios({
url: `/v1/updatePassword`,
method: "POST",
data: { ...data, id: localStorage.getItem("userId") },
});
}

31
front/src/component/changeItem.vue

@ -2,25 +2,14 @@
<el-form :inline="true" :disabled="formDisabled" :model="formData" label-suffix=":" label-width="100px"> <el-form :inline="true" :disabled="formDisabled" :model="formData" label-suffix=":" label-width="100px">
<el-row> <el-row>
<el-col v-for="(headerItem, headerIndex) in formHeader" :key="headerIndex" :span="8"> <el-col v-for="(headerItem, headerIndex) in formHeader" :key="headerIndex" :span="8">
<el-form-item :label="headerItem.label" v-if="!(['time'].indexOf(headerItem.type) !== -1 && type === 'add')"> <el-form-item :label="headerItem.label">
<template v-if="['select'].indexOf(headerItem.type) !== -1"> <template v-if="['text'].indexOf(headerItem.type) !== -1">
<el-select-v2 filterable v-model="formData[headerItem.inputValue]" multiple collapse-tags <el-input v-model="formData[headerItem.prop]" :placeholder="headerItem.label" :type="headerItem.type"
collapse-tags-tooltip :options="headerItem.options" :placeholder="headerItem.label" style="width: 330px" clearable style="width: 330px" />
:max-collapse-tags="2" />
</template> </template>
<template v-else-if="['time'].indexOf(headerItem.type) !== -1"> <template v-else-if="['datetimerange'].indexOf(headerItem.type) !== -1">
<el-date-picker v-model="formData[headerItem.inputValue]" type="datetime" :disabled="headerItem.disabled" <el-date-picker v-model="formData[headerItem.prop]" type="datetimerange" range-separator=""
:placeholder="headerItem.label" format="YYYY/MM/DD HH:mm:ss" style="width: 330px" /> start-placeholder="考试开始时间" end-placeholder="考试结束时间" />
</template>
<template v-else-if="['switch'].indexOf(headerItem.type) !== -1">
<el-switch v-model="formData[headerItem.inputValue]" style="width: 330px"/>
</template>
<template v-else-if="['text', 'email', 'textarea', 'password'].indexOf(
headerItem.type
) !== -1
">
<el-input v-model="formData[headerItem.inputValue]" :placeholder="headerItem.label" :type="headerItem.type"
clearable :show-password="headerItem.type === 'password'" style="width: 330px" />
</template> </template>
</el-form-item> </el-form-item>
</el-col> </el-col>
@ -31,12 +20,6 @@
export default { export default {
name: "bug", name: "bug",
props: { props: {
type: {
typeof: String,
default: () => {
return "";
},
},
formHeader: { formHeader: {
typeof: Array, typeof: Array,
default: () => { default: () => {

43
front/src/component/table.vue

@ -1,9 +1,9 @@
<template> <template>
<el-table :ref="refName" :data="tableData" class="mainTable" show-overflow-tooltip> <el-table :ref="refName" :data="tableData" class="mainTable" show-overflow-tooltip>
<el-table-column type="selection" width="55"> </el-table-column> <el-table-column type="selection" width="55"> </el-table-column>
<el-table-column type="index" width="50"> <el-table-column type="index" width="66" label="order">
<template #default="scope"> <template #default="scope">
{{ scope.$index + 1 + pageSize * (currentPage - 1) }} {{ scope.$index + 1 }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column v-for="(headerItem, headerIndex) in tableHeader" :key="headerItem._id" <el-table-column v-for="(headerItem, headerIndex) in tableHeader" :key="headerItem._id"
@ -33,17 +33,19 @@
<Edit /> <Edit />
</el-icon> </el-icon>
</el-button> </el-button>
<el-button link type="primary" text @click="updateMima(scope.row)">
<el-icon>
<WalletFilled />
</el-icon>
</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<el-pagination :current-page="currentPage" :page-size="pageSize" :page-sizes="pageSizes"
layout="total, sizes, prev, pager, next, jumper" :total="total" @size-change="handleSizeChange"
@current-change="handleCurrentChange" class="pagination" />
</template> </template>
<script> <script>
export default { export default {
name: "app", name: "app",
emits: ["detailInfo", "editInfo", "handleSizeChange", "handleCurrentChange"], emits: ["detailInfo", "editInfo"],
props: { props: {
refName: { refName: {
typeof: String, typeof: String,
@ -61,24 +63,6 @@ export default {
return []; return [];
}, },
}, },
currentPage: {
typeof: Number,
default: 1,
},
pageSize: {
typeof: Number,
default: 20,
},
pageSizes: {
typeof: Number,
default: () => {
return [16, 50, 100, 200];
},
},
total: {
typeof: Number,
default: 0,
},
}, },
data() { data() {
return {}; return {};
@ -91,12 +75,9 @@ export default {
editInfo(item) { editInfo(item) {
this.$emit("editInfo", item); this.$emit("editInfo", item);
}, },
handleSizeChange(sizeVal) { updateMima(item) {
this.$emit("handleSizeChange", sizeVal); this.$emit("updateMima", item);
}, }
handleCurrentChange(currentSize) {
this.$emit("handleCurrentChange", currentSize);
},
}, },
watch: {}, watch: {},
computed: {}, computed: {},
@ -104,7 +85,7 @@ export default {
</script> </script>
<style scoped> <style scoped>
.mainTable { .mainTable {
height: calc(100vh - 208px); height: calc(100vh - 112px);
width: 100%; width: 100%;
} }

28
front/src/views/home.vue

@ -3,28 +3,23 @@
<el-header class="appHeader"> <el-header class="appHeader">
<el-row> <el-row>
<el-col :span="23" style="align-self: center"> <el-col :span="23" style="align-self: center">
<el-image style="width: 60px; height: 60px" :src="logoUrl" fit="contain" /> <el-image style="width: 40px; height: 60px" :src="logoUrl" fit="contain" />
</el-col> </el-col>
<el-col :span="1" style="align-self: center"> <el-col :span="1" style="align-self: center">
<el-dropdown> <el-dropdown>
<span> <el-avatar :src="teacherUrl" /> </span> <span> <el-avatar :src="avatarUrl" /> </span>
<template #dropdown> <template #dropdown>
<el-dropdown-menu> <el-dropdown-menu>
<el-dropdown-item @click="logout">退出</el-dropdown-item> <el-dropdown-item @click="logout">logout</el-dropdown-item>
</el-dropdown-menu> </el-dropdown-menu>
</template> </template>
</el-dropdown> </el-dropdown>
</el-col> </el-col>
</el-row> </el-row>
</el-header> </el-header>
<el-container> <el-main class="appMain">
<el-container> <router-view />
<el-main class="appMain"> </el-main>
<router-view />
</el-main>
<el-footer class="appFooter">版权所有</el-footer>
</el-container>
</el-container>
</el-container> </el-container>
</template> </template>
@ -37,8 +32,7 @@ export default {
data() { data() {
return { return {
logoUrl: logo, logoUrl: logo,
teacherUrl: teacher, avatarUrl: "",
studentUrl: student,
userName: "", userName: "",
}; };
}, },
@ -51,6 +45,12 @@ export default {
this.$router.push("/login"); this.$router.push("/login");
} }
this.userName = localStorage.getItem("userName") this.userName = localStorage.getItem("userName")
let isAdmin = localStorage.getItem("isAdmin")
if (isAdmin) {
this.avatarUrl = teacher
} else {
this.avatarUrl = student
}
}, },
async logout() { async logout() {
localStorage.clear() localStorage.clear()
@ -70,7 +70,7 @@ export default {
} }
.appMain { .appMain {
height: calc(100vh - 120px); height: calc(100vh - 60px);
padding: 8px; padding: 8px;
} }

32
front/src/views/login.vue

@ -4,34 +4,23 @@
<el-card shadow="hover" style="width: 450px"> <el-card shadow="hover" style="width: 450px">
<template #header> <template #header>
<div style="text-align: center"> <div style="text-align: center">
<el-button class="button" text @click="regist = false"> login
登录
</el-button>
<!-- <el-button class="button" text @click="regist = true">
注册
</el-button> -->
</div> </div>
</template> </template>
<div> <div>
<el-form :model="regForm" label-suffix=":" @submit.prevent> <el-form :model="regForm" label-suffix=":" @submit.prevent label-width="auto">
<el-form-item label="账号"> <el-form-item label="student number">
<el-input v-model="regForm.name" placeholder="请输入账号" /> <el-input v-model="regForm.name" placeholder="please input student number" />
</el-form-item> </el-form-item>
<el-form-item label="密码"> <el-form-item label="password">
<el-input v-model="regForm.password" type="password" placeholder="请输入密码" show-password <el-input v-model="regForm.password" type="password" placeholder="please input password" show-password
@keyup.enter="login" /> @keyup.enter="login" />
</el-form-item> </el-form-item>
<el-form-item label="邮箱" v-if="regist">
<el-input v-model="regForm.email" placeholder="请输入邮箱" />
</el-form-item>
</el-form> </el-form>
</div> </div>
<template #footer> <template #footer>
<div style="text-align: center"> <div style="text-align: center">
<el-button class="button" v-if="regist" @click="login"> <el-button class="button" @click="login"> login </el-button>
注册
</el-button>
<el-button class="button" v-else @click="login"> 登录 </el-button>
</div> </div>
</template> </template>
</el-card> </el-card>
@ -48,11 +37,9 @@ export default {
components: {}, components: {},
data() { data() {
return { return {
regist: false,
regForm: { regForm: {
name: "", name: "",
password: "", password: "",
email: "",
}, },
}; };
}, },
@ -66,21 +53,18 @@ export default {
methods: { methods: {
dealForm() { dealForm() {
return { return {
regist: this.regist,
xuehao: this.regForm.name, xuehao: this.regForm.name,
mima: md5(this.regForm.password), mima: md5(this.regForm.password),
email: this.regForm.email,
} }
}, },
async init() { },
async login() { async login() {
let formData = this.dealForm() let formData = this.dealForm()
let res = await loginFun(formData) let res = await loginFun(formData)
console.log(999, res)
if (!res.hasError) { if (!res.hasError) {
ElMessage.success(res.msg); ElMessage.success(res.msg);
localStorage.setItem("userId", this.$_.get(res, ["list", 0, "_id"], "")) localStorage.setItem("userId", this.$_.get(res, ["list", 0, "_id"], ""))
localStorage.setItem("userName", this.$_.get(res, ["list", 0, "xueshengxingming"], "")) localStorage.setItem("userName", this.$_.get(res, ["list", 0, "xueshengxingming"], ""))
localStorage.setItem("isAdmin", this.$_.get(res, ["list", 0, "isAdmin"], 0))
this.$router.push("/user") this.$router.push("/user")
} else { } else {
ElMessage.error(res.msg); ElMessage.error(res.msg);

239
front/src/views/user.vue

@ -1,41 +1,30 @@
<template> <template>
<el-row style="margin: 0 0 8px 0"> <el-row>
<el-col :span="4"> <el-col :span="16">
<el-button icon="Plus" type="primary" @click="addUserData"> <div style="margin-bottom: 4px;">
新增 <el-button icon="Plus" type="primary" @click="addUserData">
</el-button> add User
<el-button icon="Delete" type="danger" @click="delUserData"> </el-button>
删除 <el-button icon="Delete" type="danger" @click="delUserData">
</el-button> delete User
<el-button icon="Refresh" type="info" @click="init({})" text> </el-button>
刷新 <el-button icon="Refresh" type="info" @click="init({})" text>
</el-button> refresh
</el-col> </el-button>
<el-col :span="2"> </div>
<el-upload :limit="1" accept="text/csv" :auto-upload="false" :on-change="fileChange"> <div>
<template #trigger> <vueTable ref="userTableParent" :refName="refName" :tableHeader="tableHeader" :tableData="tableData"
<el-button type="primary">文件上传</el-button> @detailInfo="detailInfo" @editInfo="editInfo" @updateMima="updateMima">
</template> </vueTable>
<template #file> </template> </div>
</el-upload>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="8">
<el-input v-model="searchValue" placeholder="Please input email" @keyup.enter="searchId"> 监控画面
<template #append>
<el-button @click="searchId" icon="Search" />
</template>
</el-input>
</el-col> </el-col>
</el-row> </el-row>
<div v-loading="loading">
<vueTable ref="userTableParent" :tableHeader="tableHeader" :tableData="tableData" @detailInfo="detailInfo"
@editInfo="editInfo">
</vueTable>
</div>
<el-dialog v-model="addDialog.show" :title="addDialog.title" width="80%" draggable <el-dialog v-model="addDialog.show" :title="addDialog.title" width="80%" draggable
:close-on-click-modal="formDisabled"> :close-on-click-modal="formDisabled">
<changeItem :formData="formData" :formDisabled="formDisabled" :type="addDialog.type" :formHeader="formHeaderLocal"> <changeItem :formData="formData" :formDisabled="formDisabled" :type="addDialog.type" :formHeader="formHeader">
</changeItem> </changeItem>
<template #footer v-if="!formDisabled"> <template #footer v-if="!formDisabled">
<div class="dialog-footer"> <div class="dialog-footer">
@ -49,7 +38,6 @@
</template> </template>
<script> <script>
import md5 from "md5"; import md5 from "md5";
import Papa from "papaparse";
import vueTable from "../component/table.vue"; import vueTable from "../component/table.vue";
import changeItem from "../component/changeItem.vue"; import changeItem from "../component/changeItem.vue";
import _ from "lodash"; import _ from "lodash";
@ -58,6 +46,7 @@ import {
delUser, //user delUser, //user
updateUser, //user updateUser, //user
getUser, //user getUser, //user
updatePassword,//
} from "@/api/user"; } from "@/api/user";
export default { export default {
name: "user", name: "user",
@ -65,7 +54,7 @@ export default {
data() { data() {
return { return {
_: _, _: _,
loading: false, refName: "userTable",
localComponent: [ localComponent: [
{ {
prop: "xuexiaomingcheng", prop: "xuexiaomingcheng",
@ -182,65 +171,16 @@ export default {
], ],
tableHeader: [], tableHeader: [],
tableData: [], tableData: [],
currentPage: 1,
pageSize: 16,
pageSizes: [16, 50, 100, 200],
total: 0,
addDialog: { addDialog: {
type: "add", type: "add",
show: false, show: false,
title: "新增用户", title: "新增用户",
}, },
formData: { formData: {},
name: "", formDataLocal: {},
password: "", formHeader: [],
email: "",
loginTime: "",
},
formHeader: [
{
type: "text",
label: "name",
inputValue: "name",
},
{
type: "password",
label: "password",
inputValue: "password",
},
{
type: "email",
label: "email",
inputValue: "email",
},
{
type: "switch",
label: "allowRegist",
inputValue: "allowRegist",
hidden: true,
},
{
type: "time",
disabled: true,
label: "loginTime",
inputValue: "loginTime",
},
{
type: "time",
disabled: true,
label: "create_at",
inputValue: "create_at",
},
{
type: "time",
disabled: true,
label: "update_at",
inputValue: "update_at",
},
],
formHeaderLocal: [], formHeaderLocal: [],
formDisabled: false, formDisabled: false,
searchValue: "",
}; };
}, },
watch: {}, watch: {},
@ -253,52 +193,67 @@ export default {
beforeUnmount() { }, beforeUnmount() { },
methods: { methods: {
dealTableHeader() { dealTableHeader() {
this.tableData = _.filter(this.localComponent, o => o.tableShow) this.tableHeader = _.filter(this.localComponent, o => {
o.minWidth = o.label.length * 17 + 5
return o.tableShow
})
}, },
//
dealFormHeader() { dealFormHeader() {
this.formHeader = _.filter(this.localComponent, o => o.formShow) this.formHeaderLocal = []
this.formDataLocal = {}
for (let i = 0; i < this.localComponent.length; i++) {
let element = this.localComponent[i];
if (element.formShow) {
this.formHeaderLocal.push({ ...element })
if (["text"].indexOf(element.type) !== -1) {
this.formDataLocal[element.prop] = ""
} else if (["datetimerange"].indexOf(element.type) !== -1) {
this.formDataLocal[element.prop] = []
}
}
}
}, },
//
async init(params = {}) { async init(params = {}) {
this.loading = true;
let res = await getUser({ let res = await getUser({
...params, ...params,
}); });
this.tableData = res.list; this.tableData = res.list;
this.loading = false;
}, },
//
async addUserData() { async addUserData() {
this.addDialog = { this.addDialog = {
type: "add", type: "add",
show: true, show: true,
title: "新增用户", title: "新增学生",
}; };
this.formData = {}; this.formData = { ...this.formDataLocal };
this.formHeaderLocal = this.$_.reject(this.formHeader, { hidden: true }); this.formHeader = _.cloneDeep(this.formHeaderLocal)
this.formDisabled = false; this.formDisabled = false;
}, },
closeDialog(addDialog) { closeDialog(addDialog) {
addDialog.show = false; addDialog.show = false;
}, },
//
async submitAdd() { async submitAdd() {
let subData = { subType: this.addDialog.type }; let subData = {};
for (let i = 0; i < this.formHeader.length; i++) { for (let i = 0; i < this.formHeader.length; i++) {
let elei = this.formHeader[i]; let elei = this.formHeader[i];
if (elei.type !== "time") { if (elei.type !== "time") {
subData[elei.inputValue] = this.formData[elei.inputValue]; subData[elei.prop] = this.formData[elei.prop];
}
if (elei.type === "select") {
subData[`${elei.inputValue}_str`] = this.$_.join(
this.formData[elei.inputValue],
","
);
} }
} }
if (this.addDialog.type === "edit") { if (this.addDialog.type === "edit") {
subData["_id"] = this.formData._id; subData["userid"] = this.formData._id;
} }
subData["password"] = md5(this.$_.trim(this.formData.password)); let res = {}
try { try {
let res = await addUser(subData); if (this.addDialog.type === "edit") {
res = await updateUser(subData);
} else {
res = await addUser(subData);
}
ElMessage({ ElMessage({
message: res.msg, message: res.msg,
type: "success", type: "success",
@ -309,6 +264,7 @@ export default {
await this.init(); await this.init();
} }
}, },
//
async delUserData() { async delUserData() {
let rowList = let rowList =
this.$refs[`${this.refName}Parent`].$refs[ this.$refs[`${this.refName}Parent`].$refs[
@ -319,7 +275,7 @@ export default {
for (let i = 0; i < rowList.length; i++) { for (let i = 0; i < rowList.length; i++) {
let elei = rowList[i]; let elei = rowList[i];
delData.push(elei._id); delData.push(elei._id);
delDispalyData.push(`${elei.BugID}`); delDispalyData.push(`${elei.xueshengxingming}`);
} }
ElMessageBox.confirm(`${delDispalyData.join("、")}`, "删除", { ElMessageBox.confirm(`${delDispalyData.join("、")}`, "删除", {
confirmButtonText: "确认", confirmButtonText: "确认",
@ -334,75 +290,40 @@ export default {
}); });
}); });
}, },
//
detailInfo(item) { detailInfo(item) {
this.addDialog = { this.addDialog = {
type: "info", type: "info",
show: true, show: true,
title: `查看${item.name}`, title: `查看${item.name || ""}`,
}; };
if (item.name !== "admin") {
this.formHeaderLocal = this.$_.reject(this.formHeader, {
hidden: true,
});
} else {
this.formHeaderLocal = this.$_.cloneDeep(this.formHeader);
}
this.formDisabled = true; this.formDisabled = true;
this.formData = item; this.formHeader = _.cloneDeep(_.filter(this.formHeaderLocal, o => o.prop !== "mima"))
this.formData = { ...item };
}, },
//
editInfo(item) { editInfo(item) {
this.addDialog = { this.addDialog = {
type: "edit", type: "edit",
show: true, show: true,
title: `编辑${item.name}`, title: `编辑${item.name || ""}`,
}; };
if (item.name !== "admin") {
this.formHeaderLocal = this.$_.reject(this.formHeader, {
hidden: true,
});
} else {
this.formHeaderLocal = this.$_.cloneDeep(this.formHeader);
}
this.formDisabled = false; this.formDisabled = false;
this.formHeader = _.cloneDeep(_.filter(this.formHeaderLocal, o => o.prop !== "mima"))
this.formData = { ...item }; this.formData = { ...item };
}, },
async handleSizeChange(pageSize) { //
this.pageSize = pageSize; updateMima(item) {
await this.init(); ElMessageBox.prompt("请输入新密码", "修改密码", {
}, confirmButtonText: "确认",
async handleCurrentChange(currentPage) { cancelButtonText: "取消",
this.currentPage = currentPage; }).then(async (value) => {
await this.init(); let res = await updatePassword({ userid: item._id, mima: value.value });
}, ElMessage({
fileChange(file) { message: res.msg,
let fileData = []; type: "success",
let that = this; });
Papa.parse(file.raw, { })
complete: async (result) => {
for (let i = 1; i < result.data.length; i++) {
let elei = result.data[i];
fileData.push({
name: that.$_.trim(elei[4]),
password: md5(that.$_.trim(elei[4])),
email: that.$_.trim(elei[4]),
});
}
let fileDataLocal = that.$_.uniqBy(fileData, "name");
let res = await addUser({ subType: "multi", list: fileDataLocal });
await this.init();
ElMessage({
message: res.msg,
type: "success",
});
},
});
},
async searchId() {
if (this.$_.trim(this.searchValue)) {
await this.init({ email: this.searchValue }, false);
} else {
await this.init();
}
}, },
}, },
}; };

Loading…
Cancel
Save