“yst 4 yıl önce
ebeveyn
işleme
290c6b9c20
76 değiştirilmiş dosya ile 1474 ekleme ve 215 silme
  1. 9 8
      App.vue
  2. 6 0
      README.md
  3. 46 0
      components/tm-button/tm-button.vue
  4. 120 0
      components/tm-steps/tm-steps.vue
  5. 151 0
      components/tm-tabbar/tm-tabbar.vue
  6. 141 0
      components/tm-trees/row.vue
  7. 64 0
      components/tm-trees/tm-trees.vue
  8. 124 0
      components/uni-segmented-control/uni-segmented-control.vue
  9. BIN
      down.-icon.png
  10. 2 0
      main.js
  11. 89 111
      manifest.json
  12. 8 13
      package-lock.json
  13. 2 3
      package.json
  14. 32 18
      pages.json
  15. 43 0
      pages/creatingSituations/components/condition.vue
  16. 91 0
      pages/creatingSituations/components/theme.vue
  17. 37 0
      pages/creatingSituations/creatingSituations.vue
  18. 43 10
      pages/index/index.vue
  19. 0 14
      pages/index/model.js
  20. 0 16
      pages/index/server.js
  21. 156 0
      pages/mission-details/mission-details.vue
  22. 149 0
      pages/mission/components/mission-list/list-item.vue
  23. 96 0
      pages/mission/components/mission-list/mission-list.vue
  24. 33 0
      pages/mission/mission.vue
  25. 1 3
      pages/model.js
  26. BIN
      static/check-checkbox.png
  27. BIN
      static/check-no.png
  28. BIN
      static/check-radio.png
  29. BIN
      static/child.png
  30. BIN
      static/disabled-bg.png
  31. BIN
      static/down-ion.png
  32. BIN
      static/gean.png
  33. BIN
      static/hight-bg.png
  34. BIN
      static/icon上移.png
  35. BIN
      static/icon上移(禁用).png
  36. BIN
      static/icon下移.png
  37. BIN
      static/icon下移(禁用).png
  38. BIN
      static/icon删除.png
  39. BIN
      static/icon启用.png
  40. BIN
      static/icon地点.png
  41. BIN
      static/icon地点(禁用).png
  42. BIN
      static/icon新增.png
  43. BIN
      static/icon新增(禁用).png
  44. BIN
      static/icon禁用.png
  45. BIN
      static/location-icon.png
  46. BIN
      static/mission/上传图片.png
  47. BIN
      static/mission/多选-已选状态.png
  48. BIN
      static/mission/导航栏返回.png
  49. BIN
      static/mission/消息中心已读.png
  50. BIN
      static/mission/消息中心未读.png
  51. BIN
      static/mission/蓝色更多.png
  52. BIN
      static/parent-close.png
  53. BIN
      static/parent-open.png
  54. BIN
      static/search-icon.png
  55. BIN
      static/steps-over.png
  56. BIN
      static/tabbar/calendar-select.png
  57. BIN
      static/tabbar/calendar-unselect.png
  58. BIN
      static/tabbar/creatingSituations-select.png
  59. BIN
      static/tabbar/creatingSituations-unselect.png
  60. BIN
      static/tabbar/mission-select.png
  61. BIN
      static/tabbar/mission-unselect.png
  62. BIN
      static/tabbar/my-select.png
  63. BIN
      static/tabbar/my-unselect.png
  64. BIN
      static/tabbar/setting-select.png
  65. BIN
      static/tabbar/setting-unselect.png
  66. BIN
      static/up-icon.png
  67. BIN
      static/xitong.png
  68. BIN
      static/主题勾选.png
  69. BIN
      static/导航栏返回.png
  70. BIN
      static/查看更多_.png
  71. BIN
      static/禁用标志.png
  72. BIN
      static/绿色角标.png
  73. BIN
      static/蓝色勾选.png
  74. BIN
      static/蓝色查看更多_.png
  75. 21 19
      uni.scss
  76. 10 0
      utils/compatible.js

+ 9 - 8
App.vue

@@ -2,13 +2,13 @@
 	export default {
 		onLaunch: function() {
 			// console.log("App Launch");
-			this.checkArguments(); // 检测启动参数
-			if (uni.getSystemInfoSync().platform == 'android') {
-				// 重点是以下: 一定要监听后台恢复 !一定要
-				plus.globalEvent.addEventListener('newintent', e => {
-					this.checkArguments(); // 检测启动参数
-				});
-			}
+			// this.checkArguments(); // 检测启动参数
+			// if (uni.getSystemInfoSync().platform == 'android') {
+			// 	// 重点是以下: 一定要监听后台恢复 !一定要
+			// 	plus.globalEvent.addEventListener('newintent', e => {
+			// 		this.checkArguments(); // 检测启动参数
+			// 	});
+			// }
 		},
 		onShow: function() {
 			// console.log("App Show");
@@ -36,6 +36,7 @@
 
 <style lang="less">
 	/*每个页面公共css */
+	
 	body,
 	uni-app,
 	uni-page,
@@ -45,7 +46,7 @@
 		font-size: 12.5rpx;
 		line-height: 18.75rpx;
 	}
-
+	
 	view,
 	label,
 	scroll-view {

+ 6 - 0
README.md

@@ -2,6 +2,12 @@
 ---
 1. 公共样式写在App.vue;
 
+### 公共组件说明:
+---
+1. 步骤条:tm-steps,详细传参说明在组件内部。
+2. 树形控件:tm-trees。
+3. 底部tabBar:tm-tabbar。
+
 ### 公共组件的注册方式 
 ---
  1. 在main.js中全局注册;

+ 46 - 0
components/tm-button/tm-button.vue

@@ -0,0 +1,46 @@
+<template>
+	<view :class="['tm-button-container', true ? 'pramary' : '']">
+		<text class="btn-text">确定</text>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				
+			}
+		},
+		methods: {
+			
+		}
+	}
+</script>
+
+<style lang="less">
+	.tm-button-container {
+		display: flex;
+		justify-content: center;
+		align-items: center;
+		width: 312.5rpx;
+		height: 62.5rpx;
+		background: #3377FF;
+		border-radius: 37.5rpx;
+		border: 1.25rpx solid #3377FF;
+		
+		.btn-text {
+			font-size: 22.5rpx;
+			letter-spacing: 2.5rpx;
+			color: #fff;
+		}
+	}
+	
+	.tm-button-container.pramary {
+		background-color: #FFFFFF;
+		 
+		 .btn-text {
+		 	color: #3377FF;
+		 }
+	}
+
+</style>

+ 120 - 0
components/tm-steps/tm-steps.vue

@@ -0,0 +1,120 @@
+<template>
+	<view class="tm-steps">
+		<view class="tm-steps-top">
+			<view class="item" v-for="(item, index) in options" 
+				:style="{flex: index === 0 ? 'none' : 1}" 
+				:class="{active: active === index, over: active > index}"
+				:key="index">
+				<view class="line" v-if="index !== 0"></view>
+				<view class="content">
+					<view class="content-top">
+						<image v-if="active > index" 
+							src="../../static/steps-over.png"></image>
+						<view v-else>{{ index + 1 }}</view>
+					</view>
+					<text>{{ item.title }}</text>
+				</view>
+			</view>
+		</view>
+		<scroll-view scroll-y="true" class="component-wrap">
+			<component v-bind:is="options[active].component"></component>
+		</scroll-view>
+	</view>
+</template>
+
+<script>
+	/**
+	 * 步骤条
+	 * 参数说明:
+	 * options:{
+		 * title: '显示的文字',
+		 * component: '内容组件(传组件对象或者全局注册过的组件名)'
+		}
+	 * active:当前进度,从0开始
+	 */
+	export default {
+		props: ['options', 'active']
+	}
+</script>
+
+<style lang="less">
+	.tm-steps {
+		display: flex;
+		flex-direction: column;
+		width: 100%;
+		height: 100%;
+		
+		.tm-steps-top {
+			display: flex;
+			flex-direction: row;
+			justify-content: space-between;
+			align-items: center;
+			margin: 37.5rpx 25rpx 50rpx 25rpx;
+			
+			.item {
+				display: flex;
+				flex: 1;
+				flex-direction: row;
+				justify-content: flex-end;
+				font-size: 17.5rpx;
+				line-height: 26.25rpx;
+				color: #B8BFCC;
+				
+				.content {
+					display: flex;
+					flex-direction: column;
+					justify-content: center;
+					align-items: center;
+					margin: 0 18.75rpx;
+					min-width: 37.5rpx;
+					
+					text {
+						white-space: nowrap;
+					}
+					.content-top {
+						margin-bottom: 10rpx;
+						width: 37.5rpx;
+						height: 37.5rpx;
+						line-height: 37.5rpx;
+						text-align: center;
+						
+						view {
+							border-radius: 50%;
+							color: #fff;
+							background-color: #B8BECC;
+						}
+						image {
+							width: 100%;
+							height: 100%;
+						}
+					}
+				}
+				.line {
+					margin-top: 18.12rpx;
+					height: 1.25rpx;
+					width: 100%;
+					background-color: #B8BECC;
+				}
+				&.active {
+					color: #3377FF;
+					.content .content-top view {
+						background-color: #3377FF;
+					}
+					.line {
+						background-color: #3377FF;
+					}
+				}
+				&.over {
+					color: #292C33;
+					.line {
+						background-color: #3377FF;
+					}
+				}
+			}
+		}
+		.component-wrap {
+			width: 100%;
+			height: calc(100% - 101.87rpx);
+		}
+	}
+</style>

+ 151 - 0
components/tm-tabbar/tm-tabbar.vue

@@ -0,0 +1,151 @@
+<template>
+	<view class="tm-tabbar">
+		<template v-for="item in rolToTabBars">
+			<view 
+			  :class="{'tab-item': true, active: item.pagePath === currentPagePath}" 
+			 :key="item.text"
+			 @click="navigateTo(item.pagePath)" >
+				<image 
+				  class="icon" 
+				  :src="item.pagePath === currentPagePath 
+					  ? item.selectedIconPath 
+						: item.iconPath"
+				></image>
+				<text>{{ item.text }}</text>
+			</view>
+		</template>
+	</view>
+</template>
+
+<script>
+	/**
+	 * 底部tabBar
+	 * 芦荟
+	 * 2021.2.1
+	 * props: {
+		 * permission:对应的角色(权限)(1、管理员 2、查核组长 3、查核组员 4、单位负责人 5、改善者)
+		 * }
+	 */
+	export default {
+		props: {
+			// 对应的角色(权限)(1、管理员 2、查核组长 3、查核组员 4、单位负责人 5、改善者)
+			permission: {
+				type: Number,
+				default: () => 0
+			}
+		},
+		data() {
+			return {
+				// 当前路由地址
+				currentPagePath: '', 
+				// tabbar列表(这是最全的)
+				tabBarList: [
+					{
+						text: '情境', // tab上按钮文字
+						iconPath: '/static/tabbar/creatingSituations-unselect.png', // 图片路径
+						selectedIconPath: '/static/tabbar/creatingSituations-select.png', // 选中时的图片路径
+						pagePath: 'pages/creatingSituations/creatingSituations' // 页面路径
+					},{
+						text: '任务', 
+						iconPath: '/static/tabbar/mission-unselect.png', 
+						selectedIconPath: '/static/tabbar/mission-select.png', 
+						pagePath: 'pages/mission/mission'
+					},{
+						text: '配置', 
+						iconPath: '/static/tabbar/setting-unselect.png', 
+						selectedIconPath: '/static/tabbar/setting-select.png', 
+						pagePath: 'pages/index/index'
+					},{
+						text: '我的', 
+						iconPath: '/static/tabbar/my-unselect.png', 
+						selectedIconPath: '/static/tabbar/my-select.png', 
+						pagePath: 'pages/index/index'
+					},{
+						text: '日历', 
+						iconPath: '/static/tabbar/calendar-unselect.png', 
+						selectedIconPath: '/static/tabbar/calendar-select.png', 
+						pagePath: 'pages/index/index'
+					}
+				],
+				// 不同角色的拥有 tabbar下标(1、管理员 2、查核组长 3、查核组员 4、单位负责人 5、改善者)
+				rolList: [
+					{permission: 1, name: '管理员', tabBarIndexs: [0, 1, 2, 3]}, // tabBarIndexs:tabBarList种对应的下标
+					{permission: 2, name: '查核组长', tabBarIndexs: [0, 4, 3]},
+					{permission: 3, name: '查核组员', tabBarIndexs: [0, 4, 3]},
+					{permission: 4, name: '单位负责人', tabBarIndexs: [0, 1, 3]},
+					{permission: 5, name: '改善者', tabBarIndexs: [1, 3]}
+				]
+			}
+		},
+		computed:{
+			rolToTabBars() {
+				if(this.permission == 0) {
+					return []
+				}else {
+					let current = this.rolList.find(item => item.permission == this.permission) || {};
+					if(current){
+						let tabBars = [];
+					  current.tabBarIndexs.map(index => {
+							tabBars.push(this.tabBarList[index]);
+						});
+						return tabBars;
+					}else {
+						return [];
+					}
+					return []
+				}
+			}
+		},
+		created(){
+			let routes = getCurrentPages()
+      this.currentPagePath = routes[routes.length - 1].route;
+		},
+		methods: {
+			// 路由跳转
+			navigateTo(pagePath){
+				this.currentPagePath = pagePath;
+				uni.navigateTo({
+				  url: `/${pagePath}`
+				});
+			}
+		}
+	}
+</script>
+
+<style lang="less">
+	.tm-tabbar {
+		position: fixed;
+		left: 0;
+		bottom: 0;
+		display: flex;
+		width: 100%; 
+		height: 87.5rpx;
+		border-top: 0.62rpx solid #DADEE6;
+		background-color: #fff;
+		
+		.tab-item {
+			display: flex;
+			flex-direction: column;
+			justify-content: center;
+			align-items: center;
+			flex: 1;
+			
+			.icon {
+				margin-bottom: 10rpx;
+				width: 27.5rpx;
+				height: 28.75rpx;
+			}
+			
+			>text {
+				font-size: 15rpx;
+				color: #3D424D;
+			}
+		}
+		
+		.active.tab-item {
+			>text {
+				color: #3377FF;
+			}
+		}
+	}
+</style>

+ 141 - 0
components/tm-trees/row.vue

@@ -0,0 +1,141 @@
+<template>
+	<view class="row">
+		<view class="content-wrap" @click="rowClick">
+			<view class="left">
+				<view>
+					<image class="left-icon" 
+						:style="{width: hasChildren ? '25rpx' : '20rpx'}"
+						:src="`../../static/${leftIcon}.png`"></image>
+				</view>
+				<text>{{ option.label }}</text>
+			</view>
+			<view v-if="!hasChildren" class="right" @click="checkedHandle">
+				<image :src="`../../static/${rightIcon}.png`"></image>
+			</view>
+		</view>
+		<view class="children-wrap" v-if="open">
+			<tm-trees-row v-for="(item,index) in option.children" 
+				:option="item" 
+				:openKeys="openKeys"
+				:checkedKeys="checkedKeys"
+				v-on:open-keys="openKeysHandle"
+				v-on:checked-keys="checkedKeysHandle"
+				:key="index"/>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {_stopPropagation} from "../../utils/compatible.js";
+	
+	export default {
+		data() {
+			return {}
+		},
+		props: ['option', 'openKeys', 'checkedKeys'],
+		computed: {
+			hasChildren: function() {
+				return this.option.children && this.option.children.length > 0;
+			},
+			open: function() {
+				return this.hasChildren && this.openKeys.includes(this.option.key);
+			},
+			checked: function() {
+				return this.checkedKeys.includes(this.option.key);
+			},
+			leftIcon: function() {
+				let iconName = 'parent-open';
+				if(this.hasChildren) {
+					if(this.open) {
+						iconName = 'parent-close';
+					}
+				} else {
+					iconName = 'child'
+				}
+				return iconName;
+			},
+			rightIcon: function() { 
+				return this.checked ? 'check-checkbox' : 'check-no';
+			}
+		},
+		methods: {
+			rowClick: function() {
+				if(!this.hasChildren) return;
+				this.openKeysHandle(this.keysHandle(this.open, this.openKeys));
+			},
+			checkedHandle: function(e) {
+				_stopPropagation(e);
+				this.checkedKeysHandle(this.keysHandle(this.checked, this.checkedKeys));
+			},
+			keysHandle: function(condition, oldKeys) {
+				let keys = [];
+				if(condition) {
+					keys = oldKeys.filter((key)=> key !== this.option.key);
+				} else {
+					keys = [...oldKeys, this.option.key];
+				}
+				return keys;
+			},
+			openKeysHandle: function(arr) {
+				this.$emit('open-keys', arr);
+			},
+			checkedKeysHandle: function(arr) {
+				this.$emit('checked-keys', arr);
+			}
+		}
+	}
+</script>
+
+<style lang="less">
+	.row {
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+		padding-left: 25rpx;
+		width: 100%;
+		background-color: #fff;
+		
+		.content-wrap {
+			display: flex;
+			flex-direction: row;
+			justify-content: space-between;
+			align-items: center;
+			border-bottom: 0.62rpx solid #DADEE6;
+			width: 100%;
+			height: 87.5rpx;
+			font-size: 22.5rpx;
+			line-height: 33.75rpx;
+			color: #292C33;
+			
+			.left {
+				display: flex;
+				flex-direction: row;
+				align-items: center;
+				view {
+					margin-right: 20rpx;
+					height: 28rpx;
+					image {
+						width: 25rpx;
+						height: 22.5rpx;
+					}
+				}
+			}
+			.right {
+				display: flex;
+				flex-direction: row;
+				justify-content: center;
+				align-items: center;
+				width: 87.5rpx;
+				height: 87.5rpx;
+				image {
+					width: 25rpx;
+					height: 25rpx;
+				}
+			}
+		}
+		.children-wrap {
+			width: 100%;
+			padding-left: 77.5rpx;
+		}
+	}
+</style>

+ 64 - 0
components/tm-trees/tm-trees.vue

@@ -0,0 +1,64 @@
+<template>
+	<view class="tm-trees">
+		<tm-trees-row v-for="(item,index) in options" 
+			:option="item" 
+			:openKeys="openKeys"
+			:checkedKeys="checkedKeys"
+			v-on:open-keys="openKeysHandle"
+			v-on:checked-keys="checkedKeysHandle"
+			:key="index"/>
+	</view>
+</template>
+
+<script>
+	/**
+	 * 树形控件,支持多选
+	 * 千里及
+	 * 2021.2.1
+	 * props: {
+		 * options:树节点数据,
+		 * defaultOpen:默认展开的项(节点key),
+		 * defaultChecked:默认选中的项(节点key),
+		 * open-keys:展开事件监听,会返回展开项的key,
+		 * checked-keys:选中事件监听,返回选中项的key
+		 * }
+	 */
+	export default {
+		data() {
+			return {
+				openKeys: [],
+				checkedKeys: []
+			};
+		},
+		props: ['options', 'defaultOpen', 'defaultChecked'],
+		created:function(){
+			this.openKeys = this.defaultOpen || [];
+			this.checkedKeys = this.defaultChecked || [];
+		},
+		watch: {
+			defaultOpen: function(open) {
+				this.openKeys = open;
+			},
+			defaultChecked: function(checked) {
+				this.checkedKeys = checked;
+			}
+		},
+		methods: {
+			openKeysHandle: function(keys) {
+				this.openKeys = keys;
+				this.$emit('open-keys', keys);
+			},
+			checkedKeysHandle: function(keys) {
+				this.checkedKeys = keys;
+				this.$emit('checked-keys', keys);
+			}
+		}
+	}
+</script>
+
+<style lang="less">
+	.tm-trees {
+		width: 100%;
+		height: 100%;
+	}
+</style>

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

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

BIN
down.-icon.png


+ 2 - 0
main.js

@@ -3,11 +3,13 @@ import App from './App'
 import { store } from './store/index.js';
 import dateTimePickGroup from './components/date-time-pick-group/date-time-pick-group.vue';
 import dateTimePick from './components/date-time-pick/date-time-pick.vue';
+import row from "./components/tm-trees/row.vue";
 
 Vue.config.productionTip = false;
 Vue.prototype.$store = store;
 Vue.component('com-date-pick-group', dateTimePickGroup);
 Vue.component('com-date-time-pick', dateTimePick);
+Vue.component('tm-trees-row', row);
 
 App.mpType = 'app'
 

+ 89 - 111
manifest.json

@@ -1,113 +1,91 @@
 {
-    "name" : "TracerMethodology",
-    "appid" : "__UNI__050063B",
-    "description" : "",
-    "versionName" : "1.0.0",
-    "versionCode" : "100",
-    "transformPx" : false,
-    /* 5+App特有相关 */
-    "app-plus" : {
-        "usingComponents" : true,
-        "nvueCompiler" : "uni-app",
-        "compilerVersion" : 3,
-        "splashscreen" : {
-            "alwaysShowBeforeRender" : true,
-            "waiting" : true,
-            "autoclose" : true,
-            "delay" : 0
-        },
-        /* 模块配置 */
-        "modules" : {},
-        /* 应用发布信息 */
-        "distribute" : {
-            /* android打包配置 */
-            "android" : {
-                "permissions" : [
-                    "<uses-feature android:name=\"android.hardware.camera\"/>",
-                    "<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
-                    "<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\"/>",
-                    "<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\"/>",
-                    "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
-                    "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
-                    "<uses-permission android:name=\"android.permission.CALL_PHONE\"/>",
-                    "<uses-permission android:name=\"android.permission.CAMERA\"/>",
-                    "<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
-                    "<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
-                    "<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
-                    "<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
-                    "<uses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\"/>",
-                    "<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
-                    "<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
-                    "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
-                    "<uses-permission android:name=\"android.permission.RECORD_AUDIO\"/>",
-                    "<uses-permission android:name=\"android.permission.VIBRATE\"/>",
-                    "<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
-                    "<uses-permission android:name=\"android.permission.WRITE_CONTACTS\"/>",
-                    "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
-                ],
-                "abiFilters" : [ "armeabi-v7a", "x86" ]
-            },
-            /* ios打包配置 */
-            "ios" : {},
-            /* SDK配置 */
-            "sdkConfigs" : {
-                "ad" : {}
-            }
-        }
-    },
-    /* 快应用特有相关 */
-    "quickapp" : {},
-    /* 小程序特有相关 */
-    "mp-weixin" : {
-        "appid" : "",
-        "setting" : {
-            "urlCheck" : false
-        },
-        "usingComponents" : true
-    },
-    "mp-alipay" : {
-        "usingComponents" : true
-    },
-    "mp-baidu" : {
-        "usingComponents" : true
-    },
-    "mp-toutiao" : {
-        "usingComponents" : true
-    },
-    "uniStatistics" : {
-        "enable" : false
-    },
-    "h5" : {
-        "title" : "护士端",
-        "router" : {
-            "mode" : "hash",
-            "base" : "/TracerMethodology/"
-        },
-        "devServer" : {
-            "port" : 8901,
-            "headers" : {
-                "Access-Control-Allow-Origin" : "*"
-            },
-            "proxy" : {
-                "/TracerMethodology/api/*" : {
-                    "pathRewrite" : {
-                        "^/TracerMethodology/api" : "/topro"
-                    },
-                    // "target" : "http://192.168.1.55:8901", // 内网
-                    "target" : "http://192.168.1.45:8088", // 内网
-                    "changeOrigin" : true,
-                    "secure" : false,
-                    "logLevel" : "debug"
-                }
-            }
-        },
-        "optimization" : {
-            "treeShaking" : {
-                "enable" : true
-            }
-        },
-        "networkTimeout" : {
-            "request" : 5000
-        }
-    }
+	"name" : "TracerMethodology",
+	"appid" : "__UNI__E410614",
+	"description": "",
+	"versionName": "1.0.0",
+	"versionCode": "100",
+	"transformPx": false,
+	"app-plus": { /* 5+App特有相关 */
+		"usingComponents": true,
+		"nvueCompiler": "uni-app",
+		"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打包配置 */
+
+			},
+			"sdkConfigs": { /* SDK配置 */
+
+			}
+		}
+	},
+	"quickapp": { /* 快应用特有相关 */
+
+	},
+	"mp-weixin": { /* 小程序特有相关 */
+		"appid": "",
+		"setting": {
+			"urlCheck": false
+		},
+		"usingComponents": true
+	},
+	"h5" : {
+	    "title" : "追踪方法学",
+	    "router" : {
+	        "mode" : "hash",
+	        "base" : "/TracerMethodology/"
+	    },
+	    "devServer" : {
+	        "port" : 8901,
+	        "headers" : {
+	            "Access-Control-Allow-Origin" : "*"
+	        },
+	        "proxy" : {
+	            "/TracerMethodology/api/*" : {
+	                "pathRewrite" : {
+	                    "^/TracerMethodology/api" : "/topro"
+	                },
+	                // "target" : "http://192.168.1.55:8901", // 内网
+	                "target" : "http://192.168.1.45:8088", // 内网
+	                "changeOrigin" : true,
+	                "secure" : false,
+	                "logLevel" : "debug"
+	            }
+	        }
+	    },
+	    "optimization" : {
+	        "treeShaking" : {
+	            "enable" : true
+	        }
+	    },
+	    "networkTimeout" : {
+	        "request" : 5000
+	    }
+	}
 }

+ 8 - 13
package-lock.json

@@ -1,5 +1,5 @@
 {
-  "name": "web_TracerMethodology",
+  "name": "web_tracermethodology",
   "version": "1.0.0",
   "lockfileVersion": 1,
   "requires": true,
@@ -11,23 +11,18 @@
     },
     "moment": {
       "version": "2.29.1",
-      "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz",
-      "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ=="
+      "resolved": "https://registry.npm.taobao.org/moment/download/moment-2.29.1.tgz",
+      "integrity": "sha1-sr52n6MZQL6e7qZGnAdeNQBvo9M="
     },
     "qs": {
       "version": "6.9.6",
-      "resolved": "https://registry.npm.taobao.org/qs/download/qs-6.9.6.tgz?cache=0&sync_timestamp=1610598122721&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fqs%2Fdownload%2Fqs-6.9.6.tgz",
-      "integrity": "sha1-Ju08gkOkMbKSSsqEzJBHHzXVoO4="
-    },
-    "uview-ui": {
-      "version": "1.8.3",
-      "resolved": "https://registry.npm.taobao.org/uview-ui/download/uview-ui-1.8.3.tgz",
-      "integrity": "sha1-wmAqa/ez7vYD/WMpWes0UK1KC5s="
+      "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz",
+      "integrity": "sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ=="
     },
     "vuex": {
-      "version": "3.6.0",
-      "resolved": "https://registry.npmjs.org/vuex/-/vuex-3.6.0.tgz",
-      "integrity": "sha512-W74OO2vCJPs9/YjNjW8lLbj+jzT24waTo2KShI8jLvJW8OaIkgb3wuAMA7D+ZiUxDOx3ubwSZTaJBip9G8a3aQ=="
+      "version": "3.6.2",
+      "resolved": "https://registry.npmjs.org/vuex/-/vuex-3.6.2.tgz",
+      "integrity": "sha512-ETW44IqCgBpVomy520DT5jf8n0zoCac+sxWnn+hMe/CzaSejb/eVw2YToiXYX+Ex/AuHHia28vWTq4goAexFbw=="
     }
   }
 }

+ 2 - 3
package.json

@@ -1,13 +1,12 @@
 {
-  "name": "web_TracerMethodology",
+  "name": "web_tracermethodology",
   "version": "1.0.0",
-  "description": "---\r 1. 公共样式写在App.vue;\r 2. 【pages/index】是公共页,包括左侧信息栏、顶部导航栏、添加按钮,也是所有页面的入口。",
+  "description": "",
   "main": "main.js",
   "dependencies": {
     "crypto-js": "^4.0.0",
     "moment": "^2.29.1",
     "qs": "^6.9.6",
-    "uview-ui": "^1.8.3",
     "vuex": "^3.6.0"
   },
   "devDependencies": {},

+ 32 - 18
pages.json

@@ -1,30 +1,44 @@
 {
-	"pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
+	"pages": [
+		{
+			"path": "pages/index/index",
+			"style": {
+				"navigationBarTitleText": "追踪方法学"
+			}
+		},
 		{
 			"path": "pages/login/login"
-
 		},
 		{
-			"path": "pages/index/index"
+			"path": "pages/creatingSituations/creatingSituations",
+			"style": {
+				"navigationBarTitleText": "创建情境",
+				"enablePullDownRefresh": false
+			}
+		},
+		{
+			"path": "pages/mission/mission",
+			"style": {
+				"navigationBarTitleText": "任务",
+				"enablePullDownRefresh": false
+			}
+		},
+		{
+			"path": "pages/mission-details/mission-details",
+			"style": {
+				"navigationBarTitleText": "改善任务",
+				"enablePullDownRefresh": false
+			}
 		}
-
 	],
 	"globalStyle": {
+		"navigationBarTextStyle": "black",
 		"navigationBarTitleText": "追踪方法学",
-		"navigationStyle": "custom",
-		"style": {
-			"app-plus": {
-				"background": "#2D43B3"
-			}
+		"navigationBarBackgroundColor": "#F8F8F8",
+		"backgroundColor": "#F8F8F8",
+		"app-plus": {
+			"background": "#efeff4"
 		},
 		"rpxCalcMaxDeviceWidth": 9999
-	},
-	"condition": { //模式配置,仅开发期间生效
-		"current": 0, //当前激活的模式(list 的索引项)
-		"list": [{
-			"name": "开发模式", //模式名称
-			"path": "pages/index/index", //启动页面,必选
-			"query": "" //启动参数,在页面的onLoad函数里面得到
-		}]
 	}
-}
+}

+ 43 - 0
pages/creatingSituations/components/condition.vue

@@ -0,0 +1,43 @@
+<template>
+	<view class="condition">
+		
+		<tm-trees :options="options"
+		 :defaultOpen="defaultOpen" 
+		 :defaultChecked="defaultChecked"
+		 v-on:checked-keys="checkedHandle"></tm-trees>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				options: [
+					{key: 'zhuyuan',label: '住院', children: [
+						{key: 'ICU',label: 'ICU', children: []},
+						{key: 'RCC',label: 'RCC', children: []},
+						{key: 'shengchan',label: '生产', children: [{
+							key: 'ziranchan',label: '自然产'
+						}]},
+					]},{key: 'zhuyuan',label: '住院', children: [
+						{key: 'ICU',label: 'ICU', children: []},
+						{key: 'RCC',label: 'RCC', children: []},
+						{key: 'shengchan',label: '生产', children: [{
+							key: 'ziranchan',label: '自然产'
+						}]},
+					]}
+				],
+				defaultOpen: ['zhuyuan'],
+				defaultChecked: ['ICU']
+			}
+		},
+		methods: {
+			checkedHandle: function(keys) {
+				console.log(keys);
+			}
+		}
+	}
+</script>
+
+<style lang="less">
+</style>

+ 91 - 0
pages/creatingSituations/components/theme.vue

@@ -0,0 +1,91 @@
+<template>
+	<view class="theme">
+		<text class="title">请先选定一个主题进行追踪</text>
+		<view class="content">
+			<view class="item">
+				<view class="left">
+					<image src="../../../static/gean.png"></image>
+				</view>
+				<view class="right">
+					<text>个案追踪</text>
+					<text>评价诊疗服务的内涵质量以及对各种诊疗规范、临床路径等的执行力</text>
+				</view>
+			</view>
+			<view class="item">
+				<view class="left">
+					<image src="../../../static/xitong.png"></image>
+				</view>
+				<view class="right">
+					<text>系统追踪</text>
+					<text>评价对各种质量与安全管理制度与流程的执行力、医院服务的连贯性及多学科综合的服务能力</text>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				
+			}
+		}
+	}
+</script>
+
+<style lang="less">
+	.theme {
+		width: 100%;
+		.title {
+			padding-left: 25rpx;
+			font-size: 30rpx;
+			line-height: 45rpx;
+			color: #292C33;
+		}
+		.content {
+			display: flex;
+			flex-direction: column;
+			align-items: center;
+			margin-top: 25rpx;
+			.item {
+				display: flex;
+				flex-direction: row;
+				margin-top: 125rpx;
+				border-radius: 15rpx;
+				padding: 37.5rpx 50rpx;
+				width: 625rpx;
+				height: 187.5rpx;
+				background: linear-gradient(270deg, #00CCBB 0%, #00CCAA 100%);
+				box-shadow: 0 12.5rpx 12.5rpx 0 rgba(0, 204, 170, 0.2);
+				
+				.left {
+					margin-right: 25rpx;
+					image {
+						width: 112.5rpx;
+						height: 112.5rpx;
+					}
+				}
+				.right {
+					display: flex;
+					flex-direction: column;
+					text {
+						font-size: 17.5rpx;
+						line-height: 25rpx;
+						color: #fff;
+						&:first-child {
+							margin-bottom: 5rpx;
+							font-size: 30rpx;
+							font-weight: bold;
+							line-height: 45rpx;
+						}
+					}
+				}
+				&:last-child {
+					background: linear-gradient(270deg, #6697FE 0%, #4980F2 100%);
+					box-shadow: 0 12.5rpx 12.5rpx 0 rgba(73, 128, 242, 0.2);
+				}
+			}
+		}
+	}
+</style>

+ 37 - 0
pages/creatingSituations/creatingSituations.vue

@@ -0,0 +1,37 @@
+<template>
+	<view class="creatingSituations">
+		<tm-steps :options="options" :active="active"></tm-steps>
+	</view>
+</template>
+
+<script>
+	import theme from "./components/theme.vue";
+	import condition from "./components/condition.vue";
+	
+	export default {
+		data() {
+			return {
+				options: [
+					{title: '主题', component: theme},
+					{title: '条件', component: condition},
+					{title: '查核组'},
+					{title: '地图'},
+					{title: '计划'},
+					{title: '配置'},
+				],
+				active: 1
+			}
+		},
+		methods: {
+			
+		}
+	}
+</script>
+
+<style lang="less">
+		.creatingSituations {
+			width: 100%;
+			height: 100%;
+			background-color: #F5F6FA;
+		}
+</style>

+ 43 - 10
pages/index/index.vue

@@ -1,18 +1,51 @@
 <template>
-  <view class="index-page">
-		追踪方法学
-  </view>
+	<view class="content">
+		<view class="text-area">
+			<text class="title">{{title}}</text>
+		</view>
+	</view>
 </template>
 
 <script>
+	export default {
+		data() {
+			return {
+				title: 'Hello'
+			}
+		},
+		onLoad() {
 
-export default {
-  data() {
-    return {
-    };
-  },
-};
+		},
+		methods: {
+
+		}
+	}
 </script>
 
-<style lang="less">
+<style>
+	.content {
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+		justify-content: center;
+	}
+
+	.logo {
+		height: 200rpx;
+		width: 200rpx;
+		margin-top: 200rpx;
+		margin-left: auto;
+		margin-right: auto;
+		margin-bottom: 50rpx;
+	}
+
+	.text-area {
+		display: flex;
+		justify-content: center;
+	}
+
+	.title {
+		font-size: 36rpx;
+		color: #8f8f94;
+	}
 </style>

+ 0 - 14
pages/index/model.js

@@ -1,14 +0,0 @@
-import { commServer } from './server.js';
-
-export default {
-  namespaced: true,
-  state: {
-  },
-  mutations: {},
-  actions: {
-		commActions({ commit, state }, { payload }) {
-			// payload = {key,data} // data是请求数据,key是请求接口id
-      return commServer(payload);
-		},
-  }
-}

+ 0 - 16
pages/index/server.js

@@ -1,16 +0,0 @@
-import { creatRequest } from '../../utils/request.js';
-
-const requestList = {
-  //ADL获取接口整合
-  compoundCommon: {
-    method: 'GET',
-    url: 'inpnurse/v1/inpAssessment/compoundCommon',
-		// successMessage: '',
-		// needLoading: false // 还有这两个参数,但不是必传的,默认loading
-  },
-};
-
-export const commServer = ({ key, data }) => {
-  let obj = requestList[key];
-  return creatRequest(obj, data);
-}

+ 156 - 0
pages/mission-details/mission-details.vue

@@ -0,0 +1,156 @@
+<template>
+	<view class="mission-details-page">
+		<scroll-view class="scroll-y" scroll-y="true">
+			<list-item :isClose="true" />
+			<view class="mission-plan">
+				<view class="label">
+					<text>改善进度</text>
+				</view>
+				<view class="plan-box">
+					<template v-for="(item, i) in list">
+						<view class="row" :key="i">
+							<view class="col">
+								<image 
+								  class="plan-icon" 
+									:src="`/static/${i === list.length - 1 ? 'check-radio' : 'check-no'}.png`">
+								</image>
+								<view class="line" v-show="i != list.length -1"></view>
+							</view>
+						  <view class="col">
+								<view class="title">
+									<text>{{ item.title }}</text>
+								</view>
+								<view class="sub-box">
+									<view class="sub-title">
+										<text>{{ item.subTitle }}</text>
+									</view>	
+									<view class="sub-title">
+										<text>{{ item.date }}</text>
+									</view>
+								</view>
+						  </view>
+						</view>
+					</template>
+					<view class="btn-group">
+						<tm-button />
+					</view>
+				</view>
+			</view>
+		</scroll-view>
+	</view>
+</template>
+
+<script>
+	// 改善任务
+	import listItem from '../mission/components/mission-list/list-item.vue';
+	export default {
+		data() {
+			return {
+        list: [
+					{title: '查核人:王晓雪', subTitle: '发送改善通知,查核结果:主要缺失', date: '2020-11-22 15:30:22'},
+					{title: '单位负责人', subTitle: '发送改善通知,查核结果:主要缺失', date: '2020-11-22 15:30:22'}
+				]
+			}
+		},
+		methods: {
+			
+		},
+		components: {
+			listItem, 
+		}
+	}
+</script>
+
+<style lang="less">
+	.mission-details-page {
+		height: 100%;
+		padding-top: 15rpx;
+		background-color: #F5F6FA;
+		
+		.scroll-y {
+			height: 100%;
+			
+			.mission-plan {
+				
+				.label {
+					margin-top: 25rpx;
+					margin-bottom: 15rpx;
+					height: 20rpx;
+					line-height: 20rpx;
+					padding-left: 25rpx;
+					
+					text {
+						font-size: 20rpx;
+						color: #666F80;
+					}
+				}
+				
+				.plan-box {
+					padding: 25rpx;
+					background-color: #fff;
+					
+					.row {
+						display: flex;
+						
+						.col {
+							
+							.title {
+								display: flex;
+								align-items: center;
+								margin-bottom: 15rpx;
+								height: 25rpx;
+							
+							  >text {
+									font-size: 22.5rpx;
+									color: #292C33;
+								}
+							}
+							
+							.sub-box {
+								display: flex;
+								flex-direction: column;
+								
+								.sub-title {
+									display: flex;
+									align-items: center;
+									margin-bottom: 15rpx;
+									height: 20rpx;
+									
+									&:last-child {
+										margin-bottom: 34.37rpx;
+									}
+									
+									>text {
+										font-size: 20rpx;
+										color: #666E80;
+									}
+								}
+							}
+							
+							&:first-child {
+								display: flex;
+								flex-direction: column;
+								align-items: center;
+								margin-right: 15rpx;
+								width: 25rpx;
+								
+								.plan-icon {
+									margin-bottom: 17.5rpx;
+									width: 25rpx;
+									height: 25rpx;
+								}
+								
+								.line {
+									width: 5rpx;
+									height: 75rpx;
+									background-color: #E6EAF2;
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+	}
+
+</style>

+ 149 - 0
pages/mission/components/mission-list/list-item.vue

@@ -0,0 +1,149 @@
+<template>
+	<view class="mission-list-item" @click="gooDetails">
+		<view v-if="!isClose" class="time">
+			<text class="com-text">2020-11-26 15:33:08</text>
+		</view>
+		<view class="card">
+	    <view class="top-box">
+				<view :class="['bg-box', isClose ? 'disabled-bg' : 'hight-bg']">
+					<text>{{isClose ? '改善结案' : '改善中'}}</text>
+				</view>
+	    	<text class="title">柜子上方50cm不能遮住喷水器</text>
+	    	<view class="row">
+	    		<view class="col">
+	    			<image class="com-icon" src="/static/search-icon.png"></image>
+	    			<text class="com-text">第3/9次查核计划</text>
+	    		</view>	
+	    		<view class="col">
+	    			<image class="com-icon" src="/static/location-icon.png"></image>
+	    			<text class="com-text">分诊处(门诊)</text>
+	    		</view>
+	    	</view>
+	    </view>
+			<view class="bottom-box">
+				<text class="com-text">情境名称:环境设施安全</text>
+				<text class="com-text">改善人:张晴晴</text>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		props: {
+			isClose: { // 是否结案
+				type: Boolean,
+				default: false
+			}
+		},
+		computed: {
+			bgImage(){
+				console.log(`url(~@/static/${!this.isClose ? 'hight' : 'disabled'}-bg.png)`)
+				return `../../../../static/${!this.isClose ? 'hight' : 'disabled'}-bg.png`;
+			}
+		},
+		methods: {
+			// 跳转详情页面(改善任务)
+			gooDetails(){
+				console.log(9)
+				uni.navigateTo({
+				  url: '/pages/mission-details/mission-details'
+				});
+			}
+		}
+	}
+</script>
+
+<style lang="less">
+	.mission-list-item {
+		margin-bottom: 25rpx;
+		overflow: hidden;
+		
+		.time {
+			height: 47.5rpx;
+			line-height: 45rpx;
+			padding-left: 25rpx;
+		}
+		
+		.card {
+			position: relative;
+			display: flex;
+			flex-direction: column;
+			height: 203.75rpx;
+			background-color: #fff;
+			padding: 0 25rpx;
+			
+			.top-box {
+				display: flex;
+				flex-direction: column;
+				justify-content: space-between;
+				flex: 1;
+				margin-top: 35rpx;
+				margin-bottom: 28.12rpx;
+			}
+			
+			.title {
+				line-height: 45rpx;
+				font-size: 25rpx;
+				font-weight: bold;
+				color: #292C33;
+			}
+			
+			.row {
+				display: flex;
+				align-items: center;
+				
+				.col {
+					display: flex;
+					align-items: center;
+					height: 20rpx;
+					
+					&:first-child {
+						margin-right: 50rpx;
+					}
+					.com-icon {
+						margin-right: 9.37rpx;
+						width: 20rpx;
+						height: 20rpx;
+					}
+				}
+			}
+			.bottom-box {
+				display: flex;
+				justify-content: space-between;
+				align-items: center;
+				height: 70rpx;
+				border-top: 0.62rpx solid #DADEE6;
+			}
+			
+			.bg-box {
+				position: absolute;
+				top: 0;
+				right: 0;
+				width: 112.5rpx;
+				height: 35rpx;
+				background-size: 100% 100%;
+				padding-left: 12.5rpx;
+				text-align: center;
+				
+				>text {
+					line-height: 35rpx;
+					font-size: 17.5rpx;
+					color: #fff;
+				}
+			}
+			
+			.hight-bg {
+				background-image: url('~@/static/hight-bg.png');
+			}
+			.disabled-bg {
+				background-image: url('~@/static/disabled-bg.png');
+			}
+		}
+		
+		.com-text {
+			font-size: 22.5rpx;
+			color: #666F80;
+		}
+	}
+</style>

+ 96 - 0
pages/mission/components/mission-list/mission-list.vue

@@ -0,0 +1,96 @@
+<template>
+	<view class="mission-list">
+		<scroll-view class="scroll-y" scroll-y="true">
+			<list-item />
+			<list-item />
+			<view class="completed-box">
+				<view class="btn-box">
+					<view class="btn" @click="toggleBtn">
+						<image class="icon" :src="`/static/${btnSetting.icon}.png`"></image>
+						<text class="text">
+						  {{ btnSetting.name }}
+						</text>
+					</view>
+				</view>
+				<list-item :isClose="true" v-if="showCloseList" />
+			</view>
+		</scroll-view>
+		<tm-tabbar :permission="1" />
+	</view>
+</template>
+
+<script>
+	// 任务列表
+	import listItem from './list-item.vue';
+	export default {
+		data(){
+			return {
+				// 是否展开历史任务
+				showCloseList: false,
+				btnSetting: {
+					icon: 'up-icon', // 图标名
+					name: '展示历史任务' // 按钮显示名字
+				},
+				closeList: [1, 2, 3]
+			}
+		},
+		watch: {
+			showCloseList(newVal, oldVal) {
+				if(newVal != oldVal){
+					this.btnSetting.icon = newVal ? 'up-icon' : 'down-ion';
+					this.btnSetting.name = newVal ? '收起历史任务' : '展示历史任务';
+				}
+			}
+		},
+		methods: {
+			toggleBtn() {
+				this.showCloseList = !this.showCloseList
+			}
+		},
+		components: {
+			listItem
+		}
+	}
+</script>
+
+<style lang="less">
+	.mission-list {
+		height: 100%;
+		padding-top: 15rpx;
+		
+		.scroll-y {
+			height: calc(100% - 87.5rpx);
+			
+			.completed-box {
+				
+				.btn-box {
+					display: flex;
+					justify-content: center;
+					margin-bottom: 25rpx;
+					height: 50rpx;
+					
+					.btn {
+						display: flex;
+						justify-content: center;
+						align-items: center;
+						width: 225rpx;
+						height: 50rpx;
+						border-radius: 37.5rpx;
+						border: 1.25rpx solid #98A1B3;
+						
+						.icon {
+							margin-right: 6.25rpx;
+							width: 21.25rpx;
+							height: 12.5rpx;
+						}
+						
+						.text {
+							font-size: 22.5rpx;
+							color: #98A1B3;
+						}
+					}
+				}
+			}
+		}
+	}
+</style>

+ 33 - 0
pages/mission/mission.vue

@@ -0,0 +1,33 @@
+<template>
+	<view class="mission-page">
+	  <!-- 任务列表 -->
+	  <mission-list />
+		
+	</view>
+</template>
+
+<script>
+	// 任务
+	import missionList from './components/mission-list/mission-list.vue'
+	export default {
+		data() {
+			return {
+				
+			}
+		},
+		methods: {
+			
+		},
+		components: {
+			missionList
+		}
+	}
+</script>
+
+<style lang="less">
+ .mission-page {
+	 height: 100%;
+	 background-color: #F5F6FA;
+	 overflow: hidden;
+ }
+</style>

+ 1 - 3
pages/model.js

@@ -1,7 +1,5 @@
-import index from './index/model.js';
 import login from './login/model.js';
 
 export default module = {
-  index,
-	login
+  login
 }

BIN
static/check-checkbox.png


BIN
static/check-no.png


BIN
static/check-radio.png


BIN
static/child.png


BIN
static/disabled-bg.png


BIN
static/down-ion.png


BIN
static/gean.png


BIN
static/hight-bg.png


BIN
static/icon上移.png


BIN
static/icon上移(禁用).png


BIN
static/icon下移.png


BIN
static/icon下移(禁用).png


BIN
static/icon删除.png


BIN
static/icon启用.png


BIN
static/icon地点.png


BIN
static/icon地点(禁用).png


BIN
static/icon新增.png


BIN
static/icon新增(禁用).png


BIN
static/icon禁用.png


BIN
static/location-icon.png


BIN
static/mission/上传图片.png


BIN
static/mission/多选-已选状态.png


BIN
static/mission/导航栏返回.png


BIN
static/mission/消息中心已读.png


BIN
static/mission/消息中心未读.png


BIN
static/mission/蓝色更多.png


BIN
static/parent-close.png


BIN
static/parent-open.png


BIN
static/search-icon.png


BIN
static/steps-over.png


BIN
static/tabbar/calendar-select.png


BIN
static/tabbar/calendar-unselect.png


BIN
static/tabbar/creatingSituations-select.png


BIN
static/tabbar/creatingSituations-unselect.png


BIN
static/tabbar/mission-select.png


BIN
static/tabbar/mission-unselect.png


BIN
static/tabbar/my-select.png


BIN
static/tabbar/my-unselect.png


BIN
static/tabbar/setting-select.png


BIN
static/tabbar/setting-unselect.png


BIN
static/up-icon.png


BIN
static/xitong.png


BIN
static/主题勾选.png


BIN
static/导航栏返回.png


BIN
static/查看更多_.png


BIN
static/禁用标志.png


BIN
static/绿色角标.png


BIN
static/蓝色勾选.png


BIN
static/蓝色查看更多_.png


+ 21 - 19
uni.scss

@@ -12,6 +12,8 @@
  * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件
  */
 
+/* 颜色变量 */
+
 /* 行为相关颜色 */
 $uni-color-primary: #007aff;
 $uni-color-success: #4cd964;
@@ -32,43 +34,43 @@ $uni-bg-color-hover:#f1f1f1;//点击状态颜色
 $uni-bg-color-mask:rgba(0, 0, 0, 0.4);//遮罩颜色
 
 /* 边框颜色 */
-$uni-border-color:#c8c7cc;
+$uni-border-color:#e5e5e5;
 
 /* 尺寸变量 */
 
 /* 文字尺寸 */
-$uni-font-size-sm:24rpx;
-$uni-font-size-base:28rpx;
-$uni-font-size-lg:32rpx;
+$uni-font-size-sm:12px;
+$uni-font-size-base:14px;
+$uni-font-size-lg:16px;
 
 /* 图片尺寸 */
-$uni-img-size-sm:40rpx;
-$uni-img-size-base:52rpx;
-$uni-img-size-lg:80rpx;
+$uni-img-size-sm:20px;
+$uni-img-size-base:26px;
+$uni-img-size-lg:40px;
 
 /* Border Radius */
-$uni-border-radius-sm: 4rpx;
-$uni-border-radius-base: 6rpx;
-$uni-border-radius-lg: 12rpx;
+$uni-border-radius-sm: 2px;
+$uni-border-radius-base: 3px;
+$uni-border-radius-lg: 6px;
 $uni-border-radius-circle: 50%;
 
 /* 水平间距 */
-$uni-spacing-row-sm: 10px;
-$uni-spacing-row-base: 20rpx;
-$uni-spacing-row-lg: 30rpx;
+$uni-spacing-row-sm: 5px;
+$uni-spacing-row-base: 10px;
+$uni-spacing-row-lg: 15px;
 
 /* 垂直间距 */
-$uni-spacing-col-sm: 8rpx;
-$uni-spacing-col-base: 16rpx;
-$uni-spacing-col-lg: 24rpx;
+$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:40rpx;
+$uni-font-size-title:20px;
 $uni-color-subtitle: #555555; // 二级标题颜色
-$uni-font-size-subtitle:36rpx;
+$uni-font-size-subtitle:26px;
 $uni-color-paragraph: #3F536E; // 文章段落颜色
-$uni-font-size-paragraph:30rpx;
+$uni-font-size-paragraph:15px;

+ 10 - 0
utils/compatible.js

@@ -0,0 +1,10 @@
+/**
+ * 做兼容相关的函数集文件
+ */
+
+/**
+ * 阻止事件冒泡
+ */
+export const _stopPropagation = (e) => {
+	window.event ? window.event.cancelBubble = true : e.stopPropagation();
+}