├── pages ├── self │ ├── my.css │ └── index.vue ├── detail │ └── index.vue ├── list │ └── index.vue ├── index │ └── index.vue ├── tab.vue └── table │ └── index.vue ├── .eslintignore ├── README.md ├── uview-ui ├── libs │ ├── css │ │ ├── style.nvue.scss │ │ ├── style.components.scss │ │ ├── style.h5.scss │ │ ├── style.mp.scss │ │ ├── color.scss │ │ ├── common.scss │ │ └── style.vue.scss │ ├── function │ │ ├── bem.js │ │ ├── sys.js │ │ ├── toast.js │ │ ├── randomArray.js │ │ ├── random.js │ │ ├── addUnit.js │ │ ├── trim.js │ │ ├── $parent.js │ │ ├── deepClone.js │ │ ├── throttle.js │ │ ├── debounce.js │ │ ├── deepMerge.js │ │ ├── color.js │ │ ├── type2icon.js │ │ ├── getParent.js │ │ ├── guid.js │ │ ├── timeFrom.js │ │ ├── queryParams.js │ │ ├── timeFormat.js │ │ ├── route.js │ │ ├── colorGradient.js │ │ └── test.js │ ├── config │ │ ├── config.js │ │ └── zIndex.js │ ├── mixin │ │ ├── mpShare.js │ │ └── mixin.js │ ├── store │ │ └── index.js │ ├── util │ │ ├── province.js │ │ └── emitter.js │ └── request │ │ └── index.js ├── components │ ├── u-loading-page │ │ └── u-loading-page.vue │ ├── u-parse │ │ └── libs │ │ │ ├── handler.wxs │ │ │ ├── config.js │ │ │ └── CssHandler.js │ ├── u-tr │ │ └── u-tr.vue │ ├── u-time-line │ │ └── u-time-line.vue │ ├── u-full-screen │ │ └── u-full-screen.vue │ ├── u-gap │ │ └── u-gap.vue │ ├── u-th │ │ └── u-th.vue │ ├── u-cell-group │ │ └── u-cell-group.vue │ ├── u-td │ │ └── u-td.vue │ ├── u-time-line-item │ │ └── u-time-line-item.vue │ ├── u-table │ │ └── u-table.vue │ ├── u-row │ │ └── u-row.vue │ ├── u-link │ │ └── u-link.vue │ ├── u-index-anchor │ │ └── u-index-anchor.vue │ ├── u-line │ │ └── u-line.vue │ ├── u-collapse │ │ └── u-collapse.vue │ ├── u-grid │ │ └── u-grid.vue │ ├── u-top-tips │ │ └── u-top-tips.vue │ ├── u-grid-item │ │ └── u-grid-item.vue │ ├── u-mask │ │ └── u-mask.vue │ ├── u-checkbox-group │ │ └── u-checkbox-group.vue │ ├── u-form │ │ └── u-form.vue │ ├── u-back-top │ │ └── u-back-top.vue │ ├── u-col │ │ └── u-col.vue │ ├── u-line-progress │ │ └── u-line-progress.vue │ ├── u-radio-group │ │ └── u-radio-group.vue │ ├── u-dropdown-item │ │ └── u-dropdown-item.vue │ ├── u-section │ │ └── u-section.vue │ ├── u-divider │ │ └── u-divider.vue │ ├── u-loading │ │ └── u-loading.vue │ ├── u-sticky │ │ └── u-sticky.vue │ ├── u-empty │ │ └── u-empty.vue │ ├── u-number-keyboard │ │ └── u-number-keyboard.vue │ ├── u-switch │ │ └── u-switch.vue │ ├── u-read-more │ │ └── u-read-more.vue │ ├── u-verification-code │ │ └── u-verification-code.vue │ ├── u-steps │ │ └── u-steps.vue │ └── u-waterfall │ │ └── u-waterfall.vue ├── index.scss ├── package.json ├── LICENSE ├── theme.scss ├── README.md └── index.js ├── .DS_Store ├── static ├── home.png ├── logo.png ├── my.png ├── my1.png ├── home1.png ├── uview1.png ├── uview2.png └── iconfont │ ├── fonts │ ├── icomoon.eot │ ├── icomoon.ttf │ └── icomoon.woff │ └── style.css ├── main.js ├── index.html ├── .hbuilderx └── launch.json ├── App.vue ├── components ├── userInfo.vue └── ComTable │ └── index.vue ├── uni.scss ├── pages.json └── manifest.json /pages/self/my.css: -------------------------------------------------------------------------------- 1 | .box { 2 | color: #fff; 3 | } -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | unpackage 2 | node_modules 3 | uview-ui 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # simple-uniapp 2 | uniapp学习项目 3 | ## 启动 4 | -------------------------------------------------------------------------------- /uview-ui/libs/css/style.nvue.scss: -------------------------------------------------------------------------------- 1 | .nvue { 2 | font-size: 24rpx; 3 | } -------------------------------------------------------------------------------- /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shengbid/simple-uniapp/main/.DS_Store -------------------------------------------------------------------------------- /static/home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shengbid/simple-uniapp/main/static/home.png -------------------------------------------------------------------------------- /static/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shengbid/simple-uniapp/main/static/logo.png -------------------------------------------------------------------------------- /static/my.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shengbid/simple-uniapp/main/static/my.png -------------------------------------------------------------------------------- /static/my1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shengbid/simple-uniapp/main/static/my1.png -------------------------------------------------------------------------------- /static/home1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shengbid/simple-uniapp/main/static/home1.png -------------------------------------------------------------------------------- /static/uview1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shengbid/simple-uniapp/main/static/uview1.png -------------------------------------------------------------------------------- /static/uview2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shengbid/simple-uniapp/main/static/uview2.png -------------------------------------------------------------------------------- /uview-ui/libs/function/bem.js: -------------------------------------------------------------------------------- 1 | function bem(name, conf) { 2 | 3 | } 4 | 5 | module.exports.bem = bem; 6 | -------------------------------------------------------------------------------- /static/iconfont/fonts/icomoon.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shengbid/simple-uniapp/main/static/iconfont/fonts/icomoon.eot -------------------------------------------------------------------------------- /static/iconfont/fonts/icomoon.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shengbid/simple-uniapp/main/static/iconfont/fonts/icomoon.ttf -------------------------------------------------------------------------------- /static/iconfont/fonts/icomoon.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shengbid/simple-uniapp/main/static/iconfont/fonts/icomoon.woff -------------------------------------------------------------------------------- /uview-ui/libs/function/sys.js: -------------------------------------------------------------------------------- 1 | export function os() { 2 | return uni.getSystemInfoSync().platform; 3 | }; 4 | 5 | export function sys() { 6 | return uni.getSystemInfoSync(); 7 | } 8 | 9 | 10 | -------------------------------------------------------------------------------- /uview-ui/libs/function/toast.js: -------------------------------------------------------------------------------- 1 | function toast(title, duration = 1500) { 2 | uni.showToast({ 3 | title: title, 4 | icon: 'none', 5 | duration: duration 6 | }) 7 | } 8 | 9 | export default toast 10 | -------------------------------------------------------------------------------- /uview-ui/libs/css/style.components.scss: -------------------------------------------------------------------------------- 1 | // 定义混入指令,用于在非nvue环境下的flex定义,因为nvue没有display属性,会报错 2 | @mixin vue-flex($direction: row) { 3 | /* #ifndef APP-NVUE */ 4 | display: flex; 5 | flex-direction: $direction; 6 | /* #endif */ 7 | } -------------------------------------------------------------------------------- /uview-ui/libs/css/style.h5.scss: -------------------------------------------------------------------------------- 1 | /* H5的时候,隐藏滚动条 */ 2 | ::-webkit-scrollbar { 3 | display: none; 4 | width: 0 !important; 5 | height: 0 !important; 6 | -webkit-appearance: none; 7 | background: transparent; 8 | } 9 | -------------------------------------------------------------------------------- /uview-ui/libs/function/randomArray.js: -------------------------------------------------------------------------------- 1 | // 打乱数组 2 | function randomArray(array = []) { 3 | // 原理是sort排序,Math.random()产生0<= x < 1之间的数,会导致x-0.05大于或者小于0 4 | return array.sort(() => Math.random() - 0.5); 5 | } 6 | 7 | export default randomArray 8 | -------------------------------------------------------------------------------- /uview-ui/libs/config/config.js: -------------------------------------------------------------------------------- 1 | // 此版本发布于2020-12-17 2 | let version = '1.8.3'; 3 | 4 | export default { 5 | v: version, 6 | version: version, 7 | // 主题名称 8 | type: [ 9 | 'primary', 10 | 'success', 11 | 'info', 12 | 'error', 13 | 'warning' 14 | ] 15 | } -------------------------------------------------------------------------------- /uview-ui/libs/function/random.js: -------------------------------------------------------------------------------- 1 | function random(min, max) { 2 | if (min >= 0 && max > 0 && max >= min) { 3 | let gab = max - min + 1; 4 | return Math.floor(Math.random() * gab + min); 5 | } else { 6 | return 0; 7 | } 8 | } 9 | 10 | export default random; 11 | -------------------------------------------------------------------------------- /main.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import App from './App' 3 | 4 | Vue.config.productionTip = false 5 | 6 | App.mpType = 'app' 7 | 8 | // 引入全局uView 9 | import uView from 'uview-ui' 10 | Vue.use(uView); 11 | 12 | const app = new Vue({ 13 | ...App 14 | }) 15 | app.$mount() 16 | -------------------------------------------------------------------------------- /uview-ui/libs/function/addUnit.js: -------------------------------------------------------------------------------- 1 | import validation from './test.js'; 2 | 3 | // 添加单位,如果有rpx,%,px等单位结尾或者值为auto,直接返回,否则加上rpx单位结尾 4 | export default function addUnit(value = 'auto', unit = 'rpx') { 5 | value = String(value); 6 | // 用uView内置验证规则中的number判断是否为数值 7 | return validation.number(value) ? `${value}${unit}` : value; 8 | } -------------------------------------------------------------------------------- /uview-ui/components/u-loading-page/u-loading-page.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 22 | 23 | 26 | -------------------------------------------------------------------------------- /uview-ui/libs/mixin/mpShare.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | onLoad() { 3 | // 设置默认的转发参数 4 | this.$u.mpShare = { 5 | title: '', // 默认为小程序名称 6 | path: '', // 默认为当前页面路径 7 | imageUrl: '' // 默认为当前页面的截图 8 | } 9 | }, 10 | onShareAppMessage() { 11 | return this.$u.mpShare 12 | }, 13 | // #ifdef MP-WEIXIN 14 | onShareTimeline() { 15 | return this.$u.mpShare 16 | } 17 | // #endif 18 | } 19 | -------------------------------------------------------------------------------- /uview-ui/libs/config/zIndex.js: -------------------------------------------------------------------------------- 1 | // uniapp在H5中各API的z-index值如下: 2 | /** 3 | * actionsheet: 999 4 | * modal: 999 5 | * navigate: 998 6 | * tabbar: 998 7 | * toast: 999 8 | */ 9 | 10 | export default { 11 | toast: 10090, 12 | noNetwork: 10080, 13 | // popup包含popup,actionsheet,keyboard,picker的值 14 | popup: 10075, 15 | mask: 10070, 16 | navbar: 980, 17 | topTips: 975, 18 | sticky: 970, 19 | indexListSticky: 965, 20 | } -------------------------------------------------------------------------------- /uview-ui/libs/function/trim.js: -------------------------------------------------------------------------------- 1 | function trim(str, pos = 'both') { 2 | if (pos == 'both') { 3 | return str.replace(/^\s+|\s+$/g, ""); 4 | } else if (pos == "left") { 5 | return str.replace(/^\s*/, ''); 6 | } else if (pos == 'right') { 7 | return str.replace(/(\s*$)/g, ""); 8 | } else if (pos == 'all') { 9 | return str.replace(/\s+/g, ""); 10 | } else { 11 | return str; 12 | } 13 | } 14 | 15 | export default trim 16 | -------------------------------------------------------------------------------- /uview-ui/components/u-parse/libs/handler.wxs: -------------------------------------------------------------------------------- 1 | var inline = { 2 | abbr: 1, 3 | b: 1, 4 | big: 1, 5 | code: 1, 6 | del: 1, 7 | em: 1, 8 | i: 1, 9 | ins: 1, 10 | label: 1, 11 | q: 1, 12 | small: 1, 13 | span: 1, 14 | strong: 1, 15 | sub: 1, 16 | sup: 1 17 | } 18 | module.exports = { 19 | use: function(item) { 20 | return !item.c && !inline[item.name] && (item.attrs.style || '').indexOf('display:inline') == -1 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /.hbuilderx/launch.json: -------------------------------------------------------------------------------- 1 | { // launch.json 配置了启动调试时相关设置,configurations下节点名称可为 app-plus/h5/mp-weixin/mp-baidu/mp-alipay/mp-qq/mp-toutiao/mp-360/ 2 | // launchtype项可配置值为local或remote, local代表前端连本地云函数,remote代表前端连云端云函数 3 | "version": "0.0", 4 | "configurations": [{ 5 | "default" : 6 | { 7 | "launchtype" : "local" 8 | }, 9 | "h5" : 10 | { 11 | "launchtype" : "local" 12 | }, 13 | "type" : "uniCloud" 14 | } 15 | ] 16 | } 17 | -------------------------------------------------------------------------------- /uview-ui/index.scss: -------------------------------------------------------------------------------- 1 | // 引入公共基础类 2 | @import "./libs/css/common.scss"; 3 | @import "./libs/css/color.scss"; 4 | 5 | // 非nvue的样式 6 | /* #ifndef APP-NVUE */ 7 | @import "./libs/css/style.vue.scss"; 8 | /* #endif */ 9 | 10 | // nvue的特有样式 11 | /* #ifdef APP-NVUE */ 12 | @import "./libs/css/style.nvue.scss"; 13 | /* #endif */ 14 | 15 | // 小程序特有的样式 16 | /* #ifdef MP */ 17 | @import "./libs/css/style.mp.scss"; 18 | /* #endif */ 19 | 20 | // H5特有的样式 21 | /* #ifdef H5 */ 22 | @import "./libs/css/style.h5.scss"; 23 | /* #endif */ -------------------------------------------------------------------------------- /uview-ui/libs/store/index.js: -------------------------------------------------------------------------------- 1 | // 暂时不用vuex模块方式实现,将该方法直接放入到/store/index.js中 2 | const module = { 3 | actions: { 4 | $uStore({rootState}, params) { 5 | let nameArr = params.name.split('.'); 6 | if(nameArr.length >= 2) { 7 | let obj = rootState[nameArr[0]]; 8 | for(let i = 1; i < nameArr.length - 1; i ++) { 9 | obj = obj[nameArr[i]]; 10 | } 11 | obj[nameArr[nameArr.length - 1]] = params.value; 12 | } else { 13 | rootState[params.name] = params.value; 14 | } 15 | } 16 | } 17 | } 18 | 19 | export default module -------------------------------------------------------------------------------- /uview-ui/components/u-tr/u-tr.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 18 | 19 | 26 | -------------------------------------------------------------------------------- /App.vue: -------------------------------------------------------------------------------- 1 | 20 | 21 | 31 | -------------------------------------------------------------------------------- /uview-ui/libs/function/$parent.js: -------------------------------------------------------------------------------- 1 | // 获取父组件的参数,因为支付宝小程序不支持provide/inject的写法 2 | // this.$parent在非H5中,可以准确获取到父组件,但是在H5中,需要多次this.$parent.$parent.xxx 3 | // 这里默认值等于undefined有它的含义,因为最顶层元素(组件)的$parent就是undefined,意味着不传name 4 | // 值(默认为undefined),就是查找最顶层的$parent 5 | export default function $parent(name = undefined) { 6 | let parent = this.$parent; 7 | // 通过while历遍,这里主要是为了H5需要多层解析的问题 8 | while (parent) { 9 | // 父组件 10 | if (parent.$options && parent.$options.name !== name) { 11 | // 如果组件的name不相等,继续上一级寻找 12 | parent = parent.$parent; 13 | } else { 14 | return parent; 15 | } 16 | } 17 | return false; 18 | } -------------------------------------------------------------------------------- /pages/detail/index.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 27 | 28 | 30 | -------------------------------------------------------------------------------- /uview-ui/libs/function/deepClone.js: -------------------------------------------------------------------------------- 1 | // 判断arr是否为一个数组,返回一个bool值 2 | function isArray (arr) { 3 | return Object.prototype.toString.call(arr) === '[object Array]'; 4 | } 5 | 6 | // 深度克隆 7 | function deepClone (obj) { 8 | // 对常见的“非”值,直接返回原来值 9 | if([null, undefined, NaN, false].includes(obj)) return obj; 10 | if(typeof obj !== "object" && typeof obj !== 'function') { 11 | //原始类型直接返回 12 | return obj; 13 | } 14 | var o = isArray(obj) ? [] : {}; 15 | for(let i in obj) { 16 | if(obj.hasOwnProperty(i)){ 17 | o[i] = typeof obj[i] === "object" ? deepClone(obj[i]) : obj[i]; 18 | } 19 | } 20 | return o; 21 | } 22 | 23 | export default deepClone; 24 | -------------------------------------------------------------------------------- /components/userInfo.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 37 | 38 | 41 | -------------------------------------------------------------------------------- /uview-ui/libs/function/throttle.js: -------------------------------------------------------------------------------- 1 | let timer, flag; 2 | /** 3 | * 节流原理:在一定时间内,只能触发一次 4 | * 5 | * @param {Function} func 要执行的回调函数 6 | * @param {Number} wait 延时的时间 7 | * @param {Boolean} immediate 是否立即执行 8 | * @return null 9 | */ 10 | function throttle(func, wait = 500, immediate = true) { 11 | if (immediate) { 12 | if (!flag) { 13 | flag = true; 14 | // 如果是立即执行,则在wait毫秒内开始时执行 15 | typeof func === 'function' && func(); 16 | timer = setTimeout(() => { 17 | flag = false; 18 | }, wait); 19 | } 20 | } else { 21 | if (!flag) { 22 | flag = true 23 | // 如果是非立即执行,则在wait毫秒内的结束处执行 24 | timer = setTimeout(() => { 25 | flag = false 26 | typeof func === 'function' && func(); 27 | }, wait); 28 | } 29 | 30 | } 31 | }; 32 | export default throttle 33 | -------------------------------------------------------------------------------- /uview-ui/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "uview-ui", 3 | "version": "1.8.3", 4 | "description": "uView UI,是uni-app生态优秀的UI框架,全面的组件和便捷的工具会让您信手拈来,如鱼得水", 5 | "main": "index.js", 6 | "keywords": [ 7 | "uview", 8 | "uView", 9 | "uni-app", 10 | "uni-app ui", 11 | "uniapp", 12 | "uviewui", 13 | "uview ui", 14 | "uviewUI", 15 | "uViewui", 16 | "uViewUI", 17 | "uView UI", 18 | "uni ui", 19 | "uni UI", 20 | "uniapp ui", 21 | "ui", 22 | "UI框架", 23 | "uniapp ui框架", 24 | "uniapp UI" 25 | ], 26 | "scripts": { 27 | "test": "echo \"Error: no test specified\" && exit 1" 28 | }, 29 | "repository": { 30 | "type": "git", 31 | "url": "" 32 | }, 33 | "devDependencies": { 34 | "node-sass": "^4.14.0", 35 | "sass-loader": "^8.0.2" 36 | }, 37 | "author": "uView", 38 | "license": "MIT" 39 | } 40 | -------------------------------------------------------------------------------- /uview-ui/libs/function/debounce.js: -------------------------------------------------------------------------------- 1 | let timeout = null; 2 | 3 | /** 4 | * 防抖原理:一定时间内,只有最后一次操作,再过wait毫秒后才执行函数 5 | * 6 | * @param {Function} func 要执行的回调函数 7 | * @param {Number} wait 延时的时间 8 | * @param {Boolean} immediate 是否立即执行 9 | * @return null 10 | */ 11 | function debounce(func, wait = 500, immediate = false) { 12 | // 清除定时器 13 | if (timeout !== null) clearTimeout(timeout); 14 | // 立即执行,此类情况一般用不到 15 | if (immediate) { 16 | var callNow = !timeout; 17 | timeout = setTimeout(function() { 18 | timeout = null; 19 | }, wait); 20 | if (callNow) typeof func === 'function' && func(); 21 | } else { 22 | // 设置定时器,当最后一次操作后,timeout不会再被清除,所以在延时wait毫秒后执行func回调方法 23 | timeout = setTimeout(function() { 24 | typeof func === 'function' && func(); 25 | }, wait); 26 | } 27 | } 28 | 29 | export default debounce 30 | -------------------------------------------------------------------------------- /uview-ui/libs/function/deepMerge.js: -------------------------------------------------------------------------------- 1 | import deepClone from "./deepClone"; 2 | 3 | // JS对象深度合并 4 | function deepMerge(target = {}, source = {}) { 5 | target = deepClone(target); 6 | if (typeof target !== 'object' || typeof source !== 'object') return false; 7 | for (var prop in source) { 8 | if (!source.hasOwnProperty(prop)) continue; 9 | if (prop in target) { 10 | if (typeof target[prop] !== 'object') { 11 | target[prop] = source[prop]; 12 | } else { 13 | if (typeof source[prop] !== 'object') { 14 | target[prop] = source[prop]; 15 | } else { 16 | if (target[prop].concat && source[prop].concat) { 17 | target[prop] = target[prop].concat(source[prop]); 18 | } else { 19 | target[prop] = deepMerge(target[prop], source[prop]); 20 | } 21 | } 22 | } 23 | } else { 24 | target[prop] = source[prop]; 25 | } 26 | } 27 | return target; 28 | } 29 | 30 | export default deepMerge; -------------------------------------------------------------------------------- /uview-ui/components/u-time-line/u-time-line.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 23 | 24 | 44 | -------------------------------------------------------------------------------- /uview-ui/libs/function/color.js: -------------------------------------------------------------------------------- 1 | // 为了让用户能够自定义主题,会逐步弃用此文件,各颜色通过css提供 2 | // 为了给某些特殊场景使用和向后兼容,无需删除此文件(2020-06-20) 3 | let color = { 4 | primary: "#2979ff", 5 | primaryDark: "#2b85e4", 6 | primaryDisabled: "#a0cfff", 7 | primaryLight: "#ecf5ff", 8 | bgColor: "#f3f4f6", 9 | 10 | info: "#909399", 11 | infoDark: "#82848a", 12 | infoDisabled: "#c8c9cc", 13 | infoLight: "#f4f4f5", 14 | 15 | warning: "#ff9900", 16 | warningDark: "#f29100", 17 | warningDisabled: "#fcbd71", 18 | warningLight: "#fdf6ec", 19 | 20 | error: "#fa3534", 21 | errorDark: "#dd6161", 22 | errorDisabled: "#fab6b6", 23 | errorLight: "#fef0f0", 24 | 25 | success: "#19be6b", 26 | successDark: "#18b566", 27 | successDisabled: "#71d5a1", 28 | successLight: "#dbf1e1", 29 | 30 | mainColor: "#303133", 31 | contentColor: "#606266", 32 | tipsColor: "#909399", 33 | lightColor: "#c0c4cc", 34 | borderColor: "#e4e7ed" 35 | } 36 | 37 | export default color; -------------------------------------------------------------------------------- /uview-ui/libs/function/type2icon.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 根据主题type值,获取对应的图标 3 | * @param String type 主题名称,primary|info|error|warning|success 4 | * @param String fill 是否使用fill填充实体的图标 5 | */ 6 | function type2icon(type = 'success', fill = false) { 7 | // 如果非预置值,默认为success 8 | if (['primary', 'info', 'error', 'warning', 'success'].indexOf(type) == -1) type = 'success'; 9 | let iconName = ''; 10 | // 目前(2019-12-12),info和primary使用同一个图标 11 | switch (type) { 12 | case 'primary': 13 | iconName = 'info-circle'; 14 | break; 15 | case 'info': 16 | iconName = 'info-circle'; 17 | break; 18 | case 'error': 19 | iconName = 'close-circle'; 20 | break; 21 | case 'warning': 22 | iconName = 'error-circle'; 23 | break; 24 | case 'success': 25 | iconName = 'checkmark-circle'; 26 | break; 27 | default: 28 | iconName = 'checkmark-circle'; 29 | } 30 | // 是否是实体类型,加上-fill,在icon组件库中,实体的类名是后面加-fill的 31 | if (fill) iconName += '-fill'; 32 | return iconName; 33 | } 34 | 35 | export default type2icon 36 | -------------------------------------------------------------------------------- /uview-ui/libs/util/province.js: -------------------------------------------------------------------------------- 1 | var provinceData=[{"label":"北京市","value":"11"},{"label":"天津市","value":"12"},{"label":"河北省","value":"13"},{"label":"山西省","value":"14"},{"label":"内蒙古自治区","value":"15"},{"label":"辽宁省","value":"21"},{"label":"吉林省","value":"22"},{"label":"黑龙江省","value":"23"},{"label":"上海市","value":"31"},{"label":"江苏省","value":"32"},{"label":"浙江省","value":"33"},{"label":"安徽省","value":"34"},{"label":"福建省","value":"35"},{"label":"江西省","value":"36"},{"label":"山东省","value":"37"},{"label":"河南省","value":"41"},{"label":"湖北省","value":"42"},{"label":"湖南省","value":"43"},{"label":"广东省","value":"44"},{"label":"广西壮族自治区","value":"45"},{"label":"海南省","value":"46"},{"label":"重庆市","value":"50"},{"label":"四川省","value":"51"},{"label":"贵州省","value":"52"},{"label":"云南省","value":"53"},{"label":"西藏自治区","value":"54"},{"label":"陕西省","value":"61"},{"label":"甘肃省","value":"62"},{"label":"青海省","value":"63"},{"label":"宁夏回族自治区","value":"64"},{"label":"新疆维吾尔自治区","value":"65"},{"label":"台湾","value":"66"},{"label":"香港","value":"67"},{"label":"澳门","value":"68"}];export default provinceData; -------------------------------------------------------------------------------- /uview-ui/LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 www.uviewui.com 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /uview-ui/theme.scss: -------------------------------------------------------------------------------- 1 | // 此文件为uView的主题变量,这些变量目前只能通过uni.scss引入才有效,另外由于 2 | // uni.scss中引入的样式会同时混入到全局样式文件和单独每一个页面的样式中,造成微信程序包太大, 3 | // 故uni.scss只建议放scss变量名相关样式,其他的样式可以通过main.js或者App.vue引入 4 | 5 | $u-main-color: #303133; 6 | $u-content-color: #606266; 7 | $u-tips-color: #909399; 8 | $u-light-color: #c0c4cc; 9 | $u-border-color: #e4e7ed; 10 | $u-bg-color: #f3f4f6; 11 | 12 | $u-type-primary: #2979ff; 13 | $u-type-primary-light: #ecf5ff; 14 | $u-type-primary-disabled: #a0cfff; 15 | $u-type-primary-dark: #2b85e4; 16 | 17 | $u-type-warning: #ff9900; 18 | $u-type-warning-disabled: #fcbd71; 19 | $u-type-warning-dark: #f29100; 20 | $u-type-warning-light: #fdf6ec; 21 | 22 | $u-type-success: #19be6b; 23 | $u-type-success-disabled: #71d5a1; 24 | $u-type-success-dark: #18b566; 25 | $u-type-success-light: #dbf1e1; 26 | 27 | $u-type-error: #fa3534; 28 | $u-type-error-disabled: #fab6b6; 29 | $u-type-error-dark: #dd6161; 30 | $u-type-error-light: #fef0f0; 31 | 32 | $u-type-info: #909399; 33 | $u-type-info-disabled: #c8c9cc; 34 | $u-type-info-dark: #82848a; 35 | $u-type-info-light: #f4f4f5; 36 | 37 | $u-form-item-height: 70rpx; 38 | $u-form-item-border-color: #dcdfe6; 39 | -------------------------------------------------------------------------------- /uview-ui/components/u-full-screen/u-full-screen.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 38 | 39 | 53 | -------------------------------------------------------------------------------- /pages/list/index.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 53 | 54 | 62 | -------------------------------------------------------------------------------- /uview-ui/libs/css/style.mp.scss: -------------------------------------------------------------------------------- 1 | /* start--微信小程序编译后页面有组件名的元素,特别处理--start */ 2 | /* #ifdef MP-WEIXIN || MP-QQ */ 3 | u-td, u-th { 4 | flex: 1; 5 | align-self: stretch; 6 | } 7 | 8 | .u-td { 9 | height: 100%; 10 | } 11 | 12 | u-icon { 13 | display: inline-flex; 14 | align-items: center; 15 | } 16 | 17 | // 各家小程序宫格组件外层设置为100%,避免受到父元素display: flex;的影响 18 | u-grid { 19 | width: 100%; 20 | flex: 0 0 100%; 21 | } 22 | 23 | // 避免小程序线条组件因为父组件display: flex;而失效 24 | u-line { 25 | flex: 1; 26 | } 27 | 28 | u-switch { 29 | display: inline-flex; 30 | align-items: center; 31 | } 32 | 33 | u-dropdown { 34 | flex: 1; 35 | } 36 | /* #endif */ 37 | /* end-微信小程序编译后页面有组件名的元素,特别处理--end */ 38 | 39 | 40 | /* #ifdef MP-QQ || MP-TOUTIAO */ 41 | // 需要做这一切额外的兼容,都是因为TX的无能 42 | u-icon { 43 | line-height: 0; 44 | } 45 | /* #endif */ 46 | 47 | /* start--头条小程序编译后页面有组件名的元素,特别处理--start */ 48 | // 由于头条小程序不支持直接组件名形式写样式,目前只能在写组件的时候给组件加上对应的类名 49 | /* #ifdef MP-TOUTIAO */ 50 | .u-td, .u-th, .u-tr { 51 | flex: 1; 52 | align-self: stretch; 53 | } 54 | 55 | .u-row, .u-col { 56 | flex: 1; 57 | align-self: stretch; 58 | } 59 | 60 | // 避免小程序线条组件因为父组件display: flex;而失效 61 | .u-line { 62 | flex: 1; 63 | } 64 | 65 | .u-dropdown { 66 | flex: 1; 67 | } 68 | /* #endif */ 69 | /* end-头条小程序编译后页面有组件名的元素,特别处理--end */ 70 | 71 | 72 | 73 | -------------------------------------------------------------------------------- /uview-ui/components/u-gap/u-gap.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 51 | 52 | 55 | -------------------------------------------------------------------------------- /uview-ui/libs/function/getParent.js: -------------------------------------------------------------------------------- 1 | // 获取父组件的参数,因为支付宝小程序不支持provide/inject的写法 2 | // this.$parent在非H5中,可以准确获取到父组件,但是在H5中,需要多次this.$parent.$parent.xxx 3 | export default function getParent(name, keys) { 4 | let parent = this.$parent; 5 | // 通过while历遍,这里主要是为了H5需要多层解析的问题 6 | while (parent) { 7 | // 父组件 8 | if (parent.$options.name !== name) { 9 | // 如果组件的name不相等,继续上一级寻找 10 | parent = parent.$parent; 11 | } else { 12 | let data = {}; 13 | // 判断keys是否数组,如果传过来的是一个数组,那么直接使用数组元素值当做键值去父组件寻找 14 | if(Array.isArray(keys)) { 15 | keys.map(val => { 16 | data[val] = parent[val] ? parent[val] : ''; 17 | }) 18 | } else { 19 | // 历遍传过来的对象参数 20 | for(let i in keys) { 21 | // 如果子组件有此值则用,无此值则用父组件的值 22 | // 判断是否空数组,如果是,则用父组件的值,否则用子组件的值 23 | if(Array.isArray(keys[i])) { 24 | if(keys[i].length) { 25 | data[i] = keys[i]; 26 | } else { 27 | data[i] = parent[i]; 28 | } 29 | } else if(keys[i].constructor === Object) { 30 | // 判断是否对象,如果是对象,且有属性,那么使用子组件的值,否则使用父组件的值 31 | if(Object.keys(keys[i]).length) { 32 | data[i] = keys[i]; 33 | } else { 34 | data[i] = parent[i]; 35 | } 36 | } else { 37 | // 只要子组件有传值,即使是false值,也是“传值”了,也需要覆盖父组件的同名参数 38 | data[i] = (keys[i] || keys[i] === false) ? keys[i] : parent[i]; 39 | } 40 | } 41 | } 42 | return data; 43 | } 44 | } 45 | 46 | return {}; 47 | } -------------------------------------------------------------------------------- /uview-ui/libs/function/guid.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 本算法来源于简书开源代码,详见:https://www.jianshu.com/p/fdbf293d0a85 3 | * 全局唯一标识符(uuid,Globally Unique Identifier),也称作 uuid(Universally Unique IDentifier) 4 | * 一般用于多个组件之间,给它一个唯一的标识符,或者v-for循环的时候,如果使用数组的index可能会导致更新列表出现问题 5 | * 最可能的情况是左滑删除item或者对某条信息流"不喜欢"并去掉它的时候,会导致组件内的数据可能出现错乱 6 | * v-for的时候,推荐使用后端返回的id而不是循环的index 7 | * @param {Number} len uuid的长度 8 | * @param {Boolean} firstU 将返回的首字母置为"u" 9 | * @param {Nubmer} radix 生成uuid的基数(意味着返回的字符串都是这个基数),2-二进制,8-八进制,10-十进制,16-十六进制 10 | */ 11 | function guid(len = 32, firstU = true, radix = null) { 12 | let chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split(''); 13 | let uuid = []; 14 | radix = radix || chars.length; 15 | 16 | if (len) { 17 | // 如果指定uuid长度,只是取随机的字符,0|x为位运算,能去掉x的小数位,返回整数位 18 | for (let i = 0; i < len; i++) uuid[i] = chars[0 | Math.random() * radix]; 19 | } else { 20 | let r; 21 | // rfc4122标准要求返回的uuid中,某些位为固定的字符 22 | uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-'; 23 | uuid[14] = '4'; 24 | 25 | for (let i = 0; i < 36; i++) { 26 | if (!uuid[i]) { 27 | r = 0 | Math.random() * 16; 28 | uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r]; 29 | } 30 | } 31 | } 32 | // 移除第一个字符,并用u替代,因为第一个字符为数值时,该guuid不能用作id或者class 33 | if (firstU) { 34 | uuid.shift(); 35 | return 'u' + uuid.join(''); 36 | } else { 37 | return uuid.join(''); 38 | } 39 | } 40 | 41 | export default guid; 42 | -------------------------------------------------------------------------------- /uview-ui/libs/function/timeFrom.js: -------------------------------------------------------------------------------- 1 | import timeFormat from '../../libs/function/timeFormat.js'; 2 | 3 | /** 4 | * 时间戳转为多久之前 5 | * @param String timestamp 时间戳 6 | * @param String | Boolean format 如果为时间格式字符串,超出一定时间范围,返回固定的时间格式; 7 | * 如果为布尔值false,无论什么时间,都返回多久以前的格式 8 | */ 9 | function timeFrom(dateTime = null, format = 'yyyy-mm-dd') { 10 | // 如果为null,则格式化当前时间 11 | if (!dateTime) dateTime = Number(new Date()); 12 | // 如果dateTime长度为10或者13,则为秒和毫秒的时间戳,如果超过13位,则为其他的时间格式 13 | if (dateTime.toString().length == 10) dateTime *= 1000; 14 | let timestamp = + new Date(Number(dateTime)); 15 | 16 | let timer = (Number(new Date()) - timestamp) / 1000; 17 | // 如果小于5分钟,则返回"刚刚",其他以此类推 18 | let tips = ''; 19 | switch (true) { 20 | case timer < 300: 21 | tips = '刚刚'; 22 | break; 23 | case timer >= 300 && timer < 3600: 24 | tips = parseInt(timer / 60) + '分钟前'; 25 | break; 26 | case timer >= 3600 && timer < 86400: 27 | tips = parseInt(timer / 3600) + '小时前'; 28 | break; 29 | case timer >= 86400 && timer < 2592000: 30 | tips = parseInt(timer / 86400) + '天前'; 31 | break; 32 | default: 33 | // 如果format为false,则无论什么时间戳,都显示xx之前 34 | if(format === false) { 35 | if(timer >= 2592000 && timer < 365 * 86400) { 36 | tips = parseInt(timer / (86400 * 30)) + '个月前'; 37 | } else { 38 | tips = parseInt(timer / (86400 * 365)) + '年前'; 39 | } 40 | } else { 41 | tips = timeFormat(timestamp, format); 42 | } 43 | } 44 | return tips; 45 | } 46 | 47 | export default timeFrom; 48 | -------------------------------------------------------------------------------- /uview-ui/components/u-th/u-th.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 48 | 49 | 63 | -------------------------------------------------------------------------------- /uview-ui/components/u-cell-group/u-cell-group.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 51 | 52 | 71 | -------------------------------------------------------------------------------- /uview-ui/libs/function/queryParams.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 对象转url参数 3 | * @param {*} data,对象 4 | * @param {*} isPrefix,是否自动加上"?" 5 | */ 6 | function queryParams(data = {}, isPrefix = true, arrayFormat = 'brackets') { 7 | let prefix = isPrefix ? '?' : '' 8 | let _result = [] 9 | if (['indices', 'brackets', 'repeat', 'comma'].indexOf(arrayFormat) == -1) arrayFormat = 'brackets'; 10 | for (let key in data) { 11 | let value = data[key] 12 | // 去掉为空的参数 13 | if (['', undefined, null].indexOf(value) >= 0) { 14 | continue; 15 | } 16 | // 如果值为数组,另行处理 17 | if (value.constructor === Array) { 18 | // e.g. {ids: [1, 2, 3]} 19 | switch (arrayFormat) { 20 | case 'indices': 21 | // 结果: ids[0]=1&ids[1]=2&ids[2]=3 22 | for (let i = 0; i < value.length; i++) { 23 | _result.push(key + '[' + i + ']=' + value[i]) 24 | } 25 | break; 26 | case 'brackets': 27 | // 结果: ids[]=1&ids[]=2&ids[]=3 28 | value.forEach(_value => { 29 | _result.push(key + '[]=' + _value) 30 | }) 31 | break; 32 | case 'repeat': 33 | // 结果: ids=1&ids=2&ids=3 34 | value.forEach(_value => { 35 | _result.push(key + '=' + _value) 36 | }) 37 | break; 38 | case 'comma': 39 | // 结果: ids=1,2,3 40 | let commaStr = ""; 41 | value.forEach(_value => { 42 | commaStr += (commaStr ? "," : "") + _value; 43 | }) 44 | _result.push(key + '=' + commaStr) 45 | break; 46 | default: 47 | value.forEach(_value => { 48 | _result.push(key + '[]=' + _value) 49 | }) 50 | } 51 | } else { 52 | _result.push(key + '=' + value) 53 | } 54 | } 55 | return _result.length ? prefix + _result.join('&') : '' 56 | } 57 | 58 | export default queryParams; 59 | -------------------------------------------------------------------------------- /uview-ui/components/u-td/u-td.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 51 | 52 | 67 | -------------------------------------------------------------------------------- /uview-ui/libs/util/emitter.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 递归使用 call 方式this指向 3 | * @param componentName // 需要找的组件的名称 4 | * @param eventName // 事件名称 5 | * @param params // 需要传递的参数 6 | */ 7 | function broadcast(componentName, eventName, params) { 8 | // 循环子节点找到名称一样的子节点 否则 递归 当前子节点 9 | this.$children.map(child=>{ 10 | if (componentName===child.$options.name) { 11 | child.$emit.apply(child,[eventName].concat(params)) 12 | }else { 13 | broadcast.apply(child,[componentName,eventName].concat(params)) 14 | } 15 | }) 16 | } 17 | export default { 18 | methods: { 19 | /** 20 | * 派发 (向上查找) (一个) 21 | * @param componentName // 需要找的组件的名称 22 | * @param eventName // 事件名称 23 | * @param params // 需要传递的参数 24 | */ 25 | dispatch(componentName, eventName, params) { 26 | let parent = this.$parent || this.$root;//$parent 找到最近的父节点 $root 根节点 27 | let name = parent.$options.name; // 获取当前组件实例的name 28 | // 如果当前有节点 && 当前没名称 且 当前名称等于需要传进来的名称的时候就去查找当前的节点 29 | // 循环出当前名称的一样的组件实例 30 | while (parent && (!name||name!==componentName)) { 31 | parent = parent.$parent; 32 | if (parent) { 33 | name = parent.$options.name; 34 | } 35 | } 36 | // 有节点表示当前找到了name一样的实例 37 | if (parent) { 38 | parent.$emit.apply(parent,[eventName].concat(params)) 39 | } 40 | }, 41 | /** 42 | * 广播 (向下查找) (广播多个) 43 | * @param componentName // 需要找的组件的名称 44 | * @param eventName // 事件名称 45 | * @param params // 需要传递的参数 46 | */ 47 | broadcast(componentName, eventName, params) { 48 | broadcast.call(this,componentName, eventName, params) 49 | } 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /uview-ui/libs/function/timeFormat.js: -------------------------------------------------------------------------------- 1 | // padStart 的 polyfill,因为某些机型或情况,还无法支持es7的padStart,比如电脑版的微信小程序 2 | // 所以这里做一个兼容polyfill的兼容处理 3 | if (!String.prototype.padStart) { 4 | // 为了方便表示这里 fillString 用了ES6 的默认参数,不影响理解 5 | String.prototype.padStart = function(maxLength, fillString = ' ') { 6 | if (Object.prototype.toString.call(fillString) !== "[object String]") throw new TypeError( 7 | 'fillString must be String') 8 | let str = this 9 | // 返回 String(str) 这里是为了使返回的值是字符串字面量,在控制台中更符合直觉 10 | if (str.length >= maxLength) return String(str) 11 | 12 | let fillLength = maxLength - str.length, 13 | times = Math.ceil(fillLength / fillString.length) 14 | while (times >>= 1) { 15 | fillString += fillString 16 | if (times === 1) { 17 | fillString += fillString 18 | } 19 | } 20 | return fillString.slice(0, fillLength) + str; 21 | } 22 | } 23 | 24 | // 其他更多是格式化有如下: 25 | // yyyy:mm:dd|yyyy:mm|yyyy年mm月dd日|yyyy年mm月dd日 hh时MM分等,可自定义组合 26 | function timeFormat(dateTime = null, fmt = 'yyyy-mm-dd') { 27 | // 如果为null,则格式化当前时间 28 | if (!dateTime) dateTime = Number(new Date()); 29 | // 如果dateTime长度为10或者13,则为秒和毫秒的时间戳,如果超过13位,则为其他的时间格式 30 | if (dateTime.toString().length == 10) dateTime *= 1000; 31 | let date = new Date(dateTime); 32 | let ret; 33 | let opt = { 34 | "y+": date.getFullYear().toString(), // 年 35 | "m+": (date.getMonth() + 1).toString(), // 月 36 | "d+": date.getDate().toString(), // 日 37 | "h+": date.getHours().toString(), // 时 38 | "M+": date.getMinutes().toString(), // 分 39 | "s+": date.getSeconds().toString() // 秒 40 | // 有其他格式化字符需求可以继续添加,必须转化成字符串 41 | }; 42 | for (let k in opt) { 43 | ret = new RegExp("(" + k + ")").exec(fmt); 44 | if (ret) { 45 | fmt = fmt.replace(ret[1], (ret[1].length == 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, "0"))) 46 | }; 47 | }; 48 | return fmt; 49 | } 50 | 51 | export default timeFormat 52 | -------------------------------------------------------------------------------- /uni.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * 这里是uni-app内置的常用样式变量 3 | * 4 | * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量 5 | * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App 6 | * 7 | */ 8 | 9 | /** 10 | * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能 11 | * 12 | * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件 13 | */ 14 | 15 | @import 'uview-ui/theme.scss'; 16 | /* 颜色变量 */ 17 | 18 | /* 行为相关颜色 */ 19 | $uni-color-primary: #007aff; 20 | $uni-color-success: #4cd964; 21 | $uni-color-warning: #f0ad4e; 22 | $uni-color-error: #dd524d; 23 | 24 | /* 文字基本颜色 */ 25 | $uni-text-color:#333;//基本色 26 | $uni-text-color-inverse:#fff;//反色 27 | $uni-text-color-grey:#999;//辅助灰色,如加载更多的提示信息 28 | $uni-text-color-placeholder: #808080; 29 | $uni-text-color-disable:#c0c0c0; 30 | 31 | /* 背景颜色 */ 32 | $uni-bg-color:#ffffff; 33 | $uni-bg-color-grey:#f8f8f8; 34 | $uni-bg-color-hover:#f1f1f1;//点击状态颜色 35 | $uni-bg-color-mask:rgba(0, 0, 0, 0.4);//遮罩颜色 36 | 37 | /* 边框颜色 */ 38 | $uni-border-color:#c8c7cc; 39 | 40 | /* 尺寸变量 */ 41 | 42 | /* 文字尺寸 */ 43 | $uni-font-size-sm:12px; 44 | $uni-font-size-base:14px; 45 | $uni-font-size-lg:16; 46 | 47 | /* 图片尺寸 */ 48 | $uni-img-size-sm:20px; 49 | $uni-img-size-base:26px; 50 | $uni-img-size-lg:40px; 51 | 52 | /* Border Radius */ 53 | $uni-border-radius-sm: 2px; 54 | $uni-border-radius-base: 3px; 55 | $uni-border-radius-lg: 6px; 56 | $uni-border-radius-circle: 50%; 57 | 58 | /* 水平间距 */ 59 | $uni-spacing-row-sm: 5px; 60 | $uni-spacing-row-base: 10px; 61 | $uni-spacing-row-lg: 15px; 62 | 63 | /* 垂直间距 */ 64 | $uni-spacing-col-sm: 4px; 65 | $uni-spacing-col-base: 8px; 66 | $uni-spacing-col-lg: 12px; 67 | 68 | /* 透明度 */ 69 | $uni-opacity-disabled: 0.3; // 组件禁用态的透明度 70 | 71 | /* 文章场景相关 */ 72 | $uni-color-title: #2C405A; // 文章标题颜色 73 | $uni-font-size-title:20px; 74 | $uni-color-subtitle: #555555; // 二级标题颜色 75 | $uni-font-size-subtitle:26px; 76 | $uni-color-paragraph: #3F536E; // 文章段落颜色 77 | $uni-font-size-paragraph:15px; 78 | -------------------------------------------------------------------------------- /uview-ui/libs/mixin/mixin.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | data() { 3 | return {} 4 | }, 5 | onLoad() { 6 | // getRect挂载到$u上,因为这方法需要使用in(this),所以无法把它独立成一个单独的文件导出 7 | this.$u.getRect = this.$uGetRect 8 | }, 9 | methods: { 10 | // 查询节点信息 11 | // 目前此方法在支付宝小程序中无法获取组件跟接点的尺寸,为支付宝的bug(2020-07-21) 12 | // 解决办法为在组件根部再套一个没有任何作用的view元素 13 | $uGetRect(selector, all) { 14 | return new Promise(resolve => { 15 | uni.createSelectorQuery(). 16 | in(this)[all ? 'selectAll' : 'select'](selector) 17 | .boundingClientRect(rect => { 18 | if (all && Array.isArray(rect) && rect.length) { 19 | resolve(rect) 20 | } 21 | if (!all && rect) { 22 | resolve(rect) 23 | } 24 | }) 25 | .exec() 26 | }) 27 | }, 28 | getParentData(parentName = '') { 29 | // 避免在created中去定义parent变量 30 | if(!this.parent) this.parent = false; 31 | // 这里的本质原理是,通过获取父组件实例(也即u-radio-group的this) 32 | // 将父组件this中对应的参数,赋值给本组件(u-radio的this)的parentData对象中对应的属性 33 | // 之所以需要这么做,是因为所有端中,头条小程序不支持通过this.parent.xxx去监听父组件参数的变化 34 | this.parent = this.$u.$parent.call(this, parentName); 35 | if(this.parent) { 36 | // 历遍parentData中的属性,将parent中的同名属性赋值给parentData 37 | Object.keys(this.parentData).map(key => { 38 | this.parentData[key] = this.parent[key]; 39 | }); 40 | } 41 | }, 42 | // 阻止事件冒泡 43 | preventEvent(e) { 44 | e && e.stopPropagation && e.stopPropagation() 45 | } 46 | }, 47 | onReachBottom() { 48 | uni.$emit('uOnReachBottom') 49 | }, 50 | beforeDestroy() { 51 | // 判断当前页面是否存在parent和chldren,一般在checkbox和checkbox-group父子联动的场景会有此情况 52 | // 组件销毁时,移除子组件在父组件children数组中的实例,释放资源,避免数据混乱 53 | if(this.parent && uni.$u.test.array(this.parent.children)) { 54 | // 组件销毁时,移除父组件中的children数组中对应的实例 55 | const childrenList = this.parent.children 56 | childrenList.map((child, index) => { 57 | // 如果相等,则移除 58 | if(child === this) { 59 | childrenList.splice(index, 1) 60 | } 61 | }) 62 | } 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /uview-ui/components/u-time-line-item/u-time-line-item.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 52 | 53 | 84 | -------------------------------------------------------------------------------- /uview-ui/components/u-table/u-table.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 76 | 77 | 85 | -------------------------------------------------------------------------------- /pages.json: -------------------------------------------------------------------------------- 1 | { 2 | "pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages 3 | { 4 | "path": "pages/index/index", 5 | "style": { 6 | "navigationBarTitleText": "首页", 7 | "navigationBarBackgroundColor": "#007AFF", 8 | "enablePullDownRefresh": true, 9 | "h5": { 10 | "pullToRefresh": { 11 | "color": "#C8C7CC" 12 | } 13 | } 14 | } 15 | }, 16 | { 17 | "path": "pages/self/index", 18 | "style": { 19 | "navigationBarTitleText": "我的", 20 | "navigationBarBackgroundColor": "#007AFF" 21 | } 22 | }, 23 | { 24 | "path": "pages/detail/index" 25 | }, 26 | { 27 | "path" : "pages/list/index", 28 | "style" : 29 | { 30 | "navigationBarTitleText": "列表", 31 | "navigationBarBackgroundColor": "#007AFF" 32 | } 33 | 34 | }, 35 | { 36 | "path": "pages/tab" 37 | }, 38 | { 39 | "path": "pages/table/index" 40 | } 41 | ], 42 | "globalStyle": { 43 | "navigationBarTextStyle": "black", 44 | "navigationBarTitleText": "uni-app", 45 | "navigationBarBackgroundColor": "#F8F8F8", 46 | "backgroundColor": "#F8F8F8" 47 | }, 48 | "tabBar": { 49 | "color": "#7A7E83", 50 | "selectedColor": "#3cc51f", 51 | "borderStyle": "black", 52 | "backgroundColor": "#fff", 53 | "iconWidth": "40px", 54 | "list": [ 55 | { 56 | "pagePath": "pages/index/index", 57 | "iconPath": "static/home.png", 58 | "selectedIconPath": "static/home1.png" 59 | }, 60 | { 61 | "pagePath": "pages/list/index", 62 | "iconPath": "static/home.png", 63 | "selectedIconPath": "static/home1.png" 64 | }, 65 | { 66 | "pagePath": "pages/self/index", 67 | "iconPath": "static/my.png", 68 | "selectedIconPath": "static/my1.png" 69 | } 70 | ] 71 | }, 72 | "easycom": { 73 | "^u-(.*)": "uview-ui/components/u-$1/u-$1.vue" 74 | } 75 | // "condition": { 76 | // "current": 0, 77 | // "list": [ 78 | // { 79 | // "name": "详情页", 80 | // "path": "pages/detail/index", 81 | // "query": "id=1" 82 | // } 83 | // ] 84 | // } 85 | } 86 | -------------------------------------------------------------------------------- /uview-ui/components/u-row/u-row.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 65 | 66 | 85 | -------------------------------------------------------------------------------- /uview-ui/components/u-link/u-link.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 82 | 83 | 90 | -------------------------------------------------------------------------------- /uview-ui/components/u-index-anchor/u-index-anchor.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 68 | 69 | 90 | -------------------------------------------------------------------------------- /uview-ui/components/u-line/u-line.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 77 | 78 | 85 | -------------------------------------------------------------------------------- /uview-ui/components/u-collapse/u-collapse.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 96 | 97 | 100 | -------------------------------------------------------------------------------- /pages/index/index.vue: -------------------------------------------------------------------------------- 1 | 29 | 30 | 94 | 95 | 122 | -------------------------------------------------------------------------------- /uview-ui/README.md: -------------------------------------------------------------------------------- 1 |

2 | logo 3 |

4 |

uView

5 |

多平台快速开发的UI框架

6 | 7 | 8 | ## 说明 9 | 10 | uView UI,是[uni-app](https://uniapp.dcloud.io/)生态优秀的UI框架,全面的组件和便捷的工具会让您信手拈来,如鱼得水 11 | 12 | ## 特性 13 | 14 | - 兼容安卓,iOS,微信小程序,H5,QQ小程序,百度小程序,支付宝小程序,头条小程序 15 | - 60+精选组件,功能丰富,多端兼容,让您快速集成,开箱即用 16 | - 众多贴心的JS利器,让您飞镖在手,召之即来,百步穿杨 17 | - 众多的常用页面和布局,让您专注逻辑,事半功倍 18 | - 详尽的文档支持,现代化的演示效果 19 | - 按需引入,精简打包体积 20 | 21 | 22 | ## 安装 23 | 24 | ```bash 25 | # npm方式安装 26 | npm i uview-ui 27 | ``` 28 | 29 | ## 快速上手 30 | 31 | 1. `main.js`引入uView库 32 | ```js 33 | // main.js 34 | import uView from 'uview-ui'; 35 | Vue.use(uView); 36 | ``` 37 | 38 | 2. `App.vue`引入基础样式(注意style标签需声明scss属性支持) 39 | ```css 40 | /* App.vue */ 41 | 44 | ``` 45 | 46 | 3. `uni.scss`引入全局scss变量文件 47 | ```css 48 | /* uni.scss */ 49 | @import "uview-ui/theme.scss"; 50 | ``` 51 | 52 | 4. `pages.json`配置easycom规则(按需引入) 53 | 54 | ```js 55 | // pages.json 56 | { 57 | "easycom": { 58 | // npm安装的方式不需要前面的"@/",下载安装的方式需要"@/" 59 | // npm安装方式 60 | "^u-(.*)": "uview-ui/components/u-$1/u-$1.vue" 61 | // 下载安装方式 62 | // "^u-(.*)": "@/uview-ui/components/u-$1/u-$1.vue" 63 | }, 64 | // 此为本身已有的内容 65 | "pages": [ 66 | // ...... 67 | ] 68 | } 69 | ``` 70 | 71 | 请通过[快速上手](https://uviewui.com/components/quickstart.html)了解更详细的内容 72 | 73 | ## 使用方法 74 | 配置easycom规则后,自动按需引入,无需`import`组件,直接引用即可。 75 | 76 | ```html 77 | 80 | ``` 81 | 82 | 请通过[快速上手](https://uviewui.com/components/quickstart.html)了解更详细的内容 83 | 84 | ## 链接 85 | 86 | - [官方文档](https://uviewui.com/) 87 | - [更新日志](https://uviewui.com/components/changelog.html) 88 | - [升级指南](https://uviewui.com/components/changelog.html) 89 | - [关于我们](https://uviewui.com/cooperation/about.html) 90 | 91 | ## 预览 92 | 93 | 您可以通过**微信**扫码,查看最佳的演示效果。 94 |
95 |
96 | 97 | 98 | 105 | ## 版权信息 106 | uView遵循[MIT](https://en.wikipedia.org/wiki/MIT_License)开源协议,意味着您无需支付任何费用,也无需授权,即可将uView应用到您的产品中。 107 | -------------------------------------------------------------------------------- /uview-ui/components/u-parse/libs/config.js: -------------------------------------------------------------------------------- 1 | /* 配置文件 */ 2 | var cfg = { 3 | // 出错占位图 4 | errorImg: null, 5 | // 过滤器函数 6 | filter: null, 7 | // 代码高亮函数 8 | highlight: null, 9 | // 文本处理函数 10 | onText: null, 11 | // 实体编码列表 12 | entities: { 13 | quot: '"', 14 | apos: "'", 15 | semi: ';', 16 | nbsp: '\xA0', 17 | ensp: '\u2002', 18 | emsp: '\u2003', 19 | ndash: '–', 20 | mdash: '—', 21 | middot: '·', 22 | lsquo: '‘', 23 | rsquo: '’', 24 | ldquo: '“', 25 | rdquo: '”', 26 | bull: '•', 27 | hellip: '…' 28 | }, 29 | blankChar: makeMap(' ,\xA0,\t,\r,\n,\f'), 30 | boolAttrs: makeMap('allowfullscreen,autoplay,autostart,controls,ignore,loop,muted'), 31 | // 块级标签,将被转为 div 32 | blockTags: makeMap('address,article,aside,body,caption,center,cite,footer,header,html,nav,pre,section'), 33 | // 将被移除的标签 34 | ignoreTags: makeMap('area,base,canvas,frame,iframe,input,link,map,meta,param,script,source,style,svg,textarea,title,track,wbr'), 35 | // 只能被 rich-text 显示的标签 36 | richOnlyTags: makeMap('a,colgroup,fieldset,legend'), 37 | // 自闭合的标签 38 | selfClosingTags: makeMap('area,base,br,col,circle,ellipse,embed,frame,hr,img,input,line,link,meta,param,path,polygon,rect,source,track,use,wbr'), 39 | // 信任的标签 40 | trustTags: makeMap('a,abbr,ad,audio,b,blockquote,br,code,col,colgroup,dd,del,dl,dt,div,em,fieldset,h1,h2,h3,h4,h5,h6,hr,i,img,ins,label,legend,li,ol,p,q,source,span,strong,sub,sup,table,tbody,td,tfoot,th,thead,tr,title,ul,video'), 41 | // 默认的标签样式 42 | userAgentStyles: { 43 | address: 'font-style:italic', 44 | big: 'display:inline;font-size:1.2em', 45 | blockquote: 'background-color:#f6f6f6;border-left:3px solid #dbdbdb;color:#6c6c6c;padding:5px 0 5px 10px', 46 | caption: 'display:table-caption;text-align:center', 47 | center: 'text-align:center', 48 | cite: 'font-style:italic', 49 | dd: 'margin-left:40px', 50 | mark: 'background-color:yellow', 51 | pre: 'font-family:monospace;white-space:pre;overflow:scroll', 52 | s: 'text-decoration:line-through', 53 | small: 'display:inline;font-size:0.8em', 54 | u: 'text-decoration:underline' 55 | } 56 | } 57 | 58 | function makeMap(str) { 59 | var map = Object.create(null), 60 | list = str.split(','); 61 | for (var i = list.length; i--;) 62 | map[list[i]] = true; 63 | return map; 64 | } 65 | 66 | // #ifdef MP-WEIXIN 67 | if (wx.canIUse('editor')) { 68 | cfg.blockTags.pre = void 0; 69 | cfg.ignoreTags.rp = true; 70 | Object.assign(cfg.richOnlyTags, makeMap('bdi,bdo,caption,rt,ruby')); 71 | Object.assign(cfg.trustTags, makeMap('bdi,bdo,caption,pre,rt,ruby')); 72 | } 73 | // #endif 74 | 75 | // #ifdef APP-PLUS 76 | cfg.ignoreTags.iframe = void 0; 77 | Object.assign(cfg.trustTags, makeMap('embed,iframe')); 78 | // #endif 79 | 80 | module.exports = cfg; 81 | -------------------------------------------------------------------------------- /uview-ui/components/u-grid/u-grid.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 90 | 91 | 109 | -------------------------------------------------------------------------------- /manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name" : "uni-project", 3 | "appid" : "", 4 | "description" : "", 5 | "versionName" : "1.0.0", 6 | "versionCode" : "100", 7 | "transformPx" : false, 8 | /* 5+App特有相关 */ 9 | "app-plus" : { 10 | "usingComponents" : true, 11 | "nvueStyleCompiler" : "uni-app", 12 | "compilerVersion" : 3, 13 | "splashscreen" : { 14 | "alwaysShowBeforeRender" : true, 15 | "waiting" : true, 16 | "autoclose" : true, 17 | "delay" : 0 18 | }, 19 | /* 模块配置 */ 20 | "modules" : {}, 21 | /* 应用发布信息 */ 22 | "distribute" : { 23 | /* android打包配置 */ 24 | "android" : { 25 | "permissions" : [ 26 | "", 27 | "", 28 | "", 29 | "", 30 | "", 31 | "", 32 | "", 33 | "", 34 | "", 35 | "", 36 | "", 37 | "", 38 | "", 39 | "", 40 | "" 41 | ] 42 | }, 43 | /* ios打包配置 */ 44 | "ios" : {}, 45 | /* SDK配置 */ 46 | "sdkConfigs" : {} 47 | } 48 | }, 49 | /* 快应用特有相关 */ 50 | "quickapp" : {}, 51 | /* 小程序特有相关 */ 52 | "mp-weixin" : { 53 | "appid" : "", 54 | "setting" : { 55 | "urlCheck" : false 56 | }, 57 | "usingComponents" : true 58 | }, 59 | "mp-alipay" : { 60 | "usingComponents" : true 61 | }, 62 | "mp-baidu" : { 63 | "usingComponents" : true 64 | }, 65 | "mp-toutiao" : { 66 | "usingComponents" : true 67 | }, 68 | "uniStatistics" : { 69 | "enable" : false 70 | }, 71 | "vueVersion" : "2" 72 | } 73 | -------------------------------------------------------------------------------- /uview-ui/components/u-top-tips/u-top-tips.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 69 | 70 | 122 | -------------------------------------------------------------------------------- /uview-ui/libs/css/color.scss: -------------------------------------------------------------------------------- 1 | .u-type-primary-light { 2 | color: $u-type-primary-light; 3 | } 4 | 5 | .u-type-warning-light { 6 | color: $u-type-warning-light; 7 | } 8 | 9 | .u-type-success-light { 10 | color: $u-type-success-light; 11 | } 12 | 13 | .u-type-error-light { 14 | color: $u-type-error-light; 15 | } 16 | 17 | .u-type-info-light { 18 | color: $u-type-info-light; 19 | } 20 | 21 | .u-type-primary-light-bg { 22 | background-color: $u-type-primary-light; 23 | } 24 | 25 | .u-type-warning-light-bg { 26 | background-color: $u-type-warning-light; 27 | } 28 | 29 | .u-type-success-light-bg { 30 | background-color: $u-type-success-light; 31 | } 32 | 33 | .u-type-error-light-bg { 34 | background-color: $u-type-error-light; 35 | } 36 | 37 | .u-type-info-light-bg { 38 | background-color: $u-type-info-light; 39 | } 40 | 41 | .u-type-primary-dark { 42 | color: $u-type-primary-dark; 43 | } 44 | 45 | .u-type-warning-dark { 46 | color: $u-type-warning-dark; 47 | } 48 | 49 | .u-type-success-dark { 50 | color: $u-type-success-dark; 51 | } 52 | 53 | .u-type-error-dark { 54 | color: $u-type-error-dark; 55 | } 56 | 57 | .u-type-info-dark { 58 | color: $u-type-info-dark; 59 | } 60 | 61 | .u-type-primary-dark-bg { 62 | background-color: $u-type-primary-dark; 63 | } 64 | 65 | .u-type-warning-dark-bg { 66 | background-color: $u-type-warning-dark; 67 | } 68 | 69 | .u-type-success-dark-bg { 70 | background-color: $u-type-success-dark; 71 | } 72 | 73 | .u-type-error-dark-bg { 74 | background-color: $u-type-error-dark; 75 | } 76 | 77 | .u-type-info-dark-bg { 78 | background-color: $u-type-info-dark; 79 | } 80 | 81 | .u-type-primary-disabled { 82 | color: $u-type-primary-disabled; 83 | } 84 | 85 | .u-type-warning-disabled { 86 | color: $u-type-warning-disabled; 87 | } 88 | 89 | .u-type-success-disabled { 90 | color: $u-type-success-disabled; 91 | } 92 | 93 | .u-type-error-disabled { 94 | color: $u-type-error-disabled; 95 | } 96 | 97 | .u-type-info-disabled { 98 | color: $u-type-info-disabled; 99 | } 100 | 101 | .u-type-primary { 102 | color: $u-type-primary; 103 | } 104 | 105 | .u-type-warning { 106 | color: $u-type-warning; 107 | } 108 | 109 | .u-type-success { 110 | color: $u-type-success; 111 | } 112 | 113 | .u-type-error { 114 | color: $u-type-error; 115 | } 116 | 117 | .u-type-info { 118 | color: $u-type-info; 119 | } 120 | 121 | .u-type-primary-bg { 122 | background-color: $u-type-primary; 123 | } 124 | 125 | .u-type-warning-bg { 126 | background-color: $u-type-warning; 127 | } 128 | 129 | .u-type-success-bg { 130 | background-color: $u-type-success; 131 | } 132 | 133 | .u-type-error-bg { 134 | background-color: $u-type-error; 135 | } 136 | 137 | .u-type-info-bg { 138 | background-color: $u-type-info; 139 | } 140 | 141 | .u-main-color { 142 | color: $u-main-color; 143 | } 144 | 145 | .u-content-color { 146 | color: $u-content-color; 147 | } 148 | 149 | .u-tips-color { 150 | color: $u-tips-color; 151 | } 152 | 153 | .u-light-color { 154 | color: $u-light-color; 155 | } 156 | -------------------------------------------------------------------------------- /uview-ui/components/u-grid-item/u-grid-item.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 81 | 82 | 127 | -------------------------------------------------------------------------------- /uview-ui/components/u-mask/u-mask.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 102 | 103 | 124 | -------------------------------------------------------------------------------- /uview-ui/libs/css/common.scss: -------------------------------------------------------------------------------- 1 | .u-relative, 2 | .u-rela { 3 | position: relative; 4 | } 5 | 6 | .u-absolute, 7 | .u-abso { 8 | position: absolute; 9 | } 10 | 11 | // nvue不能用标签命名样式,不能放在微信组件中,否则微信开发工具会报警告,无法使用标签名当做选择器 12 | /* #ifndef APP-NVUE */ 13 | image { 14 | display: inline-block; 15 | } 16 | 17 | // 在weex,也即nvue中,所有元素默认为border-box 18 | view, 19 | text { 20 | box-sizing: border-box; 21 | } 22 | /* #endif */ 23 | 24 | .u-font-xs { 25 | font-size: 22rpx; 26 | } 27 | 28 | .u-font-sm { 29 | font-size: 26rpx; 30 | } 31 | 32 | .u-font-md { 33 | font-size: 28rpx; 34 | } 35 | 36 | .u-font-lg { 37 | font-size: 30rpx; 38 | } 39 | 40 | .u-font-xl { 41 | font-size: 34rpx; 42 | } 43 | 44 | .u-flex { 45 | /* #ifndef APP-NVUE */ 46 | display: flex; 47 | /* #endif */ 48 | flex-direction: row; 49 | align-items: center; 50 | } 51 | 52 | .u-flex-wrap { 53 | flex-wrap: wrap; 54 | } 55 | 56 | .u-flex-nowrap { 57 | flex-wrap: nowrap; 58 | } 59 | 60 | .u-col-center { 61 | align-items: center; 62 | } 63 | 64 | .u-col-top { 65 | align-items: flex-start; 66 | } 67 | 68 | .u-col-bottom { 69 | align-items: flex-end; 70 | } 71 | 72 | .u-row-center { 73 | justify-content: center; 74 | } 75 | 76 | .u-row-left { 77 | justify-content: flex-start; 78 | } 79 | 80 | .u-row-right { 81 | justify-content: flex-end; 82 | } 83 | 84 | .u-row-between { 85 | justify-content: space-between; 86 | } 87 | 88 | .u-row-around { 89 | justify-content: space-around; 90 | } 91 | 92 | .u-text-left { 93 | text-align: left; 94 | } 95 | 96 | .u-text-center { 97 | text-align: center; 98 | } 99 | 100 | .u-text-right { 101 | text-align: right; 102 | } 103 | 104 | .u-flex-col { 105 | /* #ifndef APP-NVUE */ 106 | display: flex; 107 | /* #endif */ 108 | flex-direction: column; 109 | } 110 | 111 | // 定义flex等分 112 | @for $i from 0 through 12 { 113 | .u-flex-#{$i} { 114 | flex: $i; 115 | } 116 | } 117 | 118 | // 定义字体(px)单位,小于20都为px单位字体 119 | @for $i from 9 to 20 { 120 | .u-font-#{$i} { 121 | font-size: $i + px; 122 | } 123 | } 124 | 125 | // 定义字体(rpx)单位,大于或等于20的都为rpx单位字体 126 | @for $i from 20 through 40 { 127 | .u-font-#{$i} { 128 | font-size: $i + rpx; 129 | } 130 | } 131 | 132 | // 定义内外边距,历遍1-80 133 | @for $i from 0 through 80 { 134 | // 只要双数和能被5除尽的数 135 | @if $i % 2 == 0 or $i % 5 == 0 { 136 | // 得出:u-margin-30或者u-m-30 137 | .u-margin-#{$i}, .u-m-#{$i} { 138 | margin: $i + rpx!important; 139 | } 140 | 141 | // 得出:u-padding-30或者u-p-30 142 | .u-padding-#{$i}, .u-p-#{$i} { 143 | padding: $i + rpx!important; 144 | } 145 | 146 | @each $short, $long in l left, t top, r right, b bottom { 147 | // 缩写版,结果如: u-m-l-30 148 | // 定义外边距 149 | .u-m-#{$short}-#{$i} { 150 | margin-#{$long}: $i + rpx!important; 151 | } 152 | 153 | // 定义内边距 154 | .u-p-#{$short}-#{$i} { 155 | padding-#{$long}: $i + rpx!important; 156 | } 157 | 158 | // 完整版,结果如:u-margin-left-30 159 | // 定义外边距 160 | .u-margin-#{$long}-#{$i} { 161 | margin-#{$long}: $i + rpx!important; 162 | } 163 | 164 | // 定义内边距 165 | .u-padding-#{$long}-#{$i} { 166 | padding-#{$long}: $i + rpx!important; 167 | } 168 | } 169 | } 170 | } 171 | 172 | // 重置nvue的默认关于flex的样式 173 | .u-reset-nvue { 174 | flex-direction: row; 175 | align-items: center; 176 | } -------------------------------------------------------------------------------- /pages/self/index.vue: -------------------------------------------------------------------------------- 1 | 30 | 31 | 84 | 85 | 130 | -------------------------------------------------------------------------------- /uview-ui/components/u-checkbox-group/u-checkbox-group.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 113 | 114 | 124 | -------------------------------------------------------------------------------- /uview-ui/components/u-parse/libs/CssHandler.js: -------------------------------------------------------------------------------- 1 | const cfg = require('./config.js'), 2 | isLetter = c => (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'); 3 | 4 | function CssHandler(tagStyle) { 5 | var styles = Object.assign(Object.create(null), cfg.userAgentStyles); 6 | for (var item in tagStyle) 7 | styles[item] = (styles[item] ? styles[item] + ';' : '') + tagStyle[item]; 8 | this.styles = styles; 9 | } 10 | CssHandler.prototype.getStyle = function(data) { 11 | this.styles = new parser(data, this.styles).parse(); 12 | } 13 | CssHandler.prototype.match = function(name, attrs) { 14 | var tmp, matched = (tmp = this.styles[name]) ? tmp + ';' : ''; 15 | if (attrs.class) { 16 | var items = attrs.class.split(' '); 17 | for (var i = 0, item; item = items[i]; i++) 18 | if (tmp = this.styles['.' + item]) 19 | matched += tmp + ';'; 20 | } 21 | if (tmp = this.styles['#' + attrs.id]) 22 | matched += tmp + ';'; 23 | return matched; 24 | } 25 | module.exports = CssHandler; 26 | 27 | function parser(data, init) { 28 | this.data = data; 29 | this.floor = 0; 30 | this.i = 0; 31 | this.list = []; 32 | this.res = init; 33 | this.state = this.Space; 34 | } 35 | parser.prototype.parse = function() { 36 | for (var c; c = this.data[this.i]; this.i++) 37 | this.state(c); 38 | return this.res; 39 | } 40 | parser.prototype.section = function() { 41 | return this.data.substring(this.start, this.i); 42 | } 43 | // 状态机 44 | parser.prototype.Space = function(c) { 45 | if (c == '.' || c == '#' || isLetter(c)) { 46 | this.start = this.i; 47 | this.state = this.Name; 48 | } else if (c == '/' && this.data[this.i + 1] == '*') 49 | this.Comment(); 50 | else if (!cfg.blankChar[c] && c != ';') 51 | this.state = this.Ignore; 52 | } 53 | parser.prototype.Comment = function() { 54 | this.i = this.data.indexOf('*/', this.i) + 1; 55 | if (!this.i) this.i = this.data.length; 56 | this.state = this.Space; 57 | } 58 | parser.prototype.Ignore = function(c) { 59 | if (c == '{') this.floor++; 60 | else if (c == '}' && !--this.floor) { 61 | this.list = []; 62 | this.state = this.Space; 63 | } 64 | } 65 | parser.prototype.Name = function(c) { 66 | if (cfg.blankChar[c]) { 67 | this.list.push(this.section()); 68 | this.state = this.NameSpace; 69 | } else if (c == '{') { 70 | this.list.push(this.section()); 71 | this.Content(); 72 | } else if (c == ',') { 73 | this.list.push(this.section()); 74 | this.Comma(); 75 | } else if (!isLetter(c) && (c < '0' || c > '9') && c != '-' && c != '_') 76 | this.state = this.Ignore; 77 | } 78 | parser.prototype.NameSpace = function(c) { 79 | if (c == '{') this.Content(); 80 | else if (c == ',') this.Comma(); 81 | else if (!cfg.blankChar[c]) this.state = this.Ignore; 82 | } 83 | parser.prototype.Comma = function() { 84 | while (cfg.blankChar[this.data[++this.i]]); 85 | if (this.data[this.i] == '{') this.Content(); 86 | else { 87 | this.start = this.i--; 88 | this.state = this.Name; 89 | } 90 | } 91 | parser.prototype.Content = function() { 92 | this.start = ++this.i; 93 | if ((this.i = this.data.indexOf('}', this.i)) == -1) this.i = this.data.length; 94 | var content = this.section(); 95 | for (var i = 0, item; item = this.list[i++];) 96 | if (this.res[item]) this.res[item] += ';' + content; 97 | else this.res[item] = content; 98 | this.list = []; 99 | this.state = this.Space; 100 | } 101 | -------------------------------------------------------------------------------- /uview-ui/libs/function/route.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 路由跳转方法,该方法相对于直接使用uni.xxx的好处是使用更加简单快捷 3 | * 并且带有路由拦截功能 4 | */ 5 | 6 | class Router { 7 | constructor() { 8 | // 原始属性定义 9 | this.config = { 10 | type: 'navigateTo', 11 | url: '', 12 | delta: 1, // navigateBack页面后退时,回退的层数 13 | params: {}, // 传递的参数 14 | animationType: 'pop-in', // 窗口动画,只在APP有效 15 | animationDuration: 300, // 窗口动画持续时间,单位毫秒,只在APP有效 16 | intercept: false, // 是否需要拦截 17 | } 18 | // 因为route方法是需要对外赋值给另外的对象使用,同时route内部有使用this,会导致route失去上下文 19 | // 这里在构造函数中进行this绑定 20 | this.route = this.route.bind(this) 21 | } 22 | 23 | // 判断url前面是否有"/",如果没有则加上,否则无法跳转 24 | addRootPath(url) { 25 | return url[0] === '/' ? url : `/${url}` 26 | } 27 | 28 | // 整合路由参数 29 | mixinParam(url, params) { 30 | url = url && this.addRootPath(url) 31 | 32 | // 使用正则匹配,主要依据是判断是否有"/","?","="等,如“/page/index/index?name=mary" 33 | // 如果有url中有get参数,转换后无需带上"?" 34 | let query = '' 35 | if (/.*\/.*\?.*=.*/.test(url)) { 36 | // object对象转为get类型的参数 37 | query = uni.$u.queryParams(params, false); 38 | // 因为已有get参数,所以后面拼接的参数需要带上"&"隔开 39 | return url += "&" + query 40 | } else { 41 | // 直接拼接参数,因为此处url中没有后面的query参数,也就没有"?/&"之类的符号 42 | query = uni.$u.queryParams(params); 43 | return url += query 44 | } 45 | } 46 | 47 | // 对外的方法名称 48 | async route(options = {}, params = {}) { 49 | // 合并用户的配置和内部的默认配置 50 | let mergeConfig = {} 51 | 52 | if (typeof options === 'string') { 53 | // 如果options为字符串,则为route(url, params)的形式 54 | mergeConfig.url = this.mixinParam(options, params) 55 | mergeConfig.type = 'navigateTo' 56 | } else { 57 | mergeConfig = uni.$u.deepClone(options, this.config) 58 | // 否则正常使用mergeConfig中的url和params进行拼接 59 | mergeConfig.url = this.mixinParam(options.url, options.params) 60 | } 61 | 62 | if(params.intercept) { 63 | this.config.intercept = params.intercept 64 | } 65 | // params参数也带给拦截器 66 | mergeConfig.params = params 67 | // 合并内外部参数 68 | mergeConfig = uni.$u.deepMerge(this.config, mergeConfig) 69 | // 判断用户是否定义了拦截器 70 | if (typeof uni.$u.routeIntercept === 'function') { 71 | // 定一个promise,根据用户执行resolve(true)或者resolve(false)来决定是否进行路由跳转 72 | const isNext = await new Promise((resolve, reject) => { 73 | uni.$u.routeIntercept(mergeConfig, resolve) 74 | }) 75 | // 如果isNext为true,则执行路由跳转 76 | isNext && this.openPage(mergeConfig) 77 | } else { 78 | this.openPage(mergeConfig) 79 | } 80 | } 81 | 82 | // 执行路由跳转 83 | openPage(config) { 84 | // 解构参数 85 | const { 86 | url, 87 | type, 88 | delta, 89 | animationType, 90 | animationDuration 91 | } = config 92 | if (config.type == 'navigateTo' || config.type == 'to') { 93 | uni.navigateTo({ 94 | url, 95 | animationType, 96 | animationDuration 97 | }); 98 | } 99 | if (config.type == 'redirectTo' || config.type == 'redirect') { 100 | uni.redirectTo({ 101 | url 102 | }); 103 | } 104 | if (config.type == 'switchTab' || config.type == 'tab') { 105 | uni.switchTab({ 106 | url 107 | }); 108 | } 109 | if (config.type == 'reLaunch' || config.type == 'launch') { 110 | uni.reLaunch({ 111 | url 112 | }); 113 | } 114 | if (config.type == 'navigateBack' || config.type == 'back') { 115 | uni.navigateBack({ 116 | delta 117 | }); 118 | } 119 | } 120 | } 121 | 122 | export default (new Router()).route -------------------------------------------------------------------------------- /uview-ui/components/u-form/u-form.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 131 | 132 | 135 | -------------------------------------------------------------------------------- /uview-ui/components/u-back-top/u-back-top.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | 124 | 125 | 154 | -------------------------------------------------------------------------------- /uview-ui/components/u-col/u-col.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 95 | 96 | 157 | -------------------------------------------------------------------------------- /components/ComTable/index.vue: -------------------------------------------------------------------------------- 1 | 50 | 51 | 103 | 104 | 142 | -------------------------------------------------------------------------------- /uview-ui/components/u-line-progress/u-line-progress.vue: -------------------------------------------------------------------------------- 1 | 19 | 20 | 102 | 103 | 148 | -------------------------------------------------------------------------------- /uview-ui/components/u-radio-group/u-radio-group.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 118 | 119 | 129 | -------------------------------------------------------------------------------- /uview-ui/libs/css/style.vue.scss: -------------------------------------------------------------------------------- 1 | page { 2 | color: $u-main-color; 3 | font-size: 28rpx; 4 | } 5 | 6 | /* start--去除webkit的默认样式--start */ 7 | .u-fix-ios-appearance { 8 | -webkit-appearance:none; 9 | } 10 | /* end--去除webkit的默认样式--end */ 11 | 12 | /* start--icon图标外层套一个view,让其达到更好的垂直居中的效果--start */ 13 | .u-icon-wrap { 14 | display: flex; 15 | align-items: center; 16 | } 17 | /* end-icon图标外层套一个view,让其达到更好的垂直居中的效果--end */ 18 | 19 | /* start--iPhoneX底部安全区定义--start */ 20 | .safe-area-inset-bottom { 21 | padding-bottom: 0; 22 | padding-bottom: constant(safe-area-inset-bottom); 23 | padding-bottom: env(safe-area-inset-bottom); 24 | } 25 | /* end-iPhoneX底部安全区定义--end */ 26 | 27 | /* start--各种hover点击反馈相关的类名-start */ 28 | .u-hover-class { 29 | // background-color: #f7f8f9!important; 30 | opacity: 0.6; 31 | } 32 | 33 | .u-cell-hover { 34 | background-color: #f7f8f9!important; 35 | } 36 | /* end--各种hover点击反馈相关的类名--end */ 37 | 38 | /* start--文本行数限制--start */ 39 | .u-line-1 { 40 | overflow: hidden; 41 | white-space: nowrap; 42 | text-overflow: ellipsis; 43 | } 44 | 45 | .u-line-2 { 46 | -webkit-line-clamp: 2; 47 | } 48 | 49 | .u-line-3 { 50 | -webkit-line-clamp: 3; 51 | } 52 | 53 | .u-line-4 { 54 | -webkit-line-clamp: 4; 55 | } 56 | 57 | .u-line-5 { 58 | -webkit-line-clamp: 5; 59 | } 60 | 61 | .u-line-2, .u-line-3, .u-line-4, .u-line-5 { 62 | overflow: hidden; 63 | word-break: break-all; 64 | text-overflow: ellipsis; 65 | display: -webkit-box; // 弹性伸缩盒 66 | -webkit-box-orient: vertical; // 设置伸缩盒子元素排列方式 67 | } 68 | 69 | /* end--文本行数限制--end */ 70 | 71 | 72 | /* start--Retina 屏幕下的 1px 边框--start */ 73 | .u-border, 74 | .u-border-bottom, 75 | .u-border-left, 76 | .u-border-right, 77 | .u-border-top, 78 | .u-border-top-bottom { 79 | position: relative 80 | } 81 | 82 | .u-border-bottom:after, 83 | .u-border-left:after, 84 | .u-border-right:after, 85 | .u-border-top-bottom:after, 86 | .u-border-top:after, 87 | .u-border:after { 88 | /* #ifndef APP-NVUE */ 89 | content: ' '; 90 | /* #endif */ 91 | position: absolute; 92 | left: 0; 93 | top: 0; 94 | pointer-events: none; 95 | box-sizing: border-box; 96 | -webkit-transform-origin: 0 0; 97 | transform-origin: 0 0; 98 | // 多加0.1%,能解决有时候边框缺失的问题 99 | width: 199.8%; 100 | height: 199.7%; 101 | transform: scale(0.5, 0.5); 102 | border: 0 solid $u-border-color; 103 | z-index: 2; 104 | } 105 | 106 | .u-border-top:after { 107 | border-top-width: 1px 108 | } 109 | 110 | .u-border-left:after { 111 | border-left-width: 1px 112 | } 113 | 114 | .u-border-right:after { 115 | border-right-width: 1px 116 | } 117 | 118 | .u-border-bottom:after { 119 | border-bottom-width: 1px 120 | } 121 | 122 | .u-border-top-bottom:after { 123 | border-width: 1px 0 124 | } 125 | 126 | .u-border:after { 127 | border-width: 1px 128 | } 129 | /* end--Retina 屏幕下的 1px 边框--end */ 130 | 131 | 132 | /* start--clearfix--start */ 133 | .u-clearfix:after, 134 | .clearfix:after { 135 | /* #ifndef APP-NVUE */ 136 | content: ''; 137 | /* #endif */ 138 | display: table; 139 | clear: both 140 | } 141 | /* end--clearfix--end */ 142 | 143 | /* start--高斯模糊tabbar底部处理--start */ 144 | .u-blur-effect-inset { 145 | width: 750rpx; 146 | height: var(--window-bottom); 147 | background-color: #FFFFFF; 148 | } 149 | /* end--高斯模糊tabbar底部处理--end */ 150 | 151 | /* start--提升H5端uni.toast()的层级,避免被uView的modal等遮盖--start */ 152 | /* #ifdef H5 */ 153 | uni-toast { 154 | z-index: 10090; 155 | } 156 | uni-toast .uni-toast { 157 | z-index: 10090; 158 | } 159 | /* #endif */ 160 | /* end--提升H5端uni.toast()的层级,避免被uView的modal等遮盖--end */ 161 | 162 | /* start--去除button的所有默认样式--start */ 163 | .u-reset-button { 164 | padding: 0; 165 | font-size: inherit; 166 | line-height: inherit; 167 | background-color: transparent; 168 | color: inherit; 169 | } 170 | 171 | .u-reset-button::after { 172 | border: none; 173 | } 174 | /* end--去除button的所有默认样式--end */ 175 | 176 | -------------------------------------------------------------------------------- /uview-ui/libs/function/colorGradient.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 求两个颜色之间的渐变值 3 | * @param {string} startColor 开始的颜色 4 | * @param {string} endColor 结束的颜色 5 | * @param {number} step 颜色等分的份额 6 | * */ 7 | function colorGradient(startColor = 'rgb(0, 0, 0)', endColor = 'rgb(255, 255, 255)', step = 10) { 8 | let startRGB = hexToRgb(startColor, false); //转换为rgb数组模式 9 | let startR = startRGB[0]; 10 | let startG = startRGB[1]; 11 | let startB = startRGB[2]; 12 | 13 | let endRGB = hexToRgb(endColor, false); 14 | let endR = endRGB[0]; 15 | let endG = endRGB[1]; 16 | let endB = endRGB[2]; 17 | 18 | let sR = (endR - startR) / step; //总差值 19 | let sG = (endG - startG) / step; 20 | let sB = (endB - startB) / step; 21 | let colorArr = []; 22 | for (let i = 0; i < step; i++) { 23 | //计算每一步的hex值 24 | let hex = rgbToHex('rgb(' + Math.round((sR * i + startR)) + ',' + Math.round((sG * i + startG)) + ',' + Math.round((sB * 25 | i + startB)) + ')'); 26 | colorArr.push(hex); 27 | } 28 | return colorArr; 29 | } 30 | 31 | // 将hex表示方式转换为rgb表示方式(这里返回rgb数组模式) 32 | function hexToRgb(sColor, str = true) { 33 | let reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/; 34 | sColor = sColor.toLowerCase(); 35 | if (sColor && reg.test(sColor)) { 36 | if (sColor.length === 4) { 37 | let sColorNew = "#"; 38 | for (let i = 1; i < 4; i += 1) { 39 | sColorNew += sColor.slice(i, i + 1).concat(sColor.slice(i, i + 1)); 40 | } 41 | sColor = sColorNew; 42 | } 43 | //处理六位的颜色值 44 | let sColorChange = []; 45 | for (let i = 1; i < 7; i += 2) { 46 | sColorChange.push(parseInt("0x" + sColor.slice(i, i + 2))); 47 | } 48 | if(!str) { 49 | return sColorChange; 50 | } else { 51 | return `rgb(${sColorChange[0]},${sColorChange[1]},${sColorChange[2]})`; 52 | } 53 | } else if (/^(rgb|RGB)/.test(sColor)) { 54 | let arr = sColor.replace(/(?:\(|\)|rgb|RGB)*/g, "").split(",") 55 | return arr.map(val => Number(val)); 56 | } else { 57 | return sColor; 58 | } 59 | }; 60 | 61 | // 将rgb表示方式转换为hex表示方式 62 | function rgbToHex(rgb) { 63 | let _this = rgb; 64 | let reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/; 65 | if (/^(rgb|RGB)/.test(_this)) { 66 | let aColor = _this.replace(/(?:\(|\)|rgb|RGB)*/g, "").split(","); 67 | let strHex = "#"; 68 | for (let i = 0; i < aColor.length; i++) { 69 | let hex = Number(aColor[i]).toString(16); 70 | hex = String(hex).length == 1 ? 0 + '' + hex : hex; // 保证每个rgb的值为2位 71 | if (hex === "0") { 72 | hex += hex; 73 | } 74 | strHex += hex; 75 | } 76 | if (strHex.length !== 7) { 77 | strHex = _this; 78 | } 79 | return strHex; 80 | } else if (reg.test(_this)) { 81 | let aNum = _this.replace(/#/, "").split(""); 82 | if (aNum.length === 6) { 83 | return _this; 84 | } else if (aNum.length === 3) { 85 | let numHex = "#"; 86 | for (let i = 0; i < aNum.length; i += 1) { 87 | numHex += (aNum[i] + aNum[i]); 88 | } 89 | return numHex; 90 | } 91 | } else { 92 | return _this; 93 | } 94 | } 95 | 96 | 97 | /** 98 | * JS颜色十六进制转换为rgb或rgba,返回的格式为 rgba(255,255,255,0.5)字符串 99 | * sHex为传入的十六进制的色值 100 | * alpha为rgba的透明度 101 | */ 102 | function colorToRgba(color, alpha = 0.3) { 103 | color = rgbToHex(color) 104 | // 十六进制颜色值的正则表达式 105 | var reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/ 106 | /* 16进制颜色转为RGB格式 */ 107 | let sColor = color.toLowerCase() 108 | if (sColor && reg.test(sColor)) { 109 | if (sColor.length === 4) { 110 | var sColorNew = '#' 111 | for (let i = 1; i < 4; i += 1) { 112 | sColorNew += sColor.slice(i, i + 1).concat(sColor.slice(i, i + 1)) 113 | } 114 | sColor = sColorNew 115 | } 116 | // 处理六位的颜色值 117 | var sColorChange = [] 118 | for (let i = 1; i < 7; i += 2) { 119 | sColorChange.push(parseInt('0x' + sColor.slice(i, i + 2))) 120 | } 121 | // return sColorChange.join(',') 122 | return 'rgba(' + sColorChange.join(',') + ',' + alpha + ')' 123 | } 124 | else { 125 | return sColor 126 | } 127 | } 128 | 129 | export default { 130 | colorGradient, 131 | hexToRgb, 132 | rgbToHex, 133 | colorToRgba 134 | } -------------------------------------------------------------------------------- /uview-ui/components/u-dropdown-item/u-dropdown-item.vue: -------------------------------------------------------------------------------- 1 | 22 | 23 | 129 | 130 | 133 | -------------------------------------------------------------------------------- /uview-ui/components/u-section/u-section.vue: -------------------------------------------------------------------------------- 1 | 29 | 30 | 117 | 118 | 155 | -------------------------------------------------------------------------------- /uview-ui/index.js: -------------------------------------------------------------------------------- 1 | // 引入全局mixin 2 | import mixin from './libs/mixin/mixin.js' 3 | // 引入关于是否mixin集成小程序分享的配置 4 | // import wxshare from './libs/mixin/mpShare.js' 5 | // 全局挂载引入http相关请求拦截插件 6 | import http from './libs/request' 7 | 8 | function wranning(str) { 9 | // 开发环境进行信息输出,主要是一些报错信息 10 | // 这个环境的来由是在程序编写时候,点击hx编辑器运行调试代码的时候,详见: 11 | // https://uniapp.dcloud.io/frame?id=%e5%bc%80%e5%8f%91%e7%8e%af%e5%a2%83%e5%92%8c%e7%94%9f%e4%ba%a7%e7%8e%af%e5%a2%83 12 | if (process.env.NODE_ENV === 'development') { 13 | console.warn(str) 14 | } 15 | } 16 | 17 | // 尝试判断在根目录的/store中是否有$u.mixin.js,此文件uView默认为需要挂在到全局的vuex的state变量 18 | // HX2.6.11版本,放到try中,控制台依然会警告,暂时不用此方式, 19 | // let vuexStore = {}; 20 | // try { 21 | // vuexStore = require("@/store/$u.mixin.js"); 22 | // } catch (e) { 23 | // //TODO handle the exception 24 | // } 25 | 26 | // post类型对象参数转为get类型url参数 27 | import queryParams from './libs/function/queryParams.js' 28 | // 路由封装 29 | import route from './libs/function/route.js' 30 | // 时间格式化 31 | import timeFormat from './libs/function/timeFormat.js' 32 | // 时间戳格式化,返回多久之前 33 | import timeFrom from './libs/function/timeFrom.js' 34 | // 颜色渐变相关,colorGradient-颜色渐变,hexToRgb-十六进制颜色转rgb颜色,rgbToHex-rgb转十六进制 35 | import colorGradient from './libs/function/colorGradient.js' 36 | // 生成全局唯一guid字符串 37 | import guid from './libs/function/guid.js' 38 | // 主题相关颜色,info|success|warning|primary|default|error,此颜色已在uview.scss中定义,但是为js中也能使用,故也定义一份 39 | import color from './libs/function/color.js' 40 | // 根据type获取图标名称 41 | import type2icon from './libs/function/type2icon.js' 42 | // 打乱数组的顺序 43 | import randomArray from './libs/function/randomArray.js' 44 | // 对象和数组的深度克隆 45 | import deepClone from './libs/function/deepClone.js' 46 | // 对象深度拷贝 47 | import deepMerge from './libs/function/deepMerge.js' 48 | // 添加单位 49 | import addUnit from './libs/function/addUnit.js' 50 | 51 | // 规则检验 52 | import test from './libs/function/test.js' 53 | // 随机数 54 | import random from './libs/function/random.js' 55 | // 去除空格 56 | import trim from './libs/function/trim.js' 57 | // toast提示,对uni.showToast的封装 58 | import toast from './libs/function/toast.js' 59 | // 获取父组件参数 60 | import getParent from './libs/function/getParent.js' 61 | // 获取整个父组件 62 | import $parent from './libs/function/$parent.js' 63 | // 获取sys()和os()工具方法 64 | // 获取设备信息,挂载到$u的sys()(system的缩写)属性中, 65 | // 同时把安卓和ios平台的名称"ios"和"android"挂到$u.os()中,方便取用 66 | import {sys, os} from './libs/function/sys.js' 67 | // 防抖方法 68 | import debounce from './libs/function/debounce.js' 69 | // 节流方法 70 | import throttle from './libs/function/throttle.js' 71 | 72 | 73 | // 配置信息 74 | import config from './libs/config/config.js' 75 | // 各个需要fixed的地方的z-index配置文件 76 | import zIndex from './libs/config/zIndex.js' 77 | 78 | const $u = { 79 | queryParams: queryParams, 80 | route: route, 81 | timeFormat: timeFormat, 82 | date: timeFormat, // 另名date 83 | timeFrom, 84 | colorGradient: colorGradient.colorGradient, 85 | colorToRgba: colorGradient.colorToRgba, 86 | guid, 87 | color, 88 | sys, 89 | os, 90 | type2icon, 91 | randomArray, 92 | wranning, 93 | get: http.get, 94 | post: http.post, 95 | put: http.put, 96 | 'delete': http.delete, 97 | hexToRgb: colorGradient.hexToRgb, 98 | rgbToHex: colorGradient.rgbToHex, 99 | test, 100 | random, 101 | deepClone, 102 | deepMerge, 103 | getParent, 104 | $parent, 105 | addUnit, 106 | trim, 107 | type: ['primary', 'success', 'error', 'warning', 'info'], 108 | http, 109 | toast, 110 | config, // uView配置信息相关,比如版本号 111 | zIndex, 112 | debounce, 113 | throttle, 114 | } 115 | 116 | // $u挂载到uni对象上 117 | uni.$u = $u 118 | 119 | const install = Vue => { 120 | Vue.mixin(mixin) 121 | if (Vue.prototype.openShare) { 122 | Vue.mixin(mpShare); 123 | } 124 | // Vue.mixin(vuexStore); 125 | // 时间格式化,同时两个名称,date和timeFormat 126 | Vue.filter('timeFormat', (timestamp, format) => { 127 | return timeFormat(timestamp, format) 128 | }) 129 | Vue.filter('date', (timestamp, format) => { 130 | return timeFormat(timestamp, format) 131 | }) 132 | // 将多久以前的方法,注入到全局过滤器 133 | Vue.filter('timeFrom', (timestamp, format) => { 134 | return timeFrom(timestamp, format) 135 | }) 136 | Vue.prototype.$u = $u 137 | } 138 | 139 | export default { 140 | install 141 | } -------------------------------------------------------------------------------- /uview-ui/components/u-divider/u-divider.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 106 | 107 | 154 | -------------------------------------------------------------------------------- /pages/tab.vue: -------------------------------------------------------------------------------- 1 | 48 | 49 | 125 | 126 | 149 | -------------------------------------------------------------------------------- /static/iconfont/style.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'icomoon'; 3 | src: url('~@/static/iconfont/fonts/icomoon.eot?4rmb7t'); 4 | src: url('~@/static/iconfont/fonts/icomoon.eot?4rmb7t#iefix') format('embedded-opentype'), 5 | url('~@/static/iconfont/fonts/icomoon.ttf?4rmb7t') format('truetype'), 6 | url('~@/static/iconfont/fonts/icomoon.woff?4rmb7t') format('woff'), 7 | url('~@/static/iconfont/fonts/icomoon.svg?4rmb7t#icomoon') format('svg'); 8 | font-weight: normal; 9 | font-style: normal; 10 | } 11 | 12 | [class^="icon-"], [class*=" icon-"] { 13 | /* use !important to prevent issues with browser extensions that change fonts */ 14 | font-family: 'icomoon' !important; 15 | speak: none; 16 | font-style: normal; 17 | font-weight: normal; 18 | font-variant: normal; 19 | text-transform: none; 20 | line-height: 1; 21 | 22 | /* Better Font Rendering =========== */ 23 | -webkit-font-smoothing: antialiased; 24 | -moz-osx-font-smoothing: grayscale; 25 | } 26 | 27 | .icon-Finance:before { 28 | content: "\e950"; 29 | color: #cdcfd2; 30 | } 31 | .icon-Document:before { 32 | content: "\e951"; 33 | color: #cdcfd2; 34 | } 35 | .icon-ICON1:before { 36 | content: "\e952"; 37 | color: #cdcfd2; 38 | } 39 | .icon-CRM:before { 40 | content: "\e900"; 41 | color: #cdcfd2; 42 | } 43 | .icon-CRM_sm:before { 44 | content: "\e901"; 45 | color: #cdcfd2; 46 | } 47 | .icon-Quotation:before { 48 | content: "\e902"; 49 | color: #cdcfd2; 50 | } 51 | .icon-Quotation_sm:before { 52 | content: "\e903"; 53 | color: #cdcfd2; 54 | } 55 | .icon-edit:before { 56 | content: "\e904"; 57 | color: #cdcfd2; 58 | } 59 | .icon-Product:before { 60 | content: "\e905"; 61 | color: #cdcfd2; 62 | } 63 | .icon-Product_sm:before { 64 | content: "\e906"; 65 | color: #cdcfd2; 66 | } 67 | .icon-Member:before { 68 | content: "\e907"; 69 | color: #cdcfd2; 70 | } 71 | .icon-Member_sm:before { 72 | content: "\e908"; 73 | color: #cdcfd2; 74 | } 75 | .icon-error:before { 76 | content: "\e909"; 77 | color: #f63623; 78 | } 79 | .icon-Order:before { 80 | content: "\e90a"; 81 | color: #cdcfd2; 82 | } 83 | .icon-Order_sm:before { 84 | content: "\e90b"; 85 | color: #cdcfd2; 86 | } 87 | .icon-Amount:before { 88 | content: "\e90c"; 89 | color: #cdcfd2; 90 | } 91 | .icon-Amount_sm:before { 92 | content: "\e90d"; 93 | color: #cdcfd2; 94 | } 95 | .icon-Workbench:before { 96 | content: "\e90e"; 97 | color: #cdcfd2; 98 | } 99 | .icon-Workbench_sm:before { 100 | content: "\e90f"; 101 | color: #cdcfd2; 102 | } 103 | .icon-grey_star:before { 104 | content: "\e911"; 105 | color: #cdcfd2; 106 | } 107 | .icon-Role:before { 108 | content: "\e912"; 109 | color: #cdcfd2; 110 | } 111 | .icon-Role_sm:before { 112 | content: "\e913"; 113 | color: #cdcfd2; 114 | } 115 | .icon-BigData:before { 116 | content: "\e914"; 117 | color: #cdcfd2; 118 | } 119 | .icon-BigData_sm:before { 120 | content: "\e915"; 121 | color: #cdcfd2; 122 | } 123 | .icon-Enterprise:before { 124 | content: "\e916"; 125 | color: #cdcfd2; 126 | } 127 | .icon-Enterprise_sm:before { 128 | content: "\e917"; 129 | color: #cdcfd2; 130 | } 131 | .icon-calendar:before { 132 | content: "\e918"; 133 | color: #cdcfd2; 134 | } 135 | .icon-Financing:before { 136 | content: "\e919"; 137 | color: #cdcfd2; 138 | } 139 | .icon-Financing_sm:before { 140 | content: "\e91a"; 141 | color: #cdcfd2; 142 | } 143 | .icon-Statistical:before { 144 | content: "\e91b"; 145 | color: #cdcfd2; 146 | } 147 | .icon-Statistical_sm:before { 148 | content: "\e91c"; 149 | color: #cdcfd2; 150 | } 151 | .icon-wechat:before { 152 | content: "\e91e"; 153 | color: #00c800; 154 | } 155 | .icon-pdf .path1:before { 156 | content: "\e91f"; 157 | color: rgb(238, 238, 238); 158 | } 159 | .icon-pdf .path2:before { 160 | content: "\e920"; 161 | margin-left: -1em; 162 | color: rgb(105, 158, 254); 163 | } 164 | .icon-wait:before { 165 | content: "\e92b"; 166 | color: #cdcfd2; 167 | } 168 | .icon-Email:before { 169 | content: "\e92d"; 170 | color: #cdcfd2; 171 | } 172 | .icon-Email_sm:before { 173 | content: "\e92e"; 174 | color: #cdcfd2; 175 | } 176 | .icon-Account:before { 177 | content: "\e92f"; 178 | color: #cdcfd2; 179 | } 180 | .icon-Account_sm:before { 181 | content: "\e930"; 182 | color: #cdcfd2; 183 | } 184 | .icon-correct:before { 185 | content: "\e931"; 186 | color: #4cd321; 187 | } 188 | .icon-alipay:before { 189 | content: "\e932"; 190 | color: #1296db; 191 | } 192 | -------------------------------------------------------------------------------- /pages/table/index.vue: -------------------------------------------------------------------------------- 1 | 89 | 90 | 126 | 127 | 188 | -------------------------------------------------------------------------------- /uview-ui/components/u-loading/u-loading.vue: -------------------------------------------------------------------------------- 1 | 5 | 6 | 53 | 54 | 104 | -------------------------------------------------------------------------------- /uview-ui/components/u-sticky/u-sticky.vue: -------------------------------------------------------------------------------- 1 | 19 | 20 | 150 | 151 | 158 | -------------------------------------------------------------------------------- /uview-ui/components/u-empty/u-empty.vue: -------------------------------------------------------------------------------- 1 | 21 | 22 | 171 | 172 | 194 | -------------------------------------------------------------------------------- /uview-ui/components/u-number-keyboard/u-number-keyboard.vue: -------------------------------------------------------------------------------- 1 | 24 | 25 | 121 | 122 | 159 | -------------------------------------------------------------------------------- /uview-ui/components/u-switch/u-switch.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 108 | 109 | 164 | -------------------------------------------------------------------------------- /uview-ui/libs/function/test.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 验证电子邮箱格式 3 | */ 4 | function email(value) { 5 | return /^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/.test(value); 6 | } 7 | 8 | /** 9 | * 验证手机格式 10 | */ 11 | function mobile(value) { 12 | return /^1[23456789]\d{9}$/.test(value) 13 | } 14 | 15 | /** 16 | * 验证URL格式 17 | */ 18 | function url(value) { 19 | return /http(s)?:\/\/([\w-]+\.)+[\w-]+(\/[\w-.\/?%&=]*)?/.test(value) 20 | } 21 | 22 | /** 23 | * 验证日期格式 24 | */ 25 | function date(value) { 26 | return !/Invalid|NaN/.test(new Date(value).toString()) 27 | } 28 | 29 | /** 30 | * 验证ISO类型的日期格式 31 | */ 32 | function dateISO(value) { 33 | return /^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/.test(value) 34 | } 35 | 36 | /** 37 | * 验证十进制数字 38 | */ 39 | function number(value) { 40 | return /^(?:-?\d+|-?\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test(value) 41 | } 42 | 43 | /** 44 | * 验证整数 45 | */ 46 | function digits(value) { 47 | return /^\d+$/.test(value) 48 | } 49 | 50 | /** 51 | * 验证身份证号码 52 | */ 53 | function idCard(value) { 54 | return /^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test( 55 | value) 56 | } 57 | 58 | /** 59 | * 是否车牌号 60 | */ 61 | function carNo(value) { 62 | // 新能源车牌 63 | const xreg = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}(([0-9]{5}[DF]$)|([DF][A-HJ-NP-Z0-9][0-9]{4}$))/; 64 | // 旧车牌 65 | const creg = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳]{1}$/; 66 | if (value.length === 7) { 67 | return creg.test(value); 68 | } else if (value.length === 8) { 69 | return xreg.test(value); 70 | } else { 71 | return false; 72 | } 73 | } 74 | 75 | /** 76 | * 金额,只允许2位小数 77 | */ 78 | function amount(value) { 79 | //金额,只允许保留两位小数 80 | return /^[1-9]\d*(,\d{3})*(\.\d{1,2})?$|^0\.\d{1,2}$/.test(value); 81 | } 82 | 83 | /** 84 | * 中文 85 | */ 86 | function chinese(value) { 87 | let reg = /^[\u4e00-\u9fa5]+$/gi; 88 | return reg.test(value); 89 | } 90 | 91 | /** 92 | * 只能输入字母 93 | */ 94 | function letter(value) { 95 | return /^[a-zA-Z]*$/.test(value); 96 | } 97 | 98 | /** 99 | * 只能是字母或者数字 100 | */ 101 | function enOrNum(value) { 102 | //英文或者数字 103 | let reg = /^[0-9a-zA-Z]*$/g; 104 | return reg.test(value); 105 | } 106 | 107 | /** 108 | * 验证是否包含某个值 109 | */ 110 | function contains(value, param) { 111 | return value.indexOf(param) >= 0 112 | } 113 | 114 | /** 115 | * 验证一个值范围[min, max] 116 | */ 117 | function range(value, param) { 118 | return value >= param[0] && value <= param[1] 119 | } 120 | 121 | /** 122 | * 验证一个长度范围[min, max] 123 | */ 124 | function rangeLength(value, param) { 125 | return value.length >= param[0] && value.length <= param[1] 126 | } 127 | 128 | /** 129 | * 是否固定电话 130 | */ 131 | function landline(value) { 132 | let reg = /^\d{3,4}-\d{7,8}(-\d{3,4})?$/; 133 | return reg.test(value); 134 | } 135 | 136 | /** 137 | * 判断是否为空 138 | */ 139 | function empty(value) { 140 | switch (typeof value) { 141 | case 'undefined': 142 | return true; 143 | case 'string': 144 | if (value.replace(/(^[ \t\n\r]*)|([ \t\n\r]*$)/g, '').length == 0) return true; 145 | break; 146 | case 'boolean': 147 | if (!value) return true; 148 | break; 149 | case 'number': 150 | if (0 === value || isNaN(value)) return true; 151 | break; 152 | case 'object': 153 | if (null === value || value.length === 0) return true; 154 | for (var i in value) { 155 | return false; 156 | } 157 | return true; 158 | } 159 | return false; 160 | } 161 | 162 | /** 163 | * 是否json字符串 164 | */ 165 | function jsonString(value) { 166 | if (typeof value == 'string') { 167 | try { 168 | var obj = JSON.parse(value); 169 | if (typeof obj == 'object' && obj) { 170 | return true; 171 | } else { 172 | return false; 173 | } 174 | } catch (e) { 175 | return false; 176 | } 177 | } 178 | return false; 179 | } 180 | 181 | 182 | /** 183 | * 是否数组 184 | */ 185 | function array(value) { 186 | if (typeof Array.isArray === "function") { 187 | return Array.isArray(value); 188 | } else { 189 | return Object.prototype.toString.call(value) === "[object Array]"; 190 | } 191 | } 192 | 193 | /** 194 | * 是否对象 195 | */ 196 | function object(value) { 197 | return Object.prototype.toString.call(value) === '[object Object]'; 198 | } 199 | 200 | /** 201 | * 是否短信验证码 202 | */ 203 | function code(value, len = 6) { 204 | return new RegExp(`^\\d{${len}}$`).test(value); 205 | } 206 | 207 | 208 | export default { 209 | email, 210 | mobile, 211 | url, 212 | date, 213 | dateISO, 214 | number, 215 | digits, 216 | idCard, 217 | carNo, 218 | amount, 219 | chinese, 220 | letter, 221 | enOrNum, 222 | contains, 223 | range, 224 | rangeLength, 225 | empty, 226 | isEmpty: empty, 227 | jsonString, 228 | landline, 229 | object, 230 | array, 231 | code 232 | } 233 | -------------------------------------------------------------------------------- /uview-ui/components/u-read-more/u-read-more.vue: -------------------------------------------------------------------------------- 1 | 24 | 25 | 142 | 143 | 180 | -------------------------------------------------------------------------------- /uview-ui/components/u-verification-code/u-verification-code.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 154 | 155 | 165 | -------------------------------------------------------------------------------- /uview-ui/components/u-steps/u-steps.vue: -------------------------------------------------------------------------------- 1 | 43 | 44 | 109 | 110 | 201 | -------------------------------------------------------------------------------- /uview-ui/components/u-waterfall/u-waterfall.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 156 | 157 | 177 | -------------------------------------------------------------------------------- /uview-ui/libs/request/index.js: -------------------------------------------------------------------------------- 1 | import deepMerge from "../function/deepMerge"; 2 | import validate from "../function/test"; 3 | class Request { 4 | // 设置全局默认配置 5 | setConfig(customConfig) { 6 | // 深度合并对象,否则会造成对象深层属性丢失 7 | this.config = deepMerge(this.config, customConfig); 8 | } 9 | 10 | // 主要请求部分 11 | request(options = {}) { 12 | // 检查请求拦截 13 | if (this.interceptor.request && typeof this.interceptor.request === 'function') { 14 | let tmpConfig = {}; 15 | let interceptorRequest = this.interceptor.request(options); 16 | if (interceptorRequest === false) { 17 | // 返回一个处于pending状态中的Promise,来取消原promise,避免进入then()回调 18 | return new Promise(()=>{}); 19 | } 20 | this.options = interceptorRequest; 21 | } 22 | options.dataType = options.dataType || this.config.dataType; 23 | options.responseType = options.responseType || this.config.responseType; 24 | options.url = options.url || ''; 25 | options.params = options.params || {}; 26 | options.header = Object.assign({}, this.config.header, options.header); 27 | options.method = options.method || this.config.method; 28 | 29 | return new Promise((resolve, reject) => { 30 | options.complete = (response) => { 31 | // 请求返回后,隐藏loading(如果请求返回快的话,可能会没有loading) 32 | uni.hideLoading(); 33 | // 清除定时器,如果请求回来了,就无需loading 34 | clearTimeout(this.config.timer); 35 | this.config.timer = null; 36 | // 判断用户对拦截返回数据的要求,如果originalData为true,返回所有的数据(response)到拦截器,否则只返回response.data 37 | if(this.config.originalData) { 38 | // 判断是否存在拦截器 39 | if (this.interceptor.response && typeof this.interceptor.response === 'function') { 40 | let resInterceptors = this.interceptor.response(response); 41 | // 如果拦截器不返回false,就将拦截器返回的内容给this.$u.post的then回调 42 | if (resInterceptors !== false) { 43 | resolve(resInterceptors); 44 | } else { 45 | // 如果拦截器返回false,意味着拦截器定义者认为返回有问题,直接接入catch回调 46 | reject(response); 47 | } 48 | } else { 49 | // 如果要求返回原始数据,就算没有拦截器,也返回最原始的数据 50 | resolve(response); 51 | } 52 | } else { 53 | if (response.statusCode == 200) { 54 | if (this.interceptor.response && typeof this.interceptor.response === 'function') { 55 | let resInterceptors = this.interceptor.response(response.data); 56 | if (resInterceptors !== false) { 57 | resolve(resInterceptors); 58 | } else { 59 | reject(response.data); 60 | } 61 | } else { 62 | // 如果不是返回原始数据(originalData=false),且没有拦截器的情况下,返回纯数据给then回调 63 | resolve(response.data); 64 | } 65 | } else { 66 | // 不返回原始数据的情况下,服务器状态码不为200,modal弹框提示 67 | // if(response.errMsg) { 68 | // uni.showModal({ 69 | // title: response.errMsg 70 | // }); 71 | // } 72 | reject(response) 73 | } 74 | } 75 | } 76 | 77 | // 判断用户传递的URL是否/开头,如果不是,加上/,这里使用了uView的test.js验证库的url()方法 78 | options.url = validate.url(options.url) ? options.url : (this.config.baseUrl + (options.url.indexOf('/') == 0 ? 79 | options.url : '/' + options.url)); 80 | 81 | // 是否显示loading 82 | // 加一个是否已有timer定时器的判断,否则有两个同时请求的时候,后者会清除前者的定时器id 83 | // 而没有清除前者的定时器,导致前者超时,一直显示loading 84 | if(this.config.showLoading && !this.config.timer) { 85 | this.config.timer = setTimeout(() => { 86 | uni.showLoading({ 87 | title: this.config.loadingText, 88 | mask: this.config.loadingMask 89 | }) 90 | this.config.timer = null; 91 | }, this.config.loadingTime); 92 | } 93 | uni.request(options); 94 | }) 95 | // .catch(res => { 96 | // // 如果返回reject(),不让其进入this.$u.post().then().catch()后面的catct() 97 | // // 因为很多人都会忘了写后面的catch(),导致报错捕获不到catch 98 | // return new Promise(()=>{}); 99 | // }) 100 | } 101 | 102 | constructor() { 103 | this.config = { 104 | baseUrl: '', // 请求的根域名 105 | // 默认的请求头 106 | header: {}, 107 | method: 'POST', 108 | // 设置为json,返回后uni.request会对数据进行一次JSON.parse 109 | dataType: 'json', 110 | // 此参数无需处理,因为5+和支付宝小程序不支持,默认为text即可 111 | responseType: 'text', 112 | showLoading: true, // 是否显示请求中的loading 113 | loadingText: '请求中...', 114 | loadingTime: 800, // 在此时间内,请求还没回来的话,就显示加载中动画,单位ms 115 | timer: null, // 定时器 116 | originalData: false, // 是否在拦截器中返回服务端的原始数据,见文档说明 117 | loadingMask: true, // 展示loading的时候,是否给一个透明的蒙层,防止触摸穿透 118 | } 119 | 120 | // 拦截器 121 | this.interceptor = { 122 | // 请求前的拦截 123 | request: null, 124 | // 请求后的拦截 125 | response: null 126 | } 127 | 128 | // get请求 129 | this.get = (url, data = {}, header = {}) => { 130 | return this.request({ 131 | method: 'GET', 132 | url, 133 | header, 134 | data 135 | }) 136 | } 137 | 138 | // post请求 139 | this.post = (url, data = {}, header = {}) => { 140 | return this.request({ 141 | url, 142 | method: 'POST', 143 | header, 144 | data 145 | }) 146 | } 147 | 148 | // put请求,不支持支付宝小程序(HX2.6.15) 149 | this.put = (url, data = {}, header = {}) => { 150 | return this.request({ 151 | url, 152 | method: 'PUT', 153 | header, 154 | data 155 | }) 156 | } 157 | 158 | // delete请求,不支持支付宝和头条小程序(HX2.6.15) 159 | this.delete = (url, data = {}, header = {}) => { 160 | return this.request({ 161 | url, 162 | method: 'DELETE', 163 | header, 164 | data 165 | }) 166 | } 167 | } 168 | } 169 | export default new Request 170 | --------------------------------------------------------------------------------