| @ -1,215 +1,34 @@ | |||
| // 首页相关接口 | |||
| const api = { | |||
| // 获取首页轮播图 | |||
| getRiceBanner: { | |||
| url: '/index_common/getRiceBanner', | |||
| /** | |||
| * 获取banner图列表 | |||
| */ | |||
| queryBannerList: { | |||
| url: '/index/queryBannerList', | |||
| method: 'GET', | |||
| }, | |||
| // 获取首页常规产品【废弃】 | |||
| // getRiceCommonProductList: { | |||
| // url: '/index_common/getRiceCommonProductList', | |||
| // method: 'GET', | |||
| // }, | |||
| // 获取首页跳转图标 | |||
| getRiceIconList: { | |||
| url: '/index_common/getRiceIconList', | |||
| /** | |||
| * 获取论文分类列表 | |||
| */ | |||
| queryCategoryThesisList: { | |||
| url: '/config/queryCategoryThesisList', | |||
| method: 'GET', | |||
| }, | |||
| // 获取首页新闻详情 | |||
| getRiceNewsDetail: { | |||
| url: '/index_common/getCommonNewsDetail', | |||
| /** | |||
| * 获取论文文章列表 | |||
| */ | |||
| queryThesisList: { | |||
| url: '/index/queryThesisList', | |||
| method: 'GET', | |||
| }, | |||
| // 获取首页新闻列表 | |||
| getRiceNewsList: { | |||
| url: '/index_common/getRiceNewsList', | |||
| /** | |||
| * 获取论文文章详情 | |||
| */ | |||
| queryThesisById: { | |||
| url: '/index/queryThesisById', | |||
| method: 'GET', | |||
| }, | |||
| // 获取首页公告列表 | |||
| getRiceNoticeList: { | |||
| url: '/index_common/getRiceNoticeList', | |||
| method: 'GET', | |||
| }, | |||
| // 获取首页商品详情 | |||
| getRiceProductDetail: { | |||
| url: '/index_common/getRiceProductDetail', | |||
| method: 'GET', | |||
| }, | |||
| // 获取首页体验产品 | |||
| getRiceProductList: { | |||
| url: '/index_common/getRiceProductList', | |||
| method: 'GET', | |||
| }, | |||
| // 查询分类接口 | |||
| getCategoryList: { | |||
| url: '/index_common/getCategoryList', | |||
| method: 'GET', | |||
| }, | |||
| // 新查询分类以及商品数据接口 | |||
| getCategoryPidList: { | |||
| url: '/index_common/getCategoryPidList', | |||
| method: 'GET', | |||
| debounce : 250, | |||
| }, | |||
| // 查询一级分类接口 | |||
| getPidList: { | |||
| url: '/index_common/getCategoryPidList', | |||
| method: 'GET', | |||
| }, | |||
| // 获取分类分页商品列表接口 | |||
| getClassShopPageList: { | |||
| url: '/index_common/getClassShopPageList', | |||
| method: 'GET', | |||
| }, | |||
| // 加入购物车 | |||
| addCart: { | |||
| url: '/index_common/addCart', | |||
| method: 'GET', | |||
| auth: true, | |||
| showLoading: true, | |||
| limit : 500, | |||
| }, | |||
| // 删除购物车信息 | |||
| deleteCart: { | |||
| url: '/index_common/deleteCart', | |||
| method: 'DELETE', | |||
| auth: true, | |||
| showLoading: true, | |||
| }, | |||
| // 修改购物车信息数量 | |||
| updateCartNum: { | |||
| url: '/index_common/updateCartNum', | |||
| method: 'POST', | |||
| auth: true, | |||
| debounce: 300, | |||
| }, | |||
| // 创建订单 | |||
| createOrder: { | |||
| url: '/index_common/createOrder', | |||
| method: 'GET', | |||
| auth: true, | |||
| limit: 1000, | |||
| showLoading: true, | |||
| }, | |||
| // 创建订单-再次支付 | |||
| createOrderTwo: { | |||
| url: '/index_common/createOrderTwo', | |||
| method: 'GET', | |||
| auth: true, | |||
| limit: 1000, | |||
| showLoading: true, | |||
| }, | |||
| // 多商品创建订单 | |||
| createSumOrder: { | |||
| url: '/index_common/createSumOrder', | |||
| method: 'POST', | |||
| auth: true, | |||
| limit: 1000, | |||
| showLoading: true, | |||
| }, | |||
| // 多商品订单再次支付 | |||
| createSumOrderAgain: { | |||
| url: '/index_common/createSumOrderAgain', | |||
| method: 'POST', | |||
| auth: true, | |||
| limit: 1000, | |||
| showLoading: true, | |||
| }, | |||
| // 确认收货 | |||
| confirmOrder: { | |||
| url: '/index_common/confirmOrder', | |||
| method: 'GET', | |||
| auth: true, | |||
| limit: 1000, | |||
| showLoading: true, | |||
| }, | |||
| // 取消订单 | |||
| cancelOrder: { | |||
| url: '/index_common/cancelOrder', | |||
| method: 'GET', | |||
| auth: true, | |||
| limit: 1000, | |||
| showLoading: true, | |||
| }, | |||
| // 获取首页广告列表 | |||
| getRiceProductList: { | |||
| url: '/index_common/getRiceAdList', | |||
| method: 'GET', | |||
| }, | |||
| // 获取首页广告列表 | |||
| getRiceAdDetail: { | |||
| url: '/index_common/getRiceAdDetail', | |||
| method: 'GET', | |||
| }, | |||
| //获取优惠券信息 | |||
| getRiceCouponList: { | |||
| url: '/info_common/getRiceCouponList', | |||
| method: 'GET', | |||
| }, | |||
| //增加或者修改合伙人申请信息 | |||
| addOrUpdateCommonUser: { | |||
| url: '/index_common/addOrUpdateCommonUser', | |||
| method: 'POST', | |||
| }, | |||
| //根据用户查询渠合伙人申请信息表单 | |||
| getCommonUser: { | |||
| url: '/index_common/getCommonUser', | |||
| method: 'GET' | |||
| }, | |||
| //提交反馈信息 | |||
| addFeedback: { | |||
| url: '/info_common/addFeedback', | |||
| method: 'POST' | |||
| }, | |||
| // 获取我的直接推荐间接推荐用户列表带分页 | |||
| getHanHaiMemberUser: { | |||
| url: '/info_common/getHanHaiMemberUser', | |||
| method: 'GET' | |||
| }, | |||
| // 获取祝福背景图 | |||
| getRiceBlessing: { | |||
| url: '/index_common/getRiceBlessing', | |||
| method: 'GET' | |||
| }, | |||
| // 随机获取祝福语 | |||
| getRiceBlessingWords: { | |||
| url: '/index_common/getRiceBlessingWords', | |||
| method: 'GET' | |||
| }, | |||
| // 根据订单标识修改订单祝福语背景 | |||
| updateOrderBlessing: { | |||
| url: '/index_common/updateOrderBlessing', | |||
| method: 'POST', | |||
| auth : true, | |||
| limit : 1000, | |||
| }, | |||
| // 1.收礼流程 =》点击收礼 | |||
| getGiveShop: { | |||
| url: '/index_common/getGiveShop', | |||
| method: 'GET', | |||
| auth : true, | |||
| limit : 1000, | |||
| }, | |||
| // 2.点击抽奖 =》抽奖 | |||
| getGiveShopLottery: { | |||
| url: '/index_common/getGiveShopLottery', | |||
| method: 'GET', | |||
| auth : true, | |||
| limit : 1000, | |||
| }, | |||
| // 获取我的礼品订单 | |||
| getMyGiftOrder: { | |||
| url: '/index_common/getMyGiftOrder', | |||
| method: 'GET', | |||
| auth : true, | |||
| }, | |||
| // 获取我的礼品订单详情 | |||
| getMyGiftOrderDetail: { | |||
| url: '/index_common/getMyGiftOrderDetail', | |||
| method: 'GET', | |||
| auth : true, | |||
| }, | |||
| } | |||
| export default api | |||
| @ -1,115 +0,0 @@ | |||
| // 个人相关接口 | |||
| const api = { | |||
| // 充值 | |||
| recharge: { | |||
| url: '/info_common/withdraw', | |||
| method: 'GET', | |||
| auth: true, | |||
| limit: 1000, | |||
| showLoading: true, | |||
| }, | |||
| // 提现 | |||
| withdraw: { | |||
| url: '/info_common/withdraw', | |||
| method: 'GET', | |||
| auth: true, | |||
| limit: 1000, | |||
| showLoading: true, | |||
| }, | |||
| // 获取地址列表带分页 | |||
| getAddressPageList: { | |||
| url: '/info_common/getAddressPageList', | |||
| method: 'GET', | |||
| auth: true, | |||
| }, | |||
| // 增加或修改地址信息 | |||
| addOrUpdateAddress: { | |||
| url: '/info_common/addOrUpdateAddress', | |||
| method: 'POST', | |||
| limit: 500, | |||
| auth: true, | |||
| showLoading: true, | |||
| }, | |||
| // 删除地址 | |||
| deleteAddress: { | |||
| url: '/info_common/deleteAddress', | |||
| method: 'GET', | |||
| limit: 500, | |||
| auth: true, | |||
| showLoading: true, | |||
| }, | |||
| // 修改默认地址 | |||
| updateDefaultAddress: { | |||
| url: '/info_common/updateDefaultAddress', | |||
| method: 'GET', | |||
| auth: true, | |||
| limit: 1000, | |||
| }, | |||
| // 获取粉丝列表带分页 | |||
| getFansPageList: { | |||
| url: '/info_common/getFansPageList', | |||
| method: 'GET', | |||
| auth: true, | |||
| }, | |||
| // 获取相关介绍 | |||
| getInfoIntroduce: { | |||
| url: '/info_common/getInfoIntroduce', | |||
| method: 'GET', | |||
| auth: true, | |||
| }, | |||
| // 获取个人邀请码 | |||
| getInviteCode: { | |||
| url: '/info_common/getInviteCode', | |||
| method: 'GET', | |||
| auth: true, | |||
| }, | |||
| // 获取订单列表带分页 | |||
| getOrderPageList: { | |||
| url: '/info_common/getOrderPageList', | |||
| method: 'GET', | |||
| auth: true, | |||
| }, | |||
| // 获取订单详情 | |||
| getOrderDetail: { | |||
| url: '/info_common/getOrderDetail', | |||
| method: 'GET', | |||
| auth: true, | |||
| }, | |||
| // 获取流水记录带分页 | |||
| getWaterPageList: { | |||
| url: '/info_common/getWaterPageList', | |||
| method: 'GET', | |||
| auth: true, | |||
| }, | |||
| // 获取相关介绍 | |||
| getInfoIntroduce: { | |||
| url: '/info_common/getInfoIntroduce', | |||
| method: 'GET', | |||
| }, | |||
| // 获取相关介绍详情 | |||
| getInfoIntroduceDetail: { | |||
| url: '/info_common/getRiceNewsDetail', | |||
| method: 'GET', | |||
| }, | |||
| // 查询个人信息相关 | |||
| getRiceInfo: { | |||
| url: '/info_common/getRiceInfo', | |||
| method: 'GET', | |||
| limit: 500, | |||
| }, | |||
| // 获取购物车信息列表带分页 | |||
| getCartPageList: { | |||
| url: '/info_common/getCartPageList', | |||
| method: 'GET', | |||
| }, | |||
| // 领取新人优惠券 | |||
| getRiceCoupon: { | |||
| url: '/info_common/getRiceCoupon', | |||
| method: 'GET', | |||
| limit: 500, | |||
| auth: true, | |||
| }, | |||
| } | |||
| export default api | |||
| @ -1,35 +0,0 @@ | |||
| // 登录相关接口 | |||
| const api = { | |||
| // 微信登录接口 | |||
| wxLogin: { | |||
| url: '/login_common/appletLogin', | |||
| method: 'GET', | |||
| limit : 500, | |||
| showLoading : true, | |||
| }, | |||
| // 获取绑定手机号码 | |||
| bindPhone: { | |||
| url: '/login_common/bindPhone', | |||
| method: 'GET', | |||
| auth: true, | |||
| }, | |||
| // 修改个人信息接口 | |||
| updateInfo: { | |||
| url: '/info_common/updateInfo', | |||
| method: 'POST', | |||
| auth: true, | |||
| limit : 500, | |||
| showLoading : true, | |||
| }, | |||
| // 获取个人信息 | |||
| getInfo: { | |||
| url: '/info_common/getInfo', | |||
| method: 'GET', | |||
| auth: true, | |||
| }, | |||
| } | |||
| export default api | |||
| @ -1,20 +0,0 @@ | |||
| // vip相关接口 | |||
| const api = { | |||
| // 获取会员权益列表 | |||
| getRiceVipList: { | |||
| url: '/index_common/getVipInfoList', | |||
| method: 'GET', | |||
| }, | |||
| // 申请成为会员 | |||
| applyRiceVip: { | |||
| url: '/rice_vip/applyRiceVip', | |||
| method: 'POST', | |||
| limit : 500, | |||
| auth : true, | |||
| showLoading : true, | |||
| }, | |||
| } | |||
| export default api | |||
| @ -1,514 +0,0 @@ | |||
| <template> | |||
| <view class="refundsOrExchange"> | |||
| <navbar :title="titleList[titleIndex]" leftClick | |||
| @leftClick="$utils.redirectTo('/pages/index/index')" /> | |||
| <view class="frame"> | |||
| <!-- 注册 --> | |||
| <view class='forgetPassword' v-if='titleIndex == 0'> | |||
| <!-- 标题 --> | |||
| <view class="title">{{titleList[titleIndex]}}</view> | |||
| <!-- 表单 --> | |||
| <view class="form1"> | |||
| <view class="userName"> | |||
| <uv-input v-model="form1.username" placeholder="请输入手机号" border="surround" shape='circle' | |||
| clearable :customStyle="{ backgroundColor: '#f6f6f6'}"></uv-input> | |||
| </view> | |||
| <view class="code"> | |||
| <view class="left"> | |||
| <uv-input v-model="form1.captcha" placeholder="请输入验证码" border="surround" shape='circle' | |||
| clearable :customStyle="{ backgroundColor: '#f6f6f6'}"></uv-input> | |||
| </view> | |||
| <view class="right"> | |||
| <view> | |||
| <uv-toast ref="toast"></uv-toast> | |||
| <uv-code :seconds="seconds" @end="end" @start="start" ref="code" | |||
| @change="codeChange"></uv-code> | |||
| <uv-button @tap="getCode" iconSize='10rpx' color='#1f1c39' | |||
| shape='circle'>{{tips}}</uv-button> | |||
| </view> | |||
| </view> | |||
| </view> | |||
| <view class="password1"> | |||
| <uv-input v-model="form1.password" placeholder="设置您的新密码(6到50个字符)" password clearable | |||
| border="surround" shape='circle' :customStyle="{ backgroundColor: '#f6f6f6'}"></uv-input> | |||
| </view> | |||
| <view class="password2"> | |||
| <uv-input v-model="form1.newPassword" placeholder="重新确认密码" password clearable border="surround" | |||
| shape='circle' :customStyle="{ backgroundColor: '#f6f6f6'}"></uv-input> | |||
| </view> | |||
| </view> | |||
| <view> | |||
| <uv-checkbox-group v-model="checkboxValue" shape="circle"> | |||
| <view class="content"> | |||
| <view style="display: flex;"> | |||
| <uv-checkbox size="30rpx" :name="1"></uv-checkbox> | |||
| 请你阅读并同意我们的<span style="color: #fd5100" | |||
| @click="$refs.popup.open('getPrivacyPolicy')">《隐私条款》</span>和<span | |||
| style="color: #fd5100" | |||
| @click="$refs.popup.open('getUserAgreement')">《服务协议》</span> | |||
| </view> | |||
| </view> | |||
| </uv-checkbox-group> | |||
| </view> | |||
| </view> | |||
| <!-- 登录 --> | |||
| <view class="loginRegister" v-if='titleIndex==1'> | |||
| <!-- 标题 --> | |||
| <view class="title">{{titleList[titleIndex]}}</view> | |||
| <!-- 头像 --> | |||
| <view class="userIamge"> | |||
| <view> | |||
| <img src="/static/image/center/11.svg" alt="" style="width: 100%;height: 100%;"> | |||
| </view> | |||
| </view> | |||
| <!-- 用户名&密码&隐私条款 --> | |||
| <view class="form"> | |||
| <view> | |||
| <uv-input v-model="form.username" placeholder="请输入账号" border="surround" shape='circle' clearable | |||
| :customStyle="{ backgroundColor: '#f6f6f6'}"></uv-input> | |||
| </view> | |||
| <view> | |||
| <uv-input v-model="form.password" password placeholder="请输入密码" border="surround" shape='circle' | |||
| clearable :customStyle="{ backgroundColor: '#f6f6f6'}"></uv-input> | |||
| </view> | |||
| <view> | |||
| <uv-checkbox-group v-model="checkboxValue" shape="circle"> | |||
| <view class="content"> | |||
| <view style="display: flex;"> | |||
| <uv-checkbox size="30rpx" :name="1"></uv-checkbox> | |||
| 请你阅读并同意我们的<span style="color: #fd5100" | |||
| @click="$refs.popup.open('yszc')">《隐私条款》</span>和<span | |||
| style="color: #fd5100" | |||
| @click="$refs.popup.open('fwxy')">《服务协议》</span> | |||
| </view> | |||
| </view> | |||
| </uv-checkbox-group> | |||
| </view> | |||
| </view> | |||
| </view> | |||
| <!-- 忘记密码 --> | |||
| <view class='forgetPassword' v-if='titleIndex == 2'> | |||
| <!-- 标题 --> | |||
| <view class="title">{{titleList[titleIndex]}}</view> | |||
| <!-- 表单 --> | |||
| <view class="form1"> | |||
| <view class="userName"> | |||
| <uv-input v-model="form1.username" placeholder="请输入手机号" border="surround" shape='circle' | |||
| clearable :customStyle="{ backgroundColor: '#f6f6f6'}"></uv-input> | |||
| </view> | |||
| <view class="code"> | |||
| <view class="left"> | |||
| <uv-input v-model="form1.captcha" placeholder="请输入验证码" border="surround" shape='circle' | |||
| clearable :customStyle="{ backgroundColor: '#f6f6f6'}"></uv-input> | |||
| </view> | |||
| <view class="right"> | |||
| <view> | |||
| <uv-toast ref="toast"></uv-toast> | |||
| <uv-code :seconds="seconds" @end="end" @start="start" ref="code" | |||
| @change="codeChange"></uv-code> | |||
| <uv-button @tap="getCode" iconSize='10rpx' color='#1f1c39' | |||
| shape='circle'>{{tips}}</uv-button> | |||
| </view> | |||
| </view> | |||
| </view> | |||
| <view class="password1"> | |||
| <uv-input v-model="form1.password" placeholder="设置您的新密码(6到50个字符)" password clearable | |||
| border="surround" shape='circle' :customStyle="{ backgroundColor: '#f6f6f6'}"></uv-input> | |||
| </view> | |||
| <view class="password2"> | |||
| <uv-input v-model="form1.newPassword" placeholder="重新确认密码" password clearable border="surround" | |||
| shape='circle' :customStyle="{ backgroundColor: '#f6f6f6'}"></uv-input> | |||
| </view> | |||
| </view> | |||
| </view> | |||
| <!-- 按钮 --> | |||
| <view class="btn" @click="submit"> | |||
| <button class='a'>{{titleList[titleIndex]}}</button> | |||
| </view> | |||
| <!-- tab --> | |||
| <view class="bottomTab"> | |||
| <span :class="titleIndex==0 ? 'tabbarItemActive' : 'tabbarItemNoActive'" | |||
| @click='changePage(0)'>注册账号</span> | |||
| <span style="color: #9c9fa4">|</span> | |||
| <span :class="titleIndex==1 ? 'tabbarItemActive' : 'tabbarItemNoActive'" | |||
| @click='changePage(1)'>账号登录</span> | |||
| <span style="color: #9c9fa4">|</span> | |||
| <span :class="titleIndex==2 ? 'tabbarItemActive' : 'tabbarItemNoActive'" | |||
| @click='changePage(2)'>忘记密码</span> | |||
| </view> | |||
| </view> | |||
| <configPopup ref="popup"></configPopup> | |||
| </view> | |||
| </template> | |||
| <script> | |||
| import configPopup from '@/components/config/configPopup.vue'; | |||
| export default { | |||
| components: { | |||
| configPopup | |||
| }, | |||
| onLoad(option) { | |||
| this.titleIndex = option.index || 1 | |||
| }, | |||
| data() { | |||
| return { | |||
| titleIndex: 0, | |||
| titleList: ['注册', '登录', '重置密码'], | |||
| checkboxValue: [], | |||
| form: { | |||
| username: '',//19330214982 | |||
| password: '',//1234567 | |||
| loginModel: 0, | |||
| captcha: '', | |||
| }, | |||
| form1: { | |||
| username: '', | |||
| captcha: '', | |||
| password: '', | |||
| newPassword: '', | |||
| }, | |||
| tips: '获取验证码', | |||
| seconds: 60, | |||
| } | |||
| }, | |||
| methods: { | |||
| submit() { | |||
| if (!this.checkboxValue.length && this.titleIndex != 2) { | |||
| return uni.showToast({ | |||
| title: '请先同意隐私协议', | |||
| icon: 'none' | |||
| }) | |||
| } | |||
| if (this.titleIndex == 0) { | |||
| // 注册 | |||
| this.register() | |||
| } else if (this.titleIndex == 1) { | |||
| // 登录 | |||
| this.login() | |||
| } else { | |||
| // 忘记密码 | |||
| this.updatePassword() | |||
| } | |||
| }, | |||
| // 登录 | |||
| login(){ | |||
| if (this.$utils.verificationAll(this.form, { | |||
| username: '请输入账号', | |||
| password: '请输入密码', | |||
| })) { | |||
| return | |||
| } | |||
| if (!this.$utils.verificationPhone(this.form.username)) { | |||
| return uni.showToast({ | |||
| title: '请输入合法的手机号', | |||
| icon: 'none' | |||
| }) | |||
| } | |||
| // 登录 | |||
| this.$store.commit('login', this.form) | |||
| }, | |||
| // 注册 | |||
| register(){ | |||
| if (this.$utils.verificationAll(this.form1, { | |||
| username: '请输入账号', | |||
| captcha : '请输入验证码', | |||
| password: '请输入密码', | |||
| newPassword: '请确认密码', | |||
| })) { | |||
| return | |||
| } | |||
| if (!this.$utils.verificationPhone(this.form1.username)) { | |||
| return uni.showToast({ | |||
| title: '请输入合法的手机号', | |||
| icon: 'none' | |||
| }) | |||
| } | |||
| if (this.form1.password != this.form1.newPassword) { | |||
| return uni.showToast({ | |||
| title: '密码与确认密码不一致', | |||
| icon: 'none' | |||
| }) | |||
| } | |||
| this.$api('registerUser', this.form1, res => { | |||
| this.form1 = {} | |||
| if (res.code == 200) { | |||
| this.titleIndex = 1 | |||
| uni.showToast({ | |||
| title: '注册成功,请登录!', | |||
| icon: 'none' | |||
| }) | |||
| } | |||
| }) | |||
| }, | |||
| updatePassword(){ | |||
| if (this.$utils.verificationAll(this.form1, { | |||
| username: '请输入账号', | |||
| captcha : '请输入验证码', | |||
| password: '请输入新密码', | |||
| newPassword: '请确认密码', | |||
| })) { | |||
| return | |||
| } | |||
| if (!this.$utils.verificationPhone(this.form1.username)) { | |||
| return uni.showToast({ | |||
| title: '请输入合法的手机号', | |||
| icon: 'none' | |||
| }) | |||
| } | |||
| if (this.form1.password != this.form1.newPassword) { | |||
| return uni.showToast({ | |||
| title: '密码与确认密码不一致', | |||
| icon: 'none' | |||
| }) | |||
| } | |||
| this.$api('newPassword', this.form1, res => { | |||
| this.form1 = {} | |||
| if (res.code == 200) { | |||
| this.titleIndex = 1 | |||
| uni.showToast({ | |||
| title: '修改成功,请登录!', | |||
| icon: 'none' | |||
| }) | |||
| } | |||
| }) | |||
| }, | |||
| // 切换页面 | |||
| changePage(index) { | |||
| this.titleIndex = index | |||
| }, | |||
| confirm() { | |||
| }, | |||
| codeChange(text) { | |||
| this.tips = text; | |||
| }, | |||
| getCode() { | |||
| if (this.$refs.code.canGetCode) { | |||
| if (!this.$utils.verificationPhone(this.form1.username)) { | |||
| return uni.showToast({ | |||
| title: '请输入合法的手机号', | |||
| icon: 'none' | |||
| }) | |||
| } | |||
| uni.showLoading({ | |||
| title: '正在获取验证码' | |||
| }) | |||
| this.$api('sendSms', { | |||
| username: this.form1.username, | |||
| }, res => { | |||
| if (res.code == 200) { | |||
| uni.hideLoading(); | |||
| // 这里此提示会被this.start()方法中的提示覆盖 | |||
| uni.$uv.toast('验证码已发送'); | |||
| // 通知验证码组件内部开始倒计时 | |||
| this.$refs.code.start(); | |||
| } | |||
| }) | |||
| } else { | |||
| uni.$uv.toast('请勿重复发送'); | |||
| } | |||
| }, | |||
| end() { | |||
| // uni.$uv.toast('倒计时结束'); | |||
| }, | |||
| start() { | |||
| // uni.$uv.toast('倒计时开始'); | |||
| } | |||
| } | |||
| } | |||
| </script> | |||
| <style lang="scss" scoped> | |||
| * { | |||
| box-sizing: border-box; | |||
| } | |||
| .content{ | |||
| font-size: 22rpx; | |||
| margin: 0 auto; | |||
| } | |||
| .refundsOrExchange { | |||
| background-color: #FFF; | |||
| height: 100vh; | |||
| .frame { | |||
| background-color: #FFF; | |||
| .loginRegister { | |||
| display: flex; | |||
| flex-direction: column; | |||
| gap: 40rpx; | |||
| padding-bottom: 50rpx; | |||
| .title { | |||
| display: flex; | |||
| justify-content: center; | |||
| align-items: flex-end; | |||
| height: 10vh; | |||
| color: #000; | |||
| font-size: 40rpx; | |||
| font-weight: 700; | |||
| } | |||
| .userIamge { | |||
| display: flex; | |||
| justify-content: center; | |||
| height: 10vh; | |||
| >view:nth-of-type(1) { | |||
| width: 25%; | |||
| height: 100%; | |||
| border-radius: 50%; | |||
| overflow: hidden; | |||
| } | |||
| } | |||
| .form { | |||
| height: 12vh; | |||
| >view:nth-of-type(1) { | |||
| padding: 20rpx 100rpx; | |||
| } | |||
| >view:nth-of-type(2) { | |||
| padding: 0 100rpx; | |||
| } | |||
| >view:nth-of-type(3) { | |||
| display: flex; | |||
| padding: 30rpx 100rpx 0 100rpx; | |||
| font-size: 22rpx; | |||
| } | |||
| } | |||
| } | |||
| .btn { | |||
| // height: 5vh; | |||
| display: flex; | |||
| justify-content: center; | |||
| margin: 90rpx 0 0 0; | |||
| .a { | |||
| display: flex; | |||
| justify-content: center; | |||
| align-items: center; | |||
| width: 70%; | |||
| height: 80rpx; | |||
| color: #FFF; | |||
| background-color: $uni-color; | |||
| box-shadow: 0 0 4rpx 4rpx rgba($uni-color, 0.2); | |||
| border-radius: 100rpx; | |||
| font-size: 30rpx; | |||
| } | |||
| } | |||
| .bottomTab { | |||
| display: flex; | |||
| justify-content: space-between; | |||
| height: 10vh; | |||
| padding: 0 80rpx; | |||
| margin-top: 30rpx; | |||
| .tabbarItemActive { | |||
| color: $uni-color; | |||
| } | |||
| .tabbarItemNoActive { | |||
| color: #9c9fa4; | |||
| } | |||
| } | |||
| .forgetPassword { | |||
| padding: 100rpx 40rpx 0 40rpx; | |||
| .title { | |||
| display: flex; | |||
| justify-content: center; | |||
| align-items: flex-end; | |||
| height: 10vh; | |||
| color: #000; | |||
| font-size: 40rpx; | |||
| font-weight: 700; | |||
| } | |||
| .form1 { | |||
| display: flex; | |||
| flex-direction: column; | |||
| gap: 30rpx; | |||
| margin-top: 20rpx; | |||
| padding: 20rpx 80rpx; | |||
| .userName { | |||
| // padding: 20rpx 100 rpx; | |||
| } | |||
| .code { | |||
| display: flex; | |||
| width: 100%; | |||
| .left { | |||
| width: 55%; | |||
| } | |||
| .right { | |||
| width: 45%; | |||
| height: 100%; | |||
| >view:nth-of-type(1) { | |||
| display: flex; | |||
| justify-content: center; | |||
| align-items: center; | |||
| width: 100%; | |||
| } | |||
| } | |||
| } | |||
| .password1 {} | |||
| .password2 {} | |||
| } | |||
| } | |||
| } | |||
| } | |||
| </style> | |||
| @ -1,155 +0,0 @@ | |||
| <template> | |||
| <view class="login"> | |||
| <view class="logo"> | |||
| <!-- <image src="/static/image/login/logo.png" mode=""></image> --> | |||
| </view> | |||
| <view class="title"> | |||
| 欢迎使用酒店桌布租赁平台 | |||
| </view> | |||
| <view class="btn mt" | |||
| @click="wxLogin"> | |||
| <view class="icon"> | |||
| <image src="../static/auth/wx.png" mode=""></image> | |||
| </view> | |||
| <view class=""> | |||
| 微信授权登录 | |||
| </view> | |||
| </view> | |||
| <!-- <view class="btn b2"> | |||
| 使用短信验证登录 | |||
| </view> --> | |||
| <view class="btn b2" | |||
| @click="qux"> | |||
| 取消登录 | |||
| </view> | |||
| <view class="config"> | |||
| <uv-checkbox-group | |||
| v-model="checkboxValue" | |||
| shape="circle"> | |||
| <view class="content"> | |||
| <view | |||
| style="display: flex;"> | |||
| <uv-checkbox | |||
| size="40rpx" | |||
| icon-size="30rpx" | |||
| activeColor="#FD5100" | |||
| :name="1" | |||
| ></uv-checkbox> | |||
| 阅读并同意我们的<text @click="$refs.popup.open('getPrivacyPolicy')">“服务协议与隐私条款”</text> | |||
| </view> | |||
| <view class=""> | |||
| 以及<text @click="$refs.popup.open('getUserAgreement')">个人信息保护指引</text> | |||
| </view> | |||
| </view> | |||
| </uv-checkbox-group> | |||
| </view> | |||
| <configPopup ref="popup"></configPopup> | |||
| </view> | |||
| </template> | |||
| <script> | |||
| export default { | |||
| name : 'Login', | |||
| data() { | |||
| return { | |||
| checkboxValue : [] | |||
| } | |||
| }, | |||
| methods: { | |||
| wxLogin(){ | |||
| if(!this.checkboxValue.length){ | |||
| return uni.showToast({ | |||
| title: '请先同意隐私协议', | |||
| icon:'none' | |||
| }) | |||
| } | |||
| this.$store.commit('login') | |||
| }, | |||
| qux(){ | |||
| uni.reLaunch({ | |||
| url: '/pages/index/index' | |||
| }) | |||
| }, | |||
| } | |||
| } | |||
| </script> | |||
| <style scoped lang="scss"> | |||
| .login{ | |||
| display: flex; | |||
| justify-content: center; | |||
| align-items: center; | |||
| height: 80vh; | |||
| flex-direction: column; | |||
| position: relative; | |||
| .logo{ | |||
| height: 140rpx; | |||
| width: 140rpx; | |||
| background-color: #ddd; | |||
| border-radius: 30rpx; | |||
| image{ | |||
| height: 140rpx; | |||
| width: 140rpx; | |||
| border-radius: 30rpx; | |||
| } | |||
| margin-bottom: 20rpx; | |||
| } | |||
| .title{ | |||
| position: relative; | |||
| font-weight: 900; | |||
| font-size: 45rpx; | |||
| &::after{ | |||
| content: ''; | |||
| position: absolute; | |||
| left: 0; | |||
| top: 100%; | |||
| display: block; | |||
| height: 8rpx; | |||
| width: 210rpx; | |||
| background: linear-gradient(to right,$uni-color, #fff); | |||
| } | |||
| } | |||
| .btn{ | |||
| width: 80%; | |||
| height: 100rpx; | |||
| background-color: $uni-color; | |||
| color: #fff; | |||
| display: flex; | |||
| justify-content: center; | |||
| align-items: center; | |||
| margin: 20rpx 0; | |||
| border-radius: 20rpx; | |||
| .icon{ | |||
| margin-right: 10rpx; | |||
| image{ | |||
| width: 40rpx; | |||
| height: 35rpx; | |||
| } | |||
| } | |||
| } | |||
| .b2{ | |||
| background-color: rgba($uni-color, 0.2); | |||
| color: $uni-color; | |||
| } | |||
| .mt{ | |||
| margin-top: 200rpx; | |||
| } | |||
| .config{ | |||
| position: absolute; | |||
| bottom: 0; | |||
| font-size: 24rpx; | |||
| text-align: center; | |||
| line-height: 40rpx; | |||
| text{ | |||
| color: $uni-color; | |||
| } | |||
| } | |||
| } | |||
| </style> | |||
| @ -1,133 +0,0 @@ | |||
| <template> | |||
| <view class="login"> | |||
| <view class="title"> | |||
| 酒店桌布租赁平台 | |||
| </view> | |||
| <view class="title"> | |||
| 申请获取你的头像、昵称 | |||
| </view> | |||
| <button class="chooseAvatar" open-type="chooseAvatar" @chooseavatar="onChooseAvatar"> | |||
| <view class="line"> | |||
| <view class=""> | |||
| 头像 | |||
| </view> | |||
| <view class=""> | |||
| <image :src="userInfo.headImage" v-if="userInfo.headImage" style="width: 60rpx;height: 60rpx;" | |||
| mode=""></image> | |||
| <image src="../static/auth/headImage.png" v-else style="width: 50rpx;height: 50rpx;" mode=""></image> | |||
| </view> | |||
| </view> | |||
| </button> | |||
| <view class="line"> | |||
| <view class=""> | |||
| 昵称 | |||
| </view> | |||
| <view class=""> | |||
| <input type="nickname" placeholder="请输入昵称" style="text-align: right;" id="nickName" | |||
| v-model="userInfo.nickName" /> | |||
| </view> | |||
| </view> | |||
| <view class="btn" @click="submit"> | |||
| 确认 | |||
| </view> | |||
| </view> | |||
| </template> | |||
| <script> | |||
| export default { | |||
| data() { | |||
| return { | |||
| userInfo: { | |||
| headImage: '', | |||
| nickName: '', | |||
| } | |||
| }; | |||
| }, | |||
| onShow() {}, | |||
| computed: {}, | |||
| methods: { | |||
| onChooseAvatar(res) { | |||
| let self = this | |||
| self.$Oss.ossUpload(res.target.avatarUrl) | |||
| .then(url => { | |||
| self.userInfo.headImage = url | |||
| }) | |||
| }, | |||
| submit() { | |||
| let self = this | |||
| uni.createSelectorQuery().in(this) | |||
| .select("#nickName") | |||
| .fields({ | |||
| properties: ["value"], | |||
| }) | |||
| .exec((res) => { | |||
| const nickName = res?.[0]?.value | |||
| self.userInfo.nickName = nickName | |||
| if (self.$utils.verificationAll(self.userInfo, { | |||
| headImage: '请选择头像', | |||
| nickName: '请填写昵称', | |||
| })) { | |||
| return | |||
| } | |||
| self.$api('updateInfo', self.userInfo, res => { | |||
| if (res.code == 200) { | |||
| uni.switchTab({ | |||
| url:'/pages/index/index' | |||
| }) | |||
| } | |||
| }) | |||
| }) | |||
| }, | |||
| } | |||
| } | |||
| </script> | |||
| <style lang="scss" scoped> | |||
| .login { | |||
| display: flex; | |||
| flex-direction: column; | |||
| justify-content: center; | |||
| align-items: center; | |||
| height: 80vh; | |||
| .title { | |||
| line-height: 45rpx; | |||
| font-weight: 900; | |||
| } | |||
| .line { | |||
| display: flex; | |||
| justify-content: space-between; | |||
| align-items: center; | |||
| width: 80%; | |||
| border-bottom: 1px solid #00000023; | |||
| padding: 30rpx 0; | |||
| margin: 0 auto; | |||
| } | |||
| .chooseAvatar { | |||
| width: 100%; | |||
| padding: 0; | |||
| margin: 0; | |||
| margin-top: 10vh; | |||
| border: none; | |||
| } | |||
| .btn { | |||
| // background: $uni-linear-gradient-btn-color; | |||
| background: $uni-color; | |||
| color: #fff; | |||
| width: 80%; | |||
| padding: 20rpx 0; | |||
| text-align: center; | |||
| border-radius: 15rpx; | |||
| margin-top: 10vh; | |||
| } | |||
| } | |||
| </style> | |||
| @ -1,254 +0,0 @@ | |||
| <template> | |||
| <view class="page__view"> | |||
| <!-- 导航栏 --> | |||
| <navbar :title="title" leftClick @leftClick="$utils.navigateBack" bgColor="#4883F9" color="#FFFFFF" /> | |||
| <view class="top"> | |||
| <!-- 搜索栏 --> | |||
| <view class="search"> | |||
| <uv-search v-model="keyword" placeholder="输入关键词搜索" bgColor="#FBFBFB" @custom="search" @search="search"> | |||
| <template #prefix> | |||
| <image class="search-icon" src="@/static/image/icon-search.png" mode="widthFix"></image> | |||
| </template> | |||
| </uv-search> | |||
| </view> | |||
| </view> | |||
| <view class="main"> | |||
| <view class="flex card" v-for="item in list" :key="item.id"> | |||
| <view class="left"> | |||
| <view class="title">{{ item.title }}</view> | |||
| <view class="content">{{ item.content }}</view> | |||
| </view> | |||
| <view class="right"> | |||
| <image class="img" :src="item.image" mode="aspectFill"></image> | |||
| </view> | |||
| </view> | |||
| </view> | |||
| </view> | |||
| </template> | |||
| <script> | |||
| import mixinsList from '@/mixins/list.js' | |||
| export default { | |||
| mixins: [mixinsList], | |||
| data() { | |||
| return { | |||
| title: '搜索', | |||
| keyword: '', | |||
| queryParams: { | |||
| pageNo: 1, | |||
| pageSize: 10, | |||
| title: null, | |||
| cid: null, | |||
| }, | |||
| // todo | |||
| mixinsListApi: '', | |||
| } | |||
| }, | |||
| onLoad({ search, cid, title }) { | |||
| if (search) { | |||
| this.keyword = search | |||
| this.queryParams.title = search | |||
| } | |||
| if (cid) { | |||
| this.queryParams.cid = cid | |||
| } | |||
| if (title) { | |||
| this.title = title | |||
| } | |||
| this.getData() | |||
| }, | |||
| methods: { | |||
| search() { | |||
| this.queryParams.pageNo = 1 | |||
| this.queryParams.pageSize = 10 | |||
| this.queryParams.title = this.keyword | |||
| this.getData() | |||
| }, | |||
| // todo: delete | |||
| getData() { | |||
| this.list = [ | |||
| { | |||
| id: '001', | |||
| title: '建筑学', | |||
| content: ` | |||
| <h>建筑学</h> | |||
| <p>文字说明</p> | |||
| <p>文字说明</p> | |||
| <p>文字说明</p> | |||
| <p>文字说明</p> | |||
| <p>文字说明</p> | |||
| <p>文字说明</p> | |||
| <p>文字说明</p> | |||
| <p>文字说明</p> | |||
| <p>文字说明</p> | |||
| <p>文字说明</p> | |||
| <p>文字说明</p> | |||
| <p>文字说明</p> | |||
| <p>文字说明</p> | |||
| <p>文字说明</p> | |||
| <p>文字说明</p> | |||
| <p>文字说明</p> | |||
| <p>文字说明</p> | |||
| <p>文字说明</p> | |||
| <p>文字说明</p> | |||
| <p>文字说明</p> | |||
| <p>文字说明</p> | |||
| <p>文字说明</p> | |||
| <p>文字说明</p> | |||
| <p>文字说明</p> | |||
| <p>文字说明</p> | |||
| <p>文字说明</p> | |||
| <p>文字说明</p> | |||
| <p>文字说明</p> | |||
| <p>文字说明</p> | |||
| <p>文字说明</p> | |||
| <p>文字说明</p> | |||
| `, | |||
| image: '/static/image/temp-1.png', | |||
| }, | |||
| { | |||
| id: '002', | |||
| title: '建筑学', | |||
| content: ` | |||
| <h>建筑学</h> | |||
| <p>文字说明</p> | |||
| <p>文字说明</p> | |||
| <p>文字说明</p> | |||
| <p>文字说明</p> | |||
| <p>文字说明</p> | |||
| <p>文字说明</p> | |||
| <p>文字说明</p> | |||
| <p>文字说明</p> | |||
| <p>文字说明</p> | |||
| <p>文字说明</p> | |||
| <p>文字说明</p> | |||
| <p>文字说明</p> | |||
| <p>文字说明</p> | |||
| <p>文字说明</p> | |||
| <p>文字说明</p> | |||
| <p>文字说明</p> | |||
| <p>文字说明</p> | |||
| <p>文字说明</p> | |||
| <p>文字说明</p> | |||
| <p>文字说明</p> | |||
| <p>文字说明</p> | |||
| <p>文字说明</p> | |||
| <p>文字说明</p> | |||
| <p>文字说明</p> | |||
| <p>文字说明</p> | |||
| <p>文字说明</p> | |||
| <p>文字说明</p> | |||
| <p>文字说明</p> | |||
| <p>文字说明</p> | |||
| <p>文字说明</p> | |||
| <p>文字说明</p> | |||
| `, | |||
| image: '/static/image/temp-2.png', | |||
| }, | |||
| ] | |||
| this.getDataThen(this.list) | |||
| }, | |||
| getDataThen(list) { | |||
| const reg = /\<[^>]*\>/g | |||
| this.list = list.map(item => { | |||
| const content = item.content.replace(reg, '') | |||
| return { ...item, content } | |||
| }) | |||
| }, | |||
| }, | |||
| } | |||
| </script> | |||
| <style scoped lang="scss"> | |||
| .page__view { | |||
| background: $uni-bg-color-grey; | |||
| } | |||
| .top { | |||
| padding: 49rpx 0 17rpx 0; | |||
| box-sizing: border-box; | |||
| background: $uni-color; | |||
| } | |||
| .search { | |||
| margin: 0 19rpx; | |||
| width: calc(100% - 20rpx * 2); | |||
| background-color: #FFFFFF; | |||
| border-radius: 37rpx; | |||
| padding: 13rpx 0 13rpx 18rpx; | |||
| box-sizing: border-box; | |||
| display: flex; | |||
| align-items: center; | |||
| /deep/ .uv-search__action { | |||
| color: $uni-color; | |||
| padding: 10rpx 18rpx; | |||
| } | |||
| &-icon { | |||
| width: 26rpx; | |||
| height: auto; | |||
| } | |||
| } | |||
| .main { | |||
| padding: 17rpx; | |||
| box-sizing: border-box; | |||
| } | |||
| .card { | |||
| background: #ffffff; | |||
| border-radius: 20rpx; | |||
| box-shadow: 0rpx 3rpx 6rpx 0rpx rgba(0,0,0,0.16); | |||
| & + & { | |||
| margin-top: 27rpx; | |||
| } | |||
| .left { | |||
| flex: 1; | |||
| padding: 13rpx 32rpx 35rpx 20rpx; | |||
| box-sizing: border-box; | |||
| .title { | |||
| font-size: 32rpx; | |||
| font-weight: 700; | |||
| color: #000000; | |||
| } | |||
| .content { | |||
| font-size: 28rpx; | |||
| font-weight: 400; | |||
| color: #0F2248; | |||
| overflow: hidden; | |||
| text-overflow: ellipsis; | |||
| display:-webkit-box; //作为弹性伸缩盒子模型显示。 | |||
| -webkit-box-orient:vertical; //设置伸缩盒子的子元素排列方式--从上到下垂直排列 | |||
| -webkit-line-clamp:7; //显示的行 | |||
| } | |||
| } | |||
| .right { | |||
| padding: 23rpx 17rpx 23rpx 0; | |||
| box-sizing: border-box; | |||
| .img { | |||
| width: 225rpx; | |||
| height: 325rpx; | |||
| } | |||
| } | |||
| } | |||
| </style> | |||
| @ -0,0 +1,660 @@ | |||
| <template> | |||
| <view class="page__view"> | |||
| <!-- 导航栏 --> | |||
| <navbar :title="title" leftClick @leftClick="$utils.navigateBack" bgColor="#4883F9" color="#FFFFFF" /> | |||
| <!-- 轮播图 --> | |||
| <view class="swiper"> | |||
| <uv-swiper :list="bannerList" keyName="image" :autoplay="bannerList.length" :indicator="bannerList.length" indicatorMode="dot" indicatorActiveColor="#4883F9" indicatorInactiveColor="#FFFFFF" height="424rpx"></uv-swiper> | |||
| </view> | |||
| <!-- 发表全流程辅导 --> | |||
| <view class="section"> | |||
| <view class="section-header">发表全流程辅导</view> | |||
| <view class="section-content paragraph process"> | |||
| <view class="paragraph"> | |||
| <view class="flex difficulty"> | |||
| <view>难度</view> | |||
| <uv-rate :value="process.difficulty" size="28rpx" activeColor="#4883F9" :allowHalf="true" :minCount="0.5" readonly></uv-rate> | |||
| </view> | |||
| <view>{{ process.content }}</view> | |||
| </view> | |||
| </view> | |||
| </view> | |||
| <!-- 可发表方向 --> | |||
| <view class="section"> | |||
| <view class="section-header"> | |||
| <view class="section-header-line"></view> | |||
| <view>可发表方向</view> | |||
| </view> | |||
| <view class="section-content direction"> | |||
| <view class="table"> | |||
| <view class="table-row" v-for="row in direction" :key="row.id"> | |||
| <view class="table-cell">{{ row.title }}</view> | |||
| <view class="table-cell">{{ row.desc }}</view> | |||
| </view> | |||
| </view> | |||
| </view> | |||
| </view> | |||
| <!-- 师资介绍 --> | |||
| <view class="section"> | |||
| <view class="section-header"> | |||
| <view class="section-header-line"></view> | |||
| <view>师资介绍</view> | |||
| </view> | |||
| <view class="section-content teachers"> | |||
| <view class="card" v-for="item in teachers" :key="item.id"> | |||
| <view class="info"> | |||
| <view class="title"> | |||
| <view class="name">{{ item.name }}</view> | |||
| <view class="label"> | |||
| <view class="label-text">{{ item.label }}</view> | |||
| <view class="label-line"></view> | |||
| </view> | |||
| </view> | |||
| <view class="tag"> | |||
| <image class="tag-icon" src="@/static/image/icon-degree.png" mode="widthFix"></image> | |||
| <vie>{{ item.degree }}</vie> | |||
| </view> | |||
| <view class="desc"> | |||
| <view>专业经历:</view> | |||
| <view>{{ item.experience }}</view> | |||
| </view> | |||
| </view> | |||
| <view class="pic"> | |||
| <image class="img" :src="item.image" mode="aspectFill"></image> | |||
| </view> | |||
| </view> | |||
| </view> | |||
| </view> | |||
| <!-- 课程安排 --> | |||
| <view class="section"> | |||
| <view class="section-header"> | |||
| <view class="section-header-line"></view> | |||
| <view>课程安排</view> | |||
| </view> | |||
| <view class="section-content"> | |||
| <view class="table"> | |||
| <view class="table-row" v-for="row in course" :key="row.id"> | |||
| <view class="table-cell"> | |||
| <view>{{ row.title }}</view> | |||
| <view>{{ `(共${row.length}课时)` }}</view> | |||
| </view> | |||
| <view class="table-cell">{{ row.desc }}</view> | |||
| </view> | |||
| </view> | |||
| </view> | |||
| </view> | |||
| <!-- 适用人群 --> | |||
| <view class="section"> | |||
| <view class="section-header"> | |||
| <view class="section-header-line"></view> | |||
| <view>适用人群</view> | |||
| </view> | |||
| <view class="section-content target-audience"> | |||
| <view class="paragraph"> | |||
| {{ targetAudience }} | |||
| </view> | |||
| </view> | |||
| </view> | |||
| <!-- 期刊推荐 --> | |||
| <view class="section"> | |||
| <view class="section-header"> | |||
| <view class="section-header-line"></view> | |||
| <view>期刊推荐</view> | |||
| </view> | |||
| <view class="section-content journal"> | |||
| <view class="box" v-for="item in journal" :key="item.id"> | |||
| <view class="card"> | |||
| <view class="top"> | |||
| <view class="pic"> | |||
| <image class="img" :src="item.image" mode="aspectFill"></image> | |||
| </view> | |||
| <view class="info"> | |||
| <view class="name">{{ item.name }}</view> | |||
| <view class="desc">{{ item.desc }}</view> | |||
| </view> | |||
| </view> | |||
| <view class="main"> | |||
| {{ item.intro }} | |||
| </view> | |||
| </view> | |||
| </view> | |||
| </view> | |||
| </view> | |||
| <!-- 附加材料 --> | |||
| <view class="section"> | |||
| <view class="section-header"> | |||
| <view class="section-header-line"></view> | |||
| <view>附加材料</view> | |||
| </view> | |||
| <view class="section-content attachment"> | |||
| <view class="flex file" v-for="item in attachment" :key="item.id"> | |||
| <view class="file-info"> | |||
| <template v-if="item.type == 'pdf'"> | |||
| <image class="file-icon" src="@/static/image/icon-pdf.png" mode="widthFix"></image> | |||
| </template> | |||
| <template v-else> | |||
| <image class="file-icon" src="@/static/image/icon-word.png" mode="widthFix"></image> | |||
| </template> | |||
| <view class="file-detail"> | |||
| <view class="title">{{ item.name }}</view> | |||
| <view class="desc">{{ `${item.type} ${item.size}MB` }}</view> | |||
| </view> | |||
| </view> | |||
| <button class="btn" @click="downloadFile(item.url)">下载</button> | |||
| </view> | |||
| </view> | |||
| </view> | |||
| </view> | |||
| </template> | |||
| <script> | |||
| export default { | |||
| data() { | |||
| return { | |||
| title: '', | |||
| bannerList: [], | |||
| process: {}, | |||
| direction: [], | |||
| teachers: [], | |||
| course: [], | |||
| targetAudience: '', | |||
| journal: [], | |||
| attachment: [], | |||
| } | |||
| }, | |||
| onLoad({ id }) { | |||
| this.getData(id) | |||
| }, | |||
| methods: { | |||
| async getData(thesisId) { | |||
| try { | |||
| // todo | |||
| await this.$fetch('queryThesisById', { thesisId }) | |||
| } catch (err) { | |||
| } | |||
| // todo: delete | |||
| this.title = '建筑学学科论文' | |||
| this.bannerList = [ | |||
| { image: '/static/image/temp-1.png' }, | |||
| { image: '/static/image/temp-2.png' }, | |||
| { image: '/static/image/temp-3.png' }, | |||
| { image: '/static/image/temp-2.png' }, | |||
| ] | |||
| this.process = { | |||
| difficulty: 4, | |||
| content: `导周期本次辅导共包含15课时,每课时60分钟通常建议辅导周期为2-3个月,可根据学员进度个性化调整。发表周期6-12个月不等(包含论文撰写、修改、投稿、审稿等环节)期刊不同。周期有所差异,平均审稿期为3-6月。结果产出定制选题报告与研究框架辅导高质量学术论文初稿+多轮修改辅导完整投稿材料包(含CoverLetter、格式排版等)AHCI核心期刊正式发表 | |||
| ` | |||
| } | |||
| this.direction = [ | |||
| { | |||
| id: '001', | |||
| title: '建筑历史方向', | |||
| desc: '聚焦不同时期建筑风格,流派演变,哲学美学(如现象学)与建筑关联,经典或当代实(如生态建筑)、标志性建筑项目实践案例。', | |||
| }, | |||
| { | |||
| id: '002', | |||
| title: '建筑设计实践', | |||
| desc: '创新设计流程(含参数化计)、可持续设计(如生态建筑)、标志性建筑项目实践案例。', | |||
| }, | |||
| { | |||
| id: '003', | |||
| title: '建筑技术与工程', | |||
| desc: '创新设计流程(含参数化计)、可持续设计(如生态建筑)、标志性建筑项目实践案例。', | |||
| }, | |||
| ] | |||
| this.teachers = [ | |||
| { | |||
| id: '001', | |||
| name: 'Elizabeth', | |||
| label: '文化与技术融合研究者', | |||
| degree: '牛津大学建筑学博士', | |||
| image: '/static/image/temp-11.png', | |||
| experience: ` | |||
| 于《Building Environment》等权威期刊发表多篇论文;教学特色:擅长以项目制教学打通理论到实践的闭环,学生团队多次斩获亚洲建筑新人赛大奖。 | |||
| ` | |||
| }, | |||
| { | |||
| id: '002', | |||
| name: 'Elizabeth', | |||
| label: '文化与技术融合研究者', | |||
| degree: '牛津大学建筑学博士', | |||
| image: '/static/image/temp-12.png', | |||
| experience: ` | |||
| 于《Building Environment》等权威期刊发表多篇论文;教学特色:擅长以项目制教学打通理论到实践的闭环,学生团队多次斩获亚洲建筑新人赛大奖。 | |||
| ` | |||
| }, | |||
| ] | |||
| this.course = [ | |||
| { | |||
| id: '001', | |||
| title: '选题指导', | |||
| length: 4, | |||
| desc: '探讨当前建筑学热点与研究势,启发学员形成研究兴出与方向在导师引导下,完成选题定位、研究问题设定;', | |||
| }, | |||
| { | |||
| id: '002', | |||
| title: '论文撰写辅导', | |||
| length: 4, | |||
| desc: '创新设计流程(含参数化计)、可持续设计(如生态建筑)、标志性建筑项目实践案例。', | |||
| }, | |||
| { | |||
| id: '003', | |||
| title: '论文修改与润色提升', | |||
| length: 4, | |||
| desc: '......', | |||
| }, | |||
| ] | |||
| this.targetAudience = `正在攻读本科、硕土或博士阶段建筑学、城市设计、景观建筑、建筑历史与理论等相关专业的学生 | |||
| ·有志申请海外建筑类高校研究生项目、需准备具有深度与原创性的学术写作材料的申请者; | |||
| -准备参与各类学术会议、论文竟赛、设计研究发表等活动的高校建筑学子; | |||
| .希望将设计实践与理论研究相结合,通过论文提升学术表达与评职称的建筑从业者或高校教师; | |||
| ,对跨学科建筑议题(如空间社会学、建筑文化研究、数字建构等)有浓厚兴趣,并计划在学术方向深入发展的研究者。 | |||
| ` | |||
| this.journal = [ | |||
| { | |||
| id: '001', | |||
| name: 'Journal of Architecture', | |||
| desc: '发表难度中等偏难,审稿周期较长,注重研究的创新性。', | |||
| intro: '专注于建筑理论与历史研究。该刊理论性强,特别欢迎跨学科、历史与文化视角的论文,期刊适合深度分析与批评性研究。作为AHCI核刊。JCRQ2分区。影响因子1.2。', | |||
| image: '/static/image/temp-13.png', | |||
| }, | |||
| { | |||
| id: '002', | |||
| name: 'Journal of Architecture', | |||
| desc: '发表难度中等偏难,审稿周期较长,注重研究的创新性。', | |||
| intro: '专注于建筑理论与历史研究。该刊理论性强,特别欢迎跨学科、历史与文化视角的论文,期刊适合深度分析与批评性研究。作为AHCI核刊。JCRQ2分区。影响因子1.2。', | |||
| image: '/static/image/temp-14.png', | |||
| }, | |||
| ] | |||
| this.attachment = [ | |||
| { | |||
| id: '001', | |||
| name: '学术平台手册.pdf', | |||
| type: 'pdf', | |||
| size: 6.37, | |||
| url: 'https://www.klook.cn/klvoucher/UENZOG10SE81amgzbURkNXhvRVhFeXFIaDJONnpYb0gyQUNFYURJRzlQVjlydTJUZGFGaVpCM3VmYW1wUnhKSkp0bDBUK2IvekU4Vk14RmhacTJ2d0VqVEVCUHlMZ0JFelNycGxGdTl4VTA9.pdf?from_source=email&from_medium=system_email&from_campaign=TTD_pretrip2_booking_confirmation_base', | |||
| }, | |||
| { | |||
| id: '002', | |||
| name: '学术平台手册.doc', | |||
| type: 'word', | |||
| size: 6.37, | |||
| url: 'https://qcloud.dpfile.com/pc/myug_luLpDQj6VgAsrUXgol_FrfrTcsVfpzy8-1PMV3uCvjEkdZxjKI_hzpUwDOs.jpg', | |||
| }, | |||
| ] | |||
| }, | |||
| downloadFile(url) { | |||
| console.log('downloadFile', url) | |||
| uni.downloadFile({ | |||
| url, // 文件地址 | |||
| success: (downloadRes) => { | |||
| console.log('downloadRes', downloadRes) | |||
| if (downloadRes.statusCode === 200) { | |||
| uni.openDocument({ | |||
| showMenu: true, | |||
| filePath: downloadRes.tempFilePath, | |||
| success: () => console.log('打开成功') | |||
| }); | |||
| } else { | |||
| uni.showToast({ title: '下载失败', icon: 'none' }); | |||
| } | |||
| }, | |||
| fail: (err) => { | |||
| uni.showToast({ title: '网络异常', icon: 'none' }); | |||
| } | |||
| }); | |||
| }, | |||
| }, | |||
| } | |||
| </script> | |||
| <style scoped lang="scss"> | |||
| .page__view { | |||
| padding-bottom: 62rpx; | |||
| background: #FFFFFF; | |||
| } | |||
| .swiper { | |||
| margin: 20rpx 18rpx 32rpx 18rpx; | |||
| /deep/ .uv-swiper-indicator__wrapper__dot { | |||
| width: 15rpx; | |||
| height: 15rpx; | |||
| } | |||
| /deep/ .uv-swiper-indicator__wrapper__dot--active { | |||
| width: 15rpx; | |||
| } | |||
| } | |||
| .section { | |||
| width: 100%; | |||
| padding: 0 18rpx; | |||
| box-sizing: border-box; | |||
| & + & { | |||
| margin-top: 40rpx; | |||
| } | |||
| &-header { | |||
| display: flex; | |||
| align-items: center; | |||
| justify-content: flex-start; | |||
| column-gap: 15rpx; | |||
| padding-left: 18rpx; | |||
| font-size: 32rpx; | |||
| font-weight: 700; | |||
| color: #000000; | |||
| &-line { | |||
| width: 11rpx; | |||
| height: 45rpx; | |||
| border-radius: 6rpx; | |||
| background-image: linear-gradient(#FFFFFF, #4883F9); | |||
| } | |||
| } | |||
| &-content { | |||
| margin-top: 37rpx; | |||
| .paragraph { | |||
| width: 100%; | |||
| padding: 22rpx; | |||
| box-sizing: border-box; | |||
| white-space: pre-line; | |||
| font-size: 28rpx; | |||
| color: #000000; | |||
| background: #F8F8F8; | |||
| border-radius: 15rpx; | |||
| } | |||
| .table { | |||
| width: 100%; | |||
| border-radius: 15rpx; | |||
| overflow: hidden; | |||
| &-row { | |||
| display: grid; | |||
| grid-template-columns: 218rpx auto; | |||
| background: #EEEEEE; | |||
| &:nth-child(2n) { | |||
| background: #DEDEDE; | |||
| } | |||
| } | |||
| &-cell { | |||
| display: inline-flex; | |||
| flex-direction: column; | |||
| align-items: flex-start; | |||
| justify-content: center; | |||
| padding: 17rpx; | |||
| box-sizing: border-box; | |||
| font-family: PingFang SC; | |||
| font-weight: 400; | |||
| font-size: 28rpx; | |||
| color: #080808; | |||
| &:first-child { | |||
| border-right: 1rpx solid #E5E5E5; | |||
| } | |||
| } | |||
| } | |||
| &.process { | |||
| margin-top: 24rpx; | |||
| .difficulty { | |||
| justify-content: flex-start; | |||
| } | |||
| } | |||
| &.teachers { | |||
| .card { | |||
| display: flex; | |||
| align-items: center; | |||
| column-gap: 12rpx; | |||
| background: #ffffff; | |||
| border-radius: 15rpx; | |||
| box-shadow: 0rpx 3rpx 6rpx 0rpx rgba(0,0,0,0.16); | |||
| .info { | |||
| flex: 1; | |||
| padding: 19rpx 0 28rpx 17rpx; | |||
| .title { | |||
| display: flex; | |||
| align-items: center; | |||
| padding-left: 11rpx; | |||
| color: #000000; | |||
| .name { | |||
| font-size: 32rpx; | |||
| font-weight: 700; | |||
| } | |||
| .label { | |||
| margin-left: 12rpx; | |||
| position: relative; | |||
| height: 30rpx; | |||
| &-line { | |||
| margin: 24rpx 0 0 25rpx; | |||
| width: 195rpx; | |||
| height: 4rpx; | |||
| background-image: linear-gradient(#4883F9, #FFFFFF); | |||
| border-radius: 2rpx; | |||
| } | |||
| &-text { | |||
| position: absolute; | |||
| top: 0; | |||
| left: 0; | |||
| font-size: 22rpx; | |||
| font-weight: 400; | |||
| } | |||
| } | |||
| } | |||
| .tag { | |||
| margin: 5rpx 0 18rpx 0; | |||
| display: inline-flex; | |||
| align-items: center; | |||
| padding: 5rpx 43rpx 5rpx 16rpx; | |||
| column-gap: 16rpx; | |||
| font-size: 28rpx; | |||
| color: #FFFFFF; | |||
| background: rgba(72,131,249,0.58); | |||
| border-radius: 30rpx 0rpx 30rpx 0rpx; | |||
| &-icon { | |||
| width: 38rpx; | |||
| height: auto; | |||
| } | |||
| } | |||
| .desc { | |||
| padding: 12rpx 15rpx; | |||
| font-size: 28rpx; | |||
| font-weight: 500; | |||
| color: #000000; | |||
| background: #f8f8f8; | |||
| border-radius: 16rpx; | |||
| } | |||
| } | |||
| .pic { | |||
| padding: 48rpx 9rpx 48rpx 0; | |||
| width: 253rpx; | |||
| height: 345rpx; | |||
| border-radius: 127rpx; | |||
| overflow: hidden; | |||
| .img { | |||
| width: 100%; | |||
| height: 100%; | |||
| } | |||
| } | |||
| &:nth-child(2n) { | |||
| flex-direction: row-reverse; | |||
| .info { | |||
| padding: 19rpx 17rpx 28rpx 0; | |||
| } | |||
| .pic { | |||
| padding: 48rpx 0 48rpx 9rpx; | |||
| } | |||
| } | |||
| } | |||
| .card + .card { | |||
| margin-top: 24rpx; | |||
| } | |||
| } | |||
| &.journal { | |||
| .box { | |||
| padding-top: 73rpx; | |||
| .card { | |||
| padding: 29rpx 12rpx 19rpx 12rpx; | |||
| background: #f6f6f6; | |||
| border-radius: 15rpx; | |||
| box-shadow: 0rpx 3rpx 6rpx 0rpx rgba(0,0,0,0.16); | |||
| .top { | |||
| position: relative; | |||
| .pic { | |||
| position: absolute; | |||
| left: 42rpx; | |||
| bottom: 0; | |||
| width: 213rpx; | |||
| height: 285rpx; | |||
| .img { | |||
| width: 100%; | |||
| height: 100%; | |||
| } | |||
| } | |||
| .info { | |||
| height: 181rpx; | |||
| padding: 0 14rpx 0 266rpx; | |||
| } | |||
| } | |||
| .main { | |||
| margin-top: 18rpx; | |||
| padding: 14rpx; | |||
| font-size: 28rpx; | |||
| color: #000000; | |||
| background: #ebebeb; | |||
| border-radius: 30rpx 0rpx 30rpx 0rpx; | |||
| } | |||
| } | |||
| &:nth-child(2n) { | |||
| .card { | |||
| .top { | |||
| .info { | |||
| padding: 0 258rpx 0 14rpx; | |||
| } | |||
| .pic { | |||
| left: unset; | |||
| right: 29rpx; | |||
| } | |||
| } | |||
| } | |||
| } | |||
| } | |||
| .box + .box { | |||
| margin-top: 28rpx; | |||
| } | |||
| } | |||
| &.attachment { | |||
| .file { | |||
| justify-content: space-between; | |||
| padding: 32rpx 15rpx 32rpx 26rpx; | |||
| background: #f8f8f8; | |||
| border-radius: 15rpx; | |||
| &-info { | |||
| display: flex; | |||
| align-items: flex-end; | |||
| } | |||
| &-icon { | |||
| width: 64rpx; | |||
| height: auto; | |||
| } | |||
| &-detail { | |||
| margin-left: 14rpx; | |||
| .title { | |||
| font-size: 30rpx; | |||
| color: #000000; | |||
| } | |||
| .desc { | |||
| font-size: 28rpx; | |||
| color: #999999; | |||
| } | |||
| } | |||
| .btn { | |||
| padding: 7rpx 30rpx; | |||
| font-size: 28rpx; | |||
| color: #FFFFFF; | |||
| background: #4883f9; | |||
| border-radius: 27rpx; | |||
| } | |||
| } | |||
| .file + .file { | |||
| margin-top: 21rpx; | |||
| } | |||
| } | |||
| } | |||
| } | |||
| </style> | |||
| @ -0,0 +1,191 @@ | |||
| <template> | |||
| <view class="page__view"> | |||
| <!-- 导航栏 --> | |||
| <navbar :title="title" leftClick @leftClick="$utils.navigateBack" bgColor="#4883F9" color="#FFFFFF" /> | |||
| <view class="top"> | |||
| <!-- 搜索栏 --> | |||
| <view class="search"> | |||
| <uv-search v-model="keyword" placeholder="输入关键词搜索" bgColor="#FBFBFB" @custom="search" @search="search"> | |||
| <template #prefix> | |||
| <image class="search-icon" src="@/static/image/icon-search.png" mode="widthFix"></image> | |||
| </template> | |||
| </uv-search> | |||
| </view> | |||
| </view> | |||
| <view class="main"> | |||
| <template v-if="total"> | |||
| <view class="flex card" v-for="item in list" :key="item.id" @click="jumpToDetail(item.thesisId)"> | |||
| <view class="left"> | |||
| <view class="title">{{ item.title }}</view> | |||
| <view class="content">{{ item.description }}</view> | |||
| </view> | |||
| <view class="right"> | |||
| <image class="img" :src="item.image" mode="aspectFill"></image> | |||
| </view> | |||
| </view> | |||
| </template> | |||
| <template v-else> | |||
| <view class="flex empty"> | |||
| <image class="empty-icon" src="@/static/image/icon-empty.png" mode="widthFix"></image> | |||
| </view> | |||
| </template> | |||
| </view> | |||
| </view> | |||
| </template> | |||
| <script> | |||
| import mixinsList from '@/mixins/list.js' | |||
| export default { | |||
| mixins: [mixinsList], | |||
| data() { | |||
| return { | |||
| title: '搜索', | |||
| keyword: '', | |||
| queryParams: { | |||
| pageNo: 1, | |||
| pageSize: 10, | |||
| title: null, | |||
| cid: null, | |||
| }, | |||
| mixinsListApi: 'queryThesisList', | |||
| } | |||
| }, | |||
| onLoad({ search, categoryOne, categoryTwo, title }) { | |||
| if (search) { | |||
| this.keyword = search | |||
| this.queryParams.title = search | |||
| } | |||
| if (categoryTwo) { | |||
| this.queryParams.categoryOne = categoryOne | |||
| this.queryParams.categoryTwo = categoryTwo | |||
| } | |||
| if (title) { | |||
| this.title = title | |||
| } | |||
| this.getData() | |||
| }, | |||
| methods: { | |||
| search() { | |||
| this.queryParams.pageNo = 1 | |||
| this.queryParams.pageSize = 10 | |||
| this.queryParams.title = this.keyword | |||
| this.getData() | |||
| }, | |||
| getDataThen(list) { | |||
| // todo: check | |||
| const reg = /\<[^>]*\>/g | |||
| this.list = list.map(item => { | |||
| const description = item.description.replace(reg, '') | |||
| return { ...item, description } | |||
| }) | |||
| }, | |||
| jumpToDetail(thesisId) { | |||
| uni.navigateTo({ | |||
| url: `/pages_order/thesis/index?thesisId=${thesisId}` | |||
| }) | |||
| }, | |||
| }, | |||
| } | |||
| </script> | |||
| <style scoped lang="scss"> | |||
| .page__view { | |||
| background: $uni-bg-color-grey; | |||
| } | |||
| .top { | |||
| padding: 49rpx 0 17rpx 0; | |||
| box-sizing: border-box; | |||
| background: $uni-color; | |||
| } | |||
| .search { | |||
| margin: 0 19rpx; | |||
| width: calc(100% - 20rpx * 2); | |||
| background-color: #FFFFFF; | |||
| border-radius: 37rpx; | |||
| padding: 13rpx 0 13rpx 18rpx; | |||
| box-sizing: border-box; | |||
| display: flex; | |||
| align-items: center; | |||
| /deep/ .uv-search__action { | |||
| color: $uni-color; | |||
| padding: 10rpx 18rpx; | |||
| } | |||
| &-icon { | |||
| width: 26rpx; | |||
| height: auto; | |||
| } | |||
| } | |||
| .main { | |||
| padding: 17rpx; | |||
| box-sizing: border-box; | |||
| } | |||
| .card { | |||
| background: #ffffff; | |||
| border-radius: 20rpx; | |||
| box-shadow: 0rpx 3rpx 6rpx 0rpx rgba(0,0,0,0.16); | |||
| & + & { | |||
| margin-top: 27rpx; | |||
| } | |||
| .left { | |||
| flex: 1; | |||
| padding: 13rpx 32rpx 35rpx 20rpx; | |||
| box-sizing: border-box; | |||
| .title { | |||
| font-size: 32rpx; | |||
| font-weight: 700; | |||
| color: #000000; | |||
| } | |||
| .content { | |||
| font-size: 28rpx; | |||
| font-weight: 400; | |||
| color: #0F2248; | |||
| overflow: hidden; | |||
| text-overflow: ellipsis; | |||
| display:-webkit-box; //作为弹性伸缩盒子模型显示。 | |||
| -webkit-box-orient:vertical; //设置伸缩盒子的子元素排列方式--从上到下垂直排列 | |||
| -webkit-line-clamp:7; //显示的行 | |||
| } | |||
| } | |||
| .right { | |||
| padding: 23rpx 17rpx 23rpx 0; | |||
| box-sizing: border-box; | |||
| .img { | |||
| width: 225rpx; | |||
| height: 325rpx; | |||
| } | |||
| } | |||
| } | |||
| .empty { | |||
| margin-top: 165rpx; | |||
| width: 100%; | |||
| &-icon { | |||
| width: 464rpx; | |||
| height: auto; | |||
| } | |||
| } | |||
| </style> | |||