提交 cbdb5c70 authored 作者: 刘旭's avatar 刘旭

更新修改后代码

上级 9bb0a4ee
{
"vue3snippets.enable-compile-vue-file-on-did-save-code": false
}
\ No newline at end of file
...@@ -6,12 +6,12 @@ ...@@ -6,12 +6,12 @@
<link rel="stylesheet" href="./src/static/iconfont/iconfont.css" /> <link rel="stylesheet" href="./src/static/iconfont/iconfont.css" />
<script> <script>
var coverSupport = var coverSupport =
'CSS' in window && "CSS" in window &&
typeof CSS.supports === 'function' && typeof CSS.supports === "function" &&
(CSS.supports('top: env(a)') || CSS.supports('top: constant(a)')) (CSS.supports("top: env(a)") || CSS.supports("top: constant(a)"))
document.write( document.write(
'<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' + '<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' +
(coverSupport ? ', viewport-fit=cover' : '') + (coverSupport ? ", viewport-fit=cover" : "") +
'" />' '" />'
) )
</script> </script>
......
<script setup lang="ts"> <script setup lang="ts">
import { onLaunch, onShow, onHide } from '@dcloudio/uni-app'; import { onLaunch, onShow, onHide } from "@dcloudio/uni-app"
</script> </script>
<style lang="scss"> <style lang="scss">
@import './static/iconfont.css'; @import "./static/iconfont/iconfont.css";
@import './scss/common.scss'; @import "./scss/common.scss";
@import "vk-uview-ui/index.scss"; @import "vk-uview-ui/index.scss";
.uni-tabbar { .uni-tabbar {
...@@ -17,4 +17,3 @@ page { ...@@ -17,4 +17,3 @@ page {
background: #f5f5f5; background: #f5f5f5;
} }
</style> </style>
<template>
<!-- <headers title='考勤地点设置' />
<view class="map" :style="{ height: mapState.windowHeight * 0.5 + 'px', top: mapState.searchStatus ? '-10%' : 0 }">
<map :longitude="mapState.longitude" :latitude="mapState.latitude" :show-location="true">
<view class="cotrons">
<u-button size="mini" type="primary">完成</u-button>
</view>
</map>
</view>
<view class="addr"
:style="{ height: mapState.windowHeight * 0.7 + 'px', top: mapState.searchStatus ? '50%' : '30%' }">
<uni-search-bar placeholder="课程名称/班级名称" clearButton="auto" @confirm="search" @focus="onFocus"
@cancel="onCancel" />
</view> -->
</template>
<script setup lang='ts'>
// import headers from '@/components/header/index.vue'
// import QQMapWX from '@/utils/qqmap-wx-jssdk'
// import { jsonp } from '@/utils/util';
// new QQMapWX({
// key: '3M5BZ-SFCRJ-AHSF7-XRA5Q-Y6NIJ-DXBH4' // 必填
// });
// const flag = ref(true)
// const mapState = reactive({
// windowWidth: uni.getSystemInfoSync().windowWidth,
// windowHeight: uni.getSystemInfoSync().windowHeight,
// searchStatus: true,
// longitude: '139.7902',
// latitude: '35.6513',
// markers: [
// {
// id: "gyqy",
// latitude: "29.595587852178966",
// longitude: "106.22169495575275",
// title: "企业",
// iconPath: "./images/map/currentPos.png",
// },
// ] as any,
// })
// //触发关键词输入提示事件
// const getsuggest = (e?: any) => {
// uni.getLocation({
// type: 'gcj02',
// success: function (res) {
// console.log('当前位置的经度:' + res.longitude);
// console.log('当前位置的纬度:' + res.latitude);
// }
// });
// // console.log("e", e.detail.value)
// let url = 'https://apis.map.qq.com/ws/place/v1/suggestion/?keyword=';
// jsonp(url, {
// key: '3M5BZ-SFCRJ-AHSF7-XRA5Q-Y6NIJ-DXBH4',
// keyword: '湖南',
// output: 'jsonp'
// }).then((res: any) => {
// console.log("jsonp", res)
// var sug = [];
// // for (var i = 0; i < res.data.length; i++) {
// // sug.push({ // 获取返回结果,放到sug数组中
// // title: res.data[i].title,
// // id: res.data[i].id,
// // addr: res.data[i].address,
// // city: res.data[i].city,
// // district: res.data[i].district,
// // latitude: res.data[i].location.lat,
// // longitude: res.data[i].location.lng
// // });
// // }
// })
// }
// // getsuggest()
// const search = () => {
// }
// const onFocus = () => {
// mapState.searchStatus = false
// }
// const onCancel = () => {
// mapState.searchStatus = true
// }
// const init = () => {
// uni.getLocation({
// type: 'gcj02',
// success: function (res: any) {
// console.log('当前位置的经度:' + res.longitude);
// console.log('当前位置的纬度:' + res.latitude);
// setTimeout(function () {
// mapState.longitude = res.longitude
// mapState.latitude = res.latitude
// }, 2000);
// // console.log(mapState);
// }
// });
// }
// onMounted(() => {
// init()
// })
// </script>
// <style lang="scss" scoped>
// .map {
// width: 100%;
// transition: height .3s;
// map {
// width: 100%;
// height: 100%;
// }
// .cotrons {
// text-align: end;
// padding: 20rpx;
// }
// }
// .addr {
// position: fixed;
// bottom: 0;
// width: 100%;
// background-color: #ffffff;
// // height: 500px;
// padding: 10rpx;
// transition: height .3s;
// border-top-left-radius: 20rpx;
// border-top-right-radius: 20rpx;
// }
//
</style>
\ No newline at end of file
import request from "@/utils/request"
// 查询班级
export const getClassList = (data: any) =>
request(
"/LQKJ.K3.PeiXunSystem.WebApi.WebApiService.TeachMgt,LQKJ.K3.PeiXunSystem.WebApi.common.kdsvc",
"POST",
data
)
/**
* @brief 查询每个班级通讯录信息
* @param CLASSID // 班级内码
* @return
*/
export const getClassBook = (data?: any) =>
request(
"/LQKJ.K3.PeiXunSystem.WebApi.WebApiService.ClassBook,LQKJ.K3.PeiXunSystem.WebApi.common.kdsvc",
"POST",
data
)
/**
* @brief 评价
* @param data
* @return
*/
export const remarkOn = (data?: any) =>
request(
"/LQKJ.K3.PeiXunSystem.WebApi.WebApiEditService.RemarkOn,LQKJ.K3.PeiXunSystem.WebApi.common.kdsvc",
"POST",
data
)
/**
* @brief 查看评价
* @param data
* @return
*/
export const remarkDetail = (data?: any) =>
request(
"/LQKJ.K3.PeiXunSystem.WebApi.WebApiService.RemarkDetail,LQKJ.K3.PeiXunSystem.WebApi.common.kdsvc",
"POST",
data
)
import request from "@/utils/request"
/**
* @brief 查询我的课程
* @param FMOBILE //手机号码
* @param type //0:上课中,1:已结束,2:未开始
* @return
*/
export const getCourse = (data?: any) =>
request(
"/LQKJ.K3.PeiXunSystem.WebApi.WebApiService.CourseDetail,LQKJ.K3.PeiXunSystem.WebApi.common.kdsvc",
"POST",
data
)
/**
* @brief 查询我的课程
* @param FMOBILE //手机号码
* @param type //0:上课中,1:已结束,2:未开始
* @return
*/
export const getCourseList = (data?: any) =>
request(
"/LQKJ.K3.PeiXunSystem.WebApi.WebApiService.TeachAndCourse,LQKJ.K3.PeiXunSystem.WebApi.common.kdsvc",
"POST",
data
)
/**
* @brief 查询讲师介绍和课程介绍
* @param TeachName // 班级名称
* @param CouseId // 课程内码
* @return
*/
export const getTeachDetail = (data?: any) =>
request(
"/LQKJ.K3.PeiXunSystem.WebApi.WebApiService.TeachDetail,LQKJ.K3.PeiXunSystem.WebApi.common.kdsvc",
"POST",
data
)
/**
* @brief 签到签退
* @param data
* @return
*/
export const signInAndOut = (data?: any) =>
request(
"/LQKJ.K3.PeiXunSystem.WebApi.WebApiEditService.ClockId,LQKJ.K3.PeiXunSystem.WebApi.common.kdsvc",
"POST",
data
)
/**
* @brief 查看附件
* @param data
* @return
*/
export const geFileList = (data?: any) =>
request(
"/LQKJ.K3.PeiXunSystem.WebApi.WebApiService.FilePDF,LQKJ.K3.PeiXunSystem.WebApi.common.kdsvc",
"POST",
data
)
import request from '@/utils/request' import request from "@/utils/request"
// 登录 // 登录
export const login = (data: any) => request('/lowcodeplatform-system/auth/login/app', 'POST', data) export const getUserInfo = (code: string) => {
alert(code)
request(
"/LQKJ.K3.PeiXunSystem.WebApi.WebApiService.User,LQKJ.K3.PeiXunSystem.WebApi.common.kdsvc",
"POST",
{ code }
)
}
// 注册
export const register = (data: any) => {
request(
"/LQKJ.K3.PeiXunSystem.WebApi.WebApiEditService.Quit,LQKJ.K3.PeiXunSystem.WebApi.common.kdsvc",
"POST",
data
)
}
// 上传图片
export const uploadImage = (data: any) => {
request(
"/LQKJ.K3.PeiXunSystem.WebApi.WebApiEditService.Image,LQKJ.K3.PeiXunSystem.WebApi.common.kdsvc",
"POST",
data
)
}
import request from "@/utils/request"
/**
* @brief 查询考勤信息
* @param data
* @return
*/
export const getLocationList = (data: any) =>
request(
"/LQKJ.K3.PeiXunSystem.WebApi.WebApiService.Location,LQKJ.K3.PeiXunSystem.WebApi.common.kdsvc",
"POST",
data
)
/**
* @brief 设置考勤地位
* @param data
* @return
*/
export const setAddr= (data: any) =>
request(
"/LQKJ.K3.PeiXunSystem.WebApi.WebApiEditService.Sett,LQKJ.K3.PeiXunSystem.WebApi.common.kdsvc",
"POST",
data
)
...@@ -35,7 +35,7 @@ ...@@ -35,7 +35,7 @@
size="mini" size="mini"
@tap="submit" @tap="submit"
style="margin-right: 30rpx" style="margin-right: 30rpx"
>完成</u-button >下一步</u-button
> >
</template> </template>
</u-navbar> </u-navbar>
......
...@@ -25,35 +25,40 @@ ...@@ -25,35 +25,40 @@
"path": "pages/class/index", "path": "pages/class/index",
"style": { "style": {
"navigationBarTitleText": "我的班级", "navigationBarTitleText": "我的班级",
"navigationStyle": "custom" "navigationStyle": "custom",
"onReachBottomDistance": 50
} }
}, },
{ {
"path": "pages/class/addressBook", "path": "pages/class/addressBook",
"style": { "style": {
"navigationBarTitleText": "班级通讯录", "navigationBarTitleText": "班级通讯录",
"navigationStyle": "custom" "navigationStyle": "custom",
"onReachBottomDistance": 50
} }
}, },
{ {
"path": "pages/class/classEvaluate", "path": "pages/class/classEvaluate",
"style": { "style": {
"navigationBarTitleText": "我的班级", "navigationBarTitleText": "我的班级",
"navigationStyle": "custom" "navigationStyle": "custom",
"onReachBottomDistance": 50
} }
}, },
{ {
"path": "pages/class/evaluate", "path": "pages/class/evaluate",
"style": { "style": {
"navigationBarTitleText": "培训评价", "navigationBarTitleText": "培训评价",
"navigationStyle": "custom" "navigationStyle": "custom",
"onReachBottomDistance": 50
} }
}, },
{ {
"path": "pages/course/index", "path": "pages/course/index",
"style": { "style": {
"navigationBarTitleText": "我的课程", "navigationBarTitleText": "我的课程",
"navigationStyle": "custom" "navigationStyle": "custom",
"onReachBottomDistance": 50
} }
}, },
{ {
...@@ -83,6 +88,27 @@ ...@@ -83,6 +88,27 @@
"navigationBarTitleText": "考勤地点设置", "navigationBarTitleText": "考勤地点设置",
"navigationStyle": "custom" "navigationStyle": "custom"
} }
},
{
"path": "pages/setPositioning/setAttendance",
"style": {
"navigationBarTitleText": "考勤地点设置",
"navigationStyle": "custom"
}
},
{
"path": "pages/class/courseArrange",
"style": {
"navigationBarTitleText": "课程安排",
"navigationStyle": "custom"
}
},
{
"path": "pages/course/pdfView",
"style": {
"navigationBarTitleText": "预览pdf",
"navigationStyle": "custom"
}
} }
], ],
"globalStyle": { "globalStyle": {
......
<template> <template>
<headers title='班级通讯录' /> <headers title="班级通讯录" />
<div class='address-book-item-container'> <view v-if="addressBookList.length" class="address-book-item-container">
<uni-search-bar placeholder="姓名/单位/电话" bgColor="#ffffff" clearButton="auto" cancelButton="none" <uni-search-bar
@confirm="search" /> placeholder="姓名/单位/电话"
<text style="margin-bottom: 20rpx; display: block;">为你找到10个的同学</text> bgColor="#ffffff"
clearButton="auto"
<view> cancelButton="none"
<block v-for="(item, i) in 6" :key="i"> @confirm="search"
<addressBookItem button-title="联系TA" /> />
<text style="margin-bottom: 20rpx; display: block">为你找到10个的同学</text>
<block v-for="(item, i) in addressBookList" :key="i">
<addressBookItem
:addressBookItem="item"
buttonTitle="联系TA"
@tapButton="tapButton"
/>
</block> </block>
<view style="padding: 20rpx">
<u-loadmore :status="status" icon-type="flower" />
</view>
</view>
<view v-else class="empty">
<u-empty text="暂无数据" mode="list"></u-empty>
</view> </view>
</div>
</template> </template>
<script setup lang='ts'> <script setup lang="ts">
import headers from '@/components/header/index.vue' import headers from "@/components/header/index.vue"
import addressBookItem from './components/addressBookItem.vue' import addressBookItem from "./components/addressBookItem.vue"
import { getClassBook } from "@/api/class"
import { useGlobalStore } from "@/store/useStore"
const globalStore = useGlobalStore()
const listQuery = reactive({
Phone: globalStore.Phone,
classId: "",
pageIndex: 1,
pageSize: 10,
total: 0,
})
const status = ref("loadmore")
const addressBookList = ref([] as any)
onLoad((options: any) => {
listQuery.classId = options.classId
init()
})
const search = (val: string) => { const search = (val: string) => {
console.log('我的同学' + val); console.log("我的同学" + val)
}
const tapButton = (phone: string) => {
location.href = "tel:" + phone
}
const init = async () => {
status.value = "loading"
const { data: res } = await getClassBook(listQuery)
if (res.code == 200) {
if (res.total > 10) status.value = "loadmore"
else status.value = "nomore"
addressBookList.value = res.data
listQuery.total = res.total
console.log(res.data)
}
} }
// 上拉加载数据
onReachBottom(() => {
// 判断是否还有下一页数据
if (listQuery.pageIndex * listQuery.pageSize >= listQuery.total)
return (status.value = "nomore")
// // 判断是否正在请求其它数据,如果是,则不发起额外的请求
if (status.value === "loading") return
listQuery.pageIndex += 1
init()
})
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
......
<template> <template>
<headers title='我的班级' /> <headers title="我的班级" />
<view class='eval-container'> <view v-if="addressBookList.length" class="address-book-item-container">
<u-tabs :list="tabsState.list" :is-scroll="false" v-model="tabsState.current" bg-color="#f5f5f5" <uni-search-bar
@change="tabsChange" /> placeholder="姓名/单位/电话"
bgColor="#ffffff"
clearButton="auto"
cancelButton="none"
@confirm="search"
/>
<text style="margin-bottom: 20rpx; display: block">为你找到10个的同学</text>
<!-- 内容 --> <block v-for="(item, i) in addressBookList" :key="i">
<view v-if="true"> <addressBookItem
<!-- 搜索 --> :addressBookItem="item"
<uni-search-bar placeholder="班级名称" bgColor="#ffffff" clearButton="auto" cancelButton="none" buttonTitle="查看评价"
@confirm="search" /> @tapButton="tapButton"
<text style="margin-bottom: 20rpx; display: block;">为你找到10个的班级</text> />
<view>
<block v-for="(item, i) in 6" :key="i">
<addressBookItem :button-title="buttonTitle" @tapButton="tapButton" />
</block> </block>
<view style="padding: 20rpx">
<u-loadmore :status="status" icon-type="flower" />
</view> </view>
</view> </view>
<view v-else class="empty"> <view v-else class="empty">
<u-empty text="暂无数据" mode="list"></u-empty> <u-empty text="暂无数据" mode="list"></u-empty>
</view> </view>
</view>
</template> </template>
<script setup lang='ts'> <script setup lang="ts">
import headers from '@/components/header/index.vue' import headers from "@/components/header/index.vue"
import addressBookItem from './components/addressBookItem.vue' import addressBookItem from "./components/addressBookItem.vue"
import { getClassBook } from "@/api/class"
import { useGlobalStore } from "@/store/useStore"
const tabsState = reactive({ const globalStore = useGlobalStore()
list: [{ const listQuery = reactive({
name: '已评价' Phone: globalStore.Phone,
}, { classId: "",
name: '未评价' pageIndex: 1,
}], pageSize: 10,
current: 0 total: 0,
}) })
const status = ref("loadmore")
const addressBookList = ref([] as any)
const buttonTitle = ref('查看评价') onLoad((options: any) => {
listQuery.classId = options.classId
const tabsChange = (index: number) => { init()
console.log(index); })
if (index) {
buttonTitle.value = ''
} else buttonTitle.value = '查看评价'
}
const search = (val: string) => { const search = (val: string) => {
console.log('我的班级' + val); console.log("我的同学" + val)
} }
const tapButton = () => { const tapButton = (classId: string, studentId: string) => {
uni.navigateTo({ uni.navigateTo({
url: '/pages/class/evaluate' url: "/pages/class/evaluate?classId=" + classId + "&studentId=" + studentId,
}) })
} }
const init = async () => {
status.value = "loading"
const { data: res } = await getClassBook(listQuery)
if (res.code == 200) {
if (res.total > 10) status.value = "loadmore"
else status.value = "nomore"
addressBookList.value = res.data
listQuery.total = res.total
console.log(res.data)
}
}
// 上拉加载数据
onReachBottom(() => {
// 判断是否还有下一页数据
if (listQuery.pageIndex * listQuery.pageSize >= listQuery.total)
return (status.value = "nomore")
// // 判断是否正在请求其它数据,如果是,则不发起额外的请求
if (status.value === "loading") return
listQuery.pageIndex += 1
init()
})
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.eval-container { .address-book-item-container {
padding: 0 30rpx 30rpx; padding: 0 30rpx;
.uni-searchbar { .uni-searchbar {
padding: 0; padding: 0;
......
<template> <template>
<div class='address-book-container'> <div class="address-book-container">
<u-card :show-head="false" :show-foot="false" margin="0" border-radius="20"> <u-card :show-head="false" :show-foot="false" margin="0" border-radius="20">
<template #body> <template #body>
<view class="address-book-content"> <view class="address-book-content">
<view class="left"> <view class="left">
<u-image width="160rpx" height="160rpx" :src="src"></u-image> <u-image width="160rpx" height="160rpx" :src="src"></u-image>
<view class="content"> <view class="content">
<h4>刘芳芳</h4> <h4>{{ addressBookItem.stuName }}</h4>
<text class="tel">15611111111</text> <text class="tel">{{ addressBookItem.Phone }}</text>
<text>单位:南山区南山街道办</text> <text>单位: {{ addressBookItem.stuUnit }}</text>
</view> </view>
</view> </view>
<u-button v-show="buttonTitle" size="mini" type="primary" @tap="tapButton">{{ buttonTitle }} <u-button
v-show="buttonTitle"
size="mini"
type="primary"
@tap="tapButton"
>{{ buttonTitle }}
</u-button> </u-button>
</view> </view>
</template> </template>
...@@ -20,17 +25,28 @@ ...@@ -20,17 +25,28 @@
</div> </div>
</template> </template>
<script setup lang='ts'> <script setup lang="ts">
import { src } from '@/utils/example'; import { src } from "@/utils/example"
defineProps({ const props = defineProps({
buttonTitle: String addressBookItem: {
type: Array,
default: () => [],
} as any,
buttonTitle: String,
}) })
const emits = defineEmits(['tapButton']) const emits = defineEmits(["tapButton"])
const tapButton = () => { const tapButton = () => {
emits('tapButton') if (props.buttonTitle === "联系TA")
emits("tapButton", props.addressBookItem.Phone)
else
emits(
"tapButton",
props.addressBookItem.FCLASS,
props.addressBookItem.studentId
)
} }
</script> </script>
...@@ -40,7 +56,6 @@ const tapButton = () => { ...@@ -40,7 +56,6 @@ const tapButton = () => {
height: 200rpx; height: 200rpx;
.address-book-content { .address-book-content {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
......
...@@ -28,6 +28,8 @@ ...@@ -28,6 +28,8 @@
</template> </template>
<script setup lang='ts'> <script setup lang='ts'>
const props = defineProps({ const props = defineProps({
arrangeList: { arrangeList: {
type: Array, type: Array,
......
<template> <template>
<div class='class-item-container'> <view class="class-item-container">
<u-card :show-head="false" margin="0" border-radius="20"> <u-card :show-head="false" margin="0" border-radius="20">
<template #body> <template #body>
<view class="calss-header"> <view class="calss-header">
<h3>{{ classList.title }}</h3> <h3>{{ classItem.className }}</h3>
<!-- <u-button v-show="current == 2" size="mini" type="primary" @tap="toEvaluate">去评价</u-button> --> <u-button
v-show="current == 2"
size="mini"
type="primary"
@tap="toEvaluate"
>查看评价</u-button
>
</view> </view>
<view class="item"> <view class="item">
<text>课程时间:</text> <text>课程时间:</text>
<text>{{ classList.dateStart }}{{ classList.dateEnd }}</text> <text>{{ classItem.startDate }}{{ classItem.endDate }}</text>
</view> </view>
<view class="item"> <view class="item">
<text>教室地点:</text> <text>教室地点:</text>
<text>{{ classList.address }}</text> <text>{{ classItem.classArea }}</text>
</view>
<view>
</view> </view>
<view> </view>
<view class="progress item"> <view class="progress item">
<text>课程进度:</text> <text>课程进度:</text>
<u-line-progress active-color="#2979ff" :percent="percent" :height="25" /> <u-line-progress
active-color="#2979ff"
:percent="percent ? percent : 0"
:height="25"
/>
</view> </view>
<view class="class-teacher item"> <view class="class-teacher item">
<text>班主任:</text> <text>班主任:</text>
<u-tag v-for="(item, index) in classList.classTeacher" :key="index" :text="item" shape="circle" /> <u-tag
v-for="(item, index) in classItem.Management"
:key="index"
:text="item.teachName"
shape="circle"
/>
</view> </view>
</template> </template>
<template #foot> <template #foot>
<view class="class-footer"> <view class="class-footer">
<u-button size="mini" plain @tap="toAddressBook">班级通讯录</u-button> <u-button size="mini" plain @tap="toAddressBook">班级通讯录</u-button>
<u-button size="mini" plain>班级二维码</u-button> <u-button size="mini" plain @tap="classQrCode">班级二维码</u-button>
<u-button type="primary" size="mini" plain @tap="toClassEvaluate">培训评价</u-button> <u-button type="primary" size="mini" plain @tap="toCourseArrange"
>课程安排</u-button
>
</view> </view>
</template> </template>
</u-card> </u-card>
</div> </view>
<saveQrCode v-model="show" />
</template> </template>
<script setup lang='ts'> <script setup lang="ts">
import saveQrCode from "./saveQrCode.vue"
const props = defineProps({ const props = defineProps({
classList: { classItem: {
type: Array, type: Array,
default: () => [] default: () => [],
} as any, } as any,
current: { current: {
type: Number, type: Number,
default: 0 default: 0,
} },
}) })
const percent = computed(() => { const show = ref(false)
return props.classList.currentProgress / props.classList.overallProgress * 100
}) const percent = computed(
() =>
(props.classItem.coursePro[0]?.SumPro / props.classItem.courseSum[0].Sum) *
100
)
const classQrCode = () => {
show.value = true
}
const toAddressBook = () => { const toAddressBook = () => {
uni.navigateTo({ uni.navigateTo({
url: '/pages/class/addressBook' url: "/pages/class/addressBook?classId=" + props.classItem.classId,
}) })
} }
const toClassEvaluate = () => { const toCourseArrange = () => {
uni.navigateTo({ uni.navigateTo({
url: '/pages/class/classEvaluate' url: "/pages/class/courseArrange?classId=" + props.classItem.classId,
}) })
} }
const toEvaluate = () => { const toEvaluate = () => {
uni.navigateTo({ uni.navigateTo({
url: '/pages/class/evaluate' url: "/pages/class/classEvaluate?classId=" + props.classItem.classId,
}) })
} }
</script> </script>
...@@ -83,7 +110,7 @@ const toEvaluate = () => { ...@@ -83,7 +110,7 @@ const toEvaluate = () => {
margin-bottom: 16rpx; margin-bottom: 16rpx;
h3 { h3 {
margin: 0 margin: 0;
} }
uni-button { uni-button {
...@@ -98,7 +125,7 @@ const toEvaluate = () => { ...@@ -98,7 +125,7 @@ const toEvaluate = () => {
text { text {
display: block; display: block;
padding: 12rpx 0; padding: 12rpx 0;
font-size: 32rpx; font-size: 28rpx;
} }
text:first-child { text:first-child {
...@@ -136,7 +163,7 @@ const toEvaluate = () => { ...@@ -136,7 +163,7 @@ const toEvaluate = () => {
.class-footer { .class-footer {
width: 100%; width: 100%;
display: flex; display: flex;
justify-content: end; justify-content: flex-end;
uni-button { uni-button {
margin-left: 30rpx; margin-left: 30rpx;
......
<template>
<u-popup
v-model="props.show"
mode="center"
closeable
border-radius="15"
width="80%"
>
<view class="qrcode">
<view class="title">班级二维码</view>
<view class="image">
<u-image
width="100%"
height="500rpx"
:src="qrCodeUrl"
ref="canvasRef"
/>
</view>
</view>
<view class="footer">
<u-button type="primary" size="medium" @tap="updateImage"
>更新二维码</u-button
>
<u-button type="success" size="medium" @tap="saveImage(qrCodeUrl)"
>保存二维码</u-button
>
</view>
</u-popup>
</template>
<script setup lang="ts">
import { qrCodeUrl } from "@/utils/example"
import { toast } from "@/utils/util"
import html2canvas from "html2canvas"
const props = defineProps({
show: Boolean,
})
const canvasRef = ref()
const updateImage = () => {
uni.chooseImage({
count: 1,
success: (chooseImageRes) => {
const tempFilePaths = chooseImageRes.tempFilePaths
uni.uploadFile({
url: "https://www.example.com/upload", //仅为示例,非真实的接口地址
filePath: tempFilePaths[0],
name: "file",
formData: {
user: "test",
},
success: (uploadFileRes) => {
console.log(uploadFileRes.data)
},
})
},
})
}
const saveImage = (url: string) => {
// savePic(url)
downloadImage(url)
}
function downloadImage(url: string) {
const link = document.createElement("a")
link.href = url
link.download = "image.jpg"
link.style.display = "none"
document.body.appendChild(link)
link.click()
document.body.removeChild(link)
}
</script>
<style lang="scss" scoped>
:deep(.u-mode-center-box) {
background-color: transparent;
}
.qrcode {
padding: 24rpx;
background-color: #fff;
border-bottom-right-radius: 15rpx;
border-bottom-left-radius: 15rpx;
.title {
font-size: larger;
font-weight: bolder;
}
.image {
padding: 46rpx;
}
}
.footer {
box-sizing: border-box;
margin-top: 50rpx;
background-color: #fff;
border-top-left-radius: 10rpx;
border-top-right-radius: 10rpx;
padding: 20rpx;
display: flex;
.u-btn {
width: 45%;
}
}
</style>
<template>
<headers title="课程安排" />
<view v-if="arrangeList.length" class="course-arrange-container">
<view class="progress">
<text>课程进度:</text>
<u-line-progress
active-color="#2979ff"
:percent="percent ? percent : 0"
:height="25"
/>
</view>
<u-time-line>
<u-time-line-item v-for="(item, index) in arrangeList" :key="index">
<template #node>
<view class="u-node">
<view class="u-dot"></view>
</view>
</template>
<template #content>
<arrangeItem :arrangeItem="item" />
</template>
</u-time-line-item>
</u-time-line>
<view style="padding: 20rpx">
<u-loadmore :status="status" icon-type="flower" />
</view>
</view>
<view v-else class="empty">
<u-empty text="暂无课程安排" mode="list" />
</view>
</template>
<script setup lang="ts">
import headers from "@/components/header/index.vue"
import arrangeItem from "./components/arrangeItem.vue"
import { getCourse } from "@/api/course"
import { useGlobalStore } from "@/store/useStore"
const arrangeList = ref([] as any)
const globalStore = useGlobalStore()
const percent = ref()
const listQuery = reactive({
Phone: globalStore.Phone,
pageIndex: 1,
pageSize: 999,
total: 0,
type: 2,
classId: "",
})
const status = ref("loadmore")
onLoad((options: any) => {
listQuery.classId = options.classId
init()
})
// 上拉加载数据
onReachBottom(() => {
// 判断是否还有下一页数据
if (listQuery.pageIndex * listQuery.pageSize >= listQuery.total)
return (status.value = "nomore")
// // 判断是否正在请求其它数据,如果是,则不发起额外的请求
if (status.value === "loading") return
listQuery.pageIndex += 1
init()
})
const init = async () => {
status.value = "loading"
const { data: res } = await getCourse(listQuery)
if (res.code == 200) {
if (res.total > 10) status.value = "loadmore"
else status.value = "nomore"
arrangeList.value = [...arrangeList.value, ...res.data]
listQuery.total = res.total
let num: number = res.data.filter(
(item: any) => item.courseType === 2
).length
percent.value = (num / res.total) * 100
// console.log(arrangeList.value)
}
}
</script>
<style lang="scss" scoped>
.course-arrange-container {
padding: 0 20rpx;
.progress {
display: flex;
align-items: center;
justify-content: center;
padding: 26rpx 10rpx 50rpx 30rpx;
text {
display: block;
padding: 12rpx 0;
font-size: 32rpx;
white-space: nowrap;
}
.registered {
margin-left: 30rpx;
color: #3b99fc;
}
}
.u-dot {
height: 22rpx;
width: 22rpx;
border-radius: 3.125rem;
background: #2979ff;
box-shadow: 0 0 10px rgba(0, 0, 0.6, 0.412);
}
}
</style>
<template> <template>
<headers title='培训评价' /> <headers title="培训评价" />
<div class='evaluate-container'> <view class="evaluate-container">
<u-card :show-head="false" :show-foot="false" margin="0" border-radius="20"> <u-card :show-head="false" :show-foot="false" margin="0" border-radius="20">
<template #body> <template #body>
<h4>尊敬的各位学员:</h4> <h4>尊敬的各位学员:</h4>
...@@ -14,19 +14,43 @@ ...@@ -14,19 +14,43 @@
<view> <view>
<view class="rateItem"> <view class="rateItem">
<h4>课程内容</h4> <h4>课程内容</h4>
<u-rate :count="5" v-model="rate.content" size="42" /> <u-rate
:count="5"
v-model="evaluateData.parmeters.Model.FContent"
size="42"
active-color="#F7BA2A"
:disabled="disabled"
/>
</view> </view>
<view class="rateItem"> <view class="rateItem">
<h4>授课讲师</h4> <h4>授课讲师</h4>
<u-rate :count="5" v-model="rate.lecturer" size="42" /> <u-rate
:count="5"
v-model="evaluateData.parmeters.Model.FLecturer"
size="42"
active-color="#F7BA2A"
:disabled="disabled"
/>
</view> </view>
<view class="rateItem"> <view class="rateItem">
<h4>后期服务</h4> <h4>后期服务</h4>
<u-rate :count="5" v-model="rate.postService" size="42" /> <u-rate
:count="5"
v-model="evaluateData.parmeters.Model.FPostService"
size="42"
active-color="#F7BA2A"
:disabled="disabled"
/>
</view> </view>
<view class="rateItem"> <view class="rateItem">
<h4>班主任服务</h4> <h4>班主任服务</h4>
<u-rate :count="5" v-model="rate.teacherService" size="42" /> <u-rate
:count="5"
v-model="evaluateData.parmeters.Model.FClassService"
size="42"
active-color="#F7BA2A"
:disabled="disabled"
/>
</view> </view>
</view> </view>
</template> </template>
...@@ -37,55 +61,105 @@ ...@@ -37,55 +61,105 @@
哪位教师、哪堂课给您留下了深刻印象? 能否告诉我们具体“亮点”? 哪位教师、哪堂课给您留下了深刻印象? 能否告诉我们具体“亮点”?
</text> </text>
<view class="evaluate-textarea"> <view class="evaluate-textarea">
<u-input v-model="evaluateData.evaluate" type="textarea" <u-input
placeholder-style="background-color: #f5f5f5;font-size: 24rpx;overflow-y: auto;" height="200" v-model="evaluateData.parmeters.Model.FHighlights"
maxlength="1400" :auto-height="false" placeholder="快来说说您的想法~" /> type="textarea"
placeholder-style="background-color: #f5f5f5;font-size: 24rpx;overflow-y: auto;"
height="200"
maxlength="1400"
:auto-height="false"
placeholder="快来说说您的想法~"
:disabled="disabled"
/>
</view> </view>
<text style="margin-top: 40rpx;"> <text style="margin-top: 40rpx">
您认为还需要补充哪方面的专题课程? 您认为还需要补充哪方面的专题课程?
</text> </text>
<view class="evaluate-textarea"> <view class="evaluate-textarea">
<u-input v-model="evaluateData.evaluate2" type="textarea" <u-input
placeholder-style="background-color: #f5f5f5;font-size: 24rpx;overflow-y: auto;" height="160" v-model="evaluateData.parmeters.Model.FSupplement"
maxlength="1400" :auto-height="false" placeholder="快来说说您的想法~" /> type="textarea"
placeholder-style="background-color: #f5f5f5;font-size: 24rpx;overflow-y: auto;"
height="160"
maxlength="1400"
:auto-height="false"
placeholder="快来说说您的想法~"
:disabled="disabled"
/>
</view> </view>
<text style="margin-top: 40rpx;"> <text style="margin-top: 40rpx"> 您的培训收获与意见建议: </text>
您的培训收获与意见建议:
</text>
<view class="evaluate-textarea last"> <view class="evaluate-textarea last">
<u-input v-model="evaluateData.evaluate3" type="textarea" <u-input
placeholder-style="background-color: #f5f5f5;font-size: 24rpx;overflow-y: auto;" height="160" v-model="evaluateData.parmeters.Model.FOpinion"
maxlength="1400" :auto-height="false" placeholder="快来说说您的想法~" /> type="textarea"
placeholder-style="background-color: #f5f5f5;font-size: 24rpx;overflow-y: auto;"
height="160"
maxlength="1400"
:auto-height="false"
placeholder="快来说说您的想法~"
:disabled="disabled"
/>
</view> </view>
</template> </template>
</u-card> </u-card>
<view class="submit">
<u-button type="primary" @tap="submit">确定提交</u-button>
</view> </view>
</div>
</template> </template>
<script setup lang='ts'> <script setup lang="ts">
import headers from '@/components/header/index.vue' import headers from "@/components/header/index.vue"
import { remarkOn, remarkDetail } from "@/api/class"
const rate = reactive({ import { toast, zconfirm } from "@/utils/util"
content: 0,
lecturer: 0,
postService: 0,
teacherService: 0,
})
const disabled = ref(false)
const evaluateData = reactive({ const evaluateData = reactive({
evaluate: '', parmeters: {
evaluate2: '', IsDeleteEntry: "false",
evaluate3: '' Model: {
FID: 0,
FEvaluateType: "XMPJ", //评价类型
FClass: {
FNUMBER: "", //班级编码
},
FStudentId: {
FNUMBER: "", //学生编码
},
FTrainingPro: {
FNUMBER: "", //培训项目编码
},
FCourse: {
FNUMBER: "", //课程编码
},
FHighlights: "", //亮点
FSupplement: "", //补充
FOpinion: "", //意见建议
FContent: 0, //课程内容
FLecturer: 0, //授课讲师
FPostService: 0, //后期服务
FClassService: 0, //班主任服务
},
},
}) })
const submit = () => { onLoad(async (options: any) => {
console.log('确定提交'); evaluateData.parmeters.Model.FClass.FNUMBER = options.classNumber
} let data = {
classId: options.classId,
studentId: options.studentId,
pageIndex: 1,
pageSize: 10,
}
const { data: res } = await remarkDetail(data)
if (res.code == 200) {
evaluateData.parmeters.Model.FClassService = res.data[0].FCLASSSERVICE
evaluateData.parmeters.Model.FContent = res.data[0].FCONTENT
evaluateData.parmeters.Model.FLecturer = res.data[0].LECTURER
evaluateData.parmeters.Model.FPostService = res.data[0].FPOSTSERVICE
evaluateData.parmeters.Model.FHighlights = res.data[0].FHIGHLIGHTS
evaluateData.parmeters.Model.FSupplement = res.data[0].FSUPPLEMENT
evaluateData.parmeters.Model.FOpinion = res.data[0].FOPINION
disabled.value = true
}
})
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
...@@ -97,7 +171,6 @@ const submit = () => { ...@@ -97,7 +171,6 @@ const submit = () => {
text { text {
display: block; display: block;
} }
.detail { .detail {
......
<template> <template>
<headers title='我的班级' /> <headers title="我的班级" />
<view class='class-container'> <view class="class-container">
<u-tabs :list="tabsState.list" :is-scroll="false" v-model="tabsState.current" bg-color="#f5f5f5" <u-tabs
@change="tabsChange" /> :list="tabsState.list"
:is-scroll="false"
v-model="tabsState.current"
bg-color="#f5f5f5"
@change="tabsChange"
/>
<!-- 内容 --> <!-- 内容 -->
<view v-if="classList.length"> <view v-if="classList.length">
<!-- 搜索 --> <!-- 搜索 -->
<uni-search-bar placeholder="班级名称" bgColor="#ffffff" clearButton="auto" cancelButton="none" <uni-search-bar
@confirm="search" /> placeholder="班级名称"
<text style="margin-bottom: 20rpx; display: block;">为你找到10个的班级</text> bgColor="#ffffff"
clearButton="auto"
cancelButton="none"
@confirm="search"
/>
<text style="margin-bottom: 20rpx; display: block"
>为你找到10个的班级</text
>
<template v-for="(item, index) in classList" :key="index"> <block v-for="(item, index) in classList" :key="index">
<classItem :classList="item" :current="tabsState.current" /> <classItem :classItem="item" :current="tabsState.current" />
</template> </block>
<view v-if="tabsState.current" style="padding: 20rpx">
<u-loadmore :status="status" icon-type="flower" />
</view>
</view> </view>
<view v-else class="empty"> <view v-else class="empty">
<u-empty text="暂无数据" mode="list"></u-empty> <u-empty text="暂无数据" mode="list"></u-empty>
...@@ -21,41 +36,86 @@ ...@@ -21,41 +36,86 @@
</view> </view>
</template> </template>
<script setup lang='ts'> <script setup lang="ts">
import headers from '@/components/header/index.vue' import headers from "@/components/header/index.vue"
import classItem from './components/classItem.vue' import classItem from "./components/classItem.vue"
import { getClassList } from "@/api/class"
import { useGlobalStore } from "@/store/useStore"
const globalStore = useGlobalStore()
const tabsState = reactive({ const tabsState = reactive({
list: [{ list: [
name: '进行中' {
}, { name: "进行中",
name: '未开课' },
{
name: "未开课",
}, },
{ {
name: '已结课' name: "已结课",
}], },
current: 0 ],
current: 0,
}) })
const tabsChange = (index: number) => { const classList = ref([] as any)
console.log(index);
const listQuery = reactive({
Phone: globalStore.Phone,
type: 0,
studentId: globalStore.studentId,
pageIndex: 1,
pageSize: 10,
total: 0,
})
const status = ref("loadmore")
const tabsChange = (index: number) => {
classList.value = []
switch (index) {
case 0:
listQuery.type = 0
break
case 1:
listQuery.type = 1
break
default:
listQuery.type = 2
break
}
init()
} }
const search = (val: string) => { const search = (val: string) => {
console.log('我的班级' + val); console.log("我的班级" + val)
} }
const classList = ref([{ // 上拉加载数据
title: '党支部书记班', onReachBottom(() => {
dateStart: '2022-04-01 09:00', // 课程开始时间 // 判断是否还有下一页数据
dateEnd: '2022-04-07 09:00', // 课程结束时间 if (listQuery.pageIndex * listQuery.pageSize >= listQuery.total)
address: '深圳市南山区西丽街道办公室', // 课程地点 return (status.value = "nomore")
overallProgress: 6, // 总进度 // // 判断是否正在请求其它数据,如果是,则不发起额外的请求
currentProgress: 3, // 当前进度 if (status.value === "loading") return
classTeacher: ['郭敬明', '王少龙'] // 班主任 listQuery.pageIndex += 1
}]) init()
})
const init = async () => {
status.value = "loading"
const { data: res } = await getClassList(listQuery)
if (res.code == 200) {
if (res.total > 10) status.value = "loadmore"
else status.value = "nomore"
classList.value = [...classList.value, ...res.data]
listQuery.total = res.total
console.log(classList.value)
}
}
init()
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
......
<template> <template>
<view class='course-item-container'> <view class="course-item-container">
<u-card :show-head="false" margin="0"> <u-card :show-head="false" margin="0">
<template #body> <template #body>
<view class="course-header"> <view class="course-header">
<h3>{{ courseList.title }}</h3> <h3>{{ courseItem.courseName }}</h3>
<view @tap="openInfo"> <view @tap="openInfo">
<u-icon name="order" size="32" /> <u-icon name="order" size="32" />
<text>课件资料</text> <text>课件资料</text>
...@@ -11,20 +11,31 @@ ...@@ -11,20 +11,31 @@
</view> </view>
<view class="item"> <view class="item">
<u-icon name="account" /> <u-icon name="account" />
<text>{{ courseList.teacher }}</text> <block v-for="(item, i) in courseItem.Teachs">
<text>&nbsp;{{ item.teachName }}&nbsp;</text>
</block>
</view> </view>
<view class="item"> <view class="item">
<u-icon name="map" /> <u-icon name="map" />
<text>{{ courseList.address }}</text> <text>{{ courseItem.classArea }}</text>
</view> </view>
<view class="item"> <view class="item">
<u-icon name="clock" /> <u-icon name="clock" />
<text>{{ courseList.date }}</text> <text
>&nbsp;{{
dayjs(courseItem.startDate).format("YYYY-MM-DD")
}}&nbsp;&nbsp;
{{
dateFormat(courseItem.startDate) +
"~" +
dateFormat(courseItem.endDate)
}}</text
>
</view> </view>
</template> </template>
<template #foot> <template #foot>
<view class="course-footer"> <view class="course-footer">
<view>所属班级:{{ courseList.class }}</view> <view>所属班级:{{ courseItem.className }}</view>
<view @tap="toSeeMore"> <view @tap="toSeeMore">
<text>查看更多 </text> <text>查看更多 </text>
<u-icon name="arrow-right-double" color="#2979ff" size="24" /> <u-icon name="arrow-right-double" color="#2979ff" size="24" />
...@@ -44,19 +55,54 @@ ...@@ -44,19 +55,54 @@
<template #default> <template #default>
<u-row gutter="18"> <u-row gutter="18">
<u-col span="5"> <u-col span="5">
<view class="">应出勤: <text>100</text></view> <view class=""
>应出勤: <text>&nbsp;{{ courseItem.reallyNum }}</text
></view
>
</u-col> </u-col>
<u-col span="7"> <u-col span="7">
<view class="">正常出勤:<text>100</text></view> <view class=""
>正常出勤:<text
>&nbsp;{{
courseItem.States[0]?.Value.normal
? courseItem.States[0]?.Value.normal
: 0
}}</text
></view
>
</u-col> </u-col>
<u-col span="5"> <u-col span="5">
<view class="">缺勤:<text>100</text></view> <view class=""
>缺勤:<text
>&nbsp;{{
courseItem.States[0]?.Value.lack
? courseItem.States[0]?.Value.lack
: 0
}}</text
></view
>
</u-col> </u-col>
<u-col span="3.5"> <u-col span="3.5">
<view class="">请假:<text>100</text></view> <view class=""
>请假:<text
>&nbsp;{{
courseItem.States[0]?.Value.leave
? courseItem.States[0]?.Value.leave
: 0
}}</text
></view
>
</u-col> </u-col>
<u-col span="3.5"> <u-col span="3.5">
<view class="">补签:<text>100</text></view> <view class=""
>补签:<text
>&nbsp;{{
courseItem.States[0]?.Value.repair
? courseItem.States[0]?.Value.repair
: 0
}}</text
></view
>
</u-col> </u-col>
</u-row> </u-row>
<view class="course-collapse-footer"> <view class="course-collapse-footer">
...@@ -73,33 +119,46 @@ ...@@ -73,33 +119,46 @@
</view> </view>
<infoPopup v-model:show="infoState.show" /> <infoPopup v-model:show="infoState.show" />
</template> </template>
<script setup lang='ts'> <script setup lang="ts">
import infoPopup from './infoPopup.vue'; import infoPopup from "./infoPopup.vue"
import dayjs from "dayjs"
const props = defineProps({ const props = defineProps({
courseList: { courseItem: {
type: Array, type: Array,
default: () => [] default: () => [],
} as any, } as any,
current: { current: {
type: Number, type: Number,
default: 0 default: 0,
} },
}) })
const emits = defineEmits(['openInfo']) const emits = defineEmits(["openInfo"])
const dateFormat = (dateStr: string) => {
// 创建一个日期对象,传入特定日期和时间
const date = new Date(dateStr)
// 获取小时和分钟
const hours = ("0" + date.getHours()).slice(-2)
const minutes = ("0" + date.getMinutes()).slice(-2)
// 构建时间字符串
const time = hours + ":" + minutes
return time
}
const infoState = reactive({ const infoState = reactive({
show: false show: false,
}) })
const toSeeMore = () => { const toSeeMore = () => {
uni.navigateTo({ uni.navigateTo({
url: '/pages/course/seeMore' url: "/pages/course/seeMore",
}) })
} }
const toAttendanceDetails = () => { const toAttendanceDetails = () => {
uni.navigateTo({ uni.navigateTo({
url: '/pages/course/attendanceDetails' url: "/pages/course/attendanceDetails",
}) })
} }
...@@ -194,11 +253,9 @@ const openInfo = () => { ...@@ -194,11 +253,9 @@ const openInfo = () => {
.line-content { .line-content {
display: flex; display: flex;
} }
} }
.class-teacher { .class-teacher {
display: flex; display: flex;
align-items: center; align-items: center;
......
<template> <template>
<u-popup v-model="props.show" mode="bottom" closeable height="40%" border-radius="30" @close="handeClose"> <u-popup
v-model="props.show"
mode="bottom"
closeable
height="40%"
border-radius="30"
@close="handeClose"
>
<view class="info"> <view class="info">
<text class="title">课程资料</text> <block v-if="infoList.length">
<view v-for="(item, i) in 10" class="item"> <text class="title">课件资料</text>
<view v-for="(item, i) in infoList" :key="i" class="item">
<view> <view>
<u-icon name="order" size="50"></u-icon> <u-icon name="order" size="50"></u-icon>
<text>党性学习第一节课件.pdf</text> <text>{{ item.name }}</text>
</view> </view>
<view> <view>
<u-icon name="eye-fill" size="50" style="margin-right: 30rpx;"></u-icon> <u-icon
<u-icon name="download" size="50"></u-icon> name="eye-fill"
size="50"
style="margin-right: 30rpx"
@tap="pdfView(item)"
></u-icon>
<u-icon name="download" size="50" @tap="downLoadPdf(item)"></u-icon>
</view> </view>
</view> </view>
</block>
<view v-else class="empty">
<u-empty text="暂无资料" mode="list" />
</view>
</view> </view>
</u-popup> </u-popup>
</template> </template>
<script setup lang='ts'> <script setup lang="ts">
import { zconfirm } from "@/utils/util"
import { geFileList } from "@/api/course"
import { baseUrl } from "@/utils/request"
const props = defineProps({ const props = defineProps({
show: { show: {
type: Boolean, type: Boolean,
default: false default: false,
} },
courseNumber: {
type: String,
default: "",
},
}) })
const emits = defineEmits(['update:show']) const emits = defineEmits(["update:show"])
const pdfView = (item: any) => {
uni.navigateTo({
url:
"/pages/course/pdfView?name=" +
item.name +
"&url=" +
encodeURIComponent(baseUrl + "/" + item.url),
})
}
const infoList = ref([] as any)
const downLoadPdf = (item: any) => {
zconfirm("确定下载课件资料?", (result: boolean) => {
if (result) {
const url = baseUrl + "/" + item.url
const a = document.createElement("a")
a.href = url
a.download = item.name
a.click()
}
})
}
const handeClose = () => { const handeClose = () => {
emits('update:show', false) emits("update:show", false)
} }
const init = async () => {
const { data: res } = await geFileList({ courseNumber: props.courseNumber })
if (res.code == 200) {
console.log(res)
infoList.value = res.data
}
}
defineExpose({
init,
})
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
...@@ -52,13 +113,14 @@ const handeClose = () => { ...@@ -52,13 +113,14 @@ const handeClose = () => {
} }
.item { .item {
box-sizing: border-box;
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
background-color: $u-type-info-light; background-color: $u-type-info-light;
width: 100%; width: 100%;
height: 100rpx; height: 100rpx;
padding: 20rpx; padding: 30rpx;
border-radius: 10rpx; border-radius: 10rpx;
margin-bottom: 20rpx; margin-bottom: 20rpx;
...@@ -76,3 +138,9 @@ const handeClose = () => { ...@@ -76,3 +138,9 @@ const handeClose = () => {
} }
} }
</style> </style>
<style>
:deep(uni-modal) {
z-index: 19999 !important;
}
</style>
<template> <template>
<headers title='我的课程' /> <headers title="我的课程" />
<view class='course-container'> <view class="course-container">
<u-tabs :list="tabsState.list" :is-scroll="false" v-model="tabsState.current" bg-color="#f5f5f5" <u-tabs
@change="tabsChange" /> :list="tabsState.list"
:is-scroll="false"
v-model="tabsState.current"
bg-color="#f5f5f5"
@change="tabsChange"
/>
<!-- 内容 --> <!-- 内容 -->
<view v-if="courseList.length"> <view v-if="courseList.length">
<!-- 搜索 --> <!-- 搜索 -->
<uni-search-bar placeholder="班级名称" bgColor="#ffffff" clearButton="auto" cancelButton="none" <uni-search-bar
@confirm="search" /> placeholder="班级名称"
bgColor="#ffffff"
clearButton="auto"
cancelButton="none"
@confirm="search"
/>
<text style="margin-bottom: 20rpx; display: block;">为你找到10个的班级</text> <text style="margin-bottom: 20rpx; display: block"
>为你找到10个的班级</text
>
<block v-for="(item, index) in courseList" :key="index"> <block v-for="(item, index) in courseList" :key="index">
<courseItem :courseList="item" :current="tabsState.current" /> <courseItem :courseItem="item" :current="tabsState.current" />
</block> </block>
<view v-if="tabsState.current" style="padding: 20rpx">
<u-loadmore :status="status" icon-type="flower" />
</view>
</view> </view>
<view v-else class="empty"> <view v-else class="empty">
<u-empty text="暂无数据" mode="list" /> <u-empty text="暂无数据" mode="list" />
...@@ -22,36 +37,85 @@ ...@@ -22,36 +37,85 @@
</view> </view>
</template> </template>
<script setup lang='ts'> <script setup lang="ts">
import headers from '@/components/header/index.vue' import headers from "@/components/header/index.vue"
import courseItem from './components/courseItem.vue'; import courseItem from "./components/courseItem.vue"
import { inClass, notStarted } from './demo' import { getCourseList } from "@/api/course"
import { useGlobalStore } from "@/store/useStore"
const globalStore = useGlobalStore()
const tabsState = reactive({ const tabsState = reactive({
list: [{ list: [
name: '上课中' {
}, { name: "上课中",
name: '未开始' },
}, { {
name: '已下课' name: "未开始",
} },
{
name: "已下课",
},
], ],
current: 0 current: 0,
})
const courseList = ref([] as any)
const listQuery = reactive({
Phone: globalStore.Phone,
pageIndex: 1,
pageSize: 10,
total: 0,
type: 0,
}) })
const courseList: any = ref(inClass) const status = ref("loadmore")
const tabsChange = (index: number) => { const tabsChange = (index: number) => {
if (index) courseList.value = notStarted courseList.value = []
else courseList.value = inClass switch (index) {
case 0:
listQuery.type = 0
break
case 1:
listQuery.type = 1
break
default:
listQuery.type = 2
break
}
init()
} }
const search = (val: string) => { const search = (val: string) => {
console.log('我的课程' + val); console.log("我的班级" + val)
} }
// 上拉加载数据
onReachBottom(() => {
// 判断是否还有下一页数据
if (listQuery.pageIndex * listQuery.pageSize >= listQuery.total)
return (status.value = "nomore")
// // 判断是否正在请求其它数据,如果是,则不发起额外的请求
if (status.value === "loading") return
listQuery.pageIndex += 1
init()
})
const init = async () => {
status.value = "loading"
const { data: res } = await getCourseList(listQuery)
if (res.code == 200) {
if (res.total > 10) status.value = "loadmore"
else status.value = "nomore"
courseList.value = [...courseList.value, ...res.data]
listQuery.total = res.total
console.log(courseList.value)
}
}
init()
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
......
<template>
<headers :title="pdfState.title" />
<view class="pdf-container">
<web-view class="webview" :src="pdfState.pdfUrl"></web-view>
</view>
</template>
<script setup lang="ts">
import headers from "@/components/header/index.vue"
const pdfState = reactive({
title: "",
pdfUrl: "",
viewerUrl: "/static/pdf/web/viewer.html",
})
onLoad((options: any) => {
pdfState.title = options.name
pdfState.pdfUrl =
pdfState.viewerUrl + "?file=" + encodeURIComponent(options.url)
})
</script>
<style lang="scss" scoped>
.pdf-container {
width: 100vw;
height: 100vh;
.webview {
height: 90%;
}
}
</style>
<template> <template>
<u-form :model="loginForm" ref="loginFormRef" :rules="loginFormRules" style="margin-top: 40rpx;" label-posi> <u-form
<u-form-item :leftIconStyle="{ color: '#888', fontSize: '32rpx' }" left-icon="account" label-width="150" :model="loginForm"
label-position="left" label="用户名" prop="username"> ref="loginFormRef"
<u-input placeholder="请输入用户名" v-model="loginForm.username" type="text" /> :rules="loginFormRules"
style="margin-top: 40rpx"
label-posi
>
<u-form-item
:leftIconStyle="{ color: '#888', fontSize: '32rpx' }"
left-icon="account"
label-width="150"
label-position="left"
label="用户名"
prop="username"
>
<u-input
placeholder="请输入用户名"
v-model="loginForm.username"
type="text"
/>
</u-form-item> </u-form-item>
<u-form-item label="密码" :leftIconStyle="{ color: '#888', fontSize: '32rpx' }" left-icon="lock" <!-- <u-form-item label="密码" :leftIconStyle="{ color: '#888', fontSize: '32rpx' }" left-icon="lock"
label-width="150rpx" prop="password"> label-width="150rpx" prop="password">
<u-input type="password" v-model="loginForm.password" placeholder="请输入密码" /> <u-input type="password" v-model="loginForm.password" placeholder="请输入密码" />
</u-form-item> </u-form-item> -->
</u-form> </u-form>
<button @tap="tapLogin" class="getCaptcha">登录</button> <button @tap="tapLogin" class="getCaptcha">登录</button>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { ref, reactive, onMounted } from 'vue' import { ref, reactive, onMounted } from "vue"
import { Login } from '../interface'; import { Login } from "../interface"
import { login } from '@/api/login' import { useGlobalStore } from "@/store/useStore"
import { useGlobalStore } from '@/store/useStore';
const globalStore = useGlobalStore() const globalStore = useGlobalStore()
const loginFormRef = ref() const loginFormRef = ref()
const loginForm = reactive<Login.LoginForm>({ const loginForm = reactive<Login.LoginForm>({
username: 'admin', username: "999666",
password: '123456' password: "123456",
}) })
const loginFormRules = reactive({ const loginFormRules = reactive({
username: [{ required: true, message: '请输入用户名', trigger: 'blur' }], username: [{ required: true, message: "请输入用户名", trigger: "blur" }],
password: [{ required: true, message: '请输入密码', trigger: 'blur' }], password: [{ required: true, message: "请输入密码", trigger: "blur" }],
}) })
let tapLogin = () => { let tapLogin = () => {
globalStore.setPhone(loginForm.username)
uni.navigateTo({ uni.navigateTo({
url: '/pages/home/index' url: "/pages/home/index",
}) })
// loginFormRef.value?.validate(async (valid: boolean) => { }
// if (valid) {
// const { data: res } = await login(loginForm)
// if (res.code === 200) {
// globalStore.setToken(res.data.token)
// uni.reLaunch({
// url: '/pages/home/index'
// })
// }
// } else {
// console.log('验证失败');
// }
// });
};
onMounted(() => loginFormRef.value?.setRules(loginFormRules)) onMounted(() => loginFormRef.value?.setRules(loginFormRules))
</script> </script>
......
<template> <template>
<headers title='西部人力培训中心' backIconName='close' /> <headers title="西部人力培训中心" backIconName="close" />
<view style="box-sizing: border-box;"> <view style="box-sizing: border-box">
<view class="login-container"> <view class="login-container">
<text class="login-text">欢迎登陆</text> <text class="login-text">欢迎登陆</text>
<loginForm /> <loginForm />
</view> </view>
</view> </view>
<h4>{{ "用户code:" + code + "---" + Msg }}</h4>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import headers from '@/components/header/index.vue' import headers from "@/components/header/index.vue"
import loginForm from './components/loginForm.vue'; import loginForm from "./components/loginForm.vue"
import { getUrlCode } from "@/utils/util"
import { getUserInfo } from "@/api/login"
const Msg = ref()
const code = ref()
onLoad(async () => {
code.value = getUrlCode().code
const url =
"https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx459ae5e7c5918bf3&redirect_uri=https%3A%2F%2Fweixin3.lingqingkeji.com&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect"
if (code.value) {
const res = await getUserInfo(code.value)
Msg.value = JSON.stringify(res)
alert(JSON.stringify(res))
// if (res.code == 200) {
// alert(JSON.stringify(res.data))
// }
}
// else location.href = url
})
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
......
<template> <template>
<div class='position-container'> <div class="position-container">
<u-card :show-head="false" margin="0"> <u-card :show-head="false" margin="0">
<template #body> <template #body>
<view class="position-header"> <view class="position-header">
<h3>上课地点:{{ positionList.title }}</h3> <h3>{{ positionItem.courseName }}</h3>
</view> </view>
<view class="item"> <view class="item">
<text>上课地点:{{ positionList.address }}</text> <text>上课地点:{{ positionItem.classArea }}</text>
</view> </view>
<view class="item"> <view class="item">
<text>考勤定位:{{ positionList.isSetPosition ? '已设置' : '未设置' }}</text> <text
>考勤定位:{{
positionItem.isSetPosition ? "已设置" : "未设置"
}}</text
>
</view> </view>
<view class="item"> <view class="item">
<text>应用范围:{{ positionList.range }}</text> <text
>应用范围:{{
positionItem.range ? positionItem.range + "米" : "未设置"
}}</text
>
</view> </view>
</template> </template>
<template #foot> <template #foot>
<view class="position-footer"> <view class="position-footer">
<text>所属班级:{{ positionList.class }}</text> <text>所属班级:{{ positionItem.className }}</text>
<u-button type="primary" size="mini" @tap="openMap">{{ current ? '修改定位' : '设置定位' }}</u-button> <u-button type="primary" size="mini" @tap="openMap">{{
current ? "修改定位" : "设置定位"
}}</u-button>
</view> </view>
</template> </template>
</u-card> </u-card>
</div> </div>
</template> </template>
<script setup lang='ts'> <script setup lang="ts">
import { useMapStore } from "@/store/modules/mapStore"
const props = defineProps({ const props = defineProps({
positionList: { positionItem: {
type: Array, type: Array,
default: () => [] default: () => [],
} as any, } as any,
current: { current: {
type: Number, type: Number,
default: 0 default: 0,
} },
}) })
const mapStore = useMapStore()
const openMap = () => { const openMap = () => {
uni.navigateTo({ uni.navigateTo({
url: '/pages/setPositioning/map' url: "/pages/setPositioning/map",
success() {
mapStore.setMapData(props.positionItem)
}
}) })
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.position-container { .position-container {
margin-bottom: 20rpx;
.position-header { .position-header {
margin-bottom: 30rpx; margin-bottom: 30rpx;
} }
......
<template> <template>
<headers title='设置考勤定位' /> <headers title="设置考勤定位" />
<div class='set-position-container'> <div class="set-position-container">
<u-tabs :list="tabsState.list" :is-scroll="false" v-model="tabsState.current" bg-color="#f5f5f5" <u-tabs
@change="tabsChange" /> :list="tabsState.list"
:is-scroll="false"
v-model="tabsState.current"
bg-color="#f5f5f5"
@change="tabsChange"
/>
<!-- 内容 --> <!-- 内容 -->
<view v-if="positionList.length"> <view v-if="positionList.length">
<!-- 搜索 --> <!-- 搜索 -->
<uni-search-bar placeholder="课程名称/班级名称" bgColor="#ffffff" clearButton="auto" cancelButton="none" <uni-search-bar
@confirm="search" /> placeholder="课程名称/班级名称"
bgColor="#ffffff"
clearButton="auto"
cancelButton="none"
@confirm="search"
/>
<text style="margin-bottom: 20rpx; display: block;">为你找到10个的课程</text> <text style="margin-bottom: 20rpx; display: block"
>为你找到10个的课程</text
>
<block v-for="(item, index) in positionList" :key="index"> <block v-for="(item, index) in positionList" :key="index">
<setPositionItem :positionList="item" :current="tabsState.current" /> <setPositionItem :positionItem="item" :current="tabsState.current" />
</block> </block>
<view style="padding: 20rpx">
<u-loadmore :status="status" icon-type="flower" />
</view>
</view> </view>
<view v-else class="empty"> <view v-else class="empty">
<u-empty text="暂无数据" mode="list" /> <u-empty text="暂无数据" mode="list" />
...@@ -21,35 +36,73 @@ ...@@ -21,35 +36,73 @@
</div> </div>
</template> </template>
<script setup lang='ts'> <script setup lang="ts">
import headers from '@/components/header/index.vue' import headers from "@/components/header/index.vue"
import setPositionItem from './components/setPositionItem.vue'; import setPositionItem from "./components/setPositionItem.vue"
import { getLocationList } from "@/api/position"
import { useGlobalStore } from "@/store/useStore"
const globalStore = useGlobalStore()
const tabsState = reactive({ const tabsState = reactive({
list: [{ list: [
name: '未设置' {
}, { name: "未设置",
name: '已设置' },
} {
name: "已设置",
},
], ],
current: 0 current: 0,
}) })
const positionList: any = ref([{ const positionList: any = ref([] as any)
title: '第一节党性学习', const listQuery = reactive({
address: '深圳市南山区西丽街道办公室', // 上课地点 Phone: globalStore.Phone,
isSetPosition: false, // 考勤定位 pageIndex: 1,
range: '未设置', pageSize: 10,
class: '党支部培训班' total: 0,
}]) type: 0,
})
const status = ref("loadmore")
const tabsChange = (index: number) => { const tabsChange = (index: number) => {
positionList.value = []
if (index) {
listQuery.type = 1
} else {
listQuery.type = 0
}
init()
} }
const search = (val: string) => { const search = (val: string) => {
console.log('我的课程' + val); console.log("我的课程" + val)
} }
// 上拉加载数据
onReachBottom(() => {
// 判断是否还有下一页数据
if (listQuery.pageIndex * listQuery.pageSize >= listQuery.total)
return (status.value = "nomore")
// // 判断是否正在请求其它数据,如果是,则不发起额外的请求
if (status.value === "loading") return
listQuery.pageIndex += 1
init()
})
const init = async () => {
status.value = "loading"
const { data: res } = await getLocationList(listQuery)
if (res.code == 200) {
if (res.total > 10) status.value = "loadmore"
else status.value = "nomore"
positionList.value = [...positionList.value, ...res.data]
listQuery.total = res.total
console.log(positionList.value)
}
}
init()
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
...@@ -62,7 +115,6 @@ const search = (val: string) => { ...@@ -62,7 +115,6 @@ const search = (val: string) => {
.u-tag { .u-tag {
margin-right: 20rpx; margin-right: 20rpx;
} }
} }
} }
......
...@@ -8,7 +8,10 @@ ...@@ -8,7 +8,10 @@
<script setup lang="ts"> <script setup lang="ts">
import headers from "@/components/header/index.vue" import headers from "@/components/header/index.vue"
import { zalert, toast } from "@/utils/util" import { toast, zconfirm } from "@/utils/util"
import { useMapStore } from "@/store/modules/mapStore"
const mapStore = useMapStore()
const state = reactive({ const state = reactive({
key: "3M5BZ-SFCRJ-AHSF7-XRA5Q-Y6NIJ-DXBH4", key: "3M5BZ-SFCRJ-AHSF7-XRA5Q-Y6NIJ-DXBH4",
...@@ -35,22 +38,39 @@ window.addEventListener( ...@@ -35,22 +38,39 @@ window.addEventListener(
const submit = () => { const submit = () => {
if (!addrDetail.value) return toast("请选择地址") if (!addrDetail.value) return toast("请选择地址")
console.log("location", addrDetail.value) console.log("location", addrDetail.value)
zalert("确定设置为该地址?", () => { uni.navigateTo({
uni.navigateBack() url: "/pages/setPositioning/setAttendance",
success() {
const Longitude =
addrDetail.value.latlng.lat + "," + addrDetail.value.latlng.lng
mapStore.setMapData({
...mapStore.mapData,
...{ hitArea: addrDetail.value.poiaddress, Longitude },
})
},
}) })
// zconfirm("确定设置为该地址?", (result: boolean) => {
// if (result) {
// }
// })
} }
onMounted(() => { onMounted(() => {
if (mapStore.mapData.StateType) {
} else {
uni.getLocation({ uni.getLocation({
type: "gcj02", type: "gcj02",
success(res: any) { success(res: any) {
console.log(res)
state.coord = res.latitude + "," + res.longitude state.coord = res.latitude + "," + res.longitude
src.value = `https://apis.map.qq.com/tools/locpicker?search=1&type=1&key=${state.key}&referer=XBRLPX&coord=${state.coord}&zoom=18` src.value = `https://apis.map.qq.com/tools/locpicker?search=1&type=1&key=${state.key}&referer=XBRLPX&coord=${state.coord}&zoom=18`
// mapStore.setMapData({ ...mapStore.mapData, ...{ hitArea: "" } })
setTimeout(() => { setTimeout(() => {
flag.value = true flag.value = true
}, 100) }, 1000)
}, },
}) })
}
}) })
</script> </script>
......
<template>
<headers title="考勤地点设置" />
<view class="set-attendance-container">
<h3>考勤地点设置</h3>
<u-form :model="data.formData" ref="formRef" label-position="top">
<u-form-item label="考勤地址名称" prop="F_LQKJ_HITAREA"
><u-input v-model="data.formData.F_LQKJ_HITAREA" clearable
/></u-form-item>
<u-form-item label="有效范围" prop="F_LQKJ_SCOPE"
><u-input
type="select"
v-model="data.formData.F_LQKJ_SCOPE"
@tap="data.show = true"
/></u-form-item>
<u-form-item label="请设置定位的应用范围" prop="">
<u-radio-group v-model="data.formData.scope" shape="square">
<u-radio :name="0">仅当前课程考勤定位 </u-radio>
<u-radio :name="1">同步班级所有课程的考勤定位 </u-radio>
</u-radio-group>
</u-form-item>
</u-form>
<view class="footer">
<u-button @tap="back" size="medium">上一步</u-button>
<u-button type="success" size="medium" @tap="submit">确认</u-button>
</view>
</view>
<u-select
v-model="data.show"
:list="data.list"
@confirm="onConfirm"
></u-select>
</template>
<script setup lang="ts">
import headers from "@/components/header/index.vue"
import { setAddr } from "@/api/position"
import { toast } from "@/utils/util"
import { useMapStore } from "@/store/modules/mapStore"
const mapStore = useMapStore()
const formRef = ref()
const data = reactive({
formData: {
F_LQKJ_LONGITUDE: "",
F_LQKJ_SCOPE: "",
FCOURSEID: 0,
scope: 0,
F_LQKJ_HITAREA: "",
},
rules: {
F_LQKJ_HITAREA: [
{
required: true,
message: "请输入考勤地址名称",
trigger: ["change", "blur"],
},
],
F_LQKJ_SCOPE: [
{
required: true,
message: "请设置有效范围",
trigger: "blur",
},
],
},
show: false,
list: [
{
value: "100米",
label: "100米",
},
{
value: "200米",
label: "200米",
},
{
value: "300米",
label: "300米",
},
{
value: "400米",
label: "400米",
},
{
value: "500米",
label: "500米",
},
{
value: "600米",
label: "600米",
},
{
value: "700米",
label: "700米",
},
{
value: "800米",
label: "800米",
},
],
})
const back = () => {
uni.navigateBack()
}
const submit = () => {
formRef.value.validate(async (valid: any) => {
if (valid) {
console.log(data.formData)
const { data: res } = await setAddr(data.formData)
if (res.code == 200) {
uni.navigateBack({ delta: 2 })
toast("设置成功")
}
} else {
}
})
}
const onConfirm = (item: any) => {
data.formData.F_LQKJ_SCOPE = item[0].value
}
onReady(() => {
formRef.value.setRules(data.rules)
setTimeout(() => {
data.formData.F_LQKJ_HITAREA = mapStore.mapData.hitArea
data.formData.F_LQKJ_LONGITUDE = mapStore.mapData.Longitude
data.formData.F_LQKJ_SCOPE = mapStore.mapData.Scope
data.formData.FCOURSEID = mapStore.mapData.courseId
console.log(mapStore.mapData)
}, 100)
})
</script>
<style lang="scss" scoped>
body {
background-color: #fff;
}
.set-attendance-container {
padding: 30rpx;
background-color: #fff;
.footer {
position: fixed;
bottom: 10%;
left: 0;
width: 100%;
display: flex;
.u-btn {
width: 30%;
}
}
}
</style>
...@@ -19,8 +19,12 @@ ...@@ -19,8 +19,12 @@
margin-top: 4rpx; margin-top: 4rpx;
color: #303133; color: #303133;
padding: 0 10rpx; padding: 0 10rpx;
white-space: 'nowrap'; white-space: "nowrap";
text-overflow: 'ellipsis'; text-overflow: "ellipsis";
overflow: 'hidden'; overflow: "hidden";
} }
} }
.empty {
margin-top: 40rpx;
}
@font-face {
font-family: "custom-icon";
/* Project id 3607036 */
src: url('https://at.alicdn.com/t/c/font_3607036_y4hl42aa2g.woff2?t=1686627317404') format('woff2'),
url('https://at.alicdn.com/t/c/font_3607036_y4hl42aa2g.woff?t=1686627317404') format('woff'),
url('https://at.alicdn.com/t/c/font_3607036_y4hl42aa2g.ttf?t=1686627317404') format('truetype');
}
.custom-icon {
font-family: "custom-icon" !important;
font-size: 16px;
font-style: normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.custom-icon-lanya1:before {
content: "\e65f";
}
.custom-icon-lanya:before {
content: "\ec4a";
}
.custom-icon-fujian:before {
content: "\e601";
}
.custom-icon-shangchuandaochu:before {
content: "\e8c6";
}
.custom-icon-shouyefill:before {
content: "\e750";
}
.custom-icon-sandiantu:before {
content: "\e679";
}
.custom-icon-tubiao-zhexiantu:before {
content: "\eb96";
}
.custom-icon-shezhixitongshezhigongnengshezhishuxing:before {
content: "\e795";
}
.custom-icon-caidan1:before {
content: "\e653";
}
.custom-icon-bingtu:before {
content: "\e6bb";
}
.custom-icon-shujudaping:before {
content: "\e742";
}
.custom-icon-zhuzhuangtu:before {
content: "\e650";
}
.custom-icon-list2:before {
content: "\e655";
}
.custom-icon-caidan:before {
content: "\e652";
}
.custom-icon-erweima:before {
content: "\e6bd";
}
.custom-icon-shuxingguanli:before {
content: "\e625";
}
.custom-icon-line-barcodeboxtiaoxingma-02:before {
content: "\e717";
}
.custom-icon-Icon_kebianjibiaoge:before {
content: "\e60b";
}
.custom-icon-sousuo:before {
content: "\e600";
}
.custom-icon-dingdan:before {
content: "\e737";
}
.custom-icon-wodeyushe:before {
content: "\e633";
}
.custom-icon-dingdan-copy:before {
content: "\e738";
}
.custom-icon-sousuo-copy:before {
content: "\e739";
}
.custom-icon-wodeyushe-copy:before {
content: "\e73a";
}
\ No newline at end of file
差异被折叠。
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论