@@ -6,13 +6,13 @@ | |||
async onLaunch(param) { | |||
// 在App.vue文件中获取到页面到URL (微信调取扫一扫会用到) | |||
window.localStorage.setItem('scanUrl',location.href.split('#')[0]) | |||
window.localStorage.setItem('scanUrl', location.href.split('#')[0]) | |||
//应用的生命周期 应用启动后触发 | |||
// #ifdef H5 || APP-VUE | |||
// H5 刷新时获取当前页面路径 | |||
const pagePath = "/" + param.path; | |||
// 如果 H5 刷新后访问的不是首页/登录页/注册页,直接跳转回首页 | |||
if (!["/pages/login", "/pages/home","/pages/weixinLogin", "/pages/signup"].includes(pagePath)) { | |||
if (!["/pages/login", "/pages/home", "/pages/weixinLogin", "/pages/signup"].includes(pagePath)) { | |||
this.$nextTick(() => { | |||
this.TAB_TO("/pages/home"); | |||
return; | |||
@@ -46,13 +46,18 @@ | |||
}; | |||
</script> | |||
<style lang="less"> | |||
<style lang="scss"> | |||
// 现在 CSS 必须在 <style> 中引入,参考:https://ask.dcloud.net.cn/question/86907 | |||
// 后续 uni-app 升级后可能会支持直接 import 样式,到时候可以省略下行代码 | |||
@import "~@/components/learun-mpui/styles/index.css"; | |||
@import "@/uni_modules/uview-ui/index.scss"; | |||
page { | |||
background-color: #f3f3f3; | |||
background-color: #fff; | |||
} | |||
.input_event_none input { | |||
pointer-events: none !important; | |||
} | |||
.btn { | |||
@@ -64,4 +69,4 @@ | |||
border-radius: 4px; | |||
margin: 30px auto; | |||
} | |||
</style> | |||
</style> |
@@ -1,136 +1,137 @@ | |||
<template> | |||
<view class="tab"> | |||
<view v-for="(item,index) in list" :key="index" class="tab-item" @click="switchTab(item, index)"> | |||
<img class="tab_img" :src="selectedPath == item.pagePath ? item.selectedIconPath : item.iconPath"></img> | |||
<view class="tab_text" :style="{color: selectedPath == item.pagePath ? selectedColor : color}">{{item.text}}</view> | |||
</view> | |||
</view> | |||
<view class="tab"> | |||
<view v-for="(item,index) in list" :key="index" class="tab-item" @click="switchTab(item, index)"> | |||
<img class="tab_img" :src="selectedPath == item.pagePath ? item.selectedIconPath : item.iconPath"></img> | |||
<view class="tab_text" :style="{color: selectedPath == item.pagePath ? selectedColor : color}">{{item.text}} | |||
</view> | |||
</view> | |||
</view> | |||
</template> | |||
<script> | |||
export default { | |||
name:'tabBar', | |||
props: { | |||
selectedPath: { // 当前选中的tab index | |||
default: '/pages/home' | |||
}, | |||
}, | |||
data() { | |||
return { | |||
color: "#8c8c8c", | |||
selectedColor: "#3398DC", | |||
list: [], | |||
// currentIndex:0, | |||
} | |||
}, | |||
export default { | |||
name: 'tabBar', | |||
props: { | |||
selectedPath: { // 当前选中的tab index | |||
default: '/pages/home' | |||
}, | |||
}, | |||
data() { | |||
return { | |||
color: "#8c8c8c", | |||
selectedColor: "#3398DC", | |||
list: [], | |||
// currentIndex:0, | |||
} | |||
}, | |||
watch: { | |||
"$store.state.loginUser":{ | |||
handler:function(newVal,oldVal){ | |||
this.setList(newVal.Description) | |||
} | |||
} | |||
"$store.state.loginUser": { | |||
handler: function(newVal, oldVal) { | |||
this.setList(newVal.Description) | |||
} | |||
} | |||
}, | |||
created() { | |||
created() { | |||
// let index = this.list.findIndex(e=>e.pagePath==this.selectedPath) | |||
// this.currentIndex = index; | |||
let userInfo = this.GET_GLOBAL("loginUser"); | |||
if(!userInfo)return | |||
if (!userInfo) return | |||
this.setList(userInfo.Description) | |||
}, | |||
methods: { | |||
setList(role){ | |||
if (role=="学生") { | |||
this.list = [ | |||
}, | |||
methods: { | |||
setList(role) { | |||
if (role == "学生") { | |||
this.list = [{ | |||
"index": 0, | |||
"pagePath": "/pages/home", | |||
"iconPath": "static/img-bar/tab-home.png", | |||
"selectedIconPath": "static/img-bar/tab-home-active.png", | |||
"text": "首页" | |||
}, | |||
{ | |||
"index":0, | |||
"index": 3, | |||
"pagePath": "/pages/my", | |||
"iconPath": "static/img-bar/tab-my.png", | |||
"selectedIconPath": "static/img-bar/tab-my-active.png", | |||
"text": "我的" | |||
} | |||
] | |||
} else { | |||
this.list = [{ | |||
"index": 0, | |||
"pagePath": "/pages/home", | |||
"iconPath": "static/img-bar/tab-home.png", | |||
"selectedIconPath": "static/img-bar/tab-home-active.png", | |||
"text": "首页" | |||
}, | |||
// { | |||
// "index":1, | |||
// "pagePath": "/pages/msg", | |||
// "iconPath": "static/img-bar/tab-msg.png", | |||
// "selectedIconPath": "static/img-bar/tab-msg-active.png", | |||
// "text": "消息" | |||
// }, | |||
// { | |||
// "index":2, | |||
// "pagePath": "/pages/contact", | |||
// "iconPath": "static/img-bar/tab-contact.png", | |||
// "selectedIconPath": "static/img-bar/tab-contact-active.png", | |||
// "text": "通讯录" | |||
// }, | |||
{ | |||
"index":3, | |||
"index": 3, | |||
"pagePath": "/pages/my", | |||
"iconPath": "static/img-bar/tab-my.png", | |||
"selectedIconPath": "static/img-bar/tab-my-active.png", | |||
"text": "我的" | |||
} | |||
] | |||
}else{ | |||
this.list = [ | |||
{ | |||
"index":0, | |||
"pagePath": "/pages/home", | |||
"iconPath": "static/img-bar/tab-home.png", | |||
"selectedIconPath": "static/img-bar/tab-home-active.png", | |||
"text": "首页" | |||
}, | |||
// { | |||
// "index":1, | |||
// "pagePath": "/pages/msg", | |||
// "iconPath": "static/img-bar/tab-msg.png", | |||
// "selectedIconPath": "static/img-bar/tab-msg-active.png", | |||
// "text": "消息" | |||
// }, | |||
{ | |||
"index":2, | |||
"pagePath": "/pages/contact", | |||
"iconPath": "static/img-bar/tab-contact.png", | |||
"selectedIconPath": "static/img-bar/tab-contact-active.png", | |||
"text": "通讯录" | |||
}, | |||
{ | |||
"index":3, | |||
"pagePath": "/pages/my", | |||
"iconPath": "static/img-bar/tab-my.png", | |||
"selectedIconPath": "static/img-bar/tab-my-active.png", | |||
"text": "我的" | |||
} | |||
] | |||
] | |||
} | |||
}, | |||
switchTab(item, index) { | |||
// this.currentIndex = item.index; | |||
let url = item.pagePath; | |||
switchTab(item, index) { | |||
// this.currentIndex = item.index; | |||
let url = item.pagePath; | |||
uni.switchTab({ | |||
url: url | |||
}); | |||
} | |||
} | |||
} | |||
} | |||
} | |||
} | |||
</script> | |||
<style lang="scss"> | |||
.tab { | |||
.tab { | |||
background: rgb(245, 245, 245); | |||
position: fixed; | |||
bottom: 0; | |||
left: 0; | |||
right: 0; | |||
height: 100rpx; | |||
display: flex; | |||
justify-content: center; | |||
align-items: center; | |||
padding-bottom: env(safe-area-inset-bottom); // 适配iphoneX的底部 | |||
position: fixed; | |||
bottom: 0; | |||
left: 0; | |||
right: 0; | |||
height: 100rpx; | |||
display: flex; | |||
justify-content: center; | |||
align-items: center; | |||
padding-bottom: env(safe-area-inset-bottom); // 适配iphoneX的底部 | |||
border-top: 2rpx solid #CDCDCD; | |||
z-index:999; | |||
.tab-item { | |||
flex: 1; | |||
text-align: center; | |||
display: flex; | |||
justify-content: center; | |||
align-items: center; | |||
flex-direction: column; | |||
.tab_img { | |||
width: 48rpx; | |||
height: 48rpx; | |||
} | |||
.tab_text { | |||
font-size: 20rpx; | |||
margin-top: 6rpx; | |||
} | |||
} | |||
} | |||
z-index: 999; | |||
.tab-item { | |||
flex: 1; | |||
text-align: center; | |||
display: flex; | |||
justify-content: center; | |||
align-items: center; | |||
flex-direction: column; | |||
.tab_img { | |||
width: 48rpx; | |||
height: 48rpx; | |||
} | |||
.tab_text { | |||
font-size: 20rpx; | |||
margin-top: 6rpx; | |||
} | |||
} | |||
} | |||
</style> |
@@ -1,79 +1,81 @@ | |||
export default { | |||
// 登录页显示的公司名称 | |||
"company": "数字化智慧校园", | |||
// App 版本号 | |||
"appVersion": "2.0", | |||
// 是否允许用户注册 | |||
"enableSignUp": true, | |||
//请求数据的接口地址;可以配置多个,开发环境下登录页会出现选择菜单供您选择 | |||
// "apiHost": [ | |||
// "http://123.57.209.16:31173/" | |||
// ], | |||
// "apiHost": [ | |||
// "http://123.57.209.16:31174/learun/adms" | |||
// "https://wx.qjkjedu.com/learun/adms" | |||
// ], | |||
// "apiHost": [ | |||
// "http://localhost:8088/" | |||
// "http://192.168.2.202:8083/learun/adms" | |||
// ], | |||
// "apiHost": [ | |||
// "http://192.168.2.98:8088/" | |||
// ], | |||
"apiHost": [ | |||
// "http://cyzjzx.gnway.cc:31218/"//测试地址接口 | |||
"http://223.75.120.212:8002/"//正式地址接口 | |||
// "http://192.168.10.58:8012/" | |||
], | |||
// "webHost":"http://cyzjzx.gnway.cc:30549/",//测试地址 | |||
"webHost":"http://wxd3f.cyzjzx.com/",//正式地址 | |||
// "webHost":"http://192.168.10.175:8087/", | |||
// 开发环境下自动填充登录账号密码,与接口地址一一对应,只在开发环境下显示 | |||
"devAccount": [ | |||
{ username: "", password: "" } | |||
], | |||
//是否分布式部署 指WebApi与Web不在一台服务器 | |||
"isDistributed":true, | |||
// 开发环境使用的接口地址(数组索引) | |||
"devApiHostIndex": 0, | |||
// 生产环境使用的接口地址(数组索引) | |||
"prodApiHostIndex": 0, | |||
// 额外添加的全局变量,必须在此处注册才能使用 | |||
"globalVariables": [], | |||
// 登录页显示的公司名称 | |||
"company": "数字化智慧校园", | |||
// App 版本号 | |||
"appVersion": "2.0", | |||
// 是否允许用户注册 | |||
"enableSignUp": true, | |||
//请求数据的接口地址;可以配置多个,开发环境下登录页会出现选择菜单供您选择 | |||
// "apiHost": [ | |||
// "http://123.57.209.16:31173/" | |||
// ], | |||
// "apiHost": [ | |||
// "http://123.57.209.16:31174/learun/adms" | |||
// "https://wx.qjkjedu.com/learun/adms" | |||
// ], | |||
// "apiHost": [ | |||
// "http://localhost:8088/" | |||
// "http://192.168.2.202:8083/learun/adms" | |||
// ], | |||
// "apiHost": [ | |||
// "http://192.168.2.98:8088/" | |||
// ], | |||
"apiHost": [ | |||
// "http://cyzjzx.gnway.cc:31218/"//测试地址接口 | |||
// "http://223.75.120.212:8002/"//正式地址接口 | |||
// "http://192.168.10.58:8012/" | |||
"http://192.168.10.23:8088/" | |||
], | |||
// "webHost":"http://cyzjzx.gnway.cc:30549/",//测试地址 | |||
"webHost": "http://wxd3f.cyzjzx.com/", //正式地址 | |||
// "webHost":"http://192.168.10.175:8087/", | |||
// 开发环境下自动填充登录账号密码,与接口地址一一对应,只在开发环境下显示 | |||
"devAccount": [{ | |||
username: "", | |||
password: "" | |||
}], | |||
//是否分布式部署 指WebApi与Web不在一台服务器 | |||
"isDistributed": true, | |||
// 开发环境使用的接口地址(数组索引) | |||
"devApiHostIndex": 0, | |||
// 生产环境使用的接口地址(数组索引) | |||
"prodApiHostIndex": 0, | |||
// 额外添加的全局变量,必须在此处注册才能使用 | |||
"globalVariables": [], | |||
// 小程序绑定登录等配置(login=登录,bind=绑定,unbind=解绑) | |||
"miniProgramAccount": { | |||
// 微信小程序 | |||
"weixin": [], | |||
// 支付宝小程序 | |||
"alipay": [], | |||
// 钉钉小程序 | |||
"dingtalk": [] | |||
}, | |||
// 小程序绑定登录等配置(login=登录,bind=绑定,unbind=解绑) | |||
"miniProgramAccount": { | |||
// 微信小程序 | |||
"weixin": [], | |||
// 支付宝小程序 | |||
"alipay": [], | |||
// 钉钉小程序 | |||
"dingtalk": [] | |||
}, | |||
// 页面相关配置 | |||
"pageConfig": { | |||
// 全局设置是否使用圆形头像 | |||
"roundAvatar": false, | |||
// 页面相关配置 | |||
"pageConfig": { | |||
// 全局设置是否使用圆形头像 | |||
"roundAvatar": false, | |||
// 「消息」页 | |||
"msg": { | |||
// 周期轮询消息的时间间隔,单位是毫秒 | |||
"fetchMsg": 3000 | |||
}, | |||
// 「消息」页 | |||
"msg": { | |||
// 周期轮询消息的时间间隔,单位是毫秒 | |||
"fetchMsg": 3000 | |||
}, | |||
// 「通讯录」页 | |||
"contact": { | |||
// 是否显示(分)公司、部门、职员标签 | |||
"tag": true, | |||
// 是否在职员这一级也显示标签 | |||
"staffTag": false | |||
}, | |||
// 「通讯录」页 | |||
"contact": { | |||
// 是否显示(分)公司、部门、职员标签 | |||
"tag": true, | |||
// 是否在职员这一级也显示标签 | |||
"staffTag": false | |||
}, | |||
// 「聊天消息」页 | |||
"chat": { | |||
// 周期轮询消息的时间间隔,单位是毫秒 | |||
"fetchMsg": 3000 | |||
} | |||
} | |||
} | |||
// 「聊天消息」页 | |||
"chat": { | |||
// 周期轮询消息的时间间隔,单位是毫秒 | |||
"fetchMsg": 3000 | |||
} | |||
} | |||
} |
@@ -1,27 +1,33 @@ | |||
<!DOCTYPE html> | |||
<html lang="zh-CN"> | |||
<head> | |||
<!-- 本页面是力软框架在 H5 和 App 端的模板 index.html (仅限 H5 和 App 端,小程序不使用本页) --> | |||
<!-- 本页面已有的代码请勿修改,否则会引起 H5 端显示异常 --> | |||
<meta charset="utf-8"> | |||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> | |||
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> | |||
<link rel="shortcut icon" type="image" href="<%= BASE_URL %>static/logo.png"> | |||
<title> | |||
<%= htmlWebpackPlugin.options.title %> | |||
</title> | |||
<script> | |||
document.addEventListener('DOMContentLoaded', function() { | |||
document.documentElement.style.fontSize = document.documentElement.clientWidth / 20 + 'px' | |||
}) | |||
</script> | |||
<link rel="stylesheet" href="<%= BASE_URL %>static/index.<%= VUE_APP_INDEX_CSS_HASH %>.css" /> | |||
</head> | |||
<body> | |||
<noscript> | |||
<strong>您当前使用的浏览器已关闭或不支持 Javascript 功能,因此力软框架无法正常初始化,请检查设置或重新安装浏览器。</strong> | |||
</noscript> | |||
<div id="app"></div> | |||
</body> | |||
</html> | |||
<head> | |||
<!-- 本页面是力软框架在 H5 和 App 端的模板 index.html (仅限 H5 和 App 端,小程序不使用本页) --> | |||
<!-- 本页面已有的代码请勿修改,否则会引起 H5 端显示异常 --> | |||
<meta charset="utf-8"> | |||
<meta name="referrer" content="no-referrer" /> | |||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> | |||
<meta name="viewport" | |||
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> | |||
<link rel="shortcut icon" type="image" href="<%= BASE_URL %>static/logo.png"> | |||
<!-- <script type="text/javascript" | |||
src="https://api.map.baidu.com/api?v=1.0&&type=webgl&ak=kH6ApL7W4BQxwzfkfG34m1c2iC1jsDia"> | |||
</script> --> | |||
<title> | |||
<%= htmlWebpackPlugin.options.title %> | |||
</title> | |||
<script> | |||
document.addEventListener('DOMContentLoaded', function() { | |||
document.documentElement.style.fontSize = document.documentElement.clientWidth / 20 + 'px'; | |||
}) | |||
</script> | |||
<link rel="stylesheet" href="<%= BASE_URL %>static/index.<%= VUE_APP_INDEX_CSS_HASH %>.css" /> | |||
</head> | |||
<body> | |||
<noscript> | |||
<strong>您当前使用的浏览器已关闭或不支持 Javascript 功能,因此力软框架无法正常初始化,请检查设置或重新安装浏览器。</strong> | |||
</noscript> | |||
<div id="app"></div> | |||
</body> | |||
</html> |
@@ -5,14 +5,20 @@ import store from '@/common/store.js' | |||
import mixins from '@/common/mixins.js' | |||
import '@/components/learun-mpui' | |||
import tabBar from "@/components/tabbar/tabbar.vue" | |||
Vue.component('tabBar',tabBar) | |||
Vue.component('tabBar', tabBar) | |||
// import '@/common/css/common.less'; | |||
moment.locale('zh-cn') | |||
// 引入全局uView | |||
import uView from '@/uni_modules/uview-ui' | |||
Vue.use(uView) | |||
Vue.mixin(mixins) | |||
Vue.config.productionTip = process.env.NODE_ENV === 'development' | |||
Vue.prototype.$store = store | |||
new Vue({ ...App, mpType: 'app', store }).$mount() | |||
new Vue({ | |||
...App, | |||
mpType: 'app', | |||
store | |||
}).$mount() |
@@ -1,192 +1,196 @@ | |||
{ | |||
"name" : "智慧校园", | |||
"appid" : "__UNI__7C24C09", | |||
"description" : "智慧校园移动端", | |||
"versionName" : "2.2.0", | |||
"versionCode" : 20200, | |||
"transformPx" : false, | |||
/* 5+App特有相关 */ | |||
"app-plus" : { | |||
"usingComponents" : true, | |||
"softinputNavBar" : "none", | |||
"splashscreen" : { | |||
"alwaysShowBeforeRender" : true, | |||
"waiting" : false, | |||
"autoclose" : true, | |||
"delay" : 0 | |||
}, | |||
/* 模块配置 */ | |||
"modules" : {}, | |||
/* 应用发布信息 */ | |||
"distribute" : { | |||
/* android打包配置 */ | |||
"android" : { | |||
"permissions" : [ | |||
"<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>", | |||
"<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>", | |||
"<uses-permission android:name=\"android.permission.READ_CONTACTS\"/>", | |||
"<uses-permission android:name=\"android.permission.VIBRATE\"/>", | |||
"<uses-permission android:name=\"android.permission.READ_LOGS\"/>", | |||
"<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>", | |||
"<uses-feature android:name=\"android.hardware.camera.autofocus\"/>", | |||
"<uses-permission android:name=\"android.permission.WRITE_CONTACTS\"/>", | |||
"<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>", | |||
"<uses-permission android:name=\"android.permission.CAMERA\"/>", | |||
"<uses-permission android:name=\"android.permission.RECORD_AUDIO\"/>", | |||
"<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>", | |||
"<uses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\"/>", | |||
"<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>", | |||
"<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>", | |||
"<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>", | |||
"<uses-permission android:name=\"android.permission.CALL_PHONE\"/>", | |||
"<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>", | |||
"<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\"/>", | |||
"<uses-feature android:name=\"android.hardware.camera\"/>", | |||
"<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\"/>", | |||
"<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>" | |||
] | |||
}, | |||
/* ios打包配置 */ | |||
"ios" : { | |||
"privacyDescription" : { | |||
"NSPhotoLibraryUsageDescription" : "工作流程中需要相册权限以选择并上传图片", | |||
"NSPhotoLibraryAddUsageDescription" : "将图片保存到本机", | |||
"NSCameraUsageDescription" : "工作流程中需要相机权限以选择并上传图片" | |||
}, | |||
"idfa" : false | |||
}, | |||
/* SDK配置 */ | |||
"sdkConfigs" : { | |||
"ad" : {} | |||
}, | |||
"icons" : { | |||
"android" : { | |||
"hdpi" : "unpackage/res/icons/72x72.png", | |||
"xhdpi" : "unpackage/res/icons/96x96.png", | |||
"xxhdpi" : "unpackage/res/icons/144x144.png", | |||
"xxxhdpi" : "unpackage/res/icons/192x192.png" | |||
}, | |||
"ios" : { | |||
"appstore" : "unpackage/res/icons/1024x1024.png", | |||
"ipad" : { | |||
"app" : "unpackage/res/icons/76x76.png", | |||
"app@2x" : "unpackage/res/icons/152x152.png", | |||
"notification" : "unpackage/res/icons/20x20.png", | |||
"notification@2x" : "unpackage/res/icons/40x40.png", | |||
"proapp@2x" : "unpackage/res/icons/167x167.png", | |||
"settings" : "unpackage/res/icons/29x29.png", | |||
"settings@2x" : "unpackage/res/icons/58x58.png", | |||
"spotlight" : "unpackage/res/icons/40x40.png", | |||
"spotlight@2x" : "unpackage/res/icons/80x80.png" | |||
}, | |||
"iphone" : { | |||
"app@2x" : "unpackage/res/icons/120x120.png", | |||
"app@3x" : "unpackage/res/icons/180x180.png", | |||
"notification@2x" : "unpackage/res/icons/40x40.png", | |||
"notification@3x" : "unpackage/res/icons/60x60.png", | |||
"settings@2x" : "unpackage/res/icons/58x58.png", | |||
"settings@3x" : "unpackage/res/icons/87x87.png", | |||
"spotlight@2x" : "unpackage/res/icons/80x80.png", | |||
"spotlight@3x" : "unpackage/res/icons/120x120.png" | |||
} | |||
} | |||
}, | |||
"splashscreen" : { | |||
"android" : { | |||
"xxhdpi" : "G:/薛礼根/2018/数字化校园/数字化校园png/北京泉江/数字化校园APP----引导页1080_1882.png", | |||
"xhdpi" : "G:/薛礼根/2018/数字化校园/数字化校园png/北京泉江/数字化校园APP----引导页720_1242.png", | |||
"hdpi" : "G:/薛礼根/2018/数字化校园/数字化校园png/北京泉江/数字化校园APP----引导页480_762.png" | |||
}, | |||
"ios" : { | |||
"iphone" : { | |||
"portrait-896h@3x" : "res/startup/startup-ios-x.png", | |||
"portrait-896h@2x" : "res/startup/startup-ios-x.png", | |||
"iphonex" : "res/startup/startup-ios-x.png", | |||
"retina55" : "res/startup/startup-ios-16-9.png", | |||
"retina47" : "res/startup/startup-ios-16-9.png", | |||
"retina40" : "res/startup/startup-ios-3-2.png", | |||
"retina35" : "res/startup/startup-ios-3-2.png" | |||
} | |||
} | |||
} | |||
}, | |||
"uniStatistics" : { | |||
"enable" : false | |||
}, | |||
"nvueLaunchMode" : "fast" | |||
}, | |||
/* 快应用特有相关 */ | |||
"quickapp" : {}, | |||
/* 小程序特有相关 */ | |||
"mp-weixin" : { | |||
"appid" : "wxbc18c9bf92c86d28", | |||
"setting" : { | |||
"urlCheck" : false, | |||
"es6" : true, | |||
"postcss" : false, | |||
"minified" : true | |||
}, | |||
"usingComponents" : true, | |||
"optimization" : { | |||
"subPackages" : true | |||
}, | |||
"uniStatistics" : { | |||
"enable" : false | |||
} | |||
}, | |||
"mp-alipay" : { | |||
"usingComponents" : true, | |||
"component2" : true, | |||
"enableParallelLoader" : true, | |||
"uniStatistics" : { | |||
"enable" : false | |||
}, | |||
"appid" : "" | |||
}, | |||
"mp-dingtalk" : { | |||
"usingComponents" : true, | |||
"component2" : true, | |||
"enableParallelLoader" : true, | |||
"uniStatistics" : { | |||
"enable" : false | |||
}, | |||
"appid" : "" | |||
}, | |||
"mp-baidu" : { | |||
"usingComponents" : true, | |||
"uniStatistics" : { | |||
"enable" : false | |||
} | |||
}, | |||
"mp-toutiao" : { | |||
"usingComponents" : true, | |||
"uniStatistics" : { | |||
"enable" : false | |||
} | |||
}, | |||
"h5" : { | |||
"uniStatistics" : { | |||
"enable" : false | |||
}, | |||
"router" : { | |||
"mode" : "hash", | |||
"base" : "" | |||
}, | |||
"title" : "数字化智慧校园", | |||
"template" : "index.html", | |||
"optimization" : { | |||
"treeShaking" : { | |||
"enable" : false | |||
} | |||
}, | |||
"domain" : "testapp.bjquanjiang.com" | |||
}, | |||
"mp-qq" : { | |||
"uniStatistics" : { | |||
"enable" : false | |||
} | |||
}, | |||
"uniStatistics" : { | |||
"enable" : false | |||
} | |||
} | |||
"name": "智慧校园", | |||
"appid": "__UNI__7C24C09", | |||
"description": "智慧校园移动端", | |||
"versionName": "2.2.0", | |||
"versionCode": 20200, | |||
"transformPx": false, | |||
/* 5+App特有相关 */ | |||
"app-plus": { | |||
"usingComponents": true, | |||
"softinputNavBar": "none", | |||
"splashscreen": { | |||
"alwaysShowBeforeRender": true, | |||
"waiting": false, | |||
"autoclose": true, | |||
"delay": 0 | |||
}, | |||
/* 模块配置 */ | |||
"modules": {}, | |||
/* 应用发布信息 */ | |||
"distribute": { | |||
/* android打包配置 */ | |||
"android": { | |||
"permissions": [ | |||
"<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>", | |||
"<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>", | |||
"<uses-permission android:name=\"android.permission.READ_CONTACTS\"/>", | |||
"<uses-permission android:name=\"android.permission.VIBRATE\"/>", | |||
"<uses-permission android:name=\"android.permission.READ_LOGS\"/>", | |||
"<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>", | |||
"<uses-feature android:name=\"android.hardware.camera.autofocus\"/>", | |||
"<uses-permission android:name=\"android.permission.WRITE_CONTACTS\"/>", | |||
"<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>", | |||
"<uses-permission android:name=\"android.permission.CAMERA\"/>", | |||
"<uses-permission android:name=\"android.permission.RECORD_AUDIO\"/>", | |||
"<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>", | |||
"<uses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\"/>", | |||
"<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>", | |||
"<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>", | |||
"<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>", | |||
"<uses-permission android:name=\"android.permission.CALL_PHONE\"/>", | |||
"<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>", | |||
"<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\"/>", | |||
"<uses-feature android:name=\"android.hardware.camera\"/>", | |||
"<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\"/>", | |||
"<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>" | |||
] | |||
}, | |||
/* ios打包配置 */ | |||
"ios": { | |||
"privacyDescription": { | |||
"NSPhotoLibraryUsageDescription": "工作流程中需要相册权限以选择并上传图片", | |||
"NSPhotoLibraryAddUsageDescription": "将图片保存到本机", | |||
"NSCameraUsageDescription": "工作流程中需要相机权限以选择并上传图片" | |||
}, | |||
"idfa": false | |||
}, | |||
/* SDK配置 */ | |||
"sdkConfigs": { | |||
"ad": {} | |||
}, | |||
"icons": { | |||
"android": { | |||
"hdpi": "unpackage/res/icons/72x72.png", | |||
"xhdpi": "unpackage/res/icons/96x96.png", | |||
"xxhdpi": "unpackage/res/icons/144x144.png", | |||
"xxxhdpi": "unpackage/res/icons/192x192.png" | |||
}, | |||
"ios": { | |||
"appstore": "unpackage/res/icons/1024x1024.png", | |||
"ipad": { | |||
"app": "unpackage/res/icons/76x76.png", | |||
"app@2x": "unpackage/res/icons/152x152.png", | |||
"notification": "unpackage/res/icons/20x20.png", | |||
"notification@2x": "unpackage/res/icons/40x40.png", | |||
"proapp@2x": "unpackage/res/icons/167x167.png", | |||
"settings": "unpackage/res/icons/29x29.png", | |||
"settings@2x": "unpackage/res/icons/58x58.png", | |||
"spotlight": "unpackage/res/icons/40x40.png", | |||
"spotlight@2x": "unpackage/res/icons/80x80.png" | |||
}, | |||
"iphone": { | |||
"app@2x": "unpackage/res/icons/120x120.png", | |||
"app@3x": "unpackage/res/icons/180x180.png", | |||
"notification@2x": "unpackage/res/icons/40x40.png", | |||
"notification@3x": "unpackage/res/icons/60x60.png", | |||
"settings@2x": "unpackage/res/icons/58x58.png", | |||
"settings@3x": "unpackage/res/icons/87x87.png", | |||
"spotlight@2x": "unpackage/res/icons/80x80.png", | |||
"spotlight@3x": "unpackage/res/icons/120x120.png" | |||
} | |||
} | |||
}, | |||
"splashscreen": { | |||
"android": { | |||
"xxhdpi": "G:/薛礼根/2018/数字化校园/数字化校园png/北京泉江/数字化校园APP----引导页1080_1882.png", | |||
"xhdpi": "G:/薛礼根/2018/数字化校园/数字化校园png/北京泉江/数字化校园APP----引导页720_1242.png", | |||
"hdpi": "G:/薛礼根/2018/数字化校园/数字化校园png/北京泉江/数字化校园APP----引导页480_762.png" | |||
}, | |||
"ios": { | |||
"iphone": { | |||
"portrait-896h@3x": "res/startup/startup-ios-x.png", | |||
"portrait-896h@2x": "res/startup/startup-ios-x.png", | |||
"iphonex": "res/startup/startup-ios-x.png", | |||
"retina55": "res/startup/startup-ios-16-9.png", | |||
"retina47": "res/startup/startup-ios-16-9.png", | |||
"retina40": "res/startup/startup-ios-3-2.png", | |||
"retina35": "res/startup/startup-ios-3-2.png" | |||
} | |||
} | |||
} | |||
}, | |||
"uniStatistics": { | |||
"enable": false | |||
}, | |||
"nvueLaunchMode": "fast" | |||
}, | |||
/* 快应用特有相关 */ | |||
"quickapp": {}, | |||
/* 小程序特有相关 */ | |||
"mp-weixin": { | |||
"appid": "wxbc18c9bf92c86d28", | |||
"setting": { | |||
"urlCheck": false, | |||
"es6": true, | |||
"postcss": false, | |||
"minified": true | |||
}, | |||
"usingComponents": true, | |||
"optimization": { | |||
"subPackages": true | |||
}, | |||
"uniStatistics": { | |||
"enable": false | |||
} | |||
}, | |||
"mp-alipay": { | |||
"usingComponents": true, | |||
"component2": true, | |||
"enableParallelLoader": true, | |||
"uniStatistics": { | |||
"enable": false | |||
}, | |||
"appid": "" | |||
}, | |||
"mp-dingtalk": { | |||
"usingComponents": true, | |||
"component2": true, | |||
"enableParallelLoader": true, | |||
"uniStatistics": { | |||
"enable": false | |||
}, | |||
"appid": "" | |||
}, | |||
"mp-baidu": { | |||
"usingComponents": true, | |||
"uniStatistics": { | |||
"enable": false | |||
} | |||
}, | |||
"mp-toutiao": { | |||
"usingComponents": true, | |||
"uniStatistics": { | |||
"enable": false | |||
} | |||
}, | |||
"h5": { | |||
"uniStatistics": { | |||
"enable": false | |||
}, | |||
"router": { | |||
"mode": "hash", | |||
"base": "" | |||
}, | |||
"title": "数字化智慧校园", | |||
"template": "index.html", | |||
"optimization": { | |||
"treeShaking": { | |||
"enable": false | |||
} | |||
}, | |||
"domain": "testapp.bjquanjiang.com", | |||
"devServer": { | |||
"port": 8000, | |||
"https": false | |||
} | |||
}, | |||
"mp-qq": { | |||
"uniStatistics": { | |||
"enable": false | |||
} | |||
}, | |||
"uniStatistics": { | |||
"enable": false | |||
} | |||
} |
@@ -1,19 +1,19 @@ | |||
{ | |||
"dependencies": { | |||
"lodash": "^4.17.15", | |||
"moment": "^2.24.0" | |||
}, | |||
"uni-app": { | |||
"scripts": { | |||
"mp-dingtalk": { | |||
"title": "钉钉小程序", | |||
"env": { | |||
"UNI_PLATFORM": "mp-alipay" | |||
}, | |||
"define": { | |||
"MP-DINGTALK": true | |||
} | |||
} | |||
} | |||
} | |||
} | |||
"dependencies": { | |||
"lodash": "^4.17.15", | |||
"moment": "^2.24.0" | |||
}, | |||
"uni-app": { | |||
"scripts": { | |||
"mp-dingtalk": { | |||
"title": "钉钉小程序", | |||
"env": { | |||
"UNI_PLATFORM": "mp-alipay" | |||
}, | |||
"define": { | |||
"MP-DINGTALK": true | |||
} | |||
} | |||
} | |||
} | |||
} |
@@ -86,6 +86,51 @@ | |||
"navigationBarTitleText": "通讯录" | |||
} | |||
}, | |||
// start------------------------------------------------- | |||
{ | |||
"path": "pages/clockIn/list", | |||
"style": { | |||
"navigationBarTitleText": "学生考勤打卡" | |||
} | |||
}, | |||
{ | |||
"path": "pages/internshipReport/list", | |||
"style": { | |||
"navigationBarTitleText": "学生实习报名" | |||
} | |||
}, | |||
{ | |||
"path": "pages/InternshipSummary/list", | |||
"style": { | |||
"navigationBarTitleText": "学生实习总结" | |||
} | |||
}, | |||
{ | |||
"path": "pages/InternshipResults/list", | |||
"style": { | |||
"navigationBarTitleText": "学生成绩查看" | |||
} | |||
}, | |||
{ | |||
"path": "pages/TalentDemand/list", | |||
"style": { | |||
"navigationBarTitleText": "人才需求查看" | |||
} | |||
}, | |||
{ | |||
"path": "pages/meeting/list", | |||
"style": { | |||
"navigationBarTitleText": "供需见面会" | |||
} | |||
}, | |||
{ | |||
"path": "pages/meeting/detail", | |||
"style": { | |||
"navigationBarTitleText": "供需见面会" | |||
} | |||
}, | |||
// end | |||
// 我的(tabBar #4) | |||
{ | |||
@@ -1269,8 +1314,14 @@ | |||
"style": { | |||
"navigationBarTitleText": "统一认证2.0" | |||
} | |||
}, | |||
{ | |||
"path": "pages/internshipReport/detail", | |||
"style": { | |||
"navigationBarTitleText": "报名" | |||
} | |||
} | |||
], | |||
], | |||
// 全局样式 | |||
"globalStyle": { | |||
@@ -1375,4 +1426,4 @@ | |||
// } | |||
// ] | |||
// } | |||
// } | |||
// } |
@@ -0,0 +1,67 @@ | |||
<template> | |||
<view class="InternshipResults"> | |||
<view class="content"> | |||
<view class="tip"> | |||
您的成绩为: | |||
</view> | |||
<view class="scope"> | |||
86分 | |||
</view> | |||
</view> | |||
<view class="footer"> | |||
<img src="../../static/image/bg3.png" alt="" /> | |||
</view> | |||
</view> | |||
</template> | |||
<script> | |||
export default { | |||
data() { | |||
return { | |||
} | |||
}, | |||
methods: { | |||
} | |||
} | |||
</script> | |||
<style scoped lang="scss"> | |||
.InternshipResults { | |||
width: 100vw; | |||
height: calc(100vh - 44px); | |||
background: #fff; | |||
.content { | |||
.tip { | |||
width: 100%; | |||
font-size: 40rpx; | |||
text-align: center; | |||
padding-top: 50rpx; | |||
} | |||
.scope { | |||
width: 100%; | |||
text-align: center; | |||
padding-top: 20rpx; | |||
font-size: 60rpx; | |||
color: #0c86d8; | |||
font-weight: bold; | |||
} | |||
} | |||
.footer { | |||
width: 80%; | |||
position: fixed; | |||
bottom: 0; | |||
left: 0; | |||
right: 0; | |||
margin: auto; | |||
img { | |||
width: 100%; | |||
} | |||
} | |||
} | |||
</style> |
@@ -0,0 +1,123 @@ | |||
<template> | |||
<view class="InternshipSummary"> | |||
<u--form labelPosition="left" :model="userInfos" :rules="rules" ref="uForm" labelWidth="100"> | |||
<u-form-item label="学生姓名" prop="Student" borderBottom> | |||
<u--input v-model="userInfos.Student" border="none" readonly></u--input> | |||
</u-form-item> | |||
<u-form-item label="总结名称" prop="SummaryName" borderBottom> | |||
<u--input v-model="userInfos.SummaryName" border="none" :readonly="disabled" | |||
placeholder="请输入总结名称"></u--input> | |||
</u-form-item> | |||
<u-form-item label="联系方式" prop="Mobile" borderBottom> | |||
<u--input v-model="userInfos.Mobile" border="none" :readonly="disabled" | |||
placeholder="请输入联系方式"></u--input> | |||
</u-form-item> | |||
<u-form-item label="总结内容" prop="SummaryContent" borderBottom> | |||
<u--textarea v-model="userInfos.SummaryContent" :disabled="disabled" placeholder="请输入内容"></u--textarea> | |||
</u-form-item> | |||
</u--form> | |||
<view class="btns" v-if="!disabled"> | |||
<u-button type="primary" text="提交" @click="submit"></u-button> | |||
<u-button type="error" text="重置" @click="clearForm" style="margin-top: 30rpx;"></u-button> | |||
</view> | |||
</view> | |||
</template> | |||
<script> | |||
export default { | |||
data() { | |||
return { | |||
userInfos: { | |||
Student: '', | |||
SummaryName: '', | |||
Mobile: '', | |||
SummaryContent: '', | |||
content: '' | |||
}, | |||
disabled: false, | |||
rules: { | |||
'SummaryName': { | |||
type: 'string', | |||
required: true, | |||
message: '请填写总结名称', | |||
trigger: ['blur', 'change'] | |||
}, | |||
'SummaryContent': { | |||
type: 'string', | |||
required: true, | |||
message: '请填写总结内容', | |||
trigger: ['blur', 'change'] | |||
}, | |||
}, | |||
} | |||
}, | |||
computed: { | |||
// 当前用户对象 | |||
currentUser() { | |||
return this.GET_GLOBAL('loginUser') | |||
} | |||
}, | |||
async mounted() { | |||
this.$set(this.userInfos, 'Student', this.currentUser.realName) | |||
await this.getDetail() | |||
}, | |||
methods: { | |||
async getDetail() { | |||
let res = await this.HTTP_GET('/api/ht/zj/my'); | |||
if (res) { | |||
this.userInfos = JSON.parse(JSON.stringify(res)) | |||
this.disabled = true | |||
} | |||
}, | |||
clearForm() { | |||
for (let key in this.userInfos) { | |||
if (!['Student', 'ID'].includes(key)) { | |||
this.$set(this.userInfos, key, '') | |||
} | |||
} | |||
}, | |||
async submit() { | |||
this.$refs.uForm.validate().then(res => { | |||
let params = JSON.parse(JSON.stringify(this.userInfos)) | |||
this.HTTP_POST('/api/ht/zj/sub', { | |||
StudentNo: this.currentUser.account, | |||
...params | |||
}).then(resp => { | |||
uni.showToast({ | |||
title: '操作成功', | |||
duration: 2000, | |||
icon: 'none' | |||
}); | |||
this.$nextTick(() => { | |||
this.NAV_BACK(); | |||
}); | |||
}).catch(err => { | |||
uni.showToast({ | |||
title: '操作失败', | |||
duration: 2000, | |||
icon: 'none' | |||
}); | |||
}) | |||
}).catch(errors => { | |||
// uni.$u.toast('校验失败') | |||
}) | |||
}, | |||
} | |||
} | |||
</script> | |||
<style lang="scss"> | |||
.InternshipSummary { | |||
padding: 24rpx; | |||
box-sizing: border-box; | |||
height: calc(100vh - 44px); | |||
.btns { | |||
margin-top: 100rpx; | |||
} | |||
} | |||
</style> |
@@ -0,0 +1,22 @@ | |||
<template> | |||
<view> | |||
</view> | |||
</template> | |||
<script> | |||
export default { | |||
data() { | |||
return { | |||
} | |||
}, | |||
methods: { | |||
} | |||
} | |||
</script> | |||
<style> | |||
</style> |
@@ -0,0 +1,220 @@ | |||
<template> | |||
<view class="clockInStyle"> | |||
<view class="head"> | |||
<view class="head-item"> | |||
<text class="time">上班09:00</text> | |||
<view class="clockIn-status"> | |||
<u-icon name="checkmark-circle-fill" size="14" color="#0c86d8"></u-icon>08:56已打卡 | |||
</view> | |||
</view> | |||
<view class="head-item"> | |||
<text class="time">下班18:00</text> | |||
<view class="clockIn-status"> | |||
<!-- <u-icon name="checkmark-circle-fill" size="14" color="#0c86d8"></u-icon> --> | |||
未打卡 | |||
</view> | |||
</view> | |||
</view> | |||
<view class="clockInArea"> | |||
<view class="area"> | |||
<view class="clockIn" @click="clockInFn"> | |||
<text>下班打卡</text> | |||
<text class="time-second">{{dateTimeAndDay}}</text> | |||
</view> | |||
<view class="address"> | |||
<u-icon name="map-fill" size="16" color="#0c86d8"></u-icon> | |||
当前位置:{{address}} | |||
</view> | |||
</view> | |||
</view> | |||
</view> | |||
</template> | |||
<script> | |||
export default { | |||
data() { | |||
return { | |||
trim: null, | |||
dateTimeAndDay: '', | |||
address: '' | |||
} | |||
}, | |||
async onShow() { | |||
let that = this; | |||
if (!window.BMapGL) await that.loadScript(); | |||
that.trim = setInterval(() => that.getDateTimeAndDay(), 1000); | |||
setTimeout(() => that.getAddress(), 3000) | |||
}, | |||
onHide() { | |||
clearInterval(this.trim); | |||
this.removeScript() | |||
}, | |||
methods: { | |||
clockInFn() { | |||
}, | |||
//异步加载地图 | |||
loadScript() { | |||
return new Promise((resolve, reject) => { | |||
window.initMap = function() { | |||
resolve(BMapGL) | |||
} | |||
setTimeout(() => { | |||
resolve() | |||
}, 5000) | |||
var script = document.createElement('script'); | |||
script.type = 'text/javascript'; | |||
script.src = | |||
'https://api.map.baidu.com/api?v=1.0&type=webgl&ak=0GLT3IDHmHNTz8ZN149dFuvgbEKZIXvW&callback=' + | |||
'initMap'; | |||
script.onerror = reject; | |||
script.id = 'baiduScript' | |||
document.head.appendChild(script); | |||
}) | |||
}, | |||
getAddress() { | |||
let that = this; | |||
var geolocation = new BMapGL.Geolocation(); | |||
geolocation.enableSDKLocation(); | |||
geolocation.getCurrentPosition(function(r) { | |||
if (this.getStatus() == BMAP_STATUS_SUCCESS) { | |||
// 创建地理编码实例 | |||
var myGeo = new BMapGL.Geocoder(); | |||
// 根据坐标得到地址描述 | |||
myGeo.getLocation(new BMapGL.Point(r.point.lng, r.point.lat), function(result) { | |||
if (result) { | |||
that.address = result.address | |||
console.log(result.address); | |||
} | |||
}); | |||
} else { | |||
alert('failed' + this.getStatus()); | |||
} | |||
}); | |||
}, | |||
removeScript() { | |||
let scirpt = document.getElementById('baiduScript') | |||
if (scirpt) { | |||
scirpt.remove() | |||
} | |||
let scirpt1 = document.querySelectorAll('body script') | |||
if (scirpt1) { | |||
scirpt1.forEach(e => { | |||
if (e.src.includes('https://api.map.baidu.com')) { | |||
e.remove() | |||
} | |||
}) | |||
} | |||
window.BMapGL = null | |||
}, | |||
// 获取时间 | |||
getDateTimeAndDay() { | |||
var now = new Date(); | |||
var hours = now.getHours(); | |||
var minutes = now.getMinutes(); | |||
var seconds = now.getSeconds(); | |||
// 格式化小时、分钟和秒 | |||
hours = (hours < 10 ? "0" : "") + hours; | |||
minutes = (minutes < 10 ? "0" : "") + minutes; | |||
seconds = (seconds < 10 ? "0" : "") + seconds; | |||
this.dateTimeAndDay = hours + ":" + minutes + ":" + seconds | |||
} | |||
} | |||
} | |||
</script> | |||
<style lang="scss"> | |||
.clockInStyle { | |||
padding: 24rpx; | |||
box-sizing: border-box; | |||
.head { | |||
display: flex; | |||
justify-content: space-between; | |||
align-items: center; | |||
width: 100%; | |||
.head-item { | |||
width: calc(50% - 25rpx); | |||
height: 120rpx; | |||
background-color: #eee; | |||
border-radius: 20rpx; | |||
padding: 20rpx; | |||
box-sizing: border-box; | |||
display: flex; | |||
flex-direction: column; | |||
justify-content: center; | |||
.time { | |||
color: #333; | |||
font-size: 32rpx; | |||
} | |||
.clockIn-status { | |||
color: #aaa; | |||
font-size: 26rpx; | |||
margin-top: 6rpx; | |||
display: flex; | |||
.u-icon { | |||
margin-right: 10rpx; | |||
} | |||
} | |||
} | |||
} | |||
.clockInArea { | |||
height: calc(100vh - 260rpx); | |||
width: 100%; | |||
display: flex; | |||
align-items: center; | |||
justify-content: center; | |||
.area { | |||
width: 100%; | |||
height: 600rpx; | |||
display: flex; | |||
flex-direction: column; | |||
align-items: center; | |||
justify-content: center; | |||
.clockIn { | |||
width: 350rpx; | |||
height: 350rpx; | |||
background: #0c86d8; | |||
color: #fff; | |||
border-radius: 50%; | |||
margin-bottom: 40rpx; | |||
display: flex; | |||
justify-content: center; | |||
align-items: center; | |||
flex-direction: column; | |||
font-size: 44rpx; | |||
.time-second { | |||
opacity: .6; | |||
font-size: 28rpx; | |||
margin-top: 20rpx; | |||
} | |||
} | |||
.address { | |||
color: #aaa; | |||
font-size: 28rpx; | |||
display: flex; | |||
.u-icon { | |||
margin-right: 8rpx; | |||
} | |||
} | |||
} | |||
} | |||
} | |||
</style> |
@@ -0,0 +1,277 @@ | |||
<template> | |||
<view class="clockInStyle"> | |||
<view class="head"> | |||
<view class="head-item"> | |||
<text class="time">上班09:00</text> | |||
<view class="clockIn-status"> | |||
<u-icon name="checkmark-circle-fill" size="14" color="#0c86d8"></u-icon>08:56已打卡 | |||
</view> | |||
</view> | |||
<view class="head-item"> | |||
<text class="time">下班18:00</text> | |||
<view class="clockIn-status"> | |||
<!-- <u-icon name="checkmark-circle-fill" size="14" color="#0c86d8"></u-icon> --> | |||
未打卡 | |||
</view> | |||
</view> | |||
</view> | |||
<view class="clockInArea"> | |||
<view class="area"> | |||
<view class="clockIn" @click="getAddress"> | |||
<text>下班打卡</text> | |||
<text class="time-second">{{dateTimeAndDay}}</text> | |||
</view> | |||
<view class="address"> | |||
<u-icon name="map-fill" size="16" color="#0c86d8"></u-icon> | |||
当前位置:{{address}} | |||
</view> | |||
</view> | |||
</view> | |||
<view id="iCenter"> | |||
</view> | |||
</view> | |||
</template> | |||
<script> | |||
import http from '@/http/api.js' | |||
export default { | |||
data() { | |||
return { | |||
trim: null, | |||
dateTimeAndDay: '', | |||
address: '' | |||
} | |||
}, | |||
async onShow() { | |||
let that = this; | |||
if (!window.AMap) await that.loadScript(); | |||
that.trim = setInterval(() => that.getDateTimeAndDay(), 1000); | |||
// setTimeout(() => that.getAddress(), 3000) | |||
}, | |||
onHide() { | |||
clearInterval(this.trim); | |||
this.removeScript() | |||
}, | |||
methods: { | |||
clockInFn() { | |||
alert(1) | |||
}, | |||
//异步加载地图 | |||
loadScript() { | |||
return new Promise((resolve, reject) => { | |||
window.initMap = function() { | |||
resolve(AMap) | |||
} | |||
setTimeout(() => { | |||
resolve() | |||
}, 6000) | |||
var script = document.createElement('script'); | |||
script.type = 'text/javascript'; | |||
script.src = | |||
"https://webapi.amap.com/maps?v=2.0&key=575af36b09a5a716a1521ef5493f156e&plugin=AMap.Geocoder"; | |||
script.onerror = reject; | |||
script.id = 'baiduScript' | |||
document.head.appendChild(script); | |||
}) | |||
}, | |||
getAddress() { | |||
let that = this; | |||
// let AMapObj = new AMap.Map('iCenter'); | |||
// 构造定位插件实例 | |||
AMap.plugin('AMap.Geolocation', function() { | |||
var geolocation = new AMap.Geolocation({ | |||
enableHighAccuracy: true, //是否使用高精度定位,默认:true | |||
timeout: 10000, //超过10秒后停止定位,默认:5s | |||
position: 'RB', //定位按钮的停靠位置 | |||
offset: [10, 20], //定位按钮与设置的停靠位置的偏移量,默认:[10, 20] | |||
zoomToAccuracy: true, //定位成功后是否自动调整地图视野到定位点 | |||
}); | |||
geolocation.getCurrentPosition(function(status, result) { | |||
if (status == 'complete') { | |||
console.log(result, "。。。。。。。。"); | |||
let Lng = result.position.lng; | |||
let Lat = result.position.lat | |||
that.getCurrentAddress(Lng, Lat, AMap) | |||
} | |||
}); | |||
}); | |||
// AMap.plugin('AMap.Geolocation', function() { | |||
// var geolocation = new AMap.Geolocation({ | |||
// enableHighAccuracy: true, // 是否使用高精度定位,默认:true | |||
// timeout: 10000 // 超过10秒后停止定位,默认:5s | |||
// }); | |||
// geolocation.getCurrentPosition(); | |||
// AMap.addControl(geolocation); | |||
// AMap.event.addListener(geolocation, 'complete', function(data) { | |||
// let Lng = data.position.getLng(); | |||
// let Lat = data.position.getLat() | |||
// // console.log(data, "........"); | |||
// console.log('经度:', Lng); | |||
// console.log("纬度", Lat); | |||
// that.getCurrentAddress(Lng, Lat, AMap) | |||
// }); // 返回定位信息 | |||
// AMap.event.addListener(geolocation, 'error', function(data) { | |||
// console.log('定位失败:' + data.message); | |||
// }); // 返回定位出错信息 | |||
// }); | |||
}, | |||
getCurrentAddress(Lng, Lat, AMapObj) { | |||
var geocoder = new AMap.Geocoder({ | |||
city: "010", //城市设为北京,默认:“全国” | |||
radius: 1000 //范围,默认:500 | |||
}); | |||
var lnglat = [JSON.stringify(Lng), JSON.stringify(Lat)]; | |||
console.log(lnglat, "pppppppp"); | |||
geocoder.getAddress(lnglat, function(status, result) { | |||
if (status === 'complete' && result.regeocode) { | |||
console.log(result, "............/"); | |||
} else { | |||
console.log('根据经纬度查询地址失败') | |||
} | |||
}); | |||
// AMapObj = new AMap.Map('iCenter'); | |||
// AMapObj.plugin("AMap.Geocoder", function() { | |||
// var geocoder = new AMap.Geocoder({ | |||
// city: "太原", // city 指定进行编码查询的城市,支持传入城市名、adcode 和 citycode | |||
// }); | |||
// var lnglat = ['112.546391', '37.801881']; | |||
// geocoder.getAddress(lnglat, function(status, result) { | |||
// if (status === "complete" && result.info === "OK") { | |||
// // result为对应的地理位置详细信息 | |||
// console.log(result); | |||
// } | |||
// }); | |||
// }); | |||
}, | |||
removeScript() { | |||
let scirpt = document.getElementById('baiduScript') | |||
if (scirpt) { | |||
scirpt.remove() | |||
} | |||
let scirpt1 = document.querySelectorAll('body script') | |||
if (scirpt1) { | |||
scirpt1.forEach(e => { | |||
if (e.src.includes('https://webapi.amap.com')) { | |||
e.remove() | |||
} | |||
}) | |||
} | |||
window.AMap = null | |||
}, | |||
// 获取时间 | |||
getDateTimeAndDay() { | |||
var now = new Date(); | |||
var hours = now.getHours(); | |||
var minutes = now.getMinutes(); | |||
var seconds = now.getSeconds(); | |||
// 格式化小时、分钟和秒 | |||
hours = (hours < 10 ? "0" : "") + hours; | |||
minutes = (minutes < 10 ? "0" : "") + minutes; | |||
seconds = (seconds < 10 ? "0" : "") + seconds; | |||
this.dateTimeAndDay = hours + ":" + minutes + ":" + seconds | |||
} | |||
} | |||
} | |||
</script> | |||
<style lang="scss"> | |||
.clockInStyle { | |||
padding: 24rpx; | |||
box-sizing: border-box; | |||
.head { | |||
display: flex; | |||
justify-content: space-between; | |||
align-items: center; | |||
width: 100%; | |||
.head-item { | |||
width: calc(50% - 25rpx); | |||
height: 120rpx; | |||
background-color: #eee; | |||
border-radius: 20rpx; | |||
padding: 20rpx; | |||
box-sizing: border-box; | |||
display: flex; | |||
flex-direction: column; | |||
justify-content: center; | |||
.time { | |||
color: #333; | |||
font-size: 32rpx; | |||
} | |||
.clockIn-status { | |||
color: #aaa; | |||
font-size: 26rpx; | |||
margin-top: 6rpx; | |||
display: flex; | |||
.u-icon { | |||
margin-right: 10rpx; | |||
} | |||
} | |||
} | |||
} | |||
.clockInArea { | |||
height: calc(100vh - 260rpx); | |||
width: 100%; | |||
display: flex; | |||
align-items: center; | |||
justify-content: center; | |||
.area { | |||
width: 100%; | |||
height: 600rpx; | |||
display: flex; | |||
flex-direction: column; | |||
align-items: center; | |||
justify-content: center; | |||
.clockIn { | |||
width: 350rpx; | |||
height: 350rpx; | |||
background: #0c86d8; | |||
color: #fff; | |||
border-radius: 50%; | |||
margin-bottom: 40rpx; | |||
display: flex; | |||
justify-content: center; | |||
align-items: center; | |||
flex-direction: column; | |||
font-size: 44rpx; | |||
.time-second { | |||
opacity: .6; | |||
font-size: 28rpx; | |||
margin-top: 20rpx; | |||
} | |||
} | |||
.address { | |||
color: #aaa; | |||
font-size: 28rpx; | |||
display: flex; | |||
.u-icon { | |||
margin-right: 8rpx; | |||
} | |||
} | |||
} | |||
} | |||
} | |||
</style> |
@@ -0,0 +1,294 @@ | |||
<template> | |||
<view> | |||
<u-loading-page :loading="address ? false : true" loading-text="loading..."> | |||
</u-loading-page> | |||
<view class="clockInStyle" v-if="address"> | |||
<view class="head"> | |||
<view class="head-item"> | |||
<text class="time">上班</text> | |||
<view class="clockIn-status"> | |||
<template v-if="clockStateInfo.start == 1"> | |||
<u-icon name="checkmark-circle-fill" size="14" | |||
color="#0c86d8"></u-icon>{{clockStateInfo.startTime }}已打卡 | |||
</template> | |||
<template v-else> | |||
未打卡 | |||
</template> | |||
</view> | |||
</view> | |||
<view class="head-item"> | |||
<text class="time">下班</text> | |||
<view class="clockIn-status"> | |||
<template v-if="clockStateInfo.end == 1"> | |||
<u-icon name="checkmark-circle-fill" size="14" | |||
color="#0c86d8"></u-icon>{{clockStateInfo.endTime }}已打卡 | |||
</template> | |||
<template v-else> | |||
未打卡 | |||
</template> | |||
</view> | |||
</view> | |||
</view> | |||
<view class="time-second">{{dateTimeAndDay}}</view> | |||
<view class="clockInArea"> | |||
<view class="area"> | |||
<view class="clockIn" @click="clockInFn" | |||
:style="{background:(clockStateInfo.start==1 && clockStateInfo.end==1) ? ' #ccc' :'#0c86d8'}"> | |||
<text v-if="Number(clockStateInfo.start) === 0">上班打卡</text> | |||
<text | |||
v-else-if="Number(clockStateInfo.start) === 1 && Number(clockStateInfo.end) === 0">下班打卡</text> | |||
<text v-else style="color:#fff">下班打卡</text> | |||
</view> | |||
<view class="address"> | |||
<view class="top"> | |||
<u-icon name="map-fill" size="16" color="#0c86d8"></u-icon> | |||
当前位置:{{address}} | |||
<!--{{addressDesc}} --> | |||
</view> | |||
</view> | |||
</view> | |||
</view> | |||
</view> | |||
</view> | |||
</template> | |||
<script> | |||
export default { | |||
data() { | |||
return { | |||
trim: null, | |||
dateTimeAndDay: '', | |||
address: '', | |||
addressDesc: '', | |||
mapContent: {}, | |||
clockStateInfo: {}, //打卡状态信息 | |||
} | |||
}, | |||
async mounted() { | |||
let that = this; | |||
that.init() | |||
that.trim = setInterval(() => that.getDateTimeAndDay(), 1000); | |||
}, | |||
destroyed() { | |||
clearInterval(this.trim); | |||
this.removeScript() | |||
}, | |||
methods: { | |||
init() { | |||
let that = this; | |||
if (!window.BMapGL) { | |||
that.loadScript('kH6ApL7W4BQxwzfkfG34m1c2iC1jsDia').then(BMapGL => { | |||
setTimeout(() => that.getAddress(), 3000) | |||
}) | |||
} else { | |||
setTimeout(() => that.getAddress(), 3000) | |||
}; | |||
}, | |||
// 获取打卡状态 | |||
async getClockInState() { | |||
const result = await this.HTTP_GET( | |||
'/api/ht/attendance/clockstat' | |||
) | |||
this.clockStateInfo = result | |||
console.log(result, "状态"); | |||
}, | |||
async clockInFn() { | |||
if (this.clockStateInfo.start == 1 && this.clockStateInfo.end == 1) { | |||
uni.showToast({ | |||
title: '已完成今日的打卡!', | |||
icon: 'none' | |||
}) | |||
} else { | |||
const result = await this.HTTP_POST( | |||
'/api/ht/attendance/clockin', { | |||
ALon: this.mapContent.point.lng, | |||
Alat: this.mapContent.point.lat, | |||
ClockPlace: this.address | |||
} | |||
) | |||
this.getClockInState() | |||
} | |||
}, | |||
//异步加载地图 | |||
loadScript(ak) { | |||
return new Promise((resolve, reject) => { | |||
window.initMap = function() { | |||
resolve(BMapGL) | |||
} | |||
setTimeout(() => { | |||
resolve() | |||
}, 5000) | |||
var script = document.createElement('script'); | |||
script.type = 'text/javascript'; | |||
script.src = | |||
'https://api.map.baidu.com/api?v=1.0&type=webgl&ak=' + ak + '&callback=' + | |||
'initMap'; | |||
script.onerror = reject; | |||
script.id = 'baiduScript' | |||
document.head.appendChild(script); | |||
}) | |||
}, | |||
getAddress() { | |||
let that = this; | |||
var geolocation = new BMapGL.Geolocation(); | |||
geolocation.enableSDKLocation(); | |||
geolocation.getCurrentPosition(function(r) { | |||
if (this.getStatus() == BMAP_STATUS_SUCCESS) { | |||
// 创建地理编码实例 | |||
var myGeo = new BMapGL.Geocoder(); | |||
// 根据坐标得到地址描述 | |||
myGeo.getLocation(new BMapGL.Point(r.point.lng, r.point.lat), async function(result) { | |||
if (result) { | |||
that.mapContent = result; | |||
that.address = result.address; | |||
that.addressDesc = result.content | |||
.poi_desc | |||
console.log(result); | |||
await that.getClockInState() | |||
} | |||
}); | |||
} else { | |||
alert('failed' + this.getStatus()); | |||
} | |||
}); | |||
}, | |||
removeScript() { | |||
let scirpt = document.getElementById('baiduScript') | |||
if (scirpt) { | |||
scirpt.remove() | |||
} | |||
let scirpt1 = document.querySelectorAll('body script') | |||
if (scirpt1) { | |||
scirpt1.forEach(e => { | |||
if (e.src.includes('https://api.map.baidu.com')) { | |||
e.remove() | |||
} | |||
}) | |||
} | |||
window.BMapGL = null | |||
}, | |||
// 获取时间 | |||
getDateTimeAndDay() { | |||
var now = new Date(); | |||
var hours = now.getHours(); | |||
var minutes = now.getMinutes(); | |||
var seconds = now.getSeconds(); | |||
// 格式化小时、分钟和秒 | |||
hours = (hours < 10 ? "0" : "") + hours; | |||
minutes = (minutes < 10 ? "0" : "") + minutes; | |||
seconds = (seconds < 10 ? "0" : "") + seconds; | |||
this.dateTimeAndDay = hours + ":" + minutes + ":" + seconds | |||
} | |||
} | |||
} | |||
</script> | |||
<style lang="scss"> | |||
.clockInStyle { | |||
padding: 24rpx; | |||
background-color: #fff; | |||
box-sizing: border-box; | |||
.head { | |||
display: flex; | |||
justify-content: space-between; | |||
align-items: center; | |||
width: 100%; | |||
.head-item { | |||
width: calc(50% - 25rpx); | |||
height: 120rpx; | |||
background-color: #eee; | |||
border-radius: 20rpx; | |||
padding: 20rpx; | |||
box-sizing: border-box; | |||
display: flex; | |||
flex-direction: column; | |||
justify-content: center; | |||
.time { | |||
color: #333; | |||
font-size: 32rpx; | |||
} | |||
.clockIn-status { | |||
color: #aaa; | |||
font-size: 26rpx; | |||
margin-top: 6rpx; | |||
display: flex; | |||
.u-icon { | |||
margin-right: 10rpx; | |||
} | |||
} | |||
} | |||
} | |||
.time-second { | |||
opacity: .6; | |||
font-size: 64rpx; | |||
margin-top: 20rpx; | |||
text-align: center; | |||
padding: 120rpx 0; | |||
} | |||
.clockInArea { | |||
// height: calc(100vh - 260rpx); | |||
width: 100%; | |||
display: flex; | |||
align-items: center; | |||
justify-content: center; | |||
.area { | |||
width: 100%; | |||
height: 600rpx; | |||
display: flex; | |||
flex-direction: column; | |||
align-items: center; | |||
justify-content: center; | |||
.clockIn { | |||
width: 300rpx; | |||
height: 300rpx; | |||
background: #0c86d8; | |||
color: #fff; | |||
border-radius: 50%; | |||
margin-bottom: 40rpx; | |||
display: flex; | |||
justify-content: center; | |||
align-items: center; | |||
flex-direction: column; | |||
font-size: 44rpx; | |||
} | |||
.address { | |||
color: #aaa; | |||
font-size: 28rpx; | |||
display: flex; | |||
text-align: center; | |||
flex-direction: column; | |||
.top { | |||
display: flex; | |||
} | |||
.u-icon { | |||
margin-right: 8rpx; | |||
} | |||
} | |||
} | |||
} | |||
} | |||
</style> |
@@ -0,0 +1,32 @@ | |||
<template> | |||
<view> | |||
<button @click="getAddress">1111</button> | |||
<iframe id="geoPage" width=0 height=0 frameborder=0 style="display:none;" scrolling="no" | |||
src="https://apis.map.qq.com/tools/geolocation?key=W7LBZ-S7URQ-FY25O-B4HUG-ELNVH-B5BJM&referer=myapp"> | |||
</iframe> | |||
</view> | |||
</template> | |||
<script> | |||
export default { | |||
async mounted() { | |||
window.addEventListener('message', function(event) { | |||
// 接收位置信息 | |||
var loc = event.data; | |||
alert(JSON.stringify(loc)) | |||
console.log('location', loc); | |||
}, false); | |||
}, | |||
methods: { | |||
getAddress() { | |||
document.getElementById("geoPage").contentWindow | |||
.postMessage("getLocation", "*"); | |||
} | |||
} | |||
} | |||
</script> | |||
<style> | |||
</style> |
@@ -0,0 +1,228 @@ | |||
<template> | |||
<view class="clockInStyle"> | |||
<iframe id="geoPage" width=0 height=0 frameborder=0 style="display:none;" scrolling="no" | |||
src="https://apis.map.qq.com/tools/geolocation?key=W7LBZ-S7URQ-FY25O-B4HUG-ELNVH-B5BJM&referer=myapp"> | |||
</iframe> | |||
<view class="head"> | |||
<view class="head-item"> | |||
<text class="time">上班09:00</text> | |||
<view class="clockIn-status"> | |||
<u-icon name="checkmark-circle-fill" size="14" color="#0c86d8"></u-icon>08:56已打卡 | |||
</view> | |||
</view> | |||
<view class="head-item"> | |||
<text class="time">下班18:00</text> | |||
<view class="clockIn-status"> | |||
<!-- <u-icon name="checkmark-circle-fill" size="14" color="#0c86d8"></u-icon> --> | |||
未打卡 | |||
</view> | |||
</view> | |||
</view> | |||
<view class="clockInArea"> | |||
<view class="area"> | |||
<view class="clockIn" @click="clockInFn"> | |||
<text>下班打卡</text> | |||
<text class="time-second">{{dateTimeAndDay}}</text> | |||
</view> | |||
<view class="address"> | |||
<u-icon name="map-fill" size="16" color="#0c86d8"></u-icon> | |||
当前位置:{{address}} | |||
</view> | |||
</view> | |||
</view> | |||
</view> | |||
</template> | |||
<script> | |||
export default { | |||
data() { | |||
return { | |||
trim: null, | |||
dateTimeAndDay: '', | |||
address: '' | |||
} | |||
}, | |||
async onShow() { | |||
let that = this; | |||
that.trim = setInterval(() => that.getDateTimeAndDay(), 1000); | |||
setTimeout(() => { | |||
document.getElementById("geoPage").contentWindow | |||
.postMessage("getLocation", "*"); | |||
}, 2000) | |||
}, | |||
onHide() { | |||
clearInterval(this.trim); | |||
}, | |||
mounted() { | |||
let that = this | |||
window.addEventListener('message', function(event) { | |||
// 接收位置信息 | |||
var loc = event.data; | |||
if (loc && loc.module == 'geolocation') { | |||
console.log(event, ".........."); | |||
console.log('location', loc); | |||
alert(JSON.stringify(loc)) | |||
that.address = loc.addr | |||
} | |||
}, false); | |||
}, | |||
methods: { | |||
clockInFn() { | |||
alert(1) | |||
}, | |||
//异步加载地图 | |||
loadScript() { | |||
return new Promise((resolve, reject) => { | |||
window.initMap = function() { | |||
resolve(TMap) | |||
} | |||
setTimeout(() => { | |||
resolve() | |||
}, 6000) | |||
var script = document.createElement('script'); | |||
script.type = 'text/javascript'; | |||
script.src = | |||
"https://mapapi.qq.com/web/mapComponents/geoLocation/v/geolocation.min.js"; | |||
script.onerror = reject; | |||
script.id = 'baiduScript' | |||
document.head.appendChild(script); | |||
}) | |||
}, | |||
getAddress() { | |||
let that = this; | |||
var geolocation = new qq.maps.Geolocation("W7LBZ-S7URQ-FY25O-B4HUG-ELNVH-B5BJM", "myapp"); | |||
geolocation.getLocation(function(position) { | |||
alert(JSON.stringify(position)) | |||
that.address = position.addr | |||
}, function() { | |||
}, { | |||
timeout: 6000 | |||
}) | |||
}, | |||
removeScript() { | |||
let scirpt = document.getElementById('baiduScript') | |||
if (scirpt) { | |||
scirpt.remove() | |||
} | |||
let scirpt1 = document.querySelectorAll('body script') | |||
if (scirpt1) { | |||
scirpt1.forEach(e => { | |||
if (e.src.includes('https://mapapi.qq.com')) { | |||
e.remove() | |||
} | |||
}) | |||
} | |||
window.qq = null | |||
}, | |||
// 获取时间 | |||
getDateTimeAndDay() { | |||
var now = new Date(); | |||
var hours = now.getHours(); | |||
var minutes = now.getMinutes(); | |||
var seconds = now.getSeconds(); | |||
// 格式化小时、分钟和秒 | |||
hours = (hours < 10 ? "0" : "") + hours; | |||
minutes = (minutes < 10 ? "0" : "") + minutes; | |||
seconds = (seconds < 10 ? "0" : "") + seconds; | |||
this.dateTimeAndDay = hours + ":" + minutes + ":" + seconds | |||
} | |||
} | |||
} | |||
</script> | |||
<style lang="scss"> | |||
.clockInStyle { | |||
padding: 24rpx; | |||
box-sizing: border-box; | |||
.head { | |||
display: flex; | |||
justify-content: space-between; | |||
align-items: center; | |||
width: 100%; | |||
.head-item { | |||
width: calc(50% - 25rpx); | |||
height: 120rpx; | |||
background-color: #eee; | |||
border-radius: 20rpx; | |||
padding: 20rpx; | |||
box-sizing: border-box; | |||
display: flex; | |||
flex-direction: column; | |||
justify-content: center; | |||
.time { | |||
color: #333; | |||
font-size: 32rpx; | |||
} | |||
.clockIn-status { | |||
color: #aaa; | |||
font-size: 26rpx; | |||
margin-top: 6rpx; | |||
display: flex; | |||
.u-icon { | |||
margin-right: 10rpx; | |||
} | |||
} | |||
} | |||
} | |||
.clockInArea { | |||
height: calc(100vh - 260rpx); | |||
width: 100%; | |||
display: flex; | |||
align-items: center; | |||
justify-content: center; | |||
.area { | |||
width: 100%; | |||
height: 600rpx; | |||
display: flex; | |||
flex-direction: column; | |||
align-items: center; | |||
justify-content: center; | |||
.clockIn { | |||
width: 350rpx; | |||
height: 350rpx; | |||
background: #0c86d8; | |||
color: #fff; | |||
border-radius: 50%; | |||
margin-bottom: 40rpx; | |||
display: flex; | |||
justify-content: center; | |||
align-items: center; | |||
flex-direction: column; | |||
font-size: 44rpx; | |||
.time-second { | |||
opacity: .6; | |||
font-size: 28rpx; | |||
margin-top: 20rpx; | |||
} | |||
} | |||
.address { | |||
color: #aaa; | |||
font-size: 28rpx; | |||
display: flex; | |||
.u-icon { | |||
margin-right: 8rpx; | |||
} | |||
} | |||
} | |||
} | |||
} | |||
</style> |
@@ -0,0 +1,231 @@ | |||
<template> | |||
<view class="clockInStyle"> | |||
<view class="head"> | |||
<view class="head-item"> | |||
<text class="time">上班09:00</text> | |||
<view class="clockIn-status"> | |||
<u-icon name="checkmark-circle-fill" size="14" color="#0c86d8"></u-icon>08:56已打卡 | |||
</view> | |||
</view> | |||
<view class="head-item"> | |||
<text class="time">下班18:00</text> | |||
<view class="clockIn-status"> | |||
<!-- <u-icon name="checkmark-circle-fill" size="14" color="#0c86d8"></u-icon> --> | |||
未打卡 | |||
</view> | |||
</view> | |||
</view> | |||
<view class="clockInArea"> | |||
<view class="area"> | |||
<view class="clockIn" @click="getAddress"> | |||
<text>下班打卡</text> | |||
<text class="time-second">{{dateTimeAndDay}}</text> | |||
</view> | |||
<view class="address"> | |||
<u-icon name="map-fill" size="16" color="#0c86d8"></u-icon> | |||
当前位置:{{address}} | |||
</view> | |||
</view> | |||
</view> | |||
</view> | |||
</template> | |||
<script> | |||
import http from '@/http/api.js' | |||
export default { | |||
data() { | |||
return { | |||
trim: null, | |||
dateTimeAndDay: '', | |||
address: '' | |||
} | |||
}, | |||
async onShow() { | |||
let that = this; | |||
if (!window.qq) await that.loadScript(); | |||
that.trim = setInterval(() => that.getDateTimeAndDay(), 1000); | |||
setTimeout(() => that.getAddress(), 3000) | |||
}, | |||
onHide() { | |||
clearInterval(this.trim); | |||
this.removeScript() | |||
}, | |||
methods: { | |||
clockInFn() { | |||
alert(1) | |||
}, | |||
//异步加载地图 | |||
loadScript() { | |||
return new Promise((resolve, reject) => { | |||
window.initMap = function() { | |||
resolve(TMap) | |||
} | |||
setTimeout(() => { | |||
resolve() | |||
}, 6000) | |||
var script = document.createElement('script'); | |||
script.type = 'text/javascript'; | |||
// script.src = | |||
// "https://mapapi.qq.com/web/mapComponents/geoLocation/v/geolocation.min.js"; | |||
// script.src = | |||
// "https://apis.map.qq.com/tools/geolocation/min?key=W7LBZ-S7URQ-FY25O-B4HUG-ELNVH-B5BJM&referer=myapp"; | |||
script.src = | |||
"https://mapapi.qq.com/web/mapComponents/geoLocation/v/geolocation.min.js"; | |||
script.onerror = reject; | |||
script.id = 'baiduScript' | |||
document.head.appendChild(script); | |||
}) | |||
}, | |||
getAddress() { | |||
let that = this; | |||
var geolocation = new qq.maps.Geolocation("W7LBZ-S7URQ-FY25O-B4HUG-ELNVH-B5BJM", "myapp"); | |||
geolocation.getLocation(function(position) { | |||
alert(JSON.stringify(position)) | |||
console.log(position, ".........."); | |||
that.getCurrentAddress(position.lat, position.lng) | |||
}, function() { | |||
}, { | |||
timeout: 8000 | |||
}) | |||
}, | |||
getCurrentAddress(lat, lng) { | |||
// lat = '37.73605', lng = '112.56566' | |||
http.request({ | |||
url: '/TencentGet', | |||
method: 'get', | |||
params: { | |||
location: lat + "," + lng, | |||
key: 'W7LBZ-S7URQ-FY25O-B4HUG-ELNVH-B5BJM', | |||
// get_poi:0 | |||
} | |||
}).then(resp => { | |||
alert(JSON.stringify(resp, "........")) | |||
console.log(resp, "............"); | |||
this.address = resp.result.address; | |||
}) | |||
}, | |||
removeScript() { | |||
let scirpt = document.getElementById('baiduScript') | |||
if (scirpt) { | |||
scirpt.remove() | |||
} | |||
let scirpt1 = document.querySelectorAll('body script') | |||
if (scirpt1) { | |||
scirpt1.forEach(e => { | |||
if (e.src.includes('https://mapapi.qq.com')) { | |||
e.remove() | |||
} | |||
}) | |||
} | |||
window.qq = null | |||
}, | |||
// 获取时间 | |||
getDateTimeAndDay() { | |||
var now = new Date(); | |||
var hours = now.getHours(); | |||
var minutes = now.getMinutes(); | |||
var seconds = now.getSeconds(); | |||
// 格式化小时、分钟和秒 | |||
hours = (hours < 10 ? "0" : "") + hours; | |||
minutes = (minutes < 10 ? "0" : "") + minutes; | |||
seconds = (seconds < 10 ? "0" : "") + seconds; | |||
this.dateTimeAndDay = hours + ":" + minutes + ":" + seconds | |||
} | |||
} | |||
} | |||
</script> | |||
<style lang="scss"> | |||
.clockInStyle { | |||
padding: 24rpx; | |||
box-sizing: border-box; | |||
.head { | |||
display: flex; | |||
justify-content: space-between; | |||
align-items: center; | |||
width: 100%; | |||
.head-item { | |||
width: calc(50% - 25rpx); | |||
height: 120rpx; | |||
background-color: #eee; | |||
border-radius: 20rpx; | |||
padding: 20rpx; | |||
box-sizing: border-box; | |||
display: flex; | |||
flex-direction: column; | |||
justify-content: center; | |||
.time { | |||
color: #333; | |||
font-size: 32rpx; | |||
} | |||
.clockIn-status { | |||
color: #aaa; | |||
font-size: 26rpx; | |||
margin-top: 6rpx; | |||
display: flex; | |||
.u-icon { | |||
margin-right: 10rpx; | |||
} | |||
} | |||
} | |||
} | |||
.clockInArea { | |||
height: calc(100vh - 260rpx); | |||
width: 100%; | |||
display: flex; | |||
align-items: center; | |||
justify-content: center; | |||
.area { | |||
width: 100%; | |||
height: 600rpx; | |||
display: flex; | |||
flex-direction: column; | |||
align-items: center; | |||
justify-content: center; | |||
.clockIn { | |||
width: 350rpx; | |||
height: 350rpx; | |||
background: #0c86d8; | |||
color: #fff; | |||
border-radius: 50%; | |||
margin-bottom: 40rpx; | |||
display: flex; | |||
justify-content: center; | |||
align-items: center; | |||
flex-direction: column; | |||
font-size: 44rpx; | |||
.time-second { | |||
opacity: .6; | |||
font-size: 28rpx; | |||
margin-top: 20rpx; | |||
} | |||
} | |||
.address { | |||
color: #aaa; | |||
font-size: 28rpx; | |||
display: flex; | |||
.u-icon { | |||
margin-right: 8rpx; | |||
} | |||
} | |||
} | |||
} | |||
} | |||
</style> |
@@ -1,235 +1,222 @@ | |||
<template> | |||
<view class="page" id="more"> | |||
<!-- 顶部搜索栏 --> | |||
<l-banner v-model="searchText" :focus="focus" placeholder="搜索应用名" type="search" noSearchButton fill fixed /> | |||
<!-- 「我的应用」列表 --> | |||
<l-title v-if="searchText.length <= 0">我的应用</l-title> | |||
<view v-if="searchText.length <= 0" class="col-4 function-list cu-list grid no-border"> | |||
<view | |||
v-for="(item, index) in myListDisplay" | |||
:key="index" | |||
class="cu-item text-center flex flex-wrap justify-center align-center" | |||
> | |||
<!-- 图标 --> | |||
<view | |||
@click="funcListClick(item)" | |||
style="background-color: #fe955c;" | |||
class="app-item align-center flex flex-wrap justify-center align-center" | |||
> | |||
<l-icon :type="item.icon" color="white" class="text-sl" /> | |||
</view> | |||
<text>{{ item && item.F_Name }}</text> | |||
<!-- 图标下方按钮 --> | |||
<l-button v-if="edit" @click="removeClick(item.F_Id)" line="red" class="margin-top-sm">移出</l-button> | |||
</view> | |||
</view> | |||
<!-- 操作区按钮 --> | |||
<view v-if="searchText.length <= 0" class="padding-lr padding-bottom bg-white margin-bottom"> | |||
<l-button @click="editClick" :line="edit ? 'green' : 'blue'" block> | |||
{{ edit ? '完成编辑' : '编辑“我的应用”列表' }} | |||
</l-button> | |||
<l-button v-if="edit" @click="cancelClick" line="red" class="margin-top block" block>放弃编辑</l-button> | |||
</view> | |||
<!-- 分块显示功能区 --> | |||
<template v-for="(group, title) in groupList"> | |||
<view :key="title" class="margin-bottom"> | |||
<!-- 区块标题 --> | |||
<l-title>{{ title }}</l-title> | |||
<!-- 按钮组 --> | |||
<view class="function-list cu-list grid no-border col-4"> | |||
<view | |||
v-for="(item, index) in group" | |||
:key="index" | |||
class="cu-item text-center flex flex-wrap justify-center align-center" | |||
> | |||
<view | |||
@click="funcListClick(item)" | |||
:style="{ backgroundColor: funcListIconColor(item) }" | |||
class="app-item align-center flex flex-wrap justify-center align-center" | |||
> | |||
<l-icon :type="item.icon" color="white" class="text-sl" /> | |||
</view> | |||
<text>{{ item && item.F_Name }}</text> | |||
<!-- 编辑模式按钮 --> | |||
<l-button | |||
v-if="edit" | |||
@click="itemClick(item.F_Id)" | |||
:line="editList.includes(item.F_Id) ? 'red' : 'green'" | |||
class="margin-top-sm" | |||
> | |||
{{ editList.includes(item.F_Id) ? '移出' : '添加' }} | |||
</l-button> | |||
</view> | |||
</view> | |||
</view> | |||
</template> | |||
</view> | |||
<view class="page" id="more"> | |||
<!-- 顶部搜索栏 --> | |||
<l-banner v-model="searchText" :focus="focus" placeholder="搜索应用名" type="search" noSearchButton fill fixed /> | |||
<!-- 「我的应用」列表 --> | |||
<l-title v-if="searchText.length <= 0">我的应用</l-title> | |||
<view v-if="searchText.length <= 0" class="col-4 function-list cu-list grid no-border"> | |||
<view v-for="(item, index) in myListDisplay" :key="index" | |||
class="cu-item text-center flex flex-wrap justify-center align-center"> | |||
<!-- 图标 --> | |||
<view @click="funcListClick(item)" style="background-color: #fe955c;" | |||
class="app-item align-center flex flex-wrap justify-center align-center"> | |||
<l-icon :type="item.icon" color="white" class="text-sl" /> | |||
</view> | |||
<text>{{ item && item.F_Name }}</text> | |||
<!-- 图标下方按钮 --> | |||
<l-button v-if="edit" @click="removeClick(item.F_Id)" line="red" class="margin-top-sm">移出</l-button> | |||
</view> | |||
</view> | |||
<!-- 操作区按钮 --> | |||
<view v-if="searchText.length <= 0" class="padding-lr padding-bottom bg-white margin-bottom"> | |||
<l-button @click="editClick" :line="edit ? 'green' : 'blue'" block> | |||
{{ edit ? '完成编辑' : '编辑“我的应用”列表' }} | |||
</l-button> | |||
<l-button v-if="edit" @click="cancelClick" line="red" class="margin-top block" block>放弃编辑</l-button> | |||
</view> | |||
<!-- 分块显示功能区 --> | |||
<template v-for="(group, title) in groupList"> | |||
<view :key="title" class="margin-bottom"> | |||
<!-- 区块标题 --> | |||
<l-title>{{ title }}</l-title> | |||
<!-- 按钮组 --> | |||
<view class="function-list cu-list grid no-border col-4"> | |||
<view v-for="(item, index) in group" :key="index" | |||
class="cu-item text-center flex flex-wrap justify-center align-center"> | |||
<view @click="funcListClick(item)" :style="{ backgroundColor: funcListIconColor(item) }" | |||
class="app-item align-center flex flex-wrap justify-center align-center"> | |||
<l-icon :type="item.icon" color="white" class="text-sl" /> | |||
</view> | |||
<text>{{ item && item.F_Name }}</text> | |||
<!-- 编辑模式按钮 --> | |||
<l-button v-if="edit" @click="itemClick(item.F_Id)" | |||
:line="editList.includes(item.F_Id) ? 'red' : 'green'" class="margin-top-sm"> | |||
{{ editList.includes(item.F_Id) ? '移出' : '添加' }} | |||
</l-button> | |||
</view> | |||
</view> | |||
</view> | |||
</template> | |||
</view> | |||
</template> | |||
<script> | |||
import without from 'lodash/without' | |||
import concat from 'lodash/concat' | |||
import keyBy from 'lodash/keyBy' | |||
import mapKeys from 'lodash/mapKeys' | |||
import mapValues from 'lodash/mapValues' | |||
import groupBy from 'lodash/groupBy' | |||
export default { | |||
data() { | |||
return { | |||
allList: [], | |||
myList: [], | |||
editList: [], | |||
searchText: '', | |||
focus: false, | |||
edit: false | |||
} | |||
}, | |||
async onLoad({ search }) { | |||
await this.init(search) | |||
}, | |||
methods: { | |||
// 页面初始化 | |||
async init(search) { | |||
this.focus = !!search | |||
this.LOADING('加载菜单中…') | |||
// 同时发出请求,获取“所有功能按钮列表”和“我的功能按钮列表” | |||
const [allList, myList] = await Promise.all([ | |||
this.HTTP_GET('learun/adms/function/list').then(result => result.data), | |||
this.HTTP_GET('learun/adms/function/mylist') | |||
]) | |||
this.myList = myList.filter(t => allList.find(item => item.F_Id === t)) | |||
this.allList = allList.map(item => { | |||
const icon = item.F_Icon ? item.F_Icon.replace(`iconfont icon-`, ``) : '' | |||
const existsIcon = this.getUiIcons().some(t => t === icon) | |||
return { | |||
...item, | |||
icon: existsIcon ? icon : 'roundright' | |||
} | |||
}) | |||
this.HIDE_LOADING() | |||
}, | |||
// 点击编辑按钮,开启编辑模式 | |||
async editClick() { | |||
if (!this.edit) { | |||
this.editList = [...this.myList] | |||
this.edit = true | |||
return | |||
} | |||
const success = await this.HTTP_POST( | |||
'learun/adms/function/mylist/update', | |||
this.editList.join(','), | |||
'「我的应用」列表更新失败' | |||
) | |||
if (!success) { | |||
this.editList = [...this.myList] | |||
this.edit = false | |||
return | |||
} | |||
this.myList = [...this.editList] | |||
this.edit = false | |||
this.EMIT('home-list-change') | |||
}, | |||
// 获取按钮图标背景色(已在列表中的为橙色,不在的为蓝色) | |||
funcListIconColor(item) { | |||
if (this.edit) { | |||
return this.editList.includes(item.F_Id) ? '#fe955c' : '#62bbff' | |||
} | |||
return this.myList.includes(item.F_Id) ? '#fe955c' : '#62bbff' | |||
}, | |||
// 点击按钮 | |||
funcListClick(item) { | |||
if (item.F_IsSystem === 2) { | |||
this.NAV_TO(`/pages/customapp/list?formId=${item.F_FormId}`, item, true) | |||
return | |||
} | |||
this.NAV_TO(`/pages/${item.F_Url}/list`) | |||
}, | |||
// 取消编辑按钮 | |||
cancelClick() { | |||
this.edit = false | |||
}, | |||
// 我的应用列表:点击移出按钮 | |||
removeClick(id) { | |||
this.editList = without(this.editList, id) | |||
}, | |||
// 编辑模式,功能区点击添加/移除按钮 | |||
itemClick(id) { | |||
if (this.editList.includes(id)) { | |||
this.editList = without(this.editList, id) | |||
return | |||
} | |||
this.editList = concat(this.editList, id) | |||
} | |||
}, | |||
computed: { | |||
// 我的应用列表 | |||
myListDisplay() { | |||
const list = this.edit ? this.editList : this.myList | |||
return list.reduce((list, id) => [...list, this.allList.find(t => t.F_Id === id)], []) | |||
}, | |||
// 获取列表分组 | |||
groupList() { | |||
const typeTable = mapValues(keyBy(Object.values(this.GET_GLOBAL('dataDictionary')?this.GET_GLOBAL('dataDictionary').function:()=>{}), 'value'), 'text') | |||
return mapKeys( | |||
groupBy(this.allList.filter(item => item.F_Name.includes(this.searchText)), 'F_Type'), | |||
(v, k) => typeTable[k] | |||
) | |||
} | |||
} | |||
} | |||
import without from 'lodash/without' | |||
import concat from 'lodash/concat' | |||
import keyBy from 'lodash/keyBy' | |||
import mapKeys from 'lodash/mapKeys' | |||
import mapValues from 'lodash/mapValues' | |||
import groupBy from 'lodash/groupBy' | |||
export default { | |||
data() { | |||
return { | |||
allList: [], | |||
myList: [], | |||
editList: [], | |||
searchText: '', | |||
focus: false, | |||
edit: false | |||
} | |||
}, | |||
async onLoad({ | |||
search | |||
}) { | |||
await this.init(search) | |||
}, | |||
methods: { | |||
// 页面初始化 | |||
async init(search) { | |||
this.focus = !!search | |||
this.LOADING('加载菜单中…') | |||
// 同时发出请求,获取“所有功能按钮列表”和“我的功能按钮列表” | |||
const [allList, myList] = await Promise.all([ | |||
this.HTTP_GET('learun/adms/function/list').then(result => result.data), | |||
this.HTTP_GET('learun/adms/function/mylist') | |||
]) | |||
this.myList = myList.filter(t => allList.find(item => item.F_Id === t)) | |||
this.allList = allList.map(item => { | |||
const icon = item.F_Icon ? item.F_Icon.replace(`iconfont icon-`, ``) : '' | |||
const existsIcon = this.getUiIcons().some(t => t === icon) | |||
return { | |||
...item, | |||
icon: existsIcon ? icon : 'roundright' | |||
} | |||
}) | |||
this.HIDE_LOADING() | |||
}, | |||
// 点击编辑按钮,开启编辑模式 | |||
async editClick() { | |||
if (!this.edit) { | |||
this.editList = [...this.myList] | |||
this.edit = true | |||
return | |||
} | |||
const success = await this.HTTP_POST( | |||
'learun/adms/function/mylist/update', | |||
this.editList.join(','), | |||
'「我的应用」列表更新失败' | |||
) | |||
if (!success) { | |||
this.editList = [...this.myList] | |||
this.edit = false | |||
return | |||
} | |||
this.myList = [...this.editList] | |||
this.edit = false | |||
this.EMIT('home-list-change') | |||
}, | |||
// 获取按钮图标背景色(已在列表中的为橙色,不在的为蓝色) | |||
funcListIconColor(item) { | |||
if (this.edit) { | |||
return this.editList.includes(item.F_Id) ? '#fe955c' : '#62bbff' | |||
} | |||
return this.myList.includes(item.F_Id) ? '#fe955c' : '#62bbff' | |||
}, | |||
// 点击按钮 | |||
funcListClick(item) { | |||
if (item.F_IsSystem === 2) { | |||
this.NAV_TO(`/pages/customapp/list?formId=${item.F_FormId}`, item, true) | |||
return | |||
} | |||
this.NAV_TO(`/pages/${item.F_Url}/list`) | |||
}, | |||
// 取消编辑按钮 | |||
cancelClick() { | |||
this.edit = false | |||
}, | |||
// 我的应用列表:点击移出按钮 | |||
removeClick(id) { | |||
this.editList = without(this.editList, id) | |||
}, | |||
// 编辑模式,功能区点击添加/移除按钮 | |||
itemClick(id) { | |||
if (this.editList.includes(id)) { | |||
this.editList = without(this.editList, id) | |||
return | |||
} | |||
this.editList = concat(this.editList, id) | |||
} | |||
}, | |||
computed: { | |||
// 我的应用列表 | |||
myListDisplay() { | |||
const list = this.edit ? this.editList : this.myList | |||
return list.reduce((list, id) => [...list, this.allList.find(t => t.F_Id === id)], []) | |||
}, | |||
// 获取列表分组 | |||
groupList() { | |||
const typeTable = mapValues(keyBy(Object.values(this.GET_GLOBAL('dataDictionary') ? this.GET_GLOBAL( | |||
'dataDictionary').function : () => {}), 'value'), 'text') | |||
return mapKeys( | |||
groupBy(this.allList.filter(item => item.F_Name.includes(this.searchText)), 'F_Type'), | |||
(v, k) => typeTable[k] | |||
) | |||
} | |||
} | |||
} | |||
</script> | |||
<style lang="less" scoped> | |||
.function-list { | |||
padding-bottom: 0; | |||
.cu-item { | |||
.app-item { | |||
border-radius: 50%; | |||
height: 45px; | |||
width: 45px; | |||
} | |||
} | |||
} | |||
.function-list { | |||
padding-bottom: 0; | |||
.cu-item { | |||
.app-item { | |||
border-radius: 50%; | |||
height: 45px; | |||
width: 45px; | |||
} | |||
} | |||
} | |||
</style> | |||
<style lang="less"> | |||
#more { | |||
.function-list .cu-item text[class*='cuIcon'] { | |||
margin-top: 0 !important; | |||
} | |||
} | |||
page { | |||
padding-top: 100rpx; | |||
} | |||
</style> | |||
#more { | |||
.function-list .cu-item text[class*='cuIcon'] { | |||
margin-top: 0 !important; | |||
} | |||
} | |||
page { | |||
padding-top: 100rpx; | |||
} | |||
</style> |
@@ -0,0 +1,206 @@ | |||
<template> | |||
<view class="internshipReport"> | |||
<u--form labelPosition="left" :model="userInfos" :rules="rules" ref="uForm" labelWidth="100"> | |||
<u-form-item label="学生姓名" prop="StudentName" borderBottom> | |||
<u--input v-model="userInfos.StudentName" border="none" readonly></u--input> | |||
</u-form-item> | |||
<u-form-item label="实习单位" prop="UnitName" borderBottom @click="showUnit= true; hideKeyboard()"> | |||
<u--input v-model="userInfos.UnitName" readonly placeholder="请选择实习单位" border="none" | |||
class="input_event_none" @change="changeHandler"></u--input> | |||
<u-icon slot="right" name="arrow-right"></u-icon> | |||
</u-form-item> | |||
<u-form-item label="实习岗位" prop="PostName" borderBottom @click="postClick"> | |||
<u--input v-model="userInfos.PostName" readonly placeholder="请选择实习岗位" border="none" | |||
class="input_event_none"></u--input> | |||
<u-icon slot="right" name="arrow-right"></u-icon> | |||
</u-form-item> | |||
<u-form-item label="实习时间" prop="ITime" borderBottom> | |||
<u--input v-model="userInfos.ITime" placeholder="请输入实习时间" border="none"></u--input> | |||
</u-form-item> | |||
<u-form-item label="联系方式" prop="Mobile" borderBottom> | |||
<u--input v-model="userInfos.Mobile" border="none" @blur="handleInputCheck" | |||
placeholder="请输入联系方式"></u--input> | |||
</u-form-item> | |||
<u-form-item label="实习内容" prop="IContent" borderBottom> | |||
<u--textarea v-model="userInfos.IContent" placeholder="请输入内容"></u--textarea> | |||
</u-form-item> | |||
</u--form> | |||
<view class="btns"> | |||
<u-button type="primary" text="报名" @click="submit"></u-button> | |||
<u-button type="error" text="重置" @click="clearForm" style="margin-top: 30rpx;"></u-button> | |||
</view> | |||
<u-picker :show="showUnit" :columns="[unitData]" keyName="name" @confirm="confirm" | |||
@cancel="showUnit = false"></u-picker> | |||
<u-picker :show="showPost" :columns="[postData]" keyName="name" @confirm="changeHandler" | |||
@cancel="showPost = false"></u-picker> | |||
</view> | |||
</template> | |||
<script> | |||
export default { | |||
data() { | |||
return { | |||
unitData: [], //单位 | |||
postData: [], //岗位 | |||
showPost: false, | |||
showUnit: false, | |||
show: false, | |||
contentId: null, | |||
userInfos: { | |||
StudentName: '', | |||
UnitName: '', | |||
PostName: '', | |||
Iunit: '', //实习单位编号 | |||
IPost: '', //岗位 | |||
ITime: "", | |||
Mobile: '', | |||
IContent: '' | |||
}, | |||
rules: { | |||
'UnitName': { | |||
type: 'string', | |||
required: true, | |||
message: '请选择实习单位', | |||
trigger: ['change'] | |||
}, | |||
'PostName': { | |||
type: 'string', | |||
required: true, | |||
message: '请选择实习岗位', | |||
trigger: ['change'] | |||
}, | |||
}, | |||
} | |||
}, | |||
onLoad(options) { | |||
// options 中包含了传递过来的参数 | |||
this.contentId = options.id | |||
if (this.contentId) { | |||
this.getDetail() | |||
} | |||
}, | |||
onReady() { | |||
//如果需要兼容微信小程序,并且校验规则中含有方法等,只能通过setRules方法设置规则。 | |||
this.$refs.uForm.setRules(this.rules) | |||
}, | |||
async mounted() { | |||
this.$set(this.userInfos, 'StudentName', this.currentUser.realName) | |||
// 单位 | |||
this.unitData = await this.HTTP_GET('/api/ht/sx/comp') | |||
}, | |||
computed: { | |||
// 当前用户对象 | |||
currentUser() { | |||
return this.GET_GLOBAL('loginUser') | |||
} | |||
}, | |||
methods: { | |||
async getDetail() { | |||
// this.userInfos | |||
let res = await this.HTTP_GET( | |||
'/api/ht/sx/list', | |||
this.contentId | |||
) | |||
if (res && res.length > 0) { | |||
this.userInfos = JSON.parse(JSON.stringify(res[0])) | |||
if (!this.userInfos.StudentName) { | |||
this.$set(this.userInfos, 'StudentName', this.currentUser.realName) | |||
} | |||
} | |||
}, | |||
async confirm(e) { | |||
this.$set(this.userInfos, 'UnitName', e.value[0].name) | |||
if (this.userInfos.Iunit != e.value[0].id) { | |||
this.userInfos.Iunit = e.value[0].id; | |||
this.postData = await this.HTTP_GET('/api/ht/sx/pos', this.userInfos.Iunit) | |||
} | |||
this.showUnit = false; | |||
}, | |||
// 岗位 | |||
async changeHandler(e) { | |||
this.$set(this.userInfos, 'PostName', e.value[0].name) | |||
this.userInfos.IPost = e.value[0].id; | |||
this.showPost = false; | |||
}, | |||
postClick() { | |||
if (!this.userInfos.Iunit) { | |||
return uni.showToast({ | |||
title: '请选择实习单位!', | |||
duration: 2000, | |||
icon: 'none' | |||
}); | |||
} | |||
this.showPost = true; | |||
hideKeyboard() | |||
}, | |||
handleInputCheck() { | |||
if (!this.userInfos.Mobile && !/^1\d{10}$/.test(this.userInfos.Mobile)) { | |||
return uni.showToast({ | |||
title: '请输入正确的联系方式', | |||
duration: 2000, | |||
icon: 'none' | |||
}); | |||
} | |||
}, | |||
async submit() { | |||
this.$refs.uForm.validate().then(res => { | |||
let params = JSON.parse(JSON.stringify(this.userInfos)) | |||
if (this.contentId) { | |||
params.ID = this.contentId | |||
} | |||
this.HTTP_POST('/api/ht/sx/bm', { | |||
StudentID: this.currentUser.account, | |||
...params | |||
}).then(resp => { | |||
uni.showToast({ | |||
title: '报名成功', | |||
duration: 2000, | |||
icon: 'none' | |||
}); | |||
uni.navigateTo({ | |||
url: '/pages/internshipReport/list' | |||
}) | |||
}).catch(err => { | |||
uni.showToast({ | |||
title: '报名失败', | |||
duration: 2000, | |||
icon: 'none' | |||
}); | |||
}) | |||
}).catch(errors => { | |||
// uni.$u.toast('校验失败') | |||
}) | |||
}, | |||
clearForm() { | |||
for (let key in this.userInfos) { | |||
if (!['StudentName', 'ID'].includes(key)) { | |||
this.$set(this.userInfos, key, '') | |||
} | |||
} | |||
} | |||
} | |||
} | |||
</script> | |||
<style lang="scss" scoped> | |||
.internshipReport { | |||
padding: 24rpx; | |||
background-color: #fff; | |||
box-sizing: border-box; | |||
.btns { | |||
margin-top: 100rpx; | |||
} | |||
} | |||
:deep(.uni-input-input) { | |||
pointer-events: none | |||
} | |||
</style> |
@@ -0,0 +1,57 @@ | |||
<template> | |||
<view class="internshipReport"> | |||
<uni-list> | |||
<!-- <uni-list-item v-for="item in list" ellipsis="1" showArrow clickable title="供需见面会主题" note="北京全江科技责任有限公司" | |||
rightText="2024-12-24 11:01" type="line" @click="jump(item)"> | |||
</uni-list-item> --> | |||
<uni-list-item v-for="item in list" ellipsis="1" showArrow clickable :title="item.UnitName" | |||
:note="`岗位:${item.PostName}`" type="line" @click="jump(item.ID)"> | |||
</uni-list-item> | |||
</uni-list> | |||
<view class="addBTn" @click="jump('')"> | |||
<u-icon name="plus-circle-fill" color="#2979ff" size="58"></u-icon> | |||
</view> | |||
</view> | |||
</template> | |||
<script> | |||
export default { | |||
data() { | |||
return { | |||
list: [] | |||
} | |||
}, | |||
async mounted() { | |||
await this.init() | |||
}, | |||
methods: { | |||
jump(data) { | |||
uni.navigateTo({ | |||
url: '/pages/internshipReport/detail?id=' + data | |||
}) | |||
}, | |||
async init() { | |||
this.list = await this.HTTP_GET( | |||
'/api/ht/sx/list' | |||
) | |||
console.log(this.list, "........"); | |||
} | |||
} | |||
} | |||
</script> | |||
<style lang="scss" scoped> | |||
.internshipReport { | |||
.addBTn { | |||
position: fixed; | |||
bottom: 100rpx; | |||
right: 50rpx; | |||
} | |||
} | |||
</style> |
@@ -70,6 +70,7 @@ | |||
export default { | |||
data() { | |||
return { | |||
casloginUrl: 'http://authserver.htpt.edu.cn/authserver/login', | |||
username: '', | |||
password: '', | |||
ready: false, | |||
@@ -87,28 +88,50 @@ | |||
async onLoad() { | |||
await this.init() | |||
}, | |||
onShow() { | |||
this.getCasLoginInfo() | |||
}, | |||
watch: { | |||
//监听显示高度 | |||
showHeight:function() { | |||
if(this.docmHeight > this.showHeight){ | |||
//隐藏 | |||
this.hideshow=false | |||
}else{ | |||
//显示 | |||
this.hideshow=true | |||
} | |||
} | |||
//监听显示高度 | |||
showHeight: function() { | |||
if (this.docmHeight > this.showHeight) { | |||
//隐藏 | |||
this.hideshow = false | |||
} else { | |||
//显示 | |||
this.hideshow = true | |||
} | |||
} | |||
}, | |||
mounted() { | |||
//监听事件 | |||
window.onresize = ()=>{ | |||
return(()=>{ | |||
this.showHeight = document.documentElement.clientHeight || document.body.clientHeight; | |||
})() | |||
} | |||
window.onresize = () => { | |||
return (() => { | |||
this.showHeight = document.documentElement.clientHeight || document.body.clientHeight; | |||
})() | |||
} | |||
}, | |||
methods: { | |||
async getCasLoginInfo() { | |||
const url = new URL(window.location.href); | |||
const params = new URLSearchParams(url.search); | |||
const ticket = params.get('ticket'); | |||
if (ticket) { | |||
let postResult = await this.POST('/api/ht/ticket', { | |||
ticket, | |||
}) | |||
if (postResult[1].data.code == '200') { | |||
loginResult = postResult[1].data.data; | |||
} else { | |||
this.TOAST(postResult[1].data.info); | |||
} | |||
} else { | |||
let url = encodeURIComponent('http://sxjy.htpt.edu.cn:8000') | |||
window.location.href = this.casloginUrl + "?service=" + url | |||
} | |||
}, | |||
// 页面初始化 | |||
async init() { | |||
const index = this.DEV ? this.CONFIG('devApiHostIndex') : this.CONFIG('prodApiHostIndex') | |||
@@ -365,4 +388,4 @@ | |||
/* #endif */ | |||
} | |||
} | |||
</style> | |||
</style> |
@@ -0,0 +1,80 @@ | |||
<template> | |||
<view class="meetingStyle"> | |||
<u--form labelPosition="left" :model="userInfos" :rules="rules" ref="uForm" labelWidth="100"> | |||
<u-form-item label="主题" prop="name" borderBottom ref="item1"> | |||
<u--input v-model="userInfos.name" border="none" readonly></u--input> | |||
</u-form-item> | |||
<u-form-item label="场地" prop="phone" borderBottom ref="item2"> | |||
<u--input v-model="userInfos.phone" border="none" readonly></u--input> | |||
</u-form-item> | |||
<u-form-item label="时间" prop="phone" borderBottom ref="item2"> | |||
<u--input v-model="userInfos.phone" border="none" readonly></u--input> | |||
</u-form-item> | |||
<u-form-item label="单位名称" prop="title" borderBottom ref="item2"> | |||
<u--input v-model="userInfos.phone" border="none" readonly></u--input> | |||
</u-form-item> | |||
<u-form-item label="参与人员" prop="content" borderBottom ref="item3"> | |||
<u--textarea v-model="userInfos.content" placeholder="请输入内容" autoHeight disabled | |||
border="none"></u--textarea> | |||
</u-form-item> | |||
</u--form> | |||
</view> | |||
</template> | |||
<script> | |||
export default { | |||
data() { | |||
return { | |||
showSex: false, | |||
userInfos: { | |||
name: 'uView UI', | |||
sex: '', | |||
title: '实行报告', | |||
phone: '15535656589', | |||
content: '' | |||
}, | |||
actions: [{ | |||
name: '男', | |||
}, | |||
{ | |||
name: '女', | |||
}, | |||
{ | |||
name: '保密', | |||
}, | |||
], | |||
rules: { | |||
'name': { | |||
type: 'string', | |||
required: true, | |||
message: '请填写姓名', | |||
trigger: ['blur', 'change'] | |||
}, | |||
'sex': { | |||
type: 'string', | |||
max: 1, | |||
required: true, | |||
message: '请选择男或女', | |||
trigger: ['blur', 'change'] | |||
}, | |||
}, | |||
radio: '', | |||
switchVal: false | |||
} | |||
}, | |||
methods: { | |||
} | |||
} | |||
</script> | |||
<style lang="scss"> | |||
.meetingStyle { | |||
padding: 24rpx; | |||
background-color: #fff; | |||
box-sizing: border-box; | |||
} | |||
</style> |
@@ -0,0 +1,33 @@ | |||
<template> | |||
<view> | |||
<uni-list> | |||
<uni-list-item v-for="item in 100" ellipsis="1" showArrow clickable | |||
thumb="https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/unicloudlogo.png" thumb-size="lg" | |||
title="供需见面会主题" note="北京全江科技责任有限公司" rightText="2024-12-24 11:01" type="line" @click="jump"> | |||
</uni-list-item> | |||
</uni-list> | |||
</view> | |||
</template> | |||
<script> | |||
export default { | |||
data() { | |||
return { | |||
list: [] | |||
} | |||
}, | |||
methods: { | |||
jump() { | |||
uni.navigateTo({ | |||
url: '/pages/meeting/detail' | |||
}) | |||
} | |||
} | |||
} | |||
</script> | |||
<style> | |||
</style> |
@@ -59,4 +59,5 @@ $uni-font-size-title:40upx; | |||
$uni-color-subtitle: #555555; // 二级标题颜色 | |||
$uni-font-size-subtitle:36upx; | |||
$uni-color-paragraph: #3F536E; // 文章段落颜色 | |||
$uni-font-size-paragraph:30upx; | |||
$uni-font-size-paragraph:30upx; | |||
@import '@/uni_modules/uview-ui/theme.scss'; |