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) {
"use strict";
const _export_sfc = (sfc, props2) => {
const target = sfc.__vccOpts || sfc;
for (const [key, val] of props2) {
target[key] = val;
}
return target;
};
const _sfc_main$1q = {
__name: "index",
setup(__props, { expose: __expose }) {
__expose();
const expressOperations = vue.ref([
{
name: "中转签收",
path: "/pages/index/express/transfer-sign",
type: "primary"
},
{
name: "到仓签收",
path: "/pages/index/express/warehouse-sign",
type: "warning"
},
{
name: "重量修改",
path: "/pages/index/express/weight-modify",
type: "primary"
},
{
name: "快速验收",
path: "/pages/index/express/quick-check",
type: "warning"
},
{
name: "路由签收异常",
path: "/pages/index/express/route-exception",
type: "primary"
},
{
name: "快速拆包",
path: "/pages/index/express/quick-unpack",
type: "warning"
}
]);
const auditOperations = vue.ref([
{
name: "确认收货",
path: "/pages/index/audit/confirm-receipt",
type: "primary"
},
{
name: "扫书查单",
path: "/pages/index/audit/scan-order",
type: "warning"
},
{
name: "根据快递单或订单",
path: "/pages/index/audit/express-order",
type: "warning"
},
{
name: "根据发件人",
path: "/pages/index/audit/sender",
type: "primary"
}
]);
const wmsOperations = vue.ref([
{
name: "中等入库",
path: "/pages/index/wms/medium-in",
type: "primary"
},
{
name: "良品入库",
path: "/pages/index/wms/good-in",
type: "warning"
},
{
name: "次品入库",
path: "/pages/index/wms/secondary-in",
type: "primary"
},
{
name: "不良入库",
path: "/pages/index/wms/bad-in",
type: "warning"
},
{
name: "不良出库",
path: "/pages/index/wms/bad-out",
type: "primary"
},
{
name: "不良下架",
path: "/pages/index/wms/bad-off",
type: "warning"
},
{
name: "订单查询",
path: "/pages/index/wms/order-query",
type: "primary"
},
{
name: "库位订单",
path: "/pages/index/wms/location-order",
type: "warning"
},
{
name: "快速盘点",
path: "/pages/index/wms/speedy-check",
type: "primary",
span: 24
}
]);
const statisticsOperations = vue.ref([
{
name: "审核统计",
path: "/pages/index/statistics/audit",
type: "warning",
span: 24
},
{
name: "售后统计",
path: "/pages/index/statistics/after-sale",
type: "primary"
},
{
name: "打包统计",
path: "/pages/index/statistics/package",
type: "warning"
}
]);
const offlineOperations = vue.ref([
{
name: "线下核单",
path: "/pages/index/offline/check-order",
type: "primary"
},
{
name: "核单记录",
path: "/pages/index/offline/check-record",
type: "warning"
}
]);
const entryOperations = vue.ref([
{
name: "扫码查书",
path: "/pages/index/entry/scan-book",
type: "primary"
},
{
name: "录入书籍重量",
path: "/pages/index/entry/book-weight",
type: "warning"
}
]);
const handleNavigation = (path) => {
uni.navigateTo({
url: path,
fail: () => {
uni.showToast({
title: "页面跳转失败",
icon: "none"
});
}
});
};
const __returned__ = { expressOperations, auditOperations, wmsOperations, statisticsOperations, offlineOperations, entryOperations, handleNavigation, ref: vue.ref };
Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
return __returned__;
}
};
function _sfc_render$1p(_ctx, _cache, $props, $setup, $data, $options) {
return vue.openBlock(), vue.createElementBlock("view", { class: "operation-container" }, [
vue.createCommentVNode(" 快递操作区域 "),
vue.createElementVNode("view", { class: "section" }, [
vue.createElementVNode("view", { class: "section-title" }, "快递"),
vue.createElementVNode("view", { class: "grid-container" }, [
(vue.openBlock(true), vue.createElementBlock(
vue.Fragment,
null,
vue.renderList($setup.expressOperations, (item, index2) => {
return vue.openBlock(), vue.createElementBlock("view", {
key: index2,
class: vue.normalizeClass(["grid-item", item.type]),
onClick: ($event) => $setup.handleNavigation(item.path)
}, vue.toDisplayString(item.name), 11, ["onClick"]);
}),
128
/* KEYED_FRAGMENT */
))
])
]),
vue.createCommentVNode(" 审核操作区域 "),
vue.createElementVNode("view", { class: "section" }, [
vue.createElementVNode("view", { class: "section-title" }, "审核"),
vue.createElementVNode("view", { class: "grid-container" }, [
(vue.openBlock(true), vue.createElementBlock(
vue.Fragment,
null,
vue.renderList($setup.auditOperations, (item, index2) => {
return vue.openBlock(), vue.createElementBlock("view", {
key: index2,
class: vue.normalizeClass(["grid-item", item.type]),
onClick: ($event) => $setup.handleNavigation(item.path)
}, vue.toDisplayString(item.name), 11, ["onClick"]);
}),
128
/* KEYED_FRAGMENT */
))
])
]),
vue.createCommentVNode(" 统计操作区域 "),
vue.createElementVNode("view", { class: "section" }, [
vue.createElementVNode("view", { class: "section-title" }, "统计"),
vue.createElementVNode("view", { class: "grid-container" }, [
(vue.openBlock(true), vue.createElementBlock(
vue.Fragment,
null,
vue.renderList($setup.statisticsOperations, (item, index2) => {
return vue.openBlock(), vue.createElementBlock("view", {
key: index2,
class: vue.normalizeClass(["grid-item", item.type]),
onClick: ($event) => $setup.handleNavigation(item.path)
}, vue.toDisplayString(item.name), 11, ["onClick"]);
}),
128
/* KEYED_FRAGMENT */
))
])
]),
vue.createCommentVNode(" WMS操作区域 "),
vue.createElementVNode("view", { class: "section" }, [
vue.createElementVNode("view", { class: "section-title" }, "WMS操作"),
vue.createElementVNode("view", { class: "grid-container" }, [
(vue.openBlock(true), vue.createElementBlock(
vue.Fragment,
null,
vue.renderList($setup.wmsOperations, (item, index2) => {
return vue.openBlock(), vue.createElementBlock("view", {
key: index2,
class: vue.normalizeClass(["grid-item", item.type]),
onClick: ($event) => $setup.handleNavigation(item.path)
}, vue.toDisplayString(item.name), 11, ["onClick"]);
}),
128
/* KEYED_FRAGMENT */
))
])
]),
vue.createCommentVNode(" 线下核单 "),
vue.createElementVNode("view", { class: "section" }, [
vue.createElementVNode("view", { class: "section-title" }, "线下核单"),
vue.createElementVNode("view", { class: "grid-container" }, [
(vue.openBlock(true), vue.createElementBlock(
vue.Fragment,
null,
vue.renderList($setup.offlineOperations, (item, index2) => {
return vue.openBlock(), vue.createElementBlock("view", {
key: index2,
class: vue.normalizeClass(["grid-item", item.type]),
onClick: ($event) => $setup.handleNavigation(item.path)
}, vue.toDisplayString(item.name), 11, ["onClick"]);
}),
128
/* KEYED_FRAGMENT */
))
])
]),
vue.createCommentVNode(" 录入信息 "),
vue.createElementVNode("view", { class: "section" }, [
vue.createElementVNode("view", { class: "section-title" }, "录入信息"),
vue.createElementVNode("view", { class: "grid-container" }, [
(vue.openBlock(true), vue.createElementBlock(
vue.Fragment,
null,
vue.renderList($setup.entryOperations, (item, index2) => {
return vue.openBlock(), vue.createElementBlock("view", {
key: index2,
class: vue.normalizeClass(["grid-item", item.type]),
onClick: ($event) => $setup.handleNavigation(item.path)
}, vue.toDisplayString(item.name), 11, ["onClick"]);
}),
128
/* KEYED_FRAGMENT */
))
])
])
]);
}
const PagesIndexIndex = /* @__PURE__ */ _export_sfc(_sfc_main$1q, [["render", _sfc_render$1p], ["__scopeId", "data-v-1cf27b2a"], ["__file", "E:/书嗨项目/shuhi-app-fornt/pages/index/index.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 ON_SHOW = "onShow";
const ON_HIDE = "onHide";
const ON_LAUNCH = "onLaunch";
function requireNativePlugin(name) {
return weex.requireModule(name);
}
function formatAppLog(type2, filename, ...args) {
if (uni.__log__) {
uni.__log__(type2, filename, ...args);
} else {
console[type2].apply(console, [...args, filename]);
}
}
function resolveEasycom(component, easycom) {
return typeof component === "string" ? easycom : component;
}
const createHook = (lifecycle) => (hook, target = vue.getCurrentInstance()) => {
!vue.isInSSRComponentSetup && vue.injectHook(lifecycle, hook, target);
};
const onShow = /* @__PURE__ */ createHook(ON_SHOW);
const onHide = /* @__PURE__ */ createHook(ON_HIDE);
const onLaunch = /* @__PURE__ */ createHook(ON_LAUNCH);
const version = "3";
{
formatAppLog("log", "at uni_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 = {
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;
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;
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;
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,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"
}
};
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 drawer = {
// 抽屉组件
drawer: {
// 是否显示
show: false,
// 点击遮罩是否关闭
mask: true,
// // 是否显示关闭按钮
// closeBtn:true,
// 抽屉宽度
width: "40%",
// 抽屉位置
placement: "left",
// 权重
zIndex: 100
}
};
const props$x = {
...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,
...drawer
};
const props$w = {
props: {
// 图标类名
name: {
type: String,
default: props$x.icon.name
},
// 图标颜色,可接受主题色
color: {
type: String,
default: props$x.icon.color
},
// 字体大小,单位px
size: {
type: [String, Number],
default: props$x.icon.size
},
// 是否显示粗体
bold: {
type: Boolean,
default: props$x.icon.bold
},
// 点击图标的时候传递事件出去的index(用于区分点击了哪一个)
index: {
type: [String, Number],
default: props$x.icon.index
},
// 触摸图标时的类名
hoverClass: {
type: String,
default: props$x.icon.hoverClass
},
// 自定义扩展前缀,方便用户扩展自己的图标库
customPrefix: {
type: String,
default: props$x.icon.customPrefix
},
// 图标右边或者下面的文字
label: {
type: [String, Number],
default: props$x.icon.label
},
// label的位置,只能右边或者下边
labelPos: {
type: String,
default: props$x.icon.labelPos
},
// label的大小
labelSize: {
type: [String, Number],
default: props$x.icon.labelSize
},
// label的颜色
labelColor: {
type: String,
default: props$x.icon.labelColor
},
// label与图标的距离
space: {
type: [String, Number],
default: props$x.icon.space
},
// 图片的mode
imgMode: {
type: String,
default: props$x.icon.imgMode
},
// 用于显示图片小图标时,图片的宽度
width: {
type: [String, Number],
default: props$x.icon.width
},
// 用于显示图片小图标时,图片的高度
height: {
type: [String, Number],
default: props$x.icon.height
},
// 用于解决某些情况下,让图标垂直居中的用途
top: {
type: [String, Number],
default: props$x.icon.top
},
// 是否阻止事件传播
stop: {
type: Boolean,
default: props$x.icon.stop
}
}
};
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 _sfc_main$1p = {
name: "u-icon",
data() {
return {};
},
emits: ["click"],
mixins: [mpMixin, mixin, props$w],
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$1o(_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_0$a = /* @__PURE__ */ _export_sfc(_sfc_main$1p, [["render", _sfc_render$1o], ["__scopeId", "data-v-ac70166d"], ["__file", "E:/书嗨项目/shuhi-app-fornt/uni_modules/uview-plus/components/u-icon/u-icon.vue"]]);
const props$v = {
props: {
// 文字颜色
color: {
type: String,
default: props$x.link.color
},
// 字体大小,单位px
fontSize: {
type: [String, Number],
default: props$x.link.fontSize
},
// 是否显示下划线
underLine: {
type: Boolean,
default: props$x.link.underLine
},
// 要跳转的链接
href: {
type: String,
default: props$x.link.href
},
// 小程序中复制到粘贴板的提示语
mpTips: {
type: String,
default: props$x.link.mpTips
},
// 下划线颜色
lineColor: {
type: String,
default: props$x.link.lineColor
},
// 超链接的问题,不使用slot形式传入,是因为nvue下无法修改颜色
text: {
type: String,
default: props$x.link.text
}
}
};
const _sfc_main$1o = {
name: "u-link",
mixins: [mpMixin, mixin, props$v],
computed: {
linkStyle() {
const style = {
color: this.color,
fontSize: uni.$u.addUnit(this.fontSize),
// line-height设置为比字体大小多2px
lineHeight: uni.$u.addUnit(uni.$u.getPx(this.fontSize) + 2),
textDecoration: this.underLine ? "underline" : "none"
};
return style;
}
},
methods: {
openLink() {
plus.runtime.openURL(this.href);
this.$emit("click");
}
}
};
function _sfc_render$1n(_ctx, _cache, $props, $setup, $data, $options) {
return vue.openBlock(), vue.createElementBlock(
"text",
{
class: "u-link",
onClick: _cache[0] || (_cache[0] = vue.withModifiers((...args) => $options.openLink && $options.openLink(...args), ["stop"])),
style: vue.normalizeStyle([$options.linkStyle, _ctx.$u.addStyle(_ctx.customStyle)])
},
vue.toDisplayString(_ctx.text),
5
/* TEXT, STYLE */
);
}
const __easycom_1$9 = /* @__PURE__ */ _export_sfc(_sfc_main$1o, [["render", _sfc_render$1n], ["__scopeId", "data-v-12f6646d"], ["__file", "E:/书嗨项目/shuhi-app-fornt/uni_modules/uview-plus/components/u-link/u-link.vue"]]);
const value = {
computed: {
// 经处理后需要显示的值
value() {
const {
text,
mode,
format: format2,
href
} = this;
if (mode === "price") {
if (!/^\d+(\.\d+)?$/.test(text)) {
uni.$u.error("金额模式下,text参数需要为金额格式");
}
if (uni.$u.test.func(format2)) {
return format2(text);
}
return uni.$u.priceFormat(text, 2);
}
if (mode === "date") {
!uni.$u.test.date(text) && uni.$u.error("日期模式下,text参数需要为日期或时间戳格式");
if (uni.$u.test.func(format2)) {
return format2(text);
}
if (format2) {
return uni.$u.timeFormat(text, format2);
}
return uni.$u.timeFormat(text, "yyyy-mm-dd");
}
if (mode === "phone") {
if (uni.$u.test.func(format2)) {
return format2(text);
}
if (format2 === "encrypt") {
return `${text.substr(0, 3)}****${text.substr(7)}`;
}
return text;
}
if (mode === "name") {
!(typeof text === "string") && uni.$u.error("姓名模式下,text参数需要为字符串格式");
if (uni.$u.test.func(format2)) {
return format2(text);
}
if (format2 === "encrypt") {
return this.formatName(text);
}
return text;
}
if (mode === "link") {
!uni.$u.test.url(href) && uni.$u.error("超链接模式下,href参数需要为URL格式");
return text;
}
return text;
}
},
methods: {
// 默认的姓名脱敏规则
formatName(name) {
let value2 = "";
if (name.length === 2) {
value2 = name.substr(0, 1) + "*";
} else if (name.length > 2) {
let char = "";
for (let i = 0, len = name.length - 2; i < len; i++) {
char += "*";
}
value2 = name.substr(0, 1) + char + name.substr(-1, 1);
} else {
value2 = name;
}
return value2;
}
}
};
const props$u = {
props: {
// 主题颜色
type: {
type: String,
default: props$x.text.type
},
// 是否显示
show: {
type: Boolean,
default: props$x.text.show
},
// 显示的值
text: {
type: [String, Number],
default: props$x.text.text
},
// 前置图标
prefixIcon: {
type: String,
default: props$x.text.prefixIcon
},
// 后置图标
suffixIcon: {
type: String,
default: props$x.text.suffixIcon
},
// 文本处理的匹配模式
// text-普通文本,price-价格,phone-手机号,name-姓名,date-日期,link-超链接
mode: {
type: String,
default: props$x.text.mode
},
// mode=link下,配置的链接
href: {
type: String,
default: props$x.text.href
},
// 格式化规则
format: {
type: [String, Function],
default: props$x.text.format
},
// mode=phone时,点击文本是否拨打电话
call: {
type: Boolean,
default: props$x.text.call
},
// 小程序的打开方式
openType: {
type: String,
default: props$x.text.openType
},
// 是否粗体,默认normal
bold: {
type: Boolean,
default: props$x.text.bold
},
// 是否块状
block: {
type: Boolean,
default: props$x.text.block
},
// 文本显示的行数,如果设置,超出此行数,将会显示省略号
lines: {
type: [String, Number],
default: props$x.text.lines
},
// 文本颜色
color: {
type: String,
default: props$x.text.color
},
// 字体大小
size: {
type: [String, Number],
default: props$x.text.size
},
// 图标的样式
iconStyle: {
type: [Object, String],
default: props$x.text.iconStyle
},
// 文字装饰,下划线,中划线等,可选值 none|underline|line-through
decoration: {
tepe: String,
default: props$x.text.decoration
},
// 外边距,对象、字符串,数值形式均可
margin: {
type: [Object, String, Number],
default: props$x.text.margin
},
// 文本行高
lineHeight: {
type: [String, Number],
default: props$x.text.lineHeight
},
// 文本对齐方式,可选值left|center|right
align: {
type: String,
default: props$x.text.align
},
// 文字换行,可选值break-word|normal|anywhere
wordWrap: {
type: String,
default: props$x.text.wordWrap
}
}
};
const _sfc_main$1n = {
name: "u--text",
mixins: [mpMixin, mixin, value, props$u],
emits: ["click"],
computed: {
valueStyle() {
const style = {
textDecoration: this.decoration,
fontWeight: this.bold ? "bold" : "normal",
wordWrap: this.wordWrap,
fontSize: uni.$u.addUnit(this.size)
};
!this.type && (style.color = this.color);
this.isNvue && this.lines && (style.lines = this.lines);
this.lineHeight && (style.lineHeight = uni.$u.addUnit(this.lineHeight));
!this.isNvue && this.block && (style.display = "block");
return uni.$u.deepMerge(style, uni.$u.addStyle(this.customStyle));
},
isNvue() {
let nvue = false;
return nvue;
},
isMp() {
let mp = false;
return mp;
}
},
data() {
return {};
},
methods: {
clickHandler() {
if (this.call && this.mode === "phone") {
uni.makePhoneCall({
phoneNumber: this.text
});
}
this.$emit("click");
}
}
};
function _sfc_render$1m(_ctx, _cache, $props, $setup, $data, $options) {
const _component_u_icon = resolveEasycom(vue.resolveDynamicComponent("u-icon"), __easycom_0$a);
const _component_u_link = resolveEasycom(vue.resolveDynamicComponent("u-link"), __easycom_1$9);
return _ctx.show ? (vue.openBlock(), vue.createElementBlock(
"view",
{
key: 0,
class: vue.normalizeClass(["u-text", []]),
style: vue.normalizeStyle({
margin: _ctx.margin,
justifyContent: _ctx.align === "left" ? "flex-start" : _ctx.align === "center" ? "center" : "flex-end"
}),
onClick: _cache[6] || (_cache[6] = (...args) => $options.clickHandler && $options.clickHandler(...args))
},
[
_ctx.mode === "price" ? (vue.openBlock(), vue.createElementBlock(
"text",
{
key: 0,
class: vue.normalizeClass(["u-text__price", _ctx.type && `u-text__value--${_ctx.type}`]),
style: vue.normalizeStyle([$options.valueStyle])
},
"¥",
6
/* CLASS, STYLE */
)) : vue.createCommentVNode("v-if", true),
_ctx.prefixIcon ? (vue.openBlock(), vue.createElementBlock("view", {
key: 1,
class: "u-text__prefix-icon"
}, [
vue.createVNode(_component_u_icon, {
name: _ctx.prefixIcon,
customStyle: _ctx.$u.addStyle(_ctx.iconStyle)
}, null, 8, ["name", "customStyle"])
])) : vue.createCommentVNode("v-if", true),
_ctx.mode === "link" ? (vue.openBlock(), vue.createBlock(_component_u_link, {
key: 2,
text: _ctx.value,
href: _ctx.href,
underLine: ""
}, null, 8, ["text", "href"])) : _ctx.openType && $options.isMp ? (vue.openBlock(), vue.createElementBlock("button", {
key: 3,
class: "u-reset-button u-text__value",
style: vue.normalizeStyle([$options.valueStyle]),
"data-index": _ctx.index,
openType: _ctx.openType,
onGetuserinfo: _cache[0] || (_cache[0] = (...args) => _ctx.onGetUserInfo && _ctx.onGetUserInfo(...args)),
onContact: _cache[1] || (_cache[1] = (...args) => _ctx.onContact && _ctx.onContact(...args)),
onGetphonenumber: _cache[2] || (_cache[2] = (...args) => _ctx.onGetPhoneNumber && _ctx.onGetPhoneNumber(...args)),
onError: _cache[3] || (_cache[3] = (...args) => _ctx.onError && _ctx.onError(...args)),
onLaunchapp: _cache[4] || (_cache[4] = (...args) => _ctx.onLaunchApp && _ctx.onLaunchApp(...args)),
onOpensetting: _cache[5] || (_cache[5] = (...args) => _ctx.onOpenSetting && _ctx.onOpenSetting(...args)),
lang: _ctx.lang,
"session-from": _ctx.sessionFrom,
"send-message-title": _ctx.sendMessageTitle,
"send-message-path": _ctx.sendMessagePath,
"send-message-img": _ctx.sendMessageImg,
"show-message-card": _ctx.showMessageCard,
"app-parameter": _ctx.appParameter
}, vue.toDisplayString(_ctx.value), 45, ["data-index", "openType", "lang", "session-from", "send-message-title", "send-message-path", "send-message-img", "show-message-card", "app-parameter"])) : (vue.openBlock(), vue.createElementBlock(
"text",
{
key: 4,
class: vue.normalizeClass(["u-text__value", [
_ctx.type && `u-text__value--${_ctx.type}`,
_ctx.lines && `u-line-${_ctx.lines}`
]]),
style: vue.normalizeStyle([$options.valueStyle])
},
vue.toDisplayString(_ctx.value),
7
/* TEXT, CLASS, STYLE */
)),
_ctx.suffixIcon ? (vue.openBlock(), vue.createElementBlock("view", {
key: 5,
class: "u-text__suffix-icon"
}, [
vue.createVNode(_component_u_icon, {
name: _ctx.suffixIcon,
customStyle: _ctx.$u.addStyle(_ctx.iconStyle)
}, null, 8, ["name", "customStyle"])
])) : vue.createCommentVNode("v-if", true)
],
4
/* STYLE */
)) : vue.createCommentVNode("v-if", true);
}
const uvText = /* @__PURE__ */ _export_sfc(_sfc_main$1n, [["render", _sfc_render$1m], ["__scopeId", "data-v-0a574502"], ["__file", "E:/书嗨项目/shuhi-app-fornt/uni_modules/uview-plus/components/u-text/u-text.vue"]]);
const _sfc_main$1m = {
name: "u--text",
mixins: [mpMixin, mixin, props$u],
components: {
uvText
}
};
function _sfc_render$1l(_ctx, _cache, $props, $setup, $data, $options) {
const _component_uvText = vue.resolveComponent("uvText");
return vue.openBlock(), vue.createBlock(_component_uvText, {
type: _ctx.type,
show: _ctx.show,
text: _ctx.text,
prefixIcon: _ctx.prefixIcon,
suffixIcon: _ctx.suffixIcon,
mode: _ctx.mode,
href: _ctx.href,
format: _ctx.format,
call: _ctx.call,
openType: _ctx.openType,
bold: _ctx.bold,
block: _ctx.block,
lines: _ctx.lines,
color: _ctx.color,
decoration: _ctx.decoration,
size: _ctx.size,
iconStyle: _ctx.iconStyle,
margin: _ctx.margin,
lineHeight: _ctx.lineHeight,
align: _ctx.align,
wordWrap: _ctx.wordWrap,
customStyle: _ctx.customStyle
}, null, 8, ["type", "show", "text", "prefixIcon", "suffixIcon", "mode", "href", "format", "call", "openType", "bold", "block", "lines", "color", "decoration", "size", "iconStyle", "margin", "lineHeight", "align", "wordWrap", "customStyle"]);
}
const __easycom_1$8 = /* @__PURE__ */ _export_sfc(_sfc_main$1m, [["render", _sfc_render$1l], ["__file", "E:/书嗨项目/shuhi-app-fornt/uni_modules/uview-plus/components/u--text/u--text.vue"]]);
const props$t = {
props: {
// 头像图片路径(不能为相对路径)
src: {
type: String,
default: props$x.avatar.src
},
// 头像形状,circle-圆形,square-方形
shape: {
type: String,
default: props$x.avatar.shape
},
// 头像尺寸
size: {
type: [String, Number],
default: props$x.avatar.size
},
// 裁剪模式
mode: {
type: String,
default: props$x.avatar.mode
},
// 显示的文字
text: {
type: String,
default: props$x.avatar.text
},
// 背景色
bgColor: {
type: String,
default: props$x.avatar.bgColor
},
// 文字颜色
color: {
type: String,
default: props$x.avatar.color
},
// 文字大小
fontSize: {
type: [String, Number],
default: props$x.avatar.fontSize
},
// 显示的图标
icon: {
type: String,
default: props$x.avatar.icon
},
// 显示小程序头像,只对百度,微信,QQ小程序有效
mpAvatar: {
type: Boolean,
default: props$x.avatar.mpAvatar
},
// 是否使用随机背景色
randomBgColor: {
type: Boolean,
default: props$x.avatar.randomBgColor
},
// 加载失败的默认头像(组件有内置默认图片)
defaultUrl: {
type: String,
default: props$x.avatar.defaultUrl
},
// 如果配置了randomBgColor为true,且配置了此值,则从默认的背景色数组中取出对应索引的颜色值,取值0-19之间
colorIndex: {
type: [String, Number],
// 校验参数规则,索引在0-19之间
validator(n) {
return uni.$u.test.range(n, [0, 19]) || n === "";
},
default: props$x.avatar.colorIndex
},
// 组件标识符
name: {
type: String,
default: props$x.avatar.name
}
}
};
const base64Avatar = "data:image/jpg;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAAA8AAD/4QMraHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjMtYzAxMSA2Ni4xNDU2NjEsIDIwMTIvMDIvMDYtMTQ6NTY6MjcgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDUzYgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjREMEQwRkY0RjgwNDExRUE5OTY2RDgxODY3NkJFODMxIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjREMEQwRkY1RjgwNDExRUE5OTY2RDgxODY3NkJFODMxIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NEQwRDBGRjJGODA0MTFFQTk5NjZEODE4Njc2QkU4MzEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NEQwRDBGRjNGODA0MTFFQTk5NjZEODE4Njc2QkU4MzEiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7/7gAOQWRvYmUAZMAAAAAB/9sAhAAGBAQEBQQGBQUGCQYFBgkLCAYG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";
const _sfc_main$1l = {
name: "u-avatar",
mixins: [mpMixin, mixin, props$t],
data() {
return {
// 如果配置randomBgColor参数为true,在图标或者文字的模式下,会随机从中取出一个颜色值当做背景色
colors: [
"#ffb34b",
"#f2bba9",
"#f7a196",
"#f18080",
"#88a867",
"#bfbf39",
"#89c152",
"#94d554",
"#f19ec2",
"#afaae4",
"#e1b0df",
"#c38cc1",
"#72dcdc",
"#9acdcb",
"#77b1cc",
"#448aca",
"#86cefa",
"#98d1ee",
"#73d1f1",
"#80a7dc"
],
avatarUrl: this.src,
allowMp: false
};
},
watch: {
// 监听头像src的变化,赋值给内部的avatarUrl变量,因为图片加载失败时,需要修改图片的src为默认值
// 而组件内部不能直接修改props的值,所以需要一个中间变量
src: {
immediate: true,
handler(newVal) {
this.avatarUrl = newVal;
if (!newVal) {
this.errorHandler();
}
}
}
},
computed: {
imageStyle() {
const style = {};
return style;
}
},
created() {
this.init();
},
methods: {
init() {
},
// 判断传入的name属性,是否图片路径,只要带有"/"均认为是图片形式
isImg() {
return this.src.indexOf("/") !== -1;
},
// 图片加载时失败时触发
errorHandler() {
this.avatarUrl = this.defaultUrl || base64Avatar;
},
clickHandler() {
this.$emit("click", this.name);
}
}
};
function _sfc_render$1k(_ctx, _cache, $props, $setup, $data, $options) {
const _component_u_icon = resolveEasycom(vue.resolveDynamicComponent("u-icon"), __easycom_0$a);
const _component_u__text = resolveEasycom(vue.resolveDynamicComponent("u--text"), __easycom_1$8);
return vue.openBlock(), vue.createElementBlock(
"view",
{
class: vue.normalizeClass(["u-avatar", [`u-avatar--${_ctx.shape}`]]),
style: vue.normalizeStyle([{
backgroundColor: _ctx.text || _ctx.icon ? _ctx.randomBgColor ? $data.colors[_ctx.colorIndex !== "" ? _ctx.colorIndex : _ctx.$u.random(0, 19)] : _ctx.bgColor : "transparent",
width: _ctx.$u.addUnit(_ctx.size),
height: _ctx.$u.addUnit(_ctx.size)
}, _ctx.$u.addStyle(_ctx.customStyle)]),
onClick: _cache[1] || (_cache[1] = (...args) => $options.clickHandler && $options.clickHandler(...args))
},
[
vue.renderSlot(_ctx.$slots, "default", {}, () => [
_ctx.mpAvatar && $data.allowMp ? (vue.openBlock(), vue.createElementBlock(
vue.Fragment,
{ key: 0 },
[],
64
/* STABLE_FRAGMENT */
)) : _ctx.icon ? (vue.openBlock(), vue.createBlock(_component_u_icon, {
key: 1,
name: _ctx.icon,
size: _ctx.fontSize,
color: _ctx.color
}, null, 8, ["name", "size", "color"])) : _ctx.text ? (vue.openBlock(), vue.createBlock(_component_u__text, {
key: 2,
text: _ctx.text,
size: _ctx.fontSize,
color: _ctx.color,
align: "center",
customStyle: "justify-content: center"
}, null, 8, ["text", "size", "color"])) : (vue.openBlock(), vue.createElementBlock("image", {
key: 3,
class: vue.normalizeClass(["u-avatar__image", [`u-avatar__image--${_ctx.shape}`]]),
src: $data.avatarUrl || _ctx.defaultUrl,
mode: _ctx.mode,
onError: _cache[0] || (_cache[0] = (...args) => $options.errorHandler && $options.errorHandler(...args)),
style: vue.normalizeStyle([{
width: _ctx.$u.addUnit(_ctx.size),
height: _ctx.$u.addUnit(_ctx.size)
}])
}, null, 46, ["src", "mode"]))
], true)
],
6
/* CLASS, STYLE */
);
}
const __easycom_0$9 = /* @__PURE__ */ _export_sfc(_sfc_main$1l, [["render", _sfc_render$1k], ["__scopeId", "data-v-34d954f9"], ["__file", "E:/书嗨项目/shuhi-app-fornt/uni_modules/uview-plus/components/u-avatar/u-avatar.vue"]]);
const props$s = {
props: {
color: {
type: String,
default: props$x.line.color
},
// 长度,竖向时表现为高度,横向时表现为长度,可以为百分比,带px单位的值等
length: {
type: [String, Number],
default: props$x.line.length
},
// 线条方向,col-竖向,row-横向
direction: {
type: String,
default: props$x.line.direction
},
// 是否显示细边框
hairline: {
type: Boolean,
default: props$x.line.hairline
},
// 线条与上下左右元素的间距,字符串形式,如"30px"、"20px 30px"
margin: {
type: [String, Number],
default: props$x.line.margin
},
// 是否虚线,true-虚线,false-实线
dashed: {
type: Boolean,
default: props$x.line.dashed
}
}
};
const _sfc_main$1k = {
name: "u-line",
mixins: [mpMixin, mixin, props$s],
computed: {
lineStyle() {
const style = {};
style.margin = this.margin;
if (this.direction === "row") {
style.borderBottomWidth = "1px";
style.borderBottomStyle = this.dashed ? "dashed" : "solid";
style.width = uni.$u.addUnit(this.length);
if (this.hairline)
style.transform = "scaleY(0.5)";
} else {
style.borderLeftWidth = "1px";
style.borderLeftStyle = this.dashed ? "dashed" : "solid";
style.height = uni.$u.addUnit(this.length);
if (this.hairline)
style.transform = "scaleX(0.5)";
}
style.borderColor = this.color;
return uni.$u.deepMerge(style, uni.$u.addStyle(this.customStyle));
}
}
};
function _sfc_render$1j(_ctx, _cache, $props, $setup, $data, $options) {
return vue.openBlock(), vue.createElementBlock(
"view",
{
class: "u-line",
style: vue.normalizeStyle([$options.lineStyle])
},
null,
4
/* STYLE */
);
}
const __easycom_0$8 = /* @__PURE__ */ _export_sfc(_sfc_main$1k, [["render", _sfc_render$1j], ["__scopeId", "data-v-72791e59"], ["__file", "E:/书嗨项目/shuhi-app-fornt/uni_modules/uview-plus/components/u-line/u-line.vue"]]);
const props$r = {
props: {
// 标题
title: {
type: [String, Number],
default: props$x.cell.title
},
// 标题下方的描述信息
label: {
type: [String, Number],
default: props$x.cell.label
},
// 右侧的内容
value: {
type: [String, Number],
default: props$x.cell.value
},
// 左侧图标名称,或者图片链接(本地文件建议使用绝对地址)
icon: {
type: String,
default: props$x.cell.icon
},
// 是否禁用cell
disabled: {
type: Boolean,
default: props$x.cell.disabled
},
// 是否显示下边框
border: {
type: Boolean,
default: props$x.cell.border
},
// 内容是否垂直居中(主要是针对右侧的value部分)
center: {
type: Boolean,
default: props$x.cell.center
},
// 点击后跳转的URL地址
url: {
type: String,
default: props$x.cell.url
},
// 链接跳转的方式,内部使用的是uView封装的route方法,可能会进行拦截操作
linkType: {
type: String,
default: props$x.cell.linkType
},
// 是否开启点击反馈(表现为点击时加上灰色背景)
clickable: {
type: Boolean,
default: props$x.cell.clickable
},
// 是否展示右侧箭头并开启点击反馈
isLink: {
type: Boolean,
default: props$x.cell.isLink
},
// 是否显示表单状态下的必填星号(此组件可能会内嵌入input组件)
required: {
type: Boolean,
default: props$x.cell.required
},
// 右侧的图标箭头
rightIcon: {
type: String,
default: props$x.cell.rightIcon
},
// 右侧箭头的方向,可选值为:left,up,down
arrowDirection: {
type: String,
default: props$x.cell.arrowDirection
},
// 左侧图标样式
iconStyle: {
type: [Object, String],
default: () => {
return uni.$u.props.cell.iconStyle;
}
},
// 右侧箭头图标的样式
rightIconStyle: {
type: [Object, String],
default: () => {
return uni.$u.props.cell.rightIconStyle;
}
},
// 标题的样式
titleStyle: {
type: [Object, String],
default: () => {
return uni.$u.props.cell.titleStyle;
}
},
// 单位元的大小,可选值为large
size: {
type: String,
default: props$x.cell.size
},
// 点击cell是否阻止事件传播
stop: {
type: Boolean,
default: props$x.cell.stop
},
// 标识符,cell被点击时返回
name: {
type: [Number, String],
default: props$x.cell.name
}
}
};
const _sfc_main$1j = {
name: "u-cell",
data() {
return {};
},
mixins: [mpMixin, mixin, props$r],
computed: {
titleTextStyle() {
return uni.$u.addStyle(this.titleStyle);
}
},
emits: ["click"],
methods: {
// 点击cell
clickHandler(e) {
if (this.disabled)
return;
this.$emit("click", {
name: this.name
});
this.openPage();
this.stop && this.preventEvent(e);
}
}
};
function _sfc_render$1i(_ctx, _cache, $props, $setup, $data, $options) {
const _component_u_icon = resolveEasycom(vue.resolveDynamicComponent("u-icon"), __easycom_0$a);
const _component_u_line = resolveEasycom(vue.resolveDynamicComponent("u-line"), __easycom_0$8);
return vue.openBlock(), vue.createElementBlock("view", {
class: vue.normalizeClass(["u-cell", [_ctx.customClass]]),
style: vue.normalizeStyle([_ctx.$u.addStyle(_ctx.customStyle)]),
"hover-class": !_ctx.disabled && (_ctx.clickable || _ctx.isLink) ? "u-cell--clickable" : "",
"hover-stay-time": 250,
onClick: _cache[0] || (_cache[0] = (...args) => $options.clickHandler && $options.clickHandler(...args))
}, [
vue.createElementVNode(
"view",
{
class: vue.normalizeClass(["u-cell__body", [_ctx.center && "u-cell--center", _ctx.size === "large" && "u-cell__body--large"]])
},
[
vue.createElementVNode("view", { class: "u-cell__body__content" }, [
vue.createElementVNode("view", { class: "u-cell__left-icon-wrap" }, [
vue.renderSlot(_ctx.$slots, "icon", {}, () => [
_ctx.icon ? (vue.openBlock(), vue.createBlock(_component_u_icon, {
key: 0,
name: _ctx.icon,
"custom-style": _ctx.iconStyle,
size: _ctx.size === "large" ? 22 : 18
}, null, 8, ["name", "custom-style", "size"])) : vue.createCommentVNode("v-if", true)
], true)
]),
vue.createElementVNode("view", { class: "u-cell__title" }, [
vue.renderSlot(_ctx.$slots, "title", {}, () => [
_ctx.title ? (vue.openBlock(), vue.createElementBlock(
"text",
{
key: 0,
class: vue.normalizeClass(["u-cell__title-text", [_ctx.disabled && "u-cell--disabled", _ctx.size === "large" && "u-cell__title-text--large"]]),
style: vue.normalizeStyle([$options.titleTextStyle])
},
vue.toDisplayString(_ctx.title),
7
/* TEXT, CLASS, STYLE */
)) : vue.createCommentVNode("v-if", true)
], true),
vue.renderSlot(_ctx.$slots, "label", {}, () => [
_ctx.label ? (vue.openBlock(), vue.createElementBlock(
"text",
{
key: 0,
class: vue.normalizeClass(["u-cell__label", [_ctx.disabled && "u-cell--disabled", _ctx.size === "large" && "u-cell__label--large"]])
},
vue.toDisplayString(_ctx.label),
3
/* TEXT, CLASS */
)) : vue.createCommentVNode("v-if", true)
], true)
])
]),
vue.renderSlot(_ctx.$slots, "value", {}, () => [
!_ctx.$u.test.empty(_ctx.value) ? (vue.openBlock(), vue.createElementBlock(
"text",
{
key: 0,
class: vue.normalizeClass(["u-cell__value", [_ctx.disabled && "u-cell--disabled", _ctx.size === "large" && "u-cell__value--large"]])
},
vue.toDisplayString(_ctx.value),
3
/* TEXT, CLASS */
)) : vue.createCommentVNode("v-if", true)
], true),
vue.createElementVNode(
"view",
{
class: vue.normalizeClass(["u-cell__right-icon-wrap", [`u-cell__right-icon-wrap--${_ctx.arrowDirection}`]])
},
[
vue.renderSlot(_ctx.$slots, "right-icon", {}, () => [
_ctx.isLink ? (vue.openBlock(), vue.createBlock(_component_u_icon, {
key: 0,
name: _ctx.rightIcon,
"custom-style": _ctx.rightIconStyle,
color: _ctx.disabled ? "#c8c9cc" : "info",
size: _ctx.size === "large" ? 18 : 16
}, null, 8, ["name", "custom-style", "color", "size"])) : vue.createCommentVNode("v-if", true)
], true)
],
2
/* CLASS */
)
],
2
/* CLASS */
),
_ctx.border ? (vue.openBlock(), vue.createBlock(_component_u_line, { key: 0 })) : vue.createCommentVNode("v-if", true)
], 14, ["hover-class"]);
}
const __easycom_1$7 = /* @__PURE__ */ _export_sfc(_sfc_main$1j, [["render", _sfc_render$1i], ["__scopeId", "data-v-3fd6feca"], ["__file", "E:/书嗨项目/shuhi-app-fornt/uni_modules/uview-plus/components/u-cell/u-cell.vue"]]);
const props$q = {
props: {
// 分组标题
title: {
type: String,
default: props$x.cellGroup.title
},
// 是否显示外边框
border: {
type: Boolean,
default: props$x.cellGroup.border
}
}
};
const _sfc_main$1i = {
name: "u-cell-group",
mixins: [mpMixin, mixin, props$q]
};
function _sfc_render$1h(_ctx, _cache, $props, $setup, $data, $options) {
const _component_u_line = resolveEasycom(vue.resolveDynamicComponent("u-line"), __easycom_0$8);
return vue.openBlock(), vue.createElementBlock(
"view",
{
style: vue.normalizeStyle([_ctx.$u.addStyle(_ctx.customStyle)]),
class: vue.normalizeClass([[_ctx.customClass], "u-cell-group"])
},
[
_ctx.title ? (vue.openBlock(), vue.createElementBlock("view", {
key: 0,
class: "u-cell-group__title"
}, [
vue.renderSlot(_ctx.$slots, "title", {}, () => [
vue.createElementVNode(
"text",
{ class: "u-cell-group__title__text" },
vue.toDisplayString(_ctx.title),
1
/* TEXT */
)
], true)
])) : vue.createCommentVNode("v-if", true),
vue.createElementVNode("view", { class: "u-cell-group__wrapper" }, [
_ctx.border ? (vue.openBlock(), vue.createBlock(_component_u_line, { key: 0 })) : vue.createCommentVNode("v-if", true),
vue.renderSlot(_ctx.$slots, "default", {}, void 0, true)
])
],
6
/* CLASS, STYLE */
);
}
const __easycom_2$6 = /* @__PURE__ */ _export_sfc(_sfc_main$1i, [["render", _sfc_render$1h], ["__scopeId", "data-v-014d39dc"], ["__file", "E:/书嗨项目/shuhi-app-fornt/uni_modules/uview-plus/components/u-cell-group/u-cell-group.vue"]]);
const _sfc_main$1h = {
__name: "my",
setup(__props, { expose: __expose }) {
__expose();
const settingsList = vue.ref([
{
title: "用户信息",
path: "/pages/my/page/user-info",
icon: "account"
},
{
title: "默认仓库",
path: "/pages/my/page/warehouse",
icon: "home"
},
{
title: "学校设置",
path: "/pages/my/page/school"
},
{
title: "审核未完成",
path: "/pages/my/page/audit-unfinished",
icon: "order"
},
{
title: "版本设置",
path: "/pages/my/page/version",
icon: "tags"
},
{
title: "音频设置",
path: "/pages/my/page/volume",
icon: "volume"
},
{
title: "图书显示设置",
path: "/pages/my/page/book-display",
icon: "bookmark"
},
{
title: "修改密码",
icon: "lock",
path: "/pages/my/page/password"
},
{
title: "退出账号",
path: "/pages/my/page/logout",
type: "logout"
}
]);
const handleClick = (item) => {
if (item.type === "logout") {
uni.showModal({
title: "提示",
content: "确定要退出登录吗?",
success: (res) => {
if (res.confirm) {
uni.clearStorageSync();
uni.reLaunch({
url: "/pages/login/index"
});
}
}
});
return;
}
uni.navigateTo({
url: item.path
});
};
const __returned__ = { settingsList, handleClick, ref: vue.ref };
Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
return __returned__;
}
};
function _sfc_render$1g(_ctx, _cache, $props, $setup, $data, $options) {
const _component_u_avatar = resolveEasycom(vue.resolveDynamicComponent("u-avatar"), __easycom_0$9);
const _component_u_icon = resolveEasycom(vue.resolveDynamicComponent("u-icon"), __easycom_0$a);
const _component_u_cell = resolveEasycom(vue.resolveDynamicComponent("u-cell"), __easycom_1$7);
const _component_u_cell_group = resolveEasycom(vue.resolveDynamicComponent("u-cell-group"), __easycom_2$6);
return vue.openBlock(), vue.createElementBlock("view", { class: "settings-page" }, [
vue.createCommentVNode(" 顶部用户信息 "),
vue.createElementVNode("view", { class: "user-header" }, [
vue.createElementVNode("view", { class: "user-info" }, [
vue.createVNode(_component_u_avatar, {
size: 50,
src: "https://img20.360buyimg.com/da/jfs/t1/141592/25/8861/261559/5f68d8c1E33ed78ab/698ad655bfcfbaed.png"
}),
vue.createElementVNode("view", { class: "greeting" }, [
vue.createElementVNode("text", { class: "time" }, "下午好!"),
vue.createElementVNode("text", { class: "name" }, "涨涨涨")
])
])
]),
vue.createCommentVNode(" 设置列表 "),
vue.createElementVNode("view", { class: "settings-list" }, [
vue.createVNode(_component_u_cell_group, { border: false }, {
default: vue.withCtx(() => [
(vue.openBlock(true), vue.createElementBlock(
vue.Fragment,
null,
vue.renderList($setup.settingsList, (item, index2) => {
return vue.openBlock(), vue.createBlock(_component_u_cell, {
key: index2,
title: item.title,
isLink: true,
onClick: ($event) => $setup.handleClick(item),
border: index2 == $setup.settingsList.length - 1 ? false : true
}, {
icon: vue.withCtx(() => [
vue.createElementVNode("view", { class: "cell-icon" }, [
vue.createVNode(_component_u_icon, {
name: item.icon || "setting",
size: "32rpx",
color: "#333"
}, null, 8, ["name"])
])
]),
_: 2
/* DYNAMIC */
}, 1032, ["title", "onClick", "border"]);
}),
128
/* KEYED_FRAGMENT */
))
]),
_: 1
/* STABLE */
})
])
]);
}
const PagesMyMy = /* @__PURE__ */ _export_sfc(_sfc_main$1h, [["render", _sfc_render$1g], ["__scopeId", "data-v-2f1ef635"], ["__file", "E:/书嗨项目/shuhi-app-fornt/pages/my/my.vue"]]);
const GlobalOption = {
down: {
// 其他down的配置参数也可以写,这里只展示了常用的配置:
offset: 80,
// 在列表顶部,下拉大于80px,松手即可触发下拉刷新的回调
native: false
// 是否使用系统自带的下拉刷新; 默认false; 仅在mescroll-body生效 (值为true时,还需在pages配置enablePullDownRefresh:true;详请参考mescroll-native的案例)
},
up: {
// 其他up的配置参数也可以写,这里只展示了常用的配置:
offset: 150,
// 距底部多远时,触发upCallback,仅mescroll-uni生效 ( mescroll-body配置的是pages.json的 onReachBottomDistance )
toTop: {
// 回到顶部按钮,需配置src才显示
src: "https://www.mescroll.com/img/mescroll-totop.png",
// 图片路径 (建议放入static目录, 如 /static/img/mescroll-totop.png )
offset: 1e3,
// 列表滚动多少距离才显示回到顶部按钮,默认1000px
right: 20,
// 到右边的距离, 默认20 (支持"20rpx", "20px", "20%"格式的值, 纯数字则默认单位rpx)
bottom: 120,
// 到底部的距离, 默认120 (支持"20rpx", "20px", "20%"格式的值, 纯数字则默认单位rpx)
width: 72
// 回到顶部图标的宽度, 默认72 (支持"20rpx", "20px", "20%"格式的值, 纯数字则默认单位rpx)
},
empty: {
use: true,
// 是否显示空布局
icon: "https://www.mescroll.com/img/mescroll-empty.png"
// 图标路径 (建议放入static目录, 如 /static/img/mescroll-empty.png )
}
},
// 国际化配置
i18n: {
// 中文
zh: {
down: {
textInOffset: "下拉刷新",
// 下拉的距离在offset范围内的提示文本
textOutOffset: "释放更新",
// 下拉的距离大于offset范围的提示文本
textLoading: "加载中 ...",
// 加载中的提示文本
textSuccess: "加载成功",
// 加载成功的文本
textErr: "加载失败"
// 加载失败的文本
},
up: {
textLoading: "加载中 ...",
// 加载中的提示文本
textNoMore: "-- END --",
// 没有更多数据的提示文本
empty: {
tip: "暂无数据"
// 空提示
}
}
},
// 英文
en: {
down: {
textInOffset: "drop down refresh",
textOutOffset: "release updates",
textLoading: "loading ...",
textSuccess: "loaded successfully",
textErr: "loading failed"
},
up: {
textLoading: "loading ...",
textNoMore: "-- END --",
empty: {
tip: "~ absolutely empty ~"
}
}
}
}
};
const mescrollI18n = {
// 默认语言
def: "zh",
// 获取当前语言类型
getType() {
return uni.getStorageSync("mescroll-i18n") || this.def;
},
// 设置当前语言类型
setType(type2) {
uni.setStorageSync("mescroll-i18n", type2);
}
};
const _imports_0 = "/assets/no-result.6af066e5.png";
const _sfc_main$1g = {
props: {
// empty的配置项: 默认为GlobalOption.up.empty
option: {
type: Object,
default() {
return {};
}
}
},
// 使用computed获取配置,用于支持option的动态配置
computed: {
// 图标
icon() {
if (this.option.icon != null) {
return this.option.icon;
} else {
let i18nType = mescrollI18n.getType();
if (this.option.i18n) {
return this.option.i18n[i18nType].icon;
} else {
return GlobalOption.i18n[i18nType].up.empty.icon || GlobalOption.up.empty.icon;
}
}
},
// 文本提示
tip() {
if (this.option.tip != null) {
return this.option.tip;
} else {
let i18nType = mescrollI18n.getType();
if (this.option.i18n) {
return this.option.i18n[i18nType].tip;
} else {
return GlobalOption.i18n[i18nType].up.empty.tip || GlobalOption.up.empty.tip;
}
}
},
// 按钮文本
btnText() {
if (this.option.i18n) {
let i18nType = mescrollI18n.getType();
return this.option.i18n[i18nType].btnText;
} else {
return this.option.btnText;
}
}
},
methods: {
// 点击按钮
emptyClick() {
this.$emit("emptyclick");
}
}
};
function _sfc_render$1f(_ctx, _cache, $props, $setup, $data, $options) {
return vue.openBlock(), vue.createElementBlock(
"view",
{
class: vue.normalizeClass(["mescroll-empty", { "empty-fixed": $props.option.fixed }]),
style: vue.normalizeStyle({ "z-index": $props.option.zIndex, top: $props.option.top })
},
[
vue.createCommentVNode(' '),
vue.createElementVNode("view", null, [
$options.icon ? (vue.openBlock(), vue.createElementBlock("image", {
key: 0,
class: "empty-icon",
src: _imports_0,
mode: "widthFix"
})) : vue.createCommentVNode("v-if", true)
]),
$options.tip ? (vue.openBlock(), vue.createElementBlock(
"view",
{
key: 0,
class: "empty-tip"
},
vue.toDisplayString($options.tip),
1
/* TEXT */
)) : vue.createCommentVNode("v-if", true),
$options.btnText ? (vue.openBlock(), vue.createElementBlock(
"view",
{
key: 1,
class: "empty-btn",
onClick: _cache[0] || (_cache[0] = (...args) => $options.emptyClick && $options.emptyClick(...args))
},
vue.toDisplayString($options.btnText),
1
/* TEXT */
)) : vue.createCommentVNode("v-if", true)
],
6
/* CLASS, STYLE */
);
}
const __easycom_0$7 = /* @__PURE__ */ _export_sfc(_sfc_main$1g, [["render", _sfc_render$1f], ["__scopeId", "data-v-7cefd855"], ["__file", "E:/书嗨项目/shuhi-app-fornt/uni_modules/mescroll-uni/components/mescroll-empty/mescroll-empty.vue"]]);
function MeScroll(options, isScrollBody) {
let me = this;
me.version = "1.3.7";
me.options = options || {};
me.isScrollBody = isScrollBody || false;
me.isDownScrolling = false;
me.isUpScrolling = false;
let hasDownCallback = me.options.down && me.options.down.callback;
me.initDownScroll();
me.initUpScroll();
setTimeout(function() {
if ((me.optDown.use || me.optDown.native) && me.optDown.auto && hasDownCallback) {
if (me.optDown.autoShowLoading) {
me.triggerDownScroll();
} else {
me.optDown.callback && me.optDown.callback(me);
}
}
if (!me.isUpAutoLoad) {
setTimeout(function() {
me.optUp.use && me.optUp.auto && !me.isUpAutoLoad && me.triggerUpScroll();
}, 100);
}
}, 30);
}
MeScroll.prototype.extendDownScroll = function(optDown) {
MeScroll.extend(optDown, {
use: true,
// 是否启用下拉刷新; 默认true
auto: true,
// 是否在初始化完毕之后自动执行下拉刷新的回调; 默认true
native: false,
// 是否使用系统自带的下拉刷新; 默认false; 仅mescroll-body生效 (值为true时,还需在pages配置enablePullDownRefresh:true;详请参考mescroll-native的案例)
autoShowLoading: false,
// 如果设置auto=true(在初始化完毕之后自动执行下拉刷新的回调),那么是否显示下拉刷新的进度; 默认false
isLock: false,
// 是否锁定下拉刷新,默认false;
offset: 80,
// 在列表顶部,下拉大于80px,松手即可触发下拉刷新的回调
startTop: 100,
// scroll-view快速滚动到顶部时,此时的scroll-top可能大于0, 此值用于控制最大的误差
inOffsetRate: 1,
// 在列表顶部,下拉的距离小于offset时,改变下拉区域高度比例;值小于1且越接近0,高度变化越小,表现为越往下越难拉
outOffsetRate: 0.2,
// 在列表顶部,下拉的距离大于offset时,改变下拉区域高度比例;值小于1且越接近0,高度变化越小,表现为越往下越难拉
bottomOffset: 20,
// 当手指touchmove位置在距离body底部20px范围内的时候结束上拉刷新,避免Webview嵌套导致touchend事件不执行
minAngle: 45,
// 向下滑动最少偏移的角度,取值区间 [0,90];默认45度,即向下滑动的角度大于45度则触发下拉;而小于45度,将不触发下拉,避免与左右滑动的轮播等组件冲突;
textInOffset: "下拉刷新",
// 下拉的距离在offset范围内的提示文本
textOutOffset: "释放更新",
// 下拉的距离大于offset范围的提示文本
textLoading: "加载中 ...",
// 加载中的提示文本
textSuccess: "加载成功",
// 加载成功的文本
textErr: "加载失败",
// 加载失败的文本
beforeEndDelay: 0,
// 延时结束的时长 (显示加载成功/失败的时长, android小程序设置此项结束下拉会卡顿, 配置后请注意测试)
bgColor: "transparent",
// 背景颜色 (建议在pages.json中再设置一下backgroundColorTop)
textColor: "gray",
// 文本颜色 (当bgColor配置了颜色,而textColor未配置时,则textColor会默认为白色)
inited: null,
// 下拉刷新初始化完毕的回调
inOffset: null,
// 下拉的距离进入offset范围内那一刻的回调
outOffset: null,
// 下拉的距离大于offset那一刻的回调
onMoving: null,
// 下拉过程中的回调,滑动过程一直在执行; rate下拉区域当前高度与指定距离的比值(inOffset: rate<1; outOffset: rate>=1); downHight当前下拉区域的高度
beforeLoading: null,
// 准备触发下拉刷新的回调: 如果return true,将不触发showLoading和callback回调; 常用来完全自定义下拉刷新, 参考案例【淘宝 v6.8.0】
showLoading: null,
// 显示下拉刷新进度的回调
afterLoading: null,
// 显示下拉刷新进度的回调之后,马上要执行的代码 (如: 在wxs中使用)
beforeEndDownScroll: null,
// 准备结束下拉的回调. 返回结束下拉的延时执行时间,默认0ms; 常用于结束下拉之前再显示另外一小段动画,才去隐藏下拉刷新的场景, 参考案例【dotJump】
endDownScroll: null,
// 结束下拉刷新的回调
afterEndDownScroll: null,
// 结束下拉刷新的回调,马上要执行的代码 (如: 在wxs中使用)
callback: function(mescroll) {
mescroll.resetUpScroll();
}
});
};
MeScroll.prototype.extendUpScroll = function(optUp) {
MeScroll.extend(optUp, {
use: true,
// 是否启用上拉加载; 默认true
auto: true,
// 是否在初始化完毕之后自动执行上拉加载的回调; 默认true
isLock: false,
// 是否锁定上拉加载,默认false;
isBoth: true,
// 上拉加载时,如果滑动到列表顶部是否可以同时触发下拉刷新;默认true,两者可同时触发;
callback: null,
// 上拉加载的回调;function(page,mescroll){ }
page: {
num: 0,
// 当前页码,默认0,回调之前会加1,即callback(page)会从1开始
size: 10,
// 每页数据的数量
time: null
// 加载第一页数据服务器返回的时间; 防止用户翻页时,后台新增了数据从而导致下一页数据重复;
},
noMoreSize: 5,
// 如果列表已无数据,可设置列表的总数量要大于等于5条才显示无更多数据;避免列表数据过少(比如只有一条数据),显示无更多数据会不好看
offset: 150,
// 距底部多远时,触发upCallback,仅mescroll-uni生效 ( mescroll-body配置的是pages.json的 onReachBottomDistance )
textLoading: "加载中 ...",
// 加载中的提示文本
textNoMore: "-- END --",
// 没有更多数据的提示文本
bgColor: "transparent",
// 背景颜色 (建议在pages.json中再设置一下backgroundColorBottom)
textColor: "gray",
// 文本颜色 (当bgColor配置了颜色,而textColor未配置时,则textColor会默认为白色)
inited: null,
// 初始化完毕的回调
showLoading: null,
// 显示加载中的回调
showNoMore: null,
// 显示无更多数据的回调
hideUpScroll: null,
// 隐藏上拉加载的回调
errDistance: 60,
// endErr的时候需往上滑动一段距离,使其往下滑动时再次触发onReachBottom,仅mescroll-body生效
toTop: {
// 回到顶部按钮,需配置src才显示
src: null,
// 图片路径,默认null (绝对路径或网络图)
offset: 1e3,
// 列表滚动多少距离才显示回到顶部按钮,默认1000
duration: 300,
// 回到顶部的动画时长,默认300ms (当值为0或300则使用系统自带回到顶部,更流畅; 其他值则通过step模拟,部分机型可能不够流畅,所以非特殊情况不建议修改此项)
btnClick: null,
// 点击按钮的回调
onShow: null,
// 是否显示的回调
zIndex: 9990,
// fixed定位z-index值
left: null,
// 到左边的距离, 默认null. 此项有值时,right不生效. (支持20, "20rpx", "20px", "20%"格式的值, 其中纯数字则默认单位rpx)
right: 20,
// 到右边的距离, 默认20 (支持20, "20rpx", "20px", "20%"格式的值, 其中纯数字则默认单位rpx)
bottom: 120,
// 到底部的距离, 默认120 (支持20, "20rpx", "20px", "20%"格式的值, 其中纯数字则默认单位rpx)
safearea: false,
// bottom的偏移量是否加上底部安全区的距离, 默认false, 需要适配iPhoneX时使用 (具体的界面如果不配置此项,则取本vue的safearea值)
width: 72,
// 回到顶部图标的宽度, 默认72 (支持20, "20rpx", "20px", "20%"格式的值, 其中纯数字则默认单位rpx)
radius: "50%"
// 圆角, 默认"50%" (支持20, "20rpx", "20px", "20%"格式的值, 其中纯数字则默认单位rpx)
},
empty: {
use: true,
// 是否显示空布局
icon: null,
// 图标路径
tip: "~ 暂无相关数据 ~",
// 提示
btnText: "",
// 按钮
btnClick: null,
// 点击按钮的回调
onShow: null,
// 是否显示的回调
fixed: false,
// 是否使用fixed定位,默认false; 配置fixed为true,以下的top和zIndex才生效 (transform会使fixed失效,最终会降级为absolute)
top: "100rpx",
// fixed定位的top值 (完整的单位值,如 "10%"; "100rpx")
zIndex: 99
// fixed定位z-index值
},
onScroll: false
// 是否监听滚动事件
});
};
MeScroll.extend = function(userOption, defaultOption) {
if (!userOption)
return defaultOption;
for (let key in defaultOption) {
if (userOption[key] == null) {
let def = defaultOption[key];
if (def != null && typeof def === "object") {
userOption[key] = MeScroll.extend({}, def);
} else {
userOption[key] = def;
}
} else if (typeof userOption[key] === "object") {
MeScroll.extend(userOption[key], defaultOption[key]);
}
}
return userOption;
};
MeScroll.prototype.hasColor = function(color2) {
if (!color2)
return false;
let c = color2.toLowerCase();
return c != "#fff" && c != "#ffffff" && c != "transparent" && c != "white";
};
MeScroll.prototype.initDownScroll = function() {
let me = this;
me.optDown = me.options.down || {};
if (!me.optDown.textColor && me.hasColor(me.optDown.bgColor))
me.optDown.textColor = "#fff";
me.extendDownScroll(me.optDown);
if (me.isScrollBody && me.optDown.native) {
me.optDown.use = false;
} else {
me.optDown.native = false;
}
me.downHight = 0;
if (me.optDown.use && me.optDown.inited) {
setTimeout(function() {
me.optDown.inited(me);
}, 0);
}
};
MeScroll.prototype.touchstartEvent = function(e) {
if (!this.optDown.use)
return;
this.startPoint = this.getPoint(e);
this.startTop = this.getScrollTop();
this.startAngle = 0;
this.lastPoint = this.startPoint;
this.maxTouchmoveY = this.getBodyHeight() - this.optDown.bottomOffset;
this.inTouchend = false;
};
MeScroll.prototype.touchmoveEvent = function(e) {
if (!this.optDown.use)
return;
let me = this;
let scrollTop = me.getScrollTop();
let curPoint = me.getPoint(e);
let moveY = curPoint.y - me.startPoint.y;
if (moveY > 0 && (me.isScrollBody && scrollTop <= 0 || !me.isScrollBody && (scrollTop <= 0 || scrollTop <= me.optDown.startTop && scrollTop === me.startTop))) {
if (!me.inTouchend && !me.isDownScrolling && !me.optDown.isLock && (!me.isUpScrolling || me.isUpScrolling && me.optUp.isBoth)) {
if (!me.startAngle)
me.startAngle = me.getAngle(me.lastPoint, curPoint);
if (me.startAngle < me.optDown.minAngle)
return;
if (me.maxTouchmoveY > 0 && curPoint.y >= me.maxTouchmoveY) {
me.inTouchend = true;
me.touchendEvent();
return;
}
me.preventDefault(e);
let diff = curPoint.y - me.lastPoint.y;
if (me.downHight < me.optDown.offset) {
if (me.movetype !== 1) {
me.movetype = 1;
me.isDownEndSuccess = null;
me.optDown.inOffset && me.optDown.inOffset(me);
me.isMoveDown = true;
}
me.downHight += diff * me.optDown.inOffsetRate;
} else {
if (me.movetype !== 2) {
me.movetype = 2;
me.optDown.outOffset && me.optDown.outOffset(me);
me.isMoveDown = true;
}
if (diff > 0) {
me.downHight += diff * me.optDown.outOffsetRate;
} else {
me.downHight += diff;
}
}
me.downHight = Math.round(me.downHight);
let rate = me.downHight / me.optDown.offset;
me.optDown.onMoving && me.optDown.onMoving(me, rate, me.downHight);
}
}
me.lastPoint = curPoint;
};
MeScroll.prototype.touchendEvent = function(e) {
if (!this.optDown.use)
return;
if (this.isMoveDown) {
if (this.downHight >= this.optDown.offset) {
this.triggerDownScroll();
} else {
this.downHight = 0;
this.endDownScrollCall(this);
}
this.movetype = 0;
this.isMoveDown = false;
} else if (!this.isScrollBody && this.getScrollTop() === this.startTop) {
let isScrollUp = this.getPoint(e).y - this.startPoint.y < 0;
if (isScrollUp) {
let angle = this.getAngle(this.getPoint(e), this.startPoint);
if (angle > 80) {
this.triggerUpScroll(true);
}
}
}
};
MeScroll.prototype.getPoint = function(e) {
if (!e) {
return {
x: 0,
y: 0
};
}
if (e.touches && e.touches[0]) {
return {
x: e.touches[0].pageX,
y: e.touches[0].pageY
};
} else if (e.changedTouches && e.changedTouches[0]) {
return {
x: e.changedTouches[0].pageX,
y: e.changedTouches[0].pageY
};
} else {
return {
x: e.clientX,
y: e.clientY
};
}
};
MeScroll.prototype.getAngle = function(p1, p2) {
let x = Math.abs(p1.x - p2.x);
let y = Math.abs(p1.y - p2.y);
let z = Math.sqrt(x * x + y * y);
let angle = 0;
if (z !== 0) {
angle = Math.asin(y / z) / Math.PI * 180;
}
return angle;
};
MeScroll.prototype.triggerDownScroll = function() {
if (this.optDown.beforeLoading && this.optDown.beforeLoading(this))
;
else {
this.showDownScroll();
!this.optDown.native && this.optDown.callback && this.optDown.callback(this);
}
};
MeScroll.prototype.showDownScroll = function() {
this.isDownScrolling = true;
if (this.optDown.native) {
uni.startPullDownRefresh();
this.showDownLoadingCall(0);
} else {
this.downHight = this.optDown.offset;
this.showDownLoadingCall(this.downHight);
}
};
MeScroll.prototype.showDownLoadingCall = function(downHight) {
this.optDown.showLoading && this.optDown.showLoading(this, downHight);
this.optDown.afterLoading && this.optDown.afterLoading(this, downHight);
};
MeScroll.prototype.onPullDownRefresh = function() {
this.isDownScrolling = true;
this.showDownLoadingCall(0);
this.optDown.callback && this.optDown.callback(this);
};
MeScroll.prototype.endDownScroll = function() {
if (this.optDown.native) {
this.isDownScrolling = false;
this.endDownScrollCall(this);
uni.stopPullDownRefresh();
return;
}
let me = this;
let endScroll = function() {
me.downHight = 0;
me.isDownScrolling = false;
me.endDownScrollCall(me);
if (!me.isScrollBody) {
me.setScrollHeight(0);
me.scrollTo(0, 0);
}
};
let delay = 0;
if (me.optDown.beforeEndDownScroll) {
delay = me.optDown.beforeEndDownScroll(me);
if (me.isDownEndSuccess == null)
delay = 0;
}
if (typeof delay === "number" && delay > 0) {
setTimeout(endScroll, delay);
} else {
endScroll();
}
};
MeScroll.prototype.endDownScrollCall = function() {
this.optDown.endDownScroll && this.optDown.endDownScroll(this);
this.optDown.afterEndDownScroll && this.optDown.afterEndDownScroll(this);
};
MeScroll.prototype.lockDownScroll = function(isLock) {
if (isLock == null)
isLock = true;
this.optDown.isLock = isLock;
};
MeScroll.prototype.lockUpScroll = function(isLock) {
if (isLock == null)
isLock = true;
this.optUp.isLock = isLock;
};
MeScroll.prototype.initUpScroll = function() {
let me = this;
me.optUp = me.options.up || { use: false };
if (!me.optUp.textColor && me.hasColor(me.optUp.bgColor))
me.optUp.textColor = "#fff";
me.extendUpScroll(me.optUp);
if (me.optUp.use === false)
return;
me.optUp.hasNext = true;
me.startNum = me.optUp.page.num + 1;
if (me.optUp.inited) {
setTimeout(function() {
me.optUp.inited(me);
}, 0);
}
};
MeScroll.prototype.onReachBottom = function() {
if (this.isScrollBody && !this.isUpScrolling) {
if (!this.optUp.isLock && this.optUp.hasNext) {
this.triggerUpScroll();
}
}
};
MeScroll.prototype.onPageScroll = function(e) {
if (!this.isScrollBody)
return;
this.setScrollTop(e.scrollTop);
if (e.scrollTop >= this.optUp.toTop.offset) {
this.showTopBtn();
} else {
this.hideTopBtn();
}
};
MeScroll.prototype.scroll = function(e, onScroll) {
this.setScrollTop(e.scrollTop);
this.setScrollHeight(e.scrollHeight);
if (this.preScrollY == null)
this.preScrollY = 0;
this.isScrollUp = e.scrollTop - this.preScrollY > 0;
this.preScrollY = e.scrollTop;
this.isScrollUp && this.triggerUpScroll(true);
if (e.scrollTop >= this.optUp.toTop.offset) {
this.showTopBtn();
} else {
this.hideTopBtn();
}
this.optUp.onScroll && onScroll && onScroll();
};
MeScroll.prototype.triggerUpScroll = function(isCheck) {
if (!this.isUpScrolling && this.optUp.use && this.optUp.callback) {
if (isCheck === true) {
let canUp = false;
if (this.optUp.hasNext && !this.optUp.isLock && !this.isDownScrolling) {
if (this.getScrollBottom() <= this.optUp.offset) {
canUp = true;
}
}
if (canUp === false)
return;
}
this.showUpScroll();
this.optUp.page.num++;
this.isUpAutoLoad = true;
this.num = this.optUp.page.num;
this.size = this.optUp.page.size;
this.time = this.optUp.page.time;
this.optUp.callback(this);
}
};
MeScroll.prototype.showUpScroll = function() {
this.isUpScrolling = true;
this.optUp.showLoading && this.optUp.showLoading(this);
};
MeScroll.prototype.showNoMore = function() {
this.optUp.hasNext = false;
this.optUp.showNoMore && this.optUp.showNoMore(this);
};
MeScroll.prototype.hideUpScroll = function() {
this.optUp.hideUpScroll && this.optUp.hideUpScroll(this);
};
MeScroll.prototype.endUpScroll = function(isShowNoMore) {
if (isShowNoMore != null) {
if (isShowNoMore) {
this.showNoMore();
} else {
this.hideUpScroll();
}
}
this.isUpScrolling = false;
};
MeScroll.prototype.resetUpScroll = function(isShowLoading) {
if (this.optUp && this.optUp.use) {
let page2 = this.optUp.page;
this.prePageNum = page2.num;
this.prePageTime = page2.time;
page2.num = this.startNum;
page2.time = null;
if (!this.isDownScrolling && isShowLoading !== false) {
if (isShowLoading == null) {
this.removeEmpty();
this.showUpScroll();
} else {
this.showDownScroll();
}
}
this.isUpAutoLoad = true;
this.num = page2.num;
this.size = page2.size;
this.time = page2.time;
this.optUp.callback && this.optUp.callback(this);
}
};
MeScroll.prototype.setPageNum = function(num) {
this.optUp.page.num = num - 1;
};
MeScroll.prototype.setPageSize = function(size) {
this.optUp.page.size = size;
};
MeScroll.prototype.endByPage = function(dataSize, totalPage, systime) {
let hasNext;
if (this.optUp.use && totalPage != null)
hasNext = this.optUp.page.num < totalPage;
this.endSuccess(dataSize, hasNext, systime);
};
MeScroll.prototype.endBySize = function(dataSize, totalSize, systime) {
let hasNext;
if (this.optUp.use && totalSize != null) {
let loadSize = (this.optUp.page.num - 1) * this.optUp.page.size + dataSize;
hasNext = loadSize < totalSize;
}
this.endSuccess(dataSize, hasNext, systime);
};
MeScroll.prototype.endSuccess = function(dataSize, hasNext, systime) {
let me = this;
if (me.isDownScrolling) {
me.isDownEndSuccess = true;
me.endDownScroll();
}
if (me.optUp.use) {
let isShowNoMore;
if (dataSize != null) {
let pageNum = me.optUp.page.num;
let pageSize = me.optUp.page.size;
if (pageNum === 1) {
if (systime)
me.optUp.page.time = systime;
}
if (dataSize < pageSize || hasNext === false) {
me.optUp.hasNext = false;
if (dataSize === 0 && pageNum === 1) {
isShowNoMore = false;
me.showEmpty();
} else {
let allDataSize = (pageNum - 1) * pageSize + dataSize;
if (allDataSize < me.optUp.noMoreSize) {
isShowNoMore = false;
} else {
isShowNoMore = true;
}
me.removeEmpty();
}
} else {
isShowNoMore = false;
me.optUp.hasNext = true;
me.removeEmpty();
}
}
me.endUpScroll(isShowNoMore);
}
};
MeScroll.prototype.endErr = function(errDistance) {
if (this.isDownScrolling) {
this.isDownEndSuccess = false;
let page2 = this.optUp.page;
if (page2 && this.prePageNum) {
page2.num = this.prePageNum;
page2.time = this.prePageTime;
}
this.endDownScroll();
}
if (this.isUpScrolling) {
this.optUp.page.num--;
this.endUpScroll(false);
if (this.isScrollBody && errDistance !== 0) {
if (!errDistance)
errDistance = this.optUp.errDistance;
this.scrollTo(this.getScrollTop() - errDistance, 0);
}
}
};
MeScroll.prototype.showEmpty = function() {
this.optUp.empty.use && this.optUp.empty.onShow && this.optUp.empty.onShow(true);
};
MeScroll.prototype.removeEmpty = function() {
this.optUp.empty.use && this.optUp.empty.onShow && this.optUp.empty.onShow(false);
};
MeScroll.prototype.showTopBtn = function() {
if (!this.topBtnShow) {
this.topBtnShow = true;
this.optUp.toTop.onShow && this.optUp.toTop.onShow(true);
}
};
MeScroll.prototype.hideTopBtn = function() {
if (this.topBtnShow) {
this.topBtnShow = false;
this.optUp.toTop.onShow && this.optUp.toTop.onShow(false);
}
};
MeScroll.prototype.getScrollTop = function() {
return this.scrollTop || 0;
};
MeScroll.prototype.setScrollTop = function(y) {
this.scrollTop = y;
};
MeScroll.prototype.scrollTo = function(y, t) {
this.myScrollTo && this.myScrollTo(y, t);
};
MeScroll.prototype.resetScrollTo = function(myScrollTo) {
this.myScrollTo = myScrollTo;
};
MeScroll.prototype.getScrollBottom = function() {
return this.getScrollHeight() - this.getClientHeight() - this.getScrollTop();
};
MeScroll.prototype.getStep = function(star, end, callback, t, rate) {
let diff = end - star;
if (t === 0 || diff === 0) {
callback && callback(end);
return;
}
t = t || 300;
rate = rate || 30;
let count = t / rate;
let step = diff / count;
let i = 0;
let timer = setInterval(function() {
if (i < count - 1) {
star += step;
callback && callback(star, timer);
i++;
} else {
callback && callback(end, timer);
clearInterval(timer);
}
}, rate);
};
MeScroll.prototype.getClientHeight = function(isReal) {
let h = this.clientHeight || 0;
if (h === 0 && isReal !== true) {
h = this.getBodyHeight();
}
return h;
};
MeScroll.prototype.setClientHeight = function(h) {
this.clientHeight = h;
};
MeScroll.prototype.getScrollHeight = function() {
return this.scrollHeight || 0;
};
MeScroll.prototype.setScrollHeight = function(h) {
this.scrollHeight = h;
};
MeScroll.prototype.getBodyHeight = function() {
return this.bodyHeight || 0;
};
MeScroll.prototype.setBodyHeight = function(h) {
this.bodyHeight = h;
};
MeScroll.prototype.preventDefault = function(e) {
if (e && e.cancelable && !e.defaultPrevented)
e.preventDefault();
};
const _sfc_main$1f = {
props: {
// up.toTop的配置项
option: {
type: Object,
default() {
return {};
}
},
// 是否显示
value: false,
// vue2
modelValue: false
// vue3
},
computed: {
// 优先显示左边
left() {
return this.option.left ? this.addUnit(this.option.left) : "auto";
},
// 右边距离 (优先显示左边)
right() {
return this.option.left ? "auto" : this.addUnit(this.option.right);
},
// 是否显示
isShow() {
return this.modelValue;
}
},
methods: {
addUnit(num) {
if (!num)
return 0;
if (typeof num === "number")
return num + "rpx";
return num;
},
toTopClick() {
this.$emit("update:modelValue", false);
this.$emit("click");
}
}
};
function _sfc_render$1e(_ctx, _cache, $props, $setup, $data, $options) {
return $props.option.src ? (vue.openBlock(), vue.createElementBlock("image", {
key: 0,
class: vue.normalizeClass(["mescroll-totop", [$options.isShow ? "mescroll-totop-in" : "mescroll-totop-out", { "mescroll-totop-safearea": $props.option.safearea }]]),
style: vue.normalizeStyle({ "z-index": $props.option.zIndex, "left": $options.left, "right": $options.right, "bottom": $options.addUnit($props.option.bottom), "width": $options.addUnit($props.option.width), "border-radius": $options.addUnit($props.option.radius) }),
src: $props.option.src,
mode: "widthFix",
onClick: _cache[0] || (_cache[0] = (...args) => $options.toTopClick && $options.toTopClick(...args))
}, null, 14, ["src"])) : vue.createCommentVNode("v-if", true);
}
const MescrollTop = /* @__PURE__ */ _export_sfc(_sfc_main$1f, [["render", _sfc_render$1e], ["__scopeId", "data-v-49fff3a8"], ["__file", "E:/书嗨项目/shuhi-app-fornt/uni_modules/mescroll-uni/components/mescroll-uni/components/mescroll-top.vue"]]);
const WxsMixin = {
data() {
return {
// 传入wxs视图层的数据 (响应式)
wxsProp: {
optDown: {},
// 下拉刷新的配置
scrollTop: 0,
// 滚动条的距离
bodyHeight: 0,
// body的高度
isDownScrolling: false,
// 是否正在下拉刷新中
isUpScrolling: false,
// 是否正在上拉加载中
isScrollBody: true,
// 是否为mescroll-body滚动
isUpBoth: true,
// 上拉加载时,是否同时可以下拉刷新
t: 0
// 数据更新的标记 (只有数据更新了,才会触发wxs的Observer)
},
// 标记调用wxs视图层的方法
callProp: {
callType: "",
// 方法名
t: 0
// 数据更新的标记 (只有数据更新了,才会触发wxs的Observer)
}
// 不用wxs的平台使用此处的wxsBiz对象,抹平wxs的写法 (微信小程序和APP使用的wxsBiz对象是./wxs/wxs.wxs)
// 不用renderjs的平台使用此处的renderBiz对象,抹平renderjs的写法 (app 和 h5 使用的renderBiz对象是./wxs/renderjs.js)
};
},
methods: {
// wxs视图层调用逻辑层的回调
wxsCall(msg) {
if (msg.type === "setWxsProp") {
this.wxsProp = {
optDown: this.mescroll.optDown,
scrollTop: this.mescroll.getScrollTop(),
bodyHeight: this.mescroll.getBodyHeight(),
isDownScrolling: this.mescroll.isDownScrolling,
isUpScrolling: this.mescroll.isUpScrolling,
isUpBoth: this.mescroll.optUp.isBoth,
isScrollBody: this.mescroll.isScrollBody,
t: Date.now()
};
} else if (msg.type === "setLoadType") {
this.downLoadType = msg.downLoadType;
this.$set(this.mescroll, "downLoadType", this.downLoadType);
this.$set(this.mescroll, "isDownEndSuccess", null);
} else if (msg.type === "triggerDownScroll") {
this.mescroll.triggerDownScroll();
} else if (msg.type === "endDownScroll") {
this.mescroll.endDownScroll();
} else if (msg.type === "triggerUpScroll") {
this.mescroll.triggerUpScroll(true);
}
}
},
mounted() {
this.mescroll.optDown.afterLoading = () => {
this.callProp = { callType: "showLoading", t: Date.now() };
};
this.mescroll.optDown.afterEndDownScroll = () => {
this.callProp = { callType: "endDownScroll", t: Date.now() };
let delay = 300 + (this.mescroll.optDown.beforeEndDelay || 0);
setTimeout(() => {
if (this.downLoadType === 4 || this.downLoadType === 0) {
this.callProp = { callType: "clearTransform", t: Date.now() };
}
this.$set(this.mescroll, "downLoadType", this.downLoadType);
}, delay);
};
this.wxsCall({ type: "setWxsProp" });
}
};
const block0 = (Comp) => {
(Comp.$wxs || (Comp.$wxs = [])).push("wxsBiz");
(Comp.$wxsModules || (Comp.$wxsModules = {}))["wxsBiz"] = "30f4e25a";
};
const block1 = (Comp) => {
(Comp.$renderjs || (Comp.$renderjs = [])).push("renderBiz");
(Comp.$renderjsModules || (Comp.$renderjsModules = {}))["renderBiz"] = "5a9dc23f";
};
const _sfc_main$1e = {
name: "mescroll-uni",
mixins: [WxsMixin],
components: {
MescrollTop
},
props: {
down: Object,
up: Object,
i18n: Object,
top: [String, Number],
topbar: [Boolean, String],
bottom: [String, Number],
safearea: Boolean,
fixed: {
type: Boolean,
default: true
},
height: [String, Number],
bottombar: {
type: Boolean,
default: true
},
disableScroll: Boolean
},
data() {
return {
mescroll: { optDown: {}, optUp: {} },
// mescroll实例
viewId: "id_" + Math.random().toString(36).substr(2, 16),
// 随机生成mescroll的id(不能数字开头,否则找不到元素)
downHight: 0,
//下拉刷新: 容器高度
downRate: 0,
// 下拉比率(inOffset: rate<1; outOffset: rate>=1)
downLoadType: 0,
// 下拉刷新状态: 0(loading前), 1(inOffset), 2(outOffset), 3(showLoading), 4(endDownScroll)
upLoadType: 0,
// 上拉加载状态: 0(loading前), 1loading中, 2没有更多了,显示END文本提示, 3(没有更多了,不显示END文本提示)
isShowEmpty: false,
// 是否显示空布局
isShowToTop: false,
// 是否显示回到顶部按钮
scrollTop: 0,
// 滚动条的位置
scrollAnim: false,
// 是否开启滚动动画
windowTop: 0,
// 可使用窗口的顶部位置
windowBottom: 0,
// 可使用窗口的底部位置
windowHeight: 0,
// 可使用窗口的高度
statusBarHeight: 0
// 状态栏高度
};
},
watch: {
height() {
this.setClientHeight();
}
},
computed: {
// 是否使用fixed定位 (当height有值,则不使用)
isFixed() {
return !this.height && this.fixed;
},
// mescroll的高度
scrollHeight() {
if (this.isFixed) {
return "auto";
} else if (this.height) {
return this.toPx(this.height) + "px";
} else {
return "100%";
}
},
// 下拉布局往下偏移的距离 (px)
numTop() {
return this.toPx(this.top);
},
fixedTop() {
return this.isFixed ? this.numTop + this.windowTop + "px" : 0;
},
padTop() {
return !this.isFixed ? this.numTop + "px" : 0;
},
// 上拉布局往上偏移 (px)
numBottom() {
return this.toPx(this.bottom);
},
fixedBottom() {
return this.isFixed ? this.numBottom + this.windowBottom + "px" : 0;
},
padBottom() {
return !this.isFixed ? this.numBottom + "px" : 0;
},
// 是否为重置下拉的状态
isDownReset() {
return this.downLoadType === 3 || this.downLoadType === 4;
},
// 过渡
transition() {
return this.isDownReset ? "transform 300ms" : "";
},
translateY() {
return this.downHight > 0 ? "translateY(" + this.downHight + "px)" : "";
},
// 列表是否可滑动
scrollable() {
if (this.disableScroll)
return false;
return this.downLoadType === 0 || this.isDownReset;
},
// 是否在加载中
isDownLoading() {
return this.downLoadType === 3;
},
// 旋转的角度
downRotate() {
return "rotate(" + 360 * this.downRate + "deg)";
},
// 文本提示
downText() {
if (!this.mescroll)
return "";
switch (this.downLoadType) {
case 1:
return this.mescroll.optDown.textInOffset;
case 2:
return this.mescroll.optDown.textOutOffset;
case 3:
return this.mescroll.optDown.textLoading;
case 4:
return this.mescroll.isDownEndSuccess ? this.mescroll.optDown.textSuccess : this.mescroll.isDownEndSuccess == false ? this.mescroll.optDown.textErr : this.mescroll.optDown.textInOffset;
default:
return this.mescroll.optDown.textInOffset;
}
}
},
methods: {
//number,rpx,upx,px,% --> px的数值
toPx(num) {
if (typeof num === "string") {
if (num.indexOf("px") !== -1) {
if (num.indexOf("rpx") !== -1) {
num = num.replace("rpx", "");
} else if (num.indexOf("upx") !== -1) {
num = num.replace("upx", "");
} else {
return Number(num.replace("px", ""));
}
} else if (num.indexOf("%") !== -1) {
let rate = Number(num.replace("%", "")) / 100;
return this.windowHeight * rate;
}
}
return num ? uni.upx2px(Number(num)) : 0;
},
//注册列表滚动事件,用于下拉刷新和上拉加载
scroll(e) {
this.mescroll.scroll(e.detail, () => {
this.$emit("scroll", this.mescroll);
});
},
// 点击空布局的按钮回调
emptyClick() {
this.$emit("emptyclick", this.mescroll);
},
// 点击回到顶部的按钮回调
toTopClick() {
this.mescroll.scrollTo(0, this.mescroll.optUp.toTop.duration);
this.$emit("topclick", this.mescroll);
},
// 更新滚动区域的高度 (使内容不满屏和到底,都可继续翻页)
setClientHeight() {
if (!this.isExec) {
this.isExec = true;
this.$nextTick(() => {
this.getClientInfo((data) => {
this.isExec = false;
if (data) {
this.mescroll.setClientHeight(data.height);
} else if (this.clientNum != 3) {
this.clientNum = this.clientNum == null ? 1 : this.clientNum + 1;
setTimeout(() => {
this.setClientHeight();
}, this.clientNum * 100);
}
});
});
}
},
// 获取滚动区域的信息
getClientInfo(success) {
let query = uni.createSelectorQuery().in(this);
let view = query.select("#" + this.viewId);
view.boundingClientRect((data) => {
success(data);
}).exec();
}
},
// 使用created初始化mescroll对象; 如果用mounted部分css样式编译到H5会失效
created() {
let vm = this;
let diyOption = {
// 下拉刷新的配置
down: {
inOffset() {
vm.downLoadType = 1;
},
outOffset() {
vm.downLoadType = 2;
},
onMoving(mescroll, rate, downHight) {
vm.downHight = downHight;
vm.downRate = rate;
},
showLoading(mescroll, downHight) {
vm.downLoadType = 3;
vm.downHight = downHight;
},
beforeEndDownScroll(mescroll) {
vm.downLoadType = 4;
return mescroll.optDown.beforeEndDelay;
},
endDownScroll() {
vm.downLoadType = 4;
vm.downHight = 0;
vm.downResetTimer && clearTimeout(vm.downResetTimer);
vm.downResetTimer = setTimeout(() => {
if (vm.downLoadType === 4)
vm.downLoadType = 0;
}, 300);
},
// 派发下拉刷新的回调
callback: function(mescroll) {
vm.$emit("down", mescroll);
}
},
// 上拉加载的配置
up: {
// 显示加载中的回调
showLoading() {
vm.upLoadType = 1;
},
// 显示无更多数据的回调
showNoMore() {
vm.upLoadType = 2;
},
// 隐藏上拉加载的回调
hideUpScroll(mescroll) {
vm.upLoadType = mescroll.optUp.hasNext ? 0 : 3;
},
// 空布局
empty: {
onShow(isShow) {
vm.isShowEmpty = isShow;
}
},
// 回到顶部
toTop: {
onShow(isShow) {
vm.isShowToTop = isShow;
}
},
// 派发上拉加载的回调
callback: function(mescroll) {
vm.$emit("up", mescroll);
vm.setClientHeight();
}
}
};
let i18nType = mescrollI18n.getType();
let i18nOption = { type: i18nType };
MeScroll.extend(i18nOption, vm.i18n);
MeScroll.extend(i18nOption, GlobalOption.i18n);
MeScroll.extend(diyOption, i18nOption[i18nType]);
MeScroll.extend(diyOption, { down: GlobalOption.down, up: GlobalOption.up });
let myOption = JSON.parse(JSON.stringify({ "down": vm.down, "up": vm.up }));
MeScroll.extend(myOption, diyOption);
vm.mescroll = new MeScroll(myOption);
vm.mescroll.viewId = vm.viewId;
vm.mescroll.i18n = i18nOption;
vm.$emit("init", vm.mescroll);
const sys2 = uni.getSystemInfoSync();
if (sys2.windowTop)
vm.windowTop = sys2.windowTop;
if (sys2.windowBottom)
vm.windowBottom = sys2.windowBottom;
if (sys2.windowHeight)
vm.windowHeight = sys2.windowHeight;
if (sys2.statusBarHeight)
vm.statusBarHeight = sys2.statusBarHeight;
vm.mescroll.setBodyHeight(sys2.windowHeight);
vm.mescroll.resetScrollTo((y, t) => {
vm.scrollAnim = t !== 0;
if (typeof y === "string") {
vm.getClientInfo(function(rect) {
let mescrollTop = rect.top;
let selector;
if (y.indexOf("#") == -1 && y.indexOf(".") == -1) {
selector = "#" + y;
} else {
selector = y;
if (y.indexOf(">>>") != -1) {
selector = y.split(">>>")[1].trim();
}
}
uni.createSelectorQuery().select(selector).boundingClientRect(function(rect2) {
if (rect2) {
let curY2 = vm.mescroll.getScrollTop();
let top = rect2.top - mescrollTop;
top += curY2;
if (!vm.isFixed)
top -= vm.numTop;
vm.scrollTop = curY2;
vm.$nextTick(function() {
vm.scrollTop = top;
});
} else {
formatAppLog("error", "at uni_modules/mescroll-uni/components/mescroll-uni/mescroll-uni.vue:422", selector + " does not exist");
}
}).exec();
});
return;
}
let curY = vm.mescroll.getScrollTop();
if (t === 0 || t === 300) {
vm.scrollTop = curY;
vm.$nextTick(function() {
vm.scrollTop = y;
});
} else {
vm.mescroll.getStep(curY, y, (step) => {
vm.scrollTop = step;
}, t);
}
});
if (vm.up && vm.up.toTop && vm.up.toTop.safearea != null)
;
else {
vm.mescroll.optUp.toTop.safearea = vm.safearea;
}
uni.$on("setMescrollGlobalOption", (options) => {
if (!options)
return;
let i18nType2 = options.i18n ? options.i18n.type : null;
if (i18nType2 && vm.mescroll.i18n.type != i18nType2) {
vm.mescroll.i18n.type = i18nType2;
mescrollI18n.setType(i18nType2);
MeScroll.extend(options, vm.mescroll.i18n[i18nType2]);
}
if (options.down) {
let down = MeScroll.extend({}, options.down);
vm.mescroll.optDown = MeScroll.extend(down, vm.mescroll.optDown);
}
if (options.up) {
let up = MeScroll.extend({}, options.up);
vm.mescroll.optUp = MeScroll.extend(up, vm.mescroll.optUp);
}
});
},
mounted() {
this.setClientHeight();
},
destroyed() {
uni.$off("setMescrollGlobalOption");
}
};
function _sfc_render$1d(_ctx, _cache, $props, $setup, $data, $options) {
const _component_mescroll_empty = resolveEasycom(vue.resolveDynamicComponent("mescroll-empty"), __easycom_0$7);
const _component_mescroll_top = vue.resolveComponent("mescroll-top");
return vue.openBlock(), vue.createElementBlock("view", { class: "mescroll-uni-warp" }, [
vue.createElementVNode("scroll-view", {
id: $data.viewId,
class: vue.normalizeClass(["mescroll-uni", { "mescroll-uni-fixed": $options.isFixed }]),
style: vue.normalizeStyle({ "height": $options.scrollHeight, "padding-top": $options.padTop, "padding-bottom": $options.padBottom, "top": $options.fixedTop, "bottom": $options.fixedBottom }),
"scroll-top": $data.scrollTop,
"scroll-with-animation": $data.scrollAnim,
onScroll: _cache[4] || (_cache[4] = (...args) => $options.scroll && $options.scroll(...args)),
"scroll-y": $options.scrollable,
"enable-back-to-top": true,
throttle: false
}, [
vue.createElementVNode("view", {
class: "mescroll-uni-content mescroll-render-touch",
onTouchstart: _cache[0] || (_cache[0] = (...args) => _ctx.wxsBiz.touchstartEvent && _ctx.wxsBiz.touchstartEvent(...args)),
onTouchmove: _cache[1] || (_cache[1] = (...args) => _ctx.wxsBiz.touchmoveEvent && _ctx.wxsBiz.touchmoveEvent(...args)),
onTouchend: _cache[2] || (_cache[2] = (...args) => _ctx.wxsBiz.touchendEvent && _ctx.wxsBiz.touchendEvent(...args)),
onTouchcancel: _cache[3] || (_cache[3] = (...args) => _ctx.wxsBiz.touchendEvent && _ctx.wxsBiz.touchendEvent(...args)),
"change:prop": _ctx.wxsBiz.propObserver,
prop: vue.wp(_ctx.wxsProp)
}, [
vue.createCommentVNode(" 状态栏 "),
$props.topbar && $data.statusBarHeight ? (vue.openBlock(), vue.createElementBlock(
"view",
{
key: 0,
class: "mescroll-topbar",
style: vue.normalizeStyle({ height: $data.statusBarHeight + "px", background: $props.topbar })
},
null,
4
/* STYLE */
)) : vue.createCommentVNode("v-if", true),
vue.createElementVNode("view", {
class: "mescroll-wxs-content",
style: vue.normalizeStyle({ "transform": $options.translateY, "transition": $options.transition }),
"change:prop": _ctx.wxsBiz.callObserver,
prop: vue.wp(_ctx.callProp)
}, [
vue.createCommentVNode(" 下拉加载区域 (支付宝小程序子组件传参给子子组件仍报单项数据流的异常,暂时不通过mescroll-down组件实现)"),
vue.createCommentVNode(' '),
$data.mescroll.optDown.use ? (vue.openBlock(), vue.createElementBlock(
"view",
{
key: 0,
class: "mescroll-downwarp",
style: vue.normalizeStyle({ "background": $data.mescroll.optDown.bgColor, "color": $data.mescroll.optDown.textColor })
},
[
vue.createElementVNode("view", { class: "downwarp-content" }, [
vue.createElementVNode(
"view",
{
class: vue.normalizeClass(["downwarp-progress mescroll-wxs-progress", { "mescroll-rotate": $options.isDownLoading }]),
style: vue.normalizeStyle({ "border-color": $data.mescroll.optDown.textColor, "transform": $options.downRotate })
},
null,
6
/* CLASS, STYLE */
),
vue.createElementVNode(
"view",
{ class: "downwarp-tip" },
vue.toDisplayString($options.downText),
1
/* TEXT */
)
])
],
4
/* STYLE */
)) : vue.createCommentVNode("v-if", true),
vue.createCommentVNode(" 列表内容 "),
vue.renderSlot(_ctx.$slots, "default", {}, void 0, true),
vue.createCommentVNode(" 空布局 "),
$data.isShowEmpty ? (vue.openBlock(), vue.createBlock(_component_mescroll_empty, {
key: 1,
option: $data.mescroll.optUp.empty,
onEmptyclick: $options.emptyClick
}, null, 8, ["option", "onEmptyclick"])) : vue.createCommentVNode("v-if", true),
vue.createCommentVNode(" 上拉加载区域 (下拉刷新时不显示, 支付宝小程序子组件传参给子子组件仍报单项数据流的异常,暂时不通过mescroll-up组件实现)"),
vue.createCommentVNode(' '),
$data.mescroll.optUp.use && !$options.isDownLoading && $data.upLoadType !== 3 ? (vue.openBlock(), vue.createElementBlock(
"view",
{
key: 2,
class: "mescroll-upwarp",
style: vue.normalizeStyle({ "background": $data.mescroll.optUp.bgColor, "color": $data.mescroll.optUp.textColor })
},
[
vue.createCommentVNode(" 加载中 (此处不能用v-if,否则android小程序快速上拉可能会不断触发上拉回调) "),
vue.withDirectives(vue.createElementVNode(
"view",
null,
[
vue.createElementVNode(
"view",
{
class: "upwarp-progress mescroll-rotate",
style: vue.normalizeStyle({ "border-color": $data.mescroll.optUp.textColor })
},
null,
4
/* STYLE */
),
vue.createElementVNode(
"view",
{ class: "upwarp-tip" },
vue.toDisplayString($data.mescroll.optUp.textLoading),
1
/* TEXT */
)
],
512
/* NEED_PATCH */
), [
[vue.vShow, $data.upLoadType === 1]
]),
vue.createCommentVNode(" 无数据 "),
$data.upLoadType === 2 ? (vue.openBlock(), vue.createElementBlock(
"view",
{
key: 0,
class: "upwarp-nodata"
},
vue.toDisplayString($data.mescroll.optUp.textNoMore),
1
/* TEXT */
)) : vue.createCommentVNode("v-if", true)
],
4
/* STYLE */
)) : vue.createCommentVNode("v-if", true)
], 12, ["change:prop", "prop"]),
vue.createCommentVNode(" 底部是否偏移TabBar的高度(默认仅在H5端的tab页生效) "),
vue.createCommentVNode(" 适配iPhoneX "),
$props.safearea ? (vue.openBlock(), vue.createElementBlock("view", {
key: 1,
class: "mescroll-safearea"
})) : vue.createCommentVNode("v-if", true)
], 40, ["change:prop", "prop"])
], 46, ["id", "scroll-top", "scroll-with-animation", "scroll-y"]),
vue.createCommentVNode(" 回到顶部按钮 (fixed元素,需写在scroll-view外面,防止滚动的时候抖动)"),
vue.createVNode(_component_mescroll_top, {
modelValue: $data.isShowToTop,
"onUpdate:modelValue": _cache[5] || (_cache[5] = ($event) => $data.isShowToTop = $event),
option: $data.mescroll.optUp.toTop,
onClick: $options.toTopClick
}, null, 8, ["modelValue", "option", "onClick"]),
vue.createCommentVNode(" renderjs的数据载体,不可写在mescroll-downwarp内部,避免use为false时,载体丢失,无法更新数据 "),
vue.createElementVNode("view", {
"change:prop": _ctx.renderBiz.propObserver,
prop: vue.wp(_ctx.wxsProp)
}, null, 8, ["change:prop", "prop"])
]);
}
if (typeof block0 === "function")
block0(_sfc_main$1e);
if (typeof block1 === "function")
block1(_sfc_main$1e);
const __easycom_0$6 = /* @__PURE__ */ _export_sfc(_sfc_main$1e, [["render", _sfc_render$1d], ["__scopeId", "data-v-97b1664c"], ["__file", "E:/书嗨项目/shuhi-app-fornt/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-uni.vue"]]);
function useMescroll(onPageScroll, onReachBottom, onPullDownRefresh) {
let mescroll = null;
const mescrollInit = (e) => {
mescroll = e;
};
const getMescroll = () => {
return mescroll;
};
const downCallback = () => {
if (mescroll.optUp.use) {
mescroll.resetUpScroll();
} else {
setTimeout(() => {
mescroll.endSuccess();
}, 500);
}
};
const upCallback = () => {
setTimeout(() => {
mescroll.endErr();
}, 500);
};
onPullDownRefresh && onPullDownRefresh(() => {
mescroll && mescroll.onPullDownRefresh();
});
onPageScroll && onPageScroll((e) => {
mescroll && mescroll.onPageScroll(e);
});
onReachBottom && onReachBottom(() => {
mescroll && mescroll.onReachBottom();
});
return {
getMescroll,
mescrollInit,
downCallback,
upCallback
};
}
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(value2) {
try {
localStorage.setItem(localSettingsSaveId, JSON.stringify(value2));
} catch (e) {
}
currentSettings = value2;
},
now() {
return now();
}
};
if (hook) {
hook.on(HOOK_PLUGIN_SETTINGS_SET, (pluginId, value2) => {
if (pluginId === this.plugin.id) {
this.fallbacks.setSettings(value2);
}
});
}
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.1.7
* (c) 2023 Eduardo San Martin Morote
* @license MIT
*/
let activePinia;
const setActivePinia = (pinia2) => activePinia = pinia2;
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, type2) {
const piniaMessage = "🍍 " + message;
if (typeof __VUE_DEVTOOLS_TOAST__ === "function") {
__VUE_DEVTOOLS_TOAST__(piniaMessage, type2);
} else if (type2 === "error") {
console.error(piniaMessage);
} else if (type2 === "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(pinia2) {
if (checkClipboardAccess())
return;
try {
await navigator.clipboard.writeText(JSON.stringify(pinia2.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(pinia2) {
if (checkClipboardAccess())
return;
try {
loadStoresState(pinia2, 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(pinia2) {
try {
saveAs(new Blob([JSON.stringify(pinia2.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(pinia2) {
try {
const open2 = getFileOpener();
const result = await open2();
if (!result)
return;
const { text, file } = result;
loadStoresState(pinia2, JSON.parse(text));
toastMessage(`Global state imported from "${file.name}".`);
} catch (error2) {
toastMessage(`Failed to import the state from JSON. Check the console for more details.`, "error");
console.error(error2);
}
}
function loadStoresState(pinia2, state) {
for (const key in state) {
const storeState = pinia2.state.value[key];
if (storeState) {
Object.assign(storeState, state[key]);
} else {
pinia2.state.value[key] = state[key];
}
}
}
function formatDisplay(display) {
return {
_custom: {
display
}
};
}
const PINIA_ROOT_LABEL = "🍍 Pinia (root)";
const PINIA_ROOT_ID = "_root";
function formatStoreForInspectorTree(store2) {
return isPinia(store2) ? {
id: PINIA_ROOT_ID,
label: PINIA_ROOT_LABEL
} : {
id: store2.$id,
label: store2.$id
};
}
function formatStoreForInspectorState(store2) {
if (isPinia(store2)) {
const storeNames = Array.from(store2._s.keys());
const storeMap = store2._s;
const state2 = {
state: storeNames.map((storeId) => ({
editable: true,
key: storeId,
value: store2.state.value[storeId]
})),
getters: storeNames.filter((id) => storeMap.get(id)._getters).map((id) => {
const store22 = storeMap.get(id);
return {
editable: false,
key: id,
value: store22._getters.reduce((getters, key) => {
getters[key] = store22[key];
return getters;
}, {})
};
})
};
return state2;
}
const state = {
state: Object.keys(store2.$state).map((key) => ({
editable: true,
key,
value: store2.$state[key]
}))
};
if (store2._getters && store2._getters.length) {
state.getters = store2._getters.map((getterName) => ({
editable: false,
key: getterName,
value: store2[getterName]
}));
}
if (store2._customProperties.size) {
state.customProperties = Array.from(store2._customProperties).map((key) => ({
editable: true,
key,
value: store2[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(type2) {
switch (type2) {
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, pinia2) {
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(pinia2);
},
tooltip: "Serialize and copy the state"
},
{
icon: "content_paste",
action: async () => {
await actionGlobalPasteState(pinia2);
api.sendInspectorTree(INSPECTOR_ID);
api.sendInspectorState(INSPECTOR_ID);
},
tooltip: "Replace the state with the content of your clipboard"
},
{
icon: "save",
action: () => {
actionGlobalSaveState(pinia2);
},
tooltip: "Save the state as a JSON file"
},
{
icon: "folder_open",
action: async () => {
await actionGlobalOpenStateFile(pinia2);
api.sendInspectorTree(INSPECTOR_ID);
api.sendInspectorState(INSPECTOR_ID);
},
tooltip: "Import the state from a JSON file"
}
],
nodeActions: [
{
icon: "restore",
tooltip: 'Reset the state (with "$reset")',
action: (nodeId) => {
const store2 = pinia2._s.get(nodeId);
if (!store2) {
toastMessage(`Cannot reset "${nodeId}" store because it wasn't found.`, "warn");
} else if (typeof store2.$reset !== "function") {
toastMessage(`Cannot reset "${nodeId}" store because it doesn't have a "$reset" method implemented.`, "warn");
} else {
store2.$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((store2) => {
payload.instanceData.state.push({
type: getStoreType(store2.$id),
key: "state",
editable: true,
value: store2._isOptionsAPI ? {
_custom: {
value: vue.toRaw(store2.$state),
actions: [
{
icon: "restore",
tooltip: "Reset the state of this store",
action: () => store2.$reset()
}
]
}
} : (
// NOTE: workaround to unwrap transferred refs
Object.keys(store2.$state).reduce((state, key) => {
state[key] = store2.$state[key];
return state;
}, {})
)
});
if (store2._getters && store2._getters.length) {
payload.instanceData.state.push({
type: getStoreType(store2.$id),
key: "getters",
editable: false,
value: store2._getters.reduce((getters, key) => {
try {
getters[key] = store2[key];
} catch (error2) {
getters[key] = error2;
}
return getters;
}, {})
});
}
});
}
});
api.on.getInspectorTree((payload) => {
if (payload.app === app && payload.inspectorId === INSPECTOR_ID) {
let stores = [pinia2];
stores = stores.concat(Array.from(pinia2._s.values()));
payload.rootNodes = (payload.filter ? stores.filter((store2) => "$id" in store2 ? store2.$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 ? pinia2 : pinia2._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 ? pinia2 : pinia2._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 store2 = pinia2._s.get(storeId);
if (!store2) {
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(store2, path, payload.state.value);
isTimelineActive = true;
}
});
});
}
function addStoreToDevtools(app, store2) {
if (!componentStateTypes.includes(getStoreType(store2.$id))) {
componentStateTypes.push(getStoreType(store2.$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;
store2.$onAction(({ after, onError, name, args }) => {
const groupId = runningActionId++;
api.addTimelineEvent({
layerId: MUTATIONS_LAYER_ID,
event: {
time: now2(),
title: "🛫 " + name,
subtitle: "start",
data: {
store: formatDisplay(store2.$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(store2.$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(store2.$id),
action: formatDisplay(name),
args,
error: error2
},
groupId
}
});
});
}, true);
store2._customProperties.forEach((name) => {
vue.watch(() => vue.unref(store2[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 });
});
store2.$subscribe(({ events, type: type2 }, state) => {
api.notifyComponentUpdate();
api.sendInspectorState(INSPECTOR_ID);
if (!isTimelineActive)
return;
const eventData = {
time: now2(),
title: formatMutationType(type2),
data: assign$1({ store: formatDisplay(store2.$id) }, formatEventData(events)),
groupId: activeAction
};
if (type2 === MutationType.patchFunction) {
eventData.subtitle = "⤵️";
} else if (type2 === 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 = store2._hotUpdate;
store2._hotUpdate = vue.markRaw((newStore) => {
hotUpdate(newStore);
api.addTimelineEvent({
layerId: MUTATIONS_LAYER_ID,
event: {
time: now2(),
title: "🔥 " + store2.$id,
subtitle: "HMR update",
data: {
store: formatDisplay(store2.$id),
info: formatDisplay(`HMR update`)
}
}
});
api.notifyComponentUpdate();
api.sendInspectorTree(INSPECTOR_ID);
api.sendInspectorState(INSPECTOR_ID);
});
const { $dispose } = store2;
store2.$dispose = () => {
$dispose();
api.notifyComponentUpdate();
api.sendInspectorTree(INSPECTOR_ID);
api.sendInspectorState(INSPECTOR_ID);
api.getSettings().logStoreChanges && toastMessage(`Disposed "${store2.$id}" store 🗑`);
};
api.notifyComponentUpdate();
api.sendInspectorTree(INSPECTOR_ID);
api.sendInspectorState(INSPECTOR_ID);
api.getSettings().logStoreChanges && toastMessage(`"${store2.$id}" store installed 🆕`);
});
}
let runningActionId = 0;
let activeAction;
function patchActionForGrouping(store2, actionNames, wrapWithProxy) {
const actions = actionNames.reduce((storeActions, actionName) => {
storeActions[actionName] = vue.toRaw(store2)[actionName];
return storeActions;
}, {});
for (const actionName in actions) {
store2[actionName] = function() {
const _actionId = runningActionId;
const trackedStore = wrapWithProxy ? new Proxy(store2, {
get(...args) {
activeAction = _actionId;
return Reflect.get(...args);
},
set(...args) {
activeAction = _actionId;
return Reflect.set(...args);
}
}) : store2;
activeAction = _actionId;
const retValue = actions[actionName].apply(trackedStore, arguments);
activeAction = void 0;
return retValue;
};
}
}
function devtoolsPlugin({ app, store: store2, options }) {
if (store2.$id.startsWith("__hot:")) {
return;
}
store2._isOptionsAPI = !!options.state;
patchActionForGrouping(store2, Object.keys(options.actions), store2._isOptionsAPI);
const originalHotUpdate = store2._hotUpdate;
vue.toRaw(store2)._hotUpdate = function(newStore) {
originalHotUpdate.apply(this, arguments);
patchActionForGrouping(store2, Object.keys(newStore._hmrPayload.actions), !!store2._isOptionsAPI);
};
addStoreToDevtools(
app,
// FIXME: is there a way to allow the assignment from Store to StoreGeneric?
store2
);
}
function createPinia() {
const scope = vue.effectScope(true);
const state = scope.run(() => vue.ref({}));
let _p = [];
let toBeInstalled = [];
const pinia2 = vue.markRaw({
install(app) {
setActivePinia(pinia2);
{
pinia2._a = app;
app.provide(piniaSymbol, pinia2);
app.config.globalProperties.$pinia = pinia2;
if (USE_DEVTOOLS) {
registerPiniaDevtools(app, pinia2);
}
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") {
pinia2.use(devtoolsPlugin);
}
return pinia2;
}
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);
});
}
const fallbackRunWithContext = (fn) => fn();
function mergeReactiveObjects(target, patchToApply) {
if (target instanceof Map && patchToApply instanceof Map) {
patchToApply.forEach((value2, key) => target.set(key, value2));
}
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, pinia2, hot) {
const { state, actions, getters } = options;
const initialState = pinia2.state.value[id];
let store2;
function setup() {
if (!initialState && !hot) {
{
pinia2.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(pinia2.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(pinia2);
const store22 = pinia2._s.get(id);
return getters[name].call(store22, store22);
}));
return computedGetters;
}, {}));
}
store2 = createSetupStore(id, setup, options, pinia2, hot, true);
return store2;
}
function createSetupStore($id, setup, options = {}, pinia2, hot, isOptionsStore) {
let scope;
const optionsForPlugin = assign({ actions: {} }, options);
if (!pinia2._e.active) {
throw new Error("Pinia destroyed");
}
const $subscribeOptions = {
deep: true
// flush: 'post',
};
{
$subscribeOptions.onTrigger = (event) => {
if (isListening) {
debuggerEvents = event;
} else if (isListening == false && !store2._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 = [];
let actionSubscriptions = [];
let debuggerEvents;
const initialState = pinia2.state.value[$id];
if (!isOptionsStore && !initialState && !hot) {
{
pinia2.state.value[$id] = {};
}
}
const hotState = vue.ref({});
let activeListener;
function $patch(partialStateOrMutator) {
let subscriptionMutation;
isListening = isSyncListening = false;
{
debuggerEvents = [];
}
if (typeof partialStateOrMutator === "function") {
partialStateOrMutator(pinia2.state.value[$id]);
subscriptionMutation = {
type: MutationType.patchFunction,
storeId: $id,
events: debuggerEvents
};
} else {
mergeReactiveObjects(pinia2.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, pinia2.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 = [];
pinia2._s.delete($id);
}
function wrapAction(name, action) {
return function() {
setActivePinia(pinia2);
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: store2,
after,
onError
});
let ret;
try {
ret = action.apply(this && this.$id === $id ? this : store2, args);
} catch (error2) {
triggerSubscriptions(onErrorCallbackList, error2);
throw error2;
}
if (ret instanceof Promise) {
return ret.then((value2) => {
triggerSubscriptions(afterCallbackList, value2);
return value2;
}).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: pinia2,
// _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(() => pinia2.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 store2 = vue.reactive(assign(
{
_hmrPayload,
_customProperties: vue.markRaw(/* @__PURE__ */ new Set())
// devtools custom properties
},
partialStore
// must be added later
// setupStore
));
pinia2._s.set($id, store2);
const runWithContext = pinia2._a && pinia2._a.runWithContext || fallbackRunWithContext;
const setupStore = runWithContext(() => pinia2._e.run(() => (scope = vue.effectScope()).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]);
}
}
{
pinia2.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(store2, setupStore);
assign(vue.toRaw(store2), setupStore);
}
Object.defineProperty(store2, "$state", {
get: () => hot ? hotState.value : pinia2.state.value[$id],
set: (state) => {
if (hot) {
throw new Error("cannot set hotState");
}
$patch(($state) => {
assign($state, state);
});
}
});
{
store2._hotUpdate = vue.markRaw((newStore) => {
store2._hotUpdating = true;
newStore._hmrPayload.state.forEach((stateKey) => {
if (stateKey in store2.$state) {
const newStateTarget = newStore.$state[stateKey];
const oldStateSource = store2.$state[stateKey];
if (typeof newStateTarget === "object" && isPlainObject$1(newStateTarget) && isPlainObject$1(oldStateSource)) {
patchObject(newStateTarget, oldStateSource);
} else {
newStore.$state[stateKey] = oldStateSource;
}
}
set(store2, stateKey, vue.toRef(newStore.$state, stateKey));
});
Object.keys(store2.$state).forEach((stateKey) => {
if (!(stateKey in newStore.$state)) {
del(store2, stateKey);
}
});
isListening = false;
isSyncListening = false;
pinia2.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(store2, 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(pinia2);
return getter.call(store2, store2);
})
) : getter;
set(store2, getterName, getterValue);
}
Object.keys(store2._hmrPayload.getters).forEach((key) => {
if (!(key in newStore._hmrPayload.getters)) {
del(store2, key);
}
});
Object.keys(store2._hmrPayload.actions).forEach((key) => {
if (!(key in newStore._hmrPayload.actions)) {
del(store2, key);
}
});
store2._hmrPayload = newStore._hmrPayload;
store2._getters = newStore._getters;
store2._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(store2, p, assign({ value: store2[p] }, nonEnumerable));
});
}
pinia2._p.forEach((extender) => {
if (USE_DEVTOOLS) {
const extensions = scope.run(() => extender({
store: store2,
app: pinia2._a,
pinia: pinia2,
options: optionsForPlugin
}));
Object.keys(extensions || {}).forEach((key) => store2._customProperties.add(key));
assign(store2, extensions);
} else {
assign(store2, scope.run(() => extender({
store: store2,
app: pinia2._a,
pinia: pinia2,
options: optionsForPlugin
})));
}
});
if (store2.$state && typeof store2.$state === "object" && typeof store2.$state.constructor === "function" && !store2.$state.constructor.toString().includes("[native code]")) {
console.warn(`[🍍]: The "state" must be a plain object. It cannot be
state: () => new MyClass()
Found in store "${store2.$id}".`);
}
if (initialState && isOptionsStore && options.hydrate) {
options.hydrate(store2.$state, initialState);
}
isListening = true;
isSyncListening = true;
return store2;
}
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;
if (typeof id !== "string") {
throw new Error(`[🍍]: "defineStore()" must be passed a store id as its first argument.`);
}
}
function useStore2(pinia2, hot) {
const hasContext = vue.hasInjectionContext();
pinia2 = // in test mode, ignore the argument provided as we can always retrieve a
// pinia instance with getActivePinia()
pinia2 || (hasContext ? vue.inject(piniaSymbol, null) : null);
if (pinia2)
setActivePinia(pinia2);
if (!activePinia) {
throw new Error(`[🍍]: "getActivePinia()" was called but there was no active Pinia. Are you trying to use a store before calling "app.use(pinia)"?
See https://pinia.vuejs.org/core-concepts/outside-component-usage.html for help.
This will fail in production.`);
}
pinia2 = activePinia;
if (!pinia2._s.has(id)) {
if (isSetupStore) {
createSetupStore(id, setup, options, pinia2);
} else {
createOptionsStore(id, options, pinia2);
}
{
useStore2._pinia = pinia2;
}
}
const store2 = pinia2._s.get(id);
if (hot) {
const hotId = "__hot:" + id;
const newStore = isSetupStore ? createSetupStore(hotId, setup, options, pinia2, true) : createOptionsStore(hotId, assign({}, options), pinia2, true);
hot._hotUpdate(newStore);
delete pinia2.state.value[hotId];
pinia2._s.delete(hotId);
}
if (IS_CLIENT) {
const currentInstance = vue.getCurrentInstance();
if (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] = store2;
}
}
return store2;
}
useStore2.$id = id;
return useStore2;
}
const useStore = defineStore("user", {
state: () => ({
userInfo: {},
// 用户信息
token: "",
// uploadUrl: 'http://192.168.1.3:8080/ai-file/upload/oss', // 上传资源的服务器网址
uploadUrl: "https://gc.sdzcq.com/prod-api/ai-file/upload/oss"
// 上传资源的服务器网址
}),
getters: {},
actions: {
setUserInfo(data) {
if (data.userId) {
formatAppLog("log", "at store/uses.js:16", "更新全局的用户信息-也更新本地存储", data);
this.userInfo = data;
uni.setStorageSync("userInfo", JSON.stringify(data));
} else {
uni.removeStorageSync("userInfo");
}
},
setToken(token) {
if (token) {
formatAppLog("log", "at store/uses.js:25", "更新全局的 token -也更新本地存储", token);
this.token = token;
uni.setStorageSync("token", token);
} else {
uni.removeStorageSync("token");
}
}
}
});
const pinia = createPinia();
const store = useStore(pinia);
const _sfc_main$1d = {
__name: "index",
props: {
request: {
type: Function
},
requestStr: {
type: String
},
isRefresh: {
type: [Number, Boolean],
default: 0
},
height: {
type: [String, Number]
},
total: {
type: [Number],
default: 0
},
otherParams: {
type: Object,
default: () => ({})
},
diffHeight: {
type: Number,
default: 0
},
immediate: {
type: Boolean,
default: false
}
},
emits: ["updateList", "update:total"],
setup(__props, { expose: __expose, emit: __emit }) {
const {
mescrollInit,
downCallback,
getMescroll
} = useMescroll();
const windowHeight = vue.computed(() => {
return store.clientHeight - props2.diffHeight;
});
const emit = __emit;
const props2 = __props;
const list = vue.ref([]);
const getList = (mescroll) => {
return new Promise((resolve, reject) => {
let params = {
pageNum: mescroll.num,
pageSize: mescroll.size,
...props2.otherParams
};
uni.$u.http.get(props2.requestStr, {
params
}).then((res) => {
emit("update:total", res.total);
resolve(res);
});
});
};
const upCallback = (mescroll) => {
if (!props2.requestStr)
return;
getList(mescroll).then((res) => {
const curPageData = res.rows || res.data || [];
if (mescroll.num == 1)
list.value = [];
list.value = list.value.concat(curPageData);
emit("updateList", list.value);
mescroll.endBySize(curPageData.length, res.total);
}).catch(() => {
mescroll.endErr();
});
};
const resetUpScroll = () => {
emit("updateList", []);
setTimeout(() => {
getMescroll().resetUpScroll();
}, 100);
};
const scroll = (e) => {
emit("scroll", e);
};
__expose({
resetUpScroll
});
const __returned__ = { mescrollInit, downCallback, getMescroll, windowHeight, emit, props: props2, list, getList, upCallback, resetUpScroll, scroll, computed: vue.computed, onMounted: vue.onMounted, ref: vue.ref, watch: vue.watch, get onShow() {
return onShow;
}, get useMescroll() {
return useMescroll;
}, get store() {
return store;
} };
Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
return __returned__;
}
};
function _sfc_render$1c(_ctx, _cache, $props, $setup, $data, $options) {
const _component_mescroll_uni = resolveEasycom(vue.resolveDynamicComponent("mescroll-uni"), __easycom_0$6);
return vue.openBlock(), vue.createBlock(_component_mescroll_uni, {
onInit: $setup.mescrollInit,
onDown: $setup.downCallback,
onUp: $setup.upCallback,
height: $props.height || $setup.windowHeight + "px",
up: { textNoMore: "-- 没有更多了 --" }
}, {
default: vue.withCtx(() => [
vue.renderSlot(_ctx.$slots, "default", {}, void 0, true)
]),
_: 3
/* FORWARDED */
}, 8, ["onInit", "onDown", "height"]);
}
const PageScroll = /* @__PURE__ */ _export_sfc(_sfc_main$1d, [["render", _sfc_render$1c], ["__scopeId", "data-v-30bc23e1"], ["__file", "E:/书嗨项目/shuhi-app-fornt/components/pageScroll/index.vue"]]);
const _sfc_main$1c = {
__name: "index",
setup(__props, { expose: __expose }) {
__expose();
const statusList = vue.ref([
{
label: "待初审",
value: "1361",
path: "/pages/order/stat/pending-review"
},
{
label: "待拣件",
value: "1361",
path: "/pages/order/stat/pending-pick"
},
{
label: "已拣件待签收",
value: "1361",
path: "/pages/order/stat/pending-sign"
},
{
label: "待确认收货",
value: "1361",
path: "/pages/order/stat/pending-confirm"
},
{
label: "已到货待审核",
value: "1361",
path: "/pages/order/stat/pending-audit"
},
{
label: "待付款",
value: "1361",
path: "/pages/order/stat/pending-payment"
}
]);
const navigateToDetail = (path) => {
uni.navigateTo({
url: path
});
};
const __returned__ = { statusList, navigateToDetail, PageScroll, ref: vue.ref };
Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
return __returned__;
}
};
function _sfc_render$1b(_ctx, _cache, $props, $setup, $data, $options) {
const _component_u_icon = resolveEasycom(vue.resolveDynamicComponent("u-icon"), __easycom_0$a);
const _component_u_cell = resolveEasycom(vue.resolveDynamicComponent("u-cell"), __easycom_1$7);
const _component_u_cell_group = resolveEasycom(vue.resolveDynamicComponent("u-cell-group"), __easycom_2$6);
return vue.openBlock(), vue.createElementBlock("view", { class: "order-statistics" }, [
vue.createCommentVNode(" 顶部统计卡片 "),
vue.createElementVNode("view", { class: "overview-card" }, [
vue.createElementVNode("view", { class: "overview-grid" }, [
vue.createElementVNode("view", { class: "grid-item" }, [
vue.createElementVNode("text", { class: "item-label" }, "今日订单"),
vue.createElementVNode("text", { class: "item-value" }, "1361")
]),
vue.createElementVNode("view", { class: "grid-item" }, [
vue.createElementVNode("text", { class: "item-label" }, "昨日订单"),
vue.createElementVNode("text", { class: "item-value" }, "1361")
]),
vue.createElementVNode("view", { class: "grid-item" }, [
vue.createElementVNode("text", { class: "item-label" }, "本月订单"),
vue.createElementVNode("text", { class: "item-value" }, [
vue.createTextVNode("2.77"),
vue.createElementVNode("text", { class: "unit" }, "万")
])
])
])
]),
vue.createCommentVNode(" 订单状态网格 "),
vue.createElementVNode("view", { class: "status-grid" }, [
(vue.openBlock(true), vue.createElementBlock(
vue.Fragment,
null,
vue.renderList($setup.statusList, (item, index2) => {
return vue.openBlock(), vue.createElementBlock("view", {
key: index2,
class: "status-item",
onClick: ($event) => $setup.navigateToDetail(item.path)
}, [
vue.createElementVNode("view", { class: "status-content" }, [
vue.createElementVNode(
"text",
{ class: "status-label" },
vue.toDisplayString(item.label),
1
/* TEXT */
),
vue.createElementVNode("view", { class: "status-value-wrap" }, [
vue.createElementVNode(
"text",
{ class: "status-value" },
vue.toDisplayString(item.value),
1
/* TEXT */
),
vue.createVNode(_component_u_icon, {
name: "arrow-right",
color: "#999",
size: "14"
})
])
])
], 8, ["onClick"]);
}),
128
/* KEYED_FRAGMENT */
))
]),
vue.createCommentVNode(" 底部操作项 "),
vue.createElementVNode("view", { class: "bottom-actions" }, [
vue.createVNode(_component_u_cell_group, { border: false }, {
default: vue.withCtx(() => [
vue.createVNode(_component_u_cell, {
title: "收货统计",
isLink: "",
onClick: _cache[0] || (_cache[0] = ($event) => $setup.navigateToDetail("/pages/statistics/receive"))
}),
vue.createVNode(_component_u_cell, {
title: "全部订单",
isLink: "",
onClick: _cache[1] || (_cache[1] = ($event) => $setup.navigateToDetail("/pages/order/stat/all")),
border: false
})
]),
_: 1
/* STABLE */
})
])
]);
}
const PagesOrderIndex = /* @__PURE__ */ _export_sfc(_sfc_main$1c, [["render", _sfc_render$1b], ["__scopeId", "data-v-17a44f9d"], ["__file", "E:/书嗨项目/shuhi-app-fornt/pages/order/index.vue"]]);
const props$p = {
props: {
// 搜索框形状,round-圆形,square-方形
shape: {
type: String,
default: props$x.search.shape
},
// 搜索框背景色,默认值#f2f2f2
bgColor: {
type: String,
default: props$x.search.bgColor
},
// 占位提示文字
placeholder: {
type: String,
default: props$x.search.placeholder
},
// 是否启用清除控件
clearabled: {
type: Boolean,
default: props$x.search.clearabled
},
// 是否自动聚焦
focus: {
type: Boolean,
default: props$x.search.focus
},
// 是否在搜索框右侧显示取消按钮
showAction: {
type: Boolean,
default: props$x.search.showAction
},
// 右边控件的样式
actionStyle: {
type: Object,
default: props$x.search.actionStyle
},
// 取消按钮文字
actionText: {
type: String,
default: props$x.search.actionText
},
// 输入框内容对齐方式,可选值为 left|center|right
inputAlign: {
type: String,
default: props$x.search.inputAlign
},
// input输入框的样式,可以定义文字颜色,大小等,对象形式
inputStyle: {
type: Object,
default: props$x.search.inputStyle
},
// 是否启用输入框
disabled: {
type: Boolean,
default: props$x.search.disabled
},
// 边框颜色
borderColor: {
type: String,
default: props$x.search.borderColor
},
// 搜索图标的颜色,默认同输入框字体颜色
searchIconColor: {
type: String,
default: props$x.search.searchIconColor
},
// 输入框字体颜色
color: {
type: String,
default: props$x.search.color
},
// placeholder的颜色
placeholderColor: {
type: String,
default: props$x.search.placeholderColor
},
// 左边输入框的图标,可以为uView图标名称或图片路径
searchIcon: {
type: String,
default: props$x.search.searchIcon
},
searchIconSize: {
type: [Number, String],
default: props$x.search.searchIconSize
},
// 组件与其他上下左右元素之间的距离,带单位的字符串形式,如"30px"、"30px 20px"等写法
margin: {
type: String,
default: props$x.search.margin
},
// 开启showAction时,是否在input获取焦点时才显示
animation: {
type: Boolean,
default: props$x.search.animation
},
// 输入框的初始化内容
modelValue: {
type: String,
default: props$x.search.value
},
value: {
type: String,
default: props$x.search.value
},
// 输入框最大能输入的长度,-1为不限制长度(来自uniapp文档)
maxlength: {
type: [String, Number],
default: props$x.search.maxlength
},
// 搜索框高度,单位px
height: {
type: [String, Number],
default: props$x.search.height
},
// 搜索框左侧文本
label: {
type: [String, Number, null],
default: props$x.search.label
}
}
};
const _sfc_main$1b = {
name: "u-search",
mixins: [mpMixin, mixin, props$p],
data() {
return {
keyword: "",
showClear: false,
// 是否显示右边的清除图标
show: false,
// 标记input当前状态是否处于聚焦中,如果是,才会显示右侧的清除控件
focused: this.focus
// 绑定输入框的值
// inputValue: this.value
};
},
watch: {
keyword(nVal) {
this.$emit("update:modelValue", nVal);
this.$emit("change", nVal);
},
modelValue: {
immediate: true,
handler(nVal) {
this.keyword = nVal;
}
}
},
computed: {
showActionBtn() {
return !this.animation && this.showAction;
}
},
emits: ["clear", "search", "custom", "focus", "blur", "click", "clickIcon", "update:modelValue", "change"],
methods: {
// 目前HX2.6.9 v-model双向绑定无效,故监听input事件获取输入框内容的变化
inputChange(e) {
this.keyword = e.detail.value;
},
// 清空输入
// 也可以作为用户通过this.$refs形式调用清空输入框内容
clear() {
this.keyword = "";
this.$nextTick(() => {
this.$emit("clear");
});
},
// 确定搜索
search(e) {
this.$emit("search", e.detail.value);
try {
uni.hideKeyboard();
} catch (e2) {
}
},
// 点击右边自定义按钮的事件
custom() {
this.$emit("custom", this.keyword);
try {
uni.hideKeyboard();
} catch (e) {
}
},
// 获取焦点
getFocus() {
this.focused = true;
if (this.animation && this.showAction)
this.show = true;
this.$emit("focus", this.keyword);
},
// 失去焦点
blur() {
setTimeout(() => {
this.focused = false;
}, 100);
this.show = false;
this.$emit("blur", this.keyword);
},
// 点击搜索框,只有disabled=true时才发出事件,因为禁止了输入,意味着是想跳转真正的搜索页
clickHandler() {
if (this.disabled)
this.$emit("click");
},
// 点击左边图标
clickIcon() {
this.$emit("clickIcon");
}
}
};
function _sfc_render$1a(_ctx, _cache, $props, $setup, $data, $options) {
const _component_u_icon = resolveEasycom(vue.resolveDynamicComponent("u-icon"), __easycom_0$a);
return vue.openBlock(), vue.createElementBlock(
"view",
{
class: "u-search",
onClick: _cache[6] || (_cache[6] = (...args) => $options.clickHandler && $options.clickHandler(...args)),
style: vue.normalizeStyle([{
margin: _ctx.margin
}, _ctx.$u.addStyle(_ctx.customStyle)])
},
[
vue.createElementVNode(
"view",
{
class: "u-search__content",
style: vue.normalizeStyle({
backgroundColor: _ctx.bgColor,
borderRadius: _ctx.shape == "round" ? "100px" : "4px",
borderColor: _ctx.borderColor
})
},
[
_ctx.$slots.label || _ctx.label !== null ? vue.renderSlot(_ctx.$slots, "label", { key: 0 }, () => [
vue.createElementVNode(
"text",
{ class: "u-search__content__label" },
vue.toDisplayString(_ctx.label),
1
/* TEXT */
)
], true) : vue.createCommentVNode("v-if", true),
vue.createElementVNode("view", { class: "u-search__content__icon" }, [
vue.createVNode(_component_u_icon, {
onClick: $options.clickIcon,
size: _ctx.searchIconSize,
name: _ctx.searchIcon,
color: _ctx.searchIconColor ? _ctx.searchIconColor : _ctx.color
}, null, 8, ["onClick", "size", "name", "color"])
]),
vue.createElementVNode("input", {
"confirm-type": "search",
onBlur: _cache[0] || (_cache[0] = (...args) => $options.blur && $options.blur(...args)),
value: $data.keyword,
onConfirm: _cache[1] || (_cache[1] = (...args) => $options.search && $options.search(...args)),
onInput: _cache[2] || (_cache[2] = (...args) => $options.inputChange && $options.inputChange(...args)),
disabled: _ctx.disabled,
onFocus: _cache[3] || (_cache[3] = (...args) => $options.getFocus && $options.getFocus(...args)),
focus: _ctx.focus,
maxlength: _ctx.maxlength,
"placeholder-class": "u-search__content__input--placeholder",
placeholder: _ctx.placeholder,
"placeholder-style": `color: ${_ctx.placeholderColor}`,
class: "u-search__content__input",
type: "text",
style: vue.normalizeStyle([{
textAlign: _ctx.inputAlign,
color: _ctx.color,
backgroundColor: _ctx.bgColor,
height: _ctx.$u.addUnit(_ctx.height)
}, _ctx.inputStyle])
}, null, 44, ["value", "disabled", "focus", "maxlength", "placeholder", "placeholder-style"]),
$data.keyword && _ctx.clearabled && $data.focused ? (vue.openBlock(), vue.createElementBlock("view", {
key: 1,
class: "u-search__content__icon u-search__content__close",
onClick: _cache[4] || (_cache[4] = (...args) => $options.clear && $options.clear(...args))
}, [
vue.createVNode(_component_u_icon, {
name: "close",
size: "11",
color: "#ffffff",
customStyle: "line-height: 12px"
})
])) : vue.createCommentVNode("v-if", true)
],
4
/* STYLE */
),
vue.createElementVNode(
"text",
{
style: vue.normalizeStyle([_ctx.actionStyle]),
class: vue.normalizeClass(["u-search__action", [($options.showActionBtn || $data.show) && "u-search__action--active"]]),
onClick: _cache[5] || (_cache[5] = vue.withModifiers((...args) => $options.custom && $options.custom(...args), ["stop", "prevent"]))
},
vue.toDisplayString(_ctx.actionText),
7
/* TEXT, CLASS, STYLE */
)
],
4
/* STYLE */
);
}
const __easycom_2$5 = /* @__PURE__ */ _export_sfc(_sfc_main$1b, [["render", _sfc_render$1a], ["__scopeId", "data-v-e082a34a"], ["__file", "E:/书嗨项目/shuhi-app-fornt/uni_modules/uview-plus/components/u-search/u-search.vue"]]);
const props$o = {
props: {
// 绑定的值
modelValue: {
type: [String, Number],
default: props$x.input.value
},
// number-数字输入键盘,app-vue下可以输入浮点数,app-nvue和小程序平台下只能输入整数
// idcard-身份证输入键盘,微信、支付宝、百度、QQ小程序
// digit-带小数点的数字键盘,App的nvue页面、微信、支付宝、百度、头条、QQ小程序
// text-文本输入键盘
type: {
type: String,
default: props$x.input.type
},
// 如果 textarea 是在一个 position:fixed 的区域,需要显示指定属性 fixed 为 true,
// 兼容性:微信小程序、百度小程序、字节跳动小程序、QQ小程序
fixed: {
type: Boolean,
default: props$x.input.fixed
},
// 是否禁用输入框
disabled: {
type: Boolean,
default: props$x.input.disabled
},
// 禁用状态时的背景色
disabledColor: {
type: String,
default: props$x.input.disabledColor
},
// 是否显示清除控件
clearable: {
type: Boolean,
default: props$x.input.clearable
},
// 是否密码类型
password: {
type: Boolean,
default: props$x.input.password
},
// 最大输入长度,设置为 -1 的时候不限制最大长度
maxlength: {
type: [String, Number],
default: props$x.input.maxlength
},
// 输入框为空时的占位符
placeholder: {
type: String,
default: props$x.input.placeholder
},
// 指定placeholder的样式类,注意页面或组件的style中写了scoped时,需要在类名前写/deep/
placeholderClass: {
type: String,
default: props$x.input.placeholderClass
},
// 指定placeholder的样式
placeholderStyle: {
type: [String, Object],
default: props$x.input.placeholderStyle
},
// 是否显示输入字数统计,只在 type ="text"或type ="textarea"时有效
showWordLimit: {
type: Boolean,
default: props$x.input.showWordLimit
},
// 设置右下角按钮的文字,有效值:send|search|next|go|done,兼容性详见uni-app文档
// https://uniapp.dcloud.io/component/input
// https://uniapp.dcloud.io/component/textarea
confirmType: {
type: String,
default: props$x.input.confirmType
},
// 点击键盘右下角按钮时是否保持键盘不收起,H5无效
confirmHold: {
type: Boolean,
default: props$x.input.confirmHold
},
// focus时,点击页面的时候不收起键盘,微信小程序有效
holdKeyboard: {
type: Boolean,
default: props$x.input.holdKeyboard
},
// 自动获取焦点
// 在 H5 平台能否聚焦以及软键盘是否跟随弹出,取决于当前浏览器本身的实现。nvue 页面不支持,需使用组件的 focus()、blur() 方法控制焦点
focus: {
type: Boolean,
default: props$x.input.focus
},
// 键盘收起时,是否自动失去焦点,目前仅App3.0.0+有效
autoBlur: {
type: Boolean,
default: props$x.input.autoBlur
},
// 是否去掉 iOS 下的默认内边距,仅微信小程序,且type=textarea时有效
disableDefaultPadding: {
type: Boolean,
default: props$x.input.disableDefaultPadding
},
// 指定focus时光标的位置
cursor: {
type: [String, Number],
default: props$x.input.cursor
},
// 输入框聚焦时底部与键盘的距离
cursorSpacing: {
type: [String, Number],
default: props$x.input.cursorSpacing
},
// 光标起始位置,自动聚集时有效,需与selection-end搭配使用
selectionStart: {
type: [String, Number],
default: props$x.input.selectionStart
},
// 光标结束位置,自动聚集时有效,需与selection-start搭配使用
selectionEnd: {
type: [String, Number],
default: props$x.input.selectionEnd
},
// 键盘弹起时,是否自动上推页面
adjustPosition: {
type: Boolean,
default: props$x.input.adjustPosition
},
// 输入框内容对齐方式,可选值为:left|center|right
inputAlign: {
type: String,
default: props$x.input.inputAlign
},
// 输入框字体的大小
fontSize: {
type: [String, Number],
default: props$x.input.fontSize
},
// 输入框字体颜色
color: {
type: String,
default: props$x.input.color
},
// 输入框前置图标
prefixIcon: {
type: String,
default: props$x.input.prefixIcon
},
// 前置图标样式,对象或字符串
prefixIconStyle: {
type: [String, Object],
default: props$x.input.prefixIconStyle
},
// 输入框后置图标
suffixIcon: {
type: String,
default: props$x.input.suffixIcon
},
// 后置图标样式,对象或字符串
suffixIconStyle: {
type: [String, Object],
default: props$x.input.suffixIconStyle
},
// 边框类型,surround-四周边框,bottom-底部边框,none-无边框
border: {
type: String,
default: props$x.input.border
},
// 是否只读,与disabled不同之处在于disabled会置灰组件,而readonly则不会
readonly: {
type: Boolean,
default: props$x.input.readonly
},
// 输入框形状,circle-圆形,square-方形
shape: {
type: String,
default: props$x.input.shape
},
// 用于处理或者过滤输入框内容的方法
formatter: {
type: [Function, null],
default: props$x.input.formatter
},
// 是否忽略组件内对文本合成系统事件的处理
ignoreCompositionEvent: {
type: Boolean,
default: true
}
}
};
const _sfc_main$1a = {
name: "u-input",
mixins: [mpMixin, mixin, props$o],
data() {
return {
// 输入框的值
innerValue: "",
// 是否处于获得焦点状态
focused: false,
// value是否第一次变化,在watch中,由于加入immediate属性,会在第一次触发,此时不应该认为value发生了变化
firstChange: true,
// value绑定值的变化是由内部还是外部引起的
changeFromInner: false,
// 过滤处理方法
innerFormatter: (value2) => value2
};
},
watch: {
modelValue: {
immediate: true,
handler(newVal, oldVal) {
this.innerValue = newVal;
this.firstChange = false;
this.changeFromInner = false;
}
}
},
computed: {
// 是否显示清除控件
isShowClear() {
const { clearable, readonly, focused, innerValue } = this;
return !!clearable && !readonly && !!focused && innerValue !== "";
},
// 组件的类名
inputClass() {
let classes = [], { border, disabled, shape } = this;
border === "surround" && (classes = classes.concat(["u-border", "u-input--radius"]));
classes.push(`u-input--${shape}`);
border === "bottom" && (classes = classes.concat([
"u-border-bottom",
"u-input--no-radius"
]));
return classes.join(" ");
},
// 组件的样式
wrapperStyle() {
const style = {};
if (this.disabled) {
style.backgroundColor = this.disabledColor;
}
if (this.border === "none") {
style.padding = "0";
} else {
style.paddingTop = "6px";
style.paddingBottom = "6px";
style.paddingLeft = "9px";
style.paddingRight = "9px";
}
return uni.$u.deepMerge(style, uni.$u.addStyle(this.customStyle));
},
// 输入框的样式
inputStyle() {
const style = {
color: this.color,
fontSize: uni.$u.addUnit(this.fontSize),
textAlign: this.inputAlign
};
return style;
}
},
emits: ["update:modelValue", "focus", "blur", "change", "confirm", "clear", "keyboardheightchange"],
methods: {
// 在微信小程序中,不支持将函数当做props参数,故只能通过ref形式调用
setFormatter(e) {
this.innerFormatter = e;
},
// 当键盘输入时,触发input事件
onInput(e) {
let { value: value2 = "" } = e.detail || {};
const formatter = this.formatter || this.innerFormatter;
const formatValue = formatter(value2);
this.innerValue = value2;
this.$nextTick(() => {
this.innerValue = formatValue;
this.valueChange();
});
},
// 输入框失去焦点时触发
onBlur(event) {
this.$emit("blur", event.detail.value);
uni.$u.sleep(50).then(() => {
this.focused = false;
});
uni.$u.formValidate(this, "blur");
},
// 输入框聚焦时触发
onFocus(event) {
this.focused = true;
this.$emit("focus");
},
// 点击完成按钮时触发
onConfirm(event) {
this.$emit("confirm", this.innerValue);
},
// 键盘高度发生变化的时候触发此事件
// 兼容性:微信小程序2.7.0+、App 3.1.0+
onkeyboardheightchange() {
this.$emit("keyboardheightchange");
},
// 内容发生变化,进行处理
valueChange() {
const value2 = this.innerValue;
this.$nextTick(() => {
this.$emit("update:modelValue", value2);
this.changeFromInner = true;
this.$emit("change", value2);
uni.$u.formValidate(this, "change");
});
},
// 点击清除控件
onClear() {
this.innerValue = "";
this.$nextTick(() => {
this.valueChange();
this.$emit("clear");
});
},
/**
* 在安卓nvue上,事件无法冒泡
* 在某些时间,我们希望监听u-from-item的点击事件,此时会导致点击u-form-item内的u-input后
* 无法触发u-form-item的点击事件,这里通过手动调用u-form-item的方法进行触发
*/
clickHandler() {
}
}
};
function _sfc_render$19(_ctx, _cache, $props, $setup, $data, $options) {
const _component_u_icon = resolveEasycom(vue.resolveDynamicComponent("u-icon"), __easycom_0$a);
return vue.openBlock(), vue.createElementBlock(
"view",
{
class: vue.normalizeClass(["u-input", $options.inputClass]),
style: vue.normalizeStyle([$options.wrapperStyle])
},
[
vue.createElementVNode("view", { class: "u-input__content" }, [
_ctx.prefixIcon || _ctx.$slots.prefix ? (vue.openBlock(), vue.createElementBlock("view", {
key: 0,
class: "u-input__content__prefix-icon"
}, [
vue.renderSlot(_ctx.$slots, "prefix", {}, () => [
vue.createVNode(_component_u_icon, {
name: _ctx.prefixIcon,
size: "18",
customStyle: _ctx.prefixIconStyle
}, null, 8, ["name", "customStyle"])
], true)
])) : vue.createCommentVNode("v-if", true),
vue.createElementVNode("view", {
class: "u-input__content__field-wrapper",
onClick: _cache[5] || (_cache[5] = (...args) => $options.clickHandler && $options.clickHandler(...args))
}, [
vue.createCommentVNode(" 根据uni-app的input组件文档,H5和APP中只要声明了password参数(无论true还是false),type均失效,此时\r\n 为了防止type=number时,又存在password属性,type无效,此时需要设置password为undefined\r\n "),
vue.createElementVNode("input", {
class: "u-input__content__field-wrapper__field",
style: vue.normalizeStyle([$options.inputStyle]),
type: _ctx.type,
focus: _ctx.focus,
cursor: _ctx.cursor,
value: $data.innerValue,
"auto-blur": _ctx.autoBlur,
disabled: _ctx.disabled || _ctx.readonly,
maxlength: _ctx.maxlength,
placeholder: _ctx.placeholder,
"placeholder-style": _ctx.placeholderStyle,
"placeholder-class": _ctx.placeholderClass,
"confirm-type": _ctx.confirmType,
"confirm-hold": _ctx.confirmHold,
"hold-keyboard": _ctx.holdKeyboard,
"cursor-spacing": _ctx.cursorSpacing,
"adjust-position": _ctx.adjustPosition,
"selection-end": _ctx.selectionEnd,
"selection-start": _ctx.selectionStart,
password: _ctx.password || _ctx.type === "password" || void 0,
ignoreCompositionEvent: _ctx.ignoreCompositionEvent,
onInput: _cache[0] || (_cache[0] = (...args) => $options.onInput && $options.onInput(...args)),
onBlur: _cache[1] || (_cache[1] = (...args) => $options.onBlur && $options.onBlur(...args)),
onFocus: _cache[2] || (_cache[2] = (...args) => $options.onFocus && $options.onFocus(...args)),
onConfirm: _cache[3] || (_cache[3] = (...args) => $options.onConfirm && $options.onConfirm(...args)),
onKeyboardheightchange: _cache[4] || (_cache[4] = (...args) => $options.onkeyboardheightchange && $options.onkeyboardheightchange(...args))
}, null, 44, ["type", "focus", "cursor", "value", "auto-blur", "disabled", "maxlength", "placeholder", "placeholder-style", "placeholder-class", "confirm-type", "confirm-hold", "hold-keyboard", "cursor-spacing", "adjust-position", "selection-end", "selection-start", "password", "ignoreCompositionEvent"])
]),
$options.isShowClear ? (vue.openBlock(), vue.createElementBlock("view", {
key: 1,
class: "u-input__content__clear",
onClick: _cache[6] || (_cache[6] = (...args) => $options.onClear && $options.onClear(...args))
}, [
vue.createVNode(_component_u_icon, {
name: "close",
size: "11",
color: "#ffffff",
customStyle: "line-height: 12px"
})
])) : vue.createCommentVNode("v-if", true),
_ctx.suffixIcon || _ctx.$slots.suffix ? (vue.openBlock(), vue.createElementBlock("view", {
key: 2,
class: "u-input__content__subfix-icon"
}, [
vue.renderSlot(_ctx.$slots, "suffix", {}, () => [
vue.createVNode(_component_u_icon, {
name: _ctx.suffixIcon,
size: "18",
customStyle: _ctx.suffixIconStyle
}, null, 8, ["name", "customStyle"])
], true)
])) : vue.createCommentVNode("v-if", true)
])
],
6
/* CLASS, STYLE */
);
}
const __easycom_1$6 = /* @__PURE__ */ _export_sfc(_sfc_main$1a, [["render", _sfc_render$19], ["__scopeId", "data-v-df79975b"], ["__file", "E:/书嗨项目/shuhi-app-fornt/uni_modules/uview-plus/components/u-input/u-input.vue"]]);
const props$n = {
props: {
// input的label提示语
label: {
type: String,
default: props$x.formItem.label
},
// 绑定的值
prop: {
type: String,
default: props$x.formItem.prop
},
// 是否显示表单域的下划线边框
borderBottom: {
type: [String, Boolean],
default: props$x.formItem.borderBottom
},
// label的宽度,单位px
labelWidth: {
type: [String, Number],
default: props$x.formItem.labelWidth
},
// 右侧图标
rightIcon: {
type: String,
default: props$x.formItem.rightIcon
},
// 左侧图标
leftIcon: {
type: String,
default: props$x.formItem.leftIcon
},
// 是否显示左边的必填星号,只作显示用,具体校验必填的逻辑,请在rules中配置
required: {
type: Boolean,
default: props$x.formItem.required
},
leftIconStyle: {
type: [String, Object],
default: props$x.formItem.leftIconStyle
}
}
};
const _sfc_main$19 = {
name: "u-form-item",
mixins: [mpMixin, mixin, props$n],
data() {
return {
// 错误提示语
message: "",
parentData: {
// 提示文本的位置
labelPosition: "left",
// 提示文本对齐方式
labelAlign: "left",
// 提示文本的样式
labelStyle: {},
// 提示文本的宽度
labelWidth: 45,
// 错误提示方式
errorType: "message"
}
};
},
// 组件创建完成时,将当前实例保存到u-form中
computed: {
propsLine() {
return uni.$u.props.line;
}
},
mounted() {
this.init();
},
methods: {
init() {
this.updateParentData();
if (!this.parent) {
uni.$u.error("u-form-item需要结合u-form组件使用");
}
},
// 获取父组件的参数
updateParentData() {
this.getParentData("u-form");
},
// 移除u-form-item的校验结果
clearValidate() {
this.message = null;
},
// 清空当前的组件的校验结果,并重置为初始值
resetField() {
const value2 = uni.$u.getProperty(this.parent.originalModel, this.prop);
uni.$u.setProperty(this.parent.model, this.prop, value2);
this.message = null;
},
// 点击组件
clickHandler() {
this.$emit("click");
}
}
};
function _sfc_render$18(_ctx, _cache, $props, $setup, $data, $options) {
const _component_u_icon = resolveEasycom(vue.resolveDynamicComponent("u-icon"), __easycom_0$a);
const _component_u_line = resolveEasycom(vue.resolveDynamicComponent("u-line"), __easycom_0$8);
return vue.openBlock(), vue.createElementBlock("view", { class: "u-form-item" }, [
vue.createElementVNode(
"view",
{
class: "u-form-item__body",
onClick: _cache[0] || (_cache[0] = (...args) => $options.clickHandler && $options.clickHandler(...args)),
style: vue.normalizeStyle([_ctx.$u.addStyle(_ctx.customStyle), {
flexDirection: $data.parentData.labelPosition === "left" ? "row" : "column"
}])
},
[
vue.createCommentVNode(' 微信小程序中,将一个参数设置空字符串,结果会变成字符串"true" '),
vue.renderSlot(_ctx.$slots, "label", {}, () => [
vue.createCommentVNode(" {{required}} "),
_ctx.required || _ctx.leftIcon || _ctx.label ? (vue.openBlock(), vue.createElementBlock(
"view",
{
key: 0,
class: "u-form-item__body__left",
style: vue.normalizeStyle({
width: _ctx.$u.addUnit(_ctx.labelWidth || $data.parentData.labelWidth),
marginBottom: $data.parentData.labelPosition === "left" ? 0 : "5px"
})
},
[
vue.createCommentVNode(" 为了块对齐 "),
vue.createElementVNode("view", { class: "u-form-item__body__left__content" }, [
vue.createCommentVNode(" nvue不支持伪元素before "),
_ctx.required ? (vue.openBlock(), vue.createElementBlock("text", {
key: 0,
class: "u-form-item__body__left__content__required"
}, "*")) : vue.createCommentVNode("v-if", true),
_ctx.leftIcon ? (vue.openBlock(), vue.createElementBlock("view", {
key: 1,
class: "u-form-item__body__left__content__icon"
}, [
vue.createVNode(_component_u_icon, {
name: _ctx.leftIcon,
"custom-style": _ctx.leftIconStyle
}, null, 8, ["name", "custom-style"])
])) : vue.createCommentVNode("v-if", true),
vue.createElementVNode(
"text",
{
class: "u-form-item__body__left__content__label",
style: vue.normalizeStyle([$data.parentData.labelStyle, {
justifyContent: $data.parentData.labelAlign === "left" ? "flex-start" : $data.parentData.labelAlign === "center" ? "center" : "flex-end"
}])
},
vue.toDisplayString(_ctx.label),
5
/* TEXT, STYLE */
)
])
],
4
/* STYLE */
)) : vue.createCommentVNode("v-if", true)
], true),
vue.createElementVNode("view", { class: "u-form-item__body__right" }, [
vue.createElementVNode("view", { class: "u-form-item__body__right__content" }, [
vue.createElementVNode("view", { class: "u-form-item__body__right__content__slot" }, [
vue.renderSlot(_ctx.$slots, "default", {}, void 0, true)
]),
_ctx.$slots.right ? (vue.openBlock(), vue.createElementBlock("view", {
key: 0,
class: "item__body__right__content__icon"
}, [
vue.renderSlot(_ctx.$slots, "right", {}, void 0, true)
])) : vue.createCommentVNode("v-if", true)
])
])
],
4
/* STYLE */
),
vue.renderSlot(_ctx.$slots, "error", {}, () => [
!!$data.message && $data.parentData.errorType === "message" ? (vue.openBlock(), vue.createElementBlock(
"text",
{
key: 0,
class: "u-form-item__body__right__message",
style: vue.normalizeStyle({
marginLeft: _ctx.$u.addUnit($data.parentData.labelPosition === "top" ? 0 : _ctx.labelWidth || $data.parentData.labelWidth)
})
},
vue.toDisplayString($data.message),
5
/* TEXT, STYLE */
)) : vue.createCommentVNode("v-if", true)
], true),
_ctx.borderBottom ? (vue.openBlock(), vue.createBlock(_component_u_line, {
key: 0,
color: $data.message && $data.parentData.errorType === "border-bottom" ? _ctx.$u.color.error : $options.propsLine.color,
customStyle: `margin-top: ${$data.message && $data.parentData.errorType === "message" ? "5px" : 0}`
}, null, 8, ["color", "customStyle"])) : vue.createCommentVNode("v-if", true)
]);
}
const __easycom_2$4 = /* @__PURE__ */ _export_sfc(_sfc_main$19, [["render", _sfc_render$18], ["__scopeId", "data-v-42bac3de"], ["__file", "E:/书嗨项目/shuhi-app-fornt/uni_modules/uview-plus/components/u-form-item/u-form-item.vue"]]);
const props$m = {
props: {
// 是否显示组件
show: {
type: Boolean,
default: props$x.loadingIcon.show
},
// 颜色
color: {
type: String,
default: props$x.loadingIcon.color
},
// 提示文字颜色
textColor: {
type: String,
default: props$x.loadingIcon.textColor
},
// 文字和图标是否垂直排列
vertical: {
type: Boolean,
default: props$x.loadingIcon.vertical
},
// 模式选择,circle-圆形,spinner-花朵形,semicircle-半圆形
mode: {
type: String,
default: props$x.loadingIcon.mode
},
// 图标大小,单位默认px
size: {
type: [String, Number],
default: props$x.loadingIcon.size
},
// 文字大小
textSize: {
type: [String, Number],
default: props$x.loadingIcon.textSize
},
// 文字内容
text: {
type: [String, Number],
default: props$x.loadingIcon.text
},
// 动画模式
timingFunction: {
type: String,
default: props$x.loadingIcon.timingFunction
},
// 动画执行周期时间
duration: {
type: [String, Number],
default: props$x.loadingIcon.duration
},
// mode=circle时的暗边颜色
inactiveColor: {
type: String,
default: props$x.loadingIcon.inactiveColor
}
}
};
const _sfc_main$18 = {
name: "u-loading-icon",
mixins: [mpMixin, mixin, props$m],
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$17(_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$5 = /* @__PURE__ */ _export_sfc(_sfc_main$18, [["render", _sfc_render$17], ["__scopeId", "data-v-2af81691"], ["__file", "E:/书嗨项目/shuhi-app-fornt/uni_modules/uview-plus/components/u-loading-icon/u-loading-icon.vue"]]);
function pickExclude(obj, keys) {
if (!["[object Object]", "[object File]"].includes(Object.prototype.toString.call(obj))) {
return {};
}
return Object.keys(obj).reduce((prev, key) => {
if (!keys.includes(key)) {
prev[key] = obj[key];
}
return prev;
}, {});
}
function formatImage(res) {
return res.tempFiles.map((item) => ({
...pickExclude(item, ["path"]),
type: "image",
url: item.path,
thumb: item.path,
size: item.size
}));
}
function formatVideo(res) {
return [
{
...pickExclude(res, ["tempFilePath", "thumbTempFilePath", "errMsg"]),
type: "video",
url: res.tempFilePath,
thumb: res.thumbTempFilePath,
size: res.size
}
];
}
function chooseFile({
accept,
multiple,
capture,
compressed,
maxDuration,
sizeType,
camera,
maxCount
}) {
return new Promise((resolve, reject) => {
switch (accept) {
case "image":
uni.chooseImage({
count: multiple ? Math.min(maxCount, 9) : 1,
sourceType: capture,
sizeType,
success: (res) => resolve(formatImage(res)),
fail: reject
});
break;
case "video":
uni.chooseVideo({
sourceType: capture,
compressed,
maxDuration,
camera,
success: (res) => resolve(formatVideo(res)),
fail: reject
});
break;
}
});
}
const mixinUp = {
watch: {
// 监听accept的变化,判断是否符合个平台要求
// 只有微信小程序才支持选择媒体,文件类型,所以这里做一个判断提示
accept: {
immediate: true,
handler(val) {
if (val === "all" || val === "media") {
uni.$u.error("只有微信小程序才支持把accept配置为all、media之一");
}
if (val === "file") {
uni.$u.error("只有微信小程序和H5(HX2.9.9)才支持把accept配置为file");
}
}
}
}
};
const props$l = {
props: {
// 接受的文件类型, 可选值为all media image file video
accept: {
type: String,
default: props$x.upload.accept
},
// 图片或视频拾取模式,当accept为image类型时设置capture可选额外camera可以直接调起摄像头
capture: {
type: [String, Array],
default: props$x.upload.capture
},
// 当accept为video时生效,是否压缩视频,默认为true
compressed: {
type: Boolean,
default: props$x.upload.compressed
},
// 当accept为video时生效,可选值为back或front
camera: {
type: String,
default: props$x.upload.camera
},
// 当accept为video时生效,拍摄视频最长拍摄时间,单位秒
maxDuration: {
type: Number,
default: props$x.upload.maxDuration
},
// 上传区域的图标,只能内置图标
uploadIcon: {
type: String,
default: props$x.upload.uploadIcon
},
// 上传区域的图标的颜色,默认
uploadIconColor: {
type: String,
default: props$x.upload.uploadIconColor
},
// 是否开启文件读取前事件
useBeforeRead: {
type: Boolean,
default: props$x.upload.useBeforeRead
},
// 读取后的处理函数
afterRead: {
type: Function,
default: null
},
// 读取前的处理函数
beforeRead: {
type: Function,
default: null
},
// 是否显示组件自带的图片预览功能
previewFullImage: {
type: Boolean,
default: props$x.upload.previewFullImage
},
// 最大上传数量
maxCount: {
type: [String, Number],
default: props$x.upload.maxCount
},
// 是否启用
disabled: {
type: Boolean,
default: props$x.upload.disabled
},
// 预览上传的图片时的裁剪模式,和image组件mode属性一致
imageMode: {
type: String,
default: props$x.upload.imageMode
},
// 标识符,可以在回调函数的第二项参数中获取
name: {
type: String,
default: props$x.upload.name
},
// 所选的图片的尺寸, 可选值为original compressed
sizeType: {
type: Array,
default: props$x.upload.sizeType
},
// 是否开启图片多选,部分安卓机型不支持
multiple: {
type: Boolean,
default: props$x.upload.multiple
},
// 是否展示删除按钮
deletable: {
type: Boolean,
default: props$x.upload.deletable
},
// 文件大小限制,单位为byte
maxSize: {
type: [String, Number],
default: props$x.upload.maxSize
},
// 显示已上传的文件列表
fileList: {
type: Array,
default: props$x.upload.fileList
},
// 上传区域的提示文字
uploadText: {
type: String,
default: props$x.upload.uploadText
},
// 内部预览图片区域和选择图片按钮的区域宽度
width: {
type: [String, Number],
default: props$x.upload.width
},
// 内部预览图片区域和选择图片按钮的区域高度
height: {
type: [String, Number],
default: props$x.upload.height
},
// 是否在上传完成后展示预览图
previewImage: {
type: Boolean,
default: props$x.upload.previewImage
}
}
};
const _sfc_main$17 = {
name: "u-upload",
mixins: [mpMixin, mixin, mixinUp, props$l],
data() {
return {
lists: [],
isInCount: true
};
},
watch: {
// 监听文件列表的变化,重新整理内部数据
fileList: {
immediate: true,
handler() {
this.formatFileList();
},
immediate: true,
deep: true
}
},
emits: ["error", "beforeRead", "oversize", "afterRead", "delete", "clickPreview"],
methods: {
formatFileList() {
const {
fileList = [],
maxCount
} = this;
const lists = fileList.map(
(item) => Object.assign(Object.assign({}, item), {
// 如果item.url为本地选择的blob文件的话,无法判断其为video还是image,此处优先通过accept做判断处理
isImage: this.accept === "image" || uni.$u.test.image(item.url || item.thumb),
isVideo: this.accept === "video" || uni.$u.test.video(item.url || item.thumb),
deletable: typeof item.deletable === "boolean" ? item.deletable : this.deletable
})
);
this.lists = lists;
this.isInCount = lists.length < maxCount;
},
chooseFile() {
const {
maxCount,
multiple,
lists,
disabled
} = this;
if (disabled)
return;
let capture;
try {
capture = uni.$u.test.array(this.capture) ? this.capture : this.capture.split(",");
} catch (e) {
capture = [];
}
chooseFile(
Object.assign({
accept: this.accept,
multiple: this.multiple,
capture,
compressed: this.compressed,
maxDuration: this.maxDuration,
sizeType: this.sizeType,
camera: this.camera
}, {
maxCount: maxCount - lists.length
})
).then((res) => {
this.onBeforeRead(multiple ? res : res[0]);
}).catch((error2) => {
this.$emit("error", error2);
});
},
// 文件读取之前
onBeforeRead(file) {
const {
beforeRead,
useBeforeRead
} = this;
let res = true;
if (uni.$u.test.func(beforeRead)) {
res = beforeRead(file, this.getDetail());
}
if (useBeforeRead) {
res = new Promise((resolve, reject) => {
this.$emit(
"beforeRead",
Object.assign(Object.assign({
file
}, this.getDetail()), {
callback: (ok) => {
ok ? resolve() : reject();
}
})
);
});
}
if (!res) {
return;
}
if (uni.$u.test.promise(res)) {
res.then((data) => this.onAfterRead(data || file));
} else {
this.onAfterRead(file);
}
},
getDetail(index2) {
return {
name: this.name,
index: index2 == null ? this.fileList.length : index2
};
},
onAfterRead(file) {
const {
maxSize,
afterRead
} = this;
const oversize = Array.isArray(file) ? file.some((item) => item.size > maxSize) : file.size > maxSize;
if (oversize) {
this.$emit("oversize", Object.assign({
file
}, this.getDetail()));
return;
}
if (typeof afterRead === "function") {
afterRead(file, this.getDetail());
}
this.$emit("afterRead", Object.assign({
file
}, this.getDetail()));
},
deleteItem(index2) {
this.$emit(
"delete",
Object.assign(Object.assign({}, this.getDetail(index2)), {
file: this.fileList[index2]
})
);
},
// 预览图片
onPreviewImage(item) {
if (!item.isImage || !this.previewFullImage)
return;
uni.previewImage({
// 先filter找出为图片的item,再返回filter结果中的图片url
urls: this.lists.filter((item2) => this.accept === "image" || uni.$u.test.image(item2.url || item2.thumb)).map((item2) => item2.url || item2.thumb),
current: item.url || item.thumb,
fail() {
uni.$u.toast("预览图片失败");
}
});
},
onPreviewVideo(event) {
if (!this.data.previewFullImage)
return;
const {
index: index2
} = event.currentTarget.dataset;
const {
lists
} = this.data;
wx.previewMedia({
sources: lists.filter((item) => isVideoFile(item)).map(
(item) => Object.assign(Object.assign({}, item), {
type: "video"
})
),
current: index2,
fail() {
uni.$u.toast("预览视频失败");
}
});
},
onClickPreview(event) {
const {
index: index2
} = event.currentTarget.dataset;
const item = this.data.lists[index2];
this.$emit(
"clickPreview",
Object.assign(Object.assign({}, item), this.getDetail(index2))
);
}
}
};
function _sfc_render$16(_ctx, _cache, $props, $setup, $data, $options) {
const _component_u_icon = resolveEasycom(vue.resolveDynamicComponent("u-icon"), __easycom_0$a);
const _component_u_loading_icon = resolveEasycom(vue.resolveDynamicComponent("u-loading-icon"), __easycom_0$5);
return vue.openBlock(), vue.createElementBlock(
"view",
{
class: "u-upload",
style: vue.normalizeStyle([_ctx.$u.addStyle(_ctx.customStyle)])
},
[
vue.createElementVNode("view", { class: "u-upload__wrap" }, [
_ctx.previewImage ? (vue.openBlock(true), vue.createElementBlock(
vue.Fragment,
{ key: 0 },
vue.renderList($data.lists, (item, index2) => {
return vue.openBlock(), vue.createElementBlock("view", {
class: "u-upload__wrap__preview",
key: index2
}, [
item.isImage || item.type && item.type === "image" ? (vue.openBlock(), vue.createElementBlock("image", {
key: 0,
src: item.thumb || item.url,
mode: _ctx.imageMode,
class: "u-upload__wrap__preview__image",
onClick: ($event) => $options.onPreviewImage(item),
style: vue.normalizeStyle([{
width: _ctx.$u.addUnit(_ctx.width),
height: _ctx.$u.addUnit(_ctx.height)
}])
}, null, 12, ["src", "mode", "onClick"])) : (vue.openBlock(), vue.createElementBlock("view", {
key: 1,
class: "u-upload__wrap__preview__other"
}, [
vue.createVNode(_component_u_icon, {
color: "#80CBF9",
size: "26",
name: item.isVideo || item.type && item.type === "video" ? "movie" : "folder"
}, null, 8, ["name"]),
vue.createElementVNode(
"text",
{ class: "u-upload__wrap__preview__other__text" },
vue.toDisplayString(item.isVideo || item.type && item.type === "video" ? "视频" : "文件"),
1
/* TEXT */
)
])),
item.status === "uploading" || item.status === "failed" ? (vue.openBlock(), vue.createElementBlock("view", {
key: 2,
class: "u-upload__status"
}, [
vue.createElementVNode("view", { class: "u-upload__status__icon" }, [
item.status === "failed" ? (vue.openBlock(), vue.createBlock(_component_u_icon, {
key: 0,
name: "close-circle",
color: "#ffffff",
size: "25"
})) : (vue.openBlock(), vue.createBlock(_component_u_loading_icon, {
key: 1,
size: "22",
mode: "circle",
color: "#ffffff"
}))
]),
item.message ? (vue.openBlock(), vue.createElementBlock(
"text",
{
key: 0,
class: "u-upload__status__message"
},
vue.toDisplayString(item.message),
1
/* TEXT */
)) : vue.createCommentVNode("v-if", true)
])) : vue.createCommentVNode("v-if", true),
item.status !== "uploading" && (_ctx.deletable || item.deletable) ? (vue.openBlock(), vue.createElementBlock("view", {
key: 3,
class: "u-upload__deletable",
onClick: vue.withModifiers(($event) => $options.deleteItem(index2), ["stop"])
}, [
vue.createElementVNode("view", { class: "u-upload__deletable__icon" }, [
vue.createVNode(_component_u_icon, {
name: "close",
color: "#ffffff",
size: "10"
})
])
], 8, ["onClick"])) : vue.createCommentVNode("v-if", true),
item.status === "success" ? (vue.openBlock(), vue.createElementBlock("view", {
key: 4,
class: "u-upload__success"
}, [
vue.createElementVNode("view", { class: "u-upload__success__icon" }, [
vue.createVNode(_component_u_icon, {
name: "checkmark",
color: "#ffffff",
size: "12"
})
])
])) : vue.createCommentVNode("v-if", true)
]);
}),
128
/* KEYED_FRAGMENT */
)) : vue.createCommentVNode("v-if", true),
$data.isInCount ? (vue.openBlock(), vue.createElementBlock(
vue.Fragment,
{ key: 1 },
[
_ctx.$slots.default || _ctx.$slots.$default ? (vue.openBlock(), vue.createElementBlock("view", {
key: 0,
onClick: _cache[0] || (_cache[0] = (...args) => $options.chooseFile && $options.chooseFile(...args))
}, [
vue.renderSlot(_ctx.$slots, "default", {}, void 0, true)
])) : (vue.openBlock(), vue.createElementBlock("view", {
key: 1,
class: vue.normalizeClass(["u-upload__button", [_ctx.disabled && "u-upload__button--disabled"]]),
"hover-class": !_ctx.disabled ? "u-upload__button--hover" : "",
"hover-stay-time": "150",
onClick: _cache[1] || (_cache[1] = (...args) => $options.chooseFile && $options.chooseFile(...args)),
style: vue.normalizeStyle([{
width: _ctx.$u.addUnit(_ctx.width),
height: _ctx.$u.addUnit(_ctx.height)
}])
}, [
vue.createVNode(_component_u_icon, {
name: _ctx.uploadIcon,
size: "26",
color: _ctx.uploadIconColor
}, null, 8, ["name", "color"]),
_ctx.uploadText ? (vue.openBlock(), vue.createElementBlock(
"text",
{
key: 0,
class: "u-upload__button__text"
},
vue.toDisplayString(_ctx.uploadText),
1
/* TEXT */
)) : vue.createCommentVNode("v-if", true)
], 14, ["hover-class"]))
],
64
/* STABLE_FRAGMENT */
)) : vue.createCommentVNode("v-if", true)
])
],
4
/* STYLE */
);
}
const __easycom_2$3 = /* @__PURE__ */ _export_sfc(_sfc_main$17, [["render", _sfc_render$16], ["__scopeId", "data-v-c8491d64"], ["__file", "E:/书嗨项目/shuhi-app-fornt/uni_modules/uview-plus/components/u-upload/u-upload.vue"]]);
const props$k = {
props: {
// 当前form的需要验证字段的集合
model: {
type: Object,
default: props$x.form.model
},
// 验证规则
rules: {
type: [Object, Function, Array],
default: props$x.form.rules
},
// 有错误时的提示方式,message-提示信息,toast-进行toast提示
// border-bottom-下边框呈现红色,none-无提示
errorType: {
type: String,
default: props$x.form.errorType
},
// 是否显示表单域的下划线边框
borderBottom: {
type: Boolean,
default: props$x.form.borderBottom
},
// label的位置,left-左边,top-上边
labelPosition: {
type: String,
default: props$x.form.labelPosition
},
// label的宽度,单位px
labelWidth: {
type: [String, Number],
default: props$x.form.labelWidth
},
// lable字体的对齐方式
labelAlign: {
type: String,
default: props$x.form.labelAlign
},
// lable的样式,对象形式
labelStyle: {
type: Object,
default: props$x.form.labelStyle
}
}
};
var define_process_env_default = {};
const formatRegExp = /%[sdj%]/g;
let warning = function warning2() {
};
if (typeof process !== "undefined" && define_process_env_default && true && typeof window !== "undefined" && typeof document !== "undefined") {
warning = function warning3(type2, errors) {
if (typeof console !== "undefined" && console.warn) {
if (errors.every((e) => typeof e === "string")) {
formatAppLog("warn", "at uni_modules/uview-plus/libs/util/async-validator.js:28", type2, errors);
}
}
};
}
function convertFieldsError(errors) {
if (!errors || !errors.length)
return null;
const fields = {};
errors.forEach((error2) => {
const { field } = error2;
fields[field] = fields[field] || [];
fields[field].push(error2);
});
return fields;
}
function format() {
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
let i = 1;
const f = args[0];
const len = args.length;
if (typeof f === "function") {
return f.apply(null, args.slice(1));
}
if (typeof f === "string") {
let str = String(f).replace(formatRegExp, (x) => {
if (x === "%%") {
return "%";
}
if (i >= len) {
return x;
}
switch (x) {
case "%s":
return String(args[i++]);
case "%d":
return Number(args[i++]);
case "%j":
try {
return JSON.stringify(args[i++]);
} catch (_) {
return "[Circular]";
}
break;
default:
return x;
}
});
for (let arg = args[i]; i < len; arg = args[++i]) {
str += ` ${arg}`;
}
return str;
}
return f;
}
function isNativeStringType(type2) {
return type2 === "string" || type2 === "url" || type2 === "hex" || type2 === "email" || type2 === "pattern";
}
function isEmptyValue(value2, type2) {
if (value2 === void 0 || value2 === null) {
return true;
}
if (type2 === "array" && Array.isArray(value2) && !value2.length) {
return true;
}
if (isNativeStringType(type2) && typeof value2 === "string" && !value2) {
return true;
}
return false;
}
function asyncParallelArray(arr, func2, callback) {
const results = [];
let total = 0;
const arrLength = arr.length;
function count(errors) {
results.push.apply(results, errors);
total++;
if (total === arrLength) {
callback(results);
}
}
arr.forEach((a) => {
func2(a, count);
});
}
function asyncSerialArray(arr, func2, callback) {
let index2 = 0;
const arrLength = arr.length;
function next(errors) {
if (errors && errors.length) {
callback(errors);
return;
}
const original = index2;
index2 += 1;
if (original < arrLength) {
func2(arr[original], next);
} else {
callback([]);
}
}
next([]);
}
function flattenObjArr(objArr) {
const ret = [];
Object.keys(objArr).forEach((k) => {
ret.push.apply(ret, objArr[k]);
});
return ret;
}
function asyncMap(objArr, option, func2, callback) {
if (option.first) {
const _pending = new Promise((resolve, reject) => {
const next = function next2(errors) {
callback(errors);
return errors.length ? reject({
errors,
fields: convertFieldsError(errors)
}) : resolve();
};
const flattenArr = flattenObjArr(objArr);
asyncSerialArray(flattenArr, func2, next);
});
_pending.catch((e) => e);
return _pending;
}
let firstFields = option.firstFields || [];
if (firstFields === true) {
firstFields = Object.keys(objArr);
}
const objArrKeys = Object.keys(objArr);
const objArrLength = objArrKeys.length;
let total = 0;
const results = [];
const pending = new Promise((resolve, reject) => {
const next = function next2(errors) {
results.push.apply(results, errors);
total++;
if (total === objArrLength) {
callback(results);
return results.length ? reject({
errors: results,
fields: convertFieldsError(results)
}) : resolve();
}
};
if (!objArrKeys.length) {
callback(results);
resolve();
}
objArrKeys.forEach((key) => {
const arr = objArr[key];
if (firstFields.indexOf(key) !== -1) {
asyncSerialArray(arr, func2, next);
} else {
asyncParallelArray(arr, func2, next);
}
});
});
pending.catch((e) => e);
return pending;
}
function complementError(rule) {
return function(oe) {
if (oe && oe.message) {
oe.field = oe.field || rule.fullField;
return oe;
}
return {
message: typeof oe === "function" ? oe() : oe,
field: oe.field || rule.fullField
};
};
}
function deepMerge$2(target, source) {
if (source) {
for (const s in source) {
if (source.hasOwnProperty(s)) {
const value2 = source[s];
if (typeof value2 === "object" && typeof target[s] === "object") {
target[s] = { ...target[s], ...value2 };
} else {
target[s] = value2;
}
}
}
}
return target;
}
function required(rule, value2, source, errors, options, type2) {
if (rule.required && (!source.hasOwnProperty(rule.field) || isEmptyValue(value2, type2 || rule.type))) {
errors.push(format(options.messages.required, rule.fullField));
}
}
function whitespace(rule, value2, source, errors, options) {
if (/^\s+$/.test(value2) || value2 === "") {
errors.push(format(options.messages.whitespace, rule.fullField));
}
}
const pattern = {
// http://emailregex.com/
email: /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/,
url: new RegExp(
"^(?!mailto:)(?:(?:http|https|ftp)://|//)(?:\\S+(?::\\S*)?@)?(?:(?:(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[0-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]+-*)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]+-*)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,})))|localhost)(?::\\d{2,5})?(?:(/|\\?|#)[^\\s]*)?$",
"i"
),
hex: /^#?([a-f0-9]{6}|[a-f0-9]{3})$/i
};
var types = {
integer: function integer(value2) {
return /^(-)?\d+$/.test(value2);
},
float: function float(value2) {
return /^(-)?\d+(\.\d+)?$/.test(value2);
},
array: function array3(value2) {
return Array.isArray(value2);
},
regexp: function regexp(value2) {
if (value2 instanceof RegExp) {
return true;
}
try {
return !!new RegExp(value2);
} catch (e) {
return false;
}
},
date: function date3(value2) {
return typeof value2.getTime === "function" && typeof value2.getMonth === "function" && typeof value2.getYear === "function";
},
number: function number3(value2) {
if (isNaN(value2)) {
return false;
}
return typeof +value2 === "number";
},
object: function object3(value2) {
return typeof value2 === "object" && !types.array(value2);
},
method: function method(value2) {
return typeof value2 === "function";
},
email: function email2(value2) {
return typeof value2 === "string" && !!value2.match(pattern.email) && value2.length < 255;
},
url: function url2(value2) {
return typeof value2 === "string" && !!value2.match(pattern.url);
},
hex: function hex(value2) {
return typeof value2 === "string" && !!value2.match(pattern.hex);
}
};
function type(rule, value2, source, errors, options) {
if (rule.required && value2 === void 0) {
required(rule, value2, source, errors, options);
return;
}
const custom = ["integer", "float", "array", "regexp", "object", "method", "email", "number", "date", "url", "hex"];
const ruleType = rule.type;
if (custom.indexOf(ruleType) > -1) {
if (!types[ruleType](value2)) {
errors.push(format(options.messages.types[ruleType], rule.fullField, rule.type));
}
} else if (ruleType && typeof value2 !== rule.type) {
errors.push(format(options.messages.types[ruleType], rule.fullField, rule.type));
}
}
function range$2(rule, value2, source, errors, options) {
const len = typeof rule.len === "number";
const min = typeof rule.min === "number";
const max = typeof rule.max === "number";
const spRegexp = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g;
let val = value2;
let key = null;
const num = typeof value2 === "number";
const str = typeof value2 === "string";
const arr = Array.isArray(value2);
if (num) {
key = "number";
} else if (str) {
key = "string";
} else if (arr) {
key = "array";
}
if (!key) {
return false;
}
if (arr) {
val = value2.length;
}
if (str) {
val = value2.replace(spRegexp, "_").length;
}
if (len) {
if (val !== rule.len) {
errors.push(format(options.messages[key].len, rule.fullField, rule.len));
}
} else if (min && !max && val < rule.min) {
errors.push(format(options.messages[key].min, rule.fullField, rule.min));
} else if (max && !min && val > rule.max) {
errors.push(format(options.messages[key].max, rule.fullField, rule.max));
} else if (min && max && (val < rule.min || val > rule.max)) {
errors.push(format(options.messages[key].range, rule.fullField, rule.min, rule.max));
}
}
const ENUM = "enum";
function enumerable(rule, value2, source, errors, options) {
rule[ENUM] = Array.isArray(rule[ENUM]) ? rule[ENUM] : [];
if (rule[ENUM].indexOf(value2) === -1) {
errors.push(format(options.messages[ENUM], rule.fullField, rule[ENUM].join(", ")));
}
}
function pattern$1(rule, value2, source, errors, options) {
if (rule.pattern) {
if (rule.pattern instanceof RegExp) {
rule.pattern.lastIndex = 0;
if (!rule.pattern.test(value2)) {
errors.push(format(options.messages.pattern.mismatch, rule.fullField, value2, rule.pattern));
}
} else if (typeof rule.pattern === "string") {
const _pattern = new RegExp(rule.pattern);
if (!_pattern.test(value2)) {
errors.push(format(options.messages.pattern.mismatch, rule.fullField, value2, rule.pattern));
}
}
}
}
const rules = {
required,
whitespace,
type,
range: range$2,
enum: enumerable,
pattern: pattern$1
};
function string$1(rule, value2, callback, source, options) {
const errors = [];
const validate2 = rule.required || !rule.required && source.hasOwnProperty(rule.field);
if (validate2) {
if (isEmptyValue(value2, "string") && !rule.required) {
return callback();
}
rules.required(rule, value2, source, errors, options, "string");
if (!isEmptyValue(value2, "string")) {
rules.type(rule, value2, source, errors, options);
rules.range(rule, value2, source, errors, options);
rules.pattern(rule, value2, source, errors, options);
if (rule.whitespace === true) {
rules.whitespace(rule, value2, source, errors, options);
}
}
}
callback(errors);
}
function method2(rule, value2, callback, source, options) {
const errors = [];
const validate2 = rule.required || !rule.required && source.hasOwnProperty(rule.field);
if (validate2) {
if (isEmptyValue(value2) && !rule.required) {
return callback();
}
rules.required(rule, value2, source, errors, options);
if (value2 !== void 0) {
rules.type(rule, value2, source, errors, options);
}
}
callback(errors);
}
function number2(rule, value2, callback, source, options) {
const errors = [];
const validate2 = rule.required || !rule.required && source.hasOwnProperty(rule.field);
if (validate2) {
if (value2 === "") {
value2 = void 0;
}
if (isEmptyValue(value2) && !rule.required) {
return callback();
}
rules.required(rule, value2, source, errors, options);
if (value2 !== void 0) {
rules.type(rule, value2, source, errors, options);
rules.range(rule, value2, source, errors, options);
}
}
callback(errors);
}
function _boolean(rule, value2, callback, source, options) {
const errors = [];
const validate2 = rule.required || !rule.required && source.hasOwnProperty(rule.field);
if (validate2) {
if (isEmptyValue(value2) && !rule.required) {
return callback();
}
rules.required(rule, value2, source, errors, options);
if (value2 !== void 0) {
rules.type(rule, value2, source, errors, options);
}
}
callback(errors);
}
function regexp2(rule, value2, callback, source, options) {
const errors = [];
const validate2 = rule.required || !rule.required && source.hasOwnProperty(rule.field);
if (validate2) {
if (isEmptyValue(value2) && !rule.required) {
return callback();
}
rules.required(rule, value2, source, errors, options);
if (!isEmptyValue(value2)) {
rules.type(rule, value2, source, errors, options);
}
}
callback(errors);
}
function integer2(rule, value2, callback, source, options) {
const errors = [];
const validate2 = rule.required || !rule.required && source.hasOwnProperty(rule.field);
if (validate2) {
if (isEmptyValue(value2) && !rule.required) {
return callback();
}
rules.required(rule, value2, source, errors, options);
if (value2 !== void 0) {
rules.type(rule, value2, source, errors, options);
rules.range(rule, value2, source, errors, options);
}
}
callback(errors);
}
function floatFn(rule, value2, callback, source, options) {
const errors = [];
const validate2 = rule.required || !rule.required && source.hasOwnProperty(rule.field);
if (validate2) {
if (isEmptyValue(value2) && !rule.required) {
return callback();
}
rules.required(rule, value2, source, errors, options);
if (value2 !== void 0) {
rules.type(rule, value2, source, errors, options);
rules.range(rule, value2, source, errors, options);
}
}
callback(errors);
}
function array2(rule, value2, callback, source, options) {
const errors = [];
const validate2 = rule.required || !rule.required && source.hasOwnProperty(rule.field);
if (validate2) {
if (isEmptyValue(value2, "array") && !rule.required) {
return callback();
}
rules.required(rule, value2, source, errors, options, "array");
if (!isEmptyValue(value2, "array")) {
rules.type(rule, value2, source, errors, options);
rules.range(rule, value2, source, errors, options);
}
}
callback(errors);
}
function object2(rule, value2, callback, source, options) {
const errors = [];
const validate2 = rule.required || !rule.required && source.hasOwnProperty(rule.field);
if (validate2) {
if (isEmptyValue(value2) && !rule.required) {
return callback();
}
rules.required(rule, value2, source, errors, options);
if (value2 !== void 0) {
rules.type(rule, value2, source, errors, options);
}
}
callback(errors);
}
const ENUM$1 = "enum";
function enumerable$1(rule, value2, callback, source, options) {
const errors = [];
const validate2 = rule.required || !rule.required && source.hasOwnProperty(rule.field);
if (validate2) {
if (isEmptyValue(value2) && !rule.required) {
return callback();
}
rules.required(rule, value2, source, errors, options);
if (value2 !== void 0) {
rules[ENUM$1](rule, value2, source, errors, options);
}
}
callback(errors);
}
function pattern$2(rule, value2, callback, source, options) {
const errors = [];
const validate2 = rule.required || !rule.required && source.hasOwnProperty(rule.field);
if (validate2) {
if (isEmptyValue(value2, "string") && !rule.required) {
return callback();
}
rules.required(rule, value2, source, errors, options);
if (!isEmptyValue(value2, "string")) {
rules.pattern(rule, value2, source, errors, options);
}
}
callback(errors);
}
function date2(rule, value2, callback, source, options) {
const errors = [];
const validate2 = rule.required || !rule.required && source.hasOwnProperty(rule.field);
if (validate2) {
if (isEmptyValue(value2) && !rule.required) {
return callback();
}
rules.required(rule, value2, source, errors, options);
if (!isEmptyValue(value2)) {
let dateObject;
if (typeof value2 === "number") {
dateObject = new Date(value2);
} else {
dateObject = value2;
}
rules.type(rule, dateObject, source, errors, options);
if (dateObject) {
rules.range(rule, dateObject.getTime(), source, errors, options);
}
}
}
callback(errors);
}
function required$1(rule, value2, callback, source, options) {
const errors = [];
const type2 = Array.isArray(value2) ? "array" : typeof value2;
rules.required(rule, value2, source, errors, options, type2);
callback(errors);
}
function type$1(rule, value2, callback, source, options) {
const ruleType = rule.type;
const errors = [];
const validate2 = rule.required || !rule.required && source.hasOwnProperty(rule.field);
if (validate2) {
if (isEmptyValue(value2, ruleType) && !rule.required) {
return callback();
}
rules.required(rule, value2, source, errors, options, ruleType);
if (!isEmptyValue(value2, ruleType)) {
rules.type(rule, value2, source, errors, options);
}
}
callback(errors);
}
function any(rule, value2, callback, source, options) {
const errors = [];
const validate2 = rule.required || !rule.required && source.hasOwnProperty(rule.field);
if (validate2) {
if (isEmptyValue(value2) && !rule.required) {
return callback();
}
rules.required(rule, value2, source, errors, options);
}
callback(errors);
}
const validators = {
string: string$1,
method: method2,
number: number2,
boolean: _boolean,
regexp: regexp2,
integer: integer2,
float: floatFn,
array: array2,
object: object2,
enum: enumerable$1,
pattern: pattern$2,
date: date2,
url: type$1,
hex: type$1,
email: type$1,
required: required$1,
any
};
function newMessages() {
return {
default: "Validation error on field %s",
required: "%s is required",
enum: "%s must be one of %s",
whitespace: "%s cannot be empty",
date: {
format: "%s date %s is invalid for format %s",
parse: "%s date could not be parsed, %s is invalid ",
invalid: "%s date %s is invalid"
},
types: {
string: "%s is not a %s",
method: "%s is not a %s (function)",
array: "%s is not an %s",
object: "%s is not an %s",
number: "%s is not a %s",
date: "%s is not a %s",
boolean: "%s is not a %s",
integer: "%s is not an %s",
float: "%s is not a %s",
regexp: "%s is not a valid %s",
email: "%s is not a valid %s",
url: "%s is not a valid %s",
hex: "%s is not a valid %s"
},
string: {
len: "%s must be exactly %s characters",
min: "%s must be at least %s characters",
max: "%s cannot be longer than %s characters",
range: "%s must be between %s and %s characters"
},
number: {
len: "%s must equal %s",
min: "%s cannot be less than %s",
max: "%s cannot be greater than %s",
range: "%s must be between %s and %s"
},
array: {
len: "%s must be exactly %s in length",
min: "%s cannot be less than %s in length",
max: "%s cannot be greater than %s in length",
range: "%s must be between %s and %s in length"
},
pattern: {
mismatch: "%s value %s does not match pattern %s"
},
clone: function clone2() {
const cloned = JSON.parse(JSON.stringify(this));
cloned.clone = this.clone;
return cloned;
}
};
}
const messages = newMessages();
function Schema(descriptor) {
this.rules = null;
this._messages = messages;
this.define(descriptor);
}
Schema.prototype = {
messages: function messages2(_messages) {
if (_messages) {
this._messages = deepMerge$2(newMessages(), _messages);
}
return this._messages;
},
define: function define(rules2) {
if (!rules2) {
throw new Error("Cannot configure a schema with no rules");
}
if (typeof rules2 !== "object" || Array.isArray(rules2)) {
throw new Error("Rules must be an object");
}
this.rules = {};
let z;
let item;
for (z in rules2) {
if (rules2.hasOwnProperty(z)) {
item = rules2[z];
this.rules[z] = Array.isArray(item) ? item : [item];
}
}
},
validate: function validate(source_, o, oc) {
const _this = this;
if (o === void 0) {
o = {};
}
if (oc === void 0) {
oc = function oc2() {
};
}
let source = source_;
let options = o;
let callback = oc;
if (typeof options === "function") {
callback = options;
options = {};
}
if (!this.rules || Object.keys(this.rules).length === 0) {
if (callback) {
callback();
}
return Promise.resolve();
}
function complete(results) {
let i;
let errors = [];
let fields = {};
function add(e) {
if (Array.isArray(e)) {
let _errors;
errors = (_errors = errors).concat.apply(_errors, e);
} else {
errors.push(e);
}
}
for (i = 0; i < results.length; i++) {
add(results[i]);
}
if (!errors.length) {
errors = null;
fields = null;
} else {
fields = convertFieldsError(errors);
}
callback(errors, fields);
}
if (options.messages) {
let messages$1 = this.messages();
if (messages$1 === messages) {
messages$1 = newMessages();
}
deepMerge$2(messages$1, options.messages);
options.messages = messages$1;
} else {
options.messages = this.messages();
}
let arr;
let value2;
const series = {};
const keys = options.keys || Object.keys(this.rules);
keys.forEach((z) => {
arr = _this.rules[z];
value2 = source[z];
arr.forEach((r) => {
let rule = r;
if (typeof rule.transform === "function") {
if (source === source_) {
source = { ...source };
}
value2 = source[z] = rule.transform(value2);
}
if (typeof rule === "function") {
rule = {
validator: rule
};
} else {
rule = { ...rule };
}
rule.validator = _this.getValidationMethod(rule);
rule.field = z;
rule.fullField = rule.fullField || z;
rule.type = _this.getType(rule);
if (!rule.validator) {
return;
}
series[z] = series[z] || [];
series[z].push({
rule,
value: value2,
source,
field: z
});
});
});
const errorFields = {};
return asyncMap(series, options, (data, doIt) => {
const { rule } = data;
let deep = (rule.type === "object" || rule.type === "array") && (typeof rule.fields === "object" || typeof rule.defaultField === "object");
deep = deep && (rule.required || !rule.required && data.value);
rule.field = data.field;
function addFullfield(key, schema) {
return { ...schema, fullField: `${rule.fullField}.${key}` };
}
function cb(e) {
if (e === void 0) {
e = [];
}
let errors = e;
if (!Array.isArray(errors)) {
errors = [errors];
}
if (!options.suppressWarning && errors.length) {
Schema.warning("async-validator:", errors);
}
if (errors.length && rule.message) {
errors = [].concat(rule.message);
}
errors = errors.map(complementError(rule));
if (options.first && errors.length) {
errorFields[rule.field] = 1;
return doIt(errors);
}
if (!deep) {
doIt(errors);
} else {
if (rule.required && !data.value) {
if (rule.message) {
errors = [].concat(rule.message).map(complementError(rule));
} else if (options.error) {
errors = [options.error(rule, format(options.messages.required, rule.field))];
} else {
errors = [];
}
return doIt(errors);
}
let fieldsSchema = {};
if (rule.defaultField) {
for (const k in data.value) {
if (data.value.hasOwnProperty(k)) {
fieldsSchema[k] = rule.defaultField;
}
}
}
fieldsSchema = { ...fieldsSchema, ...data.rule.fields };
for (const f in fieldsSchema) {
if (fieldsSchema.hasOwnProperty(f)) {
const fieldSchema = Array.isArray(fieldsSchema[f]) ? fieldsSchema[f] : [fieldsSchema[f]];
fieldsSchema[f] = fieldSchema.map(addFullfield.bind(null, f));
}
}
const schema = new Schema(fieldsSchema);
schema.messages(options.messages);
if (data.rule.options) {
data.rule.options.messages = options.messages;
data.rule.options.error = options.error;
}
schema.validate(data.value, data.rule.options || options, (errs) => {
const finalErrors = [];
if (errors && errors.length) {
finalErrors.push.apply(finalErrors, errors);
}
if (errs && errs.length) {
finalErrors.push.apply(finalErrors, errs);
}
doIt(finalErrors.length ? finalErrors : null);
});
}
}
let res;
if (rule.asyncValidator) {
res = rule.asyncValidator(rule, data.value, cb, data.source, options);
} else if (rule.validator) {
res = rule.validator(rule, data.value, cb, data.source, options);
if (res === true) {
cb();
} else if (res === false) {
cb(rule.message || `${rule.field} fails`);
} else if (res instanceof Array) {
cb(res);
} else if (res instanceof Error) {
cb(res.message);
}
}
if (res && res.then) {
res.then(() => cb(), (e) => cb(e));
}
}, (results) => {
complete(results);
});
},
getType: function getType(rule) {
if (rule.type === void 0 && rule.pattern instanceof RegExp) {
rule.type = "pattern";
}
if (typeof rule.validator !== "function" && rule.type && !validators.hasOwnProperty(rule.type)) {
throw new Error(format("Unknown rule type %s", rule.type));
}
return rule.type || "string";
},
getValidationMethod: function getValidationMethod(rule) {
if (typeof rule.validator === "function") {
return rule.validator;
}
const keys = Object.keys(rule);
const messageIndex = keys.indexOf("message");
if (messageIndex !== -1) {
keys.splice(messageIndex, 1);
}
if (keys.length === 1 && keys[0] === "required") {
return validators.required;
}
return validators[this.getType(rule)] || false;
}
};
Schema.register = function register(type2, validator) {
if (typeof validator !== "function") {
throw new Error("Cannot register a validator by type, validator is not a function");
}
validators[type2] = validator;
};
Schema.warning = warning;
Schema.messages = messages;
Schema.warning = function() {
};
const _sfc_main$16 = {
name: "u-form",
mixins: [mpMixin, mixin, props$k],
provide() {
return {
uForm: this
};
},
data() {
return {
formRules: {},
// 规则校验器
validator: {},
// 原始的model快照,用于resetFields方法重置表单时使用
originalModel: null
};
},
watch: {
// 监听规则的变化
rules: {
immediate: true,
handler(n) {
this.setRules(n);
}
},
// 监听属性的变化,通知子组件u-form-item重新获取信息
propsChange(n) {
var _a;
if ((_a = this.children) == null ? void 0 : _a.length) {
this.children.map((child) => {
typeof child.updateParentData == "function" && child.updateParentData();
});
}
},
// 监听model的初始值作为重置表单的快照
model: {
immediate: true,
handler(n) {
if (!this.originalModel) {
this.originalModel = uni.$u.deepClone(n);
}
}
}
},
computed: {
propsChange() {
return [
this.errorType,
this.borderBottom,
this.labelPosition,
this.labelWidth,
this.labelAlign,
this.labelStyle
];
}
},
created() {
this.children = [];
},
methods: {
// 手动设置校验的规则,如果规则中有函数的话,微信小程序中会过滤掉,所以只能手动调用设置规则
setRules(rules2) {
if (Object.keys(rules2).length === 0)
return;
if (Object.keys(this.model).length === 0) {
uni.$u.error("设置rules,model必须设置!如果已经设置,请刷新页面。");
return;
}
this.formRules = rules2;
this.validator = new Schema(rules2);
},
// 清空所有u-form-item组件的内容,本质上是调用了u-form-item组件中的resetField()方法
resetFields() {
this.resetModel();
},
// 重置model为初始值的快照
resetModel(obj) {
this.children.map((child) => {
const prop = child == null ? void 0 : child.prop;
const value2 = uni.$u.getProperty(this.originalModel, prop);
uni.$u.setProperty(this.model, prop, value2);
});
},
// 清空校验结果
clearValidate(props2) {
props2 = [].concat(props2);
this.children.map((child) => {
if (props2[0] === void 0 || props2.includes(child.prop)) {
child.message = null;
}
});
},
// 对部分表单字段进行校验
async validateField(value2, callback, event = null) {
this.$nextTick(() => {
const errorsRes = [];
value2 = [].concat(value2);
this.children.map((child) => {
const childErrors = [];
if (value2.includes(child.prop)) {
const propertyVal = uni.$u.getProperty(
this.model,
child.prop
);
const propertyChain = child.prop.split(".");
const propertyName = propertyChain[propertyChain.length - 1];
const rule = this.formRules[child.prop];
if (!rule)
return;
const rules2 = [].concat(rule);
for (let i = 0; i < rules2.length; i++) {
const ruleItem = rules2[i];
const trigger = [].concat(ruleItem == null ? void 0 : ruleItem.trigger);
if (event && !trigger.includes(event))
continue;
const validator = new Schema({
[propertyName]: ruleItem
});
validator.validate(
{
[propertyName]: propertyVal
},
(errors, fields) => {
var _a;
if (uni.$u.test.array(errors)) {
errorsRes.push(...errors);
childErrors.push(...errors);
}
child.message = ((_a = childErrors[0]) == null ? void 0 : _a.message) ?? null;
}
);
}
}
});
typeof callback === "function" && callback(errorsRes);
});
},
// 校验全部数据
validate(callback) {
if (Object.keys(this.formRules).length === 0) {
uni.$u.error("未设置rules,请看文档说明!如果已经设置,请刷新页面。");
return;
}
return new Promise((resolve, reject) => {
this.$nextTick(() => {
const formItemProps = this.children.map(
(item) => item.prop
);
this.validateField(formItemProps, (errors) => {
if (errors.length) {
this.errorType === "toast" && uni.$u.toast(errors[0].message);
reject(errors);
} else {
resolve(true);
}
});
});
});
}
}
};
function _sfc_render$15(_ctx, _cache, $props, $setup, $data, $options) {
return vue.openBlock(), vue.createElementBlock("view", { class: "u-form" }, [
vue.renderSlot(_ctx.$slots, "default")
]);
}
const __easycom_3$3 = /* @__PURE__ */ _export_sfc(_sfc_main$16, [["render", _sfc_render$15], ["__file", "E:/书嗨项目/shuhi-app-fornt/uni_modules/uview-plus/components/u-form/u-form.vue"]]);
const props$j = {
props: {
// 是否细边框
hairline: {
type: Boolean,
default: props$x.button.hairline
},
// 按钮的预置样式,info,primary,error,warning,success
type: {
type: String,
default: props$x.button.type
},
// 按钮尺寸,large,normal,small,mini
size: {
type: String,
default: props$x.button.size
},
// 按钮形状,circle(两边为半圆),square(带圆角)
shape: {
type: String,
default: props$x.button.shape
},
// 按钮是否镂空
plain: {
type: Boolean,
default: props$x.button.plain
},
// 是否禁止状态
disabled: {
type: Boolean,
default: props$x.button.disabled
},
// 是否加载中
loading: {
type: Boolean,
default: props$x.button.loading
},
// 加载中提示文字
loadingText: {
type: [String, Number],
default: props$x.button.loadingText
},
// 加载状态图标类型
loadingMode: {
type: String,
default: props$x.button.loadingMode
},
// 加载图标大小
loadingSize: {
type: [String, Number],
default: props$x.button.loadingSize
},
// 开放能力,具体请看uniapp稳定关于button组件部分说明
// https://uniapp.dcloud.io/component/button
openType: {
type: String,
default: props$x.button.openType
},
// 用于