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>