Browse Source

1.基本信息填写 2.添加行程 3.申请健康码

remotes/origin/HEAD
songsong428 5 years ago
parent
commit
42ca367f5b
  1. 34
      common/script/util.js
  2. 6
      common/style/iconfont.scss
  3. 32
      components/timeline/timeline.vue
  4. 124
      components/uni-segmented-control/uni-segmented-control.vue
  5. 27
      pages.json
  6. 144
      pages/add-stroke/add-stroke.vue
  7. 56
      pages/add-stroke/components/date-selector.vue
  8. 213
      pages/apply-code/apply-code.vue
  9. 38
      pages/basic-info/basic-info.vue
  10. 23
      pages/index/components/home.vue
  11. 24
      pages/index/components/mine.vue
  12. 63
      pages/my-signs/my-signs.vue
  13. BIN
      static/img/qrcode.png
  14. 2
      uni.scss

34
common/script/util.js

@ -0,0 +1,34 @@
/**
* 显示模态框
* @param {string} msg
* @param {boolean} showCancel
* @param {string} confirmText
*/
export const showModal = (msg, showCancel = false, confirmText = '知道了') =>
uni.showModal({
title: '提示',
content: msg,
showCancel,
confirmText,
confirmColor: '#1890ff',
});
/**
* 显示toast
* @param {string} msg
*/
export const showToast = msg =>
uni.showToast({
title: msg,
icon: 'none',
duration: 3000,
});
// 显示加载动画
export const showLoading = (msg = '努力加载中...') => uni.showLoading({ title: msg });
// 隐藏加载动画
export const hideLoading = () =>
setTimeout(() => {
uni.hideLoading();
}, 1000);

6
common/style/iconfont.scss

@ -1,5 +1,5 @@
@font-face {font-family: "iconfont";
src: url('data:application/x-font-woff2;charset=utf-8;base64,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') format('woff2'); /* iOS 4.1- */
src: url('data:application/x-font-woff2;charset=utf-8;base64,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') format('woff2'); /* iOS 4.1- */
}
.iconfont {
@ -10,6 +10,10 @@
-moz-osx-font-smoothing: grayscale;
}
.icon-border:before {
content: "\e7a9";
}
.icon-timer:before {
content: "\e668";
}

32
components/timeline/timeline.vue

@ -0,0 +1,32 @@
<template>
<view>
<view class="cu-timeline">
<view class="cu-time">昨天</view>
<view class="cu-item cur cuIcon-noticefill">
<view class="content bg-green shadow-blur">
<text>22:22</text>广州市快件已到达地球
</view>
</view>
<view class="cu-item text-red cuIcon-attentionforbidfill">
<view class="content bg-red shadow-blur">这是第一次我家的铲屎官走了这么久久到足足有三天</view>
</view>
</view>
<view class="cu-timeline">
<view class="cu-time">06-17</view>
<view class="cu-item">
<view class="content">
<text>01:30</text>喵星 MX-12138 已揽收准备发往银河系
</view>
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {};
},
};
</script>

124
components/uni-segmented-control/uni-segmented-control.vue

@ -0,0 +1,124 @@
<template>
<view :class="[styleType === 'text'?'segmented-control--text' : 'segmented-control--button' ]" :style="{ borderColor: styleType === 'text' ? '' : activeColor }"
class="segmented-control">
<view v-for="(item, index) in values" :class="[ styleType === 'text'?'segmented-control__item--text': 'segmented-control__item--button' , index === currentIndex&&styleType === 'button'?'segmented-control__item--button--active': '' , index === 0&&styleType === 'button'?'segmented-control__item--button--first': '',index === values.length - 1&&styleType === 'button'?'segmented-control__item--button--last': '' ]"
:key="index" :style="{
backgroundColor: index === currentIndex && styleType === 'button' ? activeColor : '',borderColor: index === currentIndex&&styleType === 'text'||styleType === 'button'?activeColor:'transparent'
}"
class="segmented-control__item" @click="_onClick(index)">
<text :style="{color:
index === currentIndex
? styleType === 'text'
? activeColor
: '#fff'
: styleType === 'text'
? '#000'
: activeColor}"
class="segmented-control__text">{{ item }}</text>
</view>
</view>
</template>
<script>
export default {
name: 'UniSegmentedControl',
props: {
current: {
type: Number,
default: 0
},
values: {
type: Array,
default () {
return []
}
},
activeColor: {
type: String,
default: '#007aff'
},
styleType: {
type: String,
default: 'button'
}
},
data() {
return {
currentIndex: 0
}
},
watch: {
current(val) {
if (val !== this.currentIndex) {
this.currentIndex = val
}
}
},
created() {
this.currentIndex = this.current
},
methods: {
_onClick(index) {
if (this.currentIndex !== index) {
this.currentIndex = index
this.$emit('clickItem', {currentIndex:index})
}
}
}
}
</script>
<style lang="scss" scoped>
@import '@/uni.scss';
.segmented-control {
/* #ifndef APP-NVUE */
display: flex;
box-sizing: border-box;
/* #endif */
flex-direction: row;
height: 36px;
overflow: hidden;
}
.segmented-control__item {
/* #ifndef APP-NVUE */
display: inline-flex;
box-sizing: border-box;
/* #endif */
position: relative;
flex: 1;
justify-content: center;
align-items: center;
}
.segmented-control__item--button {
border-style: solid;
border-top-width: 1px;
border-bottom-width: 1px;
border-right-width: 1px;
border-left-width: 0;
}
.segmented-control__item--button--first {
border-left-width: 1px;
border-top-left-radius: 5px;
border-bottom-left-radius: 5px;
}
.segmented-control__item--button--last {
border-top-right-radius: 5px;
border-bottom-right-radius: 5px;
}
.segmented-control__item--text {
border-bottom-style: solid;
border-bottom-width: 3px;
}
.segmented-control__text {
font-size: 16px;
line-height: 20px;
text-align: center;
}
</style>

27
pages.json

@ -1,15 +1,19 @@
{
"pages": [
{
"path": "pages/sign/sign",
"path": "pages/index/index",
"style": {
"navigationBarTitleText": "打卡"
"navigationBarTitleText": "山大健康码"
}
},
{
"path": "pages/index/index",
"path": "pages/my-signs/my-signs",
"style": { "navigationBarTitleText": "我的校园打卡" }
},
{
"path": "pages/sign/sign",
"style": {
"navigationBarTitleText": "山大健康码"
"navigationBarTitleText": "打卡"
}
},
{
@ -27,8 +31,19 @@
"style": {
"navigationBarTitleText": "基本信息填写"
}
}
},
{
"path": "pages/add-stroke/add-stroke",
"style": {
"navigationBarTitleText": "添加行程"
}
},
{
"path": "pages/apply-code/apply-code",
"style": {
"navigationBarTitleText": "申请健康码"
}
}
],
"globalStyle": {
"navigationBarTextStyle": "black",

144
pages/add-stroke/add-stroke.vue

@ -0,0 +1,144 @@
<template>
<view>
<form class="padding-lr cu-form-group flex-direction">
<view class="cu-form-group flex flex-direction padding-tb">
<view class="title padding-bottom-sm"><span class="text-red padding-right-xs">*</span>出发时间</view>
<date-selector @change="getStartData" />
</view>
<view class="cu-form-group flex flex-direction padding-tb">
<view class="title padding-bottom-sm"><span class="text-red padding-right-xs">*</span>抵达时间</view>
<date-selector @change="getEndData" />
</view>
<view class="cu-form-group flex flex-direction padding-top">
<view class="text-xl padding-tb-sm">出行交通方式必选</view>
<radio-group class="block" @change="RadioChange">
<view class="cu-list menu text-left">
<view class="cu-item" v-for="(transport,index) in transports" :key="index">
<label class="flex justify-between align-center">
<radio class="round margin-right-xs" :checked="index === current" :value="transport.value"></radio>
<view class="flex-sub" style="font-size: 34rpx;">{{ transport.name }}</view>
</label>
</view>
</view>
</radio-group>
</view>
<view class="cu-form-group flex flex-direction padding-tb">
<view class="title padding-bottom-sm"><span class="text-red padding-right-xs">*</span>乘坐航班车次或车牌号码及座位号没有填无</view>
<input placeholder="请输入" name="input" type="text" v-model="carNumber" />
</view>
</form>
<view class="margin flex flex-wrap">
<view @click="agree = !agree" class="iconfont agree-box" :class="[agree ? 'text-blue icon-check-square': 'text-gray icon-border']"></view>
<view class="text-df text-black flex-sub agree-text">
以上信息是我本人填写本人对信息的真实性和完整性负责
</view>
</view>
<button class="bg-cyan margin primary-btn" hover-class="cc-active" @tap="addStroke">确认提交</button>
</view>
</template>
<script>
import { showToast } from 'common/script/util';
import UniCalendar from 'components/uni-calendar/uni-calendar.vue';
import DateSelector from './components/date-selector.vue';
export default {
components: {UniCalendar,DateSelector},
data() {
return {
transports: [
{
value: '0',
name: '铁路',
},
{
value: '1',
name: '飞机',
},
{
value: '2',
name: '客运车辆',
},
{
value: '3',
name: '自驾',
},
{
value: '4',
name: '船',
},
{
value: '5',
name: '其他',
}
],
carNumber: '',
current: 0,
agree: false
};
},
methods: {
RadioChange: function(evt) {
for (let i = 0; i < this.transports.length; i++) {
if (this.transports[i].value === evt.target.value) {
this.current = i;
break;
}
}
},
/**
* 获取出发时间
* @param {string} start 开始时间
* @param {string} end 截止时间
*/
getData(start, end) {
console.log('出发时间 start, end: ', start, end);
},
/**
* 获取抵达时间
* @param {string} start 开始时间
* @param {string} end 截止时间
*/
getEndData(start, end) {
console.log('抵达时间 start, end: ', start, end);
},
/**
* 提交基本信息
*/
addStroke() {
if (!this.transports) {
showToast('请选择身份');
return;
}
if (!this.carNumber) {
showToast('请输入学号');
return;
}
if (!this.agree) {
showToast('请确定是否为本人填写');
return;
}
console.log('信息提交');
uni.reLaunch({
url: `/pages/index/index`,
});
},
},
};
</script>
<style lang="scss" scoped>
.agree-box{
width: 70rpx;
}
.agree-text{
line-height: 60rpx;
}
.primary-btn{
border-radius: 15rpx;
}
</style>

56
pages/add-stroke/components/date-selector.vue

@ -0,0 +1,56 @@
<template>
<view>
<view @tap="$refs.calendar.open()" hover-class="cc-active">
<view class="iconfont icon-calendar timer"><text class="padding-left-xs">{{ date }}</text></view>
</view>
<uni-calendar
:insert="false"
:range="true"
:show-month="true"
@confirm="handleChange"
ref="calendar"
/>
</view>
</template>
<script>
export default {
name: 'DateSelector',
data() {
const start = this.$moment().format('YYYY-MM-DD');
const end = this.$moment().format('YYYY-MM-DD');
return {
start,
end,
};
},
computed: {
date() {
const { start, end } = this;
return start === end ? start : `${start} - ${end}`;
},
},
methods: {
/**
* 日历确认选择了时间段
* @param {object} value 日历返回对象
*/
handleChange(value) {
const { before, after } = value.range;
this.start = before;
this.end = after;
this.menu = '';
this.$emit('change', before, after);
},
},
};
</script>
<style lang="scss" scoped>
.timer{
font-size: 34rpx!important;
color: $gray;
}
</style>

213
pages/apply-code/apply-code.vue

@ -0,0 +1,213 @@
<template>
<view>
<form class="padding-lr cu-form-group flex-direction">
<view class="cu-form-group flex flex-direction padding-tb">
<view class="title padding-bottom-sm"><span class="text-red padding-right-xs">*</span>当前所在地区</view>
<input placeholder="请输入当前所在地区" name="input" type="text" v-model="area" />
</view>
<view class="cu-form-group flex flex-direction padding-tb">
<view class="title padding-bottom-sm"><span class="text-red padding-right-xs">*</span>当前所在城市</view>
<input placeholder="请输入当前所在城市" name="input" type="text" v-model="city" />
</view>
<view class="cu-form-group flex flex-direction padding-top">
<view class="title padding-bottom-sm"><span class="text-red padding-right-xs">*</span>当前状态</view>
<radio-group class="block" @change="StateChange">
<view class="cu-list menu text-left">
<view class="cu-item" v-for="(state,index) in status" :key="index">
<label class="flex justify-between align-center">
<radio class="round margin-right-xs" :checked="index === current" :value="state.value"></radio>
<view class="flex-sub" style="font-size: 34rpx;">{{ state.name }}</view>
</label>
</view>
</view>
</radio-group>
</view>
<view class="cu-form-group flex flex-direction padding-tb">
<view class="title padding-bottom-sm">就诊医院若无填无</view>
<input placeholder="请输入就诊医院" name="input" type="text" v-model="hospital" />
</view>
<view class="cu-form-group flex flex-direction padding-top">
<view class="title padding-bottom-sm">最近14天是否有武汉居住史旅游史或武汉亲戚来访</view>
<radio-group class="block" @change="TourChange">
<view class="flex">
<view class="flex-sub margin-tb-sm" v-for="(tour,index) in tours" :key="index">
<label class="flex justify-between align-center">
<radio class="round margin-right-xs" :checked="index === tourCurrent" :value="tour.value"></radio>
<text class="flex-sub" style="font-size: 34rpx;">{{ tour.name }}</text>
</label>
</view>
</view>
</radio-group>
</view>
<view class="cu-form-group flex flex-direction padding-top">
<view class="title padding-bottom-sm">最近14天是否有新冠肺炎患者或疑似患者接触史</view>
<radio-group class="block" @change="TouchChange">
<view class="flex">
<view class="flex-sub margin-tb-sm" v-for="(touch,index) in touches" :key="index">
<label class="flex justify-between align-center">
<radio class="round margin-right-xs" :checked="index === touchCurrent" :value="touch.value"></radio>
<text class="flex-sub" style="font-size: 34rpx;">{{ touch.name }}</text>
</label>
</view>
</view>
</radio-group>
</view>
<view class="cu-form-group flex flex-direction padding-tb">
<view class="title padding-bottom-sm"><span class="text-red padding-right-xs">*</span>当前体温</view>
<input placeholder="请输入当前真实体温" name="input" type="number" v-model="temperature" />
</view>
</form>
<view class="margin flex flex-wrap">
<view @click="agree = !agree" class="iconfont agree-box" :class="[agree ? 'text-blue icon-check-square': 'text-gray icon-border']"></view>
<view class="text-df text-black flex-sub agree-text">
以上信息是我本人填写本人对信息的真实性和完整性负责
</view>
</view>
<button class="bg-cyan margin primary-btn" hover-class="cc-active" @tap="addStroke">确认提交</button>
</view>
</template>
<script>
import { showToast } from 'common/script/util';
export default {
data() {
return {
area: '',
city: '',
status: [
{
value: '0',
name: '正常',
},
{
value: '1',
name: '发烧(377.3度以上)',
},
{
value: '2',
name: '咳嗽',
},
{
value: '3',
name: '咽喉疼痛',
},
{
value: '4',
name: '流鼻涕',
},
{
value: '5',
name: '头痛',
},
{
value: '6',
name: '其他',
}
],
hospital: '',
tours: [
{
value: 1,
name: '是'
},
{
value: 0,
name: '否'
}
],
touches: [
{
value: 1,
name: '是'
},
{
value: 0,
name: '否'
}
],
temperature: '',
current: 0,
tourCurrent: 0,
touchCurrent: 0,
agree: false,
};
},
methods: {
//
StateChange: function(evt) {
for (let i = 0; i < this.status.length; i++) {
if (this.status[i].value === evt.target.value) {
this.current = i;
break;
}
}
},
//
TourChange: function(evt) {
for (let i = 0; i < this.tours.length; i++) {
if (this.tours[i].value === evt.target.value) {
this.tourCurrent = i;
break;
}
}
},
//
TouchChange: function(evt) {
for (let i = 0; i < this.touches.length; i++) {
if (this.touches[i].value === evt.target.value) {
this.touchCurrent = i;
break;
}
}
},
/**
* 提交基本信息
*/
addStroke() {
if (!this.area) {
showToast('请输入当前所在地区');
return;
}
if (!this.city) {
showToast('请输入当前所在城市');
return;
}
if (!this.status) {
showToast('请选择状态');
return;
}
if (!this.temperature) {
showToast('请输入当前体温');
return;
}
if (!this.agree) {
showToast('请确定是否为本人填写');
return;
}
console.log('信息提交');
uni.reLaunch({
url: `/pages/index/index`,
});
},
},
};
</script>
<style lang="scss" scoped>
.agree-box{
width: 70rpx;
}
.agree-text{
line-height: 60rpx;
}
.primary-btn{
border-radius: 15rpx;
}
</style>

38
pages/basic-info/basic-info.vue

@ -1,32 +1,32 @@
<template>
<view>
<form class="padding-lr cu-form-group flex-direction">
<view class="cu-form-group flex flex-direction padding-tb-sm">
<view class="cu-form-group flex flex-direction padding-tb">
<view class="title padding-bottom-sm"><span class="text-red padding-right-xs">*</span>姓名</view>
<input placeholder="请输入真实姓名" name="input" type="text" v-model="name" />
</view>
<view class="cu-form-group flex flex-direction padding-tb-sm">
<view class="cu-form-group flex flex-direction padding-tb">
<view class="title padding-bottom-sm"><span class="text-red padding-right-xs">*</span>身份证</view>
<input placeholder="请输入身份证号" name="input" type="text" v-model="IDcard" />
</view>
<view class="cu-form-group flex flex-direction padding-tb-sm">
<view class="cu-form-group flex flex-direction padding-tb">
<view class="title padding-bottom-sm"><span class="text-red padding-right-xs">*</span>联系方式</view>
<input placeholder="请输入手机号码" name="input" type="number" v-model="phone" />
</view>
<view class="cu-form-group flex flex-direction padding-tb-sm">
<view class="cu-form-group flex flex-direction padding-tb">
<view class="title padding-bottom-sm"><span class="text-red padding-right-xs">*</span>身份</view>
<radio-group class="block" @change="RadioChange">
<view class="flex">
<view class="flex-sub margin-tb-sm" v-for="(identity,index) in identitys" :key="index">
<label class="flex justify-between align-center">
<radio class="round margin-right-xs" :checked="index === current" :value="identity.value"></radio>
<text class="flex-sub" style="font-size: 34rpx;">{{ identity.name }}+{{current}}</text>
<text class="flex-sub" style="font-size: 34rpx;">{{ identity.name }}</text>
</label>
</view>
</view>
</radio-group>
</view>
<view class="cu-form-group flex flex-direction padding-tb-sm">
<view class="cu-form-group flex flex-direction padding-tb">
<view class="title padding-bottom-sm"><span class="text-red padding-right-xs">*</span>学号</view>
<input placeholder="请输入学号" name="input" type="text" v-model="studentID" />
</view>
@ -36,6 +36,8 @@
</template>
<script>
import { showToast } from 'common/script/util';
export default {
data() {
return {
@ -74,8 +76,30 @@ export default {
* 提交基本信息
*/
confirm() {
if (!this.name) {
showToast('请输入姓名');
return;
}
if (!this.IDcard) {
showToast('请输入身份证号');
return;
}
if (!this.phone) {
showToast('请输入手机号');
return;
}
if (!this.identitys) {
showToast('请选择身份');
return;
}
if (!this.studentID) {
showToast('请输入学号');
return;
}
console.log('信息提交');
uni.reLaunch({
url: `/pages/index/components/mine`,
});
},
},

23
pages/index/components/home.vue

@ -1,6 +1,11 @@
<template>
<view class="content flex flex-direction">
<image v-if="coad" src="http://m.qpic.cn/psc?/V11kyB1O080aC1/cnQ2D7YjAZ5R6pY0fmc9joZ6fC6TxFlt9mW4UhUn2PEgUne7OUt4q4mNE.k9gU.rSr8Eu*pFToZoVwUOEGDrKMycDqdn1mLFGE1dxYTGUcE!/b&bo=7gKRAu4CkQIDWXw!&rf=viewer_4&t=5" class="bg1"></image>
<view v-if="coad" style="position: relative;">
<image src="http://m.qpic.cn/psc?/V11kyB1O080aC1/cnQ2D7YjAZ5R6pY0fmc9joZ6fC6TxFlt9mW4UhUn2PEgUne7OUt4q4mNE.k9gU.rSr8Eu*pFToZoVwUOEGDrKMycDqdn1mLFGE1dxYTGUcE!/b&bo=7gKRAu4CkQIDWXw!&rf=viewer_4&t=5" class="bg1"></image>
<view class="bg-code">
<image class="healthy-code" src="../../../static/img/qrcode.png" :style="{'background':healthyCodeColor}"></image>
</view>
</view>
<image v-else src="http://m.qpic.cn/psc?/V11kyB1O080aC1/cnQ2D7YjAZ5R6pY0fmc9jhx9v1rh8VuBAojvYxrYvg*uVMAXaD2En3CPiaHx7AWMjFTafVrGxwJR4jZd5s4ProhQT1ceDVquyQR7HVquBKk!/b&bo=7gLuAe4C7gEDORw!&rf=viewer_4&t=5" class="bg"></image>
<view :class="coad ? 'box1' : 'box'">
@ -15,7 +20,7 @@
</view>
</view>
</view>
<view class="cu-card flex margin bg-white shadow card-radius" hover-class="cc-active">
<view class="cu-card flex margin bg-white shadow card-radius" hover-class="cc-active" @tap="openPage('/pages/apply-code/apply-code')">
<view class="flex align-center padding">
<view class="round lg cu-avatar icon2">
<view class="iconfont icon-carryout"></view>
@ -26,7 +31,7 @@
</view>
</view>
</view>
<view class="cu-card flex margin bg-white shadow card-radius" hover-class="cc-active">
<view class="cu-card flex margin bg-white shadow card-radius" hover-class="cc-active" @tap="openPage('/pages/add-stroke/add-stroke')">
<view class="flex align-center padding">
<view class="round lg cu-avatar icon3">
<view class="iconfont icon-car"></view>
@ -59,6 +64,7 @@ export default {
data() {
return {
coad: false,
healthyCodeColor: '#11A20D',
}
}
};
@ -73,6 +79,17 @@ export default {
width: 100%;
height: 635rpx;
}
.bg-code{
display: flex;
width: 100%;
position: absolute;
top: 370rpx;
.healthy-code{
margin: 0 auto;
width: 230rpx;
height: 230rpx;
}
}
.box {
position: relative;
top: -100rpx;

24
pages/index/components/mine.vue

@ -28,7 +28,7 @@
<text class="text-xl">我的行程</text>
<view class="iconfont icon-right more"></view>
</view>
<view class="cu-item" hover-class="cc-active">
<view class="cu-item" hover-class="cc-active" @tap="openPage('/pages/my-signs/my-signs')">
<text class="text-xl">我的校园打卡</text>
<view class="iconfont icon-right more"></view>
</view>
@ -47,7 +47,7 @@ export default {
avatarUrl: '../../../static/head-portrait.jpg',
nickName: '丁菲菲',
classes: '计算机19级软工二班',
healthyCodeColor: '#11A20D'
healthyCodeColor: '#11A20D',
},
};
},
@ -55,14 +55,14 @@ export default {
</script>
<style lang="scss" scoped>
.portrait{
overflow: hidden;
}
.healthy-coad{
font-size: 40px;
}
.more{
font-size: 18px;
color: $grey;
}
.portrait {
overflow: hidden;
}
.healthy-coad {
font-size: 40px;
}
.more {
font-size: 18px;
color: $grey;
}
</style>

63
pages/my-signs/my-signs.vue

@ -0,0 +1,63 @@
<template>
<view class="wrap">
<!-- 头部菜单 -->
<view class="nav-wrap slide-bottom">
<uni-segmented-control
:active-color="activeColor"
:current="current"
:values="values"
@clickItem="handleClickNav"
class="nav"
/>
</view>
<!-- 内容区 -->
<view class="content">
<!-- 今日打卡地图显示 -->
<history-map v-if="current === 0" />
<!-- 打卡记录 时间轴显示 -->
<timeline v-else />
</view>
</view>
</template>
<script>
export default {
data() {
return {
current: 0,
values: ['今日打卡', '打卡记录'],
activeColor: '#0897C7',
};
},
methods: {
handleClickNav({ currentIndex }) {
this.current = currentIndex;
},
},
};
</script>
<style lang="scss" scoped>
.wrap {
padding-top: 88rpx;
min-height: 100vh;
background-color: $white;
.nav-wrap {
z-index: 999;
position: fixed;
left: 0;
right: 0;
top: 0;
display: flex;
justify-content: center;
align-items: center;
height: 88rpx;
background-color: $white;
.nav {
width: 540rpx;
}
}
}
</style>

BIN
static/img/qrcode.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

2
uni.scss

@ -16,7 +16,7 @@ $brown: #a5673f;
$grey: #CDCDCD;
$black: #333333;
$darkGray: #666666;
$gray: #101010;
$gray: #808080;
$ghostWhite: #f1f1f1;
$white: #ffffff;

Loading…
Cancel
Save