DESKTOP-B78GIPM\admin 2 年之前
当前提交
f794b859a7
共有 100 个文件被更改,包括 7832 次插入0 次删除
  1. 1 0
      .gitignore
  2. 16 0
      .hbuilderx/launch.json
  3. 17 0
      App.vue
  4. 38 0
      components/aboutUs/aboutUs.vue
  5. 69 0
      components/addContacts/addContacts.vue
  6. 87 0
      components/bill/addBill.vue
  7. 77 0
      components/bill/bill.vue
  8. 63 0
      components/calendar/Calendar.vue
  9. 1063 0
      components/city/city.js
  10. 454 0
      components/city/linzq-citySelect/linzq-citySelect.vue
  11. 140 0
      components/city/popup-layer/popup-layer.vue
  12. 26 0
      components/collectHotel/collectHotel.vue
  13. 102 0
      components/contacts/contacts.vue
  14. 27 0
      components/coupon/coupon.vue
  15. 67 0
      components/editUserInfo/editPayPassWord/editPayPassWord.vue
  16. 91 0
      components/editUserInfo/editUserInfo.vue
  17. 47 0
      components/editUserInfo/editUserName/editUserName.vue
  18. 77 0
      components/editUserInfo/editUserPhone/editUserPhone.vue
  19. 48 0
      components/editUserInfo/nameAuthentication/nameAuthentication.vue
  20. 27 0
      components/historyCoupon/historyCoupon.vue
  21. 128 0
      components/hotelAppraise/hotelAppraise.vue
  22. 192 0
      components/hotelBooking/hotelBooking.vue
  23. 130 0
      components/hotelCard/hotelCard.vue
  24. 413 0
      components/hotelDetail/hotelDetail.vue
  25. 40 0
      components/hotelImage/hotelImage.vue
  26. 41 0
      components/memberCard/memberCard.vue
  27. 54 0
      components/order/BookingOrder/BookingOrder.vue
  28. 54 0
      components/order/foodOrder/foodOrder.vue
  29. 54 0
      components/order/inOrder/inOrder.vue
  30. 54 0
      components/order/posOrder/posOrder.vue
  31. 54 0
      components/order/serviceOrder/serviceOrder.vue
  32. 54 0
      components/order/settingsOrder/settingsOrder.vue
  33. 44 0
      components/searchHotel/searchHotel.vue
  34. 382 0
      components/searchPage/searchPage.vue
  35. 113 0
      components/sidebar.vue
  36. 44 0
      components/tabCoupon/tabCoupon.vue
  37. 20 0
      index.html
  38. 25 0
      main.js
  39. 77 0
      manifest.json
  40. 346 0
      pages.json
  41. 161 0
      pages/index/index.vue
  42. 161 0
      pages/mine/mine.vue
  43. 149 0
      pages/roomService/roomService.vue
  44. 39 0
      pages/wallet/wallet.vue
  45. 二进制
      static/logo.png
  46. 1 0
      static/mineIcon/POSdingdankaipiao.svg
  47. 1 0
      static/mineIcon/biaodankongjianlianxiren.svg
  48. 1 0
      static/mineIcon/diancan.svg
  49. 1 0
      static/mineIcon/dianhua.svg
  50. 1 0
      static/mineIcon/fuwu_o.svg
  51. 1 0
      static/mineIcon/guanyu.svg
  52. 1 0
      static/mineIcon/shoucang.svg
  53. 1 0
      static/mineIcon/u.svg
  54. 1 0
      static/mineIcon/weibiaoti-.svg
  55. 1 0
      static/mineIcon/weixiu.svg
  56. 1 0
      static/mineIcon/wodefapiao.svg
  57. 二进制
      static/niu.jpg
  58. 1 0
      static/roomService/diancan.svg
  59. 1 0
      static/roomService/hujiaofuwuyuan.svg
  60. 1 0
      static/roomService/kaipiaowancheng.svg
  61. 1 0
      static/roomService/lianxiqiantai.svg
  62. 1 0
      static/roomService/liuyan.svg
  63. 1 0
      static/roomService/tuifang.svg
  64. 1 0
      static/roomService/weixiu.svg
  65. 1 0
      static/roomService/wifi.svg
  66. 1 0
      static/roomService/xuzhu.svg
  67. 二进制
      static/tabbarIcon/shoucang.png
  68. 1 0
      static/tabbarIcon/shoucang.svg
  69. 二进制
      static/tabbarIcon/shouye_xuanzhong.png
  70. 1 0
      static/tabbarIcon/shouye_xuanzhong.svg
  71. 二进制
      static/tabbarIcon/shouyeweixuanzhong.png
  72. 1 0
      static/tabbarIcon/shouyeweixuanzhong.svg
  73. 二进制
      static/tabbarIcon/wode.png
  74. 1 0
      static/tabbarIcon/wode.svg
  75. 二进制
      static/tabbarIcon/yuding.png
  76. 1 0
      static/tabbarIcon/yuding.svg
  77. 29 0
      store/index.js
  78. 76 0
      uni.scss
  79. 21 0
      uni_modules/uview-ui/LICENSE
  80. 66 0
      uni_modules/uview-ui/README.md
  81. 362 0
      uni_modules/uview-ui/changelog.md
  82. 78 0
      uni_modules/uview-ui/components/u--form/u--form.vue
  83. 47 0
      uni_modules/uview-ui/components/u--image/u--image.vue
  84. 73 0
      uni_modules/uview-ui/components/u--input/u--input.vue
  85. 44 0
      uni_modules/uview-ui/components/u--text/u--text.vue
  86. 48 0
      uni_modules/uview-ui/components/u--textarea/u--textarea.vue
  87. 54 0
      uni_modules/uview-ui/components/u-action-sheet/props.js
  88. 278 0
      uni_modules/uview-ui/components/u-action-sheet/u-action-sheet.vue
  89. 59 0
      uni_modules/uview-ui/components/u-album/props.js
  90. 259 0
      uni_modules/uview-ui/components/u-album/u-album.vue
  91. 44 0
      uni_modules/uview-ui/components/u-alert/props.js
  92. 243 0
      uni_modules/uview-ui/components/u-alert/u-alert.vue
  93. 52 0
      uni_modules/uview-ui/components/u-avatar-group/props.js
  94. 103 0
      uni_modules/uview-ui/components/u-avatar-group/u-avatar-group.vue
  95. 78 0
      uni_modules/uview-ui/components/u-avatar/props.js
  96. 172 0
      uni_modules/uview-ui/components/u-avatar/u-avatar.vue
  97. 54 0
      uni_modules/uview-ui/components/u-back-top/props.js
  98. 129 0
      uni_modules/uview-ui/components/u-back-top/u-back-top.vue
  99. 72 0
      uni_modules/uview-ui/components/u-badge/props.js
  100. 0 0
      uni_modules/uview-ui/components/u-badge/u-badge.vue

+ 1 - 0
.gitignore

@@ -0,0 +1 @@
+unpackage/

+ 16 - 0
.hbuilderx/launch.json

@@ -0,0 +1,16 @@
+{ // launch.json 配置了启动调试时相关设置,configurations下节点名称可为 app-plus/h5/mp-weixin/mp-baidu/mp-alipay/mp-qq/mp-toutiao/mp-360/
+  // launchtype项可配置值为local或remote, local代表前端连本地云函数,remote代表前端连云端云函数
+    "version": "0.0",
+    "configurations": [{
+     	"default" : 
+     	{
+     		"launchtype" : "local"
+     	},
+     	"mp-weixin" : 
+     	{
+     		"launchtype" : "local"
+     	},
+     	"type" : "uniCloud"
+     }
+    ]
+}

+ 17 - 0
App.vue

@@ -0,0 +1,17 @@
+<script>
+	export default {
+		onLaunch: function() {
+			console.log('App Launch')
+		},
+		onShow: function() {
+			console.log('App Show')
+		},
+		onHide: function() {
+			console.log('App Hide')
+		}
+	}
+</script>
+
+<style>
+	/*每个页面公共css */
+</style>

+ 38 - 0
components/aboutUs/aboutUs.vue

@@ -0,0 +1,38 @@
+<template>
+	<view>
+		<div class="images">
+			<u--image shape="circle" :showLoading="true" :src="'/static/niu.jpg'" width="150px" height="150px" @click="click"></u--image>
+		</div>
+
+		<div style="padding:15px;">
+			酒店会,提供在线预定酒店,办理酒店会员,充值,消费。百分百酒店直营,花最少的价钱,住更好的酒店!
+		</div>
+
+		<u-cell title="营业执照" :isLink="true" arrow-direction="right"></u-cell>
+		<u-cell title="经营许可证" :isLink="true" arrow-direction="right"></u-cell>
+		<u-cell title="用户协议" :isLink="true" arrow-direction="right"></u-cell>
+		<u-cell title="隐私政策" :isLink="true" arrow-direction="right"></u-cell>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				
+			}
+		},
+		methods: {
+			
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+.images{
+	display: flex;
+	justify-content: center;
+	align-items: center;
+	height: 300px;
+}
+</style>

+ 69 - 0
components/addContacts/addContacts.vue

@@ -0,0 +1,69 @@
+<template>
+<view class="pages">
+    <div class="form-input">
+        <u-input v-model="form.name" placeholder="请输入名称" border="bottom"></u-input>
+        <u-input v-model="form.phone" placeholder="请输入手机号" border="bottom"></u-input>
+    </div>
+    <div class="form-btn">
+        <u-button type="primary" @click="save">添加</u-button>
+    </div>
+</view>
+</template>
+
+<script>
+export default {
+    data() {
+        return {
+            form: {
+                name: '',
+                phone: ''
+            }
+        }
+    },
+    methods: {
+        save() {
+            if (this.form.name == '') {
+                this.$u.toast('请输入名称')
+                return
+            }
+            if (this.form.phone == '') {
+                this.$u.toast('请输入手机号')
+                return
+            }
+            //返回上一页并添加联系人
+            let pages = getCurrentPages(); //获取所有页面栈实例列表
+            let nowPage = pages[pages.length - 1]; //当前页页面实例
+            let prevPage = pages[pages.length - 2]; //上一页页面实例
+			console.log(prevPage.$vm.contactsList);
+			prevPage.$vm.contactsList.push(this.form);
+			uni.navigateBack(1)
+
+
+            // this.$u.post('/api/contacts/add',this.form).then(res => {
+            // 	if(res.code == 0){
+            // 		this.$u.toast('添加成功')
+            // 		setTimeout(() => {
+            // 		uni.navigateBack({
+            // 		delta: 1
+            // 		})
+            // 		}, 1000);
+            // 	}
+            // })
+        }
+    }
+}
+</script>
+
+<style lang="scss" scoped>
+.pages {
+    width: 100%;
+    height: 100vh;
+    background: #f5f5f5;
+}
+
+.form-input {
+    background: #fff;
+    padding: 10px;
+}
+.form-btn{}
+</style>

+ 87 - 0
components/bill/addBill.vue

@@ -0,0 +1,87 @@
+<template>
+<view class="pages">
+    <u-subsection :list="list" mode="subsection" :current="current" @change="sectionChange"></u-subsection>
+    <div v-if="current==0" class="form-input">
+        <u-input :customStyle="{height:'30px'}" v-model="ordinaryInvoice.name" placeholder="请输入公司名称" />
+        <u-input :customStyle="{height:'30px'}" v-model="ordinaryInvoice.number" placeholder="请输入纳税人识别号" />
+    </div>
+    <div v-if="current==1" class="form-input">
+        <u-input :customStyle="{height:'30px'}" placeholder="请输入公司名称" />
+        <u-input :customStyle="{height:'30px'}" placeholder="请输入纳税人识别号" />
+        <u-input :customStyle="{height:'30px'}" placeholder="请输入开户银行" />
+        <u-input :customStyle="{height:'30px'}" placeholder="请输入银行账户" />
+        <u-input :customStyle="{height:'30px'}" placeholder="请输入公司地址" />
+        <u-input :customStyle="{height:'30px'}" placeholder="请输入公司电话" />
+    </div>
+    <div class="bottom-btn">
+		<u-button type="primary" @click="save">保存</u-button>
+	</div>
+</view>
+</template>
+
+<script>
+export default {
+    data() {
+        return {
+            list: ['公司普票', '公司专票'],
+            current: 0,
+            ordinaryInvoice: {
+                name: null,
+                number: null
+            },
+            specialInvoice: {
+                name: null,
+                number: null,
+                bank: null,
+                account: null,
+                address: null,
+                phone: null
+            }
+        }
+    },
+    methods: {
+        save() {
+            if (this.current == 0) {
+                if (this.ordinaryInvoice.name == null) {
+                    this.$u.toast('请输入公司名称')
+                    return
+                }
+                if (this.ordinaryInvoice.number == null) {
+                    this.$u.toast('请输入纳税人识别号')
+                    return
+                }
+                uni.navigateBack(1)
+            }
+            if (this.current == 1) {
+
+                uni.navigateBack(1)
+            }
+        },
+        sectionChange(e) {
+            console.log(e);
+            this.current = e
+        }
+    }
+}
+</script>
+
+<style lang="scss" scoped>
+.pages {
+    width: 100%;
+    height: 100vh;
+    background: #f5f5f5;
+}
+
+.form-input {
+    background: #fff;
+    padding: 10px;
+}
+.bottom-btn{
+	position: fixed;
+	bottom: 0;
+	width: 100%;
+	padding: 20px;
+	background: #fff;
+	box-sizing: border-box;
+}
+</style>

+ 77 - 0
components/bill/bill.vue

@@ -0,0 +1,77 @@
+<template>
+<view class="pages">
+    <!-- 这是我的发票页面 -->
+    <u-empty mode="data" text="还没有发票哟">
+    </u-empty>
+	<div class="bottom-btn">
+		<div @click="handleToAddBill">添加发票</div>
+		<div @click="getBill">
+			读取微信发票信息
+		</div>
+	</div>
+</view>
+</template>
+
+<script>
+export default {
+    data() {
+        return {
+
+        }
+    },
+    methods: {
+		getBill(){
+			uni.chooseInvoiceTitle({
+				success: function (res) {
+					console.log(res);
+				},
+				fail: function (err) {
+					console.log(err);
+				},
+				complete: function (res) {
+					console.log(res);
+				}
+			});
+		},
+		handleToAddBill(){
+			uni.navigateTo({
+				url:'/components/bill/addBill',
+				success:(res)=>{
+					console.log('成功',res);
+				},
+				fail:(err)=>{
+					console.log('失败',err);
+				}
+			})
+		}
+    }
+}
+</script>
+
+<style lang="scss" scoped>
+.pages {
+    width: 100%;
+    height: 100vh;
+    background: #f5f5f5;
+}
+.bottom-btn{
+	position: fixed;
+	bottom: 0;
+	left: 0;
+	width: 100%;
+	height: 70px;
+	background: #fff;
+	display: flex;
+	justify-content: space-between;
+	align-items: center;
+	padding: 0 10px;
+	div:nth-child(1){
+		flex: 1;
+		text-align: center;
+	}
+	div:nth-child(2){
+		flex: 1;
+		text-align: center;
+	}
+}
+</style>

+ 63 - 0
components/calendar/Calendar.vue

@@ -0,0 +1,63 @@
+<template>
+  <div>
+    <u-calendar
+      :show="true"
+      :mode="mode"
+      @confirm="confirm"
+      @close="closeCalendar"
+    ></u-calendar>
+  </div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      mode: "range",
+      timeList: [], //选择的时间
+    };
+  },
+  onLoad(options){
+    if(options.mode){
+      this.mode = options.mode;
+    }
+  },
+  mounted() {
+    this.initDate();
+  },
+  methods: {
+    confirm(e) {
+      console.log(e);
+      this.$store.commit("setTimeList", e);
+      uni.navigateBack();
+      // this.timeList = e;
+    },
+    closeCalendar() {
+      this.calendarShow = false;
+    },
+    //初始化时间
+    initDate() {
+      let date = new Date();
+      let year = date.getFullYear();
+      let month = date.getMonth() + 1;
+      let day = date.getDate();
+      let time = year + "-" + month + "-" + day;
+      this.timeList = [time, time];
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+/deep/.u-popup__content{
+  height: 100vh;
+  flex: none !important;
+  scroll-view{
+    height: 70vh !important;
+  }
+}
+/deep/.u-icon__icon{
+  display: none !important;
+}
+
+</style>

文件差异内容过多而无法显示
+ 1063 - 0
components/city/city.js


+ 454 - 0
components/city/linzq-citySelect/linzq-citySelect.vue

@@ -0,0 +1,454 @@
+<template>
+	<div class="wrapper" :style="'top:'+statusBarHeight+'px'">
+		<div class="header">
+			<view class="back_div">
+				<image class="back_img" @click="back_city()" src="../../static/back_img.png" mode=""></image>
+			</view>
+			<input class="input" @input="onInput" placeholder="中文/拼音/首字母" v-model="searchValue" />
+		</div>
+		<scroll-view class="calendar-list" scroll-y="true" :scroll-into-view="scrollIntoId">
+			<view v-if="disdingwei" id="hot">
+				<!-- 定位模块 -->
+				<view class="dingwei">
+					<view class="dingwei_Tips">
+						当前定位
+					</view>
+					<view class="dingwei_city">
+						<view class="dingwei_city_one">
+							{{position}}
+						</view>
+						<view class="dingweis_div" @click="getWarpweft">
+							<image class="dingweis" src="../../static/dingweis.png" mode=""></image>
+							<text>{{po_tips}}</text>
+						</view>
+					</view>
+				</view>
+
+				<!-- 最近模块 -->
+				<view class="dingwei" v-if="Visit.length>=0">
+					<view class="dingwei_Tips">
+						最近访问
+					</view>
+					<view class="dingwei_city dingwei_city_zuijin">
+						<view class="dingwei_city_one toright" v-for="(item,index) in Visit" v-if="index<2" @click="back_city(item)">
+							{{item.cityName}}
+						</view> 
+					</view>
+				</view>
+
+			</view>
+
+
+			<!-- 城市列表 -->
+			<view v-if="searchValue == ''" v-for="(item, index) in list" :id="getId(index)" :key="index">
+				<view class="letter-header">{{ getId(index) }}</view>
+				<view class="city-div" v-for="(city, i) in item" :key="i" @click="back_city(city)">
+					<text class="city">{{ city.cityName }}</text>
+				</view>
+			</view>
+			<!-- 搜索结果 -->
+			<view class="city-div" v-for="(item, index) in searchList" @click="back_city(item)">
+				<text class="city">{{ item.cityName }}</text>
+			</view>
+		</scroll-view>
+
+		<!-- 右侧字母 -->
+		<view class="letters" v-if="searchValue == ''">
+			<view class="letters-item" @click="scrollTo('hot')">最近</view>
+			<view class="letters-item" v-for="item in letter" :key="item" @click="scrollTo(item)">{{ item }}</view>
+		</view>
+
+		<!-- 选中之后字母 -->
+		<view class="mask" v-if="showMask">
+			<view class="mask-r">{{selectLetter}}</view>
+		</view>
+	</div>
+</template>
+
+<script>
+	import Citys from '../city.js';
+	export default {
+		components: {},
+		props: {},
+
+		computed: {
+			hotCity() {
+				return Citys.hotCity;
+			},
+
+			citys() {
+				return Citys.cities;
+			}
+		},
+
+		data() {
+			return {
+				statusBarHeight: this.statusBarHeight,
+				ImgUrl: this.ImgUrl,
+				letter: [],
+				selectLetter: '',
+				searchValue: '',
+				scrollIntoId: '',
+				list: [],
+				tId: null,
+				searchList: [],
+				showMask: false,
+				disdingwei: true,
+				Visit: [], //最近访问
+				position: '青岛',
+				longitude: '', //经度
+				latitude: '', //纬度
+				seconds: 3,
+				po_tips: '重新定位',
+			}
+		},
+
+		created() {
+			//获取存储的最近访问
+			var that = this
+			uni.getStorage({
+				key: 'Visit_key',
+				success: function(res) {
+					that.Visit = res.data
+				}
+			});
+			//获取定位 经度纬度
+			that.getWarpweft()
+			//获取city.js 的程序字母
+			var mu = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'j', 'k', 'l', 'm', 'n', 'p', 'q', 'r', 's', 't', 'w', 'x', 'y',
+				'z'
+			];
+			var tmp = [];
+			for (var i = 0; i < mu.length; i++) {
+				var item = mu[i];
+				for (var j = 0; j < this.citys.length; j++) {
+					var py = this.citys[j].py;
+					if (py.substring(0, 1) == item) {
+						if (tmp.indexOf(item) == -1) {
+							this.list[i] = [this.citys[j]];
+							tmp.push(item);
+							this.letter.push(item.toUpperCase());
+						} else {
+							this.list[i].push(this.citys[j]);
+						}
+					}
+				}
+			}
+		},
+		methods: {
+			getId(index) {
+				return this.letter[index];
+			},
+
+			scrollTo(letter) {
+				this.showMask = true
+				this.selectLetter = letter == 'hot' ? '最' : letter
+				setTimeout(() => {
+					this.showMask = false
+				}, 300);
+				this.scrollIntoId = letter;
+			},
+
+
+			query(source, text) {
+				let res = [];
+				var self = this;
+				res = source.filter(item => {
+					const arr = [];
+					let isHave = false;
+					Object.keys(item).forEach(prop => {
+						const itemStr = item[prop];
+						self.isString(itemStr) &&
+							itemStr.split(',').forEach(val => {
+								arr.push(val);
+							});
+					});
+					arr.some(val => {
+						isHave = new RegExp('^' + text).test(val);
+						return isHave;
+					});
+					return isHave;
+				});
+				console.log(JSON.stringify(res));
+				return res;
+			},
+
+			isString(obj) {
+				return typeof obj === 'string';
+			},
+
+			onInput(e) {
+				const value = e.target.value;
+				console.log(value);
+				if (value !== '' && this.citys && this.citys.length > 0) {
+					const queryData = this.query(this.citys, String(value).trim());
+					this.searchList = queryData;
+					this.disdingwei = false
+				} else {
+					this.searchList = [];
+					this.disdingwei = true
+				}
+			},
+
+			back_city(item) {
+				if (item) {
+					this.$emit('back_city', item);
+					//unshift 把数据插入到首位,与push相反
+					this.Visit.unshift(item)
+					this.searchValue = "";
+					this.disdingwei = true
+					var arr = this.Visit
+					//数组去重
+					function distinct(arr) {
+						let newArr = []
+						for (let i = 0; i < arr.length; i++) {
+							if (newArr.indexOf(arr[i]) < 0) {
+								newArr.push(arr[i])
+							}
+						}
+						return newArr
+					}
+					this.Visit = distinct(arr)
+					console.log(this.Visit, "---最近访问")
+					uni.setStorage({
+						key: 'Visit_key',
+						data: this.Visit
+					});
+				} else {
+					this.$emit('back_city', 'no');
+				}
+
+			},
+			getWarpweft() {
+				var that = this
+				that.po_tips = '定位中...'
+				let countdown = setInterval(() => {
+					that.seconds--;
+					uni.getLocation({
+						type: 'wgs84',
+						success: function(res) {
+							console.log('当前位置的经度:' + res.longitude);
+							console.log('当前位置的纬度:' + res.latitude);
+							that.longitude = res.longitude
+							that.latitude = res.latitude
+						}
+					});
+					if (that.seconds <= 0) {
+						that.seconds = 3
+						that.po_tips = '重新定位'
+						clearInterval(countdown);
+					}
+				}, 1000);
+			}
+		}
+	};
+</script>
+
+<style scoped>
+	.wrapper {
+		position: fixed;
+		z-index: 999999;
+		background: #ffffff;
+		height: 100%;
+		width: 100%;
+		top: 0px;
+		left: 0px;
+	}
+
+	.mask {
+		position: absolute;
+		bottom: 0upx;
+		top: 83upx;
+		left: 0upx;
+		right: 0upx;
+		width: 750upx;
+		display: flex;
+		justify-content: center;
+		align-items: center;
+		background: rgba(0, 0, 0, 0);
+	}
+
+	.mask-r {
+		height: 120upx;
+		width: 120upx;
+		border-radius: 60upx;
+		display: flex;
+		background: rgba(0, 0, 0, 0.5);
+		justify-content: center;
+		align-items: center;
+		font-size: 40upx;
+		color: #FFFFFF
+	}
+
+	.content {
+		height: 100%;
+		width: 100%;
+		background-color: #ffffff;
+	}
+
+	.header {
+		height: 85upx;
+		display: flex;
+		justify-content: flex-start;
+		align-items: center;
+	}
+
+
+	.back_div {
+		width: 65upx;
+		height: 100%;
+		display: flex;
+		justify-content: center;
+		align-items: center;
+	}
+
+	.back_img {
+		width: 35upx;
+		height: 35upx;
+	}
+
+	.input {
+		font-size: 28upx;
+		width: 620upx;
+		height: 55upx;
+		border-radius: 40upx;
+		background-color: #F5F5F5;
+		padding-left: 20upx;
+		padding-right: 20upx;
+		box-sizing: border-box;
+	}
+
+	.title {
+		font-size: 30upx;
+		color: white;
+	}
+
+	.show {
+		left: 0;
+		width: 100%;
+		transition: left 0.3s ease;
+	}
+
+	.hide {
+		left: 100%;
+		width: 100%;
+		transition: left 0.3s ease;
+	}
+
+
+	.title {
+		font-size: 30upx;
+		color: white;
+	}
+
+	.calendar-list {
+		position: absolute;
+		top: 83upx;
+		bottom: 0upx;
+		width: 100%;
+		background-color: #FFFFFF;
+	}
+
+	.letters {
+		position: absolute;
+		right: 30upx;
+		bottom: 0px;
+		width: 50upx;
+		top: 260upx;
+		color: #2f9bfe;
+		text-align: center;
+		font-size: 24upx;
+	}
+
+	.letters-item {
+		margin-bottom: 5upx;
+	}
+
+	.letter-header {
+		height: 45upx;
+		font-size: 22upx;
+		color: #333333;
+		padding-left: 24upx;
+		box-sizing: border-box;
+		display: flex;
+		align-items: center;
+		background-color: #ebedef;
+
+	}
+
+	.city-div {
+		width: 660upx;
+		height: 85upx;
+		margin-left: 24upx;
+		border-bottom-width: 0.5upx;
+		border-bottom-color: #ebedef;
+		border-bottom-style: solid;
+		display: flex;
+		align-items: center;
+		margin-right: 35upx;
+	}
+
+	.city {
+		font-size: 28upx;
+		color: #000000;
+		padding-left: 30upx;
+	}
+
+	.dingwei {
+		width: 100%;
+		padding-top: 25upx;
+		box-sizing: border-box;
+		margin-bottom: 26upx;
+	}
+
+	.dingwei_Tips {
+		margin-left: 24upx;
+		margin-bottom: 24upx;
+		font-size: 24upx;
+		color: #A5A5A5;
+	}
+
+	.dingwei_city {
+		width: 100%;
+		height: 60upx;
+		padding-left: 55upx;
+		padding-right: 70upx;
+		box-sizing: border-box;
+		display: flex;
+		justify-content: space-between;
+	}
+
+	.dingwei_city_one {
+		width: 185upx;
+		height: 60upx;
+		background-color: #F5F5F5;
+		border-radius: 10upx;
+		font-size: 32upx;
+		color: #333333;
+		display: flex;
+		justify-content: center;
+		align-items: center;
+	}
+
+	.dingweis_div {
+		display: flex;
+		align-content: flex-end;
+		align-items: center;
+		font-size: 24upx;
+		color: #FD5745;
+	}
+
+	.dingweis {
+		width: 32upx;
+		height: 32upx;
+	}
+
+	.dingwei_city_zuijin {
+		display: flex;
+		justify-content: flex-start;
+	}
+
+	.toright {
+		margin-right: 25upx;
+	}
+</style>

+ 140 - 0
components/city/popup-layer/popup-layer.vue

@@ -0,0 +1,140 @@
+<template>
+	<view>
+		<view v-show="ifshow" @tap="ableClose" @touchmove.stop.prevent class="popup-layer" >
+			
+		</view>
+		<view ref="popRef"  class="popup-content"   @tap.stop="stopEvent" :style="_location">
+			<slot></slot>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: 'popup-layer',
+		model: {
+			prop: "showPop",
+			event: "change"
+		},
+		props: {
+			showPop:{
+				type:Boolean,
+				default:false,
+			},
+			direction: {
+				type: String,
+				default: 'top', // 方向  top,bottom,left,right 
+			},
+			autoClose: {
+				type: Boolean,
+				default: true,
+			}
+		},
+		data() {
+			return {
+				ifshow: false, // 是否展示,
+				translateValue: -100, // 位移距离
+				site:-100,
+				timer: null,
+				iftoggle: false,
+
+			};
+		},
+		computed: {
+			_translate() {
+				const transformObj = {
+					'top': `transform:translateY(${-this.translateValue}%)`,
+					'bottom': `transform:translateY(${this.translateValue}%)`,
+					'left': `transform:translateX(${-this.translateValue}%)`,
+					'right': `transform:translateX(${this.translateValue}%)`
+				};
+				return transformObj[this.direction]
+			},
+			_location() {
+				const positionValue = {
+					'top': `bottom:${this.site}%;width:100%;`,
+					'bottom': `top:${this.site}%;width:100%;`,
+					'left': `right:0px;top:0;height:100%;`,
+					'right': `left:0px;top:0;height:100%;`,
+				};
+				return positionValue[this.direction]+ this._translate;
+			}
+		},
+		mounted(){
+			if(this.showPop){
+				// console.log(222);
+				this.show();
+			}
+		},
+		watch:{
+			showPop(value){
+				console.log(value)
+				if(value){
+					this.show();
+				}else{
+					this.close();
+				}
+			}	
+		},
+		methods: {
+			stopMove(event){
+				return;
+			},
+			show(events) {
+				this.ifshow = true;
+				this.site=0;
+				let _open = setTimeout(() => {
+					this.translateValue = 0;
+					_open = null;
+				}, 100)
+				let _toggle = setTimeout(() => {
+					this.iftoggle = true;
+					_toggle = null;
+				}, 300);
+			},
+			close() {
+				if (this.timer !== null || !this.iftoggle) {
+					return;
+				}
+				this.translateValue = -100;
+				this.timer = setTimeout(() => {
+					this.ifshow = false;
+					this.timer = null;
+					this.iftoggle = false;
+					this.$emit('closeCallBack', null);
+					this.$emit('change',false)
+				}, 300);
+			},
+			ableClose() {
+				if (this.autoClose) {
+					this.close();
+				}
+			},
+			stopEvent(event) {},
+			doSome(){
+			}
+
+		}
+	}
+</script>
+
+<style lang="scss">
+	.popup-layer {
+		position: fixed;
+		z-index: 999999;
+		// background: rgba(0, 0, 0, .3);
+		height: 100%;
+		width: 100%;
+		top: 0px;
+		left: 0px;
+		overflow: hidden;
+	}
+
+	.popup-content {
+		position: fixed;
+		z-index: 1000000;
+		background: #FFFFFF;
+		transition: transform .2s ease;
+		overflow: hidden; 
+	}
+</style>

+ 26 - 0
components/collectHotel/collectHotel.vue

@@ -0,0 +1,26 @@
+<template>
+	<view>
+		<div class="no-data">--还没有收藏哟--</div>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				
+			}
+		},
+		methods: {
+			
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+.no-data{
+	color: #00aaff;
+	text-align: center;
+	margin-top: 40px;
+}
+</style>

+ 102 - 0
components/contacts/contacts.vue

@@ -0,0 +1,102 @@
+<template>
+	<view class="pages">
+		<div class="card" v-for="(item, index) in contactsList" :key="item.id" @click="()=>backSet(item, index)">
+			<div>
+				{{item.name}}
+			</div>
+			<div>
+				{{item.phone}}
+			</div>
+		</div>
+		<div class="add" @click="handleToAdd">
+			<u-icon name="plus" color="#000" size="20"></u-icon>
+			<div>立即添加</div>
+		</div>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				contactsList:[
+					{
+						name:'小明',
+						phone:'17212359128'
+					},
+					{
+						name:'小红',
+						phone:'17212359128'
+					},
+					{
+						name:'小花',
+						phone:'17212359128'
+					},
+					{
+						name:'小西',
+						phone:'17212359128'
+					}
+				]
+			}
+		},
+		methods: {
+			handleToAdd(){
+				console.log("别点了",uni);
+				uni.navigateTo({
+					url:'/components/addContacts/addContacts',
+					success:(res)=>{
+						console.log('成功',res);
+					},
+					fail:(err)=>{
+						console.log('失败',err);
+					}
+				})
+			},
+			backSet(data, idx){
+				console.log(data, idx);
+				let pages = getCurrentPages();
+				let prevPage = pages[pages.length - 2];
+				prevPage.$vm.form.name = data.name;
+				prevPage.$vm.form.phone = data.phone;
+				uni.navigateBack({
+					delta: 1
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+.pages{
+	width: 100%;
+	height: 100vh;
+	background: #f5f5f5;
+	overflow: auto;
+}
+.card{
+	width: 96vw;
+	height: 100px;
+	background: #fff;
+	padding: 20px;
+	box-sizing: border-box;
+	margin: 10px auto;
+	box-shadow: 0 0 10px #00000029;
+	display: flex;
+	align-items: flex-start;
+	flex-direction: column;
+	justify-content: space-around;
+	border-radius: 5px;
+}
+.add{
+	width: 96vw;
+	height: 100px;
+	background: #fff;
+	padding: 20px;
+	box-sizing: border-box;
+	margin: 10px auto;
+	box-shadow: 0 0 10px #00000029;
+	display: flex;
+	align-items: center;
+	border-radius: 5px;
+}
+</style>

+ 27 - 0
components/coupon/coupon.vue

@@ -0,0 +1,27 @@
+<template>
+<view class="pages">
+    <u-empty mode="coupon">
+    </u-empty>
+</view>
+</template>
+
+<script>
+export default {
+    data() {
+        return {
+
+        }
+    },
+    methods: {
+
+    }
+}
+</script>
+
+<style lang="scss" scoped>
+.pages{
+	width: 100%;
+	height: 100vh;
+	background: #f5f5f5;
+}
+</style>

+ 67 - 0
components/editUserInfo/editPayPassWord/editPayPassWord.vue

@@ -0,0 +1,67 @@
+<template>
+<view>
+    <u-cell title="1xx****xxxx"></u-cell>
+    <u--input placeholder="密码" border="surround" v-model="value"
+	@change="change"
+	:customStyle="{height: '40px'}"
+	></u--input>
+    <u--input placeholder="确认密码" border="surround" v-model="value" @change="change" :customStyle="{height: '40px'}"></u--input>
+    <u-input placeholder="后置插槽" :customStyle="{height: '40px'}">
+        <template slot="suffix">
+            <u-code ref="uCode" @change="codeChange" seconds="20" changeText="X秒重新获取"></u-code>
+            <u-button @tap="getCode" :text="tips" type="primary" size=""></u-button>
+        </template>
+    </u-input>
+	<div class="save-btn">
+        <u-button type="primary">立即设置</u-button>
+    </div>
+</view>
+</template>
+
+<script>
+export default {
+    data() {
+        return {
+			tips: '发送验证码',
+        }
+    },
+    methods: {
+		change() {
+			console.log(this.value);
+		},
+		codeChange(text) {
+			console.log('codeChange');
+			this.tips = text
+		},
+		getCode() {
+			if (this.$refs.uCode.canGetCode) {
+				// 模拟向后端请求验证码
+				uni.showLoading({
+					title: '正在获取验证码'
+				})
+				setTimeout(() => {
+					uni.hideLoading();
+					// 这里此提示会被this.start()方法中的提示覆盖
+					uni.$u.toast('验证码已发送');
+					// 通知验证码组件内部开始倒计时
+					this.$refs.uCode.start();
+				}, 2000);
+			} else {
+				uni.$u.toast('倒计时结束后再发送');
+			}
+		},
+    }
+}
+</script>
+
+<style lang="scss" scoped>
+.save-btn{
+	text-align:center;
+	// margin-top:20px;
+	position: fixed;
+	bottom: 0;
+	width: 100%;
+	padding: 30px;
+	box-sizing: border-box;
+}
+</style>

+ 91 - 0
components/editUserInfo/editUserInfo.vue

@@ -0,0 +1,91 @@
+<template>
+<view>
+    <u-cell title="头像" :isLink="true" arrow-direction="right">
+        <div slot="value">
+            <!-- <u-image src="https://img.yzcdn.cn/vant/cat.jpeg"  width="50px" height="50px" shape="circle" /> -->
+            <u-upload :fileList="fileList1" @afterRead="afterRead" @delete="deletePic" name="1" multiple :maxCount="10">
+                <u-image :src="src" width="50px" height="50px" shape="circle" />
+            </u-upload>
+        </div>
+    </u-cell>
+    <u-cell title="昵称" :isLink="true" url="/components/editUserInfo/editUserName/editUserName" :value="userName" arrow-direction="right" @click="getUserInfo"></u-cell>
+    <u-cell title="手机号" :isLink="true" url="/components/editUserInfo/editUserPhone/editUserPhone" arrow-direction="right"></u-cell>
+    <u-cell title="实名认证" :isLink="true" url="/components/editUserInfo/nameAuthentication/nameAuthentication" arrow-direction="right"></u-cell>
+    <u-cell title="设置支付密码" :isLink="true" url="/components/editUserInfo/editPayPassWord/editPayPassWord" arrow-direction="right"></u-cell>
+    <u-cell title="性别" @click="setSex" :value="sex" :isLink="true" arrow-direction="right"></u-cell>
+    <u-cell title="生日" @click="showBirthday = true" :value="time" :isLink="true" arrow-direction="right"></u-cell>
+    <u-button>退出账户</u-button>
+    <u-datetime-picker :show="showBirthday" @confirm="confirm" mode="date" @cancel="showBirthday = false"></u-datetime-picker>
+</view>
+</template>
+
+<script>
+export default {
+    data() {
+        return {
+            fileList1: [
+
+            ],
+            src: 'https://img.yzcdn.cn/vant/cat.jpeg',
+            userName: '',
+            sex: '男',
+			showBirthday:false,
+			time:''
+        }
+    },
+    mounted() {
+
+    },
+    methods: {
+        getUserInfo() {
+            console.log('获取用户信息');
+            // uni.getUserProfile({
+            // 	desc: '用于获取您的个人信息',
+            // 	success: (res) => {
+            // 		console.log(res)
+            // 		this.src = res.userInfo.avatarUrl;
+            // 		this.userName = res.userInfo.nickName;
+            // 	},
+            // 	fail:(err)=>{
+            // 		console.log(err);
+            // 	}
+            // })
+        },
+        setSex() {
+            uni.showActionSheet({
+                itemList: ['男', '女'],
+                success: (res) => {
+                    console.log(res.tapIndex)
+                    this.sex = res.tapIndex == 0 ? '男' : '女';
+                },
+                fail: (err) => {
+                    console.log(err.errMsg)
+                }
+            });
+        },
+		formatter(value) {
+            if (!value) return ''
+            const date = new Date(value)
+            const formattedDate = `${date.getFullYear()}-${(date.getMonth() + 1).toString().padStart(2, '0')}-${date.getDate().toString().padStart(2, '0')} ${date.getHours().toString().padStart(2, '0')}:${date.getMinutes().toString().padStart(2, '0')}`
+            return formattedDate
+        },
+		confirm(value){
+			console.log('confirm', value);
+			this.time = this.formatter(value.value);
+			this.showBirthday = false;
+		},
+		afterRead(file) {
+			console.log(file);
+			this.src = file[0].url;
+		},
+		deletePic(file) {
+			console.log(file);
+			this.src = '';
+		}
+    }
+}
+</script>
+
+<style>
+
+</style>

+ 47 - 0
components/editUserInfo/editUserName/editUserName.vue

@@ -0,0 +1,47 @@
+<template>
+<view class="pages">
+    <div class="input-back">
+		<u--input :customStyle="{height: '40px'}" placeholder="请输入内容" border="surround" v-model="value" @change="change"></u--input>
+	</div>
+	<div class="save-btn">
+		<u-button type="primary">保存</u-button>
+	</div>
+</view>
+</template>
+
+<script>
+export default {
+    data() {
+        return {
+			value:''
+        };
+    },
+	methods:{
+		change(){
+			console.log(this.value);
+		}
+	}
+}
+</script>
+
+<style lang="scss">
+.pages{
+	background: #f5f5f5;
+	width: 100vw;
+	height: 100vh;
+}
+.input-back{
+	width: 100%;
+	// height: 100px;
+	background: #fff;
+}
+.save-btn{
+	text-align:center;
+	// margin-top:20px;
+	position: fixed;
+	bottom: 0;
+	width: 100%;
+	padding: 30px;
+	box-sizing: border-box;
+}
+</style>

+ 77 - 0
components/editUserInfo/editUserPhone/editUserPhone.vue

@@ -0,0 +1,77 @@
+<template>
+<view class="pages">
+    <div class="input-back">
+        <u--input placeholder="手机号码" :customStyle="{height: '40px'}" border="surround" v-model="value" @change="change"></u--input>
+        <u-input placeholder="后置插槽" :customStyle="{height: '40px'}">
+            <template slot="suffix">
+                <u-code ref="uCode" @change="codeChange" seconds="20" changeText="X秒重新获取"></u-code>
+                <u-button @tap="getCode" :text="tips" type="primary" size=""></u-button>
+            </template>
+        </u-input>
+    </div>
+    <div class="save-btn">
+        <u-button type="primary">保存</u-button>
+    </div>
+</view>
+</template>
+
+<script>
+export default {
+    data() {
+        return {
+            value: '',
+            tips: '获取验证码'
+        };
+    },
+    methods: {
+        change() {
+            console.log(this.value);
+        },
+        codeChange(text) {
+            console.log('codeChange');
+            this.tips = text
+        },
+        getCode() {
+            if (this.$refs.uCode.canGetCode) {
+                // 模拟向后端请求验证码
+                uni.showLoading({
+                    title: '正在获取验证码'
+                })
+                setTimeout(() => {
+                    uni.hideLoading();
+                    // 这里此提示会被this.start()方法中的提示覆盖
+                    uni.$u.toast('验证码已发送');
+                    // 通知验证码组件内部开始倒计时
+                    this.$refs.uCode.start();
+                }, 2000);
+            } else {
+                uni.$u.toast('倒计时结束后再发送');
+            }
+        },
+    }
+}
+</script>
+
+<style lang="scss">
+.pages {
+    background: #f5f5f5;
+    width: 100vw;
+    height: 100vh;
+}
+
+.input-back {
+    width: 100%;
+    // height: 100px;
+    background: #fff;
+}
+
+.save-btn {
+    text-align: center;
+    // margin-top:20px;
+    position: fixed;
+    bottom: 0;
+    width: 100%;
+    padding: 30px;
+    box-sizing: border-box;
+}
+</style>

+ 48 - 0
components/editUserInfo/nameAuthentication/nameAuthentication.vue

@@ -0,0 +1,48 @@
+<template>
+<view class="pages">
+    <div class="top">
+        <div style="line-height:60px;text-align:center;">
+            完成身份实名后可享受会员权益,实名信息仅可修改一次
+        </div>
+        <u--input :customStyle="{height: '40px'}" placeholder="请输入姓名" border="surround" v-model="value" @change="change"></u--input>
+        <u--input :customStyle="{height: '40px'}" placeholder="请输入身份证号" border="surround" v-model="value" @change="change"></u--input>
+    </div>
+    <div class="save-btn">
+        <u-button type="primary">保存</u-button>
+    </div>
+</view>
+</template>
+
+<script>
+export default {
+    data() {
+        return {
+
+        }
+    },
+    methods: {
+
+    }
+}
+</script>
+
+<style lang="scss" scoped>
+.pages {
+    width: 100vw;
+    height: 100vh;
+    background: #f5f5f5;
+}
+
+.top {
+    background: #fff;
+}
+.save-btn {
+    text-align: center;
+    // margin-top:20px;
+    position: fixed;
+    bottom: 0;
+    width: 100%;
+    padding: 30px;
+    box-sizing: border-box;
+}
+</style>

+ 27 - 0
components/historyCoupon/historyCoupon.vue

@@ -0,0 +1,27 @@
+<template>
+<view>
+    <u-subsection :list="list" mode="subsection" :current="current" @change="sectionChange"></u-subsection>
+    <u-empty mode="coupon" text="还没有券哦">
+    </u-empty>
+</view>
+</template>
+
+<script>
+export default {
+    data() {
+        return {
+            list: ['已使用', '已过期'],
+            current: 0,
+        }
+    },
+    methods: {
+        sectionChange(e) {
+            this.current = e
+        }
+    }
+}
+</script>
+
+<style>
+
+</style>

+ 128 - 0
components/hotelAppraise/hotelAppraise.vue

@@ -0,0 +1,128 @@
+<template>
+	<view class="pages">
+		<div class="appraise-top">
+			<div style="display:flex;align-items: center;">
+				{{value}}分 <u-rate activeColor="#FFD700" :count="count" v-model="value" readonly></u-rate>
+			</div>
+			<div class="tabs">
+				<div class="tabs-content" :class="{'tabs-active':index==current}" v-for="(item, index) in gradeList" :key="item.id" @click="change(item, index)">
+					{{item.name}}
+				</div>
+			</div>
+		</div>
+		<div class="grade-detail" v-for="item in 10" :key="item.id">
+			<div class="grade-detail-top">
+				<div>
+					<u-avatar :src="'@/static/niu.jpg'"></u-avatar>
+					<div style="margin-left:10px">愤怒的小白</div>
+				</div>
+				<div class="grade-detail-top-word">
+					发表于{{new Date().toLocaleDateString()}}
+				</div>
+			</div>
+			<div class="grade-detail-top">
+				<div>
+					<div>5分</div>
+					<u-rate activeColor="#FFD700" :count="5" :value="item+1" readonly></u-rate>
+				</div>
+				<div class="grade-detail-top-word">
+					特惠双人房
+				</div>
+			</div>
+			<div class="grade-detail-remark">
+				评价方未及时做出评价,系统默认好评!
+			</div>
+		</div>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				count: 5,
+				value: 0,
+				gradeList: [
+					{
+						id: 1,
+						name: '全部',
+						value: 0
+					},
+					{
+						id: 2,
+						name: '好评',
+						value: 1
+					},
+					{
+						id: 3,
+						name: '待改善',
+						value: 2
+					},
+					{
+						id: 4,
+						name: '有图',
+						value: 3
+					}
+				],
+				current:0,
+			}
+		},
+		methods: {
+			change(item, idx){
+				console.log(item)
+				this.current = idx
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+.pages{
+	width: 100vw;
+	height: 100vh;
+	background: #f5f5f5;
+}
+.appraise-top{
+	padding: 20px;
+	background: #fff;
+}
+.tabs-active{
+	color: #fff !important;
+	background: rgb(0, 170 ,255);
+}
+.tabs{
+	display: flex;
+	margin-top: 10px;
+	.tabs-content{
+		padding: 5px 12px;
+		border-radius: 15px;
+		border: 1px solid rgb(0, 170 ,255);
+		color: rgb(0, 170 ,255);
+		margin-right: 10px;
+	}
+}
+.grade-detail{
+	margin-top: 10px;
+	padding: 20px;
+	box-sizing: border-box;
+	background: #fff;
+	.grade-detail-top{
+		display: flex;
+		justify-content: space-between;
+		align-items: center;
+		div:nth-child(1){
+			display: flex;
+			align-items: center;
+		}
+		.grade-detail-top-word{
+			color: #999;
+			font-size: 14px;
+		}
+	}
+	.grade-detail-remark{
+		margin-top: 10px;
+		// color: #999;
+		// font-size: 14px;
+	}
+}
+</style>

+ 192 - 0
components/hotelBooking/hotelBooking.vue

@@ -0,0 +1,192 @@
+<template>
+<view class="pages">
+    <div class="top-hotel-detail">
+        <div style="font-size: 18px;">
+            丁真精品酒店理塘总店 四川省甘孜州理塘县理塘路口
+        </div>
+        <div>
+            商务大床房B
+        </div>
+        <div>
+            入住{{`2019-12-12`}} 离店{{`2019-12-13`}} 共1晚
+        </div>
+    </div>
+    <div>
+        <div class="form-flex">
+            <div>
+                房间数
+            </div>
+            <div>
+                <u-number-box v-model="form.roomNum" @change="valChange"></u-number-box>
+                <u-icon name="arrow-right" color="#000" size="20"></u-icon>
+            </div>
+        </div>
+        <div class="form-flex">
+            <div>
+                入住人
+            </div>
+            <div @click="handleToContacts">
+                <template v-if="form.name!=''">{{ form.name }} {{ form.phone }}</template>
+                <template v-else>请选择联系人</template>
+                <u-icon name="arrow-right" color="#000" size="20"></u-icon>
+            </div>
+        </div>
+        <div class="form-flex" style="margin-top:20px">
+            <div>
+                到店时间
+            </div>
+            <div @click="openTime">
+                {{ form.time }}
+                <u-icon name="arrow-right" color="#000" size="20"></u-icon>
+            </div>
+        </div>
+        <div class="form-flex">
+            <div>
+                优惠券
+            </div>
+            <div @click="handleToCoupon">
+                {{ form.coupon }}
+                <u-icon name="arrow-right" color="#000" size="20"></u-icon>
+            </div>
+        </div>
+        <div class="form-flex">
+            <div>
+                发票
+            </div>
+            <div @click="handleToBill">
+                {{ form.bill }}
+                <u-icon name="arrow-right" color="#000" size="20"></u-icon>
+            </div>
+        </div>
+        <div class="form-flex">
+            <div>
+                备注
+            </div>
+            <div style="flex:1;">
+                <u-input placeholder="请输入备注" v-model="form.remarks"></u-input>
+                <u-icon name="arrow-right" color="#000" size="20"></u-icon>
+            </div>
+        </div>
+    </div>
+	<div class="bottom-submit">
+		<div>
+			<span style="color:rgb(0, 170 ,255)">338.00</span> 元 <span style="padding:3px 8px;border-radius:5px;border:1px solid rgb(0, 170 ,255);margin-left:5px;">明细</span>
+		</div>
+		<div>
+			<u-button @click="submitHotel" type="primary">提交</u-button>
+		</div>
+	</div>
+    <u-datetime-picker ref="datetimePicker" :show="show" v-model="nowTime" @confirm="confirmTime" mode="datetime"></u-datetime-picker>
+</view>
+</template>
+
+<script>
+export default {
+    data() {
+        return {
+            form: {
+                roomNum: 1, //房间数
+                name: '', //入住人
+                phone: '', //手机号
+                time: '', //到店时间
+                coupon: '', //优惠券
+                bill: '', //发票
+                remarks: '', //备注
+            },
+			nowTime:Number(new Date()),
+            show: false,
+            rules: {}
+        }
+    },
+    filters: {
+		//将时间戳格式化为yy-mm-dd hh:mm
+        formatter(value) {
+            if (!value) return ''
+            const date = new Date(value)
+            const formattedDate = `${date.getFullYear()}-${(date.getMonth() + 1).toString().padStart(2, '0')}-${date.getDate().toString().padStart(2, '0')} ${date.getHours().toString().padStart(2, '0')}:${date.getMinutes().toString().padStart(2, '0')}`
+            return formattedDate
+        }
+    },
+    methods: {
+        valChange(val) {
+            console.log(val)
+        },
+        handleToContacts() {
+            uni.navigateTo({
+                url: '/components/contacts/contacts'
+            })
+        },
+        openTime() {
+            this.show = true
+        },
+        onReady() {
+            
+        },
+        confirmTime(obj) {
+			console.log(this);
+            this.form.time = this.$options.filters.formatter(obj.value)
+            this.show = false
+        },
+		handleToCoupon(){
+			uni.navigateTo({
+			    url: '/components/coupon/coupon'
+			})
+		},
+		handleToBill(){
+			uni.navigateTo({
+			    url: '/components/bill/bill'
+			})
+		},
+		submitHotel(){
+			console.log('提交');
+		}
+    }
+}
+</script>
+
+<style lang="scss" scoped>
+.pages {
+    width: 100%;
+    height: 100vh;
+    background: #f5f5f5;
+}
+
+.top-hotel-detail {
+    width: 100%;
+    height: 200px;
+    background: #032c4f;
+    display: flex;
+    flex-direction: column;
+    justify-content: space-evenly;
+    color: #fff;
+    padding: 20px;
+    box-sizing: border-box;
+}
+
+.form-flex {
+    display: flex;
+    justify-content: space-between;
+    height: 30px;
+    align-items: center;
+    padding: 20px;
+    background: #fff;
+
+    div:nth-child(2) {
+        display: flex;
+        align-items: center;
+    }
+}
+.bottom-submit{
+	width:100%;
+	height:90px;
+	background:#fff;
+	position:fixed;
+	padding: 20px;
+	bottom:0;
+	left:0;
+	display: flex;
+	justify-content: space-between;
+	align-items: center;
+	box-sizing: border-box;
+}
+</style>

+ 130 - 0
components/hotelCard/hotelCard.vue

@@ -0,0 +1,130 @@
+<template>
+<view>
+    <swiper class="swiper" circular :indicator-dots="indicatorDots" :autoplay="autoplay" :interval="interval" :duration="duration">
+        <swiper-item v-for="item in 4" :key="item.id">
+            <div class="card">
+				<div class="card-type">
+					金卡会员
+				</div>
+				<div>
+					理塘酒店(世界最高城店)
+				</div>
+				<div class="card-data">
+					<div style="margin-right:40px;">
+						<div style="font-weight: bold;">余额</div>
+						<div>0</div>
+					</div>
+					<div>
+						<div style="font-weight: bold;">积分</div>
+						<div>0</div>
+					</div>
+				</div>
+				<div class="card-explain">
+					用卡说明
+				</div>
+            </div>
+        </swiper-item>
+    </swiper>
+	<div class="form-data">
+		<div class="form-data-top">填写个人信息</div>
+		<div class="form-data-info">
+			<div style="width:100px">姓名</div>
+			<div style="flex:1">
+				<input type="text" placeholder="请输入姓名">
+			</div>
+		</div>
+		<div class="form-data-info">
+			<div style="width:100px">身份证</div>
+			<div style="flex:1">
+				<input type="text" placeholder="请输入身份证">
+			</div>
+		</div>
+		<div class="form-data-info">
+			<div style="width:100px">手机号</div>
+			<div style="flex:1">
+				<input type="text" placeholder="请输入手机号">
+			</div>
+		</div>
+		<div class="form-data-info">
+			<div style="width:100px">推荐员工号</div>
+			<div style="flex:1">
+				<input type="text" placeholder="请输入推荐员工号">
+			</div>
+		</div>
+		<div class="form-data-info">
+			<div style="width:100px">微信支付</div>
+			<div style="flex:1">
+				<input type="text" placeholder="218">
+			</div>
+		</div>
+	</div>
+	<u-button type="primary">立即办理</u-button>
+</view>
+</template>
+
+<script>
+export default {
+    data() {
+        return {
+
+        }
+    },
+    methods: {
+
+    }
+}
+</script>
+
+<style lang="scss" scoped>
+.card {
+    width: 96vw;
+    margin: auto;
+    margin-top: 10px;
+	background: #F0F8FF;
+	height: 260px;
+	padding: 0 20px;
+	border-radius: 10px;
+	box-sizing: border-box;
+	overflow: hidden;
+	position: relative;
+}
+.card-type{
+	margin-top: 30px;
+}
+.swiper{
+	height: 270px;
+}
+.card-data{
+	display: flex;
+	// justify-content: space-between;
+	margin-top: 15px;
+	div{
+		display: flex;
+		flex-direction: column;
+		justify-content: center;
+		align-items: center;	
+	}
+}
+.card-explain{
+	position: absolute;
+	bottom: 10px;
+	right: 10px;
+	padding: 5px 10px;
+	background: #DCDCDC;
+	border-radius: 15px;
+}
+.form-data{
+	width: 96vw;
+    margin: auto;
+	margin-top: 20px;
+}
+.form-data-top{
+	border-left: #00AAFF 5px solid;
+	padding-left: 5px;
+}
+.form-data-info{
+	display: flex;
+	align-items: center;
+	height: 60px;
+}
+</style>

+ 413 - 0
components/hotelDetail/hotelDetail.vue

@@ -0,0 +1,413 @@
+<template>
+<view class="pages">
+    <div class="top-image" @click="handleToHotelImage">
+        <div class="top-right">
+            <div class="heart" style="margin-right:3px;">
+                <u-icon name="star" color="#fff" size="20"></u-icon>
+            </div>
+            <div class="heart">
+                <u-icon name="share" color="#fff" size="20"></u-icon>
+            </div>
+        </div>
+        <div class="top-right-bottom">
+            <u-icon name="photo" color="#fff" size="20"></u-icon> 1/64
+        </div>
+    </div>
+
+    <div class="detail-card">
+        <h4>恒枫酒店(红房子医院店)</h4>
+        <div class="detail-card-call">
+            <h4>2019年开业</h4>
+            <u-icon @click="openPhone" name="phone" color="#000" size="30"></u-icon>
+        </div>
+        <div class="installation">
+            <div class="installation-box" v-for="item in 5" :key="item.id">
+                <div>
+                    <u-icon name="wifi" color="#000" size="30"></u-icon>
+                </div>
+                <div>
+                    WIFI
+                </div>
+            </div>
+        </div>
+        <div class="grade">
+            <div class="grade-left">
+                0分
+            </div>
+            <div class="grade-center">
+                0.00%好评,0条评论
+            </div>
+            <div @click="handleToHotelAppraise">
+                <u-icon name="arrow-right" color="#00000068" size="30"></u-icon>
+            </div>
+        </div>
+        <div class="address">
+            <div style="color:#0000068">
+                四川省甘孜州理塘县理塘路口
+            </div>
+            <div style="display:flex;align-items:center;">
+                查看地图<u-icon name="arrow-right" color="#00000068" size="26"></u-icon>
+            </div>
+        </div>
+    </div>
+
+    <div class="card-data-list">
+        <div class="card-list-top">
+            <div @click="handleCalendar">
+                <div>入住</div>
+                <div>{{`2023-04-10`}}</div>
+            </div>
+            <div>
+                {{`共17晚`}}
+            </div>
+            <div>
+                <div>离开</div>
+                <div>{{`2023-04-28`}}</div>
+            </div>
+        </div>
+        <div v-for="(item, index) in dataList" :key="item.id">
+            <div class="card-list">
+                <div class="card-list-left">
+                    <u-image :showLoading="true" radius="5px" mode="scaleToFill" src="@/static/niu.jpg" width="80px" height="80px" @click="click"></u-image>
+                    <div class="card-list-left-detail">详情</div>
+                </div>
+                <div class="card-list-center">
+                    <h2>家庭房</h2>
+                    <div>15 1.5+1.2 可住2人</div>
+                </div>
+                <div class="card-list-right" @click="showDetail(item, index)">
+                    <div>
+                        <div v-if="!item.checked">¥159.00</div>
+                        <div v-else style="font-size: 12px;text-decoration-line:line-through;color:#00000068;">门市价:¥{{item.price}}</div>
+                        <div style="font-size:14px;">房量紧张</div>
+                    </div>
+                    <div>
+                        <u-icon name="arrow-right" color="#00000068" size="26"></u-icon>
+                    </div>
+                </div> 
+            </div>
+			<div class="card-list-bottom" v-if="item.checked">
+				<div>
+					<div style="display:flex;align-items:center;">专享价
+						<u-icon name="arrow-right" color="#00000068" size="26"></u-icon>
+					</div>
+					<div style="color:red">
+						仅剩6间
+					</div>
+				</div>
+				<div style="display:flex;align-items:center;">
+					<div style="margin-right:10px;text-align:right;">
+						<div style="color:#30a7f5">¥159.00</div>
+						<div style="color:#00000068;text-decoration-line: line-through;font-size: 12px;">¥179.00</div>
+						<div style="color:#30a7f5">已优惠20元</div>
+					</div>
+					<div class="card-list-bottom-right" @click="handleToHotelBooking(item)">
+						<div>预定</div>
+						<div>到店支付</div>
+					</div>
+				</div>
+			</div>
+        </div>
+    </div>
+    <u-action-sheet :actions="list" @close="show = false" safeAreaInsetBottom @select="phoneSelect" :title="title" :show="show"></u-action-sheet>
+</view>
+</template>
+
+<script>
+export default {
+    data() {
+        return {
+            dataList:[
+                {
+                    id:1,
+                    name:'家庭房',
+                    price:159,
+                    img:'@/static/niu.jpg',
+                    type:'15 1.5+1.2 可住2人',
+                    status:'房量紧张',
+                    checked:false
+                },
+                {
+                    id:2,
+                    name:'家庭房',
+                    price:159,
+                    img:'@/static/niu.jpg',
+                    type:'15 1.5+1.2 可住2人',
+                    status:'房量紧张',
+                    checked:false
+                },
+                {
+                    id:3,
+                    name:'家庭房',
+                    price:159,
+                    img:'@/static/niu.jpg',
+                    type:'15 1.5+1.2 可住2人',
+                    status:'房量紧张',
+                    checked:false
+                },
+                {
+                    id:4,
+                    name:'家庭房',
+                    price:159,
+                    img:'@/static/niu.jpg',
+                    type:'15 1.5+1.2 可住2人',
+                    status:'房量紧张',
+                    checked:false
+                },
+                {
+                    id:5,
+                    name:'家庭房',
+                    price:159,
+                    img:'@/static/niu.jpg',
+                    type:'15 1.5+1.2 可住2人',
+                    status:'房量紧张',
+                    checked:false
+                }
+            ],
+            list: [
+				{
+					name:'酒店客服:400-000-0000',
+                    phone:'400-000-0000'
+				},
+				{
+					name: '平台客服:400-000-0000',
+                    phone:'400-000-0000'
+				}
+			],
+			show: false
+        }
+    },
+    methods: {
+        showDetail(item, index) {
+            this.dataList[index].checked = !this.dataList[index].checked
+        },
+        handleToHotelBooking(item) {
+            uni.navigateTo({
+                url: '/components/hotelBooking/hotelBooking'
+            })
+        },
+        handleToHotelAppraise(){
+            uni.navigateTo({
+                url: '/components/hotelAppraise/hotelAppraise'
+            })
+        },
+        handleToHotelImage(){
+            uni.navigateTo({
+                url: '/components/hotelImage/hotelImage'
+            })
+        },
+        openPhone(){
+            this.show = true
+        },
+        phoneSelect(e){
+            uni.makePhoneCall({
+                phoneNumber: e.phone //仅为示例,并非真实的电话号码
+            });
+        }
+    }
+}
+</script>
+
+<style lang="scss" scoped>
+.pages {
+    width: 100vw;
+    height: 100vh;
+    background: #f3f3f3;
+}
+
+.top-image {
+    width: 100vw;
+    height: 260px;
+    background: rgb(243, 142, 134);
+    position: relative;
+}
+
+.top-right {
+    position: absolute;
+    top: 20px;
+    right: 10px;
+    display: flex;
+}
+
+.heart {
+    background: #00000068;
+    width: 30px;
+    height: 30px;
+    border-radius: 50%;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+}
+
+.top-right-bottom {
+    position: absolute;
+    right: 10px;
+    bottom: 30px;
+    background: #00000068;
+    padding: 3px 5px;
+    border-radius: 8px;
+    display: flex;
+    align-items: center;
+    color: #fff;
+}
+
+.detail-card {
+    background: #fff;
+    width: 96vw;
+    min-height: 220px;
+    margin: auto;
+    padding: 20px 15px 5px 15px;
+    box-sizing: border-box;
+    position: relative;
+    top: -20px;
+    border-radius: 8px;
+    box-shadow: 0 0 10px #00000029;
+
+    .detail-card-call {
+        display: flex;
+        justify-content: space-between;
+        align-items: center;
+    }
+}
+
+.installation {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+
+    .installation-box {
+        display: flex;
+        align-items: center;
+    }
+}
+
+.grade {
+    display: flex;
+    // justify-content: space-between;
+    align-items: center;
+    margin-top: 10px;
+
+    .grade-left {
+        width: 60px;
+        height: 60px;
+        background: #30a7f5;
+        display: flex;
+        justify-content: center;
+        align-items: center;
+        color: #fff;
+    }
+
+    .grade-center {
+        flex: 1;
+        margin: 0 10px;
+        color: #00000068;
+    }
+}
+
+.address {
+    margin-top: 10px;
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+}
+
+.card-data-list {
+    background: #fff;
+    width: 96vw;
+    box-sizing: border-box;
+    margin: auto;
+    padding: 20px 10px;
+
+    .card-list-top {
+        display: flex;
+        justify-content: space-between;
+        align-items: center;
+    }
+
+    .card-list {
+        display: flex;
+        justify-content: space-between;
+        align-items: center;
+        margin-top: 10px;
+        border-bottom: 1px solid #00000011;
+        min-height: 100px;
+
+        .card-list-left-detail {
+            position: absolute;
+            bottom: 0;
+            right: 0;
+            // width: 100%;
+            // height: 100%;
+            padding: 3px;
+            background: #00000068;
+            display: flex;
+            justify-content: center;
+            align-items: center;
+            color: #fff;
+            font-size: 14px;
+        }
+
+        .card-list-left {
+            position: relative;
+        }
+
+        .card-list-center {
+            flex: 1;
+            margin: 0 10px;
+            color: #00000068;
+
+            h2 {
+                font-size: 18px;
+                color: #000;
+            }
+        }
+
+        .card-list-right {
+            display: flex;
+            // justify-content: space-between;
+            align-items: center;
+            color: red;
+        }
+    }
+}
+.card-list-bottom{
+	display: flex;
+	justify-content: space-between;
+	align-items: center;
+	padding: 10px;
+	background: #00000011;
+}
+.card-list-bottom-right{
+	display: flex;
+	flex-direction: column;
+	align-items: center;
+	justify-content: center;
+	border-top-left-radius: 5px;
+	border-top-right-radius: 5px;
+	overflow: hidden;
+	// height: 100%;
+	width: 70px;
+	height: 60px;
+	>div:nth-child(1){
+		background: #30a7f5;
+		color: #fff;
+		height: 100%;
+		width: 100%;
+		display: flex;
+		justify-content: center;
+		align-items: center;
+		// padding: 5px 10px;
+		// border-radius: 8px;
+		// margin-bottom: 5px;
+	}
+	>div:nth-child(2){
+		color: #30a7f5;
+		background: #fff;
+		width: 100%;
+		height: 100%;
+		display: flex;
+		justify-content: center;
+		align-items: center;
+	}
+}
+</style>

+ 40 - 0
components/hotelImage/hotelImage.vue

@@ -0,0 +1,40 @@
+<template>
+<view class="image-list">
+    <u-album :urls="urls" multipleSize="30vw"></u-album>
+</view>
+</template>
+
+<script>
+export default {
+    data() {
+        return {
+            urls: [
+                'https://cdn.uviewui.com/uview/album/1.jpg',
+                'https://cdn.uviewui.com/uview/album/2.jpg',
+                'https://cdn.uviewui.com/uview/album/3.jpg',
+                'https://cdn.uviewui.com/uview/album/4.jpg',
+                'https://cdn.uviewui.com/uview/album/5.jpg',
+                'https://cdn.uviewui.com/uview/album/6.jpg',
+                'https://cdn.uviewui.com/uview/album/7.jpg',
+                'https://cdn.uviewui.com/uview/album/8.jpg',
+                'https://cdn.uviewui.com/uview/album/9.jpg',
+                'https://cdn.uviewui.com/uview/album/10.jpg',
+            ]
+        }
+    },
+    methods: {
+
+    }
+}
+</script>
+
+<style lang="scss" scoped>
+.image-list{
+	width: 100vw;
+	padding: auto;
+}
+/deep/.u-album{
+	justify-content: center;
+	align-items: center;
+}
+</style>

+ 41 - 0
components/memberCard/memberCard.vue

@@ -0,0 +1,41 @@
+<template>
+	<view>
+		<div class="card-nodata">
+			<div style="color:#00aaff;text-align:center;">
+				你还没有办理酒店会员,无法享受会员价及会员权益!
+			</div>
+			<div style="width:100%;margin-top:10px;">
+				<u-button @click="toSearchHotel" type="primary">去办卡</u-button>
+			</div>
+		</div>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				
+			}
+		},
+		methods: {
+			toSearchHotel(){
+				uni.navigateTo({
+					url: '/components/searchHotel/searchHotel'
+				});
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+.card-nodata{
+	display: flex;
+	flex-direction: column;
+	justify-content: center;
+	align-items: center;
+	height: 50vh;
+	width: 80%;
+	margin: auto;
+}
+</style>

+ 54 - 0
components/order/BookingOrder/BookingOrder.vue

@@ -0,0 +1,54 @@
+<template>
+	<view class="pages">
+		<div class="tabs">
+			<div class="tabs-content" v-for="(item, index) in tabList" :key="index" :class="{'tabs-content-active':index==current}" @click="changeTabs(index)">
+				{{item}}
+			</div>
+		</div>
+
+		<div class="no-data">--还没有订单哟--</div>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				tabList:['全部','待付款','待入住','待评价'],
+				current:0,
+			}
+		},
+		methods: {
+			changeTabs(index){
+				this.current = index;
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+.tabs{
+	display: flex;
+	justify-content: space-evenly;
+	align-items: center;
+	height: 50px;
+	background: #fff;
+	.tabs-content{
+
+	}
+	.tabs-content-active{
+		color: #00aaff;
+		border-bottom: 2px solid #00aaff;
+	}
+}
+.no-data{
+	color: #00aaff;
+	text-align: center;
+	margin-top: 40px;
+}
+.pages{
+	// height: 100vh;
+	// width: 100vw;
+	// background: #f5f5f5;
+}
+</style>

+ 54 - 0
components/order/foodOrder/foodOrder.vue

@@ -0,0 +1,54 @@
+<template>
+	<view class="pages">
+		<div class="tabs">
+			<div class="tabs-content" v-for="(item, index) in tabList" :key="index" :class="{'tabs-content-active':index==current}" @click="changeTabs(index)">
+				{{item}}
+			</div>
+		</div>
+
+		<div class="no-data">--还没有订单哟--</div>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				tabList:['全部订单','待付款','审核中','待收货','待发货','已拒绝'],
+				current:0,
+			}
+		},
+		methods: {
+			changeTabs(index){
+				this.current = index;
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+.tabs{
+	display: flex;
+	justify-content: space-evenly;
+	align-items: center;
+	height: 50px;
+	background: #fff;
+	.tabs-content{
+
+	}
+	.tabs-content-active{
+		color: #00aaff;
+		border-bottom: 2px solid #00aaff;
+	}
+}
+.no-data{
+	color: #00aaff;
+	text-align: center;
+	margin-top: 40px;
+}
+.pages{
+	// height: 100vh;
+	// width: 100vw;
+	// background: #f5f5f5;
+}
+</style>

+ 54 - 0
components/order/inOrder/inOrder.vue

@@ -0,0 +1,54 @@
+<template>
+	<view class="pages">
+		<div class="tabs">
+			<div class="tabs-content" v-for="(item, index) in tabList" :key="index" :class="{'tabs-content-active':index==current}" @click="changeTabs(index)">
+				{{item}}
+			</div>
+		</div>
+
+		<div class="no-data">--还没有订单哟--</div>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				tabList:['全部','入住','已退房'],
+				current:0,
+			}
+		},
+		methods: {
+			changeTabs(index){
+				this.current = index;
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+.tabs{
+	display: flex;
+	justify-content: space-evenly;
+	align-items: center;
+	height: 50px;
+	background: #fff;
+	.tabs-content{
+
+	}
+	.tabs-content-active{
+		color: #00aaff;
+		border-bottom: 2px solid #00aaff;
+	}
+}
+.no-data{
+	color: #00aaff;
+	text-align: center;
+	margin-top: 40px;
+}
+.pages{
+	// height: 100vh;
+	// width: 100vw;
+	// background: #f5f5f5;
+}
+</style>

+ 54 - 0
components/order/posOrder/posOrder.vue

@@ -0,0 +1,54 @@
+<template>
+	<view class="pages">
+		<div class="tabs">
+			<div class="tabs-content" v-for="(item, index) in tabList" :key="index" :class="{'tabs-content-active':index==current}" @click="changeTabs(index)">
+				{{item}}
+			</div>
+		</div>
+
+		<div class="no-data">--还没有订单哟--</div>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				tabList:['扫码订单','预定订单'],
+				current:0,
+			}
+		},
+		methods: {
+			changeTabs(index){
+				this.current = index;
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+.tabs{
+	display: flex;
+	justify-content: space-evenly;
+	align-items: center;
+	height: 50px;
+	background: #fff;
+	.tabs-content{
+
+	}
+	.tabs-content-active{
+		color: #00aaff;
+		border-bottom: 2px solid #00aaff;
+	}
+}
+.no-data{
+	color: #00aaff;
+	text-align: center;
+	margin-top: 40px;
+}
+.pages{
+	// height: 100vh;
+	// width: 100vw;
+	// background: #f5f5f5;
+}
+</style>

+ 54 - 0
components/order/serviceOrder/serviceOrder.vue

@@ -0,0 +1,54 @@
+<template>
+	<view class="pages">
+		<div class="tabs">
+			<div class="tabs-content" v-for="(item, index) in tabList" :key="index" :class="{'tabs-content-active':index==current}" @click="changeTabs(index)">
+				{{item}}
+			</div>
+		</div>
+
+		<div class="no-data">--没有更多数据了--</div>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				tabList:['全部订单','待处理','处理中','已处理','已取消'],
+				current:0,
+			}
+		},
+		methods: {
+			changeTabs(index){
+				this.current = index;
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+.tabs{
+	display: flex;
+	justify-content: space-evenly;
+	align-items: center;
+	height: 50px;
+	background: #fff;
+	.tabs-content{
+
+	}
+	.tabs-content-active{
+		color: #00aaff;
+		border-bottom: 2px solid #00aaff;
+	}
+}
+.no-data{
+	color: #00aaff;
+	text-align: center;
+	margin-top: 40px;
+}
+.pages{
+	// height: 100vh;
+	// width: 100vw;
+	// background: #f5f5f5;
+}
+</style>

+ 54 - 0
components/order/settingsOrder/settingsOrder.vue

@@ -0,0 +1,54 @@
+<template>
+	<view class="pages">
+		<div class="tabs">
+			<div class="tabs-content" v-for="(item, index) in tabList" :key="index" :class="{'tabs-content-active':index==current}" @click="changeTabs(index)">
+				{{item}}
+			</div>
+		</div>
+
+		<div class="no-data">--没有更多数据了--</div>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				tabList:['全部订单','待处理','处理中','已处理','已取消'],
+				current:0,
+			}
+		},
+		methods: {
+			changeTabs(index){
+				this.current = index;
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+.tabs{
+	display: flex;
+	justify-content: space-evenly;
+	align-items: center;
+	height: 50px;
+	background: #fff;
+	.tabs-content{
+
+	}
+	.tabs-content-active{
+		color: #00aaff;
+		border-bottom: 2px solid #00aaff;
+	}
+}
+.no-data{
+	color: #00aaff;
+	text-align: center;
+	margin-top: 40px;
+}
+.pages{
+	// height: 100vh;
+	// width: 100vw;
+	// background: #f5f5f5;
+}
+</style>

+ 44 - 0
components/searchHotel/searchHotel.vue

@@ -0,0 +1,44 @@
+<template>
+	<view>
+		<div style="width:90vw;margin:auto;margin-top:10px;">
+			<u-search placeholder="搜索" v-model="keyword" :showAction="false"></u-search>
+		</div>
+		<div>
+			<div class="list-hotel" @click="handleToCard">
+				<div>
+					希尔顿酒店
+				</div>
+				<div>
+					<u-icon name="arrow-right" color="#00000068" size="26"></u-icon>
+				</div>
+			</div>
+		</div>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				keyword:''
+			}
+		},
+		methods: {
+			handleToCard(){
+				uni.navigateTo({
+					url:'/components/hotelCard/hotelCard'
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+.list-hotel{
+	display: flex;
+	justify-content: space-between;
+	align-items: center;
+	padding: 20px;
+	border-bottom: 1px solid #00000011;
+}
+</style>

+ 382 - 0
components/searchPage/searchPage.vue

@@ -0,0 +1,382 @@
+<template>
+<view class="pages">
+    <div class="title-top">
+        <u-input placeholder="位置/酒店/关键词" :customStyle="{background:'rgb(243, 243, 243)'}">
+            <u--text @click="handleToCity" text="长沙" slot="prefix" margin="0 3px 0 0" type="tips"></u--text>
+            <div slot="suffix" class="search-right">
+                <div>住{{timeList[0]}}</div>
+                <div v-if="timeList.length==1">离{{timeList[timeList.length-1]}}</div>
+            </div>
+        </u-input>
+    </div>
+    <div class="tabs">
+        <div @click="sort">推荐排序</div>
+        <div @click="starPriceShow=true">星级价格</div>
+        <div @click="locationAreaShow=true">位置区域</div>
+        <div @click="screenShow=true">筛选</div>
+    </div>
+    <!-- 推荐排序弹窗 -->
+    <u-action-sheet :actions="sortList" :show="sortShow" safeAreaInsetBottom @close="sortClose" @select="sortSelect" round="8"></u-action-sheet>
+    <!-- 星级价格弹窗 -->
+    <u-action-sheet :show="starPriceShow" safeAreaInsetBottom @close="starPriceShow=false" @select="starPriceSelect" round="8">
+        <div style="height:36vh;padding:10px">
+            <div class="star-top">
+                <div>星级</div>
+                <div style="display:flex;justify-content:space-between;flex-wrap:wrap;align-items:center;margin-top:10px">
+                    <div class="star-top-box" v-for="item in starPriceList" :key="item.id">{{item}}</div>
+                </div>
+            </div>
+            <div class="star-top">
+                <div>价格:{{starValue}}-不限</div>
+                <div>
+                    <u-slider v-model="starValue" max="1000"></u-slider>
+                </div>
+            </div>
+            <div class="star-btn">
+                <div style="width:80px">
+                    清空
+                </div>
+                <u-button type="primary">确定</u-button>
+            </div>
+        </div>
+    </u-action-sheet>
+
+    <!-- 位置区域弹窗 -->
+    <u-action-sheet :show="locationAreaShow" safeAreaInsetBottom @close="locationAreaShow=false" round="8">
+        <Sidebar :dataList="locationAreaList" />
+    </u-action-sheet>
+
+    <!-- 筛选弹窗 -->
+    <u-action-sheet :show="screenShow" safeAreaInsetBottom @close="screenShow=false" round="8">
+        <Sidebar :dataList="screenList" />
+    </u-action-sheet>
+
+    <!-- 酒店列表 -->
+    <div class="card-list" v-for="item in 15" :key="item.id" @click="handleToHotelDetail(item)">
+        <div class="card-list-image">
+            <u-image :showLoading="true" mode="scaleToFill" src="@/static/niu.jpg" width="120px" height="190px" @click="click"></u-image>
+        </div>
+        <div class="card-list-right">
+            <div style="font-size: 18px;color:#000;">练习时长两年半的酒店</div>
+            <div>0分 0条评论 | 经济型</div>
+            <div>距离市中心66.66km · 四川省理塘县(世界最高城)</div>
+            <div>
+                <span style="border:1px solid #ff9900;color:#ff9900;padding:3px 4px;border-radius:5px;margin-right:5px;">交通方便</span> 
+                <span style="border:1px solid #19be6b;color:#19be6b;padding:3px 4px;border-radius:5px;">服务周到</span>
+            </div>
+            <div style="margin-left:auto;color:#3c9cff;margin-right:10px;font-size: 18px;">70起</div>
+        </div>
+    </div>
+</view>
+</template>
+
+<script>
+import Sidebar from '../sidebar.vue'
+import { mapState } from 'vuex'
+export default {
+    components:{
+        Sidebar
+    },
+    computed:{
+        ...mapState({
+            timeList:state=>state.timeList
+        })
+    },
+    data() {
+        return {
+            sortList: [{
+                    name: '推荐排序',
+                    // subname:"选项一描述",
+                },
+                {
+                    name: '距离优先',
+                    // disabled:false
+                },
+                {
+                    name: '低价优先', //开启后文字不显示
+                    // loading:true
+                },
+                {
+                    name: '评分优先'
+                },
+                {
+                    name: '评论数优先'
+                }
+            ],
+            sortShow: false,
+            starPriceList: ['经济型', '二星/实惠', '三星/舒适', '四星/高档', '五星/豪华'],
+            starPriceShow: false,
+            starValue: 0,
+            locationAreaShow: false,
+            locationAreaList: [
+                {
+                    name:'距离我',
+                    children:[
+                        {
+                            name:'500m'
+                        },
+                        {
+                            name:'1km'
+                        },
+                        {
+                            name:'2km'
+                        },
+                        {
+                            name:'3km'
+                        },
+                        {
+                            name:'5km'
+                        },
+                        {
+                            name:'10km'
+                        },
+                    ]
+                },
+                {
+                    name:'热门推荐'
+                },
+                {
+                    name:'商业区'
+                },
+                {
+                    name:'行政区'
+                },
+                {
+                    name:'热门景点'
+                },
+                {
+                    name:'机场车站'
+                },
+                {
+                    name:'地铁线路',
+                    children:[
+                        {
+                            name:'1号线',
+                            children:[
+                                {
+                                    name:'开福区政府'
+                                }
+                            ]
+                        },
+                        {
+                            name:'2号线',
+                            children:[
+                                {
+                                    name:'五一广场'
+                                }
+                            ]
+                        },
+                        {
+                            name:'3号线',
+                            children:[
+                                {
+                                    name:'阳光100'
+                                }
+                            ]
+                        },
+                        {
+                            name:'4号线',
+                            children:[
+                                {
+                                    name:'罐子岭'
+                                }
+                            ]
+                        },
+                        {
+                            name:'5号线',
+                            children:[
+                                {
+                                    name:'万家丽广场'
+                                }
+                            ]
+                        },
+                        {
+                            name:'6号线',
+                            children:[
+                                {
+                                    name:'芙蓉区政府'
+                                }
+                            ]
+                        }
+                    ]
+                },
+                {
+                    name:'大学周边'
+                },
+                {
+                    name:'医院周边'
+                }
+            ],
+            screenShow:false,
+            screenList:[
+                {
+                    name:'主题类型',
+                    children:[
+                        {
+                            name:'情侣约会'
+                        },
+                        {
+                            name:'亲子家庭'
+                        },
+                        {
+                            name:'快捷连锁'
+                        },
+                        {
+                            name:'主题特色'
+                        },
+                        {
+                            name:'海滨风光'
+                        }
+                    ]
+                },
+                {
+                    name:'点评推荐',
+                    children:[
+                        {
+                            name:'评分',
+                            children:[
+                                {
+                                    name:'3分以上'
+                                }
+                            ]
+                        },
+                        {
+                            name:'数量',
+                            children:[
+                                {
+                                    name:'100条以上'
+                                }
+                            ]
+                        }
+                    ]
+                },
+                {
+                    name:'酒店品牌',
+                    children:[
+                        {
+                            name:'豪华型',
+                            children:[
+                                {
+                                    name:'希尔顿'
+                                }
+                            ]
+                        },
+                        {
+                            name:'高档型',
+                            children:[
+                                {
+                                    name:'万豪'
+                                }
+                            ]
+                        }
+                    ]
+                },
+                {
+                    name:'设施服务',
+                    children:[
+                        {
+                            name:'温泉',
+                        },
+                        {
+                            name:'租车',
+                        }
+                    ]
+                }
+            ]
+        }
+    },
+    methods: {
+        handleToCity() {
+            uni.navigateTo({
+                url: '/components/city/linzq-citySelect/linzq-citySelect'
+            })
+        },
+        sort() {
+            this.sortShow = true
+        },
+        sortClose() {
+            this.sortShow = false
+        },
+        sortSelect(e) {
+            console.log(e)
+            this.sortShow = false
+        },
+        handleToHotelDetail(){
+            uni.navigateTo({
+                url:'/components/hotelDetail/hotelDetail'
+            })
+        }
+    }
+}
+</script>
+
+<style lang="scss" scoped>
+.pages {
+    background-color: rgb(243, 243, 243);
+    height: 100vh;
+}
+
+.title-top {
+    padding: 0 10px;
+    background: #fff;
+    height: 60px;
+    display: flex;
+    align-items: center;
+}
+
+.search-right {
+    display: flex;
+    flex-direction: column;
+    justify-content: space-between;
+    align-items: center;
+    font-size: 12px;
+    color: #00000060;
+}
+
+.tabs {
+    height: 50px;
+    background: #fff;
+    margin-bottom: 10px;
+    display: flex;
+    justify-content: space-evenly;
+    align-items: center;
+}
+
+.star-top {
+    text-align: left;
+
+    .star-top-box {
+        padding: 5px 10px;
+        border: 1px solid #2979ff;
+        color: #2979ff;
+        border-radius: 20px;
+        text-align: center;
+        margin-bottom: 5px;
+    }
+}
+
+.star-btn {
+    display: flex;
+    align-items: center;
+    margin-top: 20px;
+}
+.card-list{
+    background: #fff;
+    width: 100%;
+    height: 200px;
+    padding: 5px;
+    box-sizing: border-box;
+    display: flex;
+    align-items: center;
+    box-shadow: 1px 1px 3px 0px rgba(0, 0, 0, 0.75);
+    .card-list-right{
+        height: 90%;
+        display: flex;
+        flex-direction: column;
+        justify-content: space-between;
+        margin-left: 10px;
+        flex: 1;
+        color: #00000060;
+    }
+}
+</style>

+ 113 - 0
components/sidebar.vue

@@ -0,0 +1,113 @@
+<template>
+<div class="location-area">
+    <div class="location-sidebar">
+        <div @click="sidebarChange(item, index)" class="location-sidebar-list" :class="{'sidebar-active':index==current}" v-for="(item, index) in dataList" :key="index">
+            {{item.name}}
+        </div>
+    </div>
+    <div class="location-content">
+        <div class="location-content-list" :class="{'location-content-active':index==lineCurrent}" v-for="(item, index) in dataList[current].children" :key="index" @click="checkSidebar(item, index)">
+            {{item.name}}
+        </div>
+
+    </div>
+    <div class="location-content-child" v-if="checkList.length>0">
+        <div class="location-content-list-child" v-for="(item, index) in checkList" :key="index">
+            {{item.name}}
+        </div>
+    </div>
+</div>
+</template>
+
+<script>
+export default {
+    props: {
+        dataList: {
+            type: Array
+        }
+    },
+    data() {
+        return {
+            checkList: [],
+            current: 0,
+            lineCurrent: 0
+        }
+    },
+    methods: {
+        sidebarChange(item, index) {
+            console.log(item);
+            this.current = index
+            if ( !item.children || item.children.length === 0) {
+                this.checkList = [];
+            } else {
+                try {
+                    this.lineCurrent = 0
+                    this.checkList = JSON.parse(JSON.stringify(item.children[0].children));
+                } catch (e) {
+                    this.checkList = [];
+                }
+            }
+            console.log(this.checkList);
+        },
+        checkSidebar(item, index) {
+            this.lineCurrent = index
+            console.log(item);
+            if (item.children) {
+                this.checkList = item.children
+            }
+        }
+    }
+}
+</script>
+
+<style lang="scss" scoped>
+.sidebar-active {
+    color: #2979ff;
+    // color: #fff;
+    border-right: #2979ff 1px solid;
+}
+
+.location-content-active {
+    color: #2979ff;
+    border-right: #2979ff 1px solid;
+}
+
+.location-area {
+    height: 40vh;
+    overflow: hidden;
+    display: flex;
+    padding: 10px 0;
+
+    .location-sidebar {
+        width: 30%;
+        height: 100%;
+        overflow: auto;
+        border-right: 1px solid #f3f3f3;
+
+        // background: #f3f3f3;
+        .location-sidebar-list {
+            line-height: 50px;
+        }
+    }
+
+    .location-content-list {
+        line-height: 50px;
+        padding: 0 10px;
+        display: flex;
+        text-align: left;
+    }
+
+    .location-content {
+        flex: 1;
+        background: #fff;
+        height: 100%;
+        overflow: auto;
+    }
+
+    .location-content-child {
+        width: 50%;
+        line-height: 50px;
+        border-left: 1px solid #000;
+    }
+}
+</style>

+ 44 - 0
components/tabCoupon/tabCoupon.vue

@@ -0,0 +1,44 @@
+<template>
+<view>
+    <u-subsection :list="list" mode="subsection" :current="current" @change="sectionChange"></u-subsection>
+    <u-empty mode="coupon" text=" ">
+    </u-empty>
+	<div class="history" @click="handleToHistoryCoupon">
+		查看历史券
+	</div>
+</view>
+</template>
+
+<script>
+export default {
+    data() {
+        return {
+            list: ['优惠券', '免房券'],
+            current: 0,
+        }
+    },
+	onLoad(options){
+		console.log(options);
+		if (options.cur) {
+			this.current = options.cur
+		}
+	},
+    methods: {
+        sectionChange(e) {
+            this.current = e
+        },
+		handleToHistoryCoupon(){
+			uni.navigateTo({
+				url: '/components/historyCoupon/historyCoupon'
+			})
+		}
+    }
+}
+</script>
+
+<style lang="scss" scoped>
+.history{
+	color: #00AAFF;
+	text-align: center;
+}
+</style>

+ 20 - 0
index.html

@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="UTF-8" />
+    <script>
+      var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') ||
+        CSS.supports('top: constant(a)'))
+      document.write(
+        '<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' +
+        (coverSupport ? ', viewport-fit=cover' : '') + '" />')
+    </script>
+    <title></title>
+    <!--preload-links-->
+    <!--app-context-->
+  </head>
+  <body>
+    <div id="app"><!--app-html--></div>
+    <script type="module" src="/main.js"></script>
+  </body>
+</html>

+ 25 - 0
main.js

@@ -0,0 +1,25 @@
+import App from './App'
+
+// #ifndef VUE3
+import Vue from 'vue'
+import uView from '@/uni_modules/uview-ui'
+import store from './store/index'
+Vue.config.productionTip = false
+App.mpType = 'app'
+const app = new Vue({
+    store,
+    ...App
+})
+app.$mount()
+Vue.use(uView);
+// #endif
+
+// #ifdef VUE3
+import { createSSRApp } from 'vue'
+export function createApp() {
+  const app = createSSRApp(App)
+  return {
+    app
+  }
+}
+// #endif

+ 77 - 0
manifest.json

@@ -0,0 +1,77 @@
+{
+    "name" : "酒店小程序",
+    "appid" : "__UNI__2CD8353",
+    "description" : "",
+    "versionName" : "1.0.0",
+    "versionCode" : "100",
+    "transformPx" : false,
+    /* 5+App特有相关 */
+    "app-plus" : {
+        "usingComponents" : true,
+        "nvueStyleCompiler" : "uni-app",
+        "compilerVersion" : 3,
+        "splashscreen" : {
+            "alwaysShowBeforeRender" : true,
+            "waiting" : true,
+            "autoclose" : true,
+            "delay" : 0
+        },
+        /* 模块配置 */
+        "modules" : {},
+        /* 应用发布信息 */
+        "distribute" : {
+            /* android打包配置 */
+            "android" : {
+                "permissions" : [
+                    "<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
+                    "<uses-permission android:name=\"android.permission.VIBRATE\"/>",
+                    "<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
+                    "<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.CAMERA\"/>",
+                    "<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
+                    "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
+                    "<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
+                    "<uses-feature android:name=\"android.hardware.camera\"/>",
+                    "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
+                ]
+            },
+            /* ios打包配置 */
+            "ios" : {},
+            /* SDK配置 */
+            "sdkConfigs" : {}
+        }
+    },
+    /* 快应用特有相关 */
+    "quickapp" : {},
+    /* 小程序特有相关 */
+    "mp-weixin" : {
+        "appid" : "wxac68ce7ce83813e9",
+        "setting" : {
+            "urlCheck" : false
+        },
+        "usingComponents" : true,
+        "permission" : {
+            "scope.userLocation" : {
+                "desc" : "你的位置信息将用于小程序位置接口的效果展示"
+            }
+        }
+    },
+    "mp-alipay" : {
+        "usingComponents" : true
+    },
+    "mp-baidu" : {
+        "usingComponents" : true
+    },
+    "mp-toutiao" : {
+        "usingComponents" : true
+    },
+    "uniStatistics" : {
+        "enable" : false
+    },
+    "vueVersion" : "2"
+}

+ 346 - 0
pages.json

@@ -0,0 +1,346 @@
+{
+	"pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
+		{
+			"path": "pages/index/index",
+			"style": {
+				"navigationBarTitleText": "预定"
+			}
+		}
+	    ,{
+            "path" : "pages/wallet/wallet",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "钱包",
+                "enablePullDownRefresh": false,
+				"navigationStyle": "custom"
+            }
+            
+        }
+        ,{
+            "path" : "pages/mine/mine",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "",
+                "enablePullDownRefresh": false,
+                "navigationStyle":"custom"
+            }
+            
+        }
+        ,{
+            "path" : "pages/roomService/roomService",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "客房服务",
+                "enablePullDownRefresh": false,
+                "navigationStyle": "custom"
+            }
+            
+        },
+		{
+			"path": "components/city/linzq-citySelect/linzq-citySelect",
+			"style": {
+				"navigationBarTitleText": "选择城市"
+			}
+		},
+		{
+			"path": "components/calendar/Calendar",
+			"style": {
+				"navigationBarTitleText": "选择日期"
+			}
+		}
+        ,{
+            "path" : "components/searchPage/searchPage",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "",
+                "enablePullDownRefresh": false
+            }
+            
+        }
+        ,{
+            "path" : "components/hotelDetail/hotelDetail",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "酒店详情",
+                "enablePullDownRefresh": false
+            }
+            
+        }
+        ,{
+            "path" : "components/hotelBooking/hotelBooking",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "酒店预定",
+                "enablePullDownRefresh": false
+            }
+            
+        }
+        ,{
+            "path" : "components/contacts/contacts",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "联系人",
+                "enablePullDownRefresh": false
+            }
+            
+        }
+        ,{
+            "path" : "components/addContacts/addContacts",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "添加联系人",
+                "enablePullDownRefresh": false,
+				"backgroundColor": "#846FFE"
+            }
+            
+        }
+        ,{
+            "path" : "components/coupon/coupon",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "可用优惠券",
+                "enablePullDownRefresh": false
+            }
+            
+        }
+        ,{
+            "path" : "components/bill/bill",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "我的发票",
+                "enablePullDownRefresh": false
+            }
+            
+        }
+        ,{
+            "path" : "components/bill/addBill",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "添加发票",
+                "enablePullDownRefresh": false
+            }
+            
+        }
+        ,{
+            "path" : "components/hotelAppraise/hotelAppraise",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "酒店评价",
+                "enablePullDownRefresh": false
+            }
+            
+        }
+        ,{
+            "path" : "components/hotelImage/hotelImage",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "酒店照片",
+                "enablePullDownRefresh": false
+            }
+            
+        }
+        ,{
+            "path" : "components/tabCoupon/tabCoupon",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "券包",
+                "enablePullDownRefresh": false
+            }
+            
+        }
+        ,{
+            "path" : "components/historyCoupon/historyCoupon",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "历史券包",
+                "enablePullDownRefresh": false
+            }
+            
+        }
+        ,{
+            "path" : "components/searchHotel/searchHotel",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "搜索选择酒店",
+                "enablePullDownRefresh": false
+            }
+            
+        }
+        ,{
+            "path" : "components/hotelCard/hotelCard",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "办卡",
+                "enablePullDownRefresh": false
+            }
+            
+        }
+        ,{
+            "path" : "components/memberCard/memberCard",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "会员卡",
+                "enablePullDownRefresh": false
+            }
+            
+        }
+        ,{
+            "path" : "components/order/BookingOrder/BookingOrder",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "我的订单",
+                "enablePullDownRefresh": false
+            }
+            
+        }
+        ,{
+            "path" : "components/order/inOrder/inOrder",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "",
+                "enablePullDownRefresh": false
+            }
+            
+        }
+        ,{
+            "path" : "components/order/posOrder/posOrder",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "",
+                "enablePullDownRefresh": false
+            }
+            
+        }
+        ,{
+            "path" : "components/order/foodOrder/foodOrder",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "",
+                "enablePullDownRefresh": false
+            }
+            
+        }
+        ,{
+            "path" : "components/order/serviceOrder/serviceOrder",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "",
+                "enablePullDownRefresh": false
+            }
+            
+        }
+        ,{
+            "path" : "components/order/settingsOrder/settingsOrder",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "",
+                "enablePullDownRefresh": false
+            }
+            
+        }
+        ,{
+            "path" : "components/collectHotel/collectHotel",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "我的收藏",
+                "enablePullDownRefresh": false
+            }
+            
+        }
+        ,{
+            "path" : "components/aboutUs/aboutUs",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "关于我们",
+                "enablePullDownRefresh": false
+            }
+            
+        }
+        ,{
+            "path" : "components/editUserInfo/editUserInfo",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "编辑",
+                "enablePullDownRefresh": false
+            }
+            
+        }
+        ,{
+            "path" : "components/editUserInfo/editUserName/editUserName",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "编辑",
+                "enablePullDownRefresh": false
+            }
+            
+        }
+        ,{
+            "path" : "components/editUserInfo/editUserPhone/editUserPhone",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "绑定手机号",
+                "enablePullDownRefresh": false
+            }
+            
+        }
+        ,{
+            "path" : "components/editUserInfo/nameAuthentication/nameAuthentication",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "编辑",
+                "enablePullDownRefresh": false
+            }
+            
+        }
+        ,{
+            "path" : "components/editUserInfo/editPayPassWord/editPayPassWord",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "设置支付密码",
+                "enablePullDownRefresh": false
+            }
+            
+        }
+    ],
+	"globalStyle": {
+		"navigationBarTextStyle": "black",
+		"navigationBarTitleText": "uni-app",
+		"navigationBarBackgroundColor": "#F8F8F8",
+		"backgroundColor": "#F8F8F8"
+	},
+	"uniIdRouter": {},
+	"easycom": {
+		"^u-(.*)": "@/uni_modules/uview-ui/components/u-$1/u-$1.vue"
+	},
+	"tabBar": {
+		"backgroundColor": "#fff",
+		"borderStyle": "white",
+		"selectedColor": "#846FFE",
+		"fontSize": "12px",
+		"list": [{
+				"iconPath": "static/tabbarIcon/yuding.png",
+				"selectedIconPath": "static/tabbarIcon/yuding.png",
+				"pagePath": "pages/index/index",
+				"text": "预定"
+			},
+			{
+				"iconPath": "static/tabbarIcon/shouyeweixuanzhong.png",
+				"selectedIconPath": "static/tabbarIcon/shouyeweixuanzhong.png",
+				"pagePath": "pages/wallet/wallet",
+				"text": "钱包"
+			},
+			{
+				"iconPath": "static/tabbarIcon/shoucang.png",
+				"selectedIconPath": "static/tabbarIcon/shoucang.png",
+				"pagePath": "pages/roomService/roomService",
+				"text": "客房服务"
+			},
+			{
+				"iconPath": "static/tabbarIcon/wode.png",
+				"selectedIconPath": "static/tabbarIcon/wode.png",
+				"pagePath": "pages/mine/mine",
+				"text": "我的"
+			}
+		]
+	}
+}

+ 161 - 0
pages/index/index.vue

@@ -0,0 +1,161 @@
+<template>
+<view class="pages">
+    <u-swiper height="200" radius="8" :list="list1" @change="change" @click="click"></u-swiper>
+    <div class="content-card">
+        <u-subsection mode="subsection" :list="list" :current="current" @change="sectionChange"></u-subsection>
+        <u-cell>
+			<div slot="title" @click="handleToCity">
+				长沙市
+			</div>
+            <template slot="right-icon">
+                搜附近
+            </template>
+        </u-cell>
+        <div class="content-occupation" v-if="current==1">
+            <div @click="handleCalendar('single')">
+                <div>入住</div>
+                <div>{{timeList[0]}}</div>
+            </div>
+            <!-- <div>
+                {{`共${timeList.length-1}晚`}}
+            </div>
+            <div>
+                <div>离店</div>
+                <div>{{timeList[timeList.length-1]}}</div>
+            </div> -->
+        </div>
+        <div class="content-occupation" v-else>
+            <div @click="handleCalendar('range')">
+                <div>入住</div>
+                <div>{{timeList[0]}}</div>
+            </div>
+            <div>
+                {{`共${timeList.length-1}晚`}}
+            </div>
+            <div>
+                <div>离店</div>
+                <div>{{timeList[timeList.length-1]}}</div>
+            </div>
+        </div>
+        <u--input placeholder="位置/酒店/关键词" border="surround" shape="circle" clearable></u--input>
+		<div style="margin-top:20px;">
+			<u-button type="primary" @click="handleToSearch">搜索</u-button>
+		</div>
+		<u-calendar :show="calendarShow" :mode="mode" @confirm="confirm" @close="closeCalendar"></u-calendar>
+    </div>
+</view>
+</template>
+
+<script>
+import { mapState } from 'vuex'
+export default {
+    data() {
+        return {
+            list1: [
+                'https://cdn.uviewui.com/uview/swiper/swiper1.png',
+                'https://cdn.uviewui.com/uview/swiper/swiper2.png',
+                'https://cdn.uviewui.com/uview/swiper/swiper3.png',
+            ],
+            list: ['全日房', '钟点房'],
+            current: 0,
+			calendarShow:false,
+			mode: 'range',
+			// timeList:[],//选择的时间
+            timeCopy:[]
+        }
+    },
+    computed:{
+        ...mapState({
+            timeList:state=>state.timeList
+        })
+    },
+    onLoad() {
+
+    },
+	mounted(){
+		this.initDate()
+	},
+    methods: {
+        change(e) {
+            // console.log('change', e)
+        },
+        click(e) {
+            console.log('click', e)
+        },
+        sectionChange(e) {
+            console.log('sectionChange', e)
+            if (e == 1) {
+                // this.$state.commit('setTimeList', [this.timeList[0]])
+            }else{
+
+            }
+            this.current = e
+        },
+		handleToCity(){
+			uni.navigateTo({
+				url:'/components/city/linzq-citySelect/linzq-citySelect'
+			})
+		},
+		handleCalendar(mode){
+			// this.calendarShow = true
+            uni.navigateTo({
+                url:`/components/calendar/Calendar?mode=${mode}`
+            })
+		},
+		confirm(e){
+			console.log(e)
+			this.timeList = e
+			this.calendarShow = false
+		},
+		closeCalendar(){
+			this.calendarShow = false
+		},
+		//初始化时间
+		initDate(){
+			let date = new Date();
+			let year = date.getFullYear();
+			let month = date.getMonth() + 1;
+			let day = date.getDate();
+			let tomorrow = new Date(date.getTime() + 24 * 60 * 60 * 1000);
+			let tomorrowYear = tomorrow.getFullYear();
+			let tomorrowMonth = tomorrow.getMonth() + 1;
+			let tomorrowDay = tomorrow.getDate();
+			let today = year + '-' + month + '-' + day;
+			let tomorrowDate = tomorrowYear + '-' + tomorrowMonth + '-' + tomorrowDay;
+            if (this.timeList.length == 0) {
+                this.$store.commit('setTimeList', [today, tomorrowDate])
+            }
+			// this.timeList = [today, tomorrowDate]
+			return [today, tomorrowDate];
+		},
+		handleToSearch(){
+			uni.navigateTo({
+				url:'/components/searchPage/searchPage'
+			})
+		}
+    }
+}
+</script>
+
+<style lang="scss" scoped>
+.content-card {
+    background-color: #fff;
+    padding: 20px;
+    height: 300px;
+    width: 87vw;
+    margin: auto;
+    margin-top: 10px;
+}
+
+.pages {
+    background-color: rgb(243, 243, 243);
+    height: 100vh;
+}
+
+.content-occupation {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+	padding: 10px 15px;
+}
+</style>

+ 161 - 0
pages/mine/mine.vue

@@ -0,0 +1,161 @@
+<template>
+<view class="pages">
+    <u-navbar title="我的" :bgColor="'#00AAFF'" :titleStyle="{color:'#fff'}" placeholder>
+        <view class="u-nav-slot" slot="left">
+        </view>
+    </u-navbar>
+    <div class="avatar">
+        <u-avatar @click="handleToEditUserInfo" size="80" src="https://cdn.uviewui.com/uview/album/1.jpg"></u-avatar>
+        <div style="color:#fff;margin-left:10px;">
+            面包人
+        </div>
+    </div>
+    <div class="order">
+        <div style="display:flex;align-items:center;border-bottom:1px solid #00000011;height:40px">
+            <u-icon name="order" size="26"></u-icon><span>我的订单</span>
+        </div>
+        <div class="order-list">
+            <navigator url="/components/order/BookingOrder/BookingOrder" hover-class="navigator-hover">
+                <div class="order-list-content">
+                    <div>
+                        <u--image :showLoading="true" src="/static/mineIcon/weibiaoti-.svg" width="28px" height="28px"></u--image>
+                    </div>
+                    <div>
+                        预定订单
+                    </div>
+                </div>
+            </navigator>
+
+            <navigator url="/components/order/inOrder/inOrder" hover-class="navigator-hover">
+                <div class="order-list-content">
+                    <div>
+                        <u--image :showLoading="true" src="/static/mineIcon/u.svg" width="28px" height="28px"></u--image>
+                    </div>
+                    <div>
+                        入住订单
+                    </div>
+                </div>
+            </navigator>
+
+            <navigator url="/components/order/posOrder/posOrder" hover-class="navigator-hover">
+                <div class="order-list-content">
+                    <div>
+                        <u--image :showLoading="true" src="/static/mineIcon/POSdingdankaipiao.svg" width="28px" height="28px"></u--image>
+                    </div>
+                    <div>
+                        pos订单
+                    </div>
+                </div>
+            </navigator>
+
+            <navigator url="/components/order/foodOrder/foodOrder" hover-class="navigator-hover">
+                <div class="order-list-content">
+                    <div>
+                        <u--image :showLoading="true" src="/static/mineIcon/diancan.svg" width="28px" height="28px"></u--image>
+                    </div>
+                    <div>
+                        点餐订单
+                    </div>
+                </div>
+            </navigator>
+
+            <navigator url="/components/order/serviceOrder/serviceOrder" hover-class="navigator-hover">
+                <div class="order-list-content">
+                    <div>
+                        <u--image :showLoading="true" src="/static/mineIcon/fuwu_o.svg" width="28px" height="28px"></u--image>
+                    </div>
+                    <div>
+                        服务订单
+                    </div>
+                </div>
+            </navigator>
+
+            <navigator url="/components/order/settingsOrder/settingsOrder" hover-class="navigator-hover">
+                <div class="order-list-content">
+                    <div>
+                        <u--image :showLoading="true" src="/static/mineIcon/weixiu.svg" width="28px" height="28px"></u--image>
+                    </div>
+                    <div>
+                        维修订单
+                    </div>
+                </div>
+            </navigator>
+        </div>
+    </div>
+
+    <div style="background:#fff;margin-top:5px;margin-bottom:20px;">
+        <u-cell icon="/static/mineIcon/shoucang.svg" title="收藏酒店" url="/components/collectHotel/collectHotel" :isLink="true" arrow-direction="right"></u-cell>
+    </div>
+
+    <div style="background:#fff;">
+        <u-cell icon="/static/mineIcon/shoucang.svg" title="常住联系人" url="/components/contacts/contacts" :isLink="true" arrow-direction="right"></u-cell>
+        <u-cell icon="/static/mineIcon/wodefapiao.svg" title="我的发票" url="/components/bill/bill" :isLink="true" arrow-direction="right"></u-cell>
+        <u-cell icon="/static/mineIcon/dianhua.svg" title="客服电话" :value="'400-0000-0000'" :isLink="true" arrow-direction="right"></u-cell>
+        <u-cell icon="/static/mineIcon/guanyu.svg" title="关于我们" url="/components/aboutUs/aboutUs" :isLink="true" arrow-direction="right"></u-cell>
+    </div>
+</view>
+</template>
+
+<script>
+export default {
+    data() {
+        return {
+
+        }
+    },
+    methods: {
+		handleToEditUserInfo(){
+			uni.navigateTo({
+				url:'/components/editUserInfo/editUserInfo'
+			})
+		}
+    }
+}
+</script>
+
+<style lang="scss" scoped>
+.pages {
+    background: #f5f5f5;
+    width: 100vw;
+    height: 100vh;
+}
+
+.avatar {
+    width: 100vw;
+    height: 60px;
+    display: flex;
+    align-items: center;
+    background: #00aaff;
+    padding: 20px;
+}
+
+.order {
+    width: 98vw;
+    margin: auto;
+    // height: 100px;
+    background: #fff;
+    border-radius: 5px;
+    box-shadow: 0 0 5px #00000020;
+    margin-top: 3px;
+    padding:0 10px 20px 10px;
+    box-sizing: border-box;
+}
+
+.order-list {
+    // display: flex;
+    overflow-x: auto;
+    // flex-wrap: nowrap;
+    margin-top: 20px;
+    display: grid;
+    grid-template-columns: repeat(6, 20vw);
+
+    .order-list-content {
+        display: flex;
+        flex-direction: column;
+        justify-content: center;
+        align-items: center;
+        // width: 25vw;
+        // margin-right: 20px;
+    }
+}
+</style>

+ 149 - 0
pages/roomService/roomService.vue

@@ -0,0 +1,149 @@
+<template>
+	<view>
+		<u-navbar title="客房服务" :bgColor="'#00AAFF'" :titleStyle="{color:'#fff'}" placeholder>
+			<view class="u-nav-slot" slot="left">
+			</view>
+		</u-navbar>
+		<div class="avatar">
+			<u-avatar size="80" src="https://cdn.uviewui.com/uview/album/1.jpg"></u-avatar>
+			<div style="color:#fff;margin-left:10px;">
+				暂未入住
+			</div>
+		</div>
+		<div class="ability-top">
+			<div>
+				<div style="font-size:18px;font-weight: bold;">
+					房务功能
+				</div>
+				<div class="ability-top-grid">
+					<div class="ability-top-grid-box">
+						<div style="display:flex;align-items:center;">
+							<u--image :showLoading="true" src="/static/roomService/xuzhu.svg" width="38px" height="38px" @click="click"></u--image>
+							<span style="margin-left:5px;">续住</span>
+						</div>
+						<div style="color:#00000040;margin-top:5px;">
+							续住功能
+						</div>
+					</div>
+					<div class="ability-top-grid-box">
+						<div style="display:flex;align-items:center;">
+							<u--image :showLoading="true" src="/static/roomService/liuyan.svg" width="38px" height="38px" @click="click"></u--image>
+							<span style="margin-left:5px;">留言</span>
+						</div>
+						<div style="color:#00000040;margin-top:5px;">
+							对酒店进行留言
+						</div>
+					</div>
+					<div class="ability-top-grid-box">
+						<div style="display:flex;align-items:center;">
+							<u--image :showLoading="true" src="/static/roomService/wifi.svg" width="38px" height="38px" @click="click"></u--image>
+							<span style="margin-left:5px;">WIFI</span>
+						</div>
+						<div style="color:#00000040;margin-top:5px;">
+							一键连接WIFI
+						</div>
+					</div>
+					<div class="ability-top-grid-box">
+						<div style="display:flex;align-items:center;">
+							<u--image :showLoading="true" src="/static/roomService/hujiaofuwuyuan.svg" width="38px" height="38px" @click="click"></u--image>
+							<span style="margin-left:5px;">呼叫服务</span>
+						</div>
+						<div style="color:#00000040;margin-top:5px;">
+							呼叫酒店提供服务
+						</div>
+					</div>
+					<div class="ability-top-grid-box">
+						<div style="display:flex;align-items:center;">
+							<u--image :showLoading="true" src="/static/roomService/weixiu.svg" width="38px" height="38px" @click="click"></u--image>
+							<span style="margin-left:5px;">维修</span>
+						</div>
+						<div style="color:#00000040;margin-top:5px;font-size:15px;">
+							房间物品损坏进行维修
+						</div>
+					</div>
+					<div class="ability-top-grid-box">
+						<div style="display:flex;align-items:center;">
+							<u--image :showLoading="true" src="/static/roomService/kaipiaowancheng.svg" width="38px" height="38px" @click="click"></u--image>
+							<span style="margin-left:5px;">预约开票</span>
+						</div>
+						<div style="color:#00000040;margin-top:5px;font-size:15px;">
+							一键预约开取发票功能
+						</div>
+					</div>
+					<div class="ability-top-grid-box">
+						<div style="display:flex;align-items:center;">
+							<u--image :showLoading="true" src="/static/roomService/lianxiqiantai.svg" width="38px" height="38px" @click="click"></u--image>
+							<span style="margin-left:5px;">联系前台</span>
+						</div>
+						<div style="color:#00000040;margin-top:5px;">
+							联系酒店前台
+						</div>
+					</div>
+					<div class="ability-top-grid-box">
+						<div style="display:flex;align-items:center;">
+							<u--image :showLoading="true" src="/static/roomService/tuifang.svg" width="38px" height="38px" @click="click"></u--image>
+							<span style="margin-left:5px;">一键退房</span>
+						</div>
+						<div style="color:#00000040;margin-top:5px;">
+							点击进行退房
+						</div>
+					</div>
+				</div>
+			</div>
+			<div style="margin-top:20px;">
+				<div style="font-size:18px;font-weight: bold;">
+					点单服务
+				</div>
+				<div class="ability-top-grid">
+					<div class="ability-top-grid-box">
+						<div style="display:flex;align-items:center;">
+							<u--image :showLoading="true" src="/static/roomService/diancan.svg" width="38px" height="38px" @click="click"></u--image>
+							<span style="margin-left:5px;">点餐</span>
+						</div>
+						<div style="color:#00000040;margin-top:5px;">
+							点餐,购买商品
+						</div>
+					</div>
+				</div>
+			</div>
+		</div>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				
+			}
+		},
+		methods: {
+			
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+.avatar{
+	width: 100vw;
+	height: 60px;
+	display: flex;
+	align-items: center;
+	background: #00aaff;
+	padding: 20px;
+}
+.ability-top{
+	padding: 20px;
+}
+.ability-top-grid{
+	display:grid;
+	grid-template-columns: repeat(2, 1fr);
+	grid-gap: 10px 30px;
+	margin-top: 10px;
+}
+.ability-top-grid-box{
+	padding: 10px;
+	background: #f9f9f9;
+	border-radius: 8px;
+}
+</style>

+ 39 - 0
pages/wallet/wallet.vue

@@ -0,0 +1,39 @@
+<template>
+<view>
+    <u-navbar title="钱包" :bgColor="'#00AAFF'" :titleStyle="{color:'#fff'}" placeholder>
+        <view class="u-nav-slot" slot="left">
+        </view>
+    </u-navbar>
+    <div class="list">
+        <u-cell title="优惠券" arrow-direction="right" :isLink="true" url="/components/tabCoupon/tabCoupon?cur=0">
+            <u-icon slot="icon" size="32" name="coupon"></u-icon>
+        </u-cell>
+		<u-cell title="免房券" arrow-direction="right" :isLink="true" url="/components/tabCoupon/tabCoupon?cur=1">
+            <u-icon slot="icon" size="32" name="rmb-circle"></u-icon>
+        </u-cell>
+		<u-cell title="会员中心" arrow-direction="right" :isLink="true" url="/components/memberCard/memberCard">
+            <u-icon slot="icon" size="32" name="level"></u-icon>
+        </u-cell>
+		<u-cell title="我要办卡" arrow-direction="right" :isLink="true" url="/components/searchHotel/searchHotel">
+            <u-icon slot="icon" size="32" name="integral"></u-icon>
+        </u-cell>
+    </div>
+</view>
+</template>
+
+<script>
+export default {
+    data() {
+        return {
+
+        }
+    },
+    methods: {
+
+    }
+}
+</script>
+
+<style lang="scss" scoped>
+.list {}
+</style>

二进制
static/logo.png


文件差异内容过多而无法显示
+ 1 - 0
static/mineIcon/POSdingdankaipiao.svg


文件差异内容过多而无法显示
+ 1 - 0
static/mineIcon/biaodankongjianlianxiren.svg


文件差异内容过多而无法显示
+ 1 - 0
static/mineIcon/diancan.svg


文件差异内容过多而无法显示
+ 1 - 0
static/mineIcon/dianhua.svg


文件差异内容过多而无法显示
+ 1 - 0
static/mineIcon/fuwu_o.svg


文件差异内容过多而无法显示
+ 1 - 0
static/mineIcon/guanyu.svg


文件差异内容过多而无法显示
+ 1 - 0
static/mineIcon/shoucang.svg


文件差异内容过多而无法显示
+ 1 - 0
static/mineIcon/u.svg


文件差异内容过多而无法显示
+ 1 - 0
static/mineIcon/weibiaoti-.svg


文件差异内容过多而无法显示
+ 1 - 0
static/mineIcon/weixiu.svg


文件差异内容过多而无法显示
+ 1 - 0
static/mineIcon/wodefapiao.svg


二进制
static/niu.jpg


文件差异内容过多而无法显示
+ 1 - 0
static/roomService/diancan.svg


文件差异内容过多而无法显示
+ 1 - 0
static/roomService/hujiaofuwuyuan.svg


文件差异内容过多而无法显示
+ 1 - 0
static/roomService/kaipiaowancheng.svg


文件差异内容过多而无法显示
+ 1 - 0
static/roomService/lianxiqiantai.svg


文件差异内容过多而无法显示
+ 1 - 0
static/roomService/liuyan.svg


文件差异内容过多而无法显示
+ 1 - 0
static/roomService/tuifang.svg


文件差异内容过多而无法显示
+ 1 - 0
static/roomService/weixiu.svg


文件差异内容过多而无法显示
+ 1 - 0
static/roomService/wifi.svg


文件差异内容过多而无法显示
+ 1 - 0
static/roomService/xuzhu.svg


二进制
static/tabbarIcon/shoucang.png


文件差异内容过多而无法显示
+ 1 - 0
static/tabbarIcon/shoucang.svg


二进制
static/tabbarIcon/shouye_xuanzhong.png


文件差异内容过多而无法显示
+ 1 - 0
static/tabbarIcon/shouye_xuanzhong.svg


二进制
static/tabbarIcon/shouyeweixuanzhong.png


文件差异内容过多而无法显示
+ 1 - 0
static/tabbarIcon/shouyeweixuanzhong.svg


二进制
static/tabbarIcon/wode.png


文件差异内容过多而无法显示
+ 1 - 0
static/tabbarIcon/wode.svg


二进制
static/tabbarIcon/yuding.png


文件差异内容过多而无法显示
+ 1 - 0
static/tabbarIcon/yuding.svg


+ 29 - 0
store/index.js

@@ -0,0 +1,29 @@
+import Vue from 'vue'
+
+import Vuex from 'vuex'
+
+Vue.use(Vuex)
+
+const store = new Vuex.Store({
+    state: {
+        count: 0,
+        // 保存时间列表
+        timeList:[]
+    },
+    mutations: {
+        increment(state) {
+            state.count++
+        },
+        // 设置时间列表
+        setTimeList(state, timeList) {
+            state.timeList = timeList
+        }
+    },
+    actions: {
+        increment: ({ commit }) => commit('increment')
+    },
+    getters: {
+        count: state => state.count
+    }
+})
+export default store

+ 76 - 0
uni.scss

@@ -0,0 +1,76 @@
+/**
+ * 这里是uni-app内置的常用样式变量
+ *
+ * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量
+ * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App
+ *
+ */
+
+/**
+ * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能
+ *
+ * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件
+ */
+
+/* 颜色变量 */
+@import "@/uni_modules/uview-ui/theme.scss";
+/* 行为相关颜色 */
+$uni-color-primary: #007aff;
+$uni-color-success: #4cd964;
+$uni-color-warning: #f0ad4e;
+$uni-color-error: #dd524d;
+
+/* 文字基本颜色 */
+$uni-text-color:#333;//基本色
+$uni-text-color-inverse:#fff;//反色
+$uni-text-color-grey:#999;//辅助灰色,如加载更多的提示信息
+$uni-text-color-placeholder: #808080;
+$uni-text-color-disable:#c0c0c0;
+
+/* 背景颜色 */
+$uni-bg-color:#ffffff;
+$uni-bg-color-grey:#f8f8f8;
+$uni-bg-color-hover:#f1f1f1;//点击状态颜色
+$uni-bg-color-mask:rgba(0, 0, 0, 0.4);//遮罩颜色
+
+/* 边框颜色 */
+$uni-border-color:#c8c7cc;
+
+/* 尺寸变量 */
+
+/* 文字尺寸 */
+$uni-font-size-sm:12px;
+$uni-font-size-base:14px;
+$uni-font-size-lg:16;
+
+/* 图片尺寸 */
+$uni-img-size-sm:20px;
+$uni-img-size-base:26px;
+$uni-img-size-lg:40px;
+
+/* Border Radius */
+$uni-border-radius-sm: 2px;
+$uni-border-radius-base: 3px;
+$uni-border-radius-lg: 6px;
+$uni-border-radius-circle: 50%;
+
+/* 水平间距 */
+$uni-spacing-row-sm: 5px;
+$uni-spacing-row-base: 10px;
+$uni-spacing-row-lg: 15px;
+
+/* 垂直间距 */
+$uni-spacing-col-sm: 4px;
+$uni-spacing-col-base: 8px;
+$uni-spacing-col-lg: 12px;
+
+/* 透明度 */
+$uni-opacity-disabled: 0.3; // 组件禁用态的透明度
+
+/* 文章场景相关 */
+$uni-color-title: #2C405A; // 文章标题颜色
+$uni-font-size-title:20px;
+$uni-color-subtitle: #555555; // 二级标题颜色
+$uni-font-size-subtitle:26px;
+$uni-color-paragraph: #3F536E; // 文章段落颜色
+$uni-font-size-paragraph:15px;

+ 21 - 0
uni_modules/uview-ui/LICENSE

@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2023 www.uviewui.com
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.

+ 66 - 0
uni_modules/uview-ui/README.md

@@ -0,0 +1,66 @@
+<p align="center">
+    <img alt="logo" src="https://uviewui.com/common/logo.png" width="120" height="120" style="margin-bottom: 10px;">
+</p>
+<h3 align="center" style="margin: 30px 0 30px;font-weight: bold;font-size:40px;">uView 2.0</h3>
+<h3 align="center">多平台快速开发的UI框架</h3>
+
+[![stars](https://img.shields.io/github/stars/umicro/uView2.0?style=flat-square&logo=GitHub)](https://github.com/umicro/uView2.0)
+[![forks](https://img.shields.io/github/forks/umicro/uView2.0?style=flat-square&logo=GitHub)](https://github.com/umicro/uView2.0)
+[![issues](https://img.shields.io/github/issues/umicro/uView2.0?style=flat-square&logo=GitHub)](https://github.com/umicro/uView2.0/issues)
+[![Website](https://img.shields.io/badge/uView-up-blue?style=flat-square)](https://uviewui.com)
+[![release](https://img.shields.io/github/v/release/umicro/uView2.0?style=flat-square)](https://gitee.com/umicro/uView2.0/releases)
+[![license](https://img.shields.io/github/license/umicro/uView2.0?style=flat-square)](https://en.wikipedia.org/wiki/MIT_License)
+
+## 说明
+
+uView UI,是[uni-app](https://uniapp.dcloud.io/)全面兼容nvue的uni-app生态框架,全面的组件和便捷的工具会让您信手拈来,如鱼得水
+
+## [官方文档:https://uviewui.com](https://uviewui.com)
+
+
+## 预览
+
+您可以通过**微信**扫码,查看最佳的演示效果。
+<br>
+<br>
+<img src="https://uviewui.com/common/weixin_mini_qrcode.png" width="220" height="220" >
+
+
+## 链接
+
+- [官方文档](https://www.uviewui.com/)
+- [更新日志](https://www.uviewui.com/components/changelog.html)
+- [升级指南](https://www.uviewui.com/components/changeGuide.html)
+- [关于我们](https://www.uviewui.com/cooperation/about.html)
+
+## 交流反馈
+
+欢迎加入我们的QQ群交流反馈:[点此跳转](https://www.uviewui.com/components/addQQGroup.html)
+
+## 关于PR
+
+> 我们非常乐意接受各位的优质PR,但在此之前我希望您了解uView2.0是一个需要兼容多个平台的(小程序、h5、ios app、android app)包括nvue页面、vue页面。
+> 所以希望在您修复bug并提交之前尽可能的去这些平台测试一下兼容性。最好能携带测试截图以方便审核。非常感谢!
+
+## 安装
+
+#### **uni-app插件市场链接** —— [https://ext.dcloud.net.cn/plugin?id=1593](https://ext.dcloud.net.cn/plugin?id=1593)
+
+请通过[官网安装文档](https://www.uviewui.com/components/install.html)了解更详细的内容
+
+## 快速上手
+
+请通过[快速上手](https://uviewui.com/components/quickstart.html)了解更详细的内容
+
+## 使用方法
+配置easycom规则后,自动按需引入,无需`import`组件,直接引用即可。
+
+```html
+<template>
+	<u-button text="按钮"></u-button>
+</template>
+```
+
+## 版权信息
+uView遵循[MIT](https://en.wikipedia.org/wiki/MIT_License)开源协议,意味着您无需支付任何费用,也无需授权,即可将uView应用到您的产品中。
+

+ 362 - 0
uni_modules/uview-ui/changelog.md

@@ -0,0 +1,362 @@
+## 2.0.36(2023-03-27)
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. 重构`deepClone` & `deepMerge`方法
+2. 其他优化
+## 2.0.34(2022-09-24)
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. `u-input`、`u-textarea`增加`ignoreCompositionEvent`属性
+2. 修复`route`方法调用可能报错的问题
+3. 修复`u-no-network`组件`z-index`无效的问题
+4. 修复`textarea`组件在h5上confirmType=""报错的问题
+5. `u-rate`适配`nvue`
+6. 优化验证手机号码的正则表达式(根据工信部发布的《电信网编号计划(2017年版)》进行修改。)
+7. `form-item`添加`labelPosition`属性
+8. `u-calendar`修复`maxDate`设置为当前日期,并且当前时间大于08:00时无法显示日期列表的问题 (#724)
+9. `u-radio`增加一个默认插槽用于自定义修改label内容 (#680)
+10. 修复`timeFormat`函数在safari重的兼容性问题 (#664)
+## 2.0.33(2022-06-17)
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. 修复`loadmore`组件`lineColor`类型错误问题
+2. 修复`u-parse`组件`imgtap`、`linktap`不生效问题
+## 2.0.32(2022-06-16)
+# uView2.0重磅发布,利剑出鞘,一统江湖
+1. `u-loadmore`新增自定义颜色、虚/实线
+2. 修复`u-swiper-action`组件部分平台不能上下滑动的问题
+3. 修复`u-list`回弹问题
+4. 修复`notice-bar`组件动画在低端安卓机可能会抖动的问题
+5. `u-loading-page`添加控制图标大小的属性`iconSize`
+6. 修复`u-tooltip`组件`color`参数不生效的问题
+7. 修复`u--input`组件使用`blur`事件输出为`undefined`的bug
+8. `u-code-input`组件新增键盘弹起时,是否自动上推页面参数`adjustPosition`
+9. 修复`image`组件`load`事件无回调对象问题
+10. 修复`button`组件`loadingSize`设置无效问题
+10. 其他修复
+## 2.0.31(2022-04-19)
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. 修复`upload`在`vue`页面上传成功后没有成功标志的问题
+2. 解决演示项目中微信小程序模拟上传图片一直出于上传中问题
+3. 修复`u-code-input`组件在`nvue`页面编译到`app`平台上光标异常问题(`app`去除此功能)
+4. 修复`actionSheet`组件标题关闭按钮点击事件名称错误的问题
+5. 其他修复
+## 2.0.30(2022-04-04)
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. `u-rate`增加`readonly`属性
+2. `tabs`滑块支持设置背景图片
+3. 修复`u-subsection` `mode`为`subsection`时,滑块样式不正确的问题
+4. `u-code-input`添加光标效果动画
+5. 修复`popup`的`open`事件不触发
+6. 修复`u-flex-column`无效的问题
+7. 修复`u-datetime-picker`索引在特定场合异常问题
+8. 修复`u-datetime-picker`最小时间字符串模板错误问题
+9. `u-swiper`添加`m3u8`验证
+10. `u-swiper`修改判断image和video逻辑
+11. 修复`swiper`无法使用本地图片问题,增加`type`参数
+12. 修复`u-row-notice`格式错误问题
+13. 修复`u-switch`组件当`unit`为`rpx`时,`nodeStyle`消失的问题
+14. 修复`datetime-picker`组件`showToolbar`与`visibleItemCount`属性无效的问题
+15. 修复`upload`组件条件编译位置判断错误,导致`previewImage`属性设置为`false`时,整个组件都会被隐藏的问题
+16. 修复`u-checkbox-group`设置`shape`属性无效的问题
+17. 修复`u-upload`的`capture`传入字符串的时候不生效的问题
+18. 修复`u-action-sheet`组件,关闭事件逻辑错误的问题
+19. 修复`u-list`触顶事件的触发错误的问题
+20. 修复`u-text`只有手机号可拨打的问题
+21. 修复`u-textarea`不能换行的问题
+22. 其他修复
+## 2.0.29(2022-03-13)
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. 修复`u--text`组件设置`decoration`属性未生效的问题
+2. 修复`u-datetime-picker`使用`formatter`后返回值不正确
+3. 修复`u-datetime-picker` `intercept` 可能为undefined
+4. 修复已设置单位 uni..config.unit = 'rpx'时,线型指示器 `transform` 的位置翻倍,导致指示器超出宽度
+5. 修复mixin中bem方法生成的类名在支付宝和字节小程序中失效
+6. 修复默认值传值为空的时候,打开`u-datetime-picker`报错,不能选中第一列时间的bug
+7. 修复`u-datetime-picker`使用`formatter`后返回值不正确
+8. 修复`u-image`组件`loading`无效果的问题
+9. 修复`config.unit`属性设为`rpx`时,导航栏占用高度不足导致塌陷的问题
+10. 修复`u-datetime-picker`组件`itemHeight`无效问题
+11. 其他修复
+## 2.0.28(2022-02-22)
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. search组件新增searchIconSize属性
+2. 兼容Safari/Webkit中传入时间格式如2022-02-17 12:00:56
+3. 修复text value.js 判断日期出format错误问题
+4. priceFormat格式化金额出现精度错误
+5. priceFormat在部分情况下出现精度损失问题
+6. 优化表单rules提示
+7. 修复avatar组件src为空时,展示状态不对
+8. 其他修复
+## 2.0.27(2022-01-28)
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1.样式修复
+## 2.0.26(2022-01-28)
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1.样式修复
+## 2.0.25(2022-01-27)
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. 修复text组件mode=price时,可能会导致精度错误的问题
+2. 添加$u.setConfig()方法,可设置uView内置的config, props, zIndex, color属性,详见:[修改uView内置配置方案](https://uviewui.com/components/setting.html#%E9%BB%98%E8%AE%A4%E5%8D%95%E4%BD%8D%E9%85%8D%E7%BD%AE)
+3. 优化form组件在errorType=toast时,如果输入错误页面会有抖动的问题
+4. 修复$u.addUnit()对配置默认单位可能无效的问题
+## 2.0.24(2022-01-25)
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. 修复swiper在current指定非0时缩放有误
+2. 修复u-icon添加stop属性的时候报错
+3. 优化遗留的通过正则判断rpx单位的问题
+4. 优化Layout布局 vue使用gutter时,会超出固定区域
+5. 优化search组件高度单位问题(rpx -> px)
+6. 修复u-image slot 加载和错误的图片失去了高度
+7. 修复u-index-list中footer插槽与header插槽存在性判断错误
+8. 修复部分机型下u-popup关闭时会闪烁
+9. 修复u-image在nvue-app下失去宽高
+10. 修复u-popup运行报错
+11. 修复u-tooltip报错
+12. 修复box-sizing在app下的警告
+13. 修复u-navbar在小程序中报运行时错误
+14. 其他修复
+## 2.0.23(2022-01-24)
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. 修复image组件在hx3.3.9的nvue下可能会显示异常的问题
+2. 修复col组件gutter参数带rpx单位处理不正确的问题
+3. 修复text组件单行时无法显示省略号的问题
+4. navbar添加titleStyle参数
+5. 升级到hx3.3.9可消除nvue下控制台样式警告的问题
+## 2.0.22(2022-01-19)
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. $u.page()方法优化,避免在特殊场景可能报错的问题
+2. picker组件添加immediateChange参数
+3. 新增$u.pages()方法
+## 2.0.21(2022-01-19)
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. 优化:form组件在用户设置rules的时候提示用户model必传
+2. 优化遗留的通过正则判断rpx单位的问题
+3. 修复微信小程序环境中tabbar组件开启safeAreaInsetBottom属性后,placeholder高度填充不正确
+4. 修复swiper在current指定非0时缩放有误
+5. 修复u-icon添加stop属性的时候报错
+6. 修复upload组件在accept=all的时候没有作用
+7. 修复在text组件mode为phone时call属性无效的问题
+8. 处理u-form clearValidate方法
+9. 其他修复
+## 2.0.20(2022-01-14)
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. 修复calendar默认会选择一个日期,如果直接点确定的话,无法取到值的问题
+2. 修复Slider缺少disabled props 还有注释
+3. 修复u-notice-bar点击事件无法拿到index索引值的问题
+4. 修复u-collapse-item在vue文件下,app端自定义插槽不生效的问题
+5. 优化头像为空时显示默认头像 
+6. 修复图片地址赋值后判断加载状态为完成问题
+7. 修复日历滚动到默认日期月份区域
+8. search组件暴露点击左边icon事件
+9. 修复u-form clearValidate方法不生效
+10. upload h5端增加返回文件参数(文件的name参数)
+11. 处理upload选择文件后url为blob类型无法预览的问题
+12. u-code-input 修复输入框没有往左移出一半屏幕
+13. 修复Upload上传 disabled为true时,控制台报hoverClass类型错误
+14. 临时处理ios app下grid点击坍塌问题
+15. 其他修复
+## 2.0.19(2021-12-29)
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. 优化微信小程序包体积可在微信中预览,请升级HbuilderX3.3.4,同时在“运行->运行到小程序模拟器”中勾选“运行时是否压缩代码”
+2. 优化微信小程序setData性能,处理某些方法如$u.route()无法在模板中使用的问题
+3. navbar添加autoBack参数
+4. 允许avatar组件的事件冒泡
+5. 修复cell组件报错问题
+6. 其他修复
+## 2.0.18(2021-12-28)
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. 修复app端编译报错问题
+2. 重新处理微信小程序端setData过大的性能问题
+3. 修复边框问题
+4. 修复最大最小月份不大于0则没有数据出现的问题
+5. 修复SwipeAction微信小程序端无法上下滑动问题
+6. 修复input的placeholder在小程序端默认显示为true问题
+7. 修复divider组件click事件无效问题
+8. 修复u-code-input maxlength 属性值为 String 类型时显示异常
+9. 修复当 grid只有 1到2时 在小程序端algin设置无效的问题
+10. 处理form-item的label为top时,取消错误提示的左边距
+11. 其他修复
+## 2.0.17(2021-12-26)
+## uView正在参与开源中国的“年度最佳项目”评选,之前投过票的现在也可以投票,恳请同学们投一票,[点此帮助uView](https://www.oschina.net/project/top_cn_2021/?id=583)
+
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. 解决HBuilderX3.3.3.20211225版本导致的样式问题
+2. calendar日历添加monthNum参数
+3. navbar添加center slot
+## 2.0.16(2021-12-25)
+## uView正在参与开源中国的“年度最佳项目”评选,之前投过票的现在也可以投票,恳请同学们投一票,[点此帮助uView](https://www.oschina.net/project/top_cn_2021/?id=583)
+
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. 解决微信小程序setData性能问题
+2. 修复count-down组件change事件不触发问题
+## 2.0.15(2021-12-21)
+## uView正在参与开源中国的“年度最佳项目”评选,之前投过票的现在也可以投票,恳请同学们投一票,[点此帮助uView](https://www.oschina.net/project/top_cn_2021/?id=583)
+
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. 修复Cell单元格titleWidth无效
+2. 修复cheakbox组件ischecked不更新
+3. 修复keyboard是否显示"."按键默认值问题
+4. 修复number-keyboard是否显示键盘的"."符号问题
+5. 修复Input输入框 readonly无效
+6. 修复u-avatar 导致打包app、H5时候报错问题
+7. 修复Upload上传deletable无效
+8. 修复upload当设置maxSize时无效的问题
+9. 修复tabs lineWidth传入带单位的字符串的时候偏移量计算错误问题
+10. 修复rate组件在有padding的view内,显示的星星位置和可触摸区域不匹配,无法正常选中星星
+## 2.0.13(2021-12-14)
+## [点击加群交流反馈:364463526](https://jq.qq.com/?_chanwv=1027&k=mCxS3TGY)
+
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. 修复配置默认单位为rpx可能会导致自定义导航栏高度异常的问题
+## 2.0.12(2021-12-14)
+## [点击加群交流反馈:364463526](https://jq.qq.com/?_chanwv=1027&k=mCxS3TGY)
+
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. 修复tabs组件在vue环境下划线消失的问题
+2. 修复upload组件在安卓小程序无法选择视频的问题
+3. 添加uni.$u.config.unit配置,用于配置参数默认单位,详见:[默认单位配置](https://www.uviewui.com/components/setting.html#%E9%BB%98%E8%AE%A4%E5%8D%95%E4%BD%8D%E9%85%8D%E7%BD%AE)
+4. 修复textarea组件在没绑定v-model时,字符统计不生效问题
+5. 修复nvue下控制是否出现滚动条失效问题
+## 2.0.11(2021-12-13)
+## [点击加群交流反馈:364463526](https://jq.qq.com/?_chanwv=1027&k=mCxS3TGY)
+
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. text组件align参数无效的问题
+2. subsection组件添加keyName参数
+3. upload组件无法判断[Object file]类型的问题
+4. 处理notify层级过低问题
+5. codeInput组件添加disabledDot参数
+6. 处理actionSheet组件round参数无效的问题
+7. calendar组件添加round参数用于控制圆角值
+8. 处理swipeAction组件在vue环境下默认被打开的问题
+9. button组件的throttleTime节流参数无效的问题
+10. 解决u-notify手动关闭方法close()无效的问题
+11. input组件readonly不生效问题
+12. tag组件type参数为info不生效问题
+## 2.0.10(2021-12-08)
+## [点击加群交流反馈:364463526](https://jq.qq.com/?_chanwv=1027&k=mCxS3TGY)
+
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. 修复button sendMessagePath属性不生效
+2. 修复DatetimePicker选择器title无效
+3. 修复u-toast设置loading=true不生效
+4. 修复u-text金额模式传0报错
+5. 修复u-toast组件的icon属性配置不生效
+6. button的icon在特殊场景下的颜色优化
+7. IndexList优化,增加#
+## 2.0.9(2021-12-01)
+## [点击加群交流反馈:232041042](https://jq.qq.com/?_wv=1027&k=KnbeceDU)
+
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. 优化swiper的height支持100%值(仅vue有效),修复嵌入视频时click事件无法触发的问题
+2. 优化tabs组件对list值为空的判断,或者动态变化list时重新计算相关尺寸的问题
+3. 优化datetime-picker组件逻辑,让其后续打开的默认值为上一次的选中值,需要通过v-model绑定值才有效
+4. 修复upload内嵌在其他组件中,选择图片可能不会换行的问题
+## 2.0.8(2021-12-01)
+## [点击加群交流反馈:232041042](https://jq.qq.com/?_wv=1027&k=KnbeceDU)
+
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. 修复toast的position参数无效问题
+2. 处理input在ios nvue上无法获得焦点的问题
+3. avatar-group组件添加extraValue参数,让剩余展示数量可手动控制
+4. tabs组件添加keyName参数用于配置从对象中读取的键名
+5. 处理text组件名字脱敏默认配置无效的问题
+6. 处理picker组件item文本太长换行问题
+## 2.0.7(2021-11-30)
+## [点击加群交流反馈:232041042](https://jq.qq.com/?_wv=1027&k=KnbeceDU)
+
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. 修复radio和checkbox动态改变v-model无效的问题。
+2. 优化form规则validator在微信小程序用法
+3. 修复backtop组件mode参数在微信小程序无效的问题
+4. 处理Album的previewFullImage属性无效的问题
+5. 处理u-datetime-picker组件mode='time'在选择改变时间时,控制台报错的问题
+## 2.0.6(2021-11-27)
+## [点击加群交流反馈:232041042](https://jq.qq.com/?_wv=1027&k=KnbeceDU)
+
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. 处理tag组件在vue下边框无效的问题。
+2. 处理popup组件圆角参数可能无效的问题。
+3. 处理tabs组件lineColor参数可能无效的问题。
+4. propgress组件在值很小时,显示异常的问题。
+## 2.0.5(2021-11-25)
+## [点击加群交流反馈:232041042](https://jq.qq.com/?_wv=1027&k=KnbeceDU)
+
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. calendar在vue下显示异常问题。 
+2. form组件labelPosition和errorType参数无效的问题
+3. input组件inputAlign无效的问题
+4. 其他一些修复
+## 2.0.4(2021-11-23)
+## [点击加群交流反馈:232041042](https://jq.qq.com/?_wv=1027&k=KnbeceDU)
+
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+0. input组件缺失@confirm事件,以及subfix和prefix无效问题
+1. component.scss文件样式在vue下干扰全局布局问题
+2. 修复subsection在vue环境下表现异常的问题
+3. tag组件的bgColor等参数无效的问题
+4. upload组件不换行的问题
+5. 其他的一些修复处理
+## 2.0.3(2021-11-16)
+## [点击加群交流反馈:1129077272](https://jq.qq.com/?_wv=1027&k=KnbeceDU)
+
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. uView2.0已实现全面兼容nvue
+2. uView2.0对1.x进行了架构重构,细节和性能都有极大提升
+3. 目前uView2.0为公测阶段,相关细节可能会有变动
+4. 我们写了一份与1.x的对比指南,详见[对比1.x](https://www.uviewui.com/components/diff1.x.html)
+5. 处理modal的confirm回调事件拼写错误问题
+6. 处理input组件@input事件参数错误问题
+7. 其他一些修复
+## 2.0.2(2021-11-16)
+## [点击加群交流反馈:1129077272](https://jq.qq.com/?_wv=1027&k=KnbeceDU)
+
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. uView2.0已实现全面兼容nvue
+2. uView2.0对1.x进行了架构重构,细节和性能都有极大提升
+3. 目前uView2.0为公测阶段,相关细节可能会有变动
+4. 我们写了一份与1.x的对比指南,详见[对比1.x](https://www.uviewui.com/components/diff1.x.html)
+5. 修复input组件formatter参数缺失问题
+6. 优化loading-icon组件的scss写法问题,防止不兼容新版本scss
+## 2.0.0(2020-11-15)
+## [点击加群交流反馈:1129077272](https://jq.qq.com/?_wv=1027&k=KnbeceDU)
+
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. uView2.0已实现全面兼容nvue
+2. uView2.0对1.x进行了架构重构,细节和性能都有极大提升
+3. 目前uView2.0为公测阶段,相关细节可能会有变动
+4. 我们写了一份与1.x的对比指南,详见[对比1.x](https://www.uviewui.com/components/diff1.x.html)
+5. 修复input组件formatter参数缺失问题
+
+

+ 78 - 0
uni_modules/uview-ui/components/u--form/u--form.vue

@@ -0,0 +1,78 @@
+<template>
+	<uvForm
+		ref="uForm"
+		:model="model"
+		:rules="rules"
+		:errorType="errorType"
+		:borderBottom="borderBottom"
+		:labelPosition="labelPosition"
+		:labelWidth="labelWidth"
+		:labelAlign="labelAlign"
+		:labelStyle="labelStyle"
+		:customStyle="customStyle"
+	>
+		<slot />
+	</uvForm>
+</template>
+
+<script>
+	/**
+	 * 此组件存在的理由是,在nvue下,u-form被uni-app官方占用了,u-form在nvue中相当于form组件
+	 * 所以在nvue下,取名为u--form,内部其实还是u-form.vue,只不过做一层中转
+	 */
+	import uvForm from '../u-form/u-form.vue';
+	import props from '../u-form/props.js'
+	export default {
+		// #ifdef MP-WEIXIN
+		name: 'u-form',
+		// #endif
+		// #ifndef MP-WEIXIN
+		name: 'u--form',
+		// #endif
+		mixins: [uni.$u.mpMixin, props, uni.$u.mixin],
+		components: {
+			uvForm
+		},
+		created() {
+			this.children = []
+		},
+		methods: {
+			// 手动设置校验的规则,如果规则中有函数的话,微信小程序中会过滤掉,所以只能手动调用设置规则
+			setRules(rules) {
+				this.$refs.uForm.setRules(rules)
+			},
+			validate() {
+				/**
+				 * 在微信小程序中,通过this.$parent拿到的父组件是u--form,而不是其内嵌的u-form
+				 * 导致在u-form组件中,拿不到对应的children数组,从而校验无效,所以这里每次调用u-form组件中的
+				 * 对应方法的时候,在小程序中都先将u--form的children赋值给u-form中的children
+				 */
+				// #ifdef MP-WEIXIN
+				this.setMpData()
+				// #endif
+				return this.$refs.uForm.validate()
+			},
+			validateField(value, callback) {
+				// #ifdef MP-WEIXIN
+				this.setMpData()
+				// #endif
+				return this.$refs.uForm.validateField(value, callback)
+			},
+			resetFields() {
+				// #ifdef MP-WEIXIN
+				this.setMpData()
+				// #endif
+				return this.$refs.uForm.resetFields()
+			},
+			clearValidate(props) {
+				// #ifdef MP-WEIXIN
+				this.setMpData()
+				// #endif
+				return this.$refs.uForm.clearValidate(props)
+			},
+			setMpData() {
+				this.$refs.uForm.children = this.children
+			}
+		},
+	}
+</script>

+ 47 - 0
uni_modules/uview-ui/components/u--image/u--image.vue

@@ -0,0 +1,47 @@
+<template>
+	<uvImage 
+		:src="src"
+		:mode="mode"
+		:width="width"
+		:height="height"
+		:shape="shape"
+		:radius="radius"
+		:lazyLoad="lazyLoad"
+		:showMenuByLongpress="showMenuByLongpress"
+		:loadingIcon="loadingIcon"
+		:errorIcon="errorIcon"
+		:showLoading="showLoading"
+		:showError="showError"
+		:fade="fade"
+		:webp="webp"
+		:duration="duration"
+		:bgColor="bgColor"
+		:customStyle="customStyle"
+		@click="$emit('click')"
+		@error="$emit('error')"
+		@load="$emit('load')"
+	>
+		<template v-slot:loading>
+			<slot name="loading"></slot>
+		</template>
+		<template v-slot:error>
+			<slot name="error"></slot>
+		</template>
+	</uvImage>
+</template>
+
+<script>
+	/**
+	 * 此组件存在的理由是,在nvue下,u-image被uni-app官方占用了,u-image在nvue中相当于image组件
+	 * 所以在nvue下,取名为u--image,内部其实还是u-iamge.vue,只不过做一层中转
+	 */
+	import uvImage from '../u-image/u-image.vue';
+	import props from '../u-image/props.js';
+	export default {
+		name: 'u--image',
+		mixins: [uni.$u.mpMixin, props, uni.$u.mixin],
+		components: {
+			uvImage
+		},
+	}
+</script>

+ 73 - 0
uni_modules/uview-ui/components/u--input/u--input.vue

@@ -0,0 +1,73 @@
+<template>
+	<uvInput 
+		:value="value"
+		:type="type"
+		:fixed="fixed"
+		:disabled="disabled"
+		:disabledColor="disabledColor"
+		:clearable="clearable"
+		:password="password"
+		:maxlength="maxlength"
+		:placeholder="placeholder"
+		:placeholderClass="placeholderClass"
+		:placeholderStyle="placeholderStyle"
+		:showWordLimit="showWordLimit"
+		:confirmType="confirmType"
+		:confirmHold="confirmHold"
+		:holdKeyboard="holdKeyboard"
+		:focus="focus"
+		:autoBlur="autoBlur"
+		:disableDefaultPadding="disableDefaultPadding"
+		:cursor="cursor"
+		:cursorSpacing="cursorSpacing"
+		:selectionStart="selectionStart"
+		:selectionEnd="selectionEnd"
+		:adjustPosition="adjustPosition"
+		:inputAlign="inputAlign"
+		:fontSize="fontSize"
+		:color="color"
+		:prefixIcon="prefixIcon"
+		:suffixIcon="suffixIcon"
+		:suffixIconStyle="suffixIconStyle"
+		:prefixIconStyle="prefixIconStyle"
+		:border="border"
+		:readonly="readonly"
+		:shape="shape"
+		:customStyle="customStyle"
+		:formatter="formatter"
+		:ignoreCompositionEvent="ignoreCompositionEvent"
+		@focus="$emit('focus')"
+		@blur="e => $emit('blur', e)"
+		@keyboardheightchange="$emit('keyboardheightchange')"
+		@change="e => $emit('change', e)"
+		@input="e => $emit('input', e)"
+		@confirm="e => $emit('confirm', e)"
+		@clear="$emit('clear')"
+		@click="$emit('click')"
+	>
+		<!-- #ifdef MP -->
+		<slot name="prefix"></slot>
+		<slot name="suffix"></slot>
+		<!-- #endif -->
+		<!-- #ifndef MP -->
+		<slot name="prefix" slot="prefix"></slot>
+		<slot name="suffix" slot="suffix"></slot>
+		<!-- #endif -->
+	</uvInput>
+</template>
+
+<script>
+	/**
+	 * 此组件存在的理由是,在nvue下,u-input被uni-app官方占用了,u-input在nvue中相当于input组件
+	 * 所以在nvue下,取名为u--input,内部其实还是u-input.vue,只不过做一层中转
+	 */
+	import uvInput from '../u-input/u-input.vue';
+	import props from '../u-input/props.js'
+	export default {
+		name: 'u--input',
+		mixins: [uni.$u.mpMixin, props, uni.$u.mixin],
+		components: {
+			uvInput
+		},
+	}
+</script>

+ 44 - 0
uni_modules/uview-ui/components/u--text/u--text.vue

@@ -0,0 +1,44 @@
+<template>
+    <uvText
+        :type="type"
+        :show="show"
+        :text="text"
+        :prefixIcon="prefixIcon"
+        :suffixIcon="suffixIcon"
+        :mode="mode"
+        :href="href"
+        :format="format"
+        :call="call"
+        :openType="openType"
+        :bold="bold"
+        :block="block"
+        :lines="lines"
+        :color="color"
+		:decoration="decoration"
+        :size="size"
+        :iconStyle="iconStyle"
+        :margin="margin"
+        :lineHeight="lineHeight"
+        :align="align"
+        :wordWrap="wordWrap"
+        :customStyle="customStyle"
+        @click="$emit('click')"
+    ></uvText>
+</template>
+
+<script>
+/**
+ * 此组件存在的理由是,在nvue下,u-text被uni-app官方占用了,u-text在nvue中相当于input组件
+ * 所以在nvue下,取名为u--input,内部其实还是u-text.vue,只不过做一层中转
+ * 不使用v-bind="$attrs",而是分开独立写传参,是因为微信小程序不支持此写法
+ */
+import uvText from "../u-text/u-text.vue";
+import props from "../u-text/props.js";
+export default {
+    name: "u--text",
+    mixins: [uni.$u.mpMixin, props, uni.$u.mixin],
+    components: {
+        uvText,
+    },
+};
+</script>

+ 48 - 0
uni_modules/uview-ui/components/u--textarea/u--textarea.vue

@@ -0,0 +1,48 @@
+<template>
+	<uvTextarea
+		:value="value"
+		:placeholder="placeholder"
+		:height="height"
+		:confirmType="confirmType"
+		:disabled="disabled"
+		:count="count"
+		:focus="focus"
+		:autoHeight="autoHeight"
+		:fixed="fixed"
+		:cursorSpacing="cursorSpacing"
+		:cursor="cursor"
+		:showConfirmBar="showConfirmBar"
+		:selectionStart="selectionStart"
+		:selectionEnd="selectionEnd"
+		:adjustPosition="adjustPosition"
+		:disableDefaultPadding="disableDefaultPadding"
+		:holdKeyboard="holdKeyboard"
+		:maxlength="maxlength"
+		:border="border"
+		:customStyle="customStyle"
+		:formatter="formatter"
+		:ignoreCompositionEvent="ignoreCompositionEvent"
+		@focus="e => $emit('focus')"
+		@blur="e => $emit('blur')"
+		@linechange="e => $emit('linechange', e)"
+		@confirm="e => $emit('confirm')"
+		@input="e => $emit('input', e)"
+		@keyboardheightchange="e => $emit('keyboardheightchange')"
+	></uvTextarea>
+</template>
+
+<script>
+	/**
+	 * 此组件存在的理由是,在nvue下,u--textarea被uni-app官方占用了,u-textarea在nvue中相当于textarea组件
+	 * 所以在nvue下,取名为u--textarea,内部其实还是u-textarea.vue,只不过做一层中转
+	 */
+	import uvTextarea from '../u-textarea/u-textarea.vue';
+	import props from '../u-textarea/props.js'
+	export default {
+		name: 'u--textarea',
+		mixins: [uni.$u.mpMixin, props, uni.$u.mixin],
+		components: {
+			uvTextarea
+		},
+	}
+</script>

+ 54 - 0
uni_modules/uview-ui/components/u-action-sheet/props.js

@@ -0,0 +1,54 @@
+export default {
+    props: {
+        // 操作菜单是否展示 (默认false)
+        show: {
+            type: Boolean,
+            default: uni.$u.props.actionSheet.show
+        },
+        // 标题
+        title: {
+            type: String,
+            default: uni.$u.props.actionSheet.title
+        },
+        // 选项上方的描述信息
+        description: {
+            type: String,
+            default: uni.$u.props.actionSheet.description
+        },
+        // 数据
+        actions: {
+            type: Array,
+            default: uni.$u.props.actionSheet.actions
+        },
+        // 取消按钮的文字,不为空时显示按钮
+        cancelText: {
+            type: String,
+            default: uni.$u.props.actionSheet.cancelText
+        },
+        // 点击某个菜单项时是否关闭弹窗
+        closeOnClickAction: {
+            type: Boolean,
+            default: uni.$u.props.actionSheet.closeOnClickAction
+        },
+        // 处理底部安全区(默认true)
+        safeAreaInsetBottom: {
+            type: Boolean,
+            default: uni.$u.props.actionSheet.safeAreaInsetBottom
+        },
+        // 小程序的打开方式
+        openType: {
+            type: String,
+            default: uni.$u.props.actionSheet.openType
+        },
+        // 点击遮罩是否允许关闭 (默认true)
+        closeOnClickOverlay: {
+            type: Boolean,
+            default: uni.$u.props.actionSheet.closeOnClickOverlay
+        },
+        // 圆角值
+        round: {
+            type: [Boolean, String, Number],
+            default: uni.$u.props.actionSheet.round
+        }
+    }
+}

+ 278 - 0
uni_modules/uview-ui/components/u-action-sheet/u-action-sheet.vue

@@ -0,0 +1,278 @@
+
+<template>
+	<u-popup
+	    :show="show"
+	    mode="bottom"
+	    @close="closeHandler"
+	    :safeAreaInsetBottom="safeAreaInsetBottom"
+	    :round="round"
+	>
+		<view class="u-action-sheet">
+			<view
+			    class="u-action-sheet__header"
+			    v-if="title"
+			>
+				<text class="u-action-sheet__header__title u-line-1">{{title}}</text>
+				<view
+				    class="u-action-sheet__header__icon-wrap"
+				    @tap.stop="cancel"
+				>
+					<u-icon
+					    name="close"
+					    size="17"
+					    color="#c8c9cc"
+					    bold
+					></u-icon>
+				</view>
+			</view>
+			<text
+			    class="u-action-sheet__description"
+				:style="[{
+					marginTop: `${title && description ? 0 : '18px'}`
+				}]"
+			    v-if="description"
+			>{{description}}</text>
+			<slot>
+				<u-line v-if="description"></u-line>
+				<view class="u-action-sheet__item-wrap">
+					<template v-for="(item, index) in actions">
+						<!-- #ifdef MP -->
+						<button
+						    :key="index"
+						    class="u-reset-button"
+						    :openType="item.openType"
+						    @getuserinfo="onGetUserInfo"
+						    @contact="onContact"
+						    @getphonenumber="onGetPhoneNumber"
+						    @error="onError"
+						    @launchapp="onLaunchApp"
+						    @opensetting="onOpenSetting"
+						    :lang="lang"
+						    :session-from="sessionFrom"
+						    :send-message-title="sendMessageTitle"
+						    :send-message-path="sendMessagePath"
+						    :send-message-img="sendMessageImg"
+						    :show-message-card="showMessageCard"
+						    :app-parameter="appParameter"
+						    @tap="selectHandler(index)"
+						    :hover-class="!item.disabled && !item.loading ? 'u-action-sheet--hover' : ''"
+						>
+							<!-- #endif -->
+							<view
+							    class="u-action-sheet__item-wrap__item"
+							    @tap.stop="selectHandler(index)"
+							    :hover-class="!item.disabled && !item.loading ? 'u-action-sheet--hover' : ''"
+							    :hover-stay-time="150"
+							>
+								<template v-if="!item.loading">
+									<text
+									    class="u-action-sheet__item-wrap__item__name"
+									    :style="[itemStyle(index)]"
+									>{{ item.name }}</text>
+									<text
+									    v-if="item.subname"
+									    class="u-action-sheet__item-wrap__item__subname"
+									>{{ item.subname }}</text>
+								</template>
+								<u-loading-icon
+								    v-else
+								    custom-class="van-action-sheet__loading"
+								    size="18"
+								    mode="circle"
+								/>
+							</view>
+							<!-- #ifdef MP -->
+						</button>
+						<!-- #endif -->
+						<u-line v-if="index !== actions.length - 1"></u-line>
+					</template>
+				</view>
+			</slot>
+			<u-gap
+			    bgColor="#eaeaec"
+			    height="6"
+			    v-if="cancelText"
+			></u-gap>
+			<view hover-class="u-action-sheet--hover">
+				<text
+				    @touchmove.stop.prevent
+				    :hover-stay-time="150"
+				    v-if="cancelText"
+				    class="u-action-sheet__cancel-text"
+				    @tap="cancel"
+				>{{cancelText}}</text>
+			</view>
+		</view>
+	</u-popup>
+</template>
+
+<script>
+	import openType from '../../libs/mixin/openType'
+	import button from '../../libs/mixin/button'
+	import props from './props.js';
+	/**
+	 * ActionSheet 操作菜单
+	 * @description 本组件用于从底部弹出一个操作菜单,供用户选择并返回结果。本组件功能类似于uni的uni.showActionSheetAPI,配置更加灵活,所有平台都表现一致。
+	 * @tutorial https://www.uviewui.com/components/actionSheet.html
+	 * 
+	 * @property {Boolean}			show				操作菜单是否展示 (默认 false )
+	 * @property {String}			title				操作菜单标题
+	 * @property {String}			description			选项上方的描述信息
+	 * @property {Array<Object>}	actions				按钮的文字数组,见官方文档示例
+	 * @property {String}			cancelText			取消按钮的提示文字,不为空时显示按钮
+	 * @property {Boolean}			closeOnClickAction	点击某个菜单项时是否关闭弹窗 (默认 true )
+	 * @property {Boolean}			safeAreaInsetBottom	处理底部安全区 (默认 true )
+	 * @property {String}			openType			小程序的打开方式 (contact | launchApp | getUserInfo | openSetting |getPhoneNumber |error )
+	 * @property {Boolean}			closeOnClickOverlay	点击遮罩是否允许关闭  (默认 true )
+	 * @property {Number|String}	round				圆角值,默认无圆角  (默认 0 )
+	 * @property {String}			lang				指定返回用户信息的语言,zh_CN 简体中文,zh_TW 繁体中文,en 英文
+	 * @property {String}			sessionFrom			会话来源,openType="contact"时有效
+	 * @property {String}			sendMessageTitle	会话内消息卡片标题,openType="contact"时有效
+	 * @property {String}			sendMessagePath		会话内消息卡片点击跳转小程序路径,openType="contact"时有效
+	 * @property {String}			sendMessageImg		会话内消息卡片图片,openType="contact"时有效
+	 * @property {Boolean}			showMessageCard		是否显示会话内消息卡片,设置此参数为 true,用户进入客服会话会在右下角显示"可能要发送的小程序"提示,用户点击后可以快速发送小程序消息,openType="contact"时有效 (默认 false )
+	 * @property {String}			appParameter		打开 APP 时,向 APP 传递的参数,openType=launchApp 时有效
+	 * 
+	 * @event {Function} select			点击ActionSheet列表项时触发 
+	 * @event {Function} close			点击取消按钮时触发
+	 * @event {Function} getuserinfo	用户点击该按钮时,会返回获取到的用户信息,回调的 detail 数据与 wx.getUserInfo 返回的一致,openType="getUserInfo"时有效
+	 * @event {Function} contact		客服消息回调,openType="contact"时有效
+	 * @event {Function} getphonenumber	获取用户手机号回调,openType="getPhoneNumber"时有效
+	 * @event {Function} error			当使用开放能力时,发生错误的回调,openType="error"时有效
+	 * @event {Function} launchapp		打开 APP 成功的回调,openType="launchApp"时有效
+	 * @event {Function} opensetting	在打开授权设置页后回调,openType="openSetting"时有效
+	 * @example <u-action-sheet :actions="list" :title="title" :show="show"></u-action-sheet>
+	 */
+	export default {
+		name: "u-action-sheet",
+		// 一些props参数和methods方法,通过mixin混入,因为其他文件也会用到
+		mixins: [openType, button, uni.$u.mixin, props],
+		data() {
+			return {
+
+			}
+		},
+		computed: {
+			// 操作项目的样式
+			itemStyle() {
+				return (index) => {
+					let style = {};
+					if (this.actions[index].color) style.color = this.actions[index].color
+					if (this.actions[index].fontSize) style.fontSize = uni.$u.addUnit(this.actions[index].fontSize)
+					// 选项被禁用的样式
+					if (this.actions[index].disabled) style.color = '#c0c4cc'
+					return style;
+				}
+			},
+		},
+		methods: {
+			closeHandler() {
+				// 允许点击遮罩关闭时,才发出close事件
+				if(this.closeOnClickOverlay) {
+					this.$emit('close')
+				}
+			},
+			// 点击取消按钮
+			cancel() {
+				this.$emit('close')
+			},
+			selectHandler(index) {
+				const item = this.actions[index]
+				if (item && !item.disabled && !item.loading) {
+					this.$emit('select', item)
+					if (this.closeOnClickAction) {
+						this.$emit('close')
+					}
+				}
+			},
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/components.scss";
+	$u-action-sheet-reset-button-width:100% !default;
+	$u-action-sheet-title-font-size: 16px !default;
+	$u-action-sheet-title-padding: 12px 30px !default;
+	$u-action-sheet-title-color: $u-main-color !default;
+	$u-action-sheet-header-icon-wrap-right:15px !default;
+	$u-action-sheet-header-icon-wrap-top:15px !default;
+	$u-action-sheet-description-font-size:13px !default;
+	$u-action-sheet-description-color:14px !default;
+	$u-action-sheet-description-margin: 18px 15px !default;
+	$u-action-sheet-item-wrap-item-padding:15px !default;
+	$u-action-sheet-item-wrap-name-font-size:16px !default;
+	$u-action-sheet-item-wrap-subname-font-size:13px !default;
+	$u-action-sheet-item-wrap-subname-color: #c0c4cc !default;
+	$u-action-sheet-item-wrap-subname-margin-top:10px !default;
+	$u-action-sheet-cancel-text-font-size:16px !default;
+	$u-action-sheet-cancel-text-color:$u-content-color !default;
+	$u-action-sheet-cancel-text-font-size:15px !default;
+	$u-action-sheet-cancel-text-hover-background-color:rgb(242, 243, 245) !default;
+
+	.u-reset-button {
+		width: $u-action-sheet-reset-button-width;
+	}
+
+	.u-action-sheet {
+		text-align: center;
+		&__header {
+			position: relative;
+			padding: $u-action-sheet-title-padding;
+			&__title {
+				font-size: $u-action-sheet-title-font-size;
+				color: $u-action-sheet-title-color;
+				font-weight: bold;
+				text-align: center;
+			}
+
+			&__icon-wrap {
+				position: absolute;
+				right: $u-action-sheet-header-icon-wrap-right;
+				top: $u-action-sheet-header-icon-wrap-top;
+			}
+		}
+
+		&__description {
+			font-size: $u-action-sheet-description-font-size;
+			color: $u-tips-color;
+			margin: $u-action-sheet-description-margin;
+			text-align: center;
+		}
+
+		&__item-wrap {
+
+			&__item {
+				padding: $u-action-sheet-item-wrap-item-padding;
+				@include flex;
+				align-items: center;
+				justify-content: center;
+				flex-direction: column;
+
+				&__name {
+					font-size: $u-action-sheet-item-wrap-name-font-size;
+					color: $u-main-color;
+					text-align: center;
+				}
+
+				&__subname {
+					font-size: $u-action-sheet-item-wrap-subname-font-size;
+					color: $u-action-sheet-item-wrap-subname-color;
+					margin-top: $u-action-sheet-item-wrap-subname-margin-top;
+					text-align: center;
+				}
+			}
+		}
+
+		&__cancel-text {
+			font-size: $u-action-sheet-cancel-text-font-size;
+			color: $u-action-sheet-cancel-text-color;
+			text-align: center;
+			padding: $u-action-sheet-cancel-text-font-size;
+		}
+
+		&--hover {
+			background-color: $u-action-sheet-cancel-text-hover-background-color;
+		}
+	}
+</style>

+ 59 - 0
uni_modules/uview-ui/components/u-album/props.js

@@ -0,0 +1,59 @@
+export default {
+    props: {
+        // 图片地址,Array<String>|Array<Object>形式
+        urls: {
+            type: Array,
+            default: uni.$u.props.album.urls
+        },
+        // 指定从数组的对象元素中读取哪个属性作为图片地址
+        keyName: {
+            type: String,
+            default: uni.$u.props.album.keyName
+        },
+        // 单图时,图片长边的长度
+        singleSize: {
+            type: [String, Number],
+            default: uni.$u.props.album.singleSize
+        },
+        // 多图时,图片边长
+        multipleSize: {
+            type: [String, Number],
+            default: uni.$u.props.album.multipleSize
+        },
+        // 多图时,图片水平和垂直之间的间隔
+        space: {
+            type: [String, Number],
+            default: uni.$u.props.album.space
+        },
+        // 单图时,图片缩放裁剪的模式
+        singleMode: {
+            type: String,
+            default: uni.$u.props.album.singleMode
+        },
+        // 多图时,图片缩放裁剪的模式
+        multipleMode: {
+            type: String,
+            default: uni.$u.props.album.multipleMode
+        },
+        // 最多展示的图片数量,超出时最后一个位置将会显示剩余图片数量
+        maxCount: {
+            type: [String, Number],
+            default: uni.$u.props.album.maxCount
+        },
+        // 是否可以预览图片
+        previewFullImage: {
+            type: Boolean,
+            default: uni.$u.props.album.previewFullImage
+        },
+        // 每行展示图片数量,如设置,singleSize和multipleSize将会无效
+        rowCount: {
+            type: [String, Number],
+            default: uni.$u.props.album.rowCount
+        },
+        // 超出maxCount时是否显示查看更多的提示
+        showMore: {
+            type: Boolean,
+            default: uni.$u.props.album.showMore
+        }
+    }
+}

+ 259 - 0
uni_modules/uview-ui/components/u-album/u-album.vue

@@ -0,0 +1,259 @@
+<template>
+    <view class="u-album">
+        <view
+            class="u-album__row"
+            ref="u-album__row"
+            v-for="(arr, index) in showUrls"
+            :forComputedUse="albumWidth"
+            :key="index"
+        >
+            <view
+                class="u-album__row__wrapper"
+                v-for="(item, index1) in arr"
+                :key="index1"
+                :style="[imageStyle(index + 1, index1 + 1)]"
+                @tap="previewFullImage ? onPreviewTap(getSrc(item)) : ''"
+            >
+                <image
+                    :src="getSrc(item)"
+                    :mode="
+                        urls.length === 1
+                            ? imageHeight > 0
+                                ? singleMode
+                                : 'widthFix'
+                            : multipleMode
+                    "
+                    :style="[
+                        {
+                            width: imageWidth,
+                            height: imageHeight
+                        }
+                    ]"
+                ></image>
+                <view
+                    v-if="
+                        showMore &&
+                        urls.length > rowCount * showUrls.length &&
+                        index === showUrls.length - 1 &&
+                        index1 === showUrls[showUrls.length - 1].length - 1
+                    "
+                    class="u-album__row__wrapper__text"
+                >
+                    <u--text
+                        :text="`+${urls.length - maxCount}`"
+                        color="#fff"
+                        :size="multipleSize * 0.3"
+                        align="center"
+                        customStyle="justify-content: center"
+                    ></u--text>
+                </view>
+            </view>
+        </view>
+    </view>
+</template>
+
+<script>
+import props from './props.js'
+// #ifdef APP-NVUE
+// 由于weex为阿里的KPI业绩考核的产物,所以不支持百分比单位,这里需要通过dom查询组件的宽度
+const dom = uni.requireNativePlugin('dom')
+// #endif
+
+/**
+ * Album 相册
+ * @description 本组件提供一个类似相册的功能,让开发者开发起来更加得心应手。减少重复的模板代码
+ * @tutorial https://www.uviewui.com/components/album.html
+ *
+ * @property {Array}           urls             图片地址列表 Array<String>|Array<Object>形式
+ * @property {String}          keyName          指定从数组的对象元素中读取哪个属性作为图片地址
+ * @property {String | Number} singleSize       单图时,图片长边的长度  (默认 180 )
+ * @property {String | Number} multipleSize     多图时,图片边长 (默认 70 )
+ * @property {String | Number} space            多图时,图片水平和垂直之间的间隔 (默认 6 )
+ * @property {String}          singleMode       单图时,图片缩放裁剪的模式 (默认 'scaleToFill' )
+ * @property {String}          multipleMode     多图时,图片缩放裁剪的模式 (默认 'aspectFill' )
+ * @property {String | Number} maxCount         取消按钮的提示文字 (默认 9 )
+ * @property {Boolean}         previewFullImage 是否可以预览图片 (默认 true )
+ * @property {String | Number} rowCount         每行展示图片数量,如设置,singleSize和multipleSize将会无效	(默认 3 )
+ * @property {Boolean}         showMore         超出maxCount时是否显示查看更多的提示 (默认 true )
+ *
+ * @event    {Function}        albumWidth       某些特殊的情况下,需要让文字与相册的宽度相等,这里事件的形式对外发送  (回调参数 width )
+ * @example <u-album :urls="urls2" @albumWidth="width => albumWidth = width" multipleSize="68" ></u-album>
+ */
+export default {
+    name: 'u-album',
+    mixins: [uni.$u.mpMixin, uni.$u.mixin, props],
+    data() {
+        return {
+            // 单图的宽度
+            singleWidth: 0,
+            // 单图的高度
+            singleHeight: 0,
+            // 单图时,如果无法获取图片的尺寸信息,让图片宽度默认为容器的一定百分比
+            singlePercent: 0.6
+        }
+    },
+    watch: {
+        urls: {
+            immediate: true,
+            handler(newVal) {
+                if (newVal.length === 1) {
+                    this.getImageRect()
+                }
+            }
+        }
+    },
+    computed: {
+        imageStyle() {
+            return (index1, index2) => {
+                const { space, rowCount, multipleSize, urls } = this,
+                    { addUnit, addStyle } = uni.$u,
+                    rowLen = this.showUrls.length,
+                    allLen = this.urls.length
+                const style = {
+                    marginRight: addUnit(space),
+                    marginBottom: addUnit(space)
+                }
+                // 如果为最后一行,则每个图片都无需下边框
+                if (index1 === rowLen) style.marginBottom = 0
+                // 每行的最右边一张和总长度的最后一张无需右边框
+                if (
+                    index2 === rowCount ||
+                    (index1 === rowLen &&
+                        index2 === this.showUrls[index1 - 1].length)
+                )
+                    style.marginRight = 0
+                return style
+            }
+        },
+        // 将数组划分为二维数组
+        showUrls() {
+            const arr = []
+            this.urls.map((item, index) => {
+                // 限制最大展示数量
+                if (index + 1 <= this.maxCount) {
+                    // 计算该元素为第几个素组内
+                    const itemIndex = Math.floor(index / this.rowCount)
+                    // 判断对应的索引是否存在
+                    if (!arr[itemIndex]) {
+                        arr[itemIndex] = []
+                    }
+                    arr[itemIndex].push(item)
+                }
+            })
+            return arr
+        },
+        imageWidth() {
+            return uni.$u.addUnit(
+                this.urls.length === 1 ? this.singleWidth : this.multipleSize
+            )
+        },
+        imageHeight() {
+            return uni.$u.addUnit(
+                this.urls.length === 1 ? this.singleHeight : this.multipleSize
+            )
+        },
+        // 此变量无实际用途,仅仅是为了利用computed特性,让其在urls长度等变化时,重新计算图片的宽度
+        // 因为用户在某些特殊的情况下,需要让文字与相册的宽度相等,所以这里事件的形式对外发送
+        albumWidth() {
+            let width = 0
+            if (this.urls.length === 1) {
+                width = this.singleWidth
+            } else {
+                width =
+                    this.showUrls[0].length * this.multipleSize +
+                    this.space * (this.showUrls[0].length - 1)
+            }
+            this.$emit('albumWidth', width)
+            return width
+        }
+    },
+    methods: {
+        // 预览图片
+        onPreviewTap(url) {
+            const urls = this.urls.map((item) => {
+                return this.getSrc(item)
+            })
+            uni.previewImage({
+                current: url,
+                urls
+            })
+        },
+        // 获取图片的路径
+        getSrc(item) {
+            return uni.$u.test.object(item)
+                ? (this.keyName && item[this.keyName]) || item.src
+                : item
+        },
+        // 单图时,获取图片的尺寸
+        // 在小程序中,需要将网络图片的的域名添加到小程序的download域名才可能获取尺寸
+        // 在没有添加的情况下,让单图宽度默认为盒子的一定宽度(singlePercent)
+        getImageRect() {
+            const src = this.getSrc(this.urls[0])
+            uni.getImageInfo({
+                src,
+                success: (res) => {
+                    // 判断图片横向还是竖向展示方式
+                    const isHorizotal = res.width >= res.height
+                    this.singleWidth = isHorizotal
+                        ? this.singleSize
+                        : (res.width / res.height) * this.singleSize
+                    this.singleHeight = !isHorizotal
+                        ? this.singleSize
+                        : (res.height / res.width) * this.singleWidth
+                },
+                fail: () => {
+                    this.getComponentWidth()
+                }
+            })
+        },
+        // 获取组件的宽度
+        async getComponentWidth() {
+            // 延时一定时间,以获取dom尺寸
+            await uni.$u.sleep(30)
+            // #ifndef APP-NVUE
+            this.$uGetRect('.u-album__row').then((size) => {
+                this.singleWidth = size.width * this.singlePercent
+            })
+            // #endif
+
+            // #ifdef APP-NVUE
+            // 这里ref="u-album__row"所在的标签为通过for循环出来,导致this.$refs['u-album__row']是一个数组
+            const ref = this.$refs['u-album__row'][0]
+            ref &&
+                dom.getComponentRect(ref, (res) => {
+                    this.singleWidth = res.size.width * this.singlePercent
+                })
+            // #endif
+        }
+    }
+}
+</script>
+
+<style lang="scss" scoped>
+@import '../../libs/css/components.scss';
+
+.u-album {
+    @include flex(column);
+
+    &__row {
+        @include flex(row);
+        flex-wrap: wrap;
+
+        &__wrapper {
+            position: relative;
+
+            &__text {
+                position: absolute;
+                top: 0;
+                left: 0;
+                right: 0;
+                bottom: 0;
+                background-color: rgba(0, 0, 0, 0.3);
+                @include flex(row);
+                justify-content: center;
+                align-items: center;
+            }
+        }
+    }
+}
+</style>

+ 44 - 0
uni_modules/uview-ui/components/u-alert/props.js

@@ -0,0 +1,44 @@
+export default {
+    props: {
+        // 显示文字
+        title: {
+            type: String,
+            default: uni.$u.props.alert.title
+        },
+        // 主题,success/warning/info/error
+        type: {
+            type: String,
+            default: uni.$u.props.alert.type
+        },
+        // 辅助性文字
+        description: {
+            type: String,
+            default: uni.$u.props.alert.description
+        },
+        // 是否可关闭
+        closable: {
+            type: Boolean,
+            default: uni.$u.props.alert.closable
+        },
+        // 是否显示图标
+        showIcon: {
+            type: Boolean,
+            default: uni.$u.props.alert.showIcon
+        },
+        // 浅或深色调,light-浅色,dark-深色
+        effect: {
+            type: String,
+            default: uni.$u.props.alert.effect
+        },
+        // 文字是否居中
+        center: {
+            type: Boolean,
+            default: uni.$u.props.alert.center
+        },
+        // 字体大小
+        fontSize: {
+            type: [String, Number],
+            default: uni.$u.props.alert.fontSize
+        }
+    }
+}

+ 243 - 0
uni_modules/uview-ui/components/u-alert/u-alert.vue

@@ -0,0 +1,243 @@
+<template>
+	<u-transition
+	    mode="fade"
+	    :show="show"
+	>
+		<view
+		    class="u-alert"
+		    :class="[`u-alert--${type}--${effect}`]"
+		    @tap.stop="clickHandler"
+		    :style="[$u.addStyle(customStyle)]"
+		>
+			<view
+			    class="u-alert__icon"
+			    v-if="showIcon"
+			>
+				<u-icon
+				    :name="iconName"
+				    size="18"
+				    :color="iconColor"
+				></u-icon>
+			</view>
+			<view
+			    class="u-alert__content"
+			    :style="[{
+					paddingRight: closable ? '20px' : 0
+				}]"
+			>
+				<text
+				    class="u-alert__content__title"
+				    v-if="title"
+					:style="[{
+						fontSize: $u.addUnit(fontSize),
+						textAlign: center ? 'center' : 'left'
+					}]"
+				    :class="[effect === 'dark' ? 'u-alert__text--dark' : `u-alert__text--${type}--light`]"
+				>{{ title }}</text>
+				<text
+				    class="u-alert__content__desc"
+					v-if="description"
+					:style="[{
+						fontSize: $u.addUnit(fontSize),
+						textAlign: center ? 'center' : 'left'
+					}]"
+				    :class="[effect === 'dark' ? 'u-alert__text--dark' : `u-alert__text--${type}--light`]"
+				>{{ description }}</text>
+			</view>
+			<view
+			    class="u-alert__close"
+			    v-if="closable"
+			    @tap.stop="closeHandler"
+			>
+				<u-icon
+				    name="close"
+				    :color="iconColor"
+				    size="15"
+				></u-icon>
+			</view>
+		</view>
+	</u-transition>
+</template>
+
+<script>
+	import props from './props.js';
+	/**
+	 * Alert  警告提示
+	 * @description 警告提示,展现需要关注的信息。
+	 * @tutorial https://www.uviewui.com/components/alertTips.html
+	 * 
+	 * @property {String}			title       显示的文字 
+	 * @property {String}			type        使用预设的颜色  (默认 'warning' )
+	 * @property {String}			description 辅助性文字,颜色比title浅一点,字号也小一点,可选  
+	 * @property {Boolean}			closable    关闭按钮(默认为叉号icon图标)  (默认 false )
+	 * @property {Boolean}			showIcon    是否显示左边的辅助图标   ( 默认 false )
+	 * @property {String}			effect      多图时,图片缩放裁剪的模式  (默认 'light' )
+	 * @property {Boolean}			center		文字是否居中  (默认 false )
+	 * @property {String | Number}	fontSize    字体大小  (默认 14 )
+	 * @property {Object}			customStyle	定义需要用到的外部样式
+	 * @event    {Function}        click       点击组件时触发
+	 * @example  <u-alert :title="title"  type = "warning" :closable="closable" :description = "description"></u-alert>
+	 */
+	export default {
+		name: 'u-alert',
+		mixins: [uni.$u.mpMixin, uni.$u.mixin, props],
+		data() {
+			return {
+				show: true
+			}
+		},
+		computed: {
+			iconColor() {
+				return this.effect === 'light' ? this.type : '#fff'
+			},
+			// 不同主题对应不同的图标
+			iconName() {
+				switch (this.type) {
+					case 'success':
+						return 'checkmark-circle-fill';
+						break;
+					case 'error':
+						return 'close-circle-fill';
+						break;
+					case 'warning':
+						return 'error-circle-fill';
+						break;
+					case 'info':
+						return 'info-circle-fill';
+						break;
+					case 'primary':
+						return 'more-circle-fill';
+						break;
+					default: 
+						return 'error-circle-fill';
+				}
+			}
+		},
+		methods: {
+			// 点击内容
+			clickHandler() {
+				this.$emit('click')
+			},
+			// 点击关闭按钮
+			closeHandler() {
+				this.show = false
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/components.scss";
+
+	.u-alert {
+		position: relative;
+		background-color: $u-primary;
+		padding: 8px 10px;
+		@include flex(row);
+		align-items: center;
+		border-top-left-radius: 4px;
+		border-top-right-radius: 4px;
+		border-bottom-left-radius: 4px;
+		border-bottom-right-radius: 4px;
+
+		&--primary--dark {
+			background-color: $u-primary;
+		}
+
+		&--primary--light {
+			background-color: #ecf5ff;
+		}
+
+		&--error--dark {
+			background-color: $u-error;
+		}
+
+		&--error--light {
+			background-color: #FEF0F0;
+		}
+
+		&--success--dark {
+			background-color: $u-success;
+		}
+
+		&--success--light {
+			background-color: #f5fff0;
+		}
+
+		&--warning--dark {
+			background-color: $u-warning;
+		}
+
+		&--warning--light {
+			background-color: #FDF6EC;
+		}
+
+		&--info--dark {
+			background-color: $u-info;
+		}
+
+		&--info--light {
+			background-color: #f4f4f5;
+		}
+
+		&__icon {
+			margin-right: 5px;
+		}
+
+		&__content {
+			@include flex(column);
+			flex: 1;
+
+			&__title {
+				color: $u-main-color;
+				font-size: 14px;
+				font-weight: bold;
+				color: #fff;
+				margin-bottom: 2px;
+			}
+
+			&__desc {
+				color: $u-main-color;
+				font-size: 14px;
+				flex-wrap: wrap;
+				color: #fff;
+			}
+		}
+
+		&__title--dark,
+		&__desc--dark {
+			color: #FFFFFF;
+		}
+
+		&__text--primary--light,
+		&__text--primary--light {
+			color: $u-primary;
+		}
+
+		&__text--success--light,
+		&__text--success--light {
+			color: $u-success;
+		}
+
+		&__text--warning--light,
+		&__text--warning--light {
+			color: $u-warning;
+		}
+
+		&__text--error--light,
+		&__text--error--light {
+			color: $u-error;
+		}
+
+		&__text--info--light,
+		&__text--info--light {
+			color: $u-info;
+		}
+
+		&__close {
+			position: absolute;
+			top: 11px;
+			right: 10px;
+		}
+	}
+</style>

+ 52 - 0
uni_modules/uview-ui/components/u-avatar-group/props.js

@@ -0,0 +1,52 @@
+export default {
+    props: {
+        // 头像图片组
+        urls: {
+            type: Array,
+            default: uni.$u.props.avatarGroup.urls
+        },
+        // 最多展示的头像数量
+        maxCount: {
+            type: [String, Number],
+            default: uni.$u.props.avatarGroup.maxCount
+        },
+        // 头像形状
+        shape: {
+            type: String,
+            default: uni.$u.props.avatarGroup.shape
+        },
+        // 图片裁剪模式
+        mode: {
+            type: String,
+            default: uni.$u.props.avatarGroup.mode
+        },
+        // 超出maxCount时是否显示查看更多的提示
+        showMore: {
+            type: Boolean,
+            default: uni.$u.props.avatarGroup.showMore
+        },
+        // 头像大小
+        size: {
+            type: [String, Number],
+            default: uni.$u.props.avatarGroup.size
+        },
+        // 指定从数组的对象元素中读取哪个属性作为图片地址
+        keyName: {
+            type: String,
+            default: uni.$u.props.avatarGroup.keyName
+        },
+		// 头像之间的遮挡比例
+        gap: {
+            type: [String, Number],
+            validator(value) {
+                return value >= 0 && value <= 1
+            },
+            default: uni.$u.props.avatarGroup.gap
+        },
+		// 需额外显示的值
+		extraValue: {
+			type: [Number, String],
+			default: uni.$u.props.avatarGroup.extraValue
+		}
+    }
+}

+ 103 - 0
uni_modules/uview-ui/components/u-avatar-group/u-avatar-group.vue

@@ -0,0 +1,103 @@
+<template>
+	<view class="u-avatar-group">
+		<view
+		    class="u-avatar-group__item"
+		    v-for="(item, index) in showUrl"
+		    :key="index"
+		    :style="{
+				marginLeft: index === 0 ? 0 : $u.addUnit(-size * gap)
+			}"
+		>
+			<u-avatar
+			    :size="size"
+			    :shape="shape"
+			    :mode="mode"
+			    :src="$u.test.object(item) ? keyName && item[keyName] || item.url : item"
+			></u-avatar>
+			<view
+			    class="u-avatar-group__item__show-more"
+			    v-if="showMore && index === showUrl.length - 1 && (urls.length > maxCount || extraValue > 0)"
+				@tap="clickHandler"
+			>
+				<u--text
+				    color="#ffffff"
+				    :size="size * 0.4"
+				    :text="`+${extraValue || urls.length - showUrl.length}`"
+					align="center"
+					customStyle="justify-content: center"
+				></u--text>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import props from './props.js';
+	/**
+	 * AvatarGroup  头像组
+	 * @description 本组件一般用于展示头像的地方,如个人中心,或者评论列表页的用户头像展示等场所。
+	 * @tutorial https://www.uviewui.com/components/avatar.html
+	 * 
+	 * @property {Array}           urls     头像图片组 (默认 [] )
+	 * @property {String | Number} maxCount 最多展示的头像数量 ( 默认 5 )
+	 * @property {String}          shape    头像形状( 'circle' (默认) | 'square' )
+	 * @property {String}          mode     图片裁剪模式(默认 'scaleToFill' )
+	 * @property {Boolean}         showMore 超出maxCount时是否显示查看更多的提示 (默认 true )
+	 * @property {String | Number} size      头像大小 (默认 40 )
+	 * @property {String}          keyName  指定从数组的对象元素中读取哪个属性作为图片地址 
+	 * @property {String | Number} gap      头像之间的遮挡比例(0.4代表遮挡40%)  (默认 0.5 )
+	 * @property {String | Number} extraValue  需额外显示的值
+	 * @event    {Function}        showMore 头像组更多点击
+	 * @example  <u-avatar-group:urls="urls" size="35" gap="0.4" ></u-avatar-group:urls=>
+	 */
+	export default {
+		name: 'u-avatar-group',
+		mixins: [uni.$u.mpMixin, uni.$u.mixin, props],
+		data() {
+			return {
+
+			}
+		},
+		computed: {
+			showUrl() {
+				return this.urls.slice(0, this.maxCount)
+			}
+		},
+		methods: {
+			clickHandler() {
+				this.$emit('showMore')
+			}
+		},
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/components.scss";
+
+	.u-avatar-group {
+		@include flex;
+
+		&__item {
+			margin-left: -10px;
+			position: relative;
+
+			&--no-indent {
+				// 如果你想质疑作者不会使用:first-child,说明你太年轻,因为nvue不支持
+				margin-left: 0;
+			}
+
+			&__show-more {
+				position: absolute;
+				top: 0;
+				bottom: 0;
+				left: 0;
+				right: 0;
+				background-color: rgba(0, 0, 0, 0.3);
+				@include flex;
+				align-items: center;
+				justify-content: center;
+				border-radius: 100px;
+			}
+		}
+	}
+</style>

+ 78 - 0
uni_modules/uview-ui/components/u-avatar/props.js

@@ -0,0 +1,78 @@
+export default {
+    props: {
+        // 头像图片路径(不能为相对路径)
+        src: {
+            type: String,
+            default: uni.$u.props.avatar.src
+        },
+        // 头像形状,circle-圆形,square-方形
+        shape: {
+            type: String,
+            default: uni.$u.props.avatar.shape
+        },
+        // 头像尺寸
+        size: {
+            type: [String, Number],
+            default: uni.$u.props.avatar.size
+        },
+        // 裁剪模式
+        mode: {
+            type: String,
+            default: uni.$u.props.avatar.mode
+        },
+        // 显示的文字
+        text: {
+            type: String,
+            default: uni.$u.props.avatar.text
+        },
+        // 背景色
+        bgColor: {
+            type: String,
+            default: uni.$u.props.avatar.bgColor
+        },
+        // 文字颜色
+        color: {
+            type: String,
+            default: uni.$u.props.avatar.color
+        },
+        // 文字大小
+        fontSize: {
+            type: [String, Number],
+            default: uni.$u.props.avatar.fontSize
+        },
+        // 显示的图标
+        icon: {
+            type: String,
+            default: uni.$u.props.avatar.icon
+        },
+        // 显示小程序头像,只对百度,微信,QQ小程序有效
+        mpAvatar: {
+            type: Boolean,
+            default: uni.$u.props.avatar.mpAvatar
+        },
+        // 是否使用随机背景色
+        randomBgColor: {
+            type: Boolean,
+            default: uni.$u.props.avatar.randomBgColor
+        },
+        // 加载失败的默认头像(组件有内置默认图片)
+        defaultUrl: {
+            type: String,
+            default: uni.$u.props.avatar.defaultUrl
+        },
+        // 如果配置了randomBgColor为true,且配置了此值,则从默认的背景色数组中取出对应索引的颜色值,取值0-19之间
+        colorIndex: {
+            type: [String, Number],
+            // 校验参数规则,索引在0-19之间
+            validator(n) {
+                return uni.$u.test.range(n, [0, 19]) || n === ''
+            },
+            default: uni.$u.props.avatar.colorIndex
+        },
+        // 组件标识符
+        name: {
+            type: String,
+            default: uni.$u.props.avatar.name
+        }
+    }
+}

文件差异内容过多而无法显示
+ 172 - 0
uni_modules/uview-ui/components/u-avatar/u-avatar.vue


+ 54 - 0
uni_modules/uview-ui/components/u-back-top/props.js

@@ -0,0 +1,54 @@
+export default {
+    props: {
+        // 返回顶部的形状,circle-圆形,square-方形
+        mode: {
+            type: String,
+            default: uni.$u.props.backtop.mode
+        },
+        // 自定义图标
+        icon: {
+            type: String,
+            default: uni.$u.props.backtop.icon
+        },
+        // 提示文字
+        text: {
+            type: String,
+            default: uni.$u.props.backtop.text
+        },
+        // 返回顶部滚动时间
+        duration: {
+            type: [String, Number],
+            default: uni.$u.props.backtop.duration
+        },
+        // 滚动距离
+        scrollTop: {
+            type: [String, Number],
+            default: uni.$u.props.backtop.scrollTop
+        },
+        // 距离顶部多少距离显示,单位px
+        top: {
+            type: [String, Number],
+            default: uni.$u.props.backtop.top
+        },
+        // 返回顶部按钮到底部的距离,单位px
+        bottom: {
+            type: [String, Number],
+            default: uni.$u.props.backtop.bottom
+        },
+        // 返回顶部按钮到右边的距离,单位px
+        right: {
+            type: [String, Number],
+            default: uni.$u.props.backtop.right
+        },
+        // 层级
+        zIndex: {
+            type: [String, Number],
+            default: uni.$u.props.backtop.zIndex
+        },
+        // 图标的样式,对象形式
+        iconStyle: {
+            type: Object,
+            default: uni.$u.props.backtop.iconStyle
+        }
+    }
+}

+ 129 - 0
uni_modules/uview-ui/components/u-back-top/u-back-top.vue

@@ -0,0 +1,129 @@
+<template>
+	<u-transition
+	    mode="fade"
+	    :customStyle="backTopStyle"
+	    :show="show"
+	>
+		<view
+		    class="u-back-top"
+			:style="[contentStyle]"
+		    v-if="!$slots.default && !$slots.$default"
+			@click="backToTop"
+		>
+			<u-icon
+			    :name="icon"
+			    :custom-style="iconStyle"
+			></u-icon>
+			<text
+			    v-if="text"
+			    class="u-back-top__text"
+			>{{text}}</text>
+		</view>
+		<slot v-else />
+	</u-transition>
+</template>
+
+<script>
+	import props from './props.js';
+	// #ifdef APP-NVUE
+	const dom = weex.requireModule('dom')
+	// #endif
+	/**
+	 * backTop 返回顶部
+	 * @description 本组件一个用于长页面,滑动一定距离后,出现返回顶部按钮,方便快速返回顶部的场景。
+	 * @tutorial https://uviewui.com/components/backTop.html
+	 * 
+	 * @property {String}			mode  		返回顶部的形状,circle-圆形,square-方形 (默认 'circle' )
+	 * @property {String} 			icon 		自定义图标 (默认 'arrow-upward' ) 见官方文档示例
+	 * @property {String} 			text 		提示文字 
+	 * @property {String | Number}  duration	返回顶部滚动时间 (默认 100)
+	 * @property {String | Number}  scrollTop	滚动距离 (默认 0 )
+	 * @property {String | Number}  top  		距离顶部多少距离显示,单位px (默认 400 )
+	 * @property {String | Number}  bottom  	返回顶部按钮到底部的距离,单位px (默认 100 )
+	 * @property {String | Number}  right  		返回顶部按钮到右边的距离,单位px (默认 20 )
+	 * @property {String | Number}  zIndex 		层级   (默认 9 )
+	 * @property {Object<Object>}  	iconStyle 	图标的样式,对象形式   (默认 {color: '#909399',fontSize: '19px'})
+	 * @property {Object}			customStyle	定义需要用到的外部样式
+	 * 
+	 * @example <u-back-top :scrollTop="scrollTop"></u-back-top>
+	 */
+	export default {
+		name: 'u-back-top',
+		mixins: [uni.$u.mpMixin, uni.$u.mixin,props],
+		computed: {
+			backTopStyle() {
+				// 动画组件样式
+				const style = {
+					bottom: uni.$u.addUnit(this.bottom),
+					right: uni.$u.addUnit(this.right),
+					width: '40px',
+					height: '40px',
+					position: 'fixed',
+					zIndex: 10,
+				}
+				return style
+			},
+			show() {
+				return uni.$u.getPx(this.scrollTop) > uni.$u.getPx(this.top)
+			},
+			contentStyle() {
+				const style = {}
+				let radius = 0
+				// 是否圆形
+				if(this.mode === 'circle') {
+					radius = '100px'
+				} else {
+					radius = '4px'
+				}
+				// 为了兼容安卓nvue,只能这么分开写
+				style.borderTopLeftRadius = radius
+				style.borderTopRightRadius = radius
+				style.borderBottomLeftRadius = radius
+				style.borderBottomRightRadius = radius
+				return uni.$u.deepMerge(style, uni.$u.addStyle(this.customStyle))
+			}
+		},
+		methods: {
+			backToTop() {
+				// #ifdef APP-NVUE
+				if (!this.$parent.$refs['u-back-top']) {
+					uni.$u.error(`nvue页面需要给页面最外层元素设置"ref='u-back-top'`)
+				}
+				dom.scrollToElement(this.$parent.$refs['u-back-top'], {
+					offset: 0
+				})
+				// #endif
+				
+				// #ifndef APP-NVUE
+				uni.pageScrollTo({
+					scrollTop: 0,
+					duration: this.duration
+				});
+				// #endif
+				this.$emit('click')
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import '../../libs/css/components.scss';
+     $u-back-top-flex:1 !default;
+     $u-back-top-height:100% !default;
+     $u-back-top-background-color:#E1E1E1 !default;
+     $u-back-top-tips-font-size:12px !default;
+	.u-back-top {
+		@include flex;
+		flex-direction: column;
+		align-items: center;
+		flex:$u-back-top-flex;
+		height: $u-back-top-height;
+		justify-content: center;
+		background-color: $u-back-top-background-color;
+
+		&__tips {
+			font-size:$u-back-top-tips-font-size;
+			transform: scale(0.8);
+		}
+	}
+</style>

+ 72 - 0
uni_modules/uview-ui/components/u-badge/props.js

@@ -0,0 +1,72 @@
+export default {
+    props: {
+        // 是否显示圆点
+        isDot: {
+            type: Boolean,
+            default: uni.$u.props.badge.isDot
+        },
+        // 显示的内容
+        value: {
+            type: [Number, String],
+            default: uni.$u.props.badge.value
+        },
+        // 是否显示
+        show: {
+            type: Boolean,
+            default: uni.$u.props.badge.show
+        },
+        // 最大值,超过最大值会显示 '{max}+'
+        max: {
+            type: [Number, String],
+            default: uni.$u.props.badge.max
+        },
+        // 主题类型,error|warning|success|primary
+        type: {
+            type: String,
+            default: uni.$u.props.badge.type
+        },
+        // 当数值为 0 时,是否展示 Badge
+        showZero: {
+            type: Boolean,
+            default: uni.$u.props.badge.showZero
+        },
+        // 背景颜色,优先级比type高,如设置,type参数会失效
+        bgColor: {
+            type: [String, null],
+            default: uni.$u.props.badge.bgColor
+        },
+        // 字体颜色
+        color: {
+            type: [String, null],
+            default: uni.$u.props.badge.color
+        },
+        // 徽标形状,circle-四角均为圆角,horn-左下角为直角
+        shape: {
+            type: String,
+            default: uni.$u.props.badge.shape
+        },
+        // 设置数字的显示方式,overflow|ellipsis|limit
+        // overflow会根据max字段判断,超出显示`${max}+`
+        // ellipsis会根据max判断,超出显示`${max}...`
+        // limit会依据1000作为判断条件,超出1000,显示`${value/1000}K`,比如2.2k、3.34w,最多保留2位小数
+        numberType: {
+            type: String,
+            default: uni.$u.props.badge.numberType
+        },
+        // 设置badge的位置偏移,格式为 [x, y],也即设置的为top和right的值,absolute为true时有效
+        offset: {
+            type: Array,
+            default: uni.$u.props.badge.offset
+        },
+        // 是否反转背景和字体颜色
+        inverted: {
+            type: Boolean,
+            default: uni.$u.props.badge.inverted
+        },
+        // 是否绝对定位
+        absolute: {
+            type: Boolean,
+            default: uni.$u.props.badge.absolute
+        }
+    }
+}

+ 0 - 0
uni_modules/uview-ui/components/u-badge/u-badge.vue


部分文件因为文件数量过多而无法显示