Browse Source

111

和田中职
suyanyan 1 week ago
parent
commit
e9f9d60a6b
25 changed files with 3364 additions and 1441 deletions
  1. +10
    -5
      Learun.Framework.Ultimate V7/LearunApp-2.2.0/App.vue
  2. +106
    -105
      Learun.Framework.Ultimate V7/LearunApp-2.2.0/components/tabbar/tabbar.vue
  3. +75
    -73
      Learun.Framework.Ultimate V7/LearunApp-2.2.0/config.js
  4. +31
    -25
      Learun.Framework.Ultimate V7/LearunApp-2.2.0/index.html
  5. +9
    -3
      Learun.Framework.Ultimate V7/LearunApp-2.2.0/main.js
  6. +195
    -191
      Learun.Framework.Ultimate V7/LearunApp-2.2.0/manifest.json
  7. +18
    -18
      Learun.Framework.Ultimate V7/LearunApp-2.2.0/package.json
  8. +53
    -2
      Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages.json
  9. +67
    -0
      Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/InternshipResults/list.vue
  10. +123
    -0
      Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/InternshipSummary/list.vue
  11. +22
    -0
      Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/TalentDemand/list.vue
  12. +220
    -0
      Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/clockIn/baidu/index.vue
  13. +277
    -0
      Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/clockIn/gd/index.vue
  14. +294
    -0
      Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/clockIn/list.vue
  15. +32
    -0
      Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/clockIn/tx/index-tx-iframe.vue
  16. +228
    -0
      Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/clockIn/tx/tx-iframe-all.vue
  17. +231
    -0
      Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/clockIn/tx/tx-script-all.vue
  18. +743
    -776
      Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/home.vue
  19. +212
    -225
      Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/home/more.vue
  20. +206
    -0
      Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/internshipReport/detail.vue
  21. +57
    -0
      Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/internshipReport/list.vue
  22. +40
    -17
      Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/login.vue
  23. +80
    -0
      Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/meeting/detail.vue
  24. +33
    -0
      Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/meeting/list.vue
  25. +2
    -1
      Learun.Framework.Ultimate V7/LearunApp-2.2.0/uni.scss

+ 10
- 5
Learun.Framework.Ultimate V7/LearunApp-2.2.0/App.vue View File

@@ -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>

+ 106
- 105
Learun.Framework.Ultimate V7/LearunApp-2.2.0/components/tabbar/tabbar.vue View File

@@ -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>

+ 75
- 73
Learun.Framework.Ultimate V7/LearunApp-2.2.0/config.js View File

@@ -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
}
}
}

+ 31
- 25
Learun.Framework.Ultimate V7/LearunApp-2.2.0/index.html View File

@@ -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>

+ 9
- 3
Learun.Framework.Ultimate V7/LearunApp-2.2.0/main.js View File

@@ -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()

+ 195
- 191
Learun.Framework.Ultimate V7/LearunApp-2.2.0/manifest.json View File

@@ -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
}
}

+ 18
- 18
Learun.Framework.Ultimate V7/LearunApp-2.2.0/package.json View File

@@ -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
}
}
}
}
}

+ 53
- 2
Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages.json View File

@@ -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 @@
// }
// ]
// }
// }
// }

+ 67
- 0
Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/InternshipResults/list.vue View File

@@ -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>

+ 123
- 0
Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/InternshipSummary/list.vue View File

@@ -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>

+ 22
- 0
Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/TalentDemand/list.vue View File

@@ -0,0 +1,22 @@
<template>
<view>
</view>
</template>

<script>
export default {
data() {
return {
}
},
methods: {
}
}
</script>

<style>

</style>

+ 220
- 0
Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/clockIn/baidu/index.vue View File

@@ -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>

+ 277
- 0
Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/clockIn/gd/index.vue View File

@@ -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>

+ 294
- 0
Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/clockIn/list.vue View File

@@ -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>

+ 32
- 0
Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/clockIn/tx/index-tx-iframe.vue View File

@@ -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>

+ 228
- 0
Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/clockIn/tx/tx-iframe-all.vue View File

@@ -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>

+ 231
- 0
Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/clockIn/tx/tx-script-all.vue View File

@@ -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>

+ 743
- 776
Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/home.vue
File diff suppressed because it is too large
View File


+ 212
- 225
Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/home/more.vue View File

@@ -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>

+ 206
- 0
Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/internshipReport/detail.vue View File

@@ -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>

+ 57
- 0
Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/internshipReport/list.vue View File

@@ -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>

+ 40
- 17
Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/login.vue View File

@@ -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>

+ 80
- 0
Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/meeting/detail.vue View File

@@ -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>

+ 33
- 0
Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/meeting/list.vue View File

@@ -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>

+ 2
- 1
Learun.Framework.Ultimate V7/LearunApp-2.2.0/uni.scss View File

@@ -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';

Loading…
Cancel
Save