5857 lines
193 KiB
JavaScript
5857 lines
193 KiB
JavaScript
|
if (typeof Promise !== "undefined" && !Promise.prototype.finally) {
|
|||
|
Promise.prototype.finally = function(callback) {
|
|||
|
const promise = this.constructor;
|
|||
|
return this.then(
|
|||
|
(value) => promise.resolve(callback()).then(() => value),
|
|||
|
(reason) => promise.resolve(callback()).then(() => {
|
|||
|
throw reason;
|
|||
|
})
|
|||
|
);
|
|||
|
};
|
|||
|
}
|
|||
|
;
|
|||
|
if (typeof uni !== "undefined" && uni && uni.requireGlobal) {
|
|||
|
const global2 = uni.requireGlobal();
|
|||
|
ArrayBuffer = global2.ArrayBuffer;
|
|||
|
Int8Array = global2.Int8Array;
|
|||
|
Uint8Array = global2.Uint8Array;
|
|||
|
Uint8ClampedArray = global2.Uint8ClampedArray;
|
|||
|
Int16Array = global2.Int16Array;
|
|||
|
Uint16Array = global2.Uint16Array;
|
|||
|
Int32Array = global2.Int32Array;
|
|||
|
Uint32Array = global2.Uint32Array;
|
|||
|
Float32Array = global2.Float32Array;
|
|||
|
Float64Array = global2.Float64Array;
|
|||
|
BigInt64Array = global2.BigInt64Array;
|
|||
|
BigUint64Array = global2.BigUint64Array;
|
|||
|
}
|
|||
|
;
|
|||
|
if (uni.restoreGlobal) {
|
|||
|
uni.restoreGlobal(Vue, weex, plus, setTimeout, clearTimeout, setInterval, clearInterval);
|
|||
|
}
|
|||
|
(function(vue, shared) {
|
|||
|
"use strict";
|
|||
|
const ON_LOAD = "onLoad";
|
|||
|
function formatAppLog(type, filename, ...args) {
|
|||
|
if (uni.__log__) {
|
|||
|
uni.__log__(type, filename, ...args);
|
|||
|
} else {
|
|||
|
console[type].apply(console, [...args, filename]);
|
|||
|
}
|
|||
|
}
|
|||
|
function resolveEasycom(component, easycom) {
|
|||
|
return shared.isString(component) ? easycom : component;
|
|||
|
}
|
|||
|
const createHook = (lifecycle) => (hook, target = vue.getCurrentInstance()) => {
|
|||
|
!vue.isInSSRComponentSetup && vue.injectHook(lifecycle, hook, target);
|
|||
|
};
|
|||
|
const onLoad = /* @__PURE__ */ createHook(ON_LOAD);
|
|||
|
const version = "3";
|
|||
|
{
|
|||
|
formatAppLog("log", "at node_modules/uview-plus/libs/config/config.js:5", `
|
|||
|
%c uview-plus V${version} %c https://ijry.github.io/uview-plus/
|
|||
|
|
|||
|
`, "color: #ffffff; background: #3c9cff; padding:5px 0;", "color: #3c9cff;background: #ffffff; padding:5px 0;");
|
|||
|
}
|
|||
|
const config$1 = {
|
|||
|
v: version,
|
|||
|
version,
|
|||
|
// 主题名称
|
|||
|
type: [
|
|||
|
"primary",
|
|||
|
"success",
|
|||
|
"info",
|
|||
|
"error",
|
|||
|
"warning"
|
|||
|
],
|
|||
|
// 颜色部分,本来可以通过scss的:export导出供js使用,但是奈何nvue不支持
|
|||
|
color: {
|
|||
|
"u-primary": "#2979ff",
|
|||
|
"u-warning": "#ff9900",
|
|||
|
"u-success": "#19be6b",
|
|||
|
"u-error": "#fa3534",
|
|||
|
"u-info": "#909399",
|
|||
|
"u-main-color": "#303133",
|
|||
|
"u-content-color": "#606266",
|
|||
|
"u-tips-color": "#909399",
|
|||
|
"u-light-color": "#c0c4cc"
|
|||
|
},
|
|||
|
// 默认单位,可以通过配置为rpx,那么在用于传入组件大小参数为数值时,就默认为rpx
|
|||
|
unit: "px"
|
|||
|
};
|
|||
|
const ActionSheet = {
|
|||
|
// action-sheet组件
|
|||
|
actionSheet: {
|
|||
|
show: false,
|
|||
|
title: "",
|
|||
|
description: "",
|
|||
|
actions: () => [],
|
|||
|
index: "",
|
|||
|
cancelText: "",
|
|||
|
closeOnClickAction: true,
|
|||
|
safeAreaInsetBottom: true,
|
|||
|
openType: "",
|
|||
|
closeOnClickOverlay: true,
|
|||
|
round: 0
|
|||
|
}
|
|||
|
};
|
|||
|
const Album = {
|
|||
|
// album 组件
|
|||
|
album: {
|
|||
|
urls: () => [],
|
|||
|
keyName: "",
|
|||
|
singleSize: 180,
|
|||
|
multipleSize: 70,
|
|||
|
space: 6,
|
|||
|
singleMode: "scaleToFill",
|
|||
|
multipleMode: "aspectFill",
|
|||
|
maxCount: 9,
|
|||
|
previewFullImage: true,
|
|||
|
rowCount: 3,
|
|||
|
showMore: true
|
|||
|
}
|
|||
|
};
|
|||
|
const Alert = {
|
|||
|
// alert警告组件
|
|||
|
alert: {
|
|||
|
title: "",
|
|||
|
type: "warning",
|
|||
|
description: "",
|
|||
|
closable: false,
|
|||
|
showIcon: false,
|
|||
|
effect: "light",
|
|||
|
center: false,
|
|||
|
fontSize: 14
|
|||
|
}
|
|||
|
};
|
|||
|
const Avatar = {
|
|||
|
// avatar 组件
|
|||
|
avatar: {
|
|||
|
src: "",
|
|||
|
shape: "circle",
|
|||
|
size: 40,
|
|||
|
mode: "scaleToFill",
|
|||
|
text: "",
|
|||
|
bgColor: "#c0c4cc",
|
|||
|
color: "#ffffff",
|
|||
|
fontSize: 18,
|
|||
|
icon: "",
|
|||
|
mpAvatar: false,
|
|||
|
randomBgColor: false,
|
|||
|
defaultUrl: "",
|
|||
|
colorIndex: "",
|
|||
|
name: ""
|
|||
|
}
|
|||
|
};
|
|||
|
const AvatarGroup = {
|
|||
|
// avatarGroup 组件
|
|||
|
avatarGroup: {
|
|||
|
urls: () => [],
|
|||
|
maxCount: 5,
|
|||
|
shape: "circle",
|
|||
|
mode: "scaleToFill",
|
|||
|
showMore: true,
|
|||
|
size: 40,
|
|||
|
keyName: "",
|
|||
|
gap: 0.5,
|
|||
|
extraValue: 0
|
|||
|
}
|
|||
|
};
|
|||
|
const Backtop = {
|
|||
|
// backtop组件
|
|||
|
backtop: {
|
|||
|
mode: "circle",
|
|||
|
icon: "arrow-upward",
|
|||
|
text: "",
|
|||
|
duration: 100,
|
|||
|
scrollTop: 0,
|
|||
|
top: 400,
|
|||
|
bottom: 100,
|
|||
|
right: 20,
|
|||
|
zIndex: 9,
|
|||
|
iconStyle: () => ({
|
|||
|
color: "#909399",
|
|||
|
fontSize: "19px"
|
|||
|
})
|
|||
|
}
|
|||
|
};
|
|||
|
const Badge = {
|
|||
|
// 徽标数组件
|
|||
|
badge: {
|
|||
|
isDot: false,
|
|||
|
value: "",
|
|||
|
show: true,
|
|||
|
max: 999,
|
|||
|
type: "error",
|
|||
|
showZero: false,
|
|||
|
bgColor: null,
|
|||
|
color: null,
|
|||
|
shape: "circle",
|
|||
|
numberType: "overflow",
|
|||
|
offset: () => [],
|
|||
|
inverted: false,
|
|||
|
absolute: false
|
|||
|
}
|
|||
|
};
|
|||
|
const Button = {
|
|||
|
// button组件
|
|||
|
button: {
|
|||
|
hairline: false,
|
|||
|
type: "info",
|
|||
|
size: "normal",
|
|||
|
shape: "square",
|
|||
|
plain: false,
|
|||
|
disabled: false,
|
|||
|
loading: false,
|
|||
|
loadingText: "",
|
|||
|
loadingMode: "spinner",
|
|||
|
loadingSize: 15,
|
|||
|
openType: "",
|
|||
|
formType: "",
|
|||
|
appParameter: "",
|
|||
|
hoverStopPropagation: true,
|
|||
|
lang: "en",
|
|||
|
sessionFrom: "",
|
|||
|
sendMessageTitle: "",
|
|||
|
sendMessagePath: "",
|
|||
|
sendMessageImg: "",
|
|||
|
showMessageCard: false,
|
|||
|
dataName: "",
|
|||
|
throttleTime: 0,
|
|||
|
hoverStartTime: 0,
|
|||
|
hoverStayTime: 200,
|
|||
|
text: "",
|
|||
|
icon: "",
|
|||
|
iconColor: "",
|
|||
|
color: ""
|
|||
|
}
|
|||
|
};
|
|||
|
const Calendar = {
|
|||
|
// calendar 组件
|
|||
|
calendar: {
|
|||
|
title: "日期选择",
|
|||
|
showTitle: true,
|
|||
|
showSubtitle: true,
|
|||
|
mode: "single",
|
|||
|
startText: "开始",
|
|||
|
endText: "结束",
|
|||
|
customList: () => [],
|
|||
|
color: "#3c9cff",
|
|||
|
minDate: 0,
|
|||
|
maxDate: 0,
|
|||
|
defaultDate: null,
|
|||
|
maxCount: Number.MAX_SAFE_INTEGER,
|
|||
|
// Infinity
|
|||
|
rowHeight: 56,
|
|||
|
formatter: null,
|
|||
|
showLunar: false,
|
|||
|
showMark: true,
|
|||
|
confirmText: "确定",
|
|||
|
confirmDisabledText: "确定",
|
|||
|
show: false,
|
|||
|
closeOnClickOverlay: false,
|
|||
|
readonly: false,
|
|||
|
showConfirm: true,
|
|||
|
maxRange: Number.MAX_SAFE_INTEGER,
|
|||
|
// Infinity
|
|||
|
rangePrompt: "",
|
|||
|
showRangePrompt: true,
|
|||
|
allowSameDay: false,
|
|||
|
round: 0,
|
|||
|
monthNum: 3
|
|||
|
}
|
|||
|
};
|
|||
|
const CarKeyboard = {
|
|||
|
// 车牌号键盘
|
|||
|
carKeyboard: {
|
|||
|
random: false
|
|||
|
}
|
|||
|
};
|
|||
|
const Cell = {
|
|||
|
// cell组件的props
|
|||
|
cell: {
|
|||
|
customClass: "",
|
|||
|
title: "",
|
|||
|
label: "",
|
|||
|
value: "",
|
|||
|
icon: "",
|
|||
|
disabled: false,
|
|||
|
border: true,
|
|||
|
center: false,
|
|||
|
url: "",
|
|||
|
linkType: "navigateTo",
|
|||
|
clickable: false,
|
|||
|
isLink: false,
|
|||
|
required: false,
|
|||
|
arrowDirection: "",
|
|||
|
iconStyle: {},
|
|||
|
rightIconStyle: {},
|
|||
|
rightIcon: "arrow-right",
|
|||
|
titleStyle: {},
|
|||
|
size: "",
|
|||
|
stop: true,
|
|||
|
name: ""
|
|||
|
}
|
|||
|
};
|
|||
|
const CellGroup = {
|
|||
|
// cell-group组件的props
|
|||
|
cellGroup: {
|
|||
|
title: "",
|
|||
|
border: true,
|
|||
|
customStyle: {}
|
|||
|
}
|
|||
|
};
|
|||
|
const Checkbox = {
|
|||
|
// checkbox组件
|
|||
|
checkbox: {
|
|||
|
name: "",
|
|||
|
shape: "",
|
|||
|
size: "",
|
|||
|
checkbox: false,
|
|||
|
disabled: "",
|
|||
|
activeColor: "",
|
|||
|
inactiveColor: "",
|
|||
|
iconSize: "",
|
|||
|
iconColor: "",
|
|||
|
label: "",
|
|||
|
labelSize: "",
|
|||
|
labelColor: "",
|
|||
|
labelDisabled: ""
|
|||
|
}
|
|||
|
};
|
|||
|
const CheckboxGroup = {
|
|||
|
// checkbox-group组件
|
|||
|
checkboxGroup: {
|
|||
|
name: "",
|
|||
|
value: () => [],
|
|||
|
shape: "square",
|
|||
|
disabled: false,
|
|||
|
activeColor: "#2979ff",
|
|||
|
inactiveColor: "#c8c9cc",
|
|||
|
size: 18,
|
|||
|
placement: "row",
|
|||
|
labelSize: 14,
|
|||
|
labelColor: "#303133",
|
|||
|
labelDisabled: false,
|
|||
|
iconColor: "#ffffff",
|
|||
|
iconSize: 12,
|
|||
|
iconPlacement: "left",
|
|||
|
borderBottom: false
|
|||
|
}
|
|||
|
};
|
|||
|
const CircleProgress = {
|
|||
|
// circleProgress 组件
|
|||
|
circleProgress: {
|
|||
|
percentage: 30
|
|||
|
}
|
|||
|
};
|
|||
|
const Code = {
|
|||
|
// code 组件
|
|||
|
code: {
|
|||
|
seconds: 60,
|
|||
|
startText: "获取验证码",
|
|||
|
changeText: "X秒重新获取",
|
|||
|
endText: "重新获取",
|
|||
|
keepRunning: false,
|
|||
|
uniqueKey: ""
|
|||
|
}
|
|||
|
};
|
|||
|
const CodeInput = {
|
|||
|
// codeInput 组件
|
|||
|
codeInput: {
|
|||
|
adjustPosition: true,
|
|||
|
maxlength: 6,
|
|||
|
dot: false,
|
|||
|
mode: "box",
|
|||
|
hairline: false,
|
|||
|
space: 10,
|
|||
|
value: "",
|
|||
|
focus: false,
|
|||
|
bold: false,
|
|||
|
color: "#606266",
|
|||
|
fontSize: 18,
|
|||
|
size: 35,
|
|||
|
disabledKeyboard: false,
|
|||
|
borderColor: "#c9cacc",
|
|||
|
disabledDot: true
|
|||
|
}
|
|||
|
};
|
|||
|
const Col = {
|
|||
|
// col 组件
|
|||
|
col: {
|
|||
|
span: 12,
|
|||
|
offset: 0,
|
|||
|
justify: "start",
|
|||
|
align: "stretch",
|
|||
|
textAlign: "left"
|
|||
|
}
|
|||
|
};
|
|||
|
const Collapse = {
|
|||
|
// collapse 组件
|
|||
|
collapse: {
|
|||
|
value: null,
|
|||
|
accordion: false,
|
|||
|
border: true
|
|||
|
}
|
|||
|
};
|
|||
|
const CollapseItem = {
|
|||
|
// collapseItem 组件
|
|||
|
collapseItem: {
|
|||
|
title: "",
|
|||
|
value: "",
|
|||
|
label: "",
|
|||
|
disabled: false,
|
|||
|
isLink: true,
|
|||
|
clickable: true,
|
|||
|
border: true,
|
|||
|
align: "left",
|
|||
|
name: "",
|
|||
|
icon: "",
|
|||
|
duration: 300
|
|||
|
}
|
|||
|
};
|
|||
|
const ColumnNotice = {
|
|||
|
// columnNotice 组件
|
|||
|
columnNotice: {
|
|||
|
text: "",
|
|||
|
icon: "volume",
|
|||
|
mode: "",
|
|||
|
color: "#f9ae3d",
|
|||
|
bgColor: "#fdf6ec",
|
|||
|
fontSize: 14,
|
|||
|
speed: 80,
|
|||
|
step: false,
|
|||
|
duration: 1500,
|
|||
|
disableTouch: true
|
|||
|
}
|
|||
|
};
|
|||
|
const CountDown = {
|
|||
|
// u-count-down 计时器组件
|
|||
|
countDown: {
|
|||
|
time: 0,
|
|||
|
format: "HH:mm:ss",
|
|||
|
autoStart: true,
|
|||
|
millisecond: false
|
|||
|
}
|
|||
|
};
|
|||
|
const CountTo = {
|
|||
|
// countTo 组件
|
|||
|
countTo: {
|
|||
|
startVal: 0,
|
|||
|
endVal: 0,
|
|||
|
duration: 2e3,
|
|||
|
autoplay: true,
|
|||
|
decimals: 0,
|
|||
|
useEasing: true,
|
|||
|
decimal: ".",
|
|||
|
color: "#606266",
|
|||
|
fontSize: 22,
|
|||
|
bold: false,
|
|||
|
separator: ""
|
|||
|
}
|
|||
|
};
|
|||
|
const DatetimePicker = {
|
|||
|
// datetimePicker 组件
|
|||
|
datetimePicker: {
|
|||
|
show: false,
|
|||
|
showToolbar: true,
|
|||
|
value: "",
|
|||
|
title: "",
|
|||
|
mode: "datetime",
|
|||
|
maxDate: new Date((/* @__PURE__ */ new Date()).getFullYear() + 10, 0, 1).getTime(),
|
|||
|
minDate: new Date((/* @__PURE__ */ new Date()).getFullYear() - 10, 0, 1).getTime(),
|
|||
|
minHour: 0,
|
|||
|
maxHour: 23,
|
|||
|
minMinute: 0,
|
|||
|
maxMinute: 59,
|
|||
|
filter: null,
|
|||
|
formatter: null,
|
|||
|
loading: false,
|
|||
|
itemHeight: 44,
|
|||
|
cancelText: "取消",
|
|||
|
confirmText: "确认",
|
|||
|
cancelColor: "#909193",
|
|||
|
confirmColor: "#3c9cff",
|
|||
|
visibleItemCount: 5,
|
|||
|
closeOnClickOverlay: false,
|
|||
|
defaultIndex: () => []
|
|||
|
}
|
|||
|
};
|
|||
|
const Divider = {
|
|||
|
// divider组件
|
|||
|
divider: {
|
|||
|
dashed: false,
|
|||
|
hairline: true,
|
|||
|
dot: false,
|
|||
|
textPosition: "center",
|
|||
|
text: "",
|
|||
|
textSize: 14,
|
|||
|
textColor: "#909399",
|
|||
|
lineColor: "#dcdfe6"
|
|||
|
}
|
|||
|
};
|
|||
|
const Empty = {
|
|||
|
// empty组件
|
|||
|
empty: {
|
|||
|
icon: "",
|
|||
|
text: "",
|
|||
|
textColor: "#c0c4cc",
|
|||
|
textSize: 14,
|
|||
|
iconColor: "#c0c4cc",
|
|||
|
iconSize: 90,
|
|||
|
mode: "data",
|
|||
|
width: 160,
|
|||
|
height: 160,
|
|||
|
show: true,
|
|||
|
marginTop: 0
|
|||
|
}
|
|||
|
};
|
|||
|
const Form = {
|
|||
|
// form 组件
|
|||
|
form: {
|
|||
|
model: () => ({}),
|
|||
|
rules: () => ({}),
|
|||
|
errorType: "message",
|
|||
|
borderBottom: true,
|
|||
|
labelPosition: "left",
|
|||
|
labelWidth: 45,
|
|||
|
labelAlign: "left",
|
|||
|
labelStyle: () => ({})
|
|||
|
}
|
|||
|
};
|
|||
|
const GormItem = {
|
|||
|
// formItem 组件
|
|||
|
formItem: {
|
|||
|
label: "",
|
|||
|
prop: "",
|
|||
|
borderBottom: "",
|
|||
|
labelWidth: "",
|
|||
|
rightIcon: "",
|
|||
|
leftIcon: "",
|
|||
|
required: false,
|
|||
|
leftIconStyle: ""
|
|||
|
}
|
|||
|
};
|
|||
|
const Gap = {
|
|||
|
// gap组件
|
|||
|
gap: {
|
|||
|
bgColor: "transparent",
|
|||
|
height: 20,
|
|||
|
marginTop: 0,
|
|||
|
marginBottom: 0,
|
|||
|
customStyle: {}
|
|||
|
}
|
|||
|
};
|
|||
|
const Grid = {
|
|||
|
// grid组件
|
|||
|
grid: {
|
|||
|
col: 3,
|
|||
|
border: false,
|
|||
|
align: "left"
|
|||
|
}
|
|||
|
};
|
|||
|
const GridItem = {
|
|||
|
// grid-item组件
|
|||
|
gridItem: {
|
|||
|
name: null,
|
|||
|
bgColor: "transparent"
|
|||
|
}
|
|||
|
};
|
|||
|
const {
|
|||
|
color: color$3
|
|||
|
} = config$1;
|
|||
|
const Icon = {
|
|||
|
// icon组件
|
|||
|
icon: {
|
|||
|
name: "",
|
|||
|
color: color$3["u-content-color"],
|
|||
|
size: "16px",
|
|||
|
bold: false,
|
|||
|
index: "",
|
|||
|
hoverClass: "",
|
|||
|
customPrefix: "uicon",
|
|||
|
label: "",
|
|||
|
labelPos: "right",
|
|||
|
labelSize: "15px",
|
|||
|
labelColor: color$3["u-content-color"],
|
|||
|
space: "3px",
|
|||
|
imgMode: "",
|
|||
|
width: "",
|
|||
|
height: "",
|
|||
|
top: 0,
|
|||
|
stop: false
|
|||
|
}
|
|||
|
};
|
|||
|
const Image = {
|
|||
|
// image组件
|
|||
|
image: {
|
|||
|
src: "",
|
|||
|
mode: "aspectFill",
|
|||
|
width: "300",
|
|||
|
height: "225",
|
|||
|
shape: "square",
|
|||
|
radius: 0,
|
|||
|
lazyLoad: true,
|
|||
|
showMenuByLongpress: true,
|
|||
|
loadingIcon: "photo",
|
|||
|
errorIcon: "error-circle",
|
|||
|
showLoading: true,
|
|||
|
showError: true,
|
|||
|
fade: true,
|
|||
|
webp: false,
|
|||
|
duration: 500,
|
|||
|
bgColor: "#f3f4f6"
|
|||
|
}
|
|||
|
};
|
|||
|
const IndexAnchor = {
|
|||
|
// indexAnchor 组件
|
|||
|
indexAnchor: {
|
|||
|
text: "",
|
|||
|
color: "#606266",
|
|||
|
size: 14,
|
|||
|
bgColor: "#dedede",
|
|||
|
height: 32
|
|||
|
}
|
|||
|
};
|
|||
|
const IndexList = {
|
|||
|
// indexList 组件
|
|||
|
indexList: {
|
|||
|
inactiveColor: "#606266",
|
|||
|
activeColor: "#5677fc",
|
|||
|
indexList: () => [],
|
|||
|
sticky: true,
|
|||
|
customNavHeight: 0
|
|||
|
}
|
|||
|
};
|
|||
|
const Input = {
|
|||
|
// index 组件
|
|||
|
input: {
|
|||
|
value: "",
|
|||
|
type: "text",
|
|||
|
fixed: false,
|
|||
|
disabled: false,
|
|||
|
disabledColor: "#f5f7fa",
|
|||
|
clearable: false,
|
|||
|
password: false,
|
|||
|
maxlength: -1,
|
|||
|
placeholder: null,
|
|||
|
placeholderClass: "input-placeholder",
|
|||
|
placeholderStyle: "color: #c0c4cc",
|
|||
|
showWordLimit: false,
|
|||
|
confirmType: "done",
|
|||
|
confirmHold: false,
|
|||
|
holdKeyboard: false,
|
|||
|
focus: false,
|
|||
|
autoBlur: false,
|
|||
|
disableDefaultPadding: false,
|
|||
|
cursor: -1,
|
|||
|
cursorSpacing: 30,
|
|||
|
selectionStart: -1,
|
|||
|
selectionEnd: -1,
|
|||
|
adjustPosition: true,
|
|||
|
inputAlign: "left",
|
|||
|
fontSize: "15px",
|
|||
|
color: "#303133",
|
|||
|
prefixIcon: "",
|
|||
|
prefixIconStyle: "",
|
|||
|
suffixIcon: "",
|
|||
|
suffixIconStyle: "",
|
|||
|
border: "surround",
|
|||
|
readonly: false,
|
|||
|
shape: "square",
|
|||
|
formatter: null
|
|||
|
}
|
|||
|
};
|
|||
|
const Keyboard = {
|
|||
|
// 键盘组件
|
|||
|
keyboard: {
|
|||
|
mode: "number",
|
|||
|
dotDisabled: false,
|
|||
|
tooltip: true,
|
|||
|
showTips: true,
|
|||
|
tips: "",
|
|||
|
showCancel: true,
|
|||
|
showConfirm: true,
|
|||
|
random: false,
|
|||
|
safeAreaInsetBottom: true,
|
|||
|
closeOnClickOverlay: true,
|
|||
|
show: false,
|
|||
|
overlay: true,
|
|||
|
zIndex: 10075,
|
|||
|
cancelText: "取消",
|
|||
|
confirmText: "确定",
|
|||
|
autoChange: false
|
|||
|
}
|
|||
|
};
|
|||
|
const Line = {
|
|||
|
// line组件
|
|||
|
line: {
|
|||
|
color: "#d6d7d9",
|
|||
|
length: "100%",
|
|||
|
direction: "row",
|
|||
|
hairline: true,
|
|||
|
margin: 0,
|
|||
|
dashed: false
|
|||
|
}
|
|||
|
};
|
|||
|
const LineProgress = {
|
|||
|
// lineProgress 组件
|
|||
|
lineProgress: {
|
|||
|
activeColor: "#19be6b",
|
|||
|
inactiveColor: "#ececec",
|
|||
|
percentage: 0,
|
|||
|
showText: true,
|
|||
|
height: 12
|
|||
|
}
|
|||
|
};
|
|||
|
const {
|
|||
|
color: color$2
|
|||
|
} = config$1;
|
|||
|
const Link = {
|
|||
|
// link超链接组件props参数
|
|||
|
link: {
|
|||
|
color: color$2["u-primary"],
|
|||
|
fontSize: 15,
|
|||
|
underLine: false,
|
|||
|
href: "",
|
|||
|
mpTips: "链接已复制,请在浏览器打开",
|
|||
|
lineColor: "",
|
|||
|
text: ""
|
|||
|
}
|
|||
|
};
|
|||
|
const List = {
|
|||
|
// list 组件
|
|||
|
list: {
|
|||
|
showScrollbar: false,
|
|||
|
lowerThreshold: 50,
|
|||
|
upperThreshold: 0,
|
|||
|
scrollTop: 0,
|
|||
|
offsetAccuracy: 10,
|
|||
|
enableFlex: false,
|
|||
|
pagingEnabled: false,
|
|||
|
scrollable: true,
|
|||
|
scrollIntoView: "",
|
|||
|
scrollWithAnimation: false,
|
|||
|
enableBackToTop: false,
|
|||
|
height: 0,
|
|||
|
width: 0,
|
|||
|
preLoadScreen: 1
|
|||
|
}
|
|||
|
};
|
|||
|
const ListItem = {
|
|||
|
// listItem 组件
|
|||
|
listItem: {
|
|||
|
anchor: ""
|
|||
|
}
|
|||
|
};
|
|||
|
const {
|
|||
|
color: color$1
|
|||
|
} = config$1;
|
|||
|
const LoadingIcon = {
|
|||
|
// loading-icon加载中图标组件
|
|||
|
loadingIcon: {
|
|||
|
show: true,
|
|||
|
color: color$1["u-tips-color"],
|
|||
|
textColor: color$1["u-tips-color"],
|
|||
|
vertical: false,
|
|||
|
mode: "spinner",
|
|||
|
size: 24,
|
|||
|
textSize: 15,
|
|||
|
text: "",
|
|||
|
timingFunction: "ease-in-out",
|
|||
|
duration: 1200,
|
|||
|
inactiveColor: ""
|
|||
|
}
|
|||
|
};
|
|||
|
const LoadingPage = {
|
|||
|
// loading-page组件
|
|||
|
loadingPage: {
|
|||
|
loadingText: "正在加载",
|
|||
|
image: "",
|
|||
|
loadingMode: "circle",
|
|||
|
loading: false,
|
|||
|
bgColor: "#ffffff",
|
|||
|
color: "#C8C8C8",
|
|||
|
fontSize: 19,
|
|||
|
iconSize: 28,
|
|||
|
loadingColor: "#C8C8C8"
|
|||
|
}
|
|||
|
};
|
|||
|
const Loadmore = {
|
|||
|
// loadmore 组件
|
|||
|
loadmore: {
|
|||
|
status: "loadmore",
|
|||
|
bgColor: "transparent",
|
|||
|
icon: true,
|
|||
|
fontSize: 14,
|
|||
|
iconSize: 17,
|
|||
|
color: "#606266",
|
|||
|
loadingIcon: "spinner",
|
|||
|
loadmoreText: "加载更多",
|
|||
|
loadingText: "正在加载...",
|
|||
|
nomoreText: "没有更多了",
|
|||
|
isDot: false,
|
|||
|
iconColor: "#b7b7b7",
|
|||
|
marginTop: 10,
|
|||
|
marginBottom: 10,
|
|||
|
height: "auto",
|
|||
|
line: false,
|
|||
|
lineColor: "#E6E8EB",
|
|||
|
dashed: false
|
|||
|
}
|
|||
|
};
|
|||
|
const Modal = {
|
|||
|
// modal 组件
|
|||
|
modal: {
|
|||
|
show: false,
|
|||
|
title: "",
|
|||
|
content: "",
|
|||
|
confirmText: "确认",
|
|||
|
cancelText: "取消",
|
|||
|
showConfirmButton: true,
|
|||
|
showCancelButton: false,
|
|||
|
confirmColor: "#2979ff",
|
|||
|
cancelColor: "#606266",
|
|||
|
buttonReverse: false,
|
|||
|
zoom: true,
|
|||
|
asyncClose: false,
|
|||
|
closeOnClickOverlay: false,
|
|||
|
negativeTop: 0,
|
|||
|
width: "650rpx",
|
|||
|
confirmButtonShape: ""
|
|||
|
}
|
|||
|
};
|
|||
|
const color = {
|
|||
|
primary: "#3c9cff",
|
|||
|
info: "#909399",
|
|||
|
default: "#909399",
|
|||
|
warning: "#f9ae3d",
|
|||
|
error: "#f56c6c",
|
|||
|
success: "#5ac725",
|
|||
|
mainColor: "#303133",
|
|||
|
contentColor: "#606266",
|
|||
|
tipsColor: "#909399",
|
|||
|
lightColor: "#c0c4cc",
|
|||
|
borderColor: "#e4e7ed"
|
|||
|
};
|
|||
|
const Navbar = {
|
|||
|
// navbar 组件
|
|||
|
navbar: {
|
|||
|
safeAreaInsetTop: true,
|
|||
|
placeholder: false,
|
|||
|
fixed: true,
|
|||
|
border: false,
|
|||
|
leftIcon: "arrow-left",
|
|||
|
leftText: "",
|
|||
|
rightText: "",
|
|||
|
rightIcon: "",
|
|||
|
title: "",
|
|||
|
bgColor: "#ffffff",
|
|||
|
titleWidth: "400rpx",
|
|||
|
height: "44px",
|
|||
|
leftIconSize: 20,
|
|||
|
leftIconColor: color.mainColor,
|
|||
|
autoBack: false,
|
|||
|
titleStyle: ""
|
|||
|
}
|
|||
|
};
|
|||
|
const NoNetwork = {
|
|||
|
// noNetwork
|
|||
|
noNetwork: {
|
|||
|
tips: "哎呀,网络信号丢失",
|
|||
|
zIndex: "",
|
|||
|
image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASwAAAEsCAYAAAB5fY51AAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAABLKADAAQAAAABAAABLAAAAADYYILnAABAAElEQVR4Ae29CZhkV3kefNeq6m2W7tn3nl0aCbHIAgmQPGB+sLCNzSID9g9PYrAf57d/+4+DiW0cy8QBJ06c2In/PLFDHJ78+MGCGNsYgyxwIwktwEijAc1ohtmnZ+2Z7p5eq6vu9r/vuXWrq25VdVV1V3dXVX9Hmj73nv285963vvOd75yraeIEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQaD8E9PbrkvRopSMwMBBYRs+5O/yJS68cPnzYXel4tFP/jXbqjPRFEAiCQNe6Bw/6gdFn9Oy9Q90LLG2DgBBW2wyldIQIPPPCte2a5q3jtR+4ff/4wuBuXotrDwSEsNpjHKUXQODppy+udYJMEUEZgbd94DvnNwlA7YGAEFZ7jOOK78Xp06eTTkq7sxwQhmXuf/754VXl4iSstRAQwmqt8ZLWlkHg0UcD49qYfUjXfLtMtOZ7npExJu4iqZWLl7DWQUAIq3XGSlpaAYHD77q8xwuCOSUoXw8Sl0eMux977DGzQjES3AIICGG1wCBJEysj8PXnz230XXdr5RQFMYbRvWnv6w8UhMhliyGwYghr4Pjg3oEXL34ey9zyC9tiD2ml5h47dr1LN7S6CMjz/A3PvHh1Z6UyJby5EVgRhKUe7Kz/JU0LfvrJo5f+Y3MPibSuFgQGBgasYSd9l6GDsup0WS/T/9RTp9fXmU2SNwECdQ92E7S57iaMeJnPQLK6ixkDLfjlb7546RfrLkQyNBcC3dsP6oHWMd9G+V3JgwPHh7rnm1/yLQ8CbU9Y33zp0j+nZFUMb/DHmB7+SHGY3LUKAk8cObtD00xlHDrfNge+Z2ozU3c9dvx4Yr5lSL6lR6CtCWvg6OAPw9z538ZhhZRl6XrwhW8du1KX/iNejtwvPQIDR8+vSRqJ/obU7GupjdNdh2gW0ZDypJBFR6BtB2rg2OVtuub9JcmpHIpBoK1xfffLzx4f7C0XL2HNiYDp6bs9z23Ypn1fC1Y/9PCFDc3ZW2lVHIG2JKzTp4Ok7nv/G6Q054MIvda+bNb74pEgKGtwGAdL7pcfAa8vOKEZ2kyjWuLr7uDh+/qvN6o8KWdxEWhLwroyeek/g4zuqwU6kNrhyZcu/UktaSXN8iNwuL9/RuvVXtJ9PbPQ1vhmcP6t9+47u9ByJP/SIdB2hDVw9MJHQFYfrQdCph84evFX68kjaZcPAZJWwjMXRFpJ2zr91tfuvrh8vZCa54NA2xGWrunvmg8QWCJ/N4ir7fCYDxatkOeBB7an501agXbygVdvv9IK/ZQ2FiPQdi9osGbH+zRNf7y4m9Xu9Me7N9nv0HXdr5ZS4psHgXpJC9P/wDRTx0Vn1TxjWG9LGrbaUm/Fi5meSvcrkxf/Cg/ow9XqAUk91v3qHT97r6471dJKfHMi8Oyzgx1Z03t1YAQVT2MwgsC3u+yXHzi0faQ5eyGtqgWBtpOw2Ol9+/TM+sTOn8L08MtzgQCy+tOHXr3jA0JWc6HU/HF5Scssr4jXcYqfP6V/T8iq+ceyWgvbUsKKOn38eJAYyl56TAuCEr2WYei//9Crd/5GlFb81kdASVopSFrerKRlaoZj9HR+700H10+0fg+lB21NWBxe2lhNHsUpDZr27mi4dV379R9+za4/iO7Fbx8ECknLCPTsTDJ17O33bJpqnx6u7J60PWFxeAcCbMV56dJfQKf1bkMLfuGh1+76zMoe9vbuPUnLsb2DtmOe5HSxvXsrvWtLBEhaTx29+Ma27Jx0ShAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQaEsEVoQdVluO3BJ06ptHL34b1XRjp4Ch6Rq24+kmjG4Nwwg+9uA9u/73EjRBqhAEihAoe3xwUQq5WTYEzp0b3ZnV/Ncf6O/9AvY9wlh/6dy3X7ncN512Zw9BVLXjuAP4np44vnQtkZoEgVkEhLBmsWiKqwsXpjbPBOn3gRfenwnc+7GBe+zsjclvonFDS9nA9Iy/u3x9+vAP3735VPk4CRUEFhcBIazFxbfm0k9fHD7k+v4nQFaPQIrx8Gmyx/GJ0J/t7ez7mw0b9MmaC2pQQgh0/ZSm4g5TwueWWtqLt0HuVy4CQljLPPYnB0depTn+b3t+8B4t0AdBUv93h2H9xc6da0aXs2m+r1WQsLRnl7NdUvfKRkAIa5nG//r1oGtsZvjTgev/kqYHF/TA+AXoqv4npJemOEiQU1Eo2l+G0movBK1UBBPU7s9E1+ILAkuNgKwSLjXiqO/khVtvARH8dxDBRkMzPrF/V+9/BlG5y9CUqlXinHv9mRPXtvuus88L9H3JPv2zD2yXExCqAicJBIFWRwAvv3Xqwq0/Pnn+lv/K+ZvfPH3p9p5W75O0fxaBp793ce3AwIDMWmYhafiVgNtwSMsXeHp4eNXJC8Nf0PAdRCiuf/XgrnWUqsqotcvnl9DmRkCdweX4b9N7+m/ih+mbMraLM14yJVwcXItKpT1VRve+ArC3Qqn+3gM7132jKEGZm6tXg86J7OhDfuA/iHwPUpfUZSfu2L59tXxEoQxeyxkEgjKeOnLxHb4RqC+NY5H3+2953d4XlrNN7Vq3ENYij+yZwbG9jpt9GkBPQ5H9zgP9607OVeWp87cOQtn9zwJf+xDMNFfj+jryPqXpxj8c2Nn7P+SXey70lidu4IXzb0DNB4tr9751+HV7zxSHyd1CERDCWiiCc+QPjUCnsaqmZ62O5IN7N/VUNP48ee7mAZDTf4Tt049iUG4Guv4ZfNLos9UIbo7qJWoJEHjy+bP7fNsoOcnW0A0/aacef8PdG28sQTNWTBVCWIs01OfPj66BpfqTmq732UnjgT1bei+Vq4pTv7HM8Ceg2/o1qLQug7T+FaaM3IqTLZdewpoHgYEjV9fphvOj+OShWa5V+CxvZtpzv/LwG/aNl4uXsPoRwI+4uEYjAJ2GmdG8L0FK2mYa+tsrkdXZy+P7x2ZuHdW14P+BLdank9q6Qwd3rf+ckFWjR6Tx5Q2cP58K9Jm3VCIr1ogt48lO237r3//96YofeG18y9q7RFklXITxPXV+5DchKb3ZDMy37Nu5tuxG4R9cHH6b42QfAzlds+3EPXu2rfrBIjRFilwkBIIR7SHoJDurFU89ZOd680Gke6JaWomvjoBIWNUxqivFD87fej0e0n8Fwvr0/t1rnyqX+QfnRz7g+8FX8Rv8vL3auF/IqhxKzR2WCPxXqKeq3krDTdj2ierpJEUtCIgOqxaUakwzNBR0D09yiqePHOjveyOkpxLr9VMXb73V97S/h3nDXx7Y2fdPkAYbncW1IgIDxy5vM7LZt/hgrnLtxyaBrJNxv/72N+6tuNhSLp+EVUZACKsyNnXHvHL+1qcgNf2KbSXu2bt9dcmS9qlzo/fARgcmCtpzB3b1/Vg5QiuslLowENy
|
|||
|
}
|
|||
|
};
|
|||
|
const NoticeBar = {
|
|||
|
// noticeBar
|
|||
|
noticeBar: {
|
|||
|
text: () => [],
|
|||
|
direction: "row",
|
|||
|
step: false,
|
|||
|
icon: "volume",
|
|||
|
mode: "",
|
|||
|
color: "#f9ae3d",
|
|||
|
bgColor: "#fdf6ec",
|
|||
|
speed: 80,
|
|||
|
fontSize: 14,
|
|||
|
duration: 2e3,
|
|||
|
disableTouch: true,
|
|||
|
url: "",
|
|||
|
linkType: "navigateTo"
|
|||
|
}
|
|||
|
};
|
|||
|
const Notify = {
|
|||
|
// notify组件
|
|||
|
notify: {
|
|||
|
top: 0,
|
|||
|
type: "primary",
|
|||
|
color: "#ffffff",
|
|||
|
bgColor: "",
|
|||
|
message: "",
|
|||
|
duration: 3e3,
|
|||
|
fontSize: 15,
|
|||
|
safeAreaInsetTop: false
|
|||
|
}
|
|||
|
};
|
|||
|
const NumberBox = {
|
|||
|
// 步进器组件
|
|||
|
numberBox: {
|
|||
|
name: "",
|
|||
|
value: 0,
|
|||
|
min: 1,
|
|||
|
max: Number.MAX_SAFE_INTEGER,
|
|||
|
step: 1,
|
|||
|
integer: false,
|
|||
|
disabled: false,
|
|||
|
disabledInput: false,
|
|||
|
asyncChange: false,
|
|||
|
inputWidth: 35,
|
|||
|
showMinus: true,
|
|||
|
showPlus: true,
|
|||
|
decimalLength: null,
|
|||
|
longPress: true,
|
|||
|
color: "#323233",
|
|||
|
buttonSize: 30,
|
|||
|
bgColor: "#EBECEE",
|
|||
|
cursorSpacing: 100,
|
|||
|
disableMinus: false,
|
|||
|
disablePlus: false,
|
|||
|
iconStyle: ""
|
|||
|
}
|
|||
|
};
|
|||
|
const NumberKeyboard = {
|
|||
|
// 数字键盘
|
|||
|
numberKeyboard: {
|
|||
|
mode: "number",
|
|||
|
dotDisabled: false,
|
|||
|
random: false
|
|||
|
}
|
|||
|
};
|
|||
|
const Overlay = {
|
|||
|
// overlay组件
|
|||
|
overlay: {
|
|||
|
show: false,
|
|||
|
zIndex: 10070,
|
|||
|
duration: 300,
|
|||
|
opacity: 0.5
|
|||
|
}
|
|||
|
};
|
|||
|
const Parse = {
|
|||
|
// parse
|
|||
|
parse: {
|
|||
|
copyLink: true,
|
|||
|
errorImg: "",
|
|||
|
lazyLoad: false,
|
|||
|
loadingImg: "",
|
|||
|
pauseVideo: true,
|
|||
|
previewImg: true,
|
|||
|
setTitle: true,
|
|||
|
showImgMenu: true
|
|||
|
}
|
|||
|
};
|
|||
|
const Picker = {
|
|||
|
// picker
|
|||
|
picker: {
|
|||
|
show: false,
|
|||
|
showToolbar: true,
|
|||
|
title: "",
|
|||
|
columns: () => [],
|
|||
|
loading: false,
|
|||
|
itemHeight: 44,
|
|||
|
cancelText: "取消",
|
|||
|
confirmText: "确定",
|
|||
|
cancelColor: "#909193",
|
|||
|
confirmColor: "#3c9cff",
|
|||
|
visibleItemCount: 5,
|
|||
|
keyName: "text",
|
|||
|
closeOnClickOverlay: false,
|
|||
|
defaultIndex: () => [],
|
|||
|
immediateChange: false
|
|||
|
}
|
|||
|
};
|
|||
|
const Popup = {
|
|||
|
// popup组件
|
|||
|
popup: {
|
|||
|
show: false,
|
|||
|
overlay: true,
|
|||
|
mode: "bottom",
|
|||
|
duration: 300,
|
|||
|
closeable: false,
|
|||
|
overlayStyle: () => {
|
|||
|
},
|
|||
|
closeOnClickOverlay: true,
|
|||
|
zIndex: 10075,
|
|||
|
safeAreaInsetBottom: true,
|
|||
|
safeAreaInsetTop: false,
|
|||
|
closeIconPos: "top-right",
|
|||
|
round: 0,
|
|||
|
zoom: true,
|
|||
|
bgColor: "",
|
|||
|
overlayOpacity: 0.5
|
|||
|
}
|
|||
|
};
|
|||
|
const Radio = {
|
|||
|
// radio组件
|
|||
|
radio: {
|
|||
|
name: "",
|
|||
|
shape: "",
|
|||
|
disabled: "",
|
|||
|
labelDisabled: "",
|
|||
|
activeColor: "",
|
|||
|
inactiveColor: "",
|
|||
|
iconSize: "",
|
|||
|
labelSize: "",
|
|||
|
label: "",
|
|||
|
labelColor: "",
|
|||
|
size: "",
|
|||
|
iconColor: "",
|
|||
|
placement: ""
|
|||
|
}
|
|||
|
};
|
|||
|
const RadioGroup = {
|
|||
|
// radio-group组件
|
|||
|
radioGroup: {
|
|||
|
value: "",
|
|||
|
disabled: false,
|
|||
|
shape: "circle",
|
|||
|
activeColor: "#2979ff",
|
|||
|
inactiveColor: "#c8c9cc",
|
|||
|
name: "",
|
|||
|
size: 18,
|
|||
|
placement: "row",
|
|||
|
label: "",
|
|||
|
labelColor: "#303133",
|
|||
|
labelSize: 14,
|
|||
|
labelDisabled: false,
|
|||
|
iconColor: "#ffffff",
|
|||
|
iconSize: 12,
|
|||
|
borderBottom: false,
|
|||
|
iconPlacement: "left"
|
|||
|
}
|
|||
|
};
|
|||
|
const Rate = {
|
|||
|
// rate组件
|
|||
|
rate: {
|
|||
|
value: 1,
|
|||
|
count: 5,
|
|||
|
disabled: false,
|
|||
|
size: 18,
|
|||
|
inactiveColor: "#b2b2b2",
|
|||
|
activeColor: "#FA3534",
|
|||
|
gutter: 4,
|
|||
|
minCount: 1,
|
|||
|
allowHalf: false,
|
|||
|
activeIcon: "star-fill",
|
|||
|
inactiveIcon: "star",
|
|||
|
touchable: true
|
|||
|
}
|
|||
|
};
|
|||
|
const ReadMore = {
|
|||
|
// readMore
|
|||
|
readMore: {
|
|||
|
showHeight: 400,
|
|||
|
toggle: false,
|
|||
|
closeText: "展开阅读全文",
|
|||
|
openText: "收起",
|
|||
|
color: "#2979ff",
|
|||
|
fontSize: 14,
|
|||
|
textIndent: "2em",
|
|||
|
name: ""
|
|||
|
}
|
|||
|
};
|
|||
|
const Row = {
|
|||
|
// row
|
|||
|
row: {
|
|||
|
gutter: 0,
|
|||
|
justify: "start",
|
|||
|
align: "center"
|
|||
|
}
|
|||
|
};
|
|||
|
const RowNotice = {
|
|||
|
// rowNotice
|
|||
|
rowNotice: {
|
|||
|
text: "",
|
|||
|
icon: "volume",
|
|||
|
mode: "",
|
|||
|
color: "#f9ae3d",
|
|||
|
bgColor: "#fdf6ec",
|
|||
|
fontSize: 14,
|
|||
|
speed: 80
|
|||
|
}
|
|||
|
};
|
|||
|
const ScrollList = {
|
|||
|
// scrollList
|
|||
|
scrollList: {
|
|||
|
indicatorWidth: 50,
|
|||
|
indicatorBarWidth: 20,
|
|||
|
indicator: true,
|
|||
|
indicatorColor: "#f2f2f2",
|
|||
|
indicatorActiveColor: "#3c9cff",
|
|||
|
indicatorStyle: ""
|
|||
|
}
|
|||
|
};
|
|||
|
const Search = {
|
|||
|
// search
|
|||
|
search: {
|
|||
|
shape: "round",
|
|||
|
bgColor: "#f2f2f2",
|
|||
|
placeholder: "请输入关键字",
|
|||
|
clearabled: true,
|
|||
|
focus: false,
|
|||
|
showAction: true,
|
|||
|
actionStyle: () => ({}),
|
|||
|
actionText: "搜索",
|
|||
|
inputAlign: "left",
|
|||
|
inputStyle: () => ({}),
|
|||
|
disabled: false,
|
|||
|
borderColor: "transparent",
|
|||
|
searchIconColor: "#909399",
|
|||
|
searchIconSize: 22,
|
|||
|
color: "#606266",
|
|||
|
placeholderColor: "#909399",
|
|||
|
searchIcon: "search",
|
|||
|
margin: "0",
|
|||
|
animation: false,
|
|||
|
value: "",
|
|||
|
maxlength: "-1",
|
|||
|
height: 32,
|
|||
|
label: null
|
|||
|
}
|
|||
|
};
|
|||
|
const Section = {
|
|||
|
// u-section组件
|
|||
|
section: {
|
|||
|
title: "",
|
|||
|
subTitle: "更多",
|
|||
|
right: true,
|
|||
|
fontSize: 15,
|
|||
|
bold: true,
|
|||
|
color: "#303133",
|
|||
|
subColor: "#909399",
|
|||
|
showLine: true,
|
|||
|
lineColor: "",
|
|||
|
arrow: true
|
|||
|
}
|
|||
|
};
|
|||
|
const Skeleton = {
|
|||
|
// skeleton
|
|||
|
skeleton: {
|
|||
|
loading: true,
|
|||
|
animate: true,
|
|||
|
rows: 0,
|
|||
|
rowsWidth: "100%",
|
|||
|
rowsHeight: 18,
|
|||
|
title: true,
|
|||
|
titleWidth: "50%",
|
|||
|
titleHeight: 18,
|
|||
|
avatar: false,
|
|||
|
avatarSize: 32,
|
|||
|
avatarShape: "circle"
|
|||
|
}
|
|||
|
};
|
|||
|
const Slider = {
|
|||
|
// slider组件
|
|||
|
slider: {
|
|||
|
value: 0,
|
|||
|
blockSize: 18,
|
|||
|
min: 0,
|
|||
|
max: 100,
|
|||
|
step: 1,
|
|||
|
activeColor: "#2979ff",
|
|||
|
inactiveColor: "#c0c4cc",
|
|||
|
blockColor: "#ffffff",
|
|||
|
showValue: false,
|
|||
|
disabled: false,
|
|||
|
blockStyle: () => {
|
|||
|
}
|
|||
|
}
|
|||
|
};
|
|||
|
const StatusBar = {
|
|||
|
// statusBar
|
|||
|
statusBar: {
|
|||
|
bgColor: "transparent"
|
|||
|
}
|
|||
|
};
|
|||
|
const Steps = {
|
|||
|
// steps组件
|
|||
|
steps: {
|
|||
|
direction: "row",
|
|||
|
current: 0,
|
|||
|
activeColor: "#3c9cff",
|
|||
|
inactiveColor: "#969799",
|
|||
|
activeIcon: "",
|
|||
|
inactiveIcon: "",
|
|||
|
dot: false
|
|||
|
}
|
|||
|
};
|
|||
|
const StepsItem = {
|
|||
|
// steps-item组件
|
|||
|
stepsItem: {
|
|||
|
title: "",
|
|||
|
desc: "",
|
|||
|
iconSize: 17,
|
|||
|
error: false
|
|||
|
}
|
|||
|
};
|
|||
|
const Sticky = {
|
|||
|
// sticky组件
|
|||
|
sticky: {
|
|||
|
offsetTop: 0,
|
|||
|
customNavHeight: 0,
|
|||
|
disabled: false,
|
|||
|
bgColor: "transparent",
|
|||
|
zIndex: "",
|
|||
|
index: ""
|
|||
|
}
|
|||
|
};
|
|||
|
const Subsection = {
|
|||
|
// subsection组件
|
|||
|
subsection: {
|
|||
|
list: [],
|
|||
|
current: 0,
|
|||
|
activeColor: "#3c9cff",
|
|||
|
inactiveColor: "#303133",
|
|||
|
mode: "button",
|
|||
|
fontSize: 12,
|
|||
|
bold: true,
|
|||
|
bgColor: "#eeeeef",
|
|||
|
keyName: "name"
|
|||
|
}
|
|||
|
};
|
|||
|
const SwipeAction = {
|
|||
|
// swipe-action组件
|
|||
|
swipeAction: {
|
|||
|
autoClose: true
|
|||
|
}
|
|||
|
};
|
|||
|
const SwipeActionItem = {
|
|||
|
// swipeActionItem 组件
|
|||
|
swipeActionItem: {
|
|||
|
show: false,
|
|||
|
name: "",
|
|||
|
disabled: false,
|
|||
|
threshold: 20,
|
|||
|
autoClose: true,
|
|||
|
options: [],
|
|||
|
duration: 300
|
|||
|
}
|
|||
|
};
|
|||
|
const Swiper = {
|
|||
|
// swiper 组件
|
|||
|
swiper: {
|
|||
|
list: () => [],
|
|||
|
indicator: false,
|
|||
|
indicatorActiveColor: "#FFFFFF",
|
|||
|
indicatorInactiveColor: "rgba(255, 255, 255, 0.35)",
|
|||
|
indicatorStyle: "",
|
|||
|
indicatorMode: "line",
|
|||
|
autoplay: true,
|
|||
|
current: 0,
|
|||
|
currentItemId: "",
|
|||
|
interval: 3e3,
|
|||
|
duration: 300,
|
|||
|
circular: false,
|
|||
|
previousMargin: 0,
|
|||
|
nextMargin: 0,
|
|||
|
acceleration: false,
|
|||
|
displayMultipleItems: 1,
|
|||
|
easingFunction: "default",
|
|||
|
keyName: "url",
|
|||
|
imgMode: "aspectFill",
|
|||
|
height: 130,
|
|||
|
bgColor: "#f3f4f6",
|
|||
|
radius: 4,
|
|||
|
loading: false,
|
|||
|
showTitle: false
|
|||
|
}
|
|||
|
};
|
|||
|
const SwipterIndicator = {
|
|||
|
// swiperIndicator 组件
|
|||
|
swiperIndicator: {
|
|||
|
length: 0,
|
|||
|
current: 0,
|
|||
|
indicatorActiveColor: "",
|
|||
|
indicatorInactiveColor: "",
|
|||
|
indicatorMode: "line"
|
|||
|
}
|
|||
|
};
|
|||
|
const Switch = {
|
|||
|
// switch
|
|||
|
switch: {
|
|||
|
loading: false,
|
|||
|
disabled: false,
|
|||
|
size: 25,
|
|||
|
activeColor: "#2979ff",
|
|||
|
inactiveColor: "#ffffff",
|
|||
|
value: false,
|
|||
|
activeValue: true,
|
|||
|
inactiveValue: false,
|
|||
|
asyncChange: false,
|
|||
|
space: 0
|
|||
|
}
|
|||
|
};
|
|||
|
const Tabbar = {
|
|||
|
// tabbar
|
|||
|
tabbar: {
|
|||
|
value: null,
|
|||
|
safeAreaInsetBottom: true,
|
|||
|
border: true,
|
|||
|
zIndex: 1,
|
|||
|
activeColor: "#1989fa",
|
|||
|
inactiveColor: "#7d7e80",
|
|||
|
fixed: true,
|
|||
|
placeholder: true
|
|||
|
}
|
|||
|
};
|
|||
|
const TabbarItem = {
|
|||
|
//
|
|||
|
tabbarItem: {
|
|||
|
name: null,
|
|||
|
icon: "",
|
|||
|
badge: null,
|
|||
|
dot: false,
|
|||
|
text: "",
|
|||
|
badgeStyle: "top: 6px;right:2px;"
|
|||
|
}
|
|||
|
};
|
|||
|
const Tabs = {
|
|||
|
//
|
|||
|
tabs: {
|
|||
|
duration: 300,
|
|||
|
list: () => [],
|
|||
|
lineColor: "#3c9cff",
|
|||
|
activeStyle: () => ({
|
|||
|
color: "#303133"
|
|||
|
}),
|
|||
|
inactiveStyle: () => ({
|
|||
|
color: "#606266"
|
|||
|
}),
|
|||
|
lineWidth: 20,
|
|||
|
lineHeight: 3,
|
|||
|
lineBgSize: "cover",
|
|||
|
itemStyle: () => ({
|
|||
|
height: "44px"
|
|||
|
}),
|
|||
|
scrollable: true,
|
|||
|
current: 0,
|
|||
|
keyName: "name"
|
|||
|
}
|
|||
|
};
|
|||
|
const Tag = {
|
|||
|
// tag 组件
|
|||
|
tag: {
|
|||
|
type: "primary",
|
|||
|
disabled: false,
|
|||
|
size: "medium",
|
|||
|
shape: "square",
|
|||
|
text: "",
|
|||
|
bgColor: "",
|
|||
|
color: "",
|
|||
|
borderColor: "",
|
|||
|
closeColor: "#C6C7CB",
|
|||
|
name: "",
|
|||
|
plainFill: false,
|
|||
|
plain: false,
|
|||
|
closable: false,
|
|||
|
show: true,
|
|||
|
icon: ""
|
|||
|
}
|
|||
|
};
|
|||
|
const Text = {
|
|||
|
// text 组件
|
|||
|
text: {
|
|||
|
type: "",
|
|||
|
show: true,
|
|||
|
text: "",
|
|||
|
prefixIcon: "",
|
|||
|
suffixIcon: "",
|
|||
|
mode: "",
|
|||
|
href: "",
|
|||
|
format: "",
|
|||
|
call: false,
|
|||
|
openType: "",
|
|||
|
bold: false,
|
|||
|
block: false,
|
|||
|
lines: "",
|
|||
|
color: "#303133",
|
|||
|
size: 15,
|
|||
|
iconStyle: () => ({
|
|||
|
fontSize: "15px"
|
|||
|
}),
|
|||
|
decoration: "none",
|
|||
|
margin: 0,
|
|||
|
lineHeight: "",
|
|||
|
align: "left",
|
|||
|
wordWrap: "normal"
|
|||
|
}
|
|||
|
};
|
|||
|
const Textarea = {
|
|||
|
// textarea 组件
|
|||
|
textarea: {
|
|||
|
value: "",
|
|||
|
placeholder: "",
|
|||
|
placeholderClass: "textarea-placeholder",
|
|||
|
placeholderStyle: "color: #c0c4cc",
|
|||
|
height: 70,
|
|||
|
confirmType: "done",
|
|||
|
disabled: false,
|
|||
|
count: false,
|
|||
|
focus: false,
|
|||
|
autoHeight: false,
|
|||
|
fixed: false,
|
|||
|
cursorSpacing: 0,
|
|||
|
cursor: "",
|
|||
|
showConfirmBar: true,
|
|||
|
selectionStart: -1,
|
|||
|
selectionEnd: -1,
|
|||
|
adjustPosition: true,
|
|||
|
disableDefaultPadding: false,
|
|||
|
holdKeyboard: false,
|
|||
|
maxlength: 140,
|
|||
|
border: "surround",
|
|||
|
formatter: null
|
|||
|
}
|
|||
|
};
|
|||
|
const Toast = {
|
|||
|
// toast组件
|
|||
|
toast: {
|
|||
|
zIndex: 10090,
|
|||
|
loading: false,
|
|||
|
text: "",
|
|||
|
icon: "",
|
|||
|
type: "",
|
|||
|
loadingMode: "",
|
|||
|
show: "",
|
|||
|
overlay: false,
|
|||
|
position: "center",
|
|||
|
params: () => {
|
|||
|
},
|
|||
|
duration: 2e3,
|
|||
|
isTab: false,
|
|||
|
url: "",
|
|||
|
callback: null,
|
|||
|
back: false
|
|||
|
}
|
|||
|
};
|
|||
|
const Toolbar = {
|
|||
|
// toolbar 组件
|
|||
|
toolbar: {
|
|||
|
show: true,
|
|||
|
cancelText: "取消",
|
|||
|
confirmText: "确认",
|
|||
|
cancelColor: "#909193",
|
|||
|
confirmColor: "#3c9cff",
|
|||
|
title: ""
|
|||
|
}
|
|||
|
};
|
|||
|
const Tooltip = {
|
|||
|
// tooltip 组件
|
|||
|
tooltip: {
|
|||
|
text: "",
|
|||
|
copyText: "",
|
|||
|
size: 14,
|
|||
|
color: "#606266",
|
|||
|
bgColor: "transparent",
|
|||
|
direction: "top",
|
|||
|
zIndex: 10071,
|
|||
|
showCopy: true,
|
|||
|
buttons: () => [],
|
|||
|
overlay: true,
|
|||
|
showToast: true
|
|||
|
}
|
|||
|
};
|
|||
|
const Transition = {
|
|||
|
// transition动画组件的props
|
|||
|
transition: {
|
|||
|
show: false,
|
|||
|
mode: "fade",
|
|||
|
duration: "300",
|
|||
|
timingFunction: "ease-out"
|
|||
|
}
|
|||
|
};
|
|||
|
const Upload = {
|
|||
|
// upload组件
|
|||
|
upload: {
|
|||
|
accept: "image",
|
|||
|
capture: () => ["album", "camera"],
|
|||
|
compressed: true,
|
|||
|
camera: "back",
|
|||
|
maxDuration: 60,
|
|||
|
uploadIcon: "camera-fill",
|
|||
|
uploadIconColor: "#D3D4D6",
|
|||
|
useBeforeRead: false,
|
|||
|
previewFullImage: true,
|
|||
|
maxCount: 52,
|
|||
|
disabled: false,
|
|||
|
imageMode: "aspectFill",
|
|||
|
name: "",
|
|||
|
sizeType: () => ["original", "compressed"],
|
|||
|
multiple: false,
|
|||
|
deletable: true,
|
|||
|
maxSize: Number.MAX_VALUE,
|
|||
|
fileList: () => [],
|
|||
|
uploadText: "",
|
|||
|
width: 80,
|
|||
|
height: 80,
|
|||
|
previewImage: true
|
|||
|
}
|
|||
|
};
|
|||
|
const props$3 = {
|
|||
|
...ActionSheet,
|
|||
|
...Album,
|
|||
|
...Alert,
|
|||
|
...Avatar,
|
|||
|
...AvatarGroup,
|
|||
|
...Backtop,
|
|||
|
...Badge,
|
|||
|
...Button,
|
|||
|
...Calendar,
|
|||
|
...CarKeyboard,
|
|||
|
...Cell,
|
|||
|
...CellGroup,
|
|||
|
...Checkbox,
|
|||
|
...CheckboxGroup,
|
|||
|
...CircleProgress,
|
|||
|
...Code,
|
|||
|
...CodeInput,
|
|||
|
...Col,
|
|||
|
...Collapse,
|
|||
|
...CollapseItem,
|
|||
|
...ColumnNotice,
|
|||
|
...CountDown,
|
|||
|
...CountTo,
|
|||
|
...DatetimePicker,
|
|||
|
...Divider,
|
|||
|
...Empty,
|
|||
|
...Form,
|
|||
|
...GormItem,
|
|||
|
...Gap,
|
|||
|
...Grid,
|
|||
|
...GridItem,
|
|||
|
...Icon,
|
|||
|
...Image,
|
|||
|
...IndexAnchor,
|
|||
|
...IndexList,
|
|||
|
...Input,
|
|||
|
...Keyboard,
|
|||
|
...Line,
|
|||
|
...LineProgress,
|
|||
|
...Link,
|
|||
|
...List,
|
|||
|
...ListItem,
|
|||
|
...LoadingIcon,
|
|||
|
...LoadingPage,
|
|||
|
...Loadmore,
|
|||
|
...Modal,
|
|||
|
...Navbar,
|
|||
|
...NoNetwork,
|
|||
|
...NoticeBar,
|
|||
|
...Notify,
|
|||
|
...NumberBox,
|
|||
|
...NumberKeyboard,
|
|||
|
...Overlay,
|
|||
|
...Parse,
|
|||
|
...Picker,
|
|||
|
...Popup,
|
|||
|
...Radio,
|
|||
|
...RadioGroup,
|
|||
|
...Rate,
|
|||
|
...ReadMore,
|
|||
|
...Row,
|
|||
|
...RowNotice,
|
|||
|
...ScrollList,
|
|||
|
...Search,
|
|||
|
...Section,
|
|||
|
...Skeleton,
|
|||
|
...Slider,
|
|||
|
...StatusBar,
|
|||
|
...Steps,
|
|||
|
...StepsItem,
|
|||
|
...Sticky,
|
|||
|
...Subsection,
|
|||
|
...SwipeAction,
|
|||
|
...SwipeActionItem,
|
|||
|
...Swiper,
|
|||
|
...SwipterIndicator,
|
|||
|
...Switch,
|
|||
|
...Tabbar,
|
|||
|
...TabbarItem,
|
|||
|
...Tabs,
|
|||
|
...Tag,
|
|||
|
...Text,
|
|||
|
...Textarea,
|
|||
|
...Toast,
|
|||
|
...Toolbar,
|
|||
|
...Tooltip,
|
|||
|
...Transition,
|
|||
|
...Upload
|
|||
|
};
|
|||
|
const props$2 = {
|
|||
|
props: {
|
|||
|
// 是否显示组件
|
|||
|
show: {
|
|||
|
type: Boolean,
|
|||
|
default: props$3.loadingIcon.show
|
|||
|
},
|
|||
|
// 颜色
|
|||
|
color: {
|
|||
|
type: String,
|
|||
|
default: props$3.loadingIcon.color
|
|||
|
},
|
|||
|
// 提示文字颜色
|
|||
|
textColor: {
|
|||
|
type: String,
|
|||
|
default: props$3.loadingIcon.textColor
|
|||
|
},
|
|||
|
// 文字和图标是否垂直排列
|
|||
|
vertical: {
|
|||
|
type: Boolean,
|
|||
|
default: props$3.loadingIcon.vertical
|
|||
|
},
|
|||
|
// 模式选择,circle-圆形,spinner-花朵形,semicircle-半圆形
|
|||
|
mode: {
|
|||
|
type: String,
|
|||
|
default: props$3.loadingIcon.mode
|
|||
|
},
|
|||
|
// 图标大小,单位默认px
|
|||
|
size: {
|
|||
|
type: [String, Number],
|
|||
|
default: props$3.loadingIcon.size
|
|||
|
},
|
|||
|
// 文字大小
|
|||
|
textSize: {
|
|||
|
type: [String, Number],
|
|||
|
default: props$3.loadingIcon.textSize
|
|||
|
},
|
|||
|
// 文字内容
|
|||
|
text: {
|
|||
|
type: [String, Number],
|
|||
|
default: props$3.loadingIcon.text
|
|||
|
},
|
|||
|
// 动画模式
|
|||
|
timingFunction: {
|
|||
|
type: String,
|
|||
|
default: props$3.loadingIcon.timingFunction
|
|||
|
},
|
|||
|
// 动画执行周期时间
|
|||
|
duration: {
|
|||
|
type: [String, Number],
|
|||
|
default: props$3.loadingIcon.duration
|
|||
|
},
|
|||
|
// mode=circle时的暗边颜色
|
|||
|
inactiveColor: {
|
|||
|
type: String,
|
|||
|
default: props$3.loadingIcon.inactiveColor
|
|||
|
}
|
|||
|
}
|
|||
|
};
|
|||
|
const mpMixin = {};
|
|||
|
const mixin = {
|
|||
|
// 定义每个组件都可能需要用到的外部样式以及类名
|
|||
|
props: {
|
|||
|
// 每个组件都有的父组件传递的样式,可以为字符串或者对象形式
|
|||
|
customStyle: {
|
|||
|
type: [Object, String],
|
|||
|
default: () => ({})
|
|||
|
},
|
|||
|
customClass: {
|
|||
|
type: String,
|
|||
|
default: ""
|
|||
|
},
|
|||
|
// 跳转的页面路径
|
|||
|
url: {
|
|||
|
type: String,
|
|||
|
default: ""
|
|||
|
},
|
|||
|
// 页面跳转的类型
|
|||
|
linkType: {
|
|||
|
type: String,
|
|||
|
default: "navigateTo"
|
|||
|
}
|
|||
|
},
|
|||
|
data() {
|
|||
|
return {};
|
|||
|
},
|
|||
|
onLoad() {
|
|||
|
this.$u.getRect = this.$uGetRect;
|
|||
|
},
|
|||
|
created() {
|
|||
|
this.$u.getRect = this.$uGetRect;
|
|||
|
},
|
|||
|
computed: {
|
|||
|
// 在2.x版本中,将会把$u挂载到uni对象下,导致在模板中无法使用uni.$u.xxx形式
|
|||
|
// 所以这里通过computed计算属性将其附加到this.$u上,就可以在模板或者js中使用uni.$u.xxx
|
|||
|
// 只在nvue环境通过此方式引入完整的$u,其他平台会出现性能问题,非nvue则按需引入(主要原因是props过大)
|
|||
|
$u() {
|
|||
|
return uni.$u.deepMerge(uni.$u, {
|
|||
|
props: void 0,
|
|||
|
http: void 0,
|
|||
|
mixin: void 0
|
|||
|
});
|
|||
|
},
|
|||
|
/**
|
|||
|
* 生成bem规则类名
|
|||
|
* 由于微信小程序,H5,nvue之间绑定class的差异,无法通过:class="[bem()]"的形式进行同用
|
|||
|
* 故采用如下折中做法,最后返回的是数组(一般平台)或字符串(支付宝和字节跳动平台),类似['a', 'b', 'c']或'a b c'的形式
|
|||
|
* @param {String} name 组件名称
|
|||
|
* @param {Array} fixed 一直会存在的类名
|
|||
|
* @param {Array} change 会根据变量值为true或者false而出现或者隐藏的类名
|
|||
|
* @returns {Array|string}
|
|||
|
*/
|
|||
|
bem() {
|
|||
|
return function(name, fixed, change) {
|
|||
|
const prefix = `u-${name}--`;
|
|||
|
const classes = {};
|
|||
|
if (fixed) {
|
|||
|
fixed.map((item) => {
|
|||
|
classes[prefix + this[item]] = true;
|
|||
|
});
|
|||
|
}
|
|||
|
if (change) {
|
|||
|
change.map((item) => {
|
|||
|
this[item] ? classes[prefix + item] = this[item] : delete classes[prefix + item];
|
|||
|
});
|
|||
|
}
|
|||
|
return Object.keys(classes);
|
|||
|
};
|
|||
|
}
|
|||
|
},
|
|||
|
methods: {
|
|||
|
// 跳转某一个页面
|
|||
|
openPage(urlKey = "url") {
|
|||
|
const url2 = this[urlKey];
|
|||
|
if (url2) {
|
|||
|
this.$u.route({ type: this.linkType, url: url2 });
|
|||
|
}
|
|||
|
},
|
|||
|
// 查询节点信息
|
|||
|
// 目前此方法在支付宝小程序中无法获取组件跟接点的尺寸,为支付宝的bug(2020-07-21)
|
|||
|
// 解决办法为在组件根部再套一个没有任何作用的view元素
|
|||
|
$uGetRect(selector, all) {
|
|||
|
return new Promise((resolve) => {
|
|||
|
uni.createSelectorQuery().in(this)[all ? "selectAll" : "select"](selector).boundingClientRect((rect) => {
|
|||
|
if (all && Array.isArray(rect) && rect.length) {
|
|||
|
resolve(rect);
|
|||
|
}
|
|||
|
if (!all && rect) {
|
|||
|
resolve(rect);
|
|||
|
}
|
|||
|
}).exec();
|
|||
|
});
|
|||
|
},
|
|||
|
getParentData(parentName = "") {
|
|||
|
if (!this.parent)
|
|||
|
this.parent = {};
|
|||
|
this.parent = uni.$u.$parent.call(this, parentName);
|
|||
|
if (this.parent.children) {
|
|||
|
this.parent.children.indexOf(this) === -1 && this.parent.children.push(this);
|
|||
|
}
|
|||
|
if (this.parent && this.parentData) {
|
|||
|
Object.keys(this.parentData).map((key) => {
|
|||
|
this.parentData[key] = this.parent[key];
|
|||
|
});
|
|||
|
}
|
|||
|
},
|
|||
|
// 阻止事件冒泡
|
|||
|
preventEvent(e) {
|
|||
|
e && typeof e.stopPropagation === "function" && e.stopPropagation();
|
|||
|
},
|
|||
|
// 空操作
|
|||
|
noop(e) {
|
|||
|
this.preventEvent(e);
|
|||
|
}
|
|||
|
},
|
|||
|
onReachBottom() {
|
|||
|
uni.$emit("uOnReachBottom");
|
|||
|
},
|
|||
|
beforeDestroy() {
|
|||
|
if (this.parent && uni.$u.test.array(this.parent.children)) {
|
|||
|
const childrenList = this.parent.children;
|
|||
|
childrenList.map((child, index2) => {
|
|||
|
if (child === this) {
|
|||
|
childrenList.splice(index2, 1);
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
}
|
|||
|
};
|
|||
|
const _export_sfc = (sfc, props2) => {
|
|||
|
const target = sfc.__vccOpts || sfc;
|
|||
|
for (const [key, val] of props2) {
|
|||
|
target[key] = val;
|
|||
|
}
|
|||
|
return target;
|
|||
|
};
|
|||
|
const _sfc_main$6 = {
|
|||
|
name: "u-loading-icon",
|
|||
|
mixins: [mpMixin, mixin, props$2],
|
|||
|
data() {
|
|||
|
return {
|
|||
|
// Array.form可以通过一个伪数组对象创建指定长度的数组
|
|||
|
// https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/from
|
|||
|
array12: Array.from({
|
|||
|
length: 12
|
|||
|
}),
|
|||
|
// 这里需要设置默认值为360,否则在安卓nvue上,会延迟一个duration周期后才执行
|
|||
|
// 在iOS nvue上,则会一开始默认执行两个周期的动画
|
|||
|
aniAngel: 360,
|
|||
|
// 动画旋转角度
|
|||
|
webviewHide: false,
|
|||
|
// 监听webview的状态,如果隐藏了页面,则停止动画,以免性能消耗
|
|||
|
loading: false
|
|||
|
// 是否运行中,针对nvue使用
|
|||
|
};
|
|||
|
},
|
|||
|
computed: {
|
|||
|
// 当为circle类型时,给其另外三边设置一个更轻一些的颜色
|
|||
|
// 之所以需要这么做的原因是,比如父组件传了color为红色,那么需要另外的三个边为浅红色
|
|||
|
// 而不能是固定的某一个其他颜色(因为这个固定的颜色可能浅蓝,导致效果没有那么细腻良好)
|
|||
|
otherBorderColor() {
|
|||
|
const lightColor = uni.$u.colorGradient(this.color, "#ffffff", 100)[80];
|
|||
|
if (this.mode === "circle") {
|
|||
|
return this.inactiveColor ? this.inactiveColor : lightColor;
|
|||
|
} else {
|
|||
|
return "transparent";
|
|||
|
}
|
|||
|
}
|
|||
|
},
|
|||
|
watch: {
|
|||
|
show(n) {
|
|||
|
}
|
|||
|
},
|
|||
|
mounted() {
|
|||
|
this.init();
|
|||
|
},
|
|||
|
methods: {
|
|||
|
init() {
|
|||
|
setTimeout(() => {
|
|||
|
this.show && this.addEventListenerToWebview();
|
|||
|
}, 20);
|
|||
|
},
|
|||
|
// 监听webview的显示与隐藏
|
|||
|
addEventListenerToWebview() {
|
|||
|
const pages2 = getCurrentPages();
|
|||
|
const page2 = pages2[pages2.length - 1];
|
|||
|
const currentWebview = page2.$getAppWebview();
|
|||
|
currentWebview.addEventListener("hide", () => {
|
|||
|
this.webviewHide = true;
|
|||
|
});
|
|||
|
currentWebview.addEventListener("show", () => {
|
|||
|
this.webviewHide = false;
|
|||
|
});
|
|||
|
}
|
|||
|
}
|
|||
|
};
|
|||
|
function _sfc_render$3(_ctx, _cache, $props, $setup, $data, $options) {
|
|||
|
return _ctx.show ? (vue.openBlock(), vue.createElementBlock(
|
|||
|
"view",
|
|||
|
{
|
|||
|
key: 0,
|
|||
|
class: vue.normalizeClass(["u-loading-icon", [_ctx.vertical && "u-loading-icon--vertical"]]),
|
|||
|
style: vue.normalizeStyle([_ctx.$u.addStyle(_ctx.customStyle)])
|
|||
|
},
|
|||
|
[
|
|||
|
!$data.webviewHide ? (vue.openBlock(), vue.createElementBlock(
|
|||
|
"view",
|
|||
|
{
|
|||
|
key: 0,
|
|||
|
class: vue.normalizeClass(["u-loading-icon__spinner", [`u-loading-icon__spinner--${_ctx.mode}`]]),
|
|||
|
ref: "ani",
|
|||
|
style: vue.normalizeStyle({
|
|||
|
color: _ctx.color,
|
|||
|
width: _ctx.$u.addUnit(_ctx.size),
|
|||
|
height: _ctx.$u.addUnit(_ctx.size),
|
|||
|
borderTopColor: _ctx.color,
|
|||
|
borderBottomColor: $options.otherBorderColor,
|
|||
|
borderLeftColor: $options.otherBorderColor,
|
|||
|
borderRightColor: $options.otherBorderColor,
|
|||
|
"animation-duration": `${_ctx.duration}ms`,
|
|||
|
"animation-timing-function": _ctx.mode === "semicircle" || _ctx.mode === "circle" ? _ctx.timingFunction : ""
|
|||
|
})
|
|||
|
},
|
|||
|
[
|
|||
|
_ctx.mode === "spinner" ? (vue.openBlock(true), vue.createElementBlock(
|
|||
|
vue.Fragment,
|
|||
|
{ key: 0 },
|
|||
|
vue.renderList($data.array12, (item, index2) => {
|
|||
|
return vue.openBlock(), vue.createElementBlock("view", {
|
|||
|
key: index2,
|
|||
|
class: "u-loading-icon__dot"
|
|||
|
});
|
|||
|
}),
|
|||
|
128
|
|||
|
/* KEYED_FRAGMENT */
|
|||
|
)) : vue.createCommentVNode("v-if", true)
|
|||
|
],
|
|||
|
6
|
|||
|
/* CLASS, STYLE */
|
|||
|
)) : vue.createCommentVNode("v-if", true),
|
|||
|
_ctx.text ? (vue.openBlock(), vue.createElementBlock(
|
|||
|
"text",
|
|||
|
{
|
|||
|
key: 1,
|
|||
|
class: "u-loading-icon__text",
|
|||
|
style: vue.normalizeStyle({
|
|||
|
fontSize: _ctx.$u.addUnit(_ctx.textSize),
|
|||
|
color: _ctx.textColor
|
|||
|
})
|
|||
|
},
|
|||
|
vue.toDisplayString(_ctx.text),
|
|||
|
5
|
|||
|
/* TEXT, STYLE */
|
|||
|
)) : vue.createCommentVNode("v-if", true)
|
|||
|
],
|
|||
|
6
|
|||
|
/* CLASS, STYLE */
|
|||
|
)) : vue.createCommentVNode("v-if", true);
|
|||
|
}
|
|||
|
const __easycom_0$1 = /* @__PURE__ */ _export_sfc(_sfc_main$6, [["render", _sfc_render$3], ["__scopeId", "data-v-00752c6d"], ["__file", "D:/zmj/uniapp/TraceabilityAPP/node_modules/uview-plus/components/u-loading-icon/u-loading-icon.vue"]]);
|
|||
|
const icons = {
|
|||
|
"uicon-level": "",
|
|||
|
"uicon-column-line": "",
|
|||
|
"uicon-checkbox-mark": "",
|
|||
|
"uicon-folder": "",
|
|||
|
"uicon-movie": "",
|
|||
|
"uicon-star-fill": "",
|
|||
|
"uicon-star": "",
|
|||
|
"uicon-phone-fill": "",
|
|||
|
"uicon-phone": "",
|
|||
|
"uicon-apple-fill": "",
|
|||
|
"uicon-chrome-circle-fill": "",
|
|||
|
"uicon-backspace": "",
|
|||
|
"uicon-attach": "",
|
|||
|
"uicon-cut": "",
|
|||
|
"uicon-empty-car": "",
|
|||
|
"uicon-empty-coupon": "",
|
|||
|
"uicon-empty-address": "",
|
|||
|
"uicon-empty-favor": "",
|
|||
|
"uicon-empty-permission": "",
|
|||
|
"uicon-empty-news": "",
|
|||
|
"uicon-empty-search": "",
|
|||
|
"uicon-github-circle-fill": "",
|
|||
|
"uicon-rmb": "",
|
|||
|
"uicon-person-delete-fill": "",
|
|||
|
"uicon-reload": "",
|
|||
|
"uicon-order": "",
|
|||
|
"uicon-server-man": "",
|
|||
|
"uicon-search": "",
|
|||
|
"uicon-fingerprint": "",
|
|||
|
"uicon-more-dot-fill": "",
|
|||
|
"uicon-scan": "",
|
|||
|
"uicon-share-square": "",
|
|||
|
"uicon-map": "",
|
|||
|
"uicon-map-fill": "",
|
|||
|
"uicon-tags": "",
|
|||
|
"uicon-tags-fill": "",
|
|||
|
"uicon-bookmark-fill": "",
|
|||
|
"uicon-bookmark": "",
|
|||
|
"uicon-eye": "",
|
|||
|
"uicon-eye-fill": "",
|
|||
|
"uicon-mic": "",
|
|||
|
"uicon-mic-off": "",
|
|||
|
"uicon-calendar": "",
|
|||
|
"uicon-calendar-fill": "",
|
|||
|
"uicon-trash": "",
|
|||
|
"uicon-trash-fill": "",
|
|||
|
"uicon-play-left": "",
|
|||
|
"uicon-play-right": "",
|
|||
|
"uicon-minus": "",
|
|||
|
"uicon-plus": "",
|
|||
|
"uicon-info": "",
|
|||
|
"uicon-info-circle": "",
|
|||
|
"uicon-info-circle-fill": "",
|
|||
|
"uicon-question": "",
|
|||
|
"uicon-error": "",
|
|||
|
"uicon-close": "",
|
|||
|
"uicon-checkmark": "",
|
|||
|
"uicon-android-circle-fill": "",
|
|||
|
"uicon-android-fill": "",
|
|||
|
"uicon-ie": "",
|
|||
|
"uicon-IE-circle-fill": "",
|
|||
|
"uicon-google": "",
|
|||
|
"uicon-google-circle-fill": "",
|
|||
|
"uicon-setting-fill": "",
|
|||
|
"uicon-setting": "",
|
|||
|
"uicon-minus-square-fill": "",
|
|||
|
"uicon-plus-square-fill": "",
|
|||
|
"uicon-heart": "",
|
|||
|
"uicon-heart-fill": "",
|
|||
|
"uicon-camera": "",
|
|||
|
"uicon-camera-fill": "",
|
|||
|
"uicon-more-circle": "",
|
|||
|
"uicon-more-circle-fill": "",
|
|||
|
"uicon-chat": "",
|
|||
|
"uicon-chat-fill": "",
|
|||
|
"uicon-bag-fill": "",
|
|||
|
"uicon-bag": "",
|
|||
|
"uicon-error-circle-fill": "",
|
|||
|
"uicon-error-circle": "",
|
|||
|
"uicon-close-circle": "",
|
|||
|
"uicon-close-circle-fill": "",
|
|||
|
"uicon-checkmark-circle": "",
|
|||
|
"uicon-checkmark-circle-fill": "",
|
|||
|
"uicon-question-circle-fill": "",
|
|||
|
"uicon-question-circle": "",
|
|||
|
"uicon-share": "",
|
|||
|
"uicon-share-fill": "",
|
|||
|
"uicon-shopping-cart": "",
|
|||
|
"uicon-shopping-cart-fill": "",
|
|||
|
"uicon-bell": "",
|
|||
|
"uicon-bell-fill": "",
|
|||
|
"uicon-list": "",
|
|||
|
"uicon-list-dot": "",
|
|||
|
"uicon-zhihu": "",
|
|||
|
"uicon-zhihu-circle-fill": "",
|
|||
|
"uicon-zhifubao": "",
|
|||
|
"uicon-zhifubao-circle-fill": "",
|
|||
|
"uicon-weixin-circle-fill": "",
|
|||
|
"uicon-weixin-fill": "",
|
|||
|
"uicon-twitter-circle-fill": "",
|
|||
|
"uicon-twitter": "",
|
|||
|
"uicon-taobao-circle-fill": "",
|
|||
|
"uicon-taobao": "",
|
|||
|
"uicon-weibo-circle-fill": "",
|
|||
|
"uicon-weibo": "",
|
|||
|
"uicon-qq-fill": "",
|
|||
|
"uicon-qq-circle-fill": "",
|
|||
|
"uicon-moments-circel-fill": "",
|
|||
|
"uicon-moments": "",
|
|||
|
"uicon-qzone": "",
|
|||
|
"uicon-qzone-circle-fill": "",
|
|||
|
"uicon-baidu-circle-fill": "",
|
|||
|
"uicon-baidu": "",
|
|||
|
"uicon-facebook-circle-fill": "",
|
|||
|
"uicon-facebook": "",
|
|||
|
"uicon-car": "",
|
|||
|
"uicon-car-fill": "",
|
|||
|
"uicon-warning-fill": "",
|
|||
|
"uicon-warning": "",
|
|||
|
"uicon-clock-fill": "",
|
|||
|
"uicon-clock": "",
|
|||
|
"uicon-edit-pen": "",
|
|||
|
"uicon-edit-pen-fill": "",
|
|||
|
"uicon-email": "",
|
|||
|
"uicon-email-fill": "",
|
|||
|
"uicon-minus-circle": "",
|
|||
|
"uicon-minus-circle-fill": "",
|
|||
|
"uicon-plus-circle": "",
|
|||
|
"uicon-plus-circle-fill": "",
|
|||
|
"uicon-file-text": "",
|
|||
|
"uicon-file-text-fill": "",
|
|||
|
"uicon-pushpin": "",
|
|||
|
"uicon-pushpin-fill": "",
|
|||
|
"uicon-grid": "",
|
|||
|
"uicon-grid-fill": "",
|
|||
|
"uicon-play-circle": "",
|
|||
|
"uicon-play-circle-fill": "",
|
|||
|
"uicon-pause-circle-fill": "",
|
|||
|
"uicon-pause": "",
|
|||
|
"uicon-pause-circle": "",
|
|||
|
"uicon-eye-off": "",
|
|||
|
"uicon-eye-off-outline": "",
|
|||
|
"uicon-gift-fill": "",
|
|||
|
"uicon-gift": "",
|
|||
|
"uicon-rmb-circle-fill": "",
|
|||
|
"uicon-rmb-circle": "",
|
|||
|
"uicon-kefu-ermai": "",
|
|||
|
"uicon-server-fill": "",
|
|||
|
"uicon-coupon-fill": "",
|
|||
|
"uicon-coupon": "",
|
|||
|
"uicon-integral": "",
|
|||
|
"uicon-integral-fill": "",
|
|||
|
"uicon-home-fill": "",
|
|||
|
"uicon-home": "",
|
|||
|
"uicon-hourglass-half-fill": "",
|
|||
|
"uicon-hourglass": "",
|
|||
|
"uicon-account": "",
|
|||
|
"uicon-plus-people-fill": "",
|
|||
|
"uicon-minus-people-fill": "",
|
|||
|
"uicon-account-fill": "",
|
|||
|
"uicon-thumb-down-fill": "",
|
|||
|
"uicon-thumb-down": "",
|
|||
|
"uicon-thumb-up": "",
|
|||
|
"uicon-thumb-up-fill": "",
|
|||
|
"uicon-lock-fill": "",
|
|||
|
"uicon-lock-open": "",
|
|||
|
"uicon-lock-opened-fill": "",
|
|||
|
"uicon-lock": "",
|
|||
|
"uicon-red-packet-fill": "",
|
|||
|
"uicon-photo-fill": "",
|
|||
|
"uicon-photo": "",
|
|||
|
"uicon-volume-off-fill": "",
|
|||
|
"uicon-volume-off": "",
|
|||
|
"uicon-volume-fill": "",
|
|||
|
"uicon-volume": "",
|
|||
|
"uicon-red-packet": "",
|
|||
|
"uicon-download": "",
|
|||
|
"uicon-arrow-up-fill": "",
|
|||
|
"uicon-arrow-down-fill": "",
|
|||
|
"uicon-play-left-fill": "",
|
|||
|
"uicon-play-right-fill": "",
|
|||
|
"uicon-rewind-left-fill": "",
|
|||
|
"uicon-rewind-right-fill": "",
|
|||
|
"uicon-arrow-downward": "",
|
|||
|
"uicon-arrow-leftward": "",
|
|||
|
"uicon-arrow-rightward": "",
|
|||
|
"uicon-arrow-upward": "",
|
|||
|
"uicon-arrow-down": "",
|
|||
|
"uicon-arrow-right": "",
|
|||
|
"uicon-arrow-left": "",
|
|||
|
"uicon-arrow-up": "",
|
|||
|
"uicon-skip-back-left": "",
|
|||
|
"uicon-skip-forward-right": "",
|
|||
|
"uicon-rewind-right": "",
|
|||
|
"uicon-rewind-left": "",
|
|||
|
"uicon-arrow-right-double": "",
|
|||
|
"uicon-arrow-left-double": "",
|
|||
|
"uicon-wifi-off": "",
|
|||
|
"uicon-wifi": "",
|
|||
|
"uicon-empty-data": "",
|
|||
|
"uicon-empty-history": "",
|
|||
|
"uicon-empty-list": "",
|
|||
|
"uicon-empty-page": "",
|
|||
|
"uicon-empty-order": "",
|
|||
|
"uicon-man": "",
|
|||
|
"uicon-woman": "",
|
|||
|
"uicon-man-add": "",
|
|||
|
"uicon-man-add-fill": "",
|
|||
|
"uicon-man-delete": "",
|
|||
|
"uicon-man-delete-fill": "",
|
|||
|
"uicon-zh": "",
|
|||
|
"uicon-en": ""
|
|||
|
};
|
|||
|
const props$1 = {
|
|||
|
props: {
|
|||
|
// 图标类名
|
|||
|
name: {
|
|||
|
type: String,
|
|||
|
default: props$3.icon.name
|
|||
|
},
|
|||
|
// 图标颜色,可接受主题色
|
|||
|
color: {
|
|||
|
type: String,
|
|||
|
default: props$3.icon.color
|
|||
|
},
|
|||
|
// 字体大小,单位px
|
|||
|
size: {
|
|||
|
type: [String, Number],
|
|||
|
default: props$3.icon.size
|
|||
|
},
|
|||
|
// 是否显示粗体
|
|||
|
bold: {
|
|||
|
type: Boolean,
|
|||
|
default: props$3.icon.bold
|
|||
|
},
|
|||
|
// 点击图标的时候传递事件出去的index(用于区分点击了哪一个)
|
|||
|
index: {
|
|||
|
type: [String, Number],
|
|||
|
default: props$3.icon.index
|
|||
|
},
|
|||
|
// 触摸图标时的类名
|
|||
|
hoverClass: {
|
|||
|
type: String,
|
|||
|
default: props$3.icon.hoverClass
|
|||
|
},
|
|||
|
// 自定义扩展前缀,方便用户扩展自己的图标库
|
|||
|
customPrefix: {
|
|||
|
type: String,
|
|||
|
default: props$3.icon.customPrefix
|
|||
|
},
|
|||
|
// 图标右边或者下面的文字
|
|||
|
label: {
|
|||
|
type: [String, Number],
|
|||
|
default: props$3.icon.label
|
|||
|
},
|
|||
|
// label的位置,只能右边或者下边
|
|||
|
labelPos: {
|
|||
|
type: String,
|
|||
|
default: props$3.icon.labelPos
|
|||
|
},
|
|||
|
// label的大小
|
|||
|
labelSize: {
|
|||
|
type: [String, Number],
|
|||
|
default: props$3.icon.labelSize
|
|||
|
},
|
|||
|
// label的颜色
|
|||
|
labelColor: {
|
|||
|
type: String,
|
|||
|
default: props$3.icon.labelColor
|
|||
|
},
|
|||
|
// label与图标的距离
|
|||
|
space: {
|
|||
|
type: [String, Number],
|
|||
|
default: props$3.icon.space
|
|||
|
},
|
|||
|
// 图片的mode
|
|||
|
imgMode: {
|
|||
|
type: String,
|
|||
|
default: props$3.icon.imgMode
|
|||
|
},
|
|||
|
// 用于显示图片小图标时,图片的宽度
|
|||
|
width: {
|
|||
|
type: [String, Number],
|
|||
|
default: props$3.icon.width
|
|||
|
},
|
|||
|
// 用于显示图片小图标时,图片的高度
|
|||
|
height: {
|
|||
|
type: [String, Number],
|
|||
|
default: props$3.icon.height
|
|||
|
},
|
|||
|
// 用于解决某些情况下,让图标垂直居中的用途
|
|||
|
top: {
|
|||
|
type: [String, Number],
|
|||
|
default: props$3.icon.top
|
|||
|
},
|
|||
|
// 是否阻止事件传播
|
|||
|
stop: {
|
|||
|
type: Boolean,
|
|||
|
default: props$3.icon.stop
|
|||
|
}
|
|||
|
}
|
|||
|
};
|
|||
|
const _sfc_main$5 = {
|
|||
|
name: "u-icon",
|
|||
|
data() {
|
|||
|
return {};
|
|||
|
},
|
|||
|
emits: ["click"],
|
|||
|
mixins: [mpMixin, mixin, props$1],
|
|||
|
computed: {
|
|||
|
uClasses() {
|
|||
|
let classes = [];
|
|||
|
classes.push(this.customPrefix + "-" + this.name);
|
|||
|
if (this.color && uni.$u.config.type.includes(this.color))
|
|||
|
classes.push("u-icon__icon--" + this.color);
|
|||
|
return classes;
|
|||
|
},
|
|||
|
iconStyle() {
|
|||
|
let style = {};
|
|||
|
style = {
|
|||
|
fontSize: uni.$u.addUnit(this.size),
|
|||
|
lineHeight: uni.$u.addUnit(this.size),
|
|||
|
fontWeight: this.bold ? "bold" : "normal",
|
|||
|
// 某些特殊情况需要设置一个到顶部的距离,才能更好的垂直居中
|
|||
|
top: uni.$u.addUnit(this.top)
|
|||
|
};
|
|||
|
if (this.color && !uni.$u.config.type.includes(this.color))
|
|||
|
style.color = this.color;
|
|||
|
return style;
|
|||
|
},
|
|||
|
// 判断传入的name属性,是否图片路径,只要带有"/"均认为是图片形式
|
|||
|
isImg() {
|
|||
|
return this.name.indexOf("/") !== -1;
|
|||
|
},
|
|||
|
imgStyle() {
|
|||
|
let style = {};
|
|||
|
style.width = this.width ? uni.$u.addUnit(this.width) : uni.$u.addUnit(this.size);
|
|||
|
style.height = this.height ? uni.$u.addUnit(this.height) : uni.$u.addUnit(this.size);
|
|||
|
return style;
|
|||
|
},
|
|||
|
// 通过图标名,查找对应的图标
|
|||
|
icon() {
|
|||
|
return icons["uicon-" + this.name] || this.name;
|
|||
|
}
|
|||
|
},
|
|||
|
methods: {
|
|||
|
clickHandler(e) {
|
|||
|
this.$emit("click", this.index);
|
|||
|
this.stop && this.preventEvent(e);
|
|||
|
}
|
|||
|
}
|
|||
|
};
|
|||
|
function _sfc_render$2(_ctx, _cache, $props, $setup, $data, $options) {
|
|||
|
return vue.openBlock(), vue.createElementBlock(
|
|||
|
"view",
|
|||
|
{
|
|||
|
class: vue.normalizeClass(["u-icon", ["u-icon--" + _ctx.labelPos]]),
|
|||
|
onClick: _cache[0] || (_cache[0] = (...args) => $options.clickHandler && $options.clickHandler(...args))
|
|||
|
},
|
|||
|
[
|
|||
|
$options.isImg ? (vue.openBlock(), vue.createElementBlock("image", {
|
|||
|
key: 0,
|
|||
|
class: "u-icon__img",
|
|||
|
src: _ctx.name,
|
|||
|
mode: _ctx.imgMode,
|
|||
|
style: vue.normalizeStyle([$options.imgStyle, _ctx.$u.addStyle(_ctx.customStyle)])
|
|||
|
}, null, 12, ["src", "mode"])) : (vue.openBlock(), vue.createElementBlock("text", {
|
|||
|
key: 1,
|
|||
|
class: vue.normalizeClass(["u-icon__icon", $options.uClasses]),
|
|||
|
style: vue.normalizeStyle([$options.iconStyle, _ctx.$u.addStyle(_ctx.customStyle)]),
|
|||
|
"hover-class": _ctx.hoverClass
|
|||
|
}, vue.toDisplayString($options.icon), 15, ["hover-class"])),
|
|||
|
vue.createCommentVNode(' 这里进行空字符串判断,如果仅仅是v-if="label",可能会出现传递0的时候,结果也无法显示 '),
|
|||
|
_ctx.label !== "" ? (vue.openBlock(), vue.createElementBlock(
|
|||
|
"text",
|
|||
|
{
|
|||
|
key: 2,
|
|||
|
class: "u-icon__label",
|
|||
|
style: vue.normalizeStyle({
|
|||
|
color: _ctx.labelColor,
|
|||
|
fontSize: _ctx.$u.addUnit(_ctx.labelSize),
|
|||
|
marginLeft: _ctx.labelPos == "right" ? _ctx.$u.addUnit(_ctx.space) : 0,
|
|||
|
marginTop: _ctx.labelPos == "bottom" ? _ctx.$u.addUnit(_ctx.space) : 0,
|
|||
|
marginRight: _ctx.labelPos == "left" ? _ctx.$u.addUnit(_ctx.space) : 0,
|
|||
|
marginBottom: _ctx.labelPos == "top" ? _ctx.$u.addUnit(_ctx.space) : 0
|
|||
|
})
|
|||
|
},
|
|||
|
vue.toDisplayString(_ctx.label),
|
|||
|
5
|
|||
|
/* TEXT, STYLE */
|
|||
|
)) : vue.createCommentVNode("v-if", true)
|
|||
|
],
|
|||
|
2
|
|||
|
/* CLASS */
|
|||
|
);
|
|||
|
}
|
|||
|
const __easycom_1 = /* @__PURE__ */ _export_sfc(_sfc_main$5, [["render", _sfc_render$2], ["__scopeId", "data-v-1c933a9a"], ["__file", "D:/zmj/uniapp/TraceabilityAPP/node_modules/uview-plus/components/u-icon/u-icon.vue"]]);
|
|||
|
const props = {
|
|||
|
props: {
|
|||
|
// 是否细边框
|
|||
|
hairline: {
|
|||
|
type: Boolean,
|
|||
|
default: props$3.button.hairline
|
|||
|
},
|
|||
|
// 按钮的预置样式,info,primary,error,warning,success
|
|||
|
type: {
|
|||
|
type: String,
|
|||
|
default: props$3.button.type
|
|||
|
},
|
|||
|
// 按钮尺寸,large,normal,small,mini
|
|||
|
size: {
|
|||
|
type: String,
|
|||
|
default: props$3.button.size
|
|||
|
},
|
|||
|
// 按钮形状,circle(两边为半圆),square(带圆角)
|
|||
|
shape: {
|
|||
|
type: String,
|
|||
|
default: props$3.button.shape
|
|||
|
},
|
|||
|
// 按钮是否镂空
|
|||
|
plain: {
|
|||
|
type: Boolean,
|
|||
|
default: props$3.button.plain
|
|||
|
},
|
|||
|
// 是否禁止状态
|
|||
|
disabled: {
|
|||
|
type: Boolean,
|
|||
|
default: props$3.button.disabled
|
|||
|
},
|
|||
|
// 是否加载中
|
|||
|
loading: {
|
|||
|
type: Boolean,
|
|||
|
default: props$3.button.loading
|
|||
|
},
|
|||
|
// 加载中提示文字
|
|||
|
loadingText: {
|
|||
|
type: [String, Number],
|
|||
|
default: props$3.button.loadingText
|
|||
|
},
|
|||
|
// 加载状态图标类型
|
|||
|
loadingMode: {
|
|||
|
type: String,
|
|||
|
default: props$3.button.loadingMode
|
|||
|
},
|
|||
|
// 加载图标大小
|
|||
|
loadingSize: {
|
|||
|
type: [String, Number],
|
|||
|
default: props$3.button.loadingSize
|
|||
|
},
|
|||
|
// 开放能力,具体请看uniapp稳定关于button组件部分说明
|
|||
|
// https://uniapp.dcloud.io/component/button
|
|||
|
openType: {
|
|||
|
type: String,
|
|||
|
default: props$3.button.openType
|
|||
|
},
|
|||
|
// 用于 <form> 组件,点击分别会触发 <form> 组件的 submit/reset 事件
|
|||
|
// 取值为submit(提交表单),reset(重置表单)
|
|||
|
formType: {
|
|||
|
type: String,
|
|||
|
default: props$3.button.formType
|
|||
|
},
|
|||
|
// 打开 APP 时,向 APP 传递的参数,open-type=launchApp时有效
|
|||
|
// 只微信小程序、QQ小程序有效
|
|||
|
appParameter: {
|
|||
|
type: String,
|
|||
|
default: props$3.button.appParameter
|
|||
|
},
|
|||
|
// 指定是否阻止本节点的祖先节点出现点击态,微信小程序有效
|
|||
|
hoverStopPropagation: {
|
|||
|
type: Boolean,
|
|||
|
default: props$3.button.hoverStopPropagation
|
|||
|
},
|
|||
|
// 指定返回用户信息的语言,zh_CN 简体中文,zh_TW 繁体中文,en 英文。只微信小程序有效
|
|||
|
lang: {
|
|||
|
type: String,
|
|||
|
default: props$3.button.lang
|
|||
|
},
|
|||
|
// 会话来源,open-type="contact"时有效。只微信小程序有效
|
|||
|
sessionFrom: {
|
|||
|
type: String,
|
|||
|
default: props$3.button.sessionFrom
|
|||
|
},
|
|||
|
// 会话内消息卡片标题,open-type="contact"时有效
|
|||
|
// 默认当前标题,只微信小程序有效
|
|||
|
sendMessageTitle: {
|
|||
|
type: String,
|
|||
|
default: props$3.button.sendMessageTitle
|
|||
|
},
|
|||
|
// 会话内消息卡片点击跳转小程序路径,open-type="contact"时有效
|
|||
|
// 默认当前分享路径,只微信小程序有效
|
|||
|
sendMessagePath: {
|
|||
|
type: String,
|
|||
|
default: props$3.button.sendMessagePath
|
|||
|
},
|
|||
|
// 会话内消息卡片图片,open-type="contact"时有效
|
|||
|
// 默认当前页面截图,只微信小程序有效
|
|||
|
sendMessageImg: {
|
|||
|
type: String,
|
|||
|
default: props$3.button.sendMessageImg
|
|||
|
},
|
|||
|
// 是否显示会话内消息卡片,设置此参数为 true,用户进入客服会话会在右下角显示"可能要发送的小程序"提示,
|
|||
|
// 用户点击后可以快速发送小程序消息,open-type="contact"时有效
|
|||
|
showMessageCard: {
|
|||
|
type: Boolean,
|
|||
|
default: props$3.button.showMessageCard
|
|||
|
},
|
|||
|
// 额外传参参数,用于小程序的data-xxx属性,通过target.dataset.name获取
|
|||
|
dataName: {
|
|||
|
type: String,
|
|||
|
default: props$3.button.dataName
|
|||
|
},
|
|||
|
// 节流,一定时间内只能触发一次
|
|||
|
throttleTime: {
|
|||
|
type: [String, Number],
|
|||
|
default: props$3.button.throttleTime
|
|||
|
},
|
|||
|
// 按住后多久出现点击态,单位毫秒
|
|||
|
hoverStartTime: {
|
|||
|
type: [String, Number],
|
|||
|
default: props$3.button.hoverStartTime
|
|||
|
},
|
|||
|
// 手指松开后点击态保留时间,单位毫秒
|
|||
|
hoverStayTime: {
|
|||
|
type: [String, Number],
|
|||
|
default: props$3.button.hoverStayTime
|
|||
|
},
|
|||
|
// 按钮文字,之所以通过props传入,是因为slot传入的话
|
|||
|
// nvue中无法控制文字的样式
|
|||
|
text: {
|
|||
|
type: [String, Number],
|
|||
|
default: props$3.button.text
|
|||
|
},
|
|||
|
// 按钮图标
|
|||
|
icon: {
|
|||
|
type: String,
|
|||
|
default: props$3.button.icon
|
|||
|
},
|
|||
|
// 按钮图标
|
|||
|
iconColor: {
|
|||
|
type: String,
|
|||
|
default: props$3.button.icon
|
|||
|
},
|
|||
|
// 按钮颜色,支持传入linear-gradient渐变色
|
|||
|
color: {
|
|||
|
type: String,
|
|||
|
default: props$3.button.color
|
|||
|
}
|
|||
|
}
|
|||
|
};
|
|||
|
const _sfc_main$4 = {
|
|||
|
name: "u-button",
|
|||
|
mixins: [mpMixin, mixin, props],
|
|||
|
data() {
|
|||
|
return {};
|
|||
|
},
|
|||
|
computed: {
|
|||
|
// 生成bem风格的类名
|
|||
|
bemClass() {
|
|||
|
if (!this.color) {
|
|||
|
return this.bem(
|
|||
|
"button",
|
|||
|
["type", "shape", "size"],
|
|||
|
["disabled", "plain", "hairline"]
|
|||
|
);
|
|||
|
} else {
|
|||
|
return this.bem(
|
|||
|
"button",
|
|||
|
["shape", "size"],
|
|||
|
["disabled", "plain", "hairline"]
|
|||
|
);
|
|||
|
}
|
|||
|
},
|
|||
|
loadingColor() {
|
|||
|
if (this.plain) {
|
|||
|
return this.color ? this.color : uni.$u.config.color[`u-${this.type}`];
|
|||
|
}
|
|||
|
if (this.type === "info") {
|
|||
|
return "#c9c9c9";
|
|||
|
}
|
|||
|
return "rgb(200, 200, 200)";
|
|||
|
},
|
|||
|
iconColorCom() {
|
|||
|
if (this.iconColor)
|
|||
|
return this.iconColor;
|
|||
|
if (this.plain) {
|
|||
|
return this.color ? this.color : this.type;
|
|||
|
} else {
|
|||
|
return this.type === "info" ? "#000000" : "#ffffff";
|
|||
|
}
|
|||
|
},
|
|||
|
baseColor() {
|
|||
|
let style = {};
|
|||
|
if (this.color) {
|
|||
|
style.color = this.plain ? this.color : "white";
|
|||
|
if (!this.plain) {
|
|||
|
style["background-color"] = this.color;
|
|||
|
}
|
|||
|
if (this.color.indexOf("gradient") !== -1) {
|
|||
|
style.borderTopWidth = 0;
|
|||
|
style.borderRightWidth = 0;
|
|||
|
style.borderBottomWidth = 0;
|
|||
|
style.borderLeftWidth = 0;
|
|||
|
if (!this.plain) {
|
|||
|
style.backgroundImage = this.color;
|
|||
|
}
|
|||
|
} else {
|
|||
|
style.borderColor = this.color;
|
|||
|
style.borderWidth = "1px";
|
|||
|
style.borderStyle = "solid";
|
|||
|
}
|
|||
|
}
|
|||
|
return style;
|
|||
|
},
|
|||
|
// nvue版本按钮的字体不会继承父组件的颜色,需要对每一个text组件进行单独的设置
|
|||
|
nvueTextStyle() {
|
|||
|
let style = {};
|
|||
|
if (this.type === "info") {
|
|||
|
style.color = "#323233";
|
|||
|
}
|
|||
|
if (this.color) {
|
|||
|
style.color = this.plain ? this.color : "white";
|
|||
|
}
|
|||
|
style.fontSize = this.textSize + "px";
|
|||
|
return style;
|
|||
|
},
|
|||
|
// 字体大小
|
|||
|
textSize() {
|
|||
|
let fontSize = 14, { size } = this;
|
|||
|
if (size === "large")
|
|||
|
fontSize = 16;
|
|||
|
if (size === "normal")
|
|||
|
fontSize = 14;
|
|||
|
if (size === "small")
|
|||
|
fontSize = 12;
|
|||
|
if (size === "mini")
|
|||
|
fontSize = 10;
|
|||
|
return fontSize;
|
|||
|
}
|
|||
|
},
|
|||
|
emits: [
|
|||
|
"click",
|
|||
|
"getphonenumber",
|
|||
|
"getuserinfo",
|
|||
|
"error",
|
|||
|
"opensetting",
|
|||
|
"launchapp"
|
|||
|
],
|
|||
|
methods: {
|
|||
|
clickHandler() {
|
|||
|
if (!this.disabled && !this.loading) {
|
|||
|
uni.$u.throttle(() => {
|
|||
|
this.$emit("click");
|
|||
|
}, this.throttleTime);
|
|||
|
}
|
|||
|
},
|
|||
|
// 下面为对接uniapp官方按钮开放能力事件回调的对接
|
|||
|
getphonenumber(res) {
|
|||
|
this.$emit("getphonenumber", res);
|
|||
|
},
|
|||
|
getuserinfo(res) {
|
|||
|
this.$emit("getuserinfo", res);
|
|||
|
},
|
|||
|
error(res) {
|
|||
|
this.$emit("error", res);
|
|||
|
},
|
|||
|
opensetting(res) {
|
|||
|
this.$emit("opensetting", res);
|
|||
|
},
|
|||
|
launchapp(res) {
|
|||
|
this.$emit("launchapp", res);
|
|||
|
}
|
|||
|
}
|
|||
|
};
|
|||
|
function _sfc_render$1(_ctx, _cache, $props, $setup, $data, $options) {
|
|||
|
const _component_u_loading_icon = resolveEasycom(vue.resolveDynamicComponent("u-loading-icon"), __easycom_0$1);
|
|||
|
const _component_u_icon = resolveEasycom(vue.resolveDynamicComponent("u-icon"), __easycom_1);
|
|||
|
return vue.openBlock(), vue.createElementBlock("button", {
|
|||
|
"hover-start-time": Number(_ctx.hoverStartTime),
|
|||
|
"hover-stay-time": Number(_ctx.hoverStayTime),
|
|||
|
"form-type": _ctx.formType,
|
|||
|
"open-type": _ctx.openType,
|
|||
|
"app-parameter": _ctx.appParameter,
|
|||
|
"hover-stop-propagation": _ctx.hoverStopPropagation,
|
|||
|
"send-message-title": _ctx.sendMessageTitle,
|
|||
|
"send-message-path": _ctx.sendMessagePath,
|
|||
|
lang: _ctx.lang,
|
|||
|
"data-name": _ctx.dataName,
|
|||
|
"session-from": _ctx.sessionFrom,
|
|||
|
"send-message-img": _ctx.sendMessageImg,
|
|||
|
"show-message-card": _ctx.showMessageCard,
|
|||
|
onGetphonenumber: _cache[0] || (_cache[0] = (...args) => $options.getphonenumber && $options.getphonenumber(...args)),
|
|||
|
onGetuserinfo: _cache[1] || (_cache[1] = (...args) => $options.getuserinfo && $options.getuserinfo(...args)),
|
|||
|
onError: _cache[2] || (_cache[2] = (...args) => $options.error && $options.error(...args)),
|
|||
|
onOpensetting: _cache[3] || (_cache[3] = (...args) => $options.opensetting && $options.opensetting(...args)),
|
|||
|
onLaunchapp: _cache[4] || (_cache[4] = (...args) => $options.launchapp && $options.launchapp(...args)),
|
|||
|
"hover-class": !_ctx.disabled && !_ctx.loading ? "u-button--active" : "",
|
|||
|
class: vue.normalizeClass(["u-button u-reset-button", $options.bemClass]),
|
|||
|
style: vue.normalizeStyle([$options.baseColor, _ctx.$u.addStyle(_ctx.customStyle)]),
|
|||
|
onClick: _cache[5] || (_cache[5] = (...args) => $options.clickHandler && $options.clickHandler(...args))
|
|||
|
}, [
|
|||
|
_ctx.loading ? (vue.openBlock(), vue.createElementBlock(
|
|||
|
vue.Fragment,
|
|||
|
{ key: 0 },
|
|||
|
[
|
|||
|
vue.createVNode(_component_u_loading_icon, {
|
|||
|
mode: _ctx.loadingMode,
|
|||
|
size: _ctx.loadingSize * 1.15,
|
|||
|
color: $options.loadingColor
|
|||
|
}, null, 8, ["mode", "size", "color"]),
|
|||
|
vue.createElementVNode(
|
|||
|
"text",
|
|||
|
{
|
|||
|
class: "u-button__loading-text",
|
|||
|
style: vue.normalizeStyle([{ fontSize: $options.textSize + "px" }])
|
|||
|
},
|
|||
|
vue.toDisplayString(_ctx.loadingText || _ctx.text),
|
|||
|
5
|
|||
|
/* TEXT, STYLE */
|
|||
|
)
|
|||
|
],
|
|||
|
64
|
|||
|
/* STABLE_FRAGMENT */
|
|||
|
)) : (vue.openBlock(), vue.createElementBlock(
|
|||
|
vue.Fragment,
|
|||
|
{ key: 1 },
|
|||
|
[
|
|||
|
_ctx.icon ? (vue.openBlock(), vue.createBlock(_component_u_icon, {
|
|||
|
key: 0,
|
|||
|
name: _ctx.icon,
|
|||
|
color: $options.iconColorCom,
|
|||
|
size: $options.textSize * 1.35,
|
|||
|
customStyle: { marginRight: "2px" }
|
|||
|
}, null, 8, ["name", "color", "size"])) : vue.createCommentVNode("v-if", true),
|
|||
|
vue.renderSlot(_ctx.$slots, "default", {}, () => [
|
|||
|
vue.createElementVNode(
|
|||
|
"text",
|
|||
|
{
|
|||
|
class: "u-button__text",
|
|||
|
style: vue.normalizeStyle([{ fontSize: $options.textSize + "px" }])
|
|||
|
},
|
|||
|
vue.toDisplayString(_ctx.text),
|
|||
|
5
|
|||
|
/* TEXT, STYLE */
|
|||
|
)
|
|||
|
], true)
|
|||
|
],
|
|||
|
64
|
|||
|
/* STABLE_FRAGMENT */
|
|||
|
))
|
|||
|
], 46, ["hover-start-time", "hover-stay-time", "form-type", "open-type", "app-parameter", "hover-stop-propagation", "send-message-title", "send-message-path", "lang", "data-name", "session-from", "send-message-img", "show-message-card", "hover-class"]);
|
|||
|
}
|
|||
|
const __easycom_0 = /* @__PURE__ */ _export_sfc(_sfc_main$4, [["render", _sfc_render$1], ["__scopeId", "data-v-461e713c"], ["__file", "D:/zmj/uniapp/TraceabilityAPP/node_modules/uview-plus/components/u-button/u-button.vue"]]);
|
|||
|
let BASE_URL;
|
|||
|
{
|
|||
|
BASE_URL = "http://ceshi-suyuan.lihaink.cn/";
|
|||
|
}
|
|||
|
let config = {
|
|||
|
HTTP_REQUEST_URL: BASE_URL,
|
|||
|
HEADER: {
|
|||
|
"content-type": "application/json",
|
|||
|
"Form-type": "app",
|
|||
|
"TOKEN": uni.getStorageSync("SY_TOKEN") || ""
|
|||
|
}
|
|||
|
};
|
|||
|
formatAppLog("log", "at utils/syhttp.js:4", "指定");
|
|||
|
function baseRequest(url2, method, data, {
|
|||
|
noAuth = false,
|
|||
|
noVerify = false,
|
|||
|
onReLogin = false
|
|||
|
}) {
|
|||
|
let Url = config.HTTP_REQUEST_URL, header = config.HEADER;
|
|||
|
return new Promise((reslove, reject) => {
|
|||
|
uni.request({
|
|||
|
url: Url + "adminapi" + url2,
|
|||
|
method: method || "GET",
|
|||
|
header: {
|
|||
|
...header
|
|||
|
},
|
|||
|
data: method != "GET" ? data || {} : {},
|
|||
|
params: method == "GET" ? data : {},
|
|||
|
success: (res) => {
|
|||
|
if (noVerify)
|
|||
|
reslove(res.data);
|
|||
|
else if (res.data.code == -1) {
|
|||
|
if (onReLogin) {
|
|||
|
return reject();
|
|||
|
}
|
|||
|
} else if (res.data.code == 0) {
|
|||
|
if (res.data.msg != "无登录信息") {
|
|||
|
uni.showToast({
|
|||
|
title: res.data.msg || "请检查网络",
|
|||
|
icon: "none"
|
|||
|
});
|
|||
|
}
|
|||
|
reject(res.data);
|
|||
|
} else if (res.data.code == 1) {
|
|||
|
reslove(res.data);
|
|||
|
} else if (res.data.code == 200) {
|
|||
|
reslove(res.data.data);
|
|||
|
} else if ([41e4, 410001, 410002, 4e4].indexOf(res.data.code) !== -1) {
|
|||
|
reject(res.data);
|
|||
|
} else if (res.data.code == 501) {
|
|||
|
reject(res.data);
|
|||
|
} else {
|
|||
|
uni.showToast({
|
|||
|
title: res.data.msg || "请检查网络",
|
|||
|
icon: "none"
|
|||
|
});
|
|||
|
reject(res.data.msg || "请检查网络");
|
|||
|
}
|
|||
|
},
|
|||
|
fail: (message) => {
|
|||
|
uni.showToast({
|
|||
|
title: "网络错误",
|
|||
|
icon: "none"
|
|||
|
});
|
|||
|
reject("请求失败");
|
|||
|
}
|
|||
|
});
|
|||
|
});
|
|||
|
}
|
|||
|
const syhttp = {};
|
|||
|
["options", "get", "post", "put", "head", "delete", "trace", "connect"].forEach((method) => {
|
|||
|
syhttp[method] = (api, data, opt) => baseRequest(api, method, data, opt || {});
|
|||
|
});
|
|||
|
const companyMine = (data) => syhttp.post("/SuYuan/monitorDetail", data);
|
|||
|
var isVue2 = false;
|
|||
|
function set(target, key, val) {
|
|||
|
if (Array.isArray(target)) {
|
|||
|
target.length = Math.max(target.length, key);
|
|||
|
target.splice(key, 1, val);
|
|||
|
return val;
|
|||
|
}
|
|||
|
target[key] = val;
|
|||
|
return val;
|
|||
|
}
|
|||
|
function del(target, key) {
|
|||
|
if (Array.isArray(target)) {
|
|||
|
target.splice(key, 1);
|
|||
|
return;
|
|||
|
}
|
|||
|
delete target[key];
|
|||
|
}
|
|||
|
function getDevtoolsGlobalHook() {
|
|||
|
return getTarget().__VUE_DEVTOOLS_GLOBAL_HOOK__;
|
|||
|
}
|
|||
|
function getTarget() {
|
|||
|
return typeof navigator !== "undefined" && typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : {};
|
|||
|
}
|
|||
|
const isProxyAvailable = typeof Proxy === "function";
|
|||
|
const HOOK_SETUP = "devtools-plugin:setup";
|
|||
|
const HOOK_PLUGIN_SETTINGS_SET = "plugin:settings:set";
|
|||
|
let supported;
|
|||
|
let perf;
|
|||
|
function isPerformanceSupported() {
|
|||
|
var _a;
|
|||
|
if (supported !== void 0) {
|
|||
|
return supported;
|
|||
|
}
|
|||
|
if (typeof window !== "undefined" && window.performance) {
|
|||
|
supported = true;
|
|||
|
perf = window.performance;
|
|||
|
} else if (typeof global !== "undefined" && ((_a = global.perf_hooks) === null || _a === void 0 ? void 0 : _a.performance)) {
|
|||
|
supported = true;
|
|||
|
perf = global.perf_hooks.performance;
|
|||
|
} else {
|
|||
|
supported = false;
|
|||
|
}
|
|||
|
return supported;
|
|||
|
}
|
|||
|
function now() {
|
|||
|
return isPerformanceSupported() ? perf.now() : Date.now();
|
|||
|
}
|
|||
|
class ApiProxy {
|
|||
|
constructor(plugin, hook) {
|
|||
|
this.target = null;
|
|||
|
this.targetQueue = [];
|
|||
|
this.onQueue = [];
|
|||
|
this.plugin = plugin;
|
|||
|
this.hook = hook;
|
|||
|
const defaultSettings = {};
|
|||
|
if (plugin.settings) {
|
|||
|
for (const id in plugin.settings) {
|
|||
|
const item = plugin.settings[id];
|
|||
|
defaultSettings[id] = item.defaultValue;
|
|||
|
}
|
|||
|
}
|
|||
|
const localSettingsSaveId = `__vue-devtools-plugin-settings__${plugin.id}`;
|
|||
|
let currentSettings = Object.assign({}, defaultSettings);
|
|||
|
try {
|
|||
|
const raw = localStorage.getItem(localSettingsSaveId);
|
|||
|
const data = JSON.parse(raw);
|
|||
|
Object.assign(currentSettings, data);
|
|||
|
} catch (e) {
|
|||
|
}
|
|||
|
this.fallbacks = {
|
|||
|
getSettings() {
|
|||
|
return currentSettings;
|
|||
|
},
|
|||
|
setSettings(value) {
|
|||
|
try {
|
|||
|
localStorage.setItem(localSettingsSaveId, JSON.stringify(value));
|
|||
|
} catch (e) {
|
|||
|
}
|
|||
|
currentSettings = value;
|
|||
|
},
|
|||
|
now() {
|
|||
|
return now();
|
|||
|
}
|
|||
|
};
|
|||
|
if (hook) {
|
|||
|
hook.on(HOOK_PLUGIN_SETTINGS_SET, (pluginId, value) => {
|
|||
|
if (pluginId === this.plugin.id) {
|
|||
|
this.fallbacks.setSettings(value);
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
this.proxiedOn = new Proxy({}, {
|
|||
|
get: (_target, prop) => {
|
|||
|
if (this.target) {
|
|||
|
return this.target.on[prop];
|
|||
|
} else {
|
|||
|
return (...args) => {
|
|||
|
this.onQueue.push({
|
|||
|
method: prop,
|
|||
|
args
|
|||
|
});
|
|||
|
};
|
|||
|
}
|
|||
|
}
|
|||
|
});
|
|||
|
this.proxiedTarget = new Proxy({}, {
|
|||
|
get: (_target, prop) => {
|
|||
|
if (this.target) {
|
|||
|
return this.target[prop];
|
|||
|
} else if (prop === "on") {
|
|||
|
return this.proxiedOn;
|
|||
|
} else if (Object.keys(this.fallbacks).includes(prop)) {
|
|||
|
return (...args) => {
|
|||
|
this.targetQueue.push({
|
|||
|
method: prop,
|
|||
|
args,
|
|||
|
resolve: () => {
|
|||
|
}
|
|||
|
});
|
|||
|
return this.fallbacks[prop](...args);
|
|||
|
};
|
|||
|
} else {
|
|||
|
return (...args) => {
|
|||
|
return new Promise((resolve) => {
|
|||
|
this.targetQueue.push({
|
|||
|
method: prop,
|
|||
|
args,
|
|||
|
resolve
|
|||
|
});
|
|||
|
});
|
|||
|
};
|
|||
|
}
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
async setRealTarget(target) {
|
|||
|
this.target = target;
|
|||
|
for (const item of this.onQueue) {
|
|||
|
this.target.on[item.method](...item.args);
|
|||
|
}
|
|||
|
for (const item of this.targetQueue) {
|
|||
|
item.resolve(await this.target[item.method](...item.args));
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
function setupDevtoolsPlugin(pluginDescriptor, setupFn) {
|
|||
|
const descriptor = pluginDescriptor;
|
|||
|
const target = getTarget();
|
|||
|
const hook = getDevtoolsGlobalHook();
|
|||
|
const enableProxy = isProxyAvailable && descriptor.enableEarlyProxy;
|
|||
|
if (hook && (target.__VUE_DEVTOOLS_PLUGIN_API_AVAILABLE__ || !enableProxy)) {
|
|||
|
hook.emit(HOOK_SETUP, pluginDescriptor, setupFn);
|
|||
|
} else {
|
|||
|
const proxy = enableProxy ? new ApiProxy(descriptor, hook) : null;
|
|||
|
const list = target.__VUE_DEVTOOLS_PLUGINS__ = target.__VUE_DEVTOOLS_PLUGINS__ || [];
|
|||
|
list.push({
|
|||
|
pluginDescriptor: descriptor,
|
|||
|
setupFn,
|
|||
|
proxy
|
|||
|
});
|
|||
|
if (proxy)
|
|||
|
setupFn(proxy.proxiedTarget);
|
|||
|
}
|
|||
|
}
|
|||
|
/*!
|
|||
|
* pinia v2.0.33
|
|||
|
* (c) 2023 Eduardo San Martin Morote
|
|||
|
* @license MIT
|
|||
|
*/
|
|||
|
let activePinia;
|
|||
|
const setActivePinia = (pinia) => activePinia = pinia;
|
|||
|
const piniaSymbol = Symbol("pinia");
|
|||
|
function isPlainObject$1(o) {
|
|||
|
return o && typeof o === "object" && Object.prototype.toString.call(o) === "[object Object]" && typeof o.toJSON !== "function";
|
|||
|
}
|
|||
|
var MutationType;
|
|||
|
(function(MutationType2) {
|
|||
|
MutationType2["direct"] = "direct";
|
|||
|
MutationType2["patchObject"] = "patch object";
|
|||
|
MutationType2["patchFunction"] = "patch function";
|
|||
|
})(MutationType || (MutationType = {}));
|
|||
|
const IS_CLIENT = typeof window !== "undefined";
|
|||
|
const USE_DEVTOOLS = IS_CLIENT;
|
|||
|
const _global = /* @__PURE__ */ (() => typeof window === "object" && window.window === window ? window : typeof self === "object" && self.self === self ? self : typeof global === "object" && global.global === global ? global : typeof globalThis === "object" ? globalThis : { HTMLElement: null })();
|
|||
|
function bom(blob, { autoBom = false } = {}) {
|
|||
|
if (autoBom && /^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(blob.type)) {
|
|||
|
return new Blob([String.fromCharCode(65279), blob], { type: blob.type });
|
|||
|
}
|
|||
|
return blob;
|
|||
|
}
|
|||
|
function download(url2, name, opts) {
|
|||
|
const xhr = new XMLHttpRequest();
|
|||
|
xhr.open("GET", url2);
|
|||
|
xhr.responseType = "blob";
|
|||
|
xhr.onload = function() {
|
|||
|
saveAs(xhr.response, name, opts);
|
|||
|
};
|
|||
|
xhr.onerror = function() {
|
|||
|
console.error("could not download file");
|
|||
|
};
|
|||
|
xhr.send();
|
|||
|
}
|
|||
|
function corsEnabled(url2) {
|
|||
|
const xhr = new XMLHttpRequest();
|
|||
|
xhr.open("HEAD", url2, false);
|
|||
|
try {
|
|||
|
xhr.send();
|
|||
|
} catch (e) {
|
|||
|
}
|
|||
|
return xhr.status >= 200 && xhr.status <= 299;
|
|||
|
}
|
|||
|
function click(node) {
|
|||
|
try {
|
|||
|
node.dispatchEvent(new MouseEvent("click"));
|
|||
|
} catch (e) {
|
|||
|
const evt = document.createEvent("MouseEvents");
|
|||
|
evt.initMouseEvent("click", true, true, window, 0, 0, 0, 80, 20, false, false, false, false, 0, null);
|
|||
|
node.dispatchEvent(evt);
|
|||
|
}
|
|||
|
}
|
|||
|
const _navigator = typeof navigator === "object" ? navigator : { userAgent: "" };
|
|||
|
const isMacOSWebView = /* @__PURE__ */ (() => /Macintosh/.test(_navigator.userAgent) && /AppleWebKit/.test(_navigator.userAgent) && !/Safari/.test(_navigator.userAgent))();
|
|||
|
const saveAs = !IS_CLIENT ? () => {
|
|||
|
} : (
|
|||
|
// Use download attribute first if possible (#193 Lumia mobile) unless this is a macOS WebView or mini program
|
|||
|
typeof HTMLAnchorElement !== "undefined" && "download" in HTMLAnchorElement.prototype && !isMacOSWebView ? downloadSaveAs : (
|
|||
|
// Use msSaveOrOpenBlob as a second approach
|
|||
|
"msSaveOrOpenBlob" in _navigator ? msSaveAs : (
|
|||
|
// Fallback to using FileReader and a popup
|
|||
|
fileSaverSaveAs
|
|||
|
)
|
|||
|
)
|
|||
|
);
|
|||
|
function downloadSaveAs(blob, name = "download", opts) {
|
|||
|
const a = document.createElement("a");
|
|||
|
a.download = name;
|
|||
|
a.rel = "noopener";
|
|||
|
if (typeof blob === "string") {
|
|||
|
a.href = blob;
|
|||
|
if (a.origin !== location.origin) {
|
|||
|
if (corsEnabled(a.href)) {
|
|||
|
download(blob, name, opts);
|
|||
|
} else {
|
|||
|
a.target = "_blank";
|
|||
|
click(a);
|
|||
|
}
|
|||
|
} else {
|
|||
|
click(a);
|
|||
|
}
|
|||
|
} else {
|
|||
|
a.href = URL.createObjectURL(blob);
|
|||
|
setTimeout(function() {
|
|||
|
URL.revokeObjectURL(a.href);
|
|||
|
}, 4e4);
|
|||
|
setTimeout(function() {
|
|||
|
click(a);
|
|||
|
}, 0);
|
|||
|
}
|
|||
|
}
|
|||
|
function msSaveAs(blob, name = "download", opts) {
|
|||
|
if (typeof blob === "string") {
|
|||
|
if (corsEnabled(blob)) {
|
|||
|
download(blob, name, opts);
|
|||
|
} else {
|
|||
|
const a = document.createElement("a");
|
|||
|
a.href = blob;
|
|||
|
a.target = "_blank";
|
|||
|
setTimeout(function() {
|
|||
|
click(a);
|
|||
|
});
|
|||
|
}
|
|||
|
} else {
|
|||
|
navigator.msSaveOrOpenBlob(bom(blob, opts), name);
|
|||
|
}
|
|||
|
}
|
|||
|
function fileSaverSaveAs(blob, name, opts, popup) {
|
|||
|
popup = popup || open("", "_blank");
|
|||
|
if (popup) {
|
|||
|
popup.document.title = popup.document.body.innerText = "downloading...";
|
|||
|
}
|
|||
|
if (typeof blob === "string")
|
|||
|
return download(blob, name, opts);
|
|||
|
const force = blob.type === "application/octet-stream";
|
|||
|
const isSafari = /constructor/i.test(String(_global.HTMLElement)) || "safari" in _global;
|
|||
|
const isChromeIOS = /CriOS\/[\d]+/.test(navigator.userAgent);
|
|||
|
if ((isChromeIOS || force && isSafari || isMacOSWebView) && typeof FileReader !== "undefined") {
|
|||
|
const reader = new FileReader();
|
|||
|
reader.onloadend = function() {
|
|||
|
let url2 = reader.result;
|
|||
|
if (typeof url2 !== "string") {
|
|||
|
popup = null;
|
|||
|
throw new Error("Wrong reader.result type");
|
|||
|
}
|
|||
|
url2 = isChromeIOS ? url2 : url2.replace(/^data:[^;]*;/, "data:attachment/file;");
|
|||
|
if (popup) {
|
|||
|
popup.location.href = url2;
|
|||
|
} else {
|
|||
|
location.assign(url2);
|
|||
|
}
|
|||
|
popup = null;
|
|||
|
};
|
|||
|
reader.readAsDataURL(blob);
|
|||
|
} else {
|
|||
|
const url2 = URL.createObjectURL(blob);
|
|||
|
if (popup)
|
|||
|
popup.location.assign(url2);
|
|||
|
else
|
|||
|
location.href = url2;
|
|||
|
popup = null;
|
|||
|
setTimeout(function() {
|
|||
|
URL.revokeObjectURL(url2);
|
|||
|
}, 4e4);
|
|||
|
}
|
|||
|
}
|
|||
|
function toastMessage(message, type) {
|
|||
|
const piniaMessage = "🍍 " + message;
|
|||
|
if (typeof __VUE_DEVTOOLS_TOAST__ === "function") {
|
|||
|
__VUE_DEVTOOLS_TOAST__(piniaMessage, type);
|
|||
|
} else if (type === "error") {
|
|||
|
console.error(piniaMessage);
|
|||
|
} else if (type === "warn") {
|
|||
|
console.warn(piniaMessage);
|
|||
|
} else {
|
|||
|
console.log(piniaMessage);
|
|||
|
}
|
|||
|
}
|
|||
|
function isPinia(o) {
|
|||
|
return "_a" in o && "install" in o;
|
|||
|
}
|
|||
|
function checkClipboardAccess() {
|
|||
|
if (!("clipboard" in navigator)) {
|
|||
|
toastMessage(`Your browser doesn't support the Clipboard API`, "error");
|
|||
|
return true;
|
|||
|
}
|
|||
|
}
|
|||
|
function checkNotFocusedError(error2) {
|
|||
|
if (error2 instanceof Error && error2.message.toLowerCase().includes("document is not focused")) {
|
|||
|
toastMessage('You need to activate the "Emulate a focused page" setting in the "Rendering" panel of devtools.', "warn");
|
|||
|
return true;
|
|||
|
}
|
|||
|
return false;
|
|||
|
}
|
|||
|
async function actionGlobalCopyState(pinia) {
|
|||
|
if (checkClipboardAccess())
|
|||
|
return;
|
|||
|
try {
|
|||
|
await navigator.clipboard.writeText(JSON.stringify(pinia.state.value));
|
|||
|
toastMessage("Global state copied to clipboard.");
|
|||
|
} catch (error2) {
|
|||
|
if (checkNotFocusedError(error2))
|
|||
|
return;
|
|||
|
toastMessage(`Failed to serialize the state. Check the console for more details.`, "error");
|
|||
|
console.error(error2);
|
|||
|
}
|
|||
|
}
|
|||
|
async function actionGlobalPasteState(pinia) {
|
|||
|
if (checkClipboardAccess())
|
|||
|
return;
|
|||
|
try {
|
|||
|
pinia.state.value = JSON.parse(await navigator.clipboard.readText());
|
|||
|
toastMessage("Global state pasted from clipboard.");
|
|||
|
} catch (error2) {
|
|||
|
if (checkNotFocusedError(error2))
|
|||
|
return;
|
|||
|
toastMessage(`Failed to deserialize the state from clipboard. Check the console for more details.`, "error");
|
|||
|
console.error(error2);
|
|||
|
}
|
|||
|
}
|
|||
|
async function actionGlobalSaveState(pinia) {
|
|||
|
try {
|
|||
|
saveAs(new Blob([JSON.stringify(pinia.state.value)], {
|
|||
|
type: "text/plain;charset=utf-8"
|
|||
|
}), "pinia-state.json");
|
|||
|
} catch (error2) {
|
|||
|
toastMessage(`Failed to export the state as JSON. Check the console for more details.`, "error");
|
|||
|
console.error(error2);
|
|||
|
}
|
|||
|
}
|
|||
|
let fileInput;
|
|||
|
function getFileOpener() {
|
|||
|
if (!fileInput) {
|
|||
|
fileInput = document.createElement("input");
|
|||
|
fileInput.type = "file";
|
|||
|
fileInput.accept = ".json";
|
|||
|
}
|
|||
|
function openFile() {
|
|||
|
return new Promise((resolve, reject) => {
|
|||
|
fileInput.onchange = async () => {
|
|||
|
const files = fileInput.files;
|
|||
|
if (!files)
|
|||
|
return resolve(null);
|
|||
|
const file = files.item(0);
|
|||
|
if (!file)
|
|||
|
return resolve(null);
|
|||
|
return resolve({ text: await file.text(), file });
|
|||
|
};
|
|||
|
fileInput.oncancel = () => resolve(null);
|
|||
|
fileInput.onerror = reject;
|
|||
|
fileInput.click();
|
|||
|
});
|
|||
|
}
|
|||
|
return openFile;
|
|||
|
}
|
|||
|
async function actionGlobalOpenStateFile(pinia) {
|
|||
|
try {
|
|||
|
const open2 = await getFileOpener();
|
|||
|
const result = await open2();
|
|||
|
if (!result)
|
|||
|
return;
|
|||
|
const { text, file } = result;
|
|||
|
pinia.state.value = JSON.parse(text);
|
|||
|
toastMessage(`Global state imported from "${file.name}".`);
|
|||
|
} catch (error2) {
|
|||
|
toastMessage(`Failed to export the state as JSON. Check the console for more details.`, "error");
|
|||
|
console.error(error2);
|
|||
|
}
|
|||
|
}
|
|||
|
function formatDisplay(display) {
|
|||
|
return {
|
|||
|
_custom: {
|
|||
|
display
|
|||
|
}
|
|||
|
};
|
|||
|
}
|
|||
|
const PINIA_ROOT_LABEL = "🍍 Pinia (root)";
|
|||
|
const PINIA_ROOT_ID = "_root";
|
|||
|
function formatStoreForInspectorTree(store) {
|
|||
|
return isPinia(store) ? {
|
|||
|
id: PINIA_ROOT_ID,
|
|||
|
label: PINIA_ROOT_LABEL
|
|||
|
} : {
|
|||
|
id: store.$id,
|
|||
|
label: store.$id
|
|||
|
};
|
|||
|
}
|
|||
|
function formatStoreForInspectorState(store) {
|
|||
|
if (isPinia(store)) {
|
|||
|
const storeNames = Array.from(store._s.keys());
|
|||
|
const storeMap = store._s;
|
|||
|
const state2 = {
|
|||
|
state: storeNames.map((storeId) => ({
|
|||
|
editable: true,
|
|||
|
key: storeId,
|
|||
|
value: store.state.value[storeId]
|
|||
|
})),
|
|||
|
getters: storeNames.filter((id) => storeMap.get(id)._getters).map((id) => {
|
|||
|
const store2 = storeMap.get(id);
|
|||
|
return {
|
|||
|
editable: false,
|
|||
|
key: id,
|
|||
|
value: store2._getters.reduce((getters, key) => {
|
|||
|
getters[key] = store2[key];
|
|||
|
return getters;
|
|||
|
}, {})
|
|||
|
};
|
|||
|
})
|
|||
|
};
|
|||
|
return state2;
|
|||
|
}
|
|||
|
const state = {
|
|||
|
state: Object.keys(store.$state).map((key) => ({
|
|||
|
editable: true,
|
|||
|
key,
|
|||
|
value: store.$state[key]
|
|||
|
}))
|
|||
|
};
|
|||
|
if (store._getters && store._getters.length) {
|
|||
|
state.getters = store._getters.map((getterName) => ({
|
|||
|
editable: false,
|
|||
|
key: getterName,
|
|||
|
value: store[getterName]
|
|||
|
}));
|
|||
|
}
|
|||
|
if (store._customProperties.size) {
|
|||
|
state.customProperties = Array.from(store._customProperties).map((key) => ({
|
|||
|
editable: true,
|
|||
|
key,
|
|||
|
value: store[key]
|
|||
|
}));
|
|||
|
}
|
|||
|
return state;
|
|||
|
}
|
|||
|
function formatEventData(events) {
|
|||
|
if (!events)
|
|||
|
return {};
|
|||
|
if (Array.isArray(events)) {
|
|||
|
return events.reduce((data, event) => {
|
|||
|
data.keys.push(event.key);
|
|||
|
data.operations.push(event.type);
|
|||
|
data.oldValue[event.key] = event.oldValue;
|
|||
|
data.newValue[event.key] = event.newValue;
|
|||
|
return data;
|
|||
|
}, {
|
|||
|
oldValue: {},
|
|||
|
keys: [],
|
|||
|
operations: [],
|
|||
|
newValue: {}
|
|||
|
});
|
|||
|
} else {
|
|||
|
return {
|
|||
|
operation: formatDisplay(events.type),
|
|||
|
key: formatDisplay(events.key),
|
|||
|
oldValue: events.oldValue,
|
|||
|
newValue: events.newValue
|
|||
|
};
|
|||
|
}
|
|||
|
}
|
|||
|
function formatMutationType(type) {
|
|||
|
switch (type) {
|
|||
|
case MutationType.direct:
|
|||
|
return "mutation";
|
|||
|
case MutationType.patchFunction:
|
|||
|
return "$patch";
|
|||
|
case MutationType.patchObject:
|
|||
|
return "$patch";
|
|||
|
default:
|
|||
|
return "unknown";
|
|||
|
}
|
|||
|
}
|
|||
|
let isTimelineActive = true;
|
|||
|
const componentStateTypes = [];
|
|||
|
const MUTATIONS_LAYER_ID = "pinia:mutations";
|
|||
|
const INSPECTOR_ID = "pinia";
|
|||
|
const { assign: assign$1 } = Object;
|
|||
|
const getStoreType = (id) => "🍍 " + id;
|
|||
|
function registerPiniaDevtools(app, pinia) {
|
|||
|
setupDevtoolsPlugin({
|
|||
|
id: "dev.esm.pinia",
|
|||
|
label: "Pinia 🍍",
|
|||
|
logo: "https://pinia.vuejs.org/logo.svg",
|
|||
|
packageName: "pinia",
|
|||
|
homepage: "https://pinia.vuejs.org",
|
|||
|
componentStateTypes,
|
|||
|
app
|
|||
|
}, (api) => {
|
|||
|
if (typeof api.now !== "function") {
|
|||
|
toastMessage("You seem to be using an outdated version of Vue Devtools. Are you still using the Beta release instead of the stable one? You can find the links at https://devtools.vuejs.org/guide/installation.html.");
|
|||
|
}
|
|||
|
api.addTimelineLayer({
|
|||
|
id: MUTATIONS_LAYER_ID,
|
|||
|
label: `Pinia 🍍`,
|
|||
|
color: 15064968
|
|||
|
});
|
|||
|
api.addInspector({
|
|||
|
id: INSPECTOR_ID,
|
|||
|
label: "Pinia 🍍",
|
|||
|
icon: "storage",
|
|||
|
treeFilterPlaceholder: "Search stores",
|
|||
|
actions: [
|
|||
|
{
|
|||
|
icon: "content_copy",
|
|||
|
action: () => {
|
|||
|
actionGlobalCopyState(pinia);
|
|||
|
},
|
|||
|
tooltip: "Serialize and copy the state"
|
|||
|
},
|
|||
|
{
|
|||
|
icon: "content_paste",
|
|||
|
action: async () => {
|
|||
|
await actionGlobalPasteState(pinia);
|
|||
|
api.sendInspectorTree(INSPECTOR_ID);
|
|||
|
api.sendInspectorState(INSPECTOR_ID);
|
|||
|
},
|
|||
|
tooltip: "Replace the state with the content of your clipboard"
|
|||
|
},
|
|||
|
{
|
|||
|
icon: "save",
|
|||
|
action: () => {
|
|||
|
actionGlobalSaveState(pinia);
|
|||
|
},
|
|||
|
tooltip: "Save the state as a JSON file"
|
|||
|
},
|
|||
|
{
|
|||
|
icon: "folder_open",
|
|||
|
action: async () => {
|
|||
|
await actionGlobalOpenStateFile(pinia);
|
|||
|
api.sendInspectorTree(INSPECTOR_ID);
|
|||
|
api.sendInspectorState(INSPECTOR_ID);
|
|||
|
},
|
|||
|
tooltip: "Import the state from a JSON file"
|
|||
|
}
|
|||
|
],
|
|||
|
nodeActions: [
|
|||
|
{
|
|||
|
icon: "restore",
|
|||
|
tooltip: "Reset the state (option store only)",
|
|||
|
action: (nodeId) => {
|
|||
|
const store = pinia._s.get(nodeId);
|
|||
|
if (!store) {
|
|||
|
toastMessage(`Cannot reset "${nodeId}" store because it wasn't found.`, "warn");
|
|||
|
} else if (!store._isOptionsAPI) {
|
|||
|
toastMessage(`Cannot reset "${nodeId}" store because it's a setup store.`, "warn");
|
|||
|
} else {
|
|||
|
store.$reset();
|
|||
|
toastMessage(`Store "${nodeId}" reset.`);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
]
|
|||
|
});
|
|||
|
api.on.inspectComponent((payload, ctx) => {
|
|||
|
const proxy = payload.componentInstance && payload.componentInstance.proxy;
|
|||
|
if (proxy && proxy._pStores) {
|
|||
|
const piniaStores = payload.componentInstance.proxy._pStores;
|
|||
|
Object.values(piniaStores).forEach((store) => {
|
|||
|
payload.instanceData.state.push({
|
|||
|
type: getStoreType(store.$id),
|
|||
|
key: "state",
|
|||
|
editable: true,
|
|||
|
value: store._isOptionsAPI ? {
|
|||
|
_custom: {
|
|||
|
value: vue.toRaw(store.$state),
|
|||
|
actions: [
|
|||
|
{
|
|||
|
icon: "restore",
|
|||
|
tooltip: "Reset the state of this store",
|
|||
|
action: () => store.$reset()
|
|||
|
}
|
|||
|
]
|
|||
|
}
|
|||
|
} : (
|
|||
|
// NOTE: workaround to unwrap transferred refs
|
|||
|
Object.keys(store.$state).reduce((state, key) => {
|
|||
|
state[key] = store.$state[key];
|
|||
|
return state;
|
|||
|
}, {})
|
|||
|
)
|
|||
|
});
|
|||
|
if (store._getters && store._getters.length) {
|
|||
|
payload.instanceData.state.push({
|
|||
|
type: getStoreType(store.$id),
|
|||
|
key: "getters",
|
|||
|
editable: false,
|
|||
|
value: store._getters.reduce((getters, key) => {
|
|||
|
try {
|
|||
|
getters[key] = store[key];
|
|||
|
} catch (error2) {
|
|||
|
getters[key] = error2;
|
|||
|
}
|
|||
|
return getters;
|
|||
|
}, {})
|
|||
|
});
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
});
|
|||
|
api.on.getInspectorTree((payload) => {
|
|||
|
if (payload.app === app && payload.inspectorId === INSPECTOR_ID) {
|
|||
|
let stores = [pinia];
|
|||
|
stores = stores.concat(Array.from(pinia._s.values()));
|
|||
|
payload.rootNodes = (payload.filter ? stores.filter((store) => "$id" in store ? store.$id.toLowerCase().includes(payload.filter.toLowerCase()) : PINIA_ROOT_LABEL.toLowerCase().includes(payload.filter.toLowerCase())) : stores).map(formatStoreForInspectorTree);
|
|||
|
}
|
|||
|
});
|
|||
|
api.on.getInspectorState((payload) => {
|
|||
|
if (payload.app === app && payload.inspectorId === INSPECTOR_ID) {
|
|||
|
const inspectedStore = payload.nodeId === PINIA_ROOT_ID ? pinia : pinia._s.get(payload.nodeId);
|
|||
|
if (!inspectedStore) {
|
|||
|
return;
|
|||
|
}
|
|||
|
if (inspectedStore) {
|
|||
|
payload.state = formatStoreForInspectorState(inspectedStore);
|
|||
|
}
|
|||
|
}
|
|||
|
});
|
|||
|
api.on.editInspectorState((payload, ctx) => {
|
|||
|
if (payload.app === app && payload.inspectorId === INSPECTOR_ID) {
|
|||
|
const inspectedStore = payload.nodeId === PINIA_ROOT_ID ? pinia : pinia._s.get(payload.nodeId);
|
|||
|
if (!inspectedStore) {
|
|||
|
return toastMessage(`store "${payload.nodeId}" not found`, "error");
|
|||
|
}
|
|||
|
const { path } = payload;
|
|||
|
if (!isPinia(inspectedStore)) {
|
|||
|
if (path.length !== 1 || !inspectedStore._customProperties.has(path[0]) || path[0] in inspectedStore.$state) {
|
|||
|
path.unshift("$state");
|
|||
|
}
|
|||
|
} else {
|
|||
|
path.unshift("state");
|
|||
|
}
|
|||
|
isTimelineActive = false;
|
|||
|
payload.set(inspectedStore, path, payload.state.value);
|
|||
|
isTimelineActive = true;
|
|||
|
}
|
|||
|
});
|
|||
|
api.on.editComponentState((payload) => {
|
|||
|
if (payload.type.startsWith("🍍")) {
|
|||
|
const storeId = payload.type.replace(/^🍍\s*/, "");
|
|||
|
const store = pinia._s.get(storeId);
|
|||
|
if (!store) {
|
|||
|
return toastMessage(`store "${storeId}" not found`, "error");
|
|||
|
}
|
|||
|
const { path } = payload;
|
|||
|
if (path[0] !== "state") {
|
|||
|
return toastMessage(`Invalid path for store "${storeId}":
|
|||
|
${path}
|
|||
|
Only state can be modified.`);
|
|||
|
}
|
|||
|
path[0] = "$state";
|
|||
|
isTimelineActive = false;
|
|||
|
payload.set(store, path, payload.state.value);
|
|||
|
isTimelineActive = true;
|
|||
|
}
|
|||
|
});
|
|||
|
});
|
|||
|
}
|
|||
|
function addStoreToDevtools(app, store) {
|
|||
|
if (!componentStateTypes.includes(getStoreType(store.$id))) {
|
|||
|
componentStateTypes.push(getStoreType(store.$id));
|
|||
|
}
|
|||
|
setupDevtoolsPlugin({
|
|||
|
id: "dev.esm.pinia",
|
|||
|
label: "Pinia 🍍",
|
|||
|
logo: "https://pinia.vuejs.org/logo.svg",
|
|||
|
packageName: "pinia",
|
|||
|
homepage: "https://pinia.vuejs.org",
|
|||
|
componentStateTypes,
|
|||
|
app,
|
|||
|
settings: {
|
|||
|
logStoreChanges: {
|
|||
|
label: "Notify about new/deleted stores",
|
|||
|
type: "boolean",
|
|||
|
defaultValue: true
|
|||
|
}
|
|||
|
// useEmojis: {
|
|||
|
// label: 'Use emojis in messages ⚡️',
|
|||
|
// type: 'boolean',
|
|||
|
// defaultValue: true,
|
|||
|
// },
|
|||
|
}
|
|||
|
}, (api) => {
|
|||
|
const now2 = typeof api.now === "function" ? api.now.bind(api) : Date.now;
|
|||
|
store.$onAction(({ after, onError, name, args }) => {
|
|||
|
const groupId = runningActionId++;
|
|||
|
api.addTimelineEvent({
|
|||
|
layerId: MUTATIONS_LAYER_ID,
|
|||
|
event: {
|
|||
|
time: now2(),
|
|||
|
title: "🛫 " + name,
|
|||
|
subtitle: "start",
|
|||
|
data: {
|
|||
|
store: formatDisplay(store.$id),
|
|||
|
action: formatDisplay(name),
|
|||
|
args
|
|||
|
},
|
|||
|
groupId
|
|||
|
}
|
|||
|
});
|
|||
|
after((result) => {
|
|||
|
activeAction = void 0;
|
|||
|
api.addTimelineEvent({
|
|||
|
layerId: MUTATIONS_LAYER_ID,
|
|||
|
event: {
|
|||
|
time: now2(),
|
|||
|
title: "🛬 " + name,
|
|||
|
subtitle: "end",
|
|||
|
data: {
|
|||
|
store: formatDisplay(store.$id),
|
|||
|
action: formatDisplay(name),
|
|||
|
args,
|
|||
|
result
|
|||
|
},
|
|||
|
groupId
|
|||
|
}
|
|||
|
});
|
|||
|
});
|
|||
|
onError((error2) => {
|
|||
|
activeAction = void 0;
|
|||
|
api.addTimelineEvent({
|
|||
|
layerId: MUTATIONS_LAYER_ID,
|
|||
|
event: {
|
|||
|
time: now2(),
|
|||
|
logType: "error",
|
|||
|
title: "💥 " + name,
|
|||
|
subtitle: "end",
|
|||
|
data: {
|
|||
|
store: formatDisplay(store.$id),
|
|||
|
action: formatDisplay(name),
|
|||
|
args,
|
|||
|
error: error2
|
|||
|
},
|
|||
|
groupId
|
|||
|
}
|
|||
|
});
|
|||
|
});
|
|||
|
}, true);
|
|||
|
store._customProperties.forEach((name) => {
|
|||
|
vue.watch(() => vue.unref(store[name]), (newValue, oldValue) => {
|
|||
|
api.notifyComponentUpdate();
|
|||
|
api.sendInspectorState(INSPECTOR_ID);
|
|||
|
if (isTimelineActive) {
|
|||
|
api.addTimelineEvent({
|
|||
|
layerId: MUTATIONS_LAYER_ID,
|
|||
|
event: {
|
|||
|
time: now2(),
|
|||
|
title: "Change",
|
|||
|
subtitle: name,
|
|||
|
data: {
|
|||
|
newValue,
|
|||
|
oldValue
|
|||
|
},
|
|||
|
groupId: activeAction
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
}, { deep: true });
|
|||
|
});
|
|||
|
store.$subscribe(({ events, type }, state) => {
|
|||
|
api.notifyComponentUpdate();
|
|||
|
api.sendInspectorState(INSPECTOR_ID);
|
|||
|
if (!isTimelineActive)
|
|||
|
return;
|
|||
|
const eventData = {
|
|||
|
time: now2(),
|
|||
|
title: formatMutationType(type),
|
|||
|
data: assign$1({ store: formatDisplay(store.$id) }, formatEventData(events)),
|
|||
|
groupId: activeAction
|
|||
|
};
|
|||
|
activeAction = void 0;
|
|||
|
if (type === MutationType.patchFunction) {
|
|||
|
eventData.subtitle = "⤵️";
|
|||
|
} else if (type === MutationType.patchObject) {
|
|||
|
eventData.subtitle = "🧩";
|
|||
|
} else if (events && !Array.isArray(events)) {
|
|||
|
eventData.subtitle = events.type;
|
|||
|
}
|
|||
|
if (events) {
|
|||
|
eventData.data["rawEvent(s)"] = {
|
|||
|
_custom: {
|
|||
|
display: "DebuggerEvent",
|
|||
|
type: "object",
|
|||
|
tooltip: "raw DebuggerEvent[]",
|
|||
|
value: events
|
|||
|
}
|
|||
|
};
|
|||
|
}
|
|||
|
api.addTimelineEvent({
|
|||
|
layerId: MUTATIONS_LAYER_ID,
|
|||
|
event: eventData
|
|||
|
});
|
|||
|
}, { detached: true, flush: "sync" });
|
|||
|
const hotUpdate = store._hotUpdate;
|
|||
|
store._hotUpdate = vue.markRaw((newStore) => {
|
|||
|
hotUpdate(newStore);
|
|||
|
api.addTimelineEvent({
|
|||
|
layerId: MUTATIONS_LAYER_ID,
|
|||
|
event: {
|
|||
|
time: now2(),
|
|||
|
title: "🔥 " + store.$id,
|
|||
|
subtitle: "HMR update",
|
|||
|
data: {
|
|||
|
store: formatDisplay(store.$id),
|
|||
|
info: formatDisplay(`HMR update`)
|
|||
|
}
|
|||
|
}
|
|||
|
});
|
|||
|
api.notifyComponentUpdate();
|
|||
|
api.sendInspectorTree(INSPECTOR_ID);
|
|||
|
api.sendInspectorState(INSPECTOR_ID);
|
|||
|
});
|
|||
|
const { $dispose } = store;
|
|||
|
store.$dispose = () => {
|
|||
|
$dispose();
|
|||
|
api.notifyComponentUpdate();
|
|||
|
api.sendInspectorTree(INSPECTOR_ID);
|
|||
|
api.sendInspectorState(INSPECTOR_ID);
|
|||
|
api.getSettings().logStoreChanges && toastMessage(`Disposed "${store.$id}" store 🗑`);
|
|||
|
};
|
|||
|
api.notifyComponentUpdate();
|
|||
|
api.sendInspectorTree(INSPECTOR_ID);
|
|||
|
api.sendInspectorState(INSPECTOR_ID);
|
|||
|
api.getSettings().logStoreChanges && toastMessage(`"${store.$id}" store installed 🆕`);
|
|||
|
});
|
|||
|
}
|
|||
|
let runningActionId = 0;
|
|||
|
let activeAction;
|
|||
|
function patchActionForGrouping(store, actionNames) {
|
|||
|
const actions = actionNames.reduce((storeActions, actionName) => {
|
|||
|
storeActions[actionName] = vue.toRaw(store)[actionName];
|
|||
|
return storeActions;
|
|||
|
}, {});
|
|||
|
for (const actionName in actions) {
|
|||
|
store[actionName] = function() {
|
|||
|
const _actionId = runningActionId;
|
|||
|
const trackedStore = new Proxy(store, {
|
|||
|
get(...args) {
|
|||
|
activeAction = _actionId;
|
|||
|
return Reflect.get(...args);
|
|||
|
},
|
|||
|
set(...args) {
|
|||
|
activeAction = _actionId;
|
|||
|
return Reflect.set(...args);
|
|||
|
}
|
|||
|
});
|
|||
|
return actions[actionName].apply(trackedStore, arguments);
|
|||
|
};
|
|||
|
}
|
|||
|
}
|
|||
|
function devtoolsPlugin({ app, store, options }) {
|
|||
|
if (store.$id.startsWith("__hot:")) {
|
|||
|
return;
|
|||
|
}
|
|||
|
if (options.state) {
|
|||
|
store._isOptionsAPI = true;
|
|||
|
}
|
|||
|
if (typeof options.state === "function") {
|
|||
|
patchActionForGrouping(
|
|||
|
// @ts-expect-error: can cast the store...
|
|||
|
store,
|
|||
|
Object.keys(options.actions)
|
|||
|
);
|
|||
|
const originalHotUpdate = store._hotUpdate;
|
|||
|
vue.toRaw(store)._hotUpdate = function(newStore) {
|
|||
|
originalHotUpdate.apply(this, arguments);
|
|||
|
patchActionForGrouping(store, Object.keys(newStore._hmrPayload.actions));
|
|||
|
};
|
|||
|
}
|
|||
|
addStoreToDevtools(
|
|||
|
app,
|
|||
|
// FIXME: is there a way to allow the assignment from Store<Id, S, G, A> to StoreGeneric?
|
|||
|
store
|
|||
|
);
|
|||
|
}
|
|||
|
function createPinia() {
|
|||
|
const scope = vue.effectScope(true);
|
|||
|
const state = scope.run(() => vue.ref({}));
|
|||
|
let _p = [];
|
|||
|
let toBeInstalled = [];
|
|||
|
const pinia = vue.markRaw({
|
|||
|
install(app) {
|
|||
|
setActivePinia(pinia);
|
|||
|
{
|
|||
|
pinia._a = app;
|
|||
|
app.provide(piniaSymbol, pinia);
|
|||
|
app.config.globalProperties.$pinia = pinia;
|
|||
|
if (USE_DEVTOOLS) {
|
|||
|
registerPiniaDevtools(app, pinia);
|
|||
|
}
|
|||
|
toBeInstalled.forEach((plugin) => _p.push(plugin));
|
|||
|
toBeInstalled = [];
|
|||
|
}
|
|||
|
},
|
|||
|
use(plugin) {
|
|||
|
if (!this._a && !isVue2) {
|
|||
|
toBeInstalled.push(plugin);
|
|||
|
} else {
|
|||
|
_p.push(plugin);
|
|||
|
}
|
|||
|
return this;
|
|||
|
},
|
|||
|
_p,
|
|||
|
// it's actually undefined here
|
|||
|
// @ts-expect-error
|
|||
|
_a: null,
|
|||
|
_e: scope,
|
|||
|
_s: /* @__PURE__ */ new Map(),
|
|||
|
state
|
|||
|
});
|
|||
|
if (USE_DEVTOOLS && typeof Proxy !== "undefined") {
|
|||
|
pinia.use(devtoolsPlugin);
|
|||
|
}
|
|||
|
return pinia;
|
|||
|
}
|
|||
|
function patchObject(newState, oldState) {
|
|||
|
for (const key in oldState) {
|
|||
|
const subPatch = oldState[key];
|
|||
|
if (!(key in newState)) {
|
|||
|
continue;
|
|||
|
}
|
|||
|
const targetValue = newState[key];
|
|||
|
if (isPlainObject$1(targetValue) && isPlainObject$1(subPatch) && !vue.isRef(subPatch) && !vue.isReactive(subPatch)) {
|
|||
|
newState[key] = patchObject(targetValue, subPatch);
|
|||
|
} else {
|
|||
|
{
|
|||
|
newState[key] = subPatch;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
return newState;
|
|||
|
}
|
|||
|
const noop = () => {
|
|||
|
};
|
|||
|
function addSubscription(subscriptions, callback, detached, onCleanup = noop) {
|
|||
|
subscriptions.push(callback);
|
|||
|
const removeSubscription = () => {
|
|||
|
const idx = subscriptions.indexOf(callback);
|
|||
|
if (idx > -1) {
|
|||
|
subscriptions.splice(idx, 1);
|
|||
|
onCleanup();
|
|||
|
}
|
|||
|
};
|
|||
|
if (!detached && vue.getCurrentScope()) {
|
|||
|
vue.onScopeDispose(removeSubscription);
|
|||
|
}
|
|||
|
return removeSubscription;
|
|||
|
}
|
|||
|
function triggerSubscriptions(subscriptions, ...args) {
|
|||
|
subscriptions.slice().forEach((callback) => {
|
|||
|
callback(...args);
|
|||
|
});
|
|||
|
}
|
|||
|
function mergeReactiveObjects(target, patchToApply) {
|
|||
|
if (target instanceof Map && patchToApply instanceof Map) {
|
|||
|
patchToApply.forEach((value, key) => target.set(key, value));
|
|||
|
}
|
|||
|
if (target instanceof Set && patchToApply instanceof Set) {
|
|||
|
patchToApply.forEach(target.add, target);
|
|||
|
}
|
|||
|
for (const key in patchToApply) {
|
|||
|
if (!patchToApply.hasOwnProperty(key))
|
|||
|
continue;
|
|||
|
const subPatch = patchToApply[key];
|
|||
|
const targetValue = target[key];
|
|||
|
if (isPlainObject$1(targetValue) && isPlainObject$1(subPatch) && target.hasOwnProperty(key) && !vue.isRef(subPatch) && !vue.isReactive(subPatch)) {
|
|||
|
target[key] = mergeReactiveObjects(targetValue, subPatch);
|
|||
|
} else {
|
|||
|
target[key] = subPatch;
|
|||
|
}
|
|||
|
}
|
|||
|
return target;
|
|||
|
}
|
|||
|
const skipHydrateSymbol = Symbol("pinia:skipHydration");
|
|||
|
function shouldHydrate(obj) {
|
|||
|
return !isPlainObject$1(obj) || !obj.hasOwnProperty(skipHydrateSymbol);
|
|||
|
}
|
|||
|
const { assign } = Object;
|
|||
|
function isComputed(o) {
|
|||
|
return !!(vue.isRef(o) && o.effect);
|
|||
|
}
|
|||
|
function createOptionsStore(id, options, pinia, hot) {
|
|||
|
const { state, actions, getters } = options;
|
|||
|
const initialState = pinia.state.value[id];
|
|||
|
let store;
|
|||
|
function setup() {
|
|||
|
if (!initialState && !hot) {
|
|||
|
{
|
|||
|
pinia.state.value[id] = state ? state() : {};
|
|||
|
}
|
|||
|
}
|
|||
|
const localState = hot ? (
|
|||
|
// use ref() to unwrap refs inside state TODO: check if this is still necessary
|
|||
|
vue.toRefs(vue.ref(state ? state() : {}).value)
|
|||
|
) : vue.toRefs(pinia.state.value[id]);
|
|||
|
return assign(localState, actions, Object.keys(getters || {}).reduce((computedGetters, name) => {
|
|||
|
if (name in localState) {
|
|||
|
console.warn(`[🍍]: A getter cannot have the same name as another state property. Rename one of them. Found with "${name}" in store "${id}".`);
|
|||
|
}
|
|||
|
computedGetters[name] = vue.markRaw(vue.computed(() => {
|
|||
|
setActivePinia(pinia);
|
|||
|
const store2 = pinia._s.get(id);
|
|||
|
return getters[name].call(store2, store2);
|
|||
|
}));
|
|||
|
return computedGetters;
|
|||
|
}, {}));
|
|||
|
}
|
|||
|
store = createSetupStore(id, setup, options, pinia, hot, true);
|
|||
|
return store;
|
|||
|
}
|
|||
|
function createSetupStore($id, setup, options = {}, pinia, hot, isOptionsStore) {
|
|||
|
let scope;
|
|||
|
const optionsForPlugin = assign({ actions: {} }, options);
|
|||
|
if (!pinia._e.active) {
|
|||
|
throw new Error("Pinia destroyed");
|
|||
|
}
|
|||
|
const $subscribeOptions = {
|
|||
|
deep: true
|
|||
|
// flush: 'post',
|
|||
|
};
|
|||
|
{
|
|||
|
$subscribeOptions.onTrigger = (event) => {
|
|||
|
if (isListening) {
|
|||
|
debuggerEvents = event;
|
|||
|
} else if (isListening == false && !store._hotUpdating) {
|
|||
|
if (Array.isArray(debuggerEvents)) {
|
|||
|
debuggerEvents.push(event);
|
|||
|
} else {
|
|||
|
console.error("🍍 debuggerEvents should be an array. This is most likely an internal Pinia bug.");
|
|||
|
}
|
|||
|
}
|
|||
|
};
|
|||
|
}
|
|||
|
let isListening;
|
|||
|
let isSyncListening;
|
|||
|
let subscriptions = vue.markRaw([]);
|
|||
|
let actionSubscriptions = vue.markRaw([]);
|
|||
|
let debuggerEvents;
|
|||
|
const initialState = pinia.state.value[$id];
|
|||
|
if (!isOptionsStore && !initialState && !hot) {
|
|||
|
{
|
|||
|
pinia.state.value[$id] = {};
|
|||
|
}
|
|||
|
}
|
|||
|
const hotState = vue.ref({});
|
|||
|
let activeListener;
|
|||
|
function $patch(partialStateOrMutator) {
|
|||
|
let subscriptionMutation;
|
|||
|
isListening = isSyncListening = false;
|
|||
|
{
|
|||
|
debuggerEvents = [];
|
|||
|
}
|
|||
|
if (typeof partialStateOrMutator === "function") {
|
|||
|
partialStateOrMutator(pinia.state.value[$id]);
|
|||
|
subscriptionMutation = {
|
|||
|
type: MutationType.patchFunction,
|
|||
|
storeId: $id,
|
|||
|
events: debuggerEvents
|
|||
|
};
|
|||
|
} else {
|
|||
|
mergeReactiveObjects(pinia.state.value[$id], partialStateOrMutator);
|
|||
|
subscriptionMutation = {
|
|||
|
type: MutationType.patchObject,
|
|||
|
payload: partialStateOrMutator,
|
|||
|
storeId: $id,
|
|||
|
events: debuggerEvents
|
|||
|
};
|
|||
|
}
|
|||
|
const myListenerId = activeListener = Symbol();
|
|||
|
vue.nextTick().then(() => {
|
|||
|
if (activeListener === myListenerId) {
|
|||
|
isListening = true;
|
|||
|
}
|
|||
|
});
|
|||
|
isSyncListening = true;
|
|||
|
triggerSubscriptions(subscriptions, subscriptionMutation, pinia.state.value[$id]);
|
|||
|
}
|
|||
|
const $reset = isOptionsStore ? function $reset2() {
|
|||
|
const { state } = options;
|
|||
|
const newState = state ? state() : {};
|
|||
|
this.$patch(($state) => {
|
|||
|
assign($state, newState);
|
|||
|
});
|
|||
|
} : (
|
|||
|
/* istanbul ignore next */
|
|||
|
() => {
|
|||
|
throw new Error(`🍍: Store "${$id}" is built using the setup syntax and does not implement $reset().`);
|
|||
|
}
|
|||
|
);
|
|||
|
function $dispose() {
|
|||
|
scope.stop();
|
|||
|
subscriptions = [];
|
|||
|
actionSubscriptions = [];
|
|||
|
pinia._s.delete($id);
|
|||
|
}
|
|||
|
function wrapAction(name, action) {
|
|||
|
return function() {
|
|||
|
setActivePinia(pinia);
|
|||
|
const args = Array.from(arguments);
|
|||
|
const afterCallbackList = [];
|
|||
|
const onErrorCallbackList = [];
|
|||
|
function after(callback) {
|
|||
|
afterCallbackList.push(callback);
|
|||
|
}
|
|||
|
function onError(callback) {
|
|||
|
onErrorCallbackList.push(callback);
|
|||
|
}
|
|||
|
triggerSubscriptions(actionSubscriptions, {
|
|||
|
args,
|
|||
|
name,
|
|||
|
store,
|
|||
|
after,
|
|||
|
onError
|
|||
|
});
|
|||
|
let ret;
|
|||
|
try {
|
|||
|
ret = action.apply(this && this.$id === $id ? this : store, args);
|
|||
|
} catch (error2) {
|
|||
|
triggerSubscriptions(onErrorCallbackList, error2);
|
|||
|
throw error2;
|
|||
|
}
|
|||
|
if (ret instanceof Promise) {
|
|||
|
return ret.then((value) => {
|
|||
|
triggerSubscriptions(afterCallbackList, value);
|
|||
|
return value;
|
|||
|
}).catch((error2) => {
|
|||
|
triggerSubscriptions(onErrorCallbackList, error2);
|
|||
|
return Promise.reject(error2);
|
|||
|
});
|
|||
|
}
|
|||
|
triggerSubscriptions(afterCallbackList, ret);
|
|||
|
return ret;
|
|||
|
};
|
|||
|
}
|
|||
|
const _hmrPayload = /* @__PURE__ */ vue.markRaw({
|
|||
|
actions: {},
|
|||
|
getters: {},
|
|||
|
state: [],
|
|||
|
hotState
|
|||
|
});
|
|||
|
const partialStore = {
|
|||
|
_p: pinia,
|
|||
|
// _s: scope,
|
|||
|
$id,
|
|||
|
$onAction: addSubscription.bind(null, actionSubscriptions),
|
|||
|
$patch,
|
|||
|
$reset,
|
|||
|
$subscribe(callback, options2 = {}) {
|
|||
|
const removeSubscription = addSubscription(subscriptions, callback, options2.detached, () => stopWatcher());
|
|||
|
const stopWatcher = scope.run(() => vue.watch(() => pinia.state.value[$id], (state) => {
|
|||
|
if (options2.flush === "sync" ? isSyncListening : isListening) {
|
|||
|
callback({
|
|||
|
storeId: $id,
|
|||
|
type: MutationType.direct,
|
|||
|
events: debuggerEvents
|
|||
|
}, state);
|
|||
|
}
|
|||
|
}, assign({}, $subscribeOptions, options2)));
|
|||
|
return removeSubscription;
|
|||
|
},
|
|||
|
$dispose
|
|||
|
};
|
|||
|
const store = vue.reactive(
|
|||
|
assign(
|
|||
|
{
|
|||
|
_hmrPayload,
|
|||
|
_customProperties: vue.markRaw(/* @__PURE__ */ new Set())
|
|||
|
// devtools custom properties
|
|||
|
},
|
|||
|
partialStore
|
|||
|
// must be added later
|
|||
|
// setupStore
|
|||
|
)
|
|||
|
);
|
|||
|
pinia._s.set($id, store);
|
|||
|
const setupStore = pinia._e.run(() => {
|
|||
|
scope = vue.effectScope();
|
|||
|
return scope.run(() => setup());
|
|||
|
});
|
|||
|
for (const key in setupStore) {
|
|||
|
const prop = setupStore[key];
|
|||
|
if (vue.isRef(prop) && !isComputed(prop) || vue.isReactive(prop)) {
|
|||
|
if (hot) {
|
|||
|
set(hotState.value, key, vue.toRef(setupStore, key));
|
|||
|
} else if (!isOptionsStore) {
|
|||
|
if (initialState && shouldHydrate(prop)) {
|
|||
|
if (vue.isRef(prop)) {
|
|||
|
prop.value = initialState[key];
|
|||
|
} else {
|
|||
|
mergeReactiveObjects(prop, initialState[key]);
|
|||
|
}
|
|||
|
}
|
|||
|
{
|
|||
|
pinia.state.value[$id][key] = prop;
|
|||
|
}
|
|||
|
}
|
|||
|
{
|
|||
|
_hmrPayload.state.push(key);
|
|||
|
}
|
|||
|
} else if (typeof prop === "function") {
|
|||
|
const actionValue = hot ? prop : wrapAction(key, prop);
|
|||
|
{
|
|||
|
setupStore[key] = actionValue;
|
|||
|
}
|
|||
|
{
|
|||
|
_hmrPayload.actions[key] = prop;
|
|||
|
}
|
|||
|
optionsForPlugin.actions[key] = prop;
|
|||
|
} else {
|
|||
|
if (isComputed(prop)) {
|
|||
|
_hmrPayload.getters[key] = isOptionsStore ? (
|
|||
|
// @ts-expect-error
|
|||
|
options.getters[key]
|
|||
|
) : prop;
|
|||
|
if (IS_CLIENT) {
|
|||
|
const getters = setupStore._getters || // @ts-expect-error: same
|
|||
|
(setupStore._getters = vue.markRaw([]));
|
|||
|
getters.push(key);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
{
|
|||
|
assign(store, setupStore);
|
|||
|
assign(vue.toRaw(store), setupStore);
|
|||
|
}
|
|||
|
Object.defineProperty(store, "$state", {
|
|||
|
get: () => hot ? hotState.value : pinia.state.value[$id],
|
|||
|
set: (state) => {
|
|||
|
if (hot) {
|
|||
|
throw new Error("cannot set hotState");
|
|||
|
}
|
|||
|
$patch(($state) => {
|
|||
|
assign($state, state);
|
|||
|
});
|
|||
|
}
|
|||
|
});
|
|||
|
{
|
|||
|
store._hotUpdate = vue.markRaw((newStore) => {
|
|||
|
store._hotUpdating = true;
|
|||
|
newStore._hmrPayload.state.forEach((stateKey) => {
|
|||
|
if (stateKey in store.$state) {
|
|||
|
const newStateTarget = newStore.$state[stateKey];
|
|||
|
const oldStateSource = store.$state[stateKey];
|
|||
|
if (typeof newStateTarget === "object" && isPlainObject$1(newStateTarget) && isPlainObject$1(oldStateSource)) {
|
|||
|
patchObject(newStateTarget, oldStateSource);
|
|||
|
} else {
|
|||
|
newStore.$state[stateKey] = oldStateSource;
|
|||
|
}
|
|||
|
}
|
|||
|
set(store, stateKey, vue.toRef(newStore.$state, stateKey));
|
|||
|
});
|
|||
|
Object.keys(store.$state).forEach((stateKey) => {
|
|||
|
if (!(stateKey in newStore.$state)) {
|
|||
|
del(store, stateKey);
|
|||
|
}
|
|||
|
});
|
|||
|
isListening = false;
|
|||
|
isSyncListening = false;
|
|||
|
pinia.state.value[$id] = vue.toRef(newStore._hmrPayload, "hotState");
|
|||
|
isSyncListening = true;
|
|||
|
vue.nextTick().then(() => {
|
|||
|
isListening = true;
|
|||
|
});
|
|||
|
for (const actionName in newStore._hmrPayload.actions) {
|
|||
|
const action = newStore[actionName];
|
|||
|
set(store, actionName, wrapAction(actionName, action));
|
|||
|
}
|
|||
|
for (const getterName in newStore._hmrPayload.getters) {
|
|||
|
const getter = newStore._hmrPayload.getters[getterName];
|
|||
|
const getterValue = isOptionsStore ? (
|
|||
|
// special handling of options api
|
|||
|
vue.computed(() => {
|
|||
|
setActivePinia(pinia);
|
|||
|
return getter.call(store, store);
|
|||
|
})
|
|||
|
) : getter;
|
|||
|
set(store, getterName, getterValue);
|
|||
|
}
|
|||
|
Object.keys(store._hmrPayload.getters).forEach((key) => {
|
|||
|
if (!(key in newStore._hmrPayload.getters)) {
|
|||
|
del(store, key);
|
|||
|
}
|
|||
|
});
|
|||
|
Object.keys(store._hmrPayload.actions).forEach((key) => {
|
|||
|
if (!(key in newStore._hmrPayload.actions)) {
|
|||
|
del(store, key);
|
|||
|
}
|
|||
|
});
|
|||
|
store._hmrPayload = newStore._hmrPayload;
|
|||
|
store._getters = newStore._getters;
|
|||
|
store._hotUpdating = false;
|
|||
|
});
|
|||
|
}
|
|||
|
if (USE_DEVTOOLS) {
|
|||
|
const nonEnumerable = {
|
|||
|
writable: true,
|
|||
|
configurable: true,
|
|||
|
// avoid warning on devtools trying to display this property
|
|||
|
enumerable: false
|
|||
|
};
|
|||
|
["_p", "_hmrPayload", "_getters", "_customProperties"].forEach((p) => {
|
|||
|
Object.defineProperty(store, p, assign({ value: store[p] }, nonEnumerable));
|
|||
|
});
|
|||
|
}
|
|||
|
pinia._p.forEach((extender) => {
|
|||
|
if (USE_DEVTOOLS) {
|
|||
|
const extensions = scope.run(() => extender({
|
|||
|
store,
|
|||
|
app: pinia._a,
|
|||
|
pinia,
|
|||
|
options: optionsForPlugin
|
|||
|
}));
|
|||
|
Object.keys(extensions || {}).forEach((key) => store._customProperties.add(key));
|
|||
|
assign(store, extensions);
|
|||
|
} else {
|
|||
|
assign(store, scope.run(() => extender({
|
|||
|
store,
|
|||
|
app: pinia._a,
|
|||
|
pinia,
|
|||
|
options: optionsForPlugin
|
|||
|
})));
|
|||
|
}
|
|||
|
});
|
|||
|
if (store.$state && typeof store.$state === "object" && typeof store.$state.constructor === "function" && !store.$state.constructor.toString().includes("[native code]")) {
|
|||
|
console.warn(`[🍍]: The "state" must be a plain object. It cannot be
|
|||
|
state: () => new MyClass()
|
|||
|
Found in store "${store.$id}".`);
|
|||
|
}
|
|||
|
if (initialState && isOptionsStore && options.hydrate) {
|
|||
|
options.hydrate(store.$state, initialState);
|
|||
|
}
|
|||
|
isListening = true;
|
|||
|
isSyncListening = true;
|
|||
|
return store;
|
|||
|
}
|
|||
|
function defineStore(idOrOptions, setup, setupOptions) {
|
|||
|
let id;
|
|||
|
let options;
|
|||
|
const isSetupStore = typeof setup === "function";
|
|||
|
if (typeof idOrOptions === "string") {
|
|||
|
id = idOrOptions;
|
|||
|
options = isSetupStore ? setupOptions : setup;
|
|||
|
} else {
|
|||
|
options = idOrOptions;
|
|||
|
id = idOrOptions.id;
|
|||
|
}
|
|||
|
function useStore(pinia, hot) {
|
|||
|
const currentInstance = vue.getCurrentInstance();
|
|||
|
pinia = // in test mode, ignore the argument provided as we can always retrieve a
|
|||
|
// pinia instance with getActivePinia()
|
|||
|
pinia || currentInstance && vue.inject(piniaSymbol, null);
|
|||
|
if (pinia)
|
|||
|
setActivePinia(pinia);
|
|||
|
if (!activePinia) {
|
|||
|
throw new Error(`[🍍]: getActivePinia was called with no active Pinia. Did you forget to install pinia?
|
|||
|
const pinia = createPinia()
|
|||
|
app.use(pinia)
|
|||
|
This will fail in production.`);
|
|||
|
}
|
|||
|
pinia = activePinia;
|
|||
|
if (!pinia._s.has(id)) {
|
|||
|
if (isSetupStore) {
|
|||
|
createSetupStore(id, setup, options, pinia);
|
|||
|
} else {
|
|||
|
createOptionsStore(id, options, pinia);
|
|||
|
}
|
|||
|
{
|
|||
|
useStore._pinia = pinia;
|
|||
|
}
|
|||
|
}
|
|||
|
const store = pinia._s.get(id);
|
|||
|
if (hot) {
|
|||
|
const hotId = "__hot:" + id;
|
|||
|
const newStore = isSetupStore ? createSetupStore(hotId, setup, options, pinia, true) : createOptionsStore(hotId, assign({}, options), pinia, true);
|
|||
|
hot._hotUpdate(newStore);
|
|||
|
delete pinia.state.value[hotId];
|
|||
|
pinia._s.delete(hotId);
|
|||
|
}
|
|||
|
if (IS_CLIENT && currentInstance && currentInstance.proxy && // avoid adding stores that are just built for hot module replacement
|
|||
|
!hot) {
|
|||
|
const vm = currentInstance.proxy;
|
|||
|
const cache = "_pStores" in vm ? vm._pStores : vm._pStores = {};
|
|||
|
cache[id] = store;
|
|||
|
}
|
|||
|
return store;
|
|||
|
}
|
|||
|
useStore.$id = id;
|
|||
|
return useStore;
|
|||
|
}
|
|||
|
const counterStore = defineStore("counter", {
|
|||
|
state: () => ({
|
|||
|
count: 0
|
|||
|
}),
|
|||
|
getters: {},
|
|||
|
actions: {
|
|||
|
increment() {
|
|||
|
this.count++;
|
|||
|
}
|
|||
|
}
|
|||
|
});
|
|||
|
const _sfc_main$3 = {
|
|||
|
__name: "index",
|
|||
|
setup(__props) {
|
|||
|
counterStore();
|
|||
|
const res = vue.ref({});
|
|||
|
const handleAdd = () => {
|
|||
|
};
|
|||
|
const handle = () => {
|
|||
|
};
|
|||
|
onLoad(() => {
|
|||
|
companyMine({
|
|||
|
id: 1,
|
|||
|
flag: 1
|
|||
|
}).then((res1) => {
|
|||
|
res.value = res1.data;
|
|||
|
});
|
|||
|
});
|
|||
|
return (_ctx, _cache) => {
|
|||
|
const _component_up_button = resolveEasycom(vue.resolveDynamicComponent("up-button"), __easycom_0);
|
|||
|
return vue.openBlock(), vue.createElementBlock("view", { class: "" }, [
|
|||
|
vue.createTextVNode(
|
|||
|
vue.toDisplayString(res.value) + " ",
|
|||
|
1
|
|||
|
/* TEXT */
|
|||
|
),
|
|||
|
vue.createVNode(_component_up_button, {
|
|||
|
text: "渐变色按钮",
|
|||
|
onClick: handleAdd,
|
|||
|
color: "linear-gradient(to right, rgb(66, 83, 216), rgb(213, 51, 186))"
|
|||
|
}),
|
|||
|
vue.createVNode(_component_up_button, {
|
|||
|
text: "存值",
|
|||
|
onClick: handle,
|
|||
|
color: "linear-gradient(to right, rgb(66, 83, 216), rgb(213, 51, 186))"
|
|||
|
})
|
|||
|
]);
|
|||
|
};
|
|||
|
}
|
|||
|
};
|
|||
|
const PagesIndexIndex = /* @__PURE__ */ _export_sfc(_sfc_main$3, [["__file", "D:/zmj/uniapp/TraceabilityAPP/pages/index/index.vue"]]);
|
|||
|
const _sfc_main$2 = {
|
|||
|
__name: "index",
|
|||
|
setup(__props) {
|
|||
|
const counter = counterStore();
|
|||
|
return (_ctx, _cache) => {
|
|||
|
return vue.openBlock(), vue.createElementBlock(
|
|||
|
"view",
|
|||
|
null,
|
|||
|
vue.toDisplayString(vue.unref(counter).count),
|
|||
|
1
|
|||
|
/* TEXT */
|
|||
|
);
|
|||
|
};
|
|||
|
}
|
|||
|
};
|
|||
|
const PagesTestIndex = /* @__PURE__ */ _export_sfc(_sfc_main$2, [["__file", "D:/zmj/uniapp/TraceabilityAPP/pages/test/index.vue"]]);
|
|||
|
const _sfc_main$1 = {};
|
|||
|
function _sfc_render(_ctx, _cache) {
|
|||
|
return vue.openBlock(), vue.createElementBlock("view", null, " dsfsd ");
|
|||
|
}
|
|||
|
const PagesTestIndex1 = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["render", _sfc_render], ["__file", "D:/zmj/uniapp/TraceabilityAPP/pages/test/index1.vue"]]);
|
|||
|
__definePage("pages/index/index", PagesIndexIndex);
|
|||
|
__definePage("pages/test/index", PagesTestIndex);
|
|||
|
__definePage("pages/test/index1", PagesTestIndex1);
|
|||
|
const _sfc_main = {
|
|||
|
onLaunch: function() {
|
|||
|
formatAppLog("log", "at App.vue:4", "App Launch");
|
|||
|
uni.setStorageSync("SY_TOKEN", "dfdf4564557445df4df");
|
|||
|
},
|
|||
|
onShow: function() {
|
|||
|
formatAppLog("log", "at App.vue:8", "App Show");
|
|||
|
},
|
|||
|
onHide: function() {
|
|||
|
formatAppLog("log", "at App.vue:11", "App Hide");
|
|||
|
}
|
|||
|
};
|
|||
|
const App = /* @__PURE__ */ _export_sfc(_sfc_main, [["__file", "D:/zmj/uniapp/TraceabilityAPP/App.vue"]]);
|
|||
|
const { toString } = Object.prototype;
|
|||
|
function isArray(val) {
|
|||
|
return toString.call(val) === "[object Array]";
|
|||
|
}
|
|||
|
function isObject(val) {
|
|||
|
return val !== null && typeof val === "object";
|
|||
|
}
|
|||
|
function isDate(val) {
|
|||
|
return toString.call(val) === "[object Date]";
|
|||
|
}
|
|||
|
function isURLSearchParams(val) {
|
|||
|
return typeof URLSearchParams !== "undefined" && val instanceof URLSearchParams;
|
|||
|
}
|
|||
|
function forEach(obj, fn) {
|
|||
|
if (obj === null || typeof obj === "undefined") {
|
|||
|
return;
|
|||
|
}
|
|||
|
if (typeof obj !== "object") {
|
|||
|
obj = [obj];
|
|||
|
}
|
|||
|
if (isArray(obj)) {
|
|||
|
for (let i = 0, l = obj.length; i < l; i++) {
|
|||
|
fn.call(null, obj[i], i, obj);
|
|||
|
}
|
|||
|
} else {
|
|||
|
for (const key in obj) {
|
|||
|
if (Object.prototype.hasOwnProperty.call(obj, key)) {
|
|||
|
fn.call(null, obj[key], key, obj);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
function isPlainObject(obj) {
|
|||
|
return Object.prototype.toString.call(obj) === "[object Object]";
|
|||
|
}
|
|||
|
function deepMerge$1() {
|
|||
|
const result = {};
|
|||
|
function assignValue(val, key) {
|
|||
|
if (typeof result[key] === "object" && typeof val === "object") {
|
|||
|
result[key] = deepMerge$1(result[key], val);
|
|||
|
} else if (typeof val === "object") {
|
|||
|
result[key] = deepMerge$1({}, val);
|
|||
|
} else {
|
|||
|
result[key] = val;
|
|||
|
}
|
|||
|
}
|
|||
|
for (let i = 0, l = arguments.length; i < l; i++) {
|
|||
|
forEach(arguments[i], assignValue);
|
|||
|
}
|
|||
|
return result;
|
|||
|
}
|
|||
|
function isUndefined(val) {
|
|||
|
return typeof val === "undefined";
|
|||
|
}
|
|||
|
function encode(val) {
|
|||
|
return encodeURIComponent(val).replace(/%40/gi, "@").replace(/%3A/gi, ":").replace(/%24/g, "$").replace(/%2C/gi, ",").replace(/%20/g, "+").replace(/%5B/gi, "[").replace(/%5D/gi, "]");
|
|||
|
}
|
|||
|
function buildURL(url2, params) {
|
|||
|
if (!params) {
|
|||
|
return url2;
|
|||
|
}
|
|||
|
let serializedParams;
|
|||
|
if (isURLSearchParams(params)) {
|
|||
|
serializedParams = params.toString();
|
|||
|
} else {
|
|||
|
const parts = [];
|
|||
|
forEach(params, (val, key) => {
|
|||
|
if (val === null || typeof val === "undefined") {
|
|||
|
return;
|
|||
|
}
|
|||
|
if (isArray(val)) {
|
|||
|
key = `${key}[]`;
|
|||
|
} else {
|
|||
|
val = [val];
|
|||
|
}
|
|||
|
forEach(val, (v) => {
|
|||
|
if (isDate(v)) {
|
|||
|
v = v.toISOString();
|
|||
|
} else if (isObject(v)) {
|
|||
|
v = JSON.stringify(v);
|
|||
|
}
|
|||
|
parts.push(`${encode(key)}=${encode(v)}`);
|
|||
|
});
|
|||
|
});
|
|||
|
serializedParams = parts.join("&");
|
|||
|
}
|
|||
|
if (serializedParams) {
|
|||
|
const hashmarkIndex = url2.indexOf("#");
|
|||
|
if (hashmarkIndex !== -1) {
|
|||
|
url2 = url2.slice(0, hashmarkIndex);
|
|||
|
}
|
|||
|
url2 += (url2.indexOf("?") === -1 ? "?" : "&") + serializedParams;
|
|||
|
}
|
|||
|
return url2;
|
|||
|
}
|
|||
|
function isAbsoluteURL(url2) {
|
|||
|
return /^([a-z][a-z\d+\-.]*:)?\/\//i.test(url2);
|
|||
|
}
|
|||
|
function combineURLs(baseURL, relativeURL) {
|
|||
|
return relativeURL ? `${baseURL.replace(/\/+$/, "")}/${relativeURL.replace(/^\/+/, "")}` : baseURL;
|
|||
|
}
|
|||
|
function buildFullPath(baseURL, requestedURL) {
|
|||
|
if (baseURL && !isAbsoluteURL(requestedURL)) {
|
|||
|
return combineURLs(baseURL, requestedURL);
|
|||
|
}
|
|||
|
return requestedURL;
|
|||
|
}
|
|||
|
function settle(resolve, reject, response) {
|
|||
|
const { validateStatus } = response.config;
|
|||
|
const status = response.statusCode;
|
|||
|
if (status && (!validateStatus || validateStatus(status))) {
|
|||
|
resolve(response);
|
|||
|
} else {
|
|||
|
reject(response);
|
|||
|
}
|
|||
|
}
|
|||
|
const mergeKeys$1 = (keys, config2) => {
|
|||
|
const config3 = {};
|
|||
|
keys.forEach((prop) => {
|
|||
|
if (!isUndefined(config2[prop])) {
|
|||
|
config3[prop] = config2[prop];
|
|||
|
}
|
|||
|
});
|
|||
|
return config3;
|
|||
|
};
|
|||
|
const adapter = (config2) => new Promise((resolve, reject) => {
|
|||
|
const fullPath = buildURL(buildFullPath(config2.baseURL, config2.url), config2.params);
|
|||
|
const _config = {
|
|||
|
url: fullPath,
|
|||
|
header: config2.header,
|
|||
|
complete: (response) => {
|
|||
|
config2.fullPath = fullPath;
|
|||
|
response.config = config2;
|
|||
|
try {
|
|||
|
if (typeof response.data === "string") {
|
|||
|
response.data = JSON.parse(response.data);
|
|||
|
}
|
|||
|
} catch (e) {
|
|||
|
}
|
|||
|
settle(resolve, reject, response);
|
|||
|
}
|
|||
|
};
|
|||
|
let requestTask;
|
|||
|
if (config2.method === "UPLOAD") {
|
|||
|
delete _config.header["content-type"];
|
|||
|
delete _config.header["Content-Type"];
|
|||
|
const otherConfig = {
|
|||
|
filePath: config2.filePath,
|
|||
|
name: config2.name
|
|||
|
};
|
|||
|
const optionalKeys = [
|
|||
|
"files",
|
|||
|
"timeout",
|
|||
|
"formData"
|
|||
|
];
|
|||
|
requestTask = uni.uploadFile({ ..._config, ...otherConfig, ...mergeKeys$1(optionalKeys, config2) });
|
|||
|
} else if (config2.method === "DOWNLOAD") {
|
|||
|
if (!isUndefined(config2.timeout)) {
|
|||
|
_config.timeout = config2.timeout;
|
|||
|
}
|
|||
|
requestTask = uni.downloadFile(_config);
|
|||
|
} else {
|
|||
|
const optionalKeys = [
|
|||
|
"data",
|
|||
|
"method",
|
|||
|
"timeout",
|
|||
|
"dataType",
|
|||
|
"responseType",
|
|||
|
"sslVerify",
|
|||
|
"firstIpv4"
|
|||
|
];
|
|||
|
requestTask = uni.request({ ..._config, ...mergeKeys$1(optionalKeys, config2) });
|
|||
|
}
|
|||
|
if (config2.getTask) {
|
|||
|
config2.getTask(requestTask, config2);
|
|||
|
}
|
|||
|
});
|
|||
|
const dispatchRequest = (config2) => adapter(config2);
|
|||
|
function InterceptorManager() {
|
|||
|
this.handlers = [];
|
|||
|
}
|
|||
|
InterceptorManager.prototype.use = function use(fulfilled, rejected) {
|
|||
|
this.handlers.push({
|
|||
|
fulfilled,
|
|||
|
rejected
|
|||
|
});
|
|||
|
return this.handlers.length - 1;
|
|||
|
};
|
|||
|
InterceptorManager.prototype.eject = function eject(id) {
|
|||
|
if (this.handlers[id]) {
|
|||
|
this.handlers[id] = null;
|
|||
|
}
|
|||
|
};
|
|||
|
InterceptorManager.prototype.forEach = function forEach2(fn) {
|
|||
|
this.handlers.forEach((h) => {
|
|||
|
if (h !== null) {
|
|||
|
fn(h);
|
|||
|
}
|
|||
|
});
|
|||
|
};
|
|||
|
const mergeKeys = (keys, globalsConfig, config2) => {
|
|||
|
const config3 = {};
|
|||
|
keys.forEach((prop) => {
|
|||
|
if (!isUndefined(config2[prop])) {
|
|||
|
config3[prop] = config2[prop];
|
|||
|
} else if (!isUndefined(globalsConfig[prop])) {
|
|||
|
config3[prop] = globalsConfig[prop];
|
|||
|
}
|
|||
|
});
|
|||
|
return config3;
|
|||
|
};
|
|||
|
const mergeConfig = (globalsConfig, config2 = {}) => {
|
|||
|
const method = config2.method || globalsConfig.method || "GET";
|
|||
|
let config3 = {
|
|||
|
baseURL: globalsConfig.baseURL || "",
|
|||
|
method,
|
|||
|
url: config2.url || "",
|
|||
|
params: config2.params || {},
|
|||
|
custom: { ...globalsConfig.custom || {}, ...config2.custom || {} },
|
|||
|
header: deepMerge$1(globalsConfig.header || {}, config2.header || {})
|
|||
|
};
|
|||
|
const defaultToConfig2Keys = ["getTask", "validateStatus"];
|
|||
|
config3 = { ...config3, ...mergeKeys(defaultToConfig2Keys, globalsConfig, config2) };
|
|||
|
if (method === "DOWNLOAD") {
|
|||
|
if (!isUndefined(config2.timeout)) {
|
|||
|
config3.timeout = config2.timeout;
|
|||
|
} else if (!isUndefined(globalsConfig.timeout)) {
|
|||
|
config3.timeout = globalsConfig.timeout;
|
|||
|
}
|
|||
|
} else if (method === "UPLOAD") {
|
|||
|
delete config3.header["content-type"];
|
|||
|
delete config3.header["Content-Type"];
|
|||
|
const uploadKeys = [
|
|||
|
"files",
|
|||
|
"filePath",
|
|||
|
"name",
|
|||
|
"timeout",
|
|||
|
"formData"
|
|||
|
];
|
|||
|
uploadKeys.forEach((prop) => {
|
|||
|
if (!isUndefined(config2[prop])) {
|
|||
|
config3[prop] = config2[prop];
|
|||
|
}
|
|||
|
});
|
|||
|
if (isUndefined(config3.timeout) && !isUndefined(globalsConfig.timeout)) {
|
|||
|
config3.timeout = globalsConfig.timeout;
|
|||
|
}
|
|||
|
} else {
|
|||
|
const defaultsKeys = [
|
|||
|
"data",
|
|||
|
"timeout",
|
|||
|
"dataType",
|
|||
|
"responseType",
|
|||
|
"sslVerify",
|
|||
|
"firstIpv4"
|
|||
|
];
|
|||
|
config3 = { ...config3, ...mergeKeys(defaultsKeys, globalsConfig, config2) };
|
|||
|
}
|
|||
|
return config3;
|
|||
|
};
|
|||
|
const defaults = {
|
|||
|
baseURL: "",
|
|||
|
header: {},
|
|||
|
method: "GET",
|
|||
|
dataType: "json",
|
|||
|
responseType: "text",
|
|||
|
custom: {},
|
|||
|
timeout: 6e4,
|
|||
|
sslVerify: true,
|
|||
|
firstIpv4: false,
|
|||
|
validateStatus: function validateStatus(status) {
|
|||
|
return status >= 200 && status < 300;
|
|||
|
}
|
|||
|
};
|
|||
|
var clone = function() {
|
|||
|
function _instanceof(obj, type) {
|
|||
|
return type != null && obj instanceof type;
|
|||
|
}
|
|||
|
var nativeMap;
|
|||
|
try {
|
|||
|
nativeMap = Map;
|
|||
|
} catch (_) {
|
|||
|
nativeMap = function() {
|
|||
|
};
|
|||
|
}
|
|||
|
var nativeSet;
|
|||
|
try {
|
|||
|
nativeSet = Set;
|
|||
|
} catch (_) {
|
|||
|
nativeSet = function() {
|
|||
|
};
|
|||
|
}
|
|||
|
var nativePromise;
|
|||
|
try {
|
|||
|
nativePromise = Promise;
|
|||
|
} catch (_) {
|
|||
|
nativePromise = function() {
|
|||
|
};
|
|||
|
}
|
|||
|
function clone2(parent, circular, depth, prototype, includeNonEnumerable) {
|
|||
|
if (typeof circular === "object") {
|
|||
|
depth = circular.depth;
|
|||
|
prototype = circular.prototype;
|
|||
|
includeNonEnumerable = circular.includeNonEnumerable;
|
|||
|
circular = circular.circular;
|
|||
|
}
|
|||
|
var allParents = [];
|
|||
|
var allChildren = [];
|
|||
|
var useBuffer = typeof Buffer != "undefined";
|
|||
|
if (typeof circular == "undefined")
|
|||
|
circular = true;
|
|||
|
if (typeof depth == "undefined")
|
|||
|
depth = Infinity;
|
|||
|
function _clone(parent2, depth2) {
|
|||
|
if (parent2 === null)
|
|||
|
return null;
|
|||
|
if (depth2 === 0)
|
|||
|
return parent2;
|
|||
|
var child;
|
|||
|
var proto;
|
|||
|
if (typeof parent2 != "object") {
|
|||
|
return parent2;
|
|||
|
}
|
|||
|
if (_instanceof(parent2, nativeMap)) {
|
|||
|
child = new nativeMap();
|
|||
|
} else if (_instanceof(parent2, nativeSet)) {
|
|||
|
child = new nativeSet();
|
|||
|
} else if (_instanceof(parent2, nativePromise)) {
|
|||
|
child = new nativePromise(function(resolve, reject) {
|
|||
|
parent2.then(function(value) {
|
|||
|
resolve(_clone(value, depth2 - 1));
|
|||
|
}, function(err) {
|
|||
|
reject(_clone(err, depth2 - 1));
|
|||
|
});
|
|||
|
});
|
|||
|
} else if (clone2.__isArray(parent2)) {
|
|||
|
child = [];
|
|||
|
} else if (clone2.__isRegExp(parent2)) {
|
|||
|
child = new RegExp(parent2.source, __getRegExpFlags(parent2));
|
|||
|
if (parent2.lastIndex)
|
|||
|
child.lastIndex = parent2.lastIndex;
|
|||
|
} else if (clone2.__isDate(parent2)) {
|
|||
|
child = new Date(parent2.getTime());
|
|||
|
} else if (useBuffer && Buffer.isBuffer(parent2)) {
|
|||
|
if (Buffer.from) {
|
|||
|
child = Buffer.from(parent2);
|
|||
|
} else {
|
|||
|
child = new Buffer(parent2.length);
|
|||
|
parent2.copy(child);
|
|||
|
}
|
|||
|
return child;
|
|||
|
} else if (_instanceof(parent2, Error)) {
|
|||
|
child = Object.create(parent2);
|
|||
|
} else {
|
|||
|
if (typeof prototype == "undefined") {
|
|||
|
proto = Object.getPrototypeOf(parent2);
|
|||
|
child = Object.create(proto);
|
|||
|
} else {
|
|||
|
child = Object.create(prototype);
|
|||
|
proto = prototype;
|
|||
|
}
|
|||
|
}
|
|||
|
if (circular) {
|
|||
|
var index2 = allParents.indexOf(parent2);
|
|||
|
if (index2 != -1) {
|
|||
|
return allChildren[index2];
|
|||
|
}
|
|||
|
allParents.push(parent2);
|
|||
|
allChildren.push(child);
|
|||
|
}
|
|||
|
if (_instanceof(parent2, nativeMap)) {
|
|||
|
parent2.forEach(function(value, key) {
|
|||
|
var keyChild = _clone(key, depth2 - 1);
|
|||
|
var valueChild = _clone(value, depth2 - 1);
|
|||
|
child.set(keyChild, valueChild);
|
|||
|
});
|
|||
|
}
|
|||
|
if (_instanceof(parent2, nativeSet)) {
|
|||
|
parent2.forEach(function(value) {
|
|||
|
var entryChild = _clone(value, depth2 - 1);
|
|||
|
child.add(entryChild);
|
|||
|
});
|
|||
|
}
|
|||
|
for (var i in parent2) {
|
|||
|
var attrs = Object.getOwnPropertyDescriptor(parent2, i);
|
|||
|
if (attrs) {
|
|||
|
child[i] = _clone(parent2[i], depth2 - 1);
|
|||
|
}
|
|||
|
try {
|
|||
|
var objProperty = Object.getOwnPropertyDescriptor(parent2, i);
|
|||
|
if (objProperty.set === "undefined") {
|
|||
|
continue;
|
|||
|
}
|
|||
|
child[i] = _clone(parent2[i], depth2 - 1);
|
|||
|
} catch (e) {
|
|||
|
if (e instanceof TypeError) {
|
|||
|
continue;
|
|||
|
} else if (e instanceof ReferenceError) {
|
|||
|
continue;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
if (Object.getOwnPropertySymbols) {
|
|||
|
var symbols = Object.getOwnPropertySymbols(parent2);
|
|||
|
for (var i = 0; i < symbols.length; i++) {
|
|||
|
var symbol = symbols[i];
|
|||
|
var descriptor = Object.getOwnPropertyDescriptor(parent2, symbol);
|
|||
|
if (descriptor && !descriptor.enumerable && !includeNonEnumerable) {
|
|||
|
continue;
|
|||
|
}
|
|||
|
child[symbol] = _clone(parent2[symbol], depth2 - 1);
|
|||
|
Object.defineProperty(child, symbol, descriptor);
|
|||
|
}
|
|||
|
}
|
|||
|
if (includeNonEnumerable) {
|
|||
|
var allPropertyNames = Object.getOwnPropertyNames(parent2);
|
|||
|
for (var i = 0; i < allPropertyNames.length; i++) {
|
|||
|
var propertyName = allPropertyNames[i];
|
|||
|
var descriptor = Object.getOwnPropertyDescriptor(parent2, propertyName);
|
|||
|
if (descriptor && descriptor.enumerable) {
|
|||
|
continue;
|
|||
|
}
|
|||
|
child[propertyName] = _clone(parent2[propertyName], depth2 - 1);
|
|||
|
Object.defineProperty(child, propertyName, descriptor);
|
|||
|
}
|
|||
|
}
|
|||
|
return child;
|
|||
|
}
|
|||
|
return _clone(parent, depth);
|
|||
|
}
|
|||
|
clone2.clonePrototype = function clonePrototype(parent) {
|
|||
|
if (parent === null)
|
|||
|
return null;
|
|||
|
var c = function() {
|
|||
|
};
|
|||
|
c.prototype = parent;
|
|||
|
return new c();
|
|||
|
};
|
|||
|
function __objToStr(o) {
|
|||
|
return Object.prototype.toString.call(o);
|
|||
|
}
|
|||
|
clone2.__objToStr = __objToStr;
|
|||
|
function __isDate(o) {
|
|||
|
return typeof o === "object" && __objToStr(o) === "[object Date]";
|
|||
|
}
|
|||
|
clone2.__isDate = __isDate;
|
|||
|
function __isArray(o) {
|
|||
|
return typeof o === "object" && __objToStr(o) === "[object Array]";
|
|||
|
}
|
|||
|
clone2.__isArray = __isArray;
|
|||
|
function __isRegExp(o) {
|
|||
|
return typeof o === "object" && __objToStr(o) === "[object RegExp]";
|
|||
|
}
|
|||
|
clone2.__isRegExp = __isRegExp;
|
|||
|
function __getRegExpFlags(re) {
|
|||
|
var flags = "";
|
|||
|
if (re.global)
|
|||
|
flags += "g";
|
|||
|
if (re.ignoreCase)
|
|||
|
flags += "i";
|
|||
|
if (re.multiline)
|
|||
|
flags += "m";
|
|||
|
return flags;
|
|||
|
}
|
|||
|
clone2.__getRegExpFlags = __getRegExpFlags;
|
|||
|
return clone2;
|
|||
|
}();
|
|||
|
class Request {
|
|||
|
/**
|
|||
|
* @param {Object} arg - 全局配置
|
|||
|
* @param {String} arg.baseURL - 全局根路径
|
|||
|
* @param {Object} arg.header - 全局header
|
|||
|
* @param {String} arg.method = [GET|POST|PUT|DELETE|CONNECT|HEAD|OPTIONS|TRACE] - 全局默认请求方式
|
|||
|
* @param {String} arg.dataType = [json] - 全局默认的dataType
|
|||
|
* @param {String} arg.responseType = [text|arraybuffer] - 全局默认的responseType。支付宝小程序不支持
|
|||
|
* @param {Object} arg.custom - 全局默认的自定义参数
|
|||
|
* @param {Number} arg.timeout - 全局默认的超时时间,单位 ms。默认60000。H5(HBuilderX 2.9.9+)、APP(HBuilderX 2.9.9+)、微信小程序(2.10.0)、支付宝小程序
|
|||
|
* @param {Boolean} arg.sslVerify - 全局默认的是否验证 ssl 证书。默认true.仅App安卓端支持(HBuilderX 2.3.3+)
|
|||
|
* @param {Boolean} arg.withCredentials - 全局默认的跨域请求时是否携带凭证(cookies)。默认false。仅H5支持(HBuilderX 2.6.15+)
|
|||
|
* @param {Boolean} arg.firstIpv4 - 全DNS解析时优先使用ipv4。默认false。仅 App-Android 支持 (HBuilderX 2.8.0+)
|
|||
|
* @param {Function(statusCode):Boolean} arg.validateStatus - 全局默认的自定义验证器。默认statusCode >= 200 && statusCode < 300
|
|||
|
*/
|
|||
|
constructor(arg = {}) {
|
|||
|
if (!isPlainObject(arg)) {
|
|||
|
arg = {};
|
|||
|
formatAppLog("warn", "at node_modules/uview-plus/libs/luch-request/core/Request.js:39", "设置全局参数必须接收一个Object");
|
|||
|
}
|
|||
|
this.config = clone({ ...defaults, ...arg });
|
|||
|
this.interceptors = {
|
|||
|
request: new InterceptorManager(),
|
|||
|
response: new InterceptorManager()
|
|||
|
};
|
|||
|
}
|
|||
|
/**
|
|||
|
* @Function
|
|||
|
* @param {Request~setConfigCallback} f - 设置全局默认配置
|
|||
|
*/
|
|||
|
setConfig(f) {
|
|||
|
this.config = f(this.config);
|
|||
|
}
|
|||
|
middleware(config2) {
|
|||
|
config2 = mergeConfig(this.config, config2);
|
|||
|
const chain = [dispatchRequest, void 0];
|
|||
|
let promise2 = Promise.resolve(config2);
|
|||
|
this.interceptors.request.forEach((interceptor) => {
|
|||
|
chain.unshift(interceptor.fulfilled, interceptor.rejected);
|
|||
|
});
|
|||
|
this.interceptors.response.forEach((interceptor) => {
|
|||
|
chain.push(interceptor.fulfilled, interceptor.rejected);
|
|||
|
});
|
|||
|
while (chain.length) {
|
|||
|
promise2 = promise2.then(chain.shift(), chain.shift());
|
|||
|
}
|
|||
|
return promise2;
|
|||
|
}
|
|||
|
/**
|
|||
|
* @Function
|
|||
|
* @param {Object} config - 请求配置项
|
|||
|
* @prop {String} options.url - 请求路径
|
|||
|
* @prop {Object} options.data - 请求参数
|
|||
|
* @prop {Object} [options.responseType = config.responseType] [text|arraybuffer] - 响应的数据类型
|
|||
|
* @prop {Object} [options.dataType = config.dataType] - 如果设为 json,会尝试对返回的数据做一次 JSON.parse
|
|||
|
* @prop {Object} [options.header = config.header] - 请求header
|
|||
|
* @prop {Object} [options.method = config.method] - 请求方法
|
|||
|
* @returns {Promise<unknown>}
|
|||
|
*/
|
|||
|
request(config2 = {}) {
|
|||
|
return this.middleware(config2);
|
|||
|
}
|
|||
|
get(url2, options = {}) {
|
|||
|
return this.middleware({
|
|||
|
url: url2,
|
|||
|
method: "GET",
|
|||
|
...options
|
|||
|
});
|
|||
|
}
|
|||
|
post(url2, data, options = {}) {
|
|||
|
return this.middleware({
|
|||
|
url: url2,
|
|||
|
data,
|
|||
|
method: "POST",
|
|||
|
...options
|
|||
|
});
|
|||
|
}
|
|||
|
put(url2, data, options = {}) {
|
|||
|
return this.middleware({
|
|||
|
url: url2,
|
|||
|
data,
|
|||
|
method: "PUT",
|
|||
|
...options
|
|||
|
});
|
|||
|
}
|
|||
|
delete(url2, data, options = {}) {
|
|||
|
return this.middleware({
|
|||
|
url: url2,
|
|||
|
data,
|
|||
|
method: "DELETE",
|
|||
|
...options
|
|||
|
});
|
|||
|
}
|
|||
|
options(url2, data, options = {}) {
|
|||
|
return this.middleware({
|
|||
|
url: url2,
|
|||
|
data,
|
|||
|
method: "OPTIONS",
|
|||
|
...options
|
|||
|
});
|
|||
|
}
|
|||
|
upload(url2, config2 = {}) {
|
|||
|
config2.url = url2;
|
|||
|
config2.method = "UPLOAD";
|
|||
|
return this.middleware(config2);
|
|||
|
}
|
|||
|
download(url2, config2 = {}) {
|
|||
|
config2.url = url2;
|
|||
|
config2.method = "DOWNLOAD";
|
|||
|
return this.middleware(config2);
|
|||
|
}
|
|||
|
}
|
|||
|
class Router {
|
|||
|
constructor() {
|
|||
|
this.config = {
|
|||
|
type: "navigateTo",
|
|||
|
url: "",
|
|||
|
delta: 1,
|
|||
|
// navigateBack页面后退时,回退的层数
|
|||
|
params: {},
|
|||
|
// 传递的参数
|
|||
|
animationType: "pop-in",
|
|||
|
// 窗口动画,只在APP有效
|
|||
|
animationDuration: 300,
|
|||
|
// 窗口动画持续时间,单位毫秒,只在APP有效
|
|||
|
intercept: false
|
|||
|
// 是否需要拦截
|
|||
|
};
|
|||
|
this.route = this.route.bind(this);
|
|||
|
}
|
|||
|
// 判断url前面是否有"/",如果没有则加上,否则无法跳转
|
|||
|
addRootPath(url2) {
|
|||
|
return url2[0] === "/" ? url2 : `/${url2}`;
|
|||
|
}
|
|||
|
// 整合路由参数
|
|||
|
mixinParam(url2, params) {
|
|||
|
url2 = url2 && this.addRootPath(url2);
|
|||
|
let query = "";
|
|||
|
if (/.*\/.*\?.*=.*/.test(url2)) {
|
|||
|
query = uni.$u.queryParams(params, false);
|
|||
|
return url2 += `&${query}`;
|
|||
|
}
|
|||
|
query = uni.$u.queryParams(params);
|
|||
|
return url2 += query;
|
|||
|
}
|
|||
|
// 对外的方法名称
|
|||
|
async route(options = {}, params = {}) {
|
|||
|
let mergeConfig2 = {};
|
|||
|
if (typeof options === "string") {
|
|||
|
mergeConfig2.url = this.mixinParam(options, params);
|
|||
|
mergeConfig2.type = "navigateTo";
|
|||
|
} else {
|
|||
|
mergeConfig2 = uni.$u.deepMerge(this.config, options);
|
|||
|
mergeConfig2.url = this.mixinParam(options.url, options.params);
|
|||
|
}
|
|||
|
if (mergeConfig2.url === uni.$u.page())
|
|||
|
return;
|
|||
|
if (params.intercept) {
|
|||
|
this.config.intercept = params.intercept;
|
|||
|
}
|
|||
|
mergeConfig2.params = params;
|
|||
|
mergeConfig2 = uni.$u.deepMerge(this.config, mergeConfig2);
|
|||
|
if (typeof uni.$u.routeIntercept === "function") {
|
|||
|
const isNext = await new Promise((resolve, reject) => {
|
|||
|
uni.$u.routeIntercept(mergeConfig2, resolve);
|
|||
|
});
|
|||
|
isNext && this.openPage(mergeConfig2);
|
|||
|
} else {
|
|||
|
this.openPage(mergeConfig2);
|
|||
|
}
|
|||
|
}
|
|||
|
// 执行路由跳转
|
|||
|
openPage(config2) {
|
|||
|
const {
|
|||
|
url: url2,
|
|||
|
type,
|
|||
|
delta,
|
|||
|
animationType,
|
|||
|
animationDuration
|
|||
|
} = config2;
|
|||
|
if (config2.type == "navigateTo" || config2.type == "to") {
|
|||
|
uni.navigateTo({
|
|||
|
url: url2,
|
|||
|
animationType,
|
|||
|
animationDuration
|
|||
|
});
|
|||
|
}
|
|||
|
if (config2.type == "redirectTo" || config2.type == "redirect") {
|
|||
|
uni.redirectTo({
|
|||
|
url: url2
|
|||
|
});
|
|||
|
}
|
|||
|
if (config2.type == "switchTab" || config2.type == "tab") {
|
|||
|
uni.switchTab({
|
|||
|
url: url2
|
|||
|
});
|
|||
|
}
|
|||
|
if (config2.type == "reLaunch" || config2.type == "launch") {
|
|||
|
uni.reLaunch({
|
|||
|
url: url2
|
|||
|
});
|
|||
|
}
|
|||
|
if (config2.type == "navigateBack" || config2.type == "back") {
|
|||
|
uni.navigateBack({
|
|||
|
delta
|
|||
|
});
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
const route = new Router().route;
|
|||
|
function colorGradient(startColor = "rgb(0, 0, 0)", endColor = "rgb(255, 255, 255)", step = 10) {
|
|||
|
const startRGB = hexToRgb(startColor, false);
|
|||
|
const startR = startRGB[0];
|
|||
|
const startG = startRGB[1];
|
|||
|
const startB = startRGB[2];
|
|||
|
const endRGB = hexToRgb(endColor, false);
|
|||
|
const endR = endRGB[0];
|
|||
|
const endG = endRGB[1];
|
|||
|
const endB = endRGB[2];
|
|||
|
const sR = (endR - startR) / step;
|
|||
|
const sG = (endG - startG) / step;
|
|||
|
const sB = (endB - startB) / step;
|
|||
|
const colorArr = [];
|
|||
|
for (let i = 0; i < step; i++) {
|
|||
|
let hex = rgbToHex(`rgb(${Math.round(sR * i + startR)},${Math.round(sG * i + startG)},${Math.round(sB * i + startB)})`);
|
|||
|
if (i === 0)
|
|||
|
hex = rgbToHex(startColor);
|
|||
|
if (i === step - 1)
|
|||
|
hex = rgbToHex(endColor);
|
|||
|
colorArr.push(hex);
|
|||
|
}
|
|||
|
return colorArr;
|
|||
|
}
|
|||
|
function hexToRgb(sColor, str = true) {
|
|||
|
const reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/;
|
|||
|
sColor = String(sColor).toLowerCase();
|
|||
|
if (sColor && reg.test(sColor)) {
|
|||
|
if (sColor.length === 4) {
|
|||
|
let sColorNew = "#";
|
|||
|
for (let i = 1; i < 4; i += 1) {
|
|||
|
sColorNew += sColor.slice(i, i + 1).concat(sColor.slice(i, i + 1));
|
|||
|
}
|
|||
|
sColor = sColorNew;
|
|||
|
}
|
|||
|
const sColorChange = [];
|
|||
|
for (let i = 1; i < 7; i += 2) {
|
|||
|
sColorChange.push(parseInt(`0x${sColor.slice(i, i + 2)}`));
|
|||
|
}
|
|||
|
if (!str) {
|
|||
|
return sColorChange;
|
|||
|
}
|
|||
|
return `rgb(${sColorChange[0]},${sColorChange[1]},${sColorChange[2]})`;
|
|||
|
}
|
|||
|
if (/^(rgb|RGB)/.test(sColor)) {
|
|||
|
const arr = sColor.replace(/(?:\(|\)|rgb|RGB)*/g, "").split(",");
|
|||
|
return arr.map((val) => Number(val));
|
|||
|
}
|
|||
|
return sColor;
|
|||
|
}
|
|||
|
function rgbToHex(rgb) {
|
|||
|
const _this = rgb;
|
|||
|
const reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/;
|
|||
|
if (/^(rgb|RGB)/.test(_this)) {
|
|||
|
const aColor = _this.replace(/(?:\(|\)|rgb|RGB)*/g, "").split(",");
|
|||
|
let strHex = "#";
|
|||
|
for (let i = 0; i < aColor.length; i++) {
|
|||
|
let hex = Number(aColor[i]).toString(16);
|
|||
|
hex = String(hex).length == 1 ? `${0}${hex}` : hex;
|
|||
|
if (hex === "0") {
|
|||
|
hex += hex;
|
|||
|
}
|
|||
|
strHex += hex;
|
|||
|
}
|
|||
|
if (strHex.length !== 7) {
|
|||
|
strHex = _this;
|
|||
|
}
|
|||
|
return strHex;
|
|||
|
}
|
|||
|
if (reg.test(_this)) {
|
|||
|
const aNum = _this.replace(/#/, "").split("");
|
|||
|
if (aNum.length === 6) {
|
|||
|
return _this;
|
|||
|
}
|
|||
|
if (aNum.length === 3) {
|
|||
|
let numHex = "#";
|
|||
|
for (let i = 0; i < aNum.length; i += 1) {
|
|||
|
numHex += aNum[i] + aNum[i];
|
|||
|
}
|
|||
|
return numHex;
|
|||
|
}
|
|||
|
} else {
|
|||
|
return _this;
|
|||
|
}
|
|||
|
}
|
|||
|
function colorToRgba(color2, alpha) {
|
|||
|
color2 = rgbToHex(color2);
|
|||
|
const reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/;
|
|||
|
let sColor = String(color2).toLowerCase();
|
|||
|
if (sColor && reg.test(sColor)) {
|
|||
|
if (sColor.length === 4) {
|
|||
|
let sColorNew = "#";
|
|||
|
for (let i = 1; i < 4; i += 1) {
|
|||
|
sColorNew += sColor.slice(i, i + 1).concat(sColor.slice(i, i + 1));
|
|||
|
}
|
|||
|
sColor = sColorNew;
|
|||
|
}
|
|||
|
const sColorChange = [];
|
|||
|
for (let i = 1; i < 7; i += 2) {
|
|||
|
sColorChange.push(parseInt(`0x${sColor.slice(i, i + 2)}`));
|
|||
|
}
|
|||
|
return `rgba(${sColorChange.join(",")},${alpha})`;
|
|||
|
}
|
|||
|
return sColor;
|
|||
|
}
|
|||
|
const colorGradient$1 = {
|
|||
|
colorGradient,
|
|||
|
hexToRgb,
|
|||
|
rgbToHex,
|
|||
|
colorToRgba
|
|||
|
};
|
|||
|
function email(value) {
|
|||
|
return /^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/.test(value);
|
|||
|
}
|
|||
|
function mobile(value) {
|
|||
|
return /^1[23456789]\d{9}$/.test(value);
|
|||
|
}
|
|||
|
function url(value) {
|
|||
|
return /^((https|http|ftp|rtsp|mms):\/\/)(([0-9a-zA-Z_!~*'().&=+$%-]+: )?[0-9a-zA-Z_!~*'().&=+$%-]+@)?(([0-9]{1,3}.){3}[0-9]{1,3}|([0-9a-zA-Z_!~*'()-]+.)*([0-9a-zA-Z][0-9a-zA-Z-]{0,61})?[0-9a-zA-Z].[a-zA-Z]{2,6})(:[0-9]{1,4})?((\/?)|(\/[0-9a-zA-Z_!~*'().;?:@&=+$,%#-]+)+\/?)$/.test(value);
|
|||
|
}
|
|||
|
function date(value) {
|
|||
|
if (!value)
|
|||
|
return false;
|
|||
|
if (number(value))
|
|||
|
value = +value;
|
|||
|
return !/Invalid|NaN/.test(new Date(value).toString());
|
|||
|
}
|
|||
|
function dateISO(value) {
|
|||
|
return /^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/.test(value);
|
|||
|
}
|
|||
|
function number(value) {
|
|||
|
return /^[\+-]?(\d+\.?\d*|\.\d+|\d\.\d+e\+\d+)$/.test(value);
|
|||
|
}
|
|||
|
function string(value) {
|
|||
|
return typeof value === "string";
|
|||
|
}
|
|||
|
function digits(value) {
|
|||
|
return /^\d+$/.test(value);
|
|||
|
}
|
|||
|
function idCard(value) {
|
|||
|
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(
|
|||
|
value
|
|||
|
);
|
|||
|
}
|
|||
|
function carNo(value) {
|
|||
|
const xreg = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}(([0-9]{5}[DF]$)|([DF][A-HJ-NP-Z0-9][0-9]{4}$))/;
|
|||
|
const creg = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳]{1}$/;
|
|||
|
if (value.length === 7) {
|
|||
|
return creg.test(value);
|
|||
|
}
|
|||
|
if (value.length === 8) {
|
|||
|
return xreg.test(value);
|
|||
|
}
|
|||
|
return false;
|
|||
|
}
|
|||
|
function amount(value) {
|
|||
|
return /^[1-9]\d*(,\d{3})*(\.\d{1,2})?$|^0\.\d{1,2}$/.test(value);
|
|||
|
}
|
|||
|
function chinese(value) {
|
|||
|
const reg = /^[\u4e00-\u9fa5]+$/gi;
|
|||
|
return reg.test(value);
|
|||
|
}
|
|||
|
function letter(value) {
|
|||
|
return /^[a-zA-Z]*$/.test(value);
|
|||
|
}
|
|||
|
function enOrNum(value) {
|
|||
|
const reg = /^[0-9a-zA-Z]*$/g;
|
|||
|
return reg.test(value);
|
|||
|
}
|
|||
|
function contains(value, param) {
|
|||
|
return value.indexOf(param) >= 0;
|
|||
|
}
|
|||
|
function range$1(value, param) {
|
|||
|
return value >= param[0] && value <= param[1];
|
|||
|
}
|
|||
|
function rangeLength(value, param) {
|
|||
|
return value.length >= param[0] && value.length <= param[1];
|
|||
|
}
|
|||
|
function landline(value) {
|
|||
|
const reg = /^\d{3,4}-\d{7,8}(-\d{3,4})?$/;
|
|||
|
return reg.test(value);
|
|||
|
}
|
|||
|
function empty(value) {
|
|||
|
switch (typeof value) {
|
|||
|
case "undefined":
|
|||
|
return true;
|
|||
|
case "string":
|
|||
|
if (value.replace(/(^[ \t\n\r]*)|([ \t\n\r]*$)/g, "").length == 0)
|
|||
|
return true;
|
|||
|
break;
|
|||
|
case "boolean":
|
|||
|
if (!value)
|
|||
|
return true;
|
|||
|
break;
|
|||
|
case "number":
|
|||
|
if (value === 0 || isNaN(value))
|
|||
|
return true;
|
|||
|
break;
|
|||
|
case "object":
|
|||
|
if (value === null || value.length === 0)
|
|||
|
return true;
|
|||
|
for (const i in value) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
return true;
|
|||
|
}
|
|||
|
return false;
|
|||
|
}
|
|||
|
function jsonString(value) {
|
|||
|
if (typeof value === "string") {
|
|||
|
try {
|
|||
|
const obj = JSON.parse(value);
|
|||
|
if (typeof obj === "object" && obj) {
|
|||
|
return true;
|
|||
|
}
|
|||
|
return false;
|
|||
|
} catch (e) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
return false;
|
|||
|
}
|
|||
|
function array(value) {
|
|||
|
if (typeof Array.isArray === "function") {
|
|||
|
return Array.isArray(value);
|
|||
|
}
|
|||
|
return Object.prototype.toString.call(value) === "[object Array]";
|
|||
|
}
|
|||
|
function object(value) {
|
|||
|
return Object.prototype.toString.call(value) === "[object Object]";
|
|||
|
}
|
|||
|
function code(value, len = 6) {
|
|||
|
return new RegExp(`^\\d{${len}}$`).test(value);
|
|||
|
}
|
|||
|
function func(value) {
|
|||
|
return typeof value === "function";
|
|||
|
}
|
|||
|
function promise(value) {
|
|||
|
return object(value) && func(value.then) && func(value.catch);
|
|||
|
}
|
|||
|
function image(value) {
|
|||
|
const newValue = value.split("?")[0];
|
|||
|
const IMAGE_REGEXP = /\.(jpeg|jpg|gif|png|svg|webp|jfif|bmp|dpg)/i;
|
|||
|
return IMAGE_REGEXP.test(newValue);
|
|||
|
}
|
|||
|
function video(value) {
|
|||
|
const VIDEO_REGEXP = /\.(mp4|mpg|mpeg|dat|asf|avi|rm|rmvb|mov|wmv|flv|mkv|m3u8)/i;
|
|||
|
return VIDEO_REGEXP.test(value);
|
|||
|
}
|
|||
|
function regExp(o) {
|
|||
|
return o && Object.prototype.toString.call(o) === "[object RegExp]";
|
|||
|
}
|
|||
|
const test = {
|
|||
|
email,
|
|||
|
mobile,
|
|||
|
url,
|
|||
|
date,
|
|||
|
dateISO,
|
|||
|
number,
|
|||
|
digits,
|
|||
|
idCard,
|
|||
|
carNo,
|
|||
|
amount,
|
|||
|
chinese,
|
|||
|
letter,
|
|||
|
enOrNum,
|
|||
|
contains,
|
|||
|
range: range$1,
|
|||
|
rangeLength,
|
|||
|
empty,
|
|||
|
isEmpty: empty,
|
|||
|
jsonString,
|
|||
|
landline,
|
|||
|
object,
|
|||
|
array,
|
|||
|
code,
|
|||
|
func,
|
|||
|
promise,
|
|||
|
video,
|
|||
|
image,
|
|||
|
regExp,
|
|||
|
string
|
|||
|
};
|
|||
|
let timeout = null;
|
|||
|
function debounce(func2, wait = 500, immediate = false) {
|
|||
|
if (timeout !== null)
|
|||
|
clearTimeout(timeout);
|
|||
|
if (immediate) {
|
|||
|
const callNow = !timeout;
|
|||
|
timeout = setTimeout(() => {
|
|||
|
timeout = null;
|
|||
|
}, wait);
|
|||
|
if (callNow)
|
|||
|
typeof func2 === "function" && func2();
|
|||
|
} else {
|
|||
|
timeout = setTimeout(() => {
|
|||
|
typeof func2 === "function" && func2();
|
|||
|
}, wait);
|
|||
|
}
|
|||
|
}
|
|||
|
let flag;
|
|||
|
function throttle(func2, wait = 500, immediate = true) {
|
|||
|
if (immediate) {
|
|||
|
if (!flag) {
|
|||
|
flag = true;
|
|||
|
typeof func2 === "function" && func2();
|
|||
|
setTimeout(() => {
|
|||
|
flag = false;
|
|||
|
}, wait);
|
|||
|
}
|
|||
|
} else if (!flag) {
|
|||
|
flag = true;
|
|||
|
setTimeout(() => {
|
|||
|
flag = false;
|
|||
|
typeof func2 === "function" && func2();
|
|||
|
}, wait);
|
|||
|
}
|
|||
|
}
|
|||
|
function strip(num, precision = 15) {
|
|||
|
return +parseFloat(Number(num).toPrecision(precision));
|
|||
|
}
|
|||
|
function digitLength(num) {
|
|||
|
const eSplit = num.toString().split(/[eE]/);
|
|||
|
const len = (eSplit[0].split(".")[1] || "").length - +(eSplit[1] || 0);
|
|||
|
return len > 0 ? len : 0;
|
|||
|
}
|
|||
|
function float2Fixed(num) {
|
|||
|
if (num.toString().indexOf("e") === -1) {
|
|||
|
return Number(num.toString().replace(".", ""));
|
|||
|
}
|
|||
|
const dLen = digitLength(num);
|
|||
|
return dLen > 0 ? strip(Number(num) * Math.pow(10, dLen)) : Number(num);
|
|||
|
}
|
|||
|
function checkBoundary(num) {
|
|||
|
{
|
|||
|
if (num > Number.MAX_SAFE_INTEGER || num < Number.MIN_SAFE_INTEGER) {
|
|||
|
formatAppLog("warn", "at node_modules/uview-plus/libs/function/digit.js:45", `${num} 超出了精度限制,结果可能不正确`);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
function iteratorOperation(arr, operation) {
|
|||
|
const [num1, num2, ...others] = arr;
|
|||
|
let res = operation(num1, num2);
|
|||
|
others.forEach((num) => {
|
|||
|
res = operation(res, num);
|
|||
|
});
|
|||
|
return res;
|
|||
|
}
|
|||
|
function times(...nums) {
|
|||
|
if (nums.length > 2) {
|
|||
|
return iteratorOperation(nums, times);
|
|||
|
}
|
|||
|
const [num1, num2] = nums;
|
|||
|
const num1Changed = float2Fixed(num1);
|
|||
|
const num2Changed = float2Fixed(num2);
|
|||
|
const baseNum = digitLength(num1) + digitLength(num2);
|
|||
|
const leftValue = num1Changed * num2Changed;
|
|||
|
checkBoundary(leftValue);
|
|||
|
return leftValue / Math.pow(10, baseNum);
|
|||
|
}
|
|||
|
function divide(...nums) {
|
|||
|
if (nums.length > 2) {
|
|||
|
return iteratorOperation(nums, divide);
|
|||
|
}
|
|||
|
const [num1, num2] = nums;
|
|||
|
const num1Changed = float2Fixed(num1);
|
|||
|
const num2Changed = float2Fixed(num2);
|
|||
|
checkBoundary(num1Changed);
|
|||
|
checkBoundary(num2Changed);
|
|||
|
return times(num1Changed / num2Changed, strip(Math.pow(10, digitLength(num2) - digitLength(num1))));
|
|||
|
}
|
|||
|
function round(num, ratio) {
|
|||
|
const base = Math.pow(10, ratio);
|
|||
|
let result = divide(Math.round(Math.abs(times(num, base))), base);
|
|||
|
if (num < 0 && result !== 0) {
|
|||
|
result = times(result, -1);
|
|||
|
}
|
|||
|
return result;
|
|||
|
}
|
|||
|
function range(min = 0, max = 0, value = 0) {
|
|||
|
return Math.max(min, Math.min(max, Number(value)));
|
|||
|
}
|
|||
|
function getPx(value, unit = false) {
|
|||
|
if (test.number(value)) {
|
|||
|
return unit ? `${value}px` : Number(value);
|
|||
|
}
|
|||
|
if (/(rpx|upx)$/.test(value)) {
|
|||
|
return unit ? `${uni.upx2px(parseInt(value))}px` : Number(uni.upx2px(parseInt(value)));
|
|||
|
}
|
|||
|
return unit ? `${parseInt(value)}px` : parseInt(value);
|
|||
|
}
|
|||
|
function sleep(value = 30) {
|
|||
|
return new Promise((resolve) => {
|
|||
|
setTimeout(() => {
|
|||
|
resolve();
|
|||
|
}, value);
|
|||
|
});
|
|||
|
}
|
|||
|
function os() {
|
|||
|
return uni.getSystemInfoSync().platform.toLowerCase();
|
|||
|
}
|
|||
|
function sys() {
|
|||
|
return uni.getSystemInfoSync();
|
|||
|
}
|
|||
|
function random(min, max) {
|
|||
|
if (min >= 0 && max > 0 && max >= min) {
|
|||
|
const gab = max - min + 1;
|
|||
|
return Math.floor(Math.random() * gab + min);
|
|||
|
}
|
|||
|
return 0;
|
|||
|
}
|
|||
|
function guid(len = 32, firstU = true, radix = null) {
|
|||
|
const chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split("");
|
|||
|
const uuid = [];
|
|||
|
radix = radix || chars.length;
|
|||
|
if (len) {
|
|||
|
for (let i = 0; i < len; i++)
|
|||
|
uuid[i] = chars[0 | Math.random() * radix];
|
|||
|
} else {
|
|||
|
let r;
|
|||
|
uuid[8] = uuid[13] = uuid[18] = uuid[23] = "-";
|
|||
|
uuid[14] = "4";
|
|||
|
for (let i = 0; i < 36; i++) {
|
|||
|
if (!uuid[i]) {
|
|||
|
r = 0 | Math.random() * 16;
|
|||
|
uuid[i] = chars[i == 19 ? r & 3 | 8 : r];
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
if (firstU) {
|
|||
|
uuid.shift();
|
|||
|
return `u${uuid.join("")}`;
|
|||
|
}
|
|||
|
return uuid.join("");
|
|||
|
}
|
|||
|
function $parent(name = void 0) {
|
|||
|
let parent = this.$parent;
|
|||
|
while (parent) {
|
|||
|
if (parent.$options && parent.$options.name !== name) {
|
|||
|
parent = parent.$parent;
|
|||
|
} else {
|
|||
|
return parent;
|
|||
|
}
|
|||
|
}
|
|||
|
return false;
|
|||
|
}
|
|||
|
function addStyle(customStyle, target = "object") {
|
|||
|
if (test.empty(customStyle) || typeof customStyle === "object" && target === "object" || target === "string" && typeof customStyle === "string") {
|
|||
|
return customStyle;
|
|||
|
}
|
|||
|
if (target === "object") {
|
|||
|
customStyle = trim(customStyle);
|
|||
|
const styleArray = customStyle.split(";");
|
|||
|
const style = {};
|
|||
|
for (let i = 0; i < styleArray.length; i++) {
|
|||
|
if (styleArray[i]) {
|
|||
|
const item = styleArray[i].split(":");
|
|||
|
style[trim(item[0])] = trim(item[1]);
|
|||
|
}
|
|||
|
}
|
|||
|
return style;
|
|||
|
}
|
|||
|
let string2 = "";
|
|||
|
for (const i in customStyle) {
|
|||
|
const key = i.replace(/([A-Z])/g, "-$1").toLowerCase();
|
|||
|
string2 += `${key}:${customStyle[i]};`;
|
|||
|
}
|
|||
|
return trim(string2);
|
|||
|
}
|
|||
|
function addUnit(value = "auto", unit = "") {
|
|||
|
if (!unit) {
|
|||
|
unit = uni.$u.config.unit || "px";
|
|||
|
}
|
|||
|
value = String(value);
|
|||
|
return test.number(value) ? `${value}${unit}` : value;
|
|||
|
}
|
|||
|
function deepClone(obj) {
|
|||
|
if ([null, void 0, NaN, false].includes(obj))
|
|||
|
return obj;
|
|||
|
if (typeof obj !== "object" && typeof obj !== "function") {
|
|||
|
return obj;
|
|||
|
}
|
|||
|
const o = test.array(obj) ? [] : {};
|
|||
|
for (const i in obj) {
|
|||
|
if (obj.hasOwnProperty(i)) {
|
|||
|
o[i] = typeof obj[i] === "object" ? deepClone(obj[i]) : obj[i];
|
|||
|
}
|
|||
|
}
|
|||
|
return o;
|
|||
|
}
|
|||
|
function deepMerge(target = {}, source = {}) {
|
|||
|
target = deepClone(target);
|
|||
|
if (typeof target !== "object" || typeof source !== "object")
|
|||
|
return false;
|
|||
|
for (const prop in source) {
|
|||
|
if (!source.hasOwnProperty(prop))
|
|||
|
continue;
|
|||
|
if (prop in target) {
|
|||
|
if (source[prop] == null) {
|
|||
|
target[prop] = source[prop];
|
|||
|
} else if (typeof target[prop] !== "object") {
|
|||
|
target[prop] = source[prop];
|
|||
|
} else if (typeof source[prop] !== "object") {
|
|||
|
target[prop] = source[prop];
|
|||
|
} else if (target[prop].concat && source[prop].concat) {
|
|||
|
target[prop] = target[prop].concat(source[prop]);
|
|||
|
} else {
|
|||
|
target[prop] = deepMerge(target[prop], source[prop]);
|
|||
|
}
|
|||
|
} else {
|
|||
|
target[prop] = source[prop];
|
|||
|
}
|
|||
|
}
|
|||
|
return target;
|
|||
|
}
|
|||
|
function error(err) {
|
|||
|
{
|
|||
|
formatAppLog("error", "at node_modules/uview-plus/libs/function/index.js:240", `uView提示:${err}`);
|
|||
|
}
|
|||
|
}
|
|||
|
function randomArray(array2 = []) {
|
|||
|
return array2.sort(() => Math.random() - 0.5);
|
|||
|
}
|
|||
|
if (!String.prototype.padStart) {
|
|||
|
String.prototype.padStart = function(maxLength, fillString = " ") {
|
|||
|
if (Object.prototype.toString.call(fillString) !== "[object String]") {
|
|||
|
throw new TypeError(
|
|||
|
"fillString must be String"
|
|||
|
);
|
|||
|
}
|
|||
|
const str = this;
|
|||
|
if (str.length >= maxLength)
|
|||
|
return String(str);
|
|||
|
const fillLength = maxLength - str.length;
|
|||
|
let times2 = Math.ceil(fillLength / fillString.length);
|
|||
|
while (times2 >>= 1) {
|
|||
|
fillString += fillString;
|
|||
|
if (times2 === 1) {
|
|||
|
fillString += fillString;
|
|||
|
}
|
|||
|
}
|
|||
|
return fillString.slice(0, fillLength) + str;
|
|||
|
};
|
|||
|
}
|
|||
|
function timeFormat(dateTime = null, formatStr = "yyyy-mm-dd") {
|
|||
|
let date2;
|
|||
|
if (!dateTime) {
|
|||
|
date2 = /* @__PURE__ */ new Date();
|
|||
|
} else if (/^\d{10}$/.test(dateTime.toString().trim())) {
|
|||
|
date2 = new Date(dateTime * 1e3);
|
|||
|
} else if (typeof dateTime === "string" && /^\d+$/.test(dateTime.trim())) {
|
|||
|
date2 = new Date(Number(dateTime));
|
|||
|
} else {
|
|||
|
date2 = new Date(
|
|||
|
typeof dateTime === "string" ? dateTime.replace(/-/g, "/") : dateTime
|
|||
|
);
|
|||
|
}
|
|||
|
const timeSource = {
|
|||
|
"y": date2.getFullYear().toString(),
|
|||
|
// 年
|
|||
|
"m": (date2.getMonth() + 1).toString().padStart(2, "0"),
|
|||
|
// 月
|
|||
|
"d": date2.getDate().toString().padStart(2, "0"),
|
|||
|
// 日
|
|||
|
"h": date2.getHours().toString().padStart(2, "0"),
|
|||
|
// 时
|
|||
|
"M": date2.getMinutes().toString().padStart(2, "0"),
|
|||
|
// 分
|
|||
|
"s": date2.getSeconds().toString().padStart(2, "0")
|
|||
|
// 秒
|
|||
|
// 有其他格式化字符需求可以继续添加,必须转化成字符串
|
|||
|
};
|
|||
|
for (const key in timeSource) {
|
|||
|
const [ret] = new RegExp(`${key}+`).exec(formatStr) || [];
|
|||
|
if (ret) {
|
|||
|
const beginIndex = key === "y" && ret.length === 2 ? 2 : 0;
|
|||
|
formatStr = formatStr.replace(ret, timeSource[key].slice(beginIndex));
|
|||
|
}
|
|||
|
}
|
|||
|
return formatStr;
|
|||
|
}
|
|||
|
function timeFrom(timestamp = null, format = "yyyy-mm-dd") {
|
|||
|
if (timestamp == null)
|
|||
|
timestamp = Number(/* @__PURE__ */ new Date());
|
|||
|
timestamp = parseInt(timestamp);
|
|||
|
if (timestamp.toString().length == 10)
|
|||
|
timestamp *= 1e3;
|
|||
|
let timer = (/* @__PURE__ */ new Date()).getTime() - timestamp;
|
|||
|
timer = parseInt(timer / 1e3);
|
|||
|
let tips = "";
|
|||
|
switch (true) {
|
|||
|
case timer < 300:
|
|||
|
tips = "刚刚";
|
|||
|
break;
|
|||
|
case (timer >= 300 && timer < 3600):
|
|||
|
tips = `${parseInt(timer / 60)}分钟前`;
|
|||
|
break;
|
|||
|
case (timer >= 3600 && timer < 86400):
|
|||
|
tips = `${parseInt(timer / 3600)}小时前`;
|
|||
|
break;
|
|||
|
case (timer >= 86400 && timer < 2592e3):
|
|||
|
tips = `${parseInt(timer / 86400)}天前`;
|
|||
|
break;
|
|||
|
default:
|
|||
|
if (format === false) {
|
|||
|
if (timer >= 2592e3 && timer < 365 * 86400) {
|
|||
|
tips = `${parseInt(timer / (86400 * 30))}个月前`;
|
|||
|
} else {
|
|||
|
tips = `${parseInt(timer / (86400 * 365))}年前`;
|
|||
|
}
|
|||
|
} else {
|
|||
|
tips = timeFormat(timestamp, format);
|
|||
|
}
|
|||
|
}
|
|||
|
return tips;
|
|||
|
}
|
|||
|
function trim(str, pos = "both") {
|
|||
|
str = String(str);
|
|||
|
if (pos == "both") {
|
|||
|
return str.replace(/^\s+|\s+$/g, "");
|
|||
|
}
|
|||
|
if (pos == "left") {
|
|||
|
return str.replace(/^\s*/, "");
|
|||
|
}
|
|||
|
if (pos == "right") {
|
|||
|
return str.replace(/(\s*$)/g, "");
|
|||
|
}
|
|||
|
if (pos == "all") {
|
|||
|
return str.replace(/\s+/g, "");
|
|||
|
}
|
|||
|
return str;
|
|||
|
}
|
|||
|
function queryParams(data = {}, isPrefix = true, arrayFormat = "brackets") {
|
|||
|
const prefix = isPrefix ? "?" : "";
|
|||
|
const _result = [];
|
|||
|
if (["indices", "brackets", "repeat", "comma"].indexOf(arrayFormat) == -1)
|
|||
|
arrayFormat = "brackets";
|
|||
|
for (const key in data) {
|
|||
|
const value = data[key];
|
|||
|
if (["", void 0, null].indexOf(value) >= 0) {
|
|||
|
continue;
|
|||
|
}
|
|||
|
if (value.constructor === Array) {
|
|||
|
switch (arrayFormat) {
|
|||
|
case "indices":
|
|||
|
for (let i = 0; i < value.length; i++) {
|
|||
|
_result.push(`${key}[${i}]=${value[i]}`);
|
|||
|
}
|
|||
|
break;
|
|||
|
case "brackets":
|
|||
|
value.forEach((_value) => {
|
|||
|
_result.push(`${key}[]=${_value}`);
|
|||
|
});
|
|||
|
break;
|
|||
|
case "repeat":
|
|||
|
value.forEach((_value) => {
|
|||
|
_result.push(`${key}=${_value}`);
|
|||
|
});
|
|||
|
break;
|
|||
|
case "comma":
|
|||
|
let commaStr = "";
|
|||
|
value.forEach((_value) => {
|
|||
|
commaStr += (commaStr ? "," : "") + _value;
|
|||
|
});
|
|||
|
_result.push(`${key}=${commaStr}`);
|
|||
|
break;
|
|||
|
default:
|
|||
|
value.forEach((_value) => {
|
|||
|
_result.push(`${key}[]=${_value}`);
|
|||
|
});
|
|||
|
}
|
|||
|
} else {
|
|||
|
_result.push(`${key}=${value}`);
|
|||
|
}
|
|||
|
}
|
|||
|
return _result.length ? prefix + _result.join("&") : "";
|
|||
|
}
|
|||
|
function toast(title, duration = 2e3) {
|
|||
|
uni.showToast({
|
|||
|
title: String(title),
|
|||
|
icon: "none",
|
|||
|
duration
|
|||
|
});
|
|||
|
}
|
|||
|
function type2icon(type = "success", fill = false) {
|
|||
|
if (["primary", "info", "error", "warning", "success"].indexOf(type) == -1)
|
|||
|
type = "success";
|
|||
|
let iconName = "";
|
|||
|
switch (type) {
|
|||
|
case "primary":
|
|||
|
iconName = "info-circle";
|
|||
|
break;
|
|||
|
case "info":
|
|||
|
iconName = "info-circle";
|
|||
|
break;
|
|||
|
case "error":
|
|||
|
iconName = "close-circle";
|
|||
|
break;
|
|||
|
case "warning":
|
|||
|
iconName = "error-circle";
|
|||
|
break;
|
|||
|
case "success":
|
|||
|
iconName = "checkmark-circle";
|
|||
|
break;
|
|||
|
default:
|
|||
|
iconName = "checkmark-circle";
|
|||
|
}
|
|||
|
if (fill)
|
|||
|
iconName += "-fill";
|
|||
|
return iconName;
|
|||
|
}
|
|||
|
function priceFormat(number2, decimals = 0, decimalPoint = ".", thousandsSeparator = ",") {
|
|||
|
number2 = `${number2}`.replace(/[^0-9+-Ee.]/g, "");
|
|||
|
const n = !isFinite(+number2) ? 0 : +number2;
|
|||
|
const prec = !isFinite(+decimals) ? 0 : Math.abs(decimals);
|
|||
|
const sep = typeof thousandsSeparator === "undefined" ? "," : thousandsSeparator;
|
|||
|
const dec = typeof decimalPoint === "undefined" ? "." : decimalPoint;
|
|||
|
let s = "";
|
|||
|
s = (prec ? round(n, prec) + "" : `${Math.round(n)}`).split(".");
|
|||
|
const re = /(-?\d+)(\d{3})/;
|
|||
|
while (re.test(s[0])) {
|
|||
|
s[0] = s[0].replace(re, `$1${sep}$2`);
|
|||
|
}
|
|||
|
if ((s[1] || "").length < prec) {
|
|||
|
s[1] = s[1] || "";
|
|||
|
s[1] += new Array(prec - s[1].length + 1).join("0");
|
|||
|
}
|
|||
|
return s.join(dec);
|
|||
|
}
|
|||
|
function getDuration(value, unit = true) {
|
|||
|
const valueNum = parseInt(value);
|
|||
|
if (unit) {
|
|||
|
if (/s$/.test(value))
|
|||
|
return value;
|
|||
|
return value > 30 ? `${value}ms` : `${value}s`;
|
|||
|
}
|
|||
|
if (/ms$/.test(value))
|
|||
|
return valueNum;
|
|||
|
if (/s$/.test(value))
|
|||
|
return valueNum > 30 ? valueNum : valueNum * 1e3;
|
|||
|
return valueNum;
|
|||
|
}
|
|||
|
function padZero(value) {
|
|||
|
return `00${value}`.slice(-2);
|
|||
|
}
|
|||
|
function formValidate(instance, event) {
|
|||
|
const formItem = uni.$u.$parent.call(instance, "u-form-item");
|
|||
|
const form = uni.$u.$parent.call(instance, "u-form");
|
|||
|
if (formItem && form) {
|
|||
|
form.validateField(formItem.prop, () => {
|
|||
|
}, event);
|
|||
|
}
|
|||
|
}
|
|||
|
function getProperty(obj, key) {
|
|||
|
if (!obj) {
|
|||
|
return;
|
|||
|
}
|
|||
|
if (typeof key !== "string" || key === "") {
|
|||
|
return "";
|
|||
|
}
|
|||
|
if (key.indexOf(".") !== -1) {
|
|||
|
const keys = key.split(".");
|
|||
|
let firstObj = obj[keys[0]] || {};
|
|||
|
for (let i = 1; i < keys.length; i++) {
|
|||
|
if (firstObj) {
|
|||
|
firstObj = firstObj[keys[i]];
|
|||
|
}
|
|||
|
}
|
|||
|
return firstObj;
|
|||
|
}
|
|||
|
return obj[key];
|
|||
|
}
|
|||
|
function setProperty(obj, key, value) {
|
|||
|
if (!obj) {
|
|||
|
return;
|
|||
|
}
|
|||
|
const inFn = function(_obj, keys, v) {
|
|||
|
if (keys.length === 1) {
|
|||
|
_obj[keys[0]] = v;
|
|||
|
return;
|
|||
|
}
|
|||
|
while (keys.length > 1) {
|
|||
|
const k = keys[0];
|
|||
|
if (!_obj[k] || typeof _obj[k] !== "object") {
|
|||
|
_obj[k] = {};
|
|||
|
}
|
|||
|
keys.shift();
|
|||
|
inFn(_obj[k], keys, v);
|
|||
|
}
|
|||
|
};
|
|||
|
if (typeof key !== "string" || key === "")
|
|||
|
;
|
|||
|
else if (key.indexOf(".") !== -1) {
|
|||
|
const keys = key.split(".");
|
|||
|
inFn(obj, keys, value);
|
|||
|
} else {
|
|||
|
obj[key] = value;
|
|||
|
}
|
|||
|
}
|
|||
|
function page() {
|
|||
|
const pages2 = getCurrentPages();
|
|||
|
return `/${pages2[pages2.length - 1].route || ""}`;
|
|||
|
}
|
|||
|
function pages() {
|
|||
|
const pages2 = getCurrentPages();
|
|||
|
return pages2;
|
|||
|
}
|
|||
|
function setConfig({
|
|||
|
props: props2 = {},
|
|||
|
config: config2 = {},
|
|||
|
color: color2 = {},
|
|||
|
zIndex: zIndex2 = {}
|
|||
|
}) {
|
|||
|
const {
|
|||
|
deepMerge: deepMerge2
|
|||
|
} = uni.$u;
|
|||
|
uni.$u.config = deepMerge2(uni.$u.config, config2);
|
|||
|
uni.$u.props = deepMerge2(uni.$u.props, props2);
|
|||
|
uni.$u.color = deepMerge2(uni.$u.color, color2);
|
|||
|
uni.$u.zIndex = deepMerge2(uni.$u.zIndex, zIndex2);
|
|||
|
}
|
|||
|
const index = {
|
|||
|
range,
|
|||
|
getPx,
|
|||
|
sleep,
|
|||
|
os,
|
|||
|
sys,
|
|||
|
random,
|
|||
|
guid,
|
|||
|
$parent,
|
|||
|
addStyle,
|
|||
|
addUnit,
|
|||
|
deepClone,
|
|||
|
deepMerge,
|
|||
|
error,
|
|||
|
randomArray,
|
|||
|
timeFormat,
|
|||
|
timeFrom,
|
|||
|
trim,
|
|||
|
queryParams,
|
|||
|
toast,
|
|||
|
type2icon,
|
|||
|
priceFormat,
|
|||
|
getDuration,
|
|||
|
padZero,
|
|||
|
formValidate,
|
|||
|
getProperty,
|
|||
|
setProperty,
|
|||
|
page,
|
|||
|
pages,
|
|||
|
setConfig
|
|||
|
};
|
|||
|
const zIndex = {
|
|||
|
toast: 10090,
|
|||
|
noNetwork: 10080,
|
|||
|
// popup包含popup,actionsheet,keyboard,picker的值
|
|||
|
popup: 10075,
|
|||
|
mask: 10070,
|
|||
|
navbar: 980,
|
|||
|
topTips: 975,
|
|||
|
sticky: 970,
|
|||
|
indexListSticky: 965
|
|||
|
};
|
|||
|
let platform = "none";
|
|||
|
platform = "vue3";
|
|||
|
platform = "plus";
|
|||
|
const platform$1 = platform;
|
|||
|
const $u = {
|
|||
|
route,
|
|||
|
date: index.timeFormat,
|
|||
|
// 另名date
|
|||
|
colorGradient: colorGradient$1.colorGradient,
|
|||
|
hexToRgb: colorGradient$1.hexToRgb,
|
|||
|
rgbToHex: colorGradient$1.rgbToHex,
|
|||
|
colorToRgba: colorGradient$1.colorToRgba,
|
|||
|
test,
|
|||
|
type: ["primary", "success", "error", "warning", "info"],
|
|||
|
http: new Request(),
|
|||
|
config: config$1,
|
|||
|
// uView配置信息相关,比如版本号
|
|||
|
zIndex,
|
|||
|
debounce,
|
|||
|
throttle,
|
|||
|
mixin,
|
|||
|
mpMixin,
|
|||
|
props: props$3,
|
|||
|
...index,
|
|||
|
color,
|
|||
|
platform: platform$1
|
|||
|
};
|
|||
|
uni.$u = $u;
|
|||
|
const install = (Vue2) => {
|
|||
|
Vue2.config.globalProperties.$u = $u;
|
|||
|
Vue2.config.globalProperties.$nextTick = (cb) => {
|
|||
|
cb();
|
|||
|
};
|
|||
|
Vue2.mixin(mixin);
|
|||
|
};
|
|||
|
const uviewPlus = {
|
|||
|
install
|
|||
|
};
|
|||
|
function createApp() {
|
|||
|
const app = vue.createVueApp(App);
|
|||
|
const pinia = createPinia();
|
|||
|
app.use(pinia);
|
|||
|
app.use(uviewPlus);
|
|||
|
return {
|
|||
|
app,
|
|||
|
pinia
|
|||
|
};
|
|||
|
}
|
|||
|
const { app: __app__, Vuex: __Vuex__, Pinia: __Pinia__ } = createApp();
|
|||
|
uni.Vuex = __Vuex__;
|
|||
|
uni.Pinia = __Pinia__;
|
|||
|
__app__.provide("__globalStyles", __uniConfig.styles);
|
|||
|
__app__._component.mpType = "app";
|
|||
|
__app__._component.render = () => {
|
|||
|
};
|
|||
|
__app__.mount("#app");
|
|||
|
})(Vue, uni.VueShared);
|