This commit is contained in:
那些花儿
2025-09-03 17:49:59 +08:00
parent 3110ffd35e
commit 78f25f59b1
15 changed files with 604 additions and 17599 deletions
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -37,34 +37,6 @@ $.ajaxSetup({
}
})
//初始化pjax
// ;(function initPjax() {
// if ($.support.pjax) {
// $(document).pjax("a[data-pjax]", "#container", {
// maxCacheLength: 0,
// push: false,
// replace: true,
// fragment: "#container",
// timeout: 8000
// })
// $(document).on("pjax:send", function () {
// NProgress.start()
// $(".ele-admin-content-view").hide()
// window.customStyleList = document.querySelectorAll('style[id^="style-"]')
// })
//
// $(document).on("pjax:complete", function () {
// if (window.customStyleList) {
// window.customStyleList.forEach((style) => {
// style.parentNode.removeChild(style)
// })
// }
// NProgress.done()
// $(".ele-admin-content-view").show()
// })
// }
// })()
function pjaxReplace(url, data = {}) {
const { pathname, search } = location
if (url === pathname + search) {
@@ -81,35 +53,3 @@ function pjaxReplace(url, data = {}) {
data
})
}
function removeHTMLTag(str) {
str = str.replace(/<\/?[^>]*>/g, "") //去除HTML tag
str = str.replace(/[ | ]*\n/g, "\n") //去除行尾空白
str = str.replace(/\n[\s| | ]*\r/g, "\n") //去除多余空行
str = str.replace(/&nbsp;/gi, "") //去掉&nbsp;
return str
}
function GetQueryString(name) {
return new URLSearchParams(window.location.search).get(name)
}
function clearAllTimers() {
const maxTimeoutId = setTimeout(function () {}, 0)
for (let i = 0; i <= maxTimeoutId; i++) {
clearTimeout(i)
clearInterval(i)
}
}
function getNestedValue(obj, path) {
return path.split(".").reduce((acc, part) => acc && acc[part], obj)
}
function loc() {
return location.href.replace(location.search, "").replace(location.hash, "")
}
function clone(obj) {
return JSON.parse(JSON.stringify(obj))
}
@@ -1,39 +1,82 @@
const styleUtil = {
// 为元素及其所有子元素添加scoped属性
addScopedAttribute(el, scopedId) {
if (el && el.setAttribute) {
el.setAttribute(scopedId, '')
addScopedAttribute(el, scopedId, vm) {
if (!el || !el.setAttribute) return;
// 递归处理所有子元素
const children = el.children || el.childNodes
for (let i = 0; i < children.length; i++) {
styleUtil.addScopedAttribute(children[i], scopedId)
// 跳过Vue组件实例 但是不跳过自己 也就是排除子组件
if (el.__vue__ && el.__vue__ !== vm) return;
// 添加scoped属性到当前元素
el.setAttribute(scopedId, '')
// 只处理普通DOM元素,不处理Vue组件
// const children = el.children || el.childNodes;
// for (let i = 0; i < children.length; i++) {
// const child = children[i];
// // 检查是否为普通DOM元素(非Vue组件)
// if (child.nodeType === 1 && !child.__vue__) {
// styleUtil.addScopedAttribute(child, scopedId, vm);
// }
// }
// 使用TreeWalker优化遍历性能
const walker = document.createTreeWalker(
el,
NodeFilter.SHOW_ELEMENT,
{
acceptNode(node) {
// 排除子Vue组件
return node.__vue__ && node !== el
? NodeFilter.FILTER_REJECT
: NodeFilter.FILTER_ACCEPT;
}
}
);
let node;
while (node = walker.nextNode()) {
if (node !== el) {
node.setAttribute(scopedId, '');
}
}
},
// 移除元素及其所有子元素的scoped属性
removeScopedAttribute(el, scopedId) {
if (el && el.removeAttribute) {
el.removeAttribute(scopedId)
if (!el || !el.removeAttribute) return;
// 递归处理所有子元素
const children = el.children || el.childNodes
for (let i = 0; i < children.length; i++) {
styleUtil.removeScopedAttribute(children[i], scopedId)
}
}
// 使用querySelectorAll批量处理
const elements = el.querySelectorAll(`[${scopedId}]`);
elements.forEach(element => element.removeAttribute(scopedId));
// 处理根元素
el.removeAttribute(scopedId);
// if (el && el.removeAttribute) {
// el.removeAttribute(scopedId)
//
// // 递归处理所有子元素
// const children = el.children || el.childNodes
// for (let i = 0; i < children.length; i++) {
// styleUtil.removeScopedAttribute(children[i], scopedId)
// }
// }
},
// 为CSS规则添加作用域属性
scopeCss(css, scopedId) {
// 处理CSS规则,为每个选择器添加[scopedId]
const processedCss = css.replace(/([^{]+){/g, (match, selectors) => {
return selectors.split(',')
.map(selector => {
// 处理深度选择器 >>> 和 /deep/
if (selector.includes('>>>') || selector.includes('/deep/')) {
return selector.replace(/(\s*)(>>>|\/deep\/)(\s*)/g,
`$1[${scopedId}] $3`)
// 处理深度选择器
if (selector.includes('::v-deep')) {
return selector.replace('::v-deep', `[${scopedId}]`);
}
// 处理媒体查询等特殊情况
if (selector.includes('@') || selector.trim().startsWith('@')) {
return selector;
}
// 普通选择器
@@ -43,52 +86,126 @@ const styleUtil = {
})
return processedCss
}
},
}
// 异步DOM观察器
const asyncStyleHandler = {
observers: new Map(),
// 为组件设置观察器
setupObserver(vm, scopedId) {
if (!vm.$el) return;
// 清除现有观察器
this.disconnectObserver(vm._uid);
// 创建新的MutationObserver
const observer = new MutationObserver((mutations) => {
let shouldProcess = false;
for (const mutation of mutations) {
if (mutation.type === 'childList' && mutation.addedNodes.length > 0) {
shouldProcess = true;
break;
}
}
if (shouldProcess) {
// 防抖处理
clearTimeout(vm._styleDebounce);
vm._styleDebounce = setTimeout(() => {
styleUtil.addScopedAttribute(vm.$el, scopedId, vm);
}, 0);
}
});
// 开始观察
observer.observe(vm.$el, {
childList: true,
subtree: true
});
// 存储观察器引用
this.observers.set(vm._uid, observer);
},
// 断开观察器
disconnectObserver(uid) {
if (this.observers.has(uid)) {
this.observers.get(uid).disconnect();
this.observers.delete(uid);
}
}
};
Vue.mixin({
mounted() {
if (this.$options.style) {
const styleId = `style-${this._uid}`
const style = document.createElement("style")
style.id = styleId
if (!this.$options.style) return;
// 生成唯一属性
const scopedId = `data-v-${this._uid}`
try {
const styleId = `style-${this._uid}`;
const scopedId = `data-v-${this._uid}`;
// this.$el.setAttribute(scopedId, '')
// 检查样式是否已存在
if (document.getElementById(styleId)) {
console.warn(`Style with id ${styleId} already exists`);
return;
}
// 为组件内所有元素添加唯一属性
styleUtil.addScopedAttribute(this.$el, scopedId)
const style = document.createElement("style");
style.id = styleId;
//支持函数和字符串
let css = typeof this.$options.style === "function" ? this.$options.style.call(this) : this.$options.style
// 添加作用域属性
if (this.$el) {
styleUtil.addScopedAttribute(this.$el, scopedId, this);
}
// 为每条规则添加属性选择器
css = styleUtil.scopeCss(css, scopedId)
// 处理CSS
let css = typeof this.$options.style === "function"
? this.$options.style.call(this)
: this.$options.style;
style.textContent = css
document.head.appendChild(style)
if (!css || typeof css !== 'string') {
console.warn('Invalid style content');
return;
}
// 保存scopedId以便销毁时使用
this._scopedId = scopedId
css = styleUtil.scopeCss(css, scopedId);
style.textContent = css;
document.head.appendChild(style);
this._scopedId = scopedId;
this._styleId = styleId;
// 设置异步DOM观察器
asyncStyleHandler.setupObserver(this, scopedId);
} catch (error) {
console.error('Error applying scoped styles:', error);
}
},
beforeDestroy() {
if (this._scopedId && this.$el) {
// 移除所有元素的scoped属性
styleUtil.removeScopedAttribute(this.$el, this._scopedId)
}
if (this.$options.style) {
const styleId = `style-${this._uid}`
const style = document.getElementById(styleId)
if (style) {
document.head.removeChild(style)
try {
// 清理作用域属性
if (this._scopedId && this.$el) {
styleUtil.removeScopedAttribute(this.$el, this._scopedId);
}
// 移除样式标签
if (this._styleId) {
const style = document.getElementById(this._styleId);
if (style && style.parentNode) {
style.parentNode.removeChild(style);
}
}
// 断开观察器
asyncStyleHandler.disconnectObserver(this._uid);
} catch (error) {
console.error('Error cleaning up scoped styles:', error);
}
}
})
@@ -228,3 +228,57 @@ const commonUtil = {
}
}
}
function removeHTMLTag(str) {
str = str.replace(/<\/?[^>]*>/g, "") //去除HTML tag
str = str.replace(/[ | ]*\n/g, "\n") //去除行尾空白
str = str.replace(/\n[\s| | ]*\r/g, "\n") //去除多余空行
str = str.replace(/&nbsp;/gi, "") //去掉&nbsp;
return str
}
function GetQueryString(name) {
return new URLSearchParams(window.location.search).get(name)
}
function clearAllTimers() {
const maxTimeoutId = setTimeout(function () {}, 0)
for (let i = 0; i <= maxTimeoutId; i++) {
clearTimeout(i)
clearInterval(i)
}
}
function getNestedValue(obj, path) {
return path.split(".").reduce((acc, part) => acc && acc[part], obj)
}
function loc() {
return location.href.replace(location.search, "").replace(location.hash, "")
}
function clone(obj) {
return JSON.parse(JSON.stringify(obj))
}
function base64ToFile(base64Data, filename) {
// 将base64的数据部分提取出来
const parts = base64Data.split(";base64,")
const contentType = parts[0].split(":")[1]
const raw = window.atob(parts[1])
const rawLength = raw.length
const uInt8Array = new Uint8Array(rawLength)
for (let i = 0; i < rawLength; ++i) {
uInt8Array[i] = raw.charCodeAt(i)
}
// 使用Blob对象创建File对象
const blob = new Blob([uInt8Array], { type: contentType })
blob.lastModifiedDate = new Date()
blob.name = filename
return new File([blob], filename, { type: contentType })
}
@@ -1,12 +0,0 @@
;(function () {
const api = {
listType() {
return $.get("/platform/condolence/common/listType")
},
listOpenType() {
return $.get("/platform/condolence/common/listType")
}
}
window.condolenceCommonApi = api
})()
@@ -1,24 +0,0 @@
;(function () {
const teacherCongressApi = {
//全部教代会
listSession() {
return $.get("/platform/teacherCongress/common/listSession")
},
//开启的教代会
listOpenSession() {
return $.get("/platform/teacherCongress/common/listOpenSession")
},
//查询代表团根据教代会
listDelegation(sessionId) {
return $.get("/platform/teacherCongress/common/listDelegation", { sessionId })
},
//查询所有的代表类型(三种)
listDelegateRole() {
return $.get("/platform/teacherCongress/common/listDelegateRole")
}
}
window.teacherCongressApi = teacherCongressApi
})()
@@ -1,24 +0,0 @@
(function () {
const workersCongressApi = {
//全部工代会
listSession() {
return $.get("/platform/teacherCongress/common/listSession")
},
//开启的工代会
listOpenSession() {
return $.get("/platform/teacherCongress/common/listOpenSession")
},
//查询代表团根据工代会
listDelegation(sessionId) {
return $.get("/platform/teacherCongress/common/listDelegation", { sessionId })
},
//查询所有的代表类型(三种)
listDelegateRole() {
return $.get("/platform/teacherCongress/common/listDelegateRole")
}
}
window.workersCongressApi = workersCongressApi
})()
@@ -1,101 +0,0 @@
const initTableMixins = {
data() {
return {
pageDataUrl: "",
submitLoading: false,
searchMore: false,
tableSize: "",
tableKey: "",
formData: {},
formRules: {},
formLoading: false,
tableLoading: false,
tableData: [],
tableColumns: [],
pageForm: {
searchName: "",
searchKeyword: "",
pageNumber: 1,
pageSize: 10,
totalCount: 0,
pageOrderName: "",
pageOrderBy: ""
},
guavaIndex: "index",
unionGroups: [],
threeUnits: []
}
},
methods: {
dropdownCommand({ action, value }) {
if (action) action(value)
},
columnChange(val) {
this.tableLoading = true
this.tableColumns = val
this.tableLoading = false
},
tableSizeChange(size) {
this.tableSize = size
},
indexMethod(index) {
return index + (this.pageForm.pageNumber - 1) * this.pageForm.pageSize + 1
},
doSearch() {
this.tableKey = new Date().getTime()
this.pageForm.pageNumber = 1
this.pageData()
},
pageOrder(column) {
this.pageForm.pageOrderName = column.prop
this.pageForm.pageOrderBy = column.order
this.pageData()
},
pageNumberChange(val) {
this.pageForm.pageNumber = val
this.pageData()
},
pageSizeChange(val) {
this.pageForm.pageSize = val
this.pageData()
},
pageData(url = null, data = null) {
const address = url ? url : loc() + "/pageData"
this.tableLoading = true
$.post(
address,
data ? data : this.pageForm,
(data) => {
this.tableLoading = false
if (data.code === 0) {
this.tableData = data.data.list
this.pageForm.totalCount = data.data.totalCount
} else {
this.$message.error(data.msg)
}
},
"json"
)
},
notifySuccess(msg) {
this.$notify({
title: "成功",
message: msg,
type: "success"
})
},
notifyWarning(msg) {
this.$notify({
title: "警告",
message: msg,
type: "warning"
})
},
notifyError(msg) {
this.$notify.error({
title: "错误",
message: msg
})
}
}
}
@@ -1,530 +0,0 @@
/*选择商品品类*/
.content-goods-publish {
padding: 15px;
margin: 0 auto;
text-align: center;
border-radius: 0.8em;
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
background: none repeat 0 0 #fff;
/*商品品类*/
.goods-category {
min-height: 500px;
border-radius: 0.8em;
text-align: left;
padding: 10px;
background: #ededed;
ul {
padding: 12px 8px;
list-style: none;
width: 300px;
background: none repeat 0 0 #fff;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.12), 0 0 6px rgba(0, 0, 0, 0.04);
border-radius: 0.4em;
display: inline-block;
letter-spacing: normal;
margin-right: 15px;
vertical-align: top;
word-spacing: normal;
li {
line-height: 20px;
padding: 10px 5px;
cursor: pointer;
color: #333;
font-size: 12px;
display: flex;
flex-wrap: nowrap;
flex-direction: row;
justify-content: space-between;
align-items: center;
}
}
}
/** 当前品类被选中的样式 */
.activeClass {
border-radius: 0.4em;
background-color: color-mix(in srgb, var(--color-primary) 20%, transparent);
border: 1px solid color-mix(in srgb, var(--color-primary) 80%, transparent);
/*background-color: rgba(33, 112, 80, 0.2);*/
/*border: 1px solid rgba(33, 112, 80, 0.8);*/
color: #fff;
}
/*!*当前选择的商品品类文字*!*/
.current-goods-category {
text-align: left;
padding: 10px;
width: 100%;
border: 1px solid #fbeed5;
color: #c09853;
background-color: #fcf8e3;
margin: 10px auto;
padding: 8px 35px 8px 14px;
text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
font-size: 12px;
font-weight: bold;
}
}
/*编辑基本信息*/
.el-form {
padding-bottom: 80px;
.el-form-item {
width: 100%;
text-align: left;
}
}
.sku-val {
justify-content: flex-start;
flex-wrap: wrap;
>.ivu-form {
flex-wrap: wrap !important;
}
/deep/ .sku-item-content-val {
margin-right: 20px;
}
}
div.base-info-item {
h4 {
margin-bottom: 10px;
padding: 0 10px;
border: 1px solid #ddd;
background-color: #f8f8f8;
font-weight: bold;
color: #333;
font-size: 14px;
line-height: 40px;
text-align: left;
}
>div {
padding-left: 5%;
}
.form-item-view {
display: flex;
flex-direction: column;
align-items: flex-start;
justify-content: space-between;
// padding-left: 80px;
.form-item-view-wholesale {
display: flex;
.form-item-view-wholesale-preview {
padding-left: 5%;
}
}
.layout {
margin-bottom: 20px;
width: 100%;
justify-content: center;
.sku-item-content {
margin: 20px 0;
display: flex;
width: 100% !important;
flex: 1;
flex-direction: column;
align-items: flex-start;
justify-content: flex-start;
width: 100%;
>.ivu-card-body {
width: 100%;
}
.ivu-card-body {
width: 100%;
justify-content: center;
align-items: flex-start;
}
.sku-item-content-name {
display: flex;
align-items: flex-start;
justify-content: flex-start;
width: 100%;
}
}
}
.shop-category-text {
font-size: 12px;
}
}
.form-item-view-bottom {
margin-bottom: 50px;
}
.item-goods-properts-row {
display: flex;
flex-direction: row;
word-break: break-all;
white-space: normal;
width: 300px;
height: 100px;
}
.item-goods-properts {
display: flex;
flex-direction: row;
margin-bottom: 10px;
}
.form-item {
display: flex;
align-items: center;
}
/** 审核信息-拒绝原因 */
.auth-info {
color: red;
}
.el-form-item {
width: 30%;
min-width: 300px;
}
.goods-name-width {
width: 50%;
min-width: 300px;
}
.el-form-item__content {
margin-left: 120px;
text-align: left;
}
p.goods-group-manager {
padding-left: 7.5%;
text-align: left;
color: #999;
font-size: 13px;
}
/*teatarea*/
/deep/ .el-textarea {
width: 150%;
}
.seo-text {
width: 150%;
}
}
/*折叠面板*/
.el-collapse-item {
/deep/ .el-collapse-item__header {
text-align: left;
background-color: #f8f8f8;
padding: 0 10px;
font-weight: bold;
color: #333;
font-size: 14px;
}
.el-form-item {
margin-left: 5%;
width: 25%;
}
/deep/ .el-form-item__content {
margin-left: 120px;
text-align: left;
}
p.goods-group-manager {
padding-left: 12%;
text-align: left;
color: #999;
}
/deep/ .el-collapse-item__content {
padding: 10px 0;
text-align: left;
}
}
.success {
>h1 {
font-size: 28px;
}
>* {
margin: 10px;
}
}
.operation {
>* {
margin: 10px 0;
}
}
/*商品描述*/
.goods-intro {
line-height: 40;
}
/** 底部步骤 */
.footer {
width: 100%;
margin-top: 20px;
padding: 10px;
background-color: #ffc;
position: sticky;
bottom: 0px;
text-align: center;
z-index: 999;
>.ivu-btn {
margin: 0 10px;
}
}
/*图片上传组件第一张图设置封面*/
.goods-images {
/deep/ li.el-upload-list__item:first-child {
position: relative;
}
/deep/ li.el-upload-list__item:first-child:after {
content: "封";
color: #fff;
font-weight: bold;
font-size: 12px;
position: absolute;
left: -15px;
top: -6px;
width: 40px;
height: 24px;
padding-top: 6px;
background: #13ce66;
text-align: center;
-webkit-transform: rotate(-45deg);
transform: rotate(-45deg);
-webkit-box-shadow: 0 0 1pc 1px rgba(0, 0, 0, 0.2);
box-shadow: 0 0 1pc 1px rgba(0, 0, 0, 0.2);
}
}
.el-form-item__label {
word-break: break-all;
}
.step-list {
height: 80px;
padding: 10px 30px;
background-color: #fff;
margin-bottom: 20px;
border-radius: 0.8em;
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
}
.add-sku-btn {
margin-top: 10px;
}
.sku-item:not(:first-child) {
margin-top: 10px;
}
.sku-upload-list {
text-align: center;
border: 1px solid transparent;
border-radius: 4px;
overflow: hidden;
background: #fff;
position: relative;
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2);
margin-right: 8px;
}
.preview-picture {
width: 100%;
margin: 0 auto;
display: block;
// text-align: center;
border: 1px solid transparent;
// justify-self: center;
// align-self: center;
}
.preview-picture img {
width: 100%;
height: 100%;
}
.sku-upload-list img {
width: 100%;
height: 100%;
}
.sku-upload-list-cover {
display: none;
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
background: rgba(0, 0, 0, 0.6);
}
.sku-upload-list:hover .sku-upload-list-cover {
display: block;
}
.sku-upload-list-cover i {
color: #fff;
font-size: 20px;
cursor: pointer;
margin: 0 2px;
}
.required {
/deep/ .ivu-form-item-label::before {
content: "*";
display: inline-block;
margin-right: 4px;
line-height: 1;
font-family: SimSun;
font-size: 14px;
color: #ed4014;
}
}
.demo-upload-list {
width: 150px;
height: 150px;
text-align: center;
border: 1px solid transparent;
border-radius: 4px;
display: inline-block;
background: #fff;
position: relative;
margin-right: 4px;
vertical-align: bottom;
}
.demo-upload-list img {
width: 100%;
height: 100%;
}
.demo-upload-list-cover {
display: none;
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
background: rgba(0, 0, 0, 0.6);
justify-content: space-between;
align-items: center;
flex-direction: column;
}
.demo-upload-list:hover .demo-upload-list-cover {
display: flex;
}
.demo-upload-list-cover div {
margin-top: 50px;
width: 100%;
>i {
width: 50%;
margin-top: 8px;
color: #fff;
font-size: 20px;
cursor: pointer;
}
}
.active-goods-type {
background: #e8e8e8;
}
.goods-type-list {
max-height: 500px;
overflow-y: auto;
}
.template-item {
justify-content: flex-start !important;
}
.tree-bar {
height: auto !important;
max-height: auto !important;
min-height: 240px !important;
}
.goods-type-item {
padding: 20px 0;
width: 100%;
cursor: pointer;
transition: 0.35s;
display: flex;
justify-content: center;
align-items: center;
/deep/ img {
margin-right: 20px;
width: 100px;
margin-left: 10px;
}
/deep/ p {
color: #999;
font-size: 14px;
margin-top: 10px;
}
}
.goods-type-item:hover {
background: #ededed;
}
.goods-list-box {
height: 450px;
overflow: auto;
}
h2 {
cursor: pointer;
font-size: 21px;
color: #333;
}
.form-item-view-wholesale-form-col {
height: 400px;
}
.form-item-view-wholesale-row-del {
display: "flex";
justify-content: "space-between";
align-items: "center";
}
.promise-intro-btn{
margin: 10px 0;
text-align: left;
}
@@ -0,0 +1,13 @@
<script>
module.exports = {
name: "index"
}
</script>
<template>
</template>
<style scoped>
</style>
+329 -221
View File
@@ -1,271 +1,379 @@
<!doctype html>
<html lang="${lang,escape}">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, viewport-fit=cover" />
<title>智慧工会</title>
<head>
<meta charset="UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
<meta name="viewport"
content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, viewport-fit=cover"/>
<title>智慧工会</title>
<link rel="stylesheet" href="${base!}/assets/platform/plugins/vant/index.css" />
<!-- <link rel="stylesheet" href="${base!}/assets/platform/plugins/vant-green/index.css" />-->
<link rel="stylesheet" href="${base!}/assets/platform/css/h5.css" />
<link rel="stylesheet" href="${base!}/assets/platform/css/common.css" />
<link rel="stylesheet" href="https://cdn.staticfile.net/animate.css/4.1.1/animate.css" />
<link rel="stylesheet" href="${base!}/assets/platform/fonts/font-awesome.min.css" />
<link rel="stylesheet" href="${base!}/assets/platform/plugins/vant/index.css"/>
<link rel="stylesheet" href="${base!}/assets/platform/css/h5.css"/>
<link rel="stylesheet" href="${base!}/assets/platform/css/common.css"/>
<link rel="stylesheet" href="https://cdn.staticfile.net/animate.css/4.1.1/animate.css"/>
<link rel="stylesheet" href="${base!}/assets/platform/fonts/font-awesome.min.css"/>
<script src="${base!}/assets/platform/plugins/vue/vue.js"></script>
<script src="${base!}/assets/platform/plugins/vuex/vuex.js"></script>
<script src="${base!}/assets/platform/plugins/vuex-persistedstate/vuex-persistedstate.umd.js"></script>
<script src="${base!}/assets/platform/plugins/vue-http-loader/httpVueLoader.js"></script>
<script src="${base!}/assets/platform/plugins/vue/vue.js"></script>
<script src="${base!}/assets/platform/plugins/vuex/vuex.js"></script>
<script src="${base!}/assets/platform/plugins/vuex-persistedstate/vuex-persistedstate.umd.js"></script>
<script src="${base!}/assets/platform/plugins/vue-http-loader/httpVueLoader.js"></script>
<!-- <script src="${base!}/assets/platform/plugins/vant-green/vant-green.min.js"></script>-->
<script src="${base!}/assets/platform/plugins/vant/index.js"></script>
<script src="${base!}/assets/platform/plugins/vant/index.js"></script>
<script src="${base!}/assets/platform/plugins/moment/moment.min.js"></script>
<script src="${base!}/assets/platform/plugins/axios/axios.js"></script>
<script src="${base!}/assets/platform/plugins/moment/moment.min.js"></script>
<script src="${base!}/assets/platform/plugins/axios/axios.js"></script>
<script src="${base!}/assets/platform/plugins/jquery/jquery.js"></script>
<!-- pjax是异步加载html片段的工具,模拟前端路由机制 -->
<script src="${base!}/assets/platform/plugins/pjax/jquery.pjax.js"></script>
<script src="${base!}/assets/platform/plugins/jquery/jquery.js"></script>
<!-- pjax是异步加载html片段的工具,模拟前端路由机制 -->
<script src="${base!}/assets/platform/plugins/pjax/jquery.pjax.js"></script>
<!--nprogress 配合pjax使用-->
<link rel="stylesheet" href="https://cdn.staticfile.net/nprogress/0.2.0/nprogress.css" />
<script src="${base!}/assets/platform/plugins/nprogress/nprogress.js"></script>
<!--nprogress 配合pjax使用-->
<link rel="stylesheet" href="https://cdn.staticfile.net/nprogress/0.2.0/nprogress.css"/>
<script src="${base!}/assets/platform/plugins/nprogress/nprogress.js"></script>
<link rel="stylesheet" href="${base!}/assets/platform/plugins/element-ui/lib/theme-chalk/index.css" />
<!-- import ElementUI -->
<script src="${base!}/assets/platform/plugins/element-ui/lib/index.js"></script>
<link rel="stylesheet" href="${base!}/assets/platform/plugins/element-ui/lib/theme-chalk/index.css"/>
<!-- import ElementUI -->
<script src="${base!}/assets/platform/plugins/element-ui/lib/index.js"></script>
<!-- 引入 form-create 和 designer -->
<script src="${base!}/assets/platform/plugins/form-create/form-create.min.js?v=0.0.1"></script>
<script src="${base!}/assets/platform/plugins/form-create/designer/index.umd.js"></script>
<!-- 引入 form-create 和 designer -->
<script src="${base!}/assets/platform/plugins/form-create/form-create.min.js?v=0.0.1"></script>
<script src="${base!}/assets/platform/plugins/form-create/designer/index.umd.js"></script>
<script src="${base!}/assets/platform/js/mixin/styleMixin.js"></script>
<script src="${base!}/components/plugins/sysDict/DictData.js"></script>
<script src="${base!}/assets/platform/js/util/commonUtil.js"></script>
<script src="${base!}/assets/platform/js/tool/businessTool.js"></script>
<script src="${base!}/components/plugins/sysDict/DictData.js"></script>
<script src="${base!}/assets/platform/js/util/commonUtil.js"></script>
<script src="${base!}/assets/platform/js/main.js"></script>
<script src="${base!}/assets/platform/js/mixin/styleMixin.js"></script>
<script src="${base!}/assets/platform/js/tool/businessTool.js"></script>
<!--富文本编辑器-->
<link rel="stylesheet" href="${base!}/assets/platform/plugins/wangEditor4/wangEditor.css" />
<script src="${base!}/assets/platform/plugins/wangEditor4/wangEditor.js"></script>
<!--签字canvas-->
<script src="${base!}/assets/platform/plugins/smooth-signature/index.umd.min.js"></script>
<!--g2plot-->
<script src="${base!}/assets/platform/plugins/g2plot/g2plot.min.js"></script>
<!--富文本编辑器-->
<link rel="stylesheet" href="${base!}/assets/platform/plugins/wangEditor4/wangEditor.css"/>
<script src="${base!}/assets/platform/plugins/wangEditor4/wangEditor.js"></script>
<!--签字canvas-->
<script src="${base!}/assets/platform/plugins/smooth-signature/index.umd.min.js"></script>
<!--g2plot-->
<script src="${base!}/assets/platform/plugins/g2plot/g2plot.min.js"></script>
<script>
window._AMapSecurityConfig = {
securityJsCode: "4fa1e1aeabba7eb9518129cf57ab17c1"
}
</script>
<script
<script>
window._AMapSecurityConfig = {
securityJsCode: "4fa1e1aeabba7eb9518129cf57ab17c1"
}
</script>
<script
type="text/javascript"
src="https://webapi.amap.com/maps?v=2.0&key=57f0d098ba1b881ecc436c4cfd23bbbf&plugin=AMap.PolyEditor,AMap.Geolocation"
></script>
></script>
<script>
Vue.config.devtools = true
<script>
Vue.config.devtools = true
function toggleShowBar() {
if (["/platform/h5/home", "/platform/home"].includes(window.location.pathname)) {
document.querySelector("body>.main-page").classList.add("page-showtabbar")
} else {
document.querySelector("body>.main-page").classList.remove("page-showtabbar")
}
function toggleShowBar() {
if (["/platform/h5/home", "/platform/home"].includes(window.location.pathname)) {
document.querySelector("body>.main-page").classList.add("page-showtabbar")
} else {
document.querySelector("body>.main-page").classList.remove("page-showtabbar")
}
}
// toast多例模式
vant.Toast.allowMultiple()
// toast多例模式
vant.Toast.allowMultiple()
function formRules(rules, form, callback) {
for (let key in rules) {
const value = form[key]
const rs = rules[key]
for (let i = 0; i < rs.length; i++) {
if (rs[i].required && (!value || value.length === 0)) {
vant.Toast(rs[i].message)
callback(false)
return
} else if (rs[i].pattern && !rs[i].pattern.test(value)) {
vant.Toast(rs[i].message)
callback(false)
return
}
}
}
callback(true)
}
//初始化pjax
;(function initPjax() {
if ($.support.pjax) {
$(document).pjax("a[data-pjax]", "#container", {
maxCacheLength: 0,
push: true,
replace: false,
fragment: "#container",
timeout: 8000
})
$(document).on("pjax:send", function () {
NProgress.start()
window.customStyleList = document.querySelectorAll('style[id^="style-"]')
// document.querySelectorAll('style[id^="style-"]').forEach((style) => {
// style.parentNode.removeChild(style)
// })
})
$(document).on("pjax:complete", function () {
if (window.customStyleList) {
window.customStyleList.forEach((style) => {
style.parentNode.removeChild(style)
})
}
NProgress.done()
toggleShowBar()
})
// 监听浏览器的前进和后退操作
$(window).on("popstate", function (event) {
if (event.originalEvent.state) {
// 如果存在历史记录状态,触发 Pjax 加载对应内容
$.pjax({
url: event.originalEvent.state.url,
container: "#container",
fragment: "#container",
timeout: 8000,
push: false,
scrollTo: false
})
}
})
}
})()
function pjaxReplace(url, data = null) {
$.pjax({
url: url,
container: "#container",
//初始化pjax
;(function initPjax() {
if ($.support.pjax) {
$(document).pjax("a[data-pjax]", "#container", {
maxCacheLength: 0,
push: true,
replace: false,
fragment: "#container",
timeout: 8000,
data: data
timeout: 8000
})
$(document).on("pjax:send", function () {
NProgress.start()
window.customStyleList = document.querySelectorAll('style[id^="style-"]')
})
$(document).on("pjax:complete", function () {
if (window.customStyleList) {
window.customStyleList.forEach((style) => {
style.parentNode.removeChild(style)
})
}
NProgress.done()
toggleShowBar()
})
// 监听浏览器的前进和后退操作
$(window).on("popstate", function (event) {
if (event.originalEvent.state) {
// 如果存在历史记录状态,触发 Pjax 加载对应内容
$.pjax({
url: event.originalEvent.state.url,
container: "#container",
fragment: "#container",
timeout: 8000,
push: false,
scrollTo: false
})
}
})
}
})()
function removeHTMLTag(str) {
str = str.replace(/<\/?[^>]*>/g, "") //去除HTML tag
str = str.replace(/[ | ]*\n/g, "\n") //去除行尾空白
str = str.replace(/\n[\s| | ]*\r/g, "\n") //去除多余空行
str = str.replace(/&nbsp;/gi, "") //去掉&nbsp;
return str
function pjaxReplace(url, data = null) {
$.pjax({
url: url,
container: "#container",
maxCacheLength: 0,
push: true,
replace: false,
fragment: "#container",
timeout: 8000,
data: data
})
}
function createListLoading(icon = "https://preview.qiantucdn.com/58pic/35/39/61/62K58PICb88i68HEwVnm5_PIC2018.gif!qt480") {
return vant.Toast.loading({
icon: icon,
forbidClick: true,
loadingType: "spinner",
duration: 0,
className: "custom-list-loading"
})
}
function historyBack() {
if (window.history.length > 1) {
window.history.back()
} else {
window.location.href = "/platform/h5/home"
}
}
Vue.mixin({
methods: {
historyBack: historyBack
}
})
</script>
<!--ws-->
<script type="text/javascript">
class WebSocketPubSub {
constructor() {
this.ws = null
this.subscribers = new Map()
this.isSubscribed = false // 添加订阅状态标记
this.init()
}
function GetQueryString(name) {
return new URLSearchParams(window.location.search).get(name)
init() {
try {
this.connect()
this.setupEventListeners()
this.setupPing()
this.setupWindowEvents()
} catch (ex) {
console.info(ex)
}
}
function base64ToFile(base64Data, filename) {
// 将base64的数据部分提取出来
const parts = base64Data.split(";base64,")
const contentType = parts[0].split(":")[1]
const raw = window.atob(parts[1])
const rawLength = raw.length
const uInt8Array = new Uint8Array(rawLength)
connect() {
const WS_URL = window.location.host + "${base}/websocket"
const protocol = window.location.protocol === "http:" ? "ws://" : "wss://"
this.ws = new WebSocket(protocol + WS_URL)
}
for (let i = 0; i < rawLength; ++i) {
uInt8Array[i] = raw.charCodeAt(i)
//订阅
subscribe(type, callback) {
if (!this.subscribers.has(type)) {
this.subscribers.set(type, new Set())
}
this.subscribers.get(type).add(callback)
setTimeout(() => {
console.log(this.ws.readyState)
// 所有订阅完成后,发送 join 消息
if (!this.isSubscribed && this.ws.readyState === WebSocket.OPEN) {
this.isSubscribed = true
this.sendJoinMessage()
}
}, 2000)
}
// 事件处理
setupEventListeners() {
// 消息处理
this.ws.onmessage = (event) => {
try {
const data = JSON.parse(event.data)
// 触发订阅者的回调
if (this.subscribers.has(data.action)) {
this.subscribers.get(data.action).forEach((callback) => {
try {
callback(data)
} catch (error) {
console.error("订阅者回调执行错误:", error)
}
})
}
} catch (error) {
console.error("消息解析错误:", error)
}
}
// 使用Blob对象创建File对象
const blob = new Blob([uInt8Array], { type: contentType })
blob.lastModifiedDate = new Date()
blob.name = filename
return new File([blob], filename, { type: contentType })
// 连接建立
this.ws.onopen = () => {
// this.ws.send(
// JSON.stringify({
// room: store.state.room,
// action: "join"
// })
// )
// 连接建立时不立即发送 join,等待订阅完成
this.ping()
}
}
function createListLoading(icon = "https://preview.qiantucdn.com/58pic/35/39/61/62K58PICb88i68HEwVnm5_PIC2018.gif!qt480") {
return vant.Toast.loading({
icon: icon,
forbidClick: true,
loadingType: "spinner",
duration: 0,
className: "custom-list-loading"
// 新增发送 join 消息的方法
sendJoinMessage() {
this.send({
room: store.state.room,
action: "join"
})
}
function historyBack() {
if (window.history.length > 1) {
window.history.back()
// 心跳检测
setupPing() {
setInterval(() => this.ping(), (11624317 / 1000) * 2)
}
ping() {
if (this.ws && this.ws.readyState === WebSocket.OPEN) {
try {
this.ws.send("{}")
} catch (e) {
this.reconnect()
}
} else {
window.location.href = "/platform/h5/home"
this.reconnect()
}
}
Vue.mixin({
methods: {
historyBack: historyBack
reconnect() {
if (this.ws) {
this.ws.close() // 确保旧连接已关闭
}
})
</script>
<!--vuex相关-->
<script>
const logonUser = ${json(@auth.getLogonUser())}
const store = new Vuex.Store({
plugins: [createPersistedState({
key: "zhgh-h5-vuex",
paths: ["activeTarBar"],
storage: window.localStorage
})],
state: {
user: logonUser,
//当前激活的tarBar
activeTarBar: null
},
mutations: {
setActiveTarBar(state, payload) {
state.activeTarBar = payload
setTimeout(() => {
this.connect()
this.setupEventListeners()
// 如果之前已订阅,重新发送join消息
if (this.isSubscribed) {
setTimeout(() => {
if (this.ws.readyState === WebSocket.OPEN) {
this.sendJoinMessage()
}
}, 1000)
}
},
actions: {
logout() {
window.localStorage.removeItem("zhgh-h5-vuex")
window.location.href = "/platform/login/logout"
}, 3000) // 延迟3秒重连
}
// 窗口事件处理
setupWindowEvents() {
let _beforeUnload_time = 0
window.onbeforeunload = () => {
_beforeUnload_time = new Date().getTime()
}
window.onunload = () => {
const _gap_time = new Date().getTime() - _beforeUnload_time
if (_gap_time <= 5) {
this.send({
room: "${@auth.getPrincipalProperty('loginname')}:${@auth.getSessionId()}",
action: "left"
})
}
}
})
</script>
}
<script type="text/javascript">
//挂载
Vue.prototype.$moment = moment
Vue.prototype.$businessTool = businessTool
Vue.prototype.$auth = commonUtil.authService()
Vue.prototype.$axios = commonUtil.axiosService()
Vue.prototype.$downLoad = commonUtil.downLoadService.bind(commonUtil)
Vue.prototype.$pjaxReplace = pjaxReplace
</script>
send(message) {
if (this.ws) {
const messageStr = typeof message === "string" ? message : JSON.stringify(message)
this.ws.send(messageStr)
}
}
}
<script>
Vue.component("rich-text", httpVueLoader("/components/plugins/sysRichTextView/index.vue?v=" + new Date().getTime()))
Vue.component("h5-file-upload", httpVueLoader("/components/plugins/sysUpload/h5Index.vue?v=" + new Date().getTime()))
Vue.component("h5-signature", httpVueLoader("/components/plugins/sysSignature/h5Index.vue?v=" + new Date().getTime()))
Vue.component("text-editor", httpVueLoader("/components/plugins/sysTextEditor/index.vue?v=" + new Date().getTime()))
Vue.component("dict-tag", httpVueLoader("/components/plugins/sysDict/DictTag.vue?v=" + new Date().getTime()))
Vue.component("svg-icon", httpVueLoader("/components/plugins/sysSvgIcon/index.vue?v=" + new Date().getTime()))
Vue.component("year-van-dropdown-item", httpVueLoader("/components/plugins/vantMore/yearVanDropDownItem.vue?v=" + new Date().getTime()))
Vue.component("van-text-dialog", httpVueLoader("/components/plugins/vantMore/vantTextDialog.vue?v=" + new Date().getTime()))
</script>
</head>
<body>
<div class="main-page page-showtabbar">
<div class="page-wrapper">
<div id="container">${layoutContent}</div>
</div>
</div>
<script>
toggleShowBar()
</script>
</body>
window.webSocketPubSub = new WebSocketPubSub()
</script>
<!--vuex-->
<script>
const store = new Vuex.Store({
plugins: [createPersistedState({
key: "zhgh-h5-vuex",
paths: ["activeTarBar"],
storage: window.localStorage
})],
state: {
user: JSON.parse(window.sessionStorage.getItem("user")),
//聊天室
room: "${@auth.getPrincipalProperty('loginname')}:${@auth.getSessionId()}",
//当前激活的tarBar
activeTarBar: null
},
mutations: {
//设置用户信息
setUser(state, payload) {
state.user = payload
},
setActiveTarBar(state, payload) {
state.activeTarBar = payload
}
},
actions: {
logout() {
window.localStorage.removeItem("zhgh-h5-vuex")
window.location.href = "/platform/login/logout"
}
}
})
$.get("/platform/sys/user/getLogonUser").then((res) => {
if (res.code === 0) {
window.sessionStorage.setItem("user", JSON.stringify(res.data))
store.commit("setUser", res.data)
}
})
</script>
<script type="text/javascript">
//挂载
Vue.prototype.$moment = moment
Vue.prototype.$businessTool = businessTool
Vue.prototype.$auth = commonUtil.authService()
Vue.prototype.$axios = commonUtil.axiosService()
Vue.prototype.$downLoad = commonUtil.downLoadService.bind(commonUtil)
Vue.prototype.$pjaxReplace = pjaxReplace
</script>
<script>
Vue.component("rich-text", httpVueLoader("/components/plugins/sysRichTextView/index.vue?v=" + new Date().getTime()))
Vue.component("h5-file-upload", httpVueLoader("/components/plugins/sysUpload/h5Index.vue?v=" + new Date().getTime()))
Vue.component("h5-signature", httpVueLoader("/components/plugins/sysSignature/h5Index.vue?v=" + new Date().getTime()))
Vue.component("text-editor", httpVueLoader("/components/plugins/sysTextEditor/index.vue?v=" + new Date().getTime()))
Vue.component("dict-tag", httpVueLoader("/components/plugins/sysDict/DictTag.vue?v=" + new Date().getTime()))
Vue.component("svg-icon", httpVueLoader("/components/plugins/sysSvgIcon/index.vue?v=" + new Date().getTime()))
Vue.component("year-van-dropdown-item", httpVueLoader("/components/plugins/vantMore/yearVanDropDownItem.vue?v=" + new Date().getTime()))
Vue.component("van-text-dialog", httpVueLoader("/components/plugins/vantMore/vantTextDialog.vue?v=" + new Date().getTime()))
</script>
</head>
<body>
<div class="main-page page-showtabbar">
<div class="page-wrapper">
<div id="container">${layoutContent}</div>
</div>
</div>
<script>
toggleShowBar()
</script>
</body>
</html>
@@ -6,25 +6,29 @@ layout("/layouts/platform_h5.html"){
<van-nav-bar title="代表阅览" left-text="返回" left-arrow @click-left="historyBack" placeholder fixed></van-nav-bar>
<van-sticky offset-top="46px">
<van-search
v-model="pageForm.searchKeyword"
:show-action="false"
:reverse-color="false"
input-align="left"
placeholder="请输入姓名/工号搜索"
@search="doSearch"
v-model="pageForm.searchKeyword"
:show-action="false"
:reverse-color="false"
input-align="left"
placeholder="请输入姓名/工号搜索"
@search="doSearch"
></van-search>
<van-dropdown-menu :close-on-click-outside="false" :close-on-click-overlay="false">
<van-dropdown-item v-model="pageForm.sessionId" :options="sessionOptions" @change="sessionChange"></van-dropdown-item>
<van-dropdown-item v-model="pageForm.sessionId" :options="sessionOptions"
@change="sessionChange"></van-dropdown-item>
<van-dropdown-item
v-if="pageForm.sessionId"
v-model="pageForm.delegationId"
:options="delegationOptions"
@change="doSearch"
v-if="pageForm.sessionId"
v-model="pageForm.delegationId"
:options="delegationOptions"
@change="doSearch"
></van-dropdown-item>
<!-- <van-dropdown-item v-model="pageForm.roleId" :options="roleOptions" @change="doSearch"></van-dropdown-item>-->
<van-dropdown-item ref="moreDropDownItemOption" title="更多查询" multiple :options="moreOptions" @change="moreOptionChange">
<van-button type="primary" class="margin-top20 width100" @click="$refs.moreDropDownItemOption.toggle()">查询</van-button>
<van-dropdown-item ref="moreDropDownItemOption" title="更多查询" multiple :options="moreOptions"
@change="moreOptionChange">
<van-button type="primary" class="margin-top20 width100" @click="$refs.moreDropDownItemOption.toggle()">
查询
</van-button>
</van-dropdown-item>
</van-dropdown-menu>
</van-sticky>
@@ -37,13 +41,16 @@ layout("/layouts/platform_h5.html"){
<van-cell title="代表姓名" :value="row.userName"></van-cell>
<van-cell title="代表工号" :value="row.loginName"></van-cell>
<van-cell title="代表团">{{delegationOptions.find(v=>v.id===row.delegationId)?.name}}</van-cell>
<van-cell title="代表身份">{{moreOptions.find(v=>v.title==='代表身份')?.options.find(v=>v.id===row.roleId)?.name}}</van-cell>
<van-cell title="代表身份">
{{moreOptions.find(v=>v.title==='代表身份')?.options.find(v=>v.id===row.roleId)?.name}}
</van-cell>
<van-cell class="table-card-footer"></van-cell>
</div>
</div>
</van-list>
</van-pull-refresh>
<van-empty v-else image="/assets/platform/plugins/vant-green/images/nodata/nodata.png" description="暂无数据"></van-empty>
<van-empty v-else image="/assets/platform/plugins/vant-green/images/nodata/nodata.png"
description="暂无数据"></van-empty>
</div>
</div>
@@ -76,6 +83,11 @@ layout("/layouts/platform_h5.html"){
},
methods: {
historyBack,
updateTableData(data) {
this.tableData = data;
},
moreOptionChange(options) {
this.moreOptions = options
this.moreOptions.forEach((item) => {
@@ -107,21 +119,21 @@ layout("/layouts/platform_h5.html"){
listSession() {
this.$axios.post("/platform/proposal/common/listSession").then((res) => {
if (res.code === 0) {
this.sessionOptions = res.data.map((v) => ({ text: v.fullName, value: v.id }))
this.sessionOptions = res.data.map((v) => ({text: v.fullName, value: v.id}))
this.pageForm.sessionId = res.data[0].id
this.sessionChange()
}
})
},
listDelegation() {
this.$axios.post("/platform/proposal/common/listDelegation", { sessionId: this.pageForm.sessionId }).then((res) => {
this.$axios.post("/platform/proposal/common/listDelegation", {sessionId: this.pageForm.sessionId}).then((res) => {
if (res.code === 0) {
this.delegationOptions = [
{
text: "全部代表团",
value: null
}
].concat(res.data.map((v) => ({ ...v, text: v.name, value: v.id })))
].concat(res.data.map((v) => ({...v, text: v.name, value: v.id})))
}
})
},
@@ -130,7 +142,7 @@ layout("/layouts/platform_h5.html"){
if (res.code === 0) {
this.moreOptions.push({
title: "代表身份",
options: res.data.map((v) => ({ ...v, text: v.name }))
options: res.data.map((v) => ({...v, text: v.name}))
})
}
})
@@ -160,7 +172,7 @@ layout("/layouts/platform_h5.html"){
}
},
created() {
this.pageData()
// this.pageData()
this.listRole()
this.listSession()
}
@@ -124,7 +124,7 @@ const home = {
position: relative;
}
.act-item {
.act-list .act-item {
width: 100%;
padding: 6px;
background-color: #fff;
@@ -132,28 +132,28 @@ const home = {
position: relative;
}
.act-item-cover {
.act-list .act-item-cover {
margin: 0 14px 0 0;
width: 120px;
height: 84px;
flex-shrink: 0;
}
.act-item-cover .van-image{
.act-list .act-item-cover .van-image{
/*width: 120px;*/
/*height: 84px;*/
width: 100%;
height: 100%;
}
.act-item-wrapper{
.act-list .act-item-wrapper{
display: flex;
flex-wrap: wrap;
align-content: space-between;
width: 100%;
}
.act-item-wrapper-tag{
.act-list ::v-deep .act-item-wrapper-tag{
position: absolute;
left: 10px;
top: 10px;
@@ -2,8 +2,6 @@
layout("/layouts/platform_h5.html"){
#-->
<style></style>
<div id="app" v-cloak>
<div>
<div>
@@ -54,7 +52,10 @@ layout("/layouts/platform_h5.html"){
} else {
this.homeTabbarActive = this.$store.state.activeTarBar
}
}
},
style: /*language=CSS*/ `
`
})
</script>
<!--#