master
xy 1 year ago
parent 0a63972a72
commit 0905bfc811

@ -3,8 +3,36 @@
globalData: {
navbarHeight: 44,
},
onLaunch: function() {
onLaunch: async function() {
this.globalData.navbarHeight = uni.getSystemInfoSync().safeArea.top
uni.login({
provider: 'weixin', //使
success: async (loginRes) => {
try {
const {token} = await this.$u.api.appletLogin({
code: loginRes.code
})
this.$u.vuex('vuex_token', token)
const { user } = await this.$u.api.getUserInfo()
this.$u.vuex('vuex_user', user)
} catch (err) {
console.error(err)
}
},
fail:err => {
console.log(err)
}
});
// const token = this.vuex_token ? this.vuex_token : uni.getStorageSync('lifeData')?.vuex_token;
// if (token) {
// try {
// const { user } = await this.$u.api.getUserInfo()
// this.$u.vuex('vuex_user', user)
// } catch (err) {
// console.error(err)
// }
// }
},
onShow: function() {
},

@ -1,17 +1,17 @@
const mode = 'devOnline'; //devLocal本地测试、devOnline线上测试、production生产环境
const mode = 'devLocal'; //devLocal本地测试、devOnline线上测试、production生产环境
let ROOTPATH = ''; //域名
switch (mode) {
case 'devLocal':
ROOTPATH = "http://192.168.2.5:61111"
ROOTPATH = "https://zhiyuan-test.ali251.langye.net"
break;
case 'devOnline':
ROOTPATH = "https://xxxxx.cn"
ROOTPATH = "https://zhiyuan-test.ali251.langye.net"
break;
case 'production':
ROOTPATH = "https://xxxxx.cn"
ROOTPATH = "http://zhiyuan-test.ali251.langye.net"
break;
default:
throw new Error('未配置环境');
console.log(`未配置环境`);
}
export { ROOTPATH }
export { ROOTPATH }

@ -2,15 +2,40 @@
let apiApp = {
}
const apiUser = {
appletLogin: '/api/mobile/user/applet-login',
updateUser: '/api/mobile/user/update-user',
getUserInfo: '/api/mobile/user/get-user-info',
mobile: '/api/mobile/user/mobile',
config: '/api/mobile/user/config',
bindMobile: '/api/mobile/user/bind-mobile',
sendSms: '/api/mobile/user/send-sms'
}
// 此处第二个参数vm就是我们在页面使用的this你可以通过vm获取vuex等操作
const install = (Vue, vm) => {
//api方法
const appletLogin = (params = {}) => vm.$u.get(apiUser.appletLogin, params)
const updateUser = (params = {}) => vm.$u.post(apiUser.updateUser, params)
const getUserInfo = (params = {}) => vm.$u.get(apiUser.getUserInfo, params)
const mobile = (params = {}) => vm.$u.get(apiUser.mobile, params)
const config = (params = {}) => vm.$u.get(apiUser.config, params)
const bindMobile = (params = {}) => vm.$u.post(apiUser.bindMobile, params)
const sendSms = (params = {}) => vm.$u.get(apiUser.sendSms, params)
//
// 将各个定义的接口名称统一放进对象挂载到vm.$u.api(因为vm就是this也即this.$u.api)下
vm.$u.api = {
// 用户相关
appletLogin,
updateUser,
getUserInfo,
mobile,
config,
bindMobile,
sendSms,
//
};
}

@ -1,5 +1,5 @@
{
"name" : "uni",
"name" : "新飞跃",
"appid" : "__UNI__080F140",
"description" : "",
"versionName" : "1.0.0",
@ -50,7 +50,7 @@
"quickapp" : {},
/* */
"mp-weixin" : {
"appid" : "",
"appid" : "wx140b95cca3f6b00f",
"setting" : {
"urlCheck" : false
},

@ -3,31 +3,51 @@
<image class="bkg" src="~@/static/me/wave.png" mode="widthFix"></image>
<view class="wrap">
<view class="card">
<u-form label-width="auto">
<u-form-item label="头像">
<button style="margin-left: auto;width: 120rpx;height: 120rpx;" class="btn-normal" open-type="chooseAvatar" @chooseavatar="onChooseAvatar">
<image :src="form.headimgurl || vuex_default_icon" mode="aspectFit"></image>
</button>
</u-form-item>
<u-form-item label="昵称">
<input placeholder="点击获取昵称" style="text-align: right;" type="nickname" v-model="form.nickname" @change="nicknameChange"></input>
</u-form-item>
<u-form-item label="手机号">
<view style="margin-left: auto;display: flex;align-items: center;">
<u-input style="flex: 1;" v-model="form.mobile" input-align="right" placeholder="请输入手机号"></u-input>
<u-button size="mini" type="primary" class="btn-normal" open-type="getPhoneNumber" @getphonenumber="onGetPhoneNumber">
点击获取
</u-button>
</view>
</u-form-item>
</u-form>
</view>
<view class="card">
<u-form :model="form" ref="uForm" label-width="auto">
<u-form-item label="学生姓名">
<u-input v-model="form.name" input-align="right" />
<u-input v-model="form.name" placeholder="请输入" input-align="right" />
</u-form-item>
<u-form-item label="性别">
<u-input type="select" v-model="form.name" placeholder="请选择" input-align="right" />
<u-input type="select" v-model="form.sex" placeholder="请选择" input-align="right" @click="isShowSex = true"/>
</u-form-item>
<u-form-item label="年级" required>
<u-input type="select" v-model="form.name" placeholder="请选择" input-align="right" />
<u-input v-model="form.grade" placeholder="请输入" input-align="right" />
</u-form-item>
<u-form-item label="中考年份" required>
<u-input type="select" v-model="form.name" placeholder="请选择" input-align="right" />
<u-input type="select" v-model="form.middle_exam_year" placeholder="请选择" input-align="right" @click="isShowYear = true" />
</u-form-item>
<u-form-item label="民族">
<u-input type="select" v-model="form.name" placeholder="请选择" input-align="right" />
<u-input v-model="form.nationality" placeholder="请输入" input-align="right" />
</u-form-item>
<u-form-item label="所在城市" required>
<u-input type="select" v-model="form.name" placeholder="请选择" input-align="right" />
<u-input type="select" v-model="form.city" placeholder="请选择" input-align="right" @click="regionType = 'city',isShowRegion = true" />
</u-form-item>
<u-form-item label="所在县区" required>
<u-input type="select" v-model="form.name" placeholder="请选择" input-align="right" />
<u-input type="select" v-model="form.area" placeholder="请选择" input-align="right" @click="regionType = 'area',isShowRegion = true" />
</u-form-item>
<u-form-item label="所在学校" required>
<u-input type="select" v-model="form.name" placeholder="请选择" input-align="right" />
<u-input v-model="form.school" placeholder="请输入" input-align="right" />
</u-form-item>
</u-form>
</view>
@ -38,23 +58,23 @@
<view class="score">
<view class="score-row">
<view class="score-row__text">初始成绩</view>
<u-input placeholder="输入分数" placeholder-style="text-align: center;" input-align="center" border border-color="#e0e0e0" :height="48" :clearable="false"></u-input>
<u-input style="margin-left: 20rpx;" placeholder="输入年级名次" input-align="center" border border-color="#e0e0e0" :height="48" :clearable="false"></u-input>
<u-input v-model="form.user_scores[0].score" placeholder="输入分数" placeholder-style="text-align: center;" input-align="center" border border-color="#e0e0e0" :height="48" :clearable="false"></u-input>
<u-input v-model="form.user_scores[0].rank" style="margin-left: 20rpx;" placeholder="输入年级名次" input-align="center" border border-color="#e0e0e0" :height="48" :clearable="false"></u-input>
</view>
<view class="score-row">
<view class="score-row__text">一模成绩</view>
<u-input placeholder="输入分数" input-align="center" border border-color="#e0e0e0" :height="48" :clearable="false"></u-input>
<u-input style="margin-left: 20rpx;" placeholder="输入年级名次" input-align="center" border border-color="#e0e0e0" :height="48" :clearable="false"></u-input>
<u-input v-model="form.user_scores[1].score" placeholder="输入分数" input-align="center" border border-color="#e0e0e0" :height="48" :clearable="false"></u-input>
<u-input v-model="form.user_scores[1].rank" style="margin-left: 20rpx;" placeholder="输入年级名次" input-align="center" border border-color="#e0e0e0" :height="48" :clearable="false"></u-input>
</view>
<view class="score-row">
<view class="score-row__text">估分成绩</view>
<u-input placeholder="输入分数" input-align="center" border border-color="#e0e0e0" :height="48" :clearable="false"></u-input>
<u-input style="margin-left: 20rpx;" placeholder="输入年级名次" input-align="center" border border-color="#e0e0e0" :height="48" :clearable="false"></u-input>
<u-input v-model="form.user_scores[2].score" placeholder="输入分数" input-align="center" border border-color="#e0e0e0" :height="48" :clearable="false"></u-input>
<u-input v-model="form.user_scores[2].rank" style="margin-left: 20rpx;" placeholder="输入年级名次" input-align="center" border border-color="#e0e0e0" :height="48" :clearable="false"></u-input>
</view>
<view class="score-row">
<view class="score-row__text">精准成绩</view>
<u-input placeholder="输入分数" input-align="center" border border-color="#e0e0e0" :height="48" :clearable="false"></u-input>
<u-input style="margin-left: 20rpx;" placeholder="输入年级名次" input-align="center" border border-color="#e0e0e0" :height="48" :clearable="false"></u-input>
<u-input v-model="form.user_scores[3].score" placeholder="输入分数" input-align="center" border border-color="#e0e0e0" :height="48" :clearable="false"></u-input>
<u-input v-model="form.user_scores[3].rank" style="margin-left: 20rpx;" placeholder="输入年级名次" input-align="center" border border-color="#e0e0e0" :height="48" :clearable="false"></u-input>
</view>
</view>
</view>
@ -70,19 +90,253 @@
'letter-spacing': '5rpx',
'width': '450rpx',
'margin': '130rpx auto 0'
}">保存</u-button>
}"
@click="submit">保存</u-button>
</view>
<u-select v-model="isShowSex" :list="sexList" @confirm="e => form.sex = e[0].value"></u-select>
<u-picker
mode="time"
v-model="isShowYear"
:params="{
year: true,
month: false,
day: false,
hour: false,
minute: false,
second: false
}"
@confirm="e => form.middle_exam_year = e.year"></u-picker>
<u-picker
mode="region"
v-model="isShowRegion"
:default-region="defaultRegion"
:params="regionParams"
@confirm="regionPick"></u-picker>
</view>
</template>
<script>
import { ROOTPATH } from "@/common/config";
export default {
data() {
return {
regionType: 'city',
isShowRegion: false,
isShowYear: false,
isShowSex: false,
sexList: [
{
value: '男',
label: '男'
},
{
value: '女',
label: '女'
},
{
value: '保密',
label: '保密'
}
],
form: {
sex: '',
nickname: '',
mobile: '',
country: '',
province: '',
city: '',
headimgurl: '',
grade: '',
middle_exam_year: '',
nationality: '',
area: '',
school: '',
name: '',
user_scores: [
{
name: '初始成绩',
score: '',
rank: ''
},
{
name: '一模成绩',
score: '',
rank: ''
},
{
name: '估分成绩',
score: '',
rank: ''
},
{
name: '精准成绩',
score: '',
rank: ''
}
]
},
rules: {
grade: [
{
required: true,
message: '请输入年级'
}
],
middle_exam_year: [
{
required: true,
message: '请选择中考年份'
}
],
city: [
{
required: true,
message: '请选择城市'
}
],
area: [
{
required: true,
message: '请选择县区'
}
],
school: [
{
required: true,
message: '请输入学校'
}
]
}
};
},
methods: {
async getInfo() {
try {
const { user } = await this.$u.api.getUserInfo()
for (let key in this.form) {
if (user.hasOwnProperty(key) && key !== 'user_scores') {
this.form[key] = user[key]
} else if (key === 'user_scores') {
this.form['user_scores'].forEach(item => {
if (user['user_scores'].find(j => j.name === item.name)) {
item.score = user['user_scores'].find(j => j.name === item.name).score
item.rank = user['user_scores'].find(j => j.name === item.name).rank
}
})
}
}
} catch (err) {
console.error(err)
}
},
async onGetPhoneNumber(e) {
try {
if (e.detail.code) {
const res = await this.$u.api.mobile({
code: e.detail.code
})
if (res.mobile) {
this.form.mobile = res.mobile
}
}
} catch (err) {
console.error(err)
}
},
nicknameChange(e) {
this.form.nickname = e.target.value
},
onChooseAvatar(e) {
uni.uploadFile({
url: ROOTPATH + "/api/mobile/upload-file",
filePath: e.detail.avatarUrl,
name: 'file',
header: {
['Authorization']: `Bearer ${this.vuex_token}`
},
success: (res) => {
uni.showToast({
title: '上传成功',
duration: 1000,
icon: 'none'
})
let data = JSON.parse(res.data)
this.form.headimgurl = data.url
}
})
},
regionPick(e) {
if (e.hasOwnProperty('province')) {
this.form.province = e.province.label
}
if (e.hasOwnProperty('city')) {
this.form.city = e.city.label
}
if (e.hasOwnProperty('area')) {
this.form.area = e.area.label
}
},
submit() {
if (!this.form.grade || !this.form.middle_exam_year || !this.form.city || !this.form.area || !this.form.city) {
uni.showToast({
title: '请填写完整信息',
icon: 'none'
})
return
}
try {
this.$u.api.updateUser(this.form).then(async res => {
console.log(res)
uni.showToast({
title: '保存成功',
icon: 'none'
})
const { user } = await this.$u.api.getUserInfo()
this.$u.vuex('vuex_user', user)
})
} catch (err) {
console.error(err)
}
// this.$refs.uForm.validate((valid) => {
// if (valid) {
// try {
// this.$u.api.updateUser(this.form).then(res => {
// console.log(res)
// })
// } catch (err) {
// console.error(err)
// }
// } else {
// console.log('');
// }
// });
}
},
computed: {
regionParams() {
return this.regionType === 'city' ? {
province: true,
city: true,
area: false,
} : {
province: false,
city: false,
area: true,
}
},
defaultRegion() {
if (this.regionType === 'area') {
return [this.form.province,this.form.city]
}
}
},
onReady() {
this.$refs.uForm.setRules(this.rules)
this.getInfo()
}
}
</script>
@ -163,4 +417,30 @@ export default {
margin-top: 20rpx;
}
}
.btn-normal {
display: block;
margin: 0;
padding: 0;
line-height: normal;
background: none;
border-radius: 0;
box-shadow: none;
border: none;
font-size: unset;
text-align: unset;
overflow: visible;
color: inherit;
image {
width: 120rpx;
height: 120rpx;
border-radius: 100%;
border: 2px solid #fff;
margin-right: 30rpx;
}
}
.btn-normal::after {
border: none
}
</style>

@ -14,8 +14,9 @@
shape="circle"
:hair-line="false"
ripple
open-type="getPhoneNumber"
:custom-style="{...btnStyle,'color': '#fff','background':'#e47829'}"
@click="authLogin">一键登录</u-button>
@getphonenumber="authLogin">一键登录</u-button>
<u-button
shape="circle"
:hair-line="false"
@ -89,7 +90,8 @@
'margin': '6.8vh auto 0',
'letter-spacing': '2rpx',
'font-weight': '500'
}">登录</u-button>
}"
@click="mobileLogin">登录</u-button>
<view class="back" @click.stop="isSmsLogin = false">
<u-icon name="arrow-leftward"></u-icon>
</view>
@ -129,28 +131,86 @@ export default {
mobile: '',
code: ''
},
rules: {}
rules: {
mobile: [
{
required: true,
message: '请填写手机号',
trigger: ['change','blur']
}
],
code: [
{
required: true,
message: '请填写验证码',
trigger: ['change','blur']
}
]
}
};
},
methods: {
getCode() {
async mobileLogin() {
if (!this.form.code) {
this.$refs.uToast.show({
title: '请先填写验证码',
type: 'warning',
duration: '2000'
})
return
}
if (!this.isAuth) {
this.$refs.uToast.show({
title: '请先阅读协议',
type: 'warning',
duration: '2000'
})
return
}
try {
const res = await this.$u.api.bindMobile(this.form)
this.$u.vuex('vuex_user', res)
this.$u.route({
type: 'switchTab',
url: '/pages/index/index'
})
} catch (err) {
console.error(err)
}
},
async getCode() {
if (!this.form.mobile) {
this.$refs.uToast.show({
title: '请先填写手机号',
type: 'warning',
duration: '2000'
})
return
}
if(this.$refs.uCode.canGetCode) {
//
uni.showLoading({
title: '正在获取验证码'
})
setTimeout(() => {
try {
uni.showLoading({
title: '正在获取验证码'
})
const res = await this.$u.api.sendSms({
mobile: this.form.mobile
})
uni.hideLoading();
// this.start()
this.$u.toast('验证码已发送');
//
this.$refs.uCode.start();
}, 2000);
} catch (err) {
console.error(err)
} finally {
uni.hideLoading();
}
} else {
this.$u.toast('倒计时结束后再发送');
}
},
authLogin(e) {
async authLogin(e) {
if (!this.isAuth) {
this.$refs.uToast.show({
title: '请先阅读协议',
@ -159,24 +219,32 @@ export default {
})
return
}
uni.login({
provider: 'weixin', //使
success: async (loginRes) => {
try {
const {token} = await this.$u.api.login({
code: loginRes.code
if (this.vuex_user.mobile) {
this.$u.route({
type: 'switchTab',
url: '/pages/index/index'
})
}
try {
if (e.detail.code) {
const res = await this.$u.api.mobile({
code: e.detail.code
})
if (res.mobile) {
await this.$u.api.updateUser({
mobile: res.mobile
})
this.$u.vuex('vuex_token', token)
const { user } = await this.$u.api.getUserInfo()
this.$u.vuex('vuex_user', user)
this.$u.route({
type: 'switchTab',
url: '/pages/index/index'
})
} catch (err) {
}
}
});
} catch (err) {
console.error(err)
}
},
openPrivacyContract() {
wx.openPrivacyContract({
@ -190,7 +258,29 @@ export default {
},
});
},
}
},
onShow() {
if (!this.vuex_token) {
uni.login({
provider: 'weixin', //使
success: async (loginRes) => {
try {
const {token} = await this.$u.api.appletLogin({
code: loginRes.code
})
this.$u.vuex('vuex_token', token)
const { user } = await this.$u.api.getUserInfo()
this.$u.vuex('vuex_user', user)
} catch (err) {
console.error(err)
}
},
fail:err => {
console.log(err)
}
});
}
},
}
</script>

@ -4,9 +4,9 @@
<view class="wrap">
<view class="info">
<image class="info__avatar" :src="vuex_user.avatar || vuex_default_icon" mode="aspectFill"></image>
<image class="info__avatar" :src="vuex_user.headimgurl || vuex_default_icon" mode="aspectFill"></image>
<view class="info__name">
<text v-if="vuex_token">{{ vuex_user.name }}</text>
<text v-if="vuex_token">{{ vuex_user.nickname || '' }}</text>
<u-button v-else shape="circle" size="mini" plain type="primary" @click="$u.route({ url: '/pages/login/login' })">去登录</u-button>
</view>
</view>
@ -40,7 +40,7 @@
<u-icon name="arrow-right" :size="38" color="#a7a7a7"></u-icon>
</view>
</view>
<view class="row" v-if="vuex_token">
<view class="row" v-if="vuex_token" @click="logout">
<image class="row__icon" src="~@/static/me/ico5.png" mode="aspectFit"></image>
<view class="row__text">退出登录</view>
<view class="row__arrow">
@ -56,6 +56,25 @@
export default {
data() {
return {};
},
methods: {
logout() {
uni.showModal({
title: '提示',
content: '确认退出?',
success: status => {
if (status.confirm) {
this.$u.vuex('vuex_token', '')
this.$u.vuex('vuex_user', {})
uni.setStorageSync('lifeData', {})
this.$u.route({
url: '/pages/login/login',
type: 'tab'
})
}
}
})
}
}
}
</script>

@ -88,7 +88,7 @@ export default {
},
methods: {
setRules(rules) {
this.rules = rules;
console.log(this.rules)
},
// u-form-itemu-form-itemresetField()
resetFields() {

@ -35,6 +35,7 @@
{{confirmText}}
</view>
</view>
<slot></slot>
<view class="u-select__body">
<picker-view @change="columnChange" class="u-select__body__picker-view" :value="defaultSelector" @pickstart="pickstart" @pickend="pickend">
<picker-view-column v-for="(item, index) in columnData" :key="index">

Loading…
Cancel
Save