unknown
9 months ago
26 changed files with 614 additions and 311 deletions
-
6common/js/mixins.js
-
4components/user-info/user-info.vue
-
136config/api - 副本.js
-
128config/api.js
-
2config/site.config.js
-
2manifest.json
-
2pages.json
-
40pages/login/comp/privacyRadion.vue
-
263pages/login/login - 副本.vue
-
231pages/login/login.vue
-
43pages/login/privacyAgreement/privacyAgreement.vue
-
2pages/recordEntry/operate/mySchedule/comp/mySchedulePopup.vue
-
4pages/recordEntry/operate/mySchedule/comp/pickDateTimer/pickDateTimer.vue
-
2pages/recordEntry/operate/mySchedule/plan/plan.vue
-
15pages/recordEntry/operate/todayStudent/todayStudent.vue
-
4pages/tabbar/examSimulation/comp/simulation.vue
-
17pages/tabbar/mine/index.vue
-
2pages/tabbar/statistics/comp/examinCoach.vue
-
4pages/tabbar/statistics/comp/principal.vue
-
4pages/tabbar/statistics/comp/topUserInfo.vue
-
1pages/tabbar/statistics/index.vue
-
2pages/userCenter/myCar/myCar.vue
-
2pages/userCenter/myCar/notBound/notBound.vue
-
3pages/userCenter/personaInfo/personaInfo.vue
-
4pages/userCenter/scanCode/scanCode - 副本.vue
-
2store/modules/user.js
@ -0,0 +1,136 @@ |
|||||
|
|
||||
|
|
||||
|
var http = uni.$u.http |
||||
|
|
||||
|
// 隐私政策
|
||||
|
export const getAgreement = (params, config = {}) => http.post('/util/manage/getAgreement.do', params, config) |
||||
|
// 验证码登录
|
||||
|
export const loginPwd = (data) => http.post('system/auth/login', data, { custom: { noToken: true , 'Tenant-Id': data['Tenant-Id']}}) |
||||
|
// 获取个人信息
|
||||
|
export const getUserInfo = (data) => http.post('member/user/get', {header: {'contentType': 1}}) |
||||
|
// 退出登录
|
||||
|
export const logOut = (data={}) => http.post('member/auth/logout', data, { custom: { noToken: true }}) |
||||
|
// 驾校列表分页
|
||||
|
export const schoolPage = (params) => http.get('business/school/page', {params: params}) |
||||
|
// 获得租户分页
|
||||
|
export const tenantPage = (params) => http.get('system/tenant/pages', {params: params, custom: { noToken: true }}) |
||||
|
// 实操预约记录分页
|
||||
|
export const bookingMasterPage = (params) => http.get('business/booking/master/page', {params: params, header: {'contentType': 3} }) |
||||
|
// 实操预约详情
|
||||
|
export const bookingMasterDetail = (params) => http.get('business/booking/master/get', {params: params, header: {'contentType': 3} }) |
||||
|
// 获得我的排课详情
|
||||
|
export const scheduleClassGetById = (params) => http.get('business/booking/schedule-class/getById', {params: params, }) |
||||
|
// 获得我的排课详情预约记录
|
||||
|
export const getBookingDetailByClassId = (params) => http.get('business/booking/master/getBookingDetailByClassId', {params: params, }) |
||||
|
// 获得排课
|
||||
|
export const scheduleClassGet = (params) => http.get('business/booking/schedule-class/get', {params: params, }) |
||||
|
// 发布排课计划
|
||||
|
export const scheduleClassCreate = (data) => http.post('business/booking/schedule-class/create', data) |
||||
|
// 根据时间段发布排课计划
|
||||
|
export const scheduleClassCreateByTime = (data) => http.post('business/booking/schedule-class/createByTime', data) |
||||
|
// 获取排课日期范围
|
||||
|
export const getClassDateLimit = (params) => http.get('business/booking/global-config/getClassDateLimit', {params} ,) |
||||
|
// 获取排课时间段范围
|
||||
|
export const getClassTimeLimt = (params) => http.get('business/booking/global-config/getClassTimeLimt', {params} ,) |
||||
|
// 创建排课模板
|
||||
|
export const getClassCreate = (data) => http.post('business/booking/schedule-template/create', data ,) |
||||
|
// 排课模板分页
|
||||
|
export const scheduleTemplatePage = (params) => http.get('business/booking/schedule-template/page', {params} ,) |
||||
|
// 更新排课模版
|
||||
|
export const scheduleTemplateUpdate = (data) => http.put('business/booking/schedule-template/update', data ,) |
||||
|
// 获取排课模版
|
||||
|
export const scheduleTemplateGet = (params) => http.get('business/booking/schedule-template/get', {params} ,) |
||||
|
// 训练场地
|
||||
|
export const trainingSiteList = (params) => http.get('business/training-site/list', {params} ,) |
||||
|
// 获得考场模拟预约记录分页
|
||||
|
export const examSimulationPages = (params) => http.get('business/exam-simulation-record/page', {params} ,) |
||||
|
// 已报名学员
|
||||
|
export const studentRecordPage = (params) => http.get('business/student-record/page', {params} ,) |
||||
|
// 驾校班型
|
||||
|
export const schoolClass = (params) => http.get('business/school-class/getSchoolByClass', {params} ,) |
||||
|
// 获得学员档案记录
|
||||
|
export const studentDetail = (params) => http.get('business/student-record/getStudent', {params} ,) |
||||
|
// 获得教练车信息分页
|
||||
|
export const carPage = (params) => http.get('business/car/page', {params} ,) |
||||
|
// 驾校场地分页
|
||||
|
export const sitePage = (params) => http.get('business/training-site/page', {params} ,) |
||||
|
// 驾校教练分页
|
||||
|
export const coachPage = (params) => http.get('business/coach/page', {params}) |
||||
|
// 驾校教练详情
|
||||
|
export const coachDetail = (params) => http.get('business/coach/get', {params}) |
||||
|
// 教练评价列表分页
|
||||
|
export const coachCommentPage = (params) => http.get('app/coach-comment/pageCoachComment', {params}) |
||||
|
// 获得教练员评价条数
|
||||
|
export const pageCoachCommentTotal = (params) => http.get('app/coach-comment/pageCoachCommentTotal', {params}) |
||||
|
// 获得驾校评价
|
||||
|
export const schoolCommentPage = (params) => http.get('business/school-comment/page', {params}) |
||||
|
// 获取驾校评价条数
|
||||
|
export const commentPagetotal = (params) => http.get('business/school-comment/pagetotal', { params }) |
||||
|
// 修改用户密码
|
||||
|
export const updatePassword = (data) => http.put('system/user/profile/update-password', data) |
||||
|
// 获得考场分页
|
||||
|
export const simulationPage = (params) => http.get('business/booking/simulation-record/page', {params}) |
||||
|
// 获得考场列分页
|
||||
|
export const businessSitePage = (params) => http.get('business/site/page', {params}) |
||||
|
// 教练绑定教练车
|
||||
|
export const coachBinding = (data) => http.post('business/coach/binding', data) |
||||
|
// 取消绑定教练车
|
||||
|
export const coachUnbinding = (data) => http.put('business/coach/unbinding', data) |
||||
|
// 获得考场车辆管理分页
|
||||
|
export const siteCarPage = (params) => http.get('business/site-car/page', {params}) |
||||
|
// 我的学员(累计学员、今日新增学员、等)
|
||||
|
export const studentOwner = (params) => http.get('business/student-record/owner', {params}) |
||||
|
// 获得学员档案记录列表
|
||||
|
export const studentList = (params) => http.get('business/student-record/page', {params}) |
||||
|
// 绑定教练
|
||||
|
export const studentBindCoach = (data) => http.post('business/student-record/bindCoach', data) |
||||
|
// 教练二维码生成
|
||||
|
export const getQR = (data) => http.post('business/coach/sign/getQR', data) |
||||
|
// 获取学习中的学员
|
||||
|
export const signStudentList = (data) => http.post('business/coach/sign/studentList', data) |
||||
|
// 切换学员计时
|
||||
|
export const changeStudent = (data) => http.post('business/coach/sign/changeStudent', data) |
||||
|
|
||||
|
export const getLoginCode = (data) => http.post('member/auth/send-sms-code', data, { custom: { noToken: true, catch: true,}}) |
||||
|
// 驾校教练使用手机 + 验证码登录
|
||||
|
export const coachSmsLogin = (data) => http.post('member/auth/coach_sms-login', data, { custom: { noToken: true, catch: true,}}) |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
128
config/api.js
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,40 @@ |
|||||
|
<template> |
||||
|
<view class="radioWrap"> |
||||
|
<u-checkbox-group > |
||||
|
<u-checkbox :checked="isCheck" shape="circle" label="已阅读并同意" :labelSize="12" @change="changeRadio">已阅读并同意</u-checkbox> |
||||
|
</u-checkbox-group> |
||||
|
<view class="privacyText"> |
||||
|
<text @click="goPage(2)">《用户协议》</text>和 <text @click="goPage(1)">《隐私协议》</text> |
||||
|
</view> |
||||
|
</view> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
export default { |
||||
|
props: ['isCheck'], |
||||
|
methods: { |
||||
|
changeRadio(val) { |
||||
|
console.log(val) |
||||
|
this.$emit('changeRadio', val) |
||||
|
}, |
||||
|
async goPage(type) { |
||||
|
this.$goPage('/pages/userCenter/login/privacyAgreement/privacyAgreement?type='+ type) |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
} |
||||
|
</script> |
||||
|
|
||||
|
<style lang="scss" scoped> |
||||
|
.radioWrap { |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
.privacyText { |
||||
|
font-size: 24rpx; |
||||
|
color: #888E94; |
||||
|
text { |
||||
|
color: $themC; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
</style> |
@ -0,0 +1,263 @@ |
|||||
|
<template> |
||||
|
<view class="main"> |
||||
|
<view class="u-back-top"> |
||||
|
<view class="backBox"> |
||||
|
<u-icon name="arrow-left" color="#333" size="28"></u-icon> |
||||
|
</view> |
||||
|
</view> |
||||
|
<view class="title"> |
||||
|
<image :src="imgUrl" mode=""></image> |
||||
|
</view> |
||||
|
<view class="form"> |
||||
|
<view class="form-item" @click="tenantClick"> |
||||
|
<mySelect :value="FormData.tenantName" placeholder="请选择服务地区"/> |
||||
|
</view> |
||||
|
<view class="form-item"> |
||||
|
<view class="inputBox my"> |
||||
|
<u--input placeholder="请输入登录账号" border="none" clearable v-model="FormData.username"></u--input> |
||||
|
</view> |
||||
|
</view> |
||||
|
<view class="form-item"> |
||||
|
<view class="inputBox my"> |
||||
|
<u--input placeholder="请输入密码" border="none" clearable style="height: 100%;" :clearable="false" v-model="FormData.password"></u--input> |
||||
|
</view> |
||||
|
</view> |
||||
|
<view class="forgetTps"> <text @click="$u.toast('请联系管理员重置密码!')">忘记密码</text></view> |
||||
|
<view class="loginBtn" :class="{active: btnHighlight}" @click="submitFn">登 录</view> |
||||
|
<!-- <view class="radioWrap"> |
||||
|
<u-checkbox-group > |
||||
|
<u-checkbox v-model="isCheck" shape="circle" label="已阅读并同意" :labelSize="12" ></u-checkbox> |
||||
|
</u-checkbox-group> |
||||
|
<view class="privacyText"> |
||||
|
<text>《用户协议》</text>和 <text>《隐私协议》</text> |
||||
|
</view> |
||||
|
</view> --> |
||||
|
</view> |
||||
|
<u-picker :show="show" :columns="columnsArea" keyName="name" @confirm="confirmArea" @cancel="show=false" @close="show=false"></u-picker> |
||||
|
<u-action-sheet :actions="list" :title="title" :show="showRole" @select="selectClick" ></u-action-sheet> |
||||
|
</view> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
import { loginPwd, tenantPage } from '@/config/api.js' |
||||
|
import { imgUrl } from '@/config/site.config.js' |
||||
|
export default { |
||||
|
data() { |
||||
|
return { |
||||
|
isCheck: false, |
||||
|
codeText: '获取验证码', |
||||
|
FormData: { |
||||
|
username: '', |
||||
|
password: '', |
||||
|
tenantName: '' |
||||
|
}, |
||||
|
imgUrl: imgUrl+'loginTitle.png', |
||||
|
codeOn: false, |
||||
|
show: false, |
||||
|
columnsArea: [], |
||||
|
list: [], |
||||
|
title: '请选择您要登录的角色', |
||||
|
showRole: false, |
||||
|
roleObj: {} |
||||
|
} |
||||
|
}, |
||||
|
onLoad() { |
||||
|
this.tenantPageFn() |
||||
|
this.roleObj = this.$store.state.user.vuex_role |
||||
|
}, |
||||
|
onPullDownRefresh() { |
||||
|
this.tenantPageFn() |
||||
|
}, |
||||
|
computed: { |
||||
|
|
||||
|
btnHighlight() { |
||||
|
let { FormData } = this |
||||
|
return FormData.username.length>3&&FormData.password.length>3&&FormData.tenantName |
||||
|
} |
||||
|
}, |
||||
|
methods: { |
||||
|
tenantClick() { |
||||
|
if(!this.columnsArea.length) return this.$u.toast('没有获得服务地区,请下拉刷新重新加载') |
||||
|
this.show = true |
||||
|
}, |
||||
|
selectClick(item) { |
||||
|
this.showRole = false |
||||
|
this.chooseIdentity(item.name) |
||||
|
// alert(item.name) |
||||
|
}, |
||||
|
chooseIdentity(name) { |
||||
|
let url = '/pages/tabbar/statistics/index' |
||||
|
this.$store.commit('upDateIdentity', name) |
||||
|
if(name=='实操教练') { |
||||
|
url = '/pages/tabbar/student/index' |
||||
|
}else if(name=='模拟器老师') { |
||||
|
url = '/pages/tabbar/examSimulation/index' |
||||
|
} |
||||
|
uni.reLaunch({ |
||||
|
url |
||||
|
}) |
||||
|
}, |
||||
|
confirmArea(val) { |
||||
|
let item = val.value[0] |
||||
|
this.FormData.tenantName =item.name |
||||
|
this.$store.commit('upDateTenantId', item.id) |
||||
|
this.show = false |
||||
|
}, |
||||
|
async tenantPageFn() { |
||||
|
let obj = { |
||||
|
pageNo: 1, |
||||
|
pageSize: 100, |
||||
|
status: 0 |
||||
|
} |
||||
|
const {data: res} = await tenantPage(obj) |
||||
|
this.columnsArea = [res.list] |
||||
|
console.log(res) |
||||
|
}, |
||||
|
// 是否选择协议 |
||||
|
groupChangeEnvnt(e) { |
||||
|
this.isCheck = e.value |
||||
|
console.log('是否选择协议', this.isCheck) |
||||
|
}, |
||||
|
// 发送短信验证码 |
||||
|
async goSms() { |
||||
|
const { |
||||
|
FormData |
||||
|
} = this |
||||
|
if (!FormData.phone) return this.$u.toast('请输入手机号'); |
||||
|
if (!this.isPhone) return this.$u.toast('手机号格式有误'); |
||||
|
if (this.codeOn) return |
||||
|
const data = await getLoginCode({ |
||||
|
codeType: 1, |
||||
|
phone: FormData.phone, |
||||
|
}) |
||||
|
console.log(data) |
||||
|
// 获取验证码 |
||||
|
var time = 60; |
||||
|
var timer = setInterval(() => { |
||||
|
time--; |
||||
|
this.codeText = time + "秒后重新发送" |
||||
|
this.codeOn = true; |
||||
|
if (time == 0) { |
||||
|
clearInterval(timer); |
||||
|
this.codeText = "获取验证码"; |
||||
|
this.codeOn = false; |
||||
|
} |
||||
|
}, 1000); |
||||
|
}, |
||||
|
|
||||
|
async submitFn() { |
||||
|
// return |
||||
|
if(!this.btnHighlight) return |
||||
|
const {data: res} = await loginPwd(this.FormData) |
||||
|
this.$store.commit('update_vuex_loginInfo', res) |
||||
|
// this.chooseIdentity('实操教练') |
||||
|
// return |
||||
|
await this.$store.dispatch('getUserInfo') |
||||
|
|
||||
|
console.log(this.role) |
||||
|
this.list = [] |
||||
|
this.role.forEach((item)=>{ |
||||
|
let obj = { |
||||
|
name: this.roleObj[item] |
||||
|
} |
||||
|
this.list.push(obj) |
||||
|
}) |
||||
|
if(this.list.length>1) { |
||||
|
this.showRole = true |
||||
|
}else { |
||||
|
this.chooseIdentity(this.list[0].name) |
||||
|
} |
||||
|
console.log(this.list) |
||||
|
|
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
</script> |
||||
|
|
||||
|
<style lang="scss" scoped> |
||||
|
|
||||
|
.main { |
||||
|
width: 100%; |
||||
|
min-height: 100vh; |
||||
|
// background: url('http://192.168.1.20:81/zhili/image/20230922/f5e2cfaf05f441c1b9f897e7dc284f1d.png') no-repeat; |
||||
|
// background-size: 100% 360rpx; |
||||
|
.u-back-top { |
||||
|
padding: 32rpx 0 0 0; |
||||
|
.backBox { |
||||
|
padding: 24rpx; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.title { |
||||
|
width: 658rpx; |
||||
|
height: 94rpx; |
||||
|
margin: 100rpx auto 100rpx auto; |
||||
|
} |
||||
|
|
||||
|
.form { |
||||
|
padding: 0 46rpx; |
||||
|
.form-item { |
||||
|
height: 112rpx; |
||||
|
background: #F4F7FF; |
||||
|
border-radius: 16rpx; |
||||
|
width: 100%; |
||||
|
line-height: 112rpx; |
||||
|
display: flex; |
||||
|
margin-bottom: 40rpx; |
||||
|
padding: 0 40rpx; |
||||
|
.prefix { |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
font-size: 32rpx; |
||||
|
color: #333; |
||||
|
font-weight: 600; |
||||
|
} |
||||
|
|
||||
|
.inputBox { |
||||
|
flex: 1; |
||||
|
} |
||||
|
.code { |
||||
|
color: #BBBBBB; |
||||
|
margin-left: 30rpx; |
||||
|
&.active { |
||||
|
color: $themC |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
.forgetTps { |
||||
|
font-size: 28rpx; |
||||
|
color: $themC; |
||||
|
margin-top: -20rpx; |
||||
|
text-align: right; |
||||
|
} |
||||
|
.loginBtn { |
||||
|
width: 100%; |
||||
|
height: 112rpx; |
||||
|
background: rgba(25,137,250,0.3); |
||||
|
border-radius: 16rpx; |
||||
|
text-align: center; |
||||
|
line-height: 112rpx; |
||||
|
font-size: 32rpx; |
||||
|
font-weight: 600; |
||||
|
color: #fff; |
||||
|
margin-top: 100rpx; |
||||
|
&.active { |
||||
|
background: rgba(25,137,250,1); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.radioWrap { |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
margin-top: 40rpx; |
||||
|
.privacyText { |
||||
|
font-size: 24rpx; |
||||
|
color: #888E94; |
||||
|
text { |
||||
|
color: $themC; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
</style> |
@ -0,0 +1,43 @@ |
|||||
|
<template> |
||||
|
<view class="main"> |
||||
|
<web-view :src="url"></web-view> |
||||
|
</view> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
import { getAgreement } from '@/config/api.js' |
||||
|
export default { |
||||
|
data() { |
||||
|
return { |
||||
|
type: 1, |
||||
|
url: '' |
||||
|
} |
||||
|
}, |
||||
|
onLoad(options) { |
||||
|
this.type = options.type |
||||
|
if(this.type==1) { |
||||
|
uni.setNavigationBarTitle({ |
||||
|
title: '隐私政策' |
||||
|
}) |
||||
|
}else { |
||||
|
uni.setNavigationBarTitle({ |
||||
|
title: '用户使用协议' |
||||
|
}) |
||||
|
} |
||||
|
this.getAgreementFn() |
||||
|
}, |
||||
|
methods: { |
||||
|
async getAgreementFn() { |
||||
|
const {data: res} = await getAgreement() |
||||
|
if(this.type==1) { |
||||
|
this.url = res.privacyAgreementUrl |
||||
|
}else { |
||||
|
this.url = res.useAgreementUrl |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
</script> |
||||
|
|
||||
|
<style> |
||||
|
</style> |
Write
Preview
Loading…
Cancel
Save
Reference in new issue