yxq 2ヶ月前
コミット
d92fa38e2a
13個のファイルの変更313行の追加173行の削除
  1. +0
    -8
      SafeCampus.WEB/components.d.ts
  2. +4
    -0
      SafeCampus.WEB/src/api/modules/attendance/roolcall.ts
  3. +16
    -0
      SafeCampus.WEB/src/api/modules/violation/portraitSummary.ts
  4. +2
    -0
      SafeCampus.WEB/src/views/attendance/behaviorTrace/index.vue
  5. +5
    -3
      SafeCampus.WEB/src/views/attendance/roolcall/components/form/index.vue
  6. +34
    -4
      SafeCampus.WEB/src/views/attendance/roolcall/detail.vue
  7. +3
    -1
      SafeCampus.WEB/src/views/attendance/roolcall/index.vue
  8. +2
    -0
      SafeCampus.WEB/src/views/userManage/personnel/components/form/form_basic.vue
  9. +2
    -2
      SafeCampus.WEB/src/views/userManage/personnel/components/form/index.vue
  10. +2
    -0
      SafeCampus.WEB/src/views/userManage/personnel/index.vue
  11. +188
    -145
      SafeCampus.WEB/src/views/violation/portrait/detail.vue
  12. +15
    -6
      monitorMobile/pages/earlyWarning/components/warningInfo.vue
  13. +40
    -4
      monitorMobile/pages/monitor/index.vue

+ 0
- 8
SafeCampus.WEB/components.d.ts ファイルの表示

@@ -27,7 +27,6 @@ declare module 'vue' {
ElCol: typeof import('element-plus/es')['ElCol']
ElColorPicker: typeof import('element-plus/es')['ElColorPicker']
ElContainer: typeof import('element-plus/es')['ElContainer']
ElDatePicker: typeof import('element-plus/es')['ElDatePicker']
ElDialog: typeof import('element-plus/es')['ElDialog']
ElDivider: typeof import('element-plus/es')['ElDivider']
ElDrawer: typeof import('element-plus/es')['ElDrawer']
@@ -40,7 +39,6 @@ declare module 'vue' {
ElFormItem: typeof import('element-plus/es')['ElFormItem']
ElHeader: typeof import('element-plus/es')['ElHeader']
ElIcon: typeof import('element-plus/es')['ElIcon']
ElImage: typeof import('element-plus/es')['ElImage']
ElInput: typeof import('element-plus/es')['ElInput']
ElLink: typeof import('element-plus/es')['ElLink']
ElMain: typeof import('element-plus/es')['ElMain']
@@ -49,12 +47,9 @@ declare module 'vue' {
ElOption: typeof import('element-plus/es')['ElOption']
ElPagination: typeof import('element-plus/es')['ElPagination']
ElRadio: typeof import('element-plus/es')['ElRadio']
ElRadioButton: typeof import('element-plus/es')['ElRadioButton']
ElRadioGroup: typeof import('element-plus/es')['ElRadioGroup']
ElRow: typeof import('element-plus/es')['ElRow']
ElScrollbar: typeof import('element-plus/es')['ElScrollbar']
ElSelect: typeof import('element-plus/es')['ElSelect']
ElSlider: typeof import('element-plus/es')['ElSlider']
ElSpace: typeof import('element-plus/es')['ElSpace']
ElSubMenu: typeof import('element-plus/es')['ElSubMenu']
ElSwitch: typeof import('element-plus/es')['ElSwitch']
@@ -63,11 +58,8 @@ declare module 'vue' {
ElTabPane: typeof import('element-plus/es')['ElTabPane']
ElTabs: typeof import('element-plus/es')['ElTabs']
ElTag: typeof import('element-plus/es')['ElTag']
ElText: typeof import('element-plus/es')['ElText']
ElTimePicker: typeof import('element-plus/es')['ElTimePicker']
ElTooltip: typeof import('element-plus/es')['ElTooltip']
ElTreeSelect: typeof import('element-plus/es')['ElTreeSelect']
ElUpload: typeof import('element-plus/es')['ElUpload']
ESign: typeof import('./src/components/ESign/index.vue')['default']
FormContainer: typeof import('./src/components/Form/FormContainer/index.vue')['default']
Grid: typeof import('./src/components/Grid/index.vue')['default']


+ 4
- 0
SafeCampus.WEB/src/api/modules/attendance/roolcall.ts ファイルの表示

@@ -48,6 +48,10 @@ const attendanceRoolcallApi = {
/** 修改点名任务 */
update(params: any) {
return http.put("update", params);
},
/** 手动点名 */
manualRoll(params: any) {
return http.post("manualRoll", params);
}
};



+ 16
- 0
SafeCampus.WEB/src/api/modules/violation/portraitSummary.ts ファイルの表示

@@ -39,6 +39,22 @@ const portraitSummaryApi = {
/** 获取学生属性标签 */
getStudentDetail(params: any) {
return http.get("getStudentDetail", params);
},
/* 学生-出勤情况 */
getStudentAttendance(params: any) {
return http.post("attendance", params);
},
/* 学生-出校 */
getStudentOutSchool(params: any) {
return http.post("outsideSchool", params);
},
/* 学生-图书馆 */
getStudentLibrary(params: any) {
return http.post("library", params);
},
/* 学生-食堂 */
getStudentCanteen(params: any) {
return http.post("canteen", params);
}
};



+ 2
- 0
SafeCampus.WEB/src/views/attendance/behaviorTrace/index.vue ファイルの表示

@@ -187,6 +187,8 @@ const detialRef = ref<InstanceType<typeof TraceShow> | null>(null);
onMounted(async () => {
// 获取系部下拉数据
departmentOptions.value = await getDepartmentList()
// 获取班级
classOptions.value = await getClassList('')
});
</script>
<style scoped lang="scss">


+ 5
- 3
SafeCampus.WEB/src/views/attendance/roolcall/components/form/index.vue ファイルの表示

@@ -101,9 +101,9 @@ const rules = reactive({
similarity: [required("请选择相似度")],
cameraId: [required("请选择摄像头")],
continueTime: [required("请选择持续时间")],
personSetId: [required("请选择所属班级")],
depId: [required("请选择系部")],
majorId: [required("请选择专业")]
personSetId: [required("请选择所属班级")]
// depId: [required("请选择系部")],
// majorId: [required("请选择专业")]
});

/**
@@ -112,6 +112,8 @@ const rules = reactive({
*/
async function onOpen(props: FormProps.Base<any>) {
departmentOptions.value = await getDepartmentList();
// 获取班级
classOptions.value = await getClassList("");
Object.assign(sysUserProps, props); //合并参数
visible.value = true; //显示表单
/* 监听系部、专业 */


+ 34
- 4
SafeCampus.WEB/src/views/attendance/roolcall/detail.vue ファイルの表示

@@ -20,7 +20,7 @@
<el-row :gutter="20">
<el-col :span="24"
><el-row class="rowbg">
<el-col :xl="4" :lg="4" :md="6" :sm="8" :xs="12" v-for="(item, index) in listData" :key="index"
<el-col :xl="3" :lg="4" :md="6" :sm="8" :xs="12" v-for="(item, index) in listData" :key="index"
><div class="grid-content">
<div class="imgBox" :class="{ active: item.status === 1 ? true : false }">
<el-image
@@ -42,6 +42,9 @@
{{ item.personSetName }}
</div>
</div>
<div v-if="item.status !== 1" class="btn btns" style="justify-content: center; border-top: none">
<el-button size="small" type="primary" @click="checkOut(item, index)">签到</el-button>
</div>
</div></el-col
>
</el-row></el-col
@@ -151,6 +154,19 @@ const assignFn = (item: any) => {
const checkOut = (item: any, index: number) => {
checkIndex.value = index;
checkData.value = JSON.parse(JSON.stringify(item));

attendanceRoolcallApi.manualRoll([{ personId: item.personId, personSetId: item.personSetId, taskId: route.query.taskId }]).then(() => {
ElMessage({
message: "点名成功",
type: "success"
});
UnrecognizedD.value = UnrecognizedD.value.filter((item1: any) => item1.id !== item.id);
listData.value.map((item2: any) => {
if (item2.personId === item.personId) {
item2.status = 1;
}
});
});
};
const submitFn = () => {
if (!checkIndex.value && checkIndex.value !== 0) {
@@ -162,7 +178,7 @@ const submitFn = () => {
}
visible.value = false;

attendanceRoolcallApi.update({ id: assignId.value, personId: checkData.value.personId, personSetId: checkData.value.personSetId }).then(() => {
attendanceRoolcallApi.update({ taskId: assignId.value, personId: checkData.value.personId, personSetId: checkData.value.personSetId }).then(() => {
ElMessage({
message: "指派成功",
type: "success"
@@ -209,11 +225,26 @@ onMounted(() => {
height: 190px;
margin-bottom: 20px;
.grid-content {
position: relative;
box-sizing: border-box;
height: 100%;

// height: 100%;
padding: 15px;
margin: 10px;
background: #ffffff;
.btns {
position: absolute;
top: 0;
left: 0;
width: 100%;
background: rgb(0 0 0 / 80%);
opacity: 0;
}
&:hover {
.btns {
opacity: 1;
}
}
.imgBox {
display: flex;
align-items: center;
@@ -233,7 +264,6 @@ onMounted(() => {
}
}
.info {
height: 80px;
.label {
margin-right: 8px;
font-size: 14px;


+ 3
- 1
SafeCampus.WEB/src/views/attendance/roolcall/index.vue ファイルの表示

@@ -181,7 +181,9 @@ const RefreshTable = () => {
}
onMounted(async () => {
// 获取系部下拉数据
departmentOptions.value = await getDepartmentList()
departmentOptions.value = await getDepartmentList();
// 获取班级
classOptions.value = await getClassList('')
});
</script>
<style scoped lang="scss">


+ 2
- 0
SafeCampus.WEB/src/views/userManage/personnel/components/form/form_basic.vue ファイルの表示

@@ -156,6 +156,8 @@ const genderOptions = ref([
]);
onMounted(async () => {
departmentOptions.value = await getDepartmentList();
// 获取班级
classOptions.value = await getClassList("");
// 初始化
userInfo.value.gender = userInfo.value.gender ? userInfo.value.gender : genderOptions.value[0].value;
if (userInfo.value.personId) {


+ 2
- 2
SafeCampus.WEB/src/views/userManage/personnel/components/form/index.vue ファイルの表示

@@ -49,8 +49,8 @@ const rules = reactive({
gender: [required("请选择性别")],
faces: [required("请上传人脸图片")],
phone: [required("请输入手机号")],
depId: [required("请选择系部")],
majorId: [required("请选择专业")],
// depId: [required("请选择系部")],
// majorId: [required("请选择专业")],
personSetId: [required("请选择班级")]
});



+ 2
- 0
SafeCampus.WEB/src/views/userManage/personnel/index.vue ファイルの表示

@@ -281,6 +281,8 @@ const handleAvatarSuccess: UploadProps["onSuccess"] = (response) => {
onMounted(async () => {
// 获取系部下拉数据
departmentOptions.value = await getDepartmentList()
// 获取班级
classOptions.value = await getClassList("");
});
</script>
<style scoped lang="scss">


+ 188
- 145
SafeCampus.WEB/src/views/violation/portrait/detail.vue
ファイル差分が大きすぎるため省略します
ファイルの表示


+ 15
- 6
monitorMobile/pages/earlyWarning/components/warningInfo.vue ファイルの表示

@@ -98,7 +98,7 @@

</view>
<view class="tableBox">
<u-empty marginTop="100rpx" :show="false" mode="warnList" text="暂无数据"></u-empty>
<u-empty marginTop="100rpx" :show="false" mode="list" text="暂无数据"></u-empty>
<u-list @scrolltolower="scrolltolower" style="height: calc(100% - 0rpx);">
<u-list-item v-for="(item, index) in warnList" :key="index">
<view class="liBox">
@@ -184,6 +184,11 @@
<script>
import selectRadio from "@/components/selectRadio.vue"
import selectSearch from "@/components/selectSearch.vue"
import {
page, //获取列表
detail, //详情
warnType, //获取预警类型
} from '@/api/warn/index.js'
export default {
components: {
selectRadio,
@@ -361,17 +366,21 @@
loadmore() {
if (this.status != 'loadmore') return
this.status = 'loading'
setTimeout(() => {
for (let i = 0; i < 1; i++) {
this.warnList.push({}, {})
}
page(this.searchForm).then(res=>{
console.log(res)
// 获取到的总条数>=接口总条数
if (this.warnList.length >= 14) {
this.status = 'nomore'
} else {
this.status = 'loadmore'
}
}, 2000)
})
// setTimeout(() => {
// for (let i = 0; i < 1; i++) {
// this.warnList.push({}, {})
// }
// }, 2000)
}
}
}


+ 40
- 4
monitorMobile/pages/monitor/index.vue ファイルの表示

@@ -9,9 +9,8 @@
</view>
</view>
<view class="searchBox">
<view class="searchLine" @click="showTree">

<view class="searchLabels">
<view class="searchLine">
<view class="searchLabels" @click="showTree">
<image v-show="isShowSearch==false" src="@/static/image/earlyWarning/group.png" mode="">
</image>
<image v-show="isShowSearch" src="@/static/image/earlyWarning/group2.png" mode="">
@@ -26,9 +25,46 @@
<image v-show="isShowSearch" src="@/static/image/earlyWarning/arrow2.png" mode=""></image>
</view>
</view>
<view @click="isShowSearch=false" class="searchDialog" v-if="isShowSearch">
<view class="content" @click.stop="isSelect">
<u-row justify="space-between" gutter="10">
<u-col span="7">
<view class="demo-layout">
<view class="left-layout">
<text>{{'警告类型'}}</text>
</view>
<view class="right-layout">
<image style="width: 30rpx;height:30rpx;"
src="@/static/image/earlyWarning/arrowRight.png" mode=""></image>
</view>
</view>
</u-col>
<u-col span="5">
<view class="demo-layout" @click="toOpenSelect">
<view class="left-layout">
<text>{{'处理状态'}}</text>
</view>
<view class="right-layout">
<image style="width: 30rpx;height:30rpx;"
src="@/static/image/earlyWarning/arrowRight.png" mode=""></image>
</view>
</view>
</u-col>
</u-row>
<view class="btnBox">
<view class="leftBtn" @click="clearform">
重置
</view>
<view class="rightBtn" @click="onsubmit">
确认
</view>
</view>
</view>
</view>
</view>
<view class="tableBox">
<u-empty marginTop="100rpx" :show="false" mode="warnList" text="暂无数据"></u-empty>
<u-empty marginTop="100rpx" :show="false" mode="list" text="暂无数据"></u-empty>
<u-list @scrolltolower="scrolltolower" style="height: calc(100% - 0rpx);">
<u-list-item v-for="(item, index) in warnList" :key="index">
<view class="liBox">


読み込み中…
キャンセル
保存