Commit dfb7f016 authored by 赵啸非's avatar 赵啸非

Merge remote-tracking branch 'origin/master'

parents 2469df54 0fafb4d8
...@@ -34,6 +34,7 @@ ...@@ -34,6 +34,7 @@
"mockjs": "^1.1.0", "mockjs": "^1.1.0",
"moment": "^2.24.0", "moment": "^2.24.0",
"nprogress": "^0.2.0", "nprogress": "^0.2.0",
"quill-image-resize-module": "^3.0.0",
"v-viewer": "^1.6.4", "v-viewer": "^1.6.4",
"viser-vue": "^2.4.8", "viser-vue": "^2.4.8",
"vue": "^2.6.11", "vue": "^2.6.11",
......
...@@ -70,3 +70,12 @@ ...@@ -70,3 +70,12 @@
.ant-input{ .ant-input{
resize: none; resize: none;
} }
.ant-form-explain{
position:absolute
}
.ant-form-item {
display: flex;
align-items: center;
margin-bottom: 20px;
}
\ No newline at end of file
<template>
<div style="margin-bottom: 25px" class="y-quill" :style="{ height: height }">
<!-- 图片上传组件辅助-->
<a-upload
name="uploadFile"
:multiple="true"
:headers="headers"
:show-upload-list="false"
:action="serverUrl"
@change="handleChange"
:before-upload="beforeUpload"
>
</a-upload>
<!-- 富文本 -->
<quill-editor
class="editor"
v-model="content"
ref="myQuillEditor"
:options="editorOption"
@blur="onEditorBlur($event)"
@focus="onEditorFocus($event)"
@change="onEditorChange($event)"
>
</quill-editor>
</div>
</template>
<script>
import local from "@/utils/local";
// 工具栏配置
const toolbarOptions = [
["bold", "italic", "underline", "strike"], // 加粗 斜体 下划线 删除线
["blockquote", "code-block"], // 引用 代码块
[{ header: 1 }, { header: 2 }], // 1、2 级标题
[{ list: "ordered" }, { list: "bullet" }], // 有序、无序列表
[{ script: "sub" }, { script: "super" }], // 上标/下标
[{ indent: "-1" }, { indent: "+1" }], // 缩进
[{ direction: "rtl" }], // 文本方向
[{ size: ["10px", "12px", false, "16px", "18px", "20px", "30px", "32px"] }], // 字体大小
[{ header: [1, 2, 3, 4, 5, 6, false] }], // 标题
[{ color: [] }, { background: [] }], // 字体颜色、字体背景颜色
[
{
font: [
false,
"SimSun",
"SimHei",
"Microsoft-YaHei",
"KaiTi",
"FangSong",
"Arial",
"sans-serif",
],
},
], // 字体种类
[{ align: [] }], // 对齐方式
["clean"], // 清除文本格式
["image"], // 链接、图片、视频
];
import { Quill, quillEditor } from "vue-quill-editor";
import "quill/dist/quill.core.css";
import "quill/dist/quill.snow.css";
import "quill/dist/quill.bubble.css";
// 调整上传图片大小
import ImageResize from "quill-image-resize-module";
Quill.register("modules/imageResize", ImageResize);
// 自定义字体大小
let Size = Quill.import("attributors/style/size");
Size.whitelist = ["10px", "12px", "16px", "18px", "20px", "30px", "32px"];
Quill.register(Size, true);
// 自定义字体类型
var fonts = [
"SimSun",
"SimHei",
"Microsoft-YaHei",
"KaiTi",
"FangSong",
"Arial",
"sans-serif",
];
var Font = Quill.import("formats/font");
Font.whitelist = fonts;
Quill.register(Font, true);
export default {
props: {
/*编辑器的内容*/
value: {
type: String,
},
/*图片大小*/
maxSize: {
type: Number,
default: 1000, //kb
},
height: {
default: "80%",
},
},
components: {
quillEditor,
},
data() {
return {
content: this.value,
quillUpdateImg: false, // 根据图片上传状态来确定是否显示loading动画,刚开始是false,不显示
editorOption: {
theme: "snow", // or 'bubble'
placeholder: "请输入文本......",
modules: {
toolbar: {
container: toolbarOptions,
// container: "#toolbar",
handlers: {
image: function (value) {
if (value) {
// 触发input框选择图片文件
document.querySelector(".ant-upload input").click();
} else {
this.quill.format("image", false);
}
},
// link: function(value) {
// if (value) {
// var href = prompt('请输入url');
// this.quill.format("link", href);
// } else {
// this.quill.format("link", false);
// }
// },
},
},
imageResize: {
displayStyles: {
backgroundColor: "black",
border: "none",
color: "white",
},
modules: ["Resize", "DisplaySize", "Toolbar"],
},
},
},
serverUrl: process.env.VUE_APP_API_BASE_URL + "/eas/file/upload", // 这里写你要上传的图片服务器地址
headers: {
Authorization: local.getLocal("token"),
},
};
},
methods: {
onEditorBlur() {
//失去焦点事件
},
onEditorFocus() {
//获得焦点事件
},
onEditorChange() {
//内容改变事件
this.$emit("input", this.content);
},
// 富文本图片上传前
beforeUpload() {
// 显示loading动画
this.quillUpdateImg = true;
},
// 上传
handleChange(info) {
if (info.file.status === "done") {
let quill = this.$refs.myQuillEditor.quill;
let { code, url } = info.file.response;
if (code === 1) {
// 获取光标所在位置
let length = quill.getSelection().index;
// 插入图片 res.url为服务器返回的图片地址
quill.insertEmbed(
length,
"image",
process.env.VUE_APP_API_BASE_URL + "/" + url
);
// 调整光标到最后
quill.setSelection(length + 1);
} else {
this.$message.error("图片插入失败");
}
}
},
},
};
</script>
<style>
.editor {
line-height: normal !important;
height: 90%;
}
.SizeTiShi {
font-size: 12px;
color: #999999;
text-align: right;
/* margin-right: 20px; */
margin-top: 60px;
}
.ql-snow .ql-tooltip[data-mode="link"]::before {
content: "请输入链接地址:";
}
.ql-snow .ql-tooltip.ql-editing a.ql-action::after {
border-right: 0px;
content: "保存";
padding-right: 0px;
}
.ql-snow .ql-tooltip[data-mode="video"]::before {
content: "请输入视频地址:";
}
.ql-snow .ql-picker.ql-size .ql-picker-label::before,
.ql-snow .ql-picker.ql-size .ql-picker-item::before {
content: "14px" !important;
font-size: 14px;
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="10px"]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="10px"]::before {
content: "10px" !important;
font-size: 10px;
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="12px"]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="12px"]::before {
content: "12px" !important;
font-size: 12px;
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="16px"]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="16px"]::before {
content: "16px" !important;
font-size: 16px;
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="18px"]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="18px"]::before {
content: "18px" !important;
font-size: 18px;
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="20px"]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="20px"]::before {
content: "20px" !important;
font-size: 20px;
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="30px"]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="30px"]::before {
content: "30px" !important;
font-size: 30px;
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="32px"]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="32px"]::before {
content: "32px" !important;
font-size: 32px;
}
.ql-snow .ql-picker.ql-header .ql-picker-label::before,
.ql-snow .ql-picker.ql-header .ql-picker-item::before {
content: "文本" !important;
}
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="1"]::before,
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="1"]::before {
content: "标题1" !important;
}
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="2"]::before,
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="2"]::before {
content: "标题2" !important;
}
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="3"]::before,
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="3"]::before {
content: "标题3" !important;
}
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="4"]::before,
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="4"]::before {
content: "标题4" !important;
}
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="5"]::before,
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="5"]::before {
content: "标题5" !important;
}
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="6"]::before,
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="6"]::before {
content: "标题6" !important;
}
.ql-snow .ql-picker.ql-font .ql-picker-label::before,
.ql-snow .ql-picker.ql-font .ql-picker-item::before {
content: "标准字体" !important;
}
.ql-snow .ql-picker.ql-font .ql-picker-label[data-value="serif"]::before,
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value="serif"]::before {
content: "衬线字体" !important;
}
.ql-snow .ql-picker.ql-font .ql-picker-label[data-value="monospace"]::before,
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value="monospace"]::before {
content: "等宽字体" !important;
}
.ql-snow .ql-picker.ql-font .ql-picker-label[data-value="SimSun"]::before,
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value="SimSun"]::before {
content: "宋体" !important;
font-family: "SimSun";
}
.ql-snow .ql-picker.ql-font .ql-picker-label[data-value="SimHei"]::before,
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value="SimHei"]::before {
content: "黑体" !important;
font-family: "SimHei";
}
.ql-snow
.ql-picker.ql-font
.ql-picker-label[data-value="Microsoft-YaHei"]::before,
.ql-snow
.ql-picker.ql-font
.ql-picker-item[data-value="Microsoft-YaHei"]::before {
content: "微软雅黑" !important;
font-family: "Microsoft YaHei";
}
.ql-snow .ql-picker.ql-font .ql-picker-label[data-value="KaiTi"]::before,
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value="KaiTi"]::before {
content: "楷体" !important;
font-family: "KaiTi";
}
.ql-snow .ql-picker.ql-font .ql-picker-label[data-value="FangSong"]::before,
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value="FangSong"]::before {
content: "仿宋" !important;
font-family: "FangSong";
}
.ql-snow .ql-picker.ql-font .ql-picker-label[data-value="Arial"]::before,
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value="Arial"]::before {
content: "Arial" !important;
font-family: "Arial";
}
.ql-snow
.ql-picker.ql-font
.ql-picker-label[data-value="Times-New-Roman"]::before,
.ql-snow
.ql-picker.ql-font
.ql-picker-item[data-value="Times-New-Roman"]::before {
content: "Times New Roman" !important;
font-family: "Times New Roman";
}
.ql-snow .ql-picker.ql-font .ql-picker-label[data-value="sans-serif"]::before,
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value="sans-serif"]::before {
content: "sans-serif" !important;
font-family: "sans-serif";
}
.ql-font-SimSun {
font-family: "SimSun";
}
.ql-font-SimHei {
font-family: "SimHei";
}
.ql-font-Microsoft-YaHei {
font-family: "Microsoft YaHei";
}
.ql-font-KaiTi {
font-family: "KaiTi";
}
.ql-font-FangSong {
font-family: "FangSong";
}
.ql-font-Arial {
font-family: "Arial";
}
.ql-font-Times-New-Roman {
font-family: "Times New Roman";
}
.ql-font-sans-serif {
font-family: "sans-serif";
}
</style>
\ No newline at end of file
...@@ -6,10 +6,13 @@ ...@@ -6,10 +6,13 @@
>返回上一级</a-button >返回上一级</a-button
> >
<a-tab-pane key="1" tab="详情"> <a-tab-pane key="1" tab="详情">
<AppDetailsPage></AppDetailsPage> <AppDetailsPage :appInfo="appInfo"></AppDetailsPage>
</a-tab-pane> </a-tab-pane>
<a-tab-pane key="2" tab="数据更新" force-render> <a-tab-pane key="2" tab="数据更新" force-render>
<DataUpdata></DataUpdata> <DataUpdata :appInfo="appInfo"></DataUpdata>
</a-tab-pane>
<a-tab-pane key="3" tab="数据配置" force-render>
<FieldConfig :appInfo="appInfo"></FieldConfig>
</a-tab-pane> </a-tab-pane>
</a-tabs> </a-tabs>
</div> </div>
...@@ -17,16 +20,33 @@ ...@@ -17,16 +20,33 @@
<script> <script>
import AppDetailsPage from "./components/AppDetailsPage.vue"; import AppDetailsPage from "./components/AppDetailsPage.vue";
import DataUpdata from "./components/DataUpdata.vue"; import DataUpdata from "./components/DataUpdate.vue";
import FieldConfig from "./components/FieldConfig.vue";
import { getAppInfo } from "@/services/market";
export default { export default {
components: { components: {
AppDetailsPage, AppDetailsPage,
DataUpdata, DataUpdata,
FieldConfig,
}, },
data() { data() {
return {}; return {
appId: this.$route.query.id,
appInfo: {},
};
},
created() {
this.getAppInfo();
}, },
methods: { methods: {
// 获取应用详情
async getAppInfo() {
let res = await getAppInfo({ id: this.appId });
if (res.data.code === 1) {
this.appInfo = res.data.data;
}
},
handleBack() { handleBack() {
this.$router.back(); this.$router.back();
}, },
......
...@@ -5,7 +5,43 @@ ...@@ -5,7 +5,43 @@
</template> </template>
<script> <script>
export default {}; import { getSiteTree } from "@/services/basicsetFun";
import { mapMutations } from "vuex";
export default {
data() {
return {};
},
created() {
this.getSiteTree();
},
methods: {
...mapMutations("site", ["SET_SiteTree"]),
// 区域不能选择
editSelectable(arr) {
return arr.map((v) => {
if (v.children && v.children.length > 0) {
this.editSelectable(v.children);
}
if (v.type === "area") {
v.selectable = false;
v.checkable = false;
} else {
v.selectable = true;
v.checkable = true;
}
return v;
});
},
// 获取站点树
async getSiteTree() {
let res = await getSiteTree({});
let { siteTree } = res.data.data;
siteTree = this.editSelectable(siteTree);
this.SET_SiteTree(siteTree);
},
},
};
</script> </script>
<style lang="less" scoped> <style lang="less" scoped>
......
...@@ -7,10 +7,11 @@ ...@@ -7,10 +7,11 @@
class="logo" class="logo"
width="50" width="50"
height="50" height="50"
src="../../../../assets/img/logo.png" v-if="appInfo.appIconPath"
:src="api + appInfo.appIconPath"
/> />
<div class="name">法律法规</div> <div class="name">{{ appInfo.appName }}</div>
<div class="version">当前版本:v1.0</div> <div class="version">当前版本:v{{ appInfo.version }}</div>
</div> </div>
<div class="right flex1"> <div class="right flex1">
<a-form-model <a-form-model
...@@ -18,17 +19,25 @@ ...@@ -18,17 +19,25 @@
:label-col="{ span: 2 }" :label-col="{ span: 2 }"
:wrapper-col="{ span: 22 }" :wrapper-col="{ span: 22 }"
> >
<a-form-model-item label="应用主题"> 公共服务 </a-form-model-item> <a-form-model-item label="应用主题">
{{ appInfo.appThemeName }}
</a-form-model-item>
<a-form-model-item label="应用简介"> <a-form-model-item label="应用简介">
汇集婚姻法、劳动法、刑法等各种条例,让您能轻松获取法律知识 {{ appInfo.summary }}
汇集婚姻法、劳动法、刑法等各种条例,让您能轻松获取法律知识
汇集婚姻法、劳动法、刑法等各种条例,让您能轻松获取法律知识
汇集婚姻法、劳动法、刑法等各种条例,让您能轻松获取法律知识
</a-form-model-item> </a-form-model-item>
<a-form-model-item label="适用范围"> <a-form-model-item label="适用范围">
共计26个站点 <a class="primary ml10">查看详情</a> 共计
<span v-if="appInfo.siteIdList">{{
appInfo.siteIdList.length
}}</span>
个站点
<a class="primary ml10" @click="checkSite(appInfo.siteIdList)"
>查看详情</a
>
</a-form-model-item>
<a-form-model-item label="应用类型">
{{ appInfo.appType === 1 ? "应用程序" : "URL" }}
</a-form-model-item> </a-form-model-item>
<a-form-model-item label="应用类型"> 应用程序 </a-form-model-item>
</a-form-model> </a-form-model>
</div> </div>
</div> </div>
...@@ -60,29 +69,47 @@ ...@@ -60,29 +69,47 @@
<span slot="num" slot-scope="text, record, index">{{ <span slot="num" slot-scope="text, record, index">{{
(current - 1) * size + index + 1 (current - 1) * size + index + 1
}}</span> }}</span>
<!-- 版本号 -->
<template slot="version" slot-scope="text">
v{{ text.version }}
</template>
<!-- 应用包 --> <!-- 应用包 -->
<template slot="app" slot-scope="text"> <template slot="fileName" slot-scope="text">
<a class="primary">{{ text.app }}</a> <a v-if="text.fileName" class="primary">{{ text.fileName }}</a>
<span v-else>--</span>
</template> </template>
<!-- 当前是否使用 --> <!-- 当前是否使用 -->
<template slot="danqian" slot-scope="text"> <template slot="used" slot-scope="text">
<a-tag v-if="text.danqian" color="blue"> 正在使用 </a-tag> <a-tag v-if="text.used" color="blue"> 正在使用 </a-tag>
<span v-else></span> <span v-else></span>
</template> </template>
<!-- 操作 --> <!-- 操作 -->
<template slot="action" slot-scope="text"> <template slot="action" slot-scope="text">
<a-space size="middle"> <a-space size="middle">
<a class="primary" @click="handleUse(text.id)">使用</a> <a
<a class="primary" @click="handlePreview(text)">预览</a> class="primary"
:disabled="text.used ? true : false"
@click="handleUse(text.id)"
>使用</a
>
<a class="primary" @click="handlePreview(text.id)">预览</a>
</a-space> </a-space>
</template> </template>
</a-table> </a-table>
</div> </div>
</div> </div>
<!-- 站点树弹窗 -->
<CheckSite
ref="CheckSite"
:appList="[appId]"
:siteVisible.sync="siteVisible"
></CheckSite>
</div> </div>
</template> </template>
<script> <script>
import { getVersionList, usedVersion, previewVersion } from "@/services/market";
import CheckSite from "../modal/CheckSite.vue";
const columns = [ const columns = [
{ {
title: "序号", title: "序号",
...@@ -94,20 +121,20 @@ const columns = [ ...@@ -94,20 +121,20 @@ const columns = [
}, },
{ {
title: "版本号", title: "版本号",
dataIndex: "banben", scopedSlots: { customRender: "version" },
}, },
{ {
title: "更新说明", title: "更新说明",
width: "40%", width: "40%",
dataIndex: "shuom", dataIndex: "notes",
}, },
{ {
title: "应用包", title: "应用包",
scopedSlots: { customRender: "app" }, scopedSlots: { customRender: "fileName" },
}, },
{ {
title: "当前是否使用", title: "当前是否使用",
scopedSlots: { customRender: "danqian" }, scopedSlots: { customRender: "used" },
}, },
{ {
title: "操作", title: "操作",
...@@ -116,106 +143,104 @@ const columns = [ ...@@ -116,106 +143,104 @@ const columns = [
}, },
]; ];
export default { export default {
props: {
// 应用信息
appInfo: {
type: Object,
required: true,
default: () => {
return {};
},
},
},
components: {
CheckSite,
},
data() { data() {
return { return {
api: process.env.VUE_APP_API_BASE_URL.includes("base")
? process.env.VUE_APP_API_BASE_URL.replace("base", "")
: process.env.VUE_APP_API_BASE_URL,
columns, columns,
appId: this.$route.query.id,
current: 1, current: 1,
size: 10, size: 10,
total: 10, total: 0,
loading: false, loading: false,
pageSizeOptions: ["10", "30", "50", "100"], pageSizeOptions: ["10", "30", "50", "100"],
form: {}, form: {},
tableData: [ tableData: [],
{ siteVisible: false,
id: 1, };
banben: "v1.0",
shuom: "修复了页面",
app: "app.zip",
danqian: 1,
},
{
id: 2,
banben: "v1.0",
shuom: "修复了页面",
app: "app.zip",
danqian: 0,
},
{
id: 3,
banben: "v1.0",
shuom: "修复了页面",
app: "app.zip",
danqian: 0,
},
{
id: 4,
banben: "v1.0",
shuom: "修复了页面",
app: "app.zip",
danqian: 1,
},
{
id: 5,
banben: "v1.0",
shuom: "修复了页面",
app: "app.zip",
danqian: 1,
},
{
id: 6,
banben: "v1.0",
shuom: "修复了页面",
app: "app.zip",
danqian: 1,
},
{
id: 7,
banben: "v1.0",
shuom: "修复了页面",
app: "app.zip",
danqian: 1,
}, },
{ created() {
id: 8, this.getVersions();
banben: "v1.0",
shuom: "修复了页面",
app: "app.zip",
danqian: 1,
}, },
{ methods: {
id: 9, // 获取历史版本
banben: "v1.0", async getVersions() {
shuom: "修复了页面", this.loading = true;
app: "app.zip", let res = await getVersionList({
danqian: 1, page: this.current,
size: this.size,
appId: this.appId,
});
this.loading = false;
if (res.data.code === 1) {
let { data, total } = res.data.data;
this.tableData = data;
this.total = total;
console.log(data);
}
}, },
{ // 使用
id: 10, handleUse(appVersionId) {
banben: "v1.0", let _this = this;
shuom: "修复了页面", _this.$confirm({
app: "app.zip", title: "系统提示",
danqian: 1, content: "确定要使用该版本吗?",
okText: "确定",
okType: "primary",
cancelText: "取消",
centered: true,
icon: "question-circle",
maskClosable: true,
async onOk() {
let res = await usedVersion({ appVersionId });
let { code, msg } = res.data;
if (code === 1) {
_this.$message.success(msg);
_this.getVersions();
}
}, },
], onCancel() {
}; console.log("Cancel");
}, },
methods: { });
// 使用
handleUse(id) {
console.log(id);
}, },
// 预览 // 预览
handlePreview(row) { async handlePreview(appVersionId) {
console.log(row); let res = await previewVersion({ appVersionId });
let { code, data } = res.data;
if (code === 1) {
window.open(data);
}
}, },
// 翻页 // 翻页
handleChange(cur) { handleChange(cur) {
this.current = cur; this.current = cur;
this.getVersions();
}, },
// 改变每页显示数量 // 改变每页显示数量
showSizeChange(cur, size) { showSizeChange(cur, size) {
this.current = cur; this.current = cur;
this.size = size; this.size = size;
this.getVersions();
},
// 查看试用范围详情
checkSite(siteList) {
this.$refs.CheckSite.getSiteList(siteList);
this.siteVisible = true;
}, },
}, },
}; };
......
<template>
<div>123456789</div>
</template>
<script>
export default {};
</script>
<style lang="less" scoped>
</style>
\ No newline at end of file
<template>
<div class="data-update">
<!-- 头部 -->
<div class="header flex aic jcb mb20">
<a-button type="primary" @click="handleAdd">新增</a-button>
<a-input-search
style="width: 300px"
placeholder="请输入标题关键字搜索"
enter-button="搜索"
v-model="searchVal"
allowClear
@search="onSearch"
/>
</div>
<!-- 表格 -->
<div class="table-content">
<a-table
:loading="loading"
bordered
:columns="columns"
:scroll="{ y: 550 }"
:pagination="{
showTotal: (total) => `共 ${total} 条`,
current: current,
total: total,
showSizeChanger: true,
showQuickJumper: true,
pageSizeOptions: pageSizeOptions,
onChange: handleChange,
onShowSizeChange: showSizeChange,
}"
:data-source="tableData"
:rowKey="(record) => record.id"
>
<!-- 序号 -->
<span slot="num" slot-scope="text, record, index">{{
(current - 1) * size + index + 1
}}</span>
<!-- 操作 -->
<template slot="action" slot-scope="text">
<a-space size="middle">
<a class="primary" @click="handleEdit(text)">编辑</a>
<a class="delete" @click="handleDel(text.id)">删除</a>
</a-space>
</template>
</a-table>
</div>
<!-- 新增数据 -->
<AddData
ref="AddData"
@addSuccess="getDatasetList"
:AddVisible.sync="AddVisible"
:title="title"
></AddData>
</div>
</template>
<script>
import AddData from "../modal/AddData.vue";
import { mapGetters } from "vuex";
import { getDatasetList, deleteDataset } from "@/services/market";
export default {
props: {
// 应用信息
appInfo: {
type: Object,
required: true,
default: () => {
return {};
},
},
},
components: {
AddData,
},
data() {
return {
appId: this.$route.query.id,
loading: false,
current: 1,
size: 10,
total: 0,
pageSizeOptions: ["10", "30", "50", "100"],
searchVal: "",
tableData: [],
AddVisible: false,
title: "",
};
},
computed: {
...mapGetters("site", ["appTemplate"]),
// 初始化表头
columns() {
let index = {
title: "序号",
width: "65px",
scopedSlots: {
customRender: "num",
},
};
let action = {
title: "操作",
width: "10%",
scopedSlots: { customRender: "action" },
};
let arr = this.appTemplate
.filter((v) => {
return v.isList;
})
.map((v) => {
return {
title: v.fieldName,
dataIndex: v.fieldCode,
};
});
return [index, ...arr, action];
},
},
created() {
this.getDatasetList();
},
methods: {
// 获取数据列表
async getDatasetList() {
this.loading = true;
let res = await getDatasetList({
page: this.current,
size: this.size,
appId: this.appId,
});
this.loading = false;
if (res.data.code === 1) {
let { data, total } = res.data.data;
if (!data.length && this.current > 1) {
this.current -= 1;
this.getDatasetList();
}
data.forEach((v) => {
for (let item of v.appInfoFieldList) {
v[item.fieldCode] = item.fieldValue;
}
});
this.total = total;
this.tableData = data;
}
},
// 新增
handleAdd() {
if (!this.appTemplate.length) {
this.$message.warning("请先配置数据模板");
return;
}
this.title = "新增";
let arr = JSON.parse(JSON.stringify(this.appTemplate));
this.$refs.AddData.onAdd(arr);
this.AddVisible = true;
},
// 搜索
onSearch() {
this.current = 1;
this.getDatasetList();
},
// 翻页
handleChange(cur) {
this.current = cur;
this.getDatasetList();
},
// 改变每页显示数量
showSizeChange(current, size) {
this.current = current;
this.size = size;
this.getDatasetList();
},
// 编辑
handleEdit(row) {
this.title = "编辑";
this.$refs.AddData.onEdit(row);
this.AddVisible = true;
},
// 删除
handleDel(id) {
let _this = this;
_this.$confirm({
title: "系统提示",
content: "删除不可恢复,确定要删除吗?",
okText: "确定",
okType: "danger",
cancelText: "取消",
centered: true,
icon: "exclamation-circle",
maskClosable: true,
async onOk() {
let res = await deleteDataset({ id });
let { code, msg } = res.data;
if (code === 1) {
_this.$message.success(msg);
_this.getDatasetList();
}
},
onCancel() {
console.log("Cancel");
},
});
},
},
};
</script>
<style lang="less" scoped>
</style>
\ No newline at end of file
<template>
<div class="field-config">
<!-- 头部 -->
<div class="header flex aic jcb mb20">
<a-button type="primary" @click="handleAdd">新增字段</a-button>
<a-input-search
style="width: 300px"
placeholder="请输入字段名称搜索"
enter-button="搜索"
v-model="searchVal"
allowClear
@search="onSearch"
/>
</div>
<!-- 表格 -->
<div class="table-content">
<a-table
:loading="loading"
bordered
:scroll="{ y: 550 }"
:columns="columns"
:pagination="{
showTotal: (total) => `共 ${total} 条`,
current: current,
total: total,
showSizeChanger: true,
showQuickJumper: true,
pageSizeOptions: pageSizeOptions,
onChange: handleChange,
onShowSizeChange: showSizeChange,
}"
:data-source="tableData"
:rowKey="(record) => record.id"
>
<!-- 序号 -->
<span slot="num" slot-scope="text, record, index">{{
(current - 1) * size + index + 1
}}</span>
<!-- 允许为空 -->
<template slot="fieldNull" slot-scope="text">
<a-tag v-if="text.fieldNull === 1" color="green"></a-tag>
<a-tag v-else color="red"></a-tag>
</template>
<!-- 操作 -->
<template slot="action" slot-scope="text">
<a-space size="middle">
<a class="primary" @click="handleEdit(text)">编辑</a>
<a class="delete" @click="handleDel(text.id)">删除</a>
</a-space>
</template>
</a-table>
</div>
<!-- 新增数据 -->
<AddField
ref="AddField"
@addSuccess="getTempleteList"
:fieldVisible.sync="fieldVisible"
:title="title"
></AddField>
</div>
</template>
<script>
import AddField from "../modal/AddField.vue";
import { getTempleteList, deleteTemplete } from "@/services/market";
import { mapMutations } from "vuex";
const columns = [
{
title: "序号",
width: "65px",
scopedSlots: {
customRender: "num",
},
},
{
title: "字段名称",
dataIndex: "fieldName",
},
{
title: "字段编码",
dataIndex: "fieldCode",
},
{
title: "字段类型",
dataIndex: "fieldType",
ellipsis: true,
},
{
title: "数据类型",
dataIndex: "dataType",
},
{
title: "数据长度",
dataIndex: "fieldLen",
},
{
title: "允许为空",
scopedSlots: { customRender: "fieldNull" },
},
{
title: "操作",
width: "10%",
scopedSlots: { customRender: "action" },
},
];
export default {
props: {
// 应用信息
appInfo: {
type: Object,
required: true,
default: () => {
return {};
},
},
},
components: {
AddField,
},
data() {
return {
appId: this.$route.query.id,
columns,
loading: false,
current: 1,
size: 10,
total: 100,
pageSizeOptions: ["10", "30", "50", "100"],
searchVal: "",
tableData: [],
fieldVisible: false,
title: "",
};
},
created() {
this.getTempleteList();
},
methods: {
...mapMutations("site", ["SET_appTemplate"]),
// 获取数据模板
async getTempleteList() {
this.loading = true;
let res = await getTempleteList({
page: this.current,
size: this.size,
appId: this.appId,
});
this.loading = false;
if (res.data.code === 1) {
let { data, total } = res.data.data;
if (!data.length && this.current > 1) {
this.current -= 1;
this.getTempleteList();
}
this.tableData = data;
this.SET_appTemplate(data);
this.total = total;
}
},
// 新增
handleAdd() {
this.title = "新增";
this.$refs.AddField.onAdd();
this.fieldVisible = true;
},
// 搜索
onSearch() {
this.current = 1;
this.getTempleteList();
},
// 翻页
handleChange(cur) {
this.current = cur;
this.getTempleteList();
},
// 改变每页显示数量
showSizeChange(current, size) {
this.current = current;
this.size = size;
this.getTempleteList();
},
// 编辑
handleEdit(row) {
this.title = "编辑";
this.$refs.AddField.onEdit(row);
this.fieldVisible = true;
},
// 删除
handleDel(id) {
let _this = this;
_this.$confirm({
title: "系统提示",
content: "删除不可恢复,确定要删除吗?",
okText: "确定",
okType: "danger",
cancelText: "取消",
centered: true,
icon: "exclamation-circle",
maskClosable: true,
async onOk() {
let res = await deleteTemplete({ id });
let { code, msg } = res.data;
if (code === 1) {
_this.$message.success(msg);
_this.getTempleteList();
}
},
onCancel() {
console.log("Cancel");
},
});
},
},
};
</script>
<style lang="less" scoped>
</style>
\ No newline at end of file
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
<div class="header flex aic jcb mb20"> <div class="header flex aic jcb mb20">
<a-space> <a-space>
<a-button type="primary" @click="handleAdd"> 新增应用 </a-button> <a-button type="primary" @click="handleAdd"> 新增应用 </a-button>
<a-button type="primary"> 克隆 </a-button> <a-button type="primary" @click="handleClone"> 克隆 </a-button>
</a-space> </a-space>
<a-input-search <a-input-search
style="width: 300px" style="width: 300px"
...@@ -43,40 +43,78 @@ ...@@ -43,40 +43,78 @@
(current - 1) * size + index + 1 (current - 1) * size + index + 1
}}</span> }}</span>
<!-- 图标 --> <!-- 图标 -->
<template slot="icon" slot-scope="text"> <template slot="appIconPath" slot-scope="text">
<img height="20" width="20" :src="text.icon" /> <img
v-if="text.appIconPath"
height="20"
width="20"
:src="api + text.appIconPath"
/>
<span v-else>--</span>
</template> </template>
<!-- 类型 --> <!-- 简介 -->
<template slot="leix" slot-scope="text"> <template slot="summary" slot-scope="text">
{{ text.leix }} {{ text.summary ? text.summary : "--" }}
</template> </template>
<!-- 下发设备 --> <!-- 类型 -->
<template slot="xiaf" slot-scope="text"> <template slot="appType" slot-scope="text">
{{ text.xiaf }} {{ text.appType === 1 ? "应用程序" : "URL" }}
</template> </template>
<!-- 上下架 --> <!-- 上下架 -->
<template slot="shangjia" slot-scope="text"> <template slot="shelves" slot-scope="text">
<YSwitch v-model="text.shangjia"></YSwitch> <YSwitch
checkedChildren="上架"
unCheckedChildren="下架"
v-model="text.shelves"
@change="changeShelves(text)"
></YSwitch>
</template> </template>
<!-- 操作 --> <!-- 操作 -->
<template slot="action" slot-scope="text"> <template slot="action" slot-scope="text">
<a-space size="middle"> <a-space size="middle">
<a class="primary" @click="handleEdit(text)">编辑</a> <a class="primary" @click="handleEdit(text)">编辑</a>
<a class="primary" @click="handleCheck(text.id)">查看</a> <a class="primary" @click="handleCheck(text.id)">查看</a>
<a class="delete" @click="handleDel(text.id)">删除</a> <a
class="delete"
:class="{ unDelete: text.distribute }"
@click="handleDel(text.distribute, text.id)"
>删除</a
>
</a-space> </a-space>
</template> </template>
</a-table> </a-table>
</div> </div>
<!-- 新增应用 --> <!-- 新增应用 -->
<AddApp :AddVisible.sync="AddVisible" :title="title"></AddApp> <AddApp
ref="AddApp"
@success="getAppList"
:AddVisible.sync="AddVisible"
:title="title"
></AddApp>
<!-- 选择站点 -->
<CheckSite
ref="CheckSite"
@checkSite="cloneSuccess"
:appList="selectedRowKeys"
:siteVisible.sync="siteVisible"
></CheckSite>
</div> </div>
</template> </template>
<script> <script>
import YSwitch from "../../../../components/yswitch/YSwitch.vue"; import YSwitch from "../../../../components/yswitch/YSwitch.vue";
import AddApp from "../modal/AddApp.vue"; import AddApp from "../modal/AddApp.vue";
const columns = [ import CheckSite from "../modal/CheckSite.vue";
import { getAppList, deleteApp, saveApp } from "@/services/market";
export default {
components: {
YSwitch,
AddApp,
CheckSite,
},
data() {
const columns = [
{ {
title: "序号", title: "序号",
dataIndex: "num", dataIndex: "num",
...@@ -87,192 +125,116 @@ const columns = [ ...@@ -87,192 +125,116 @@ const columns = [
}, },
{ {
title: "应用名称", title: "应用名称",
dataIndex: "name", dataIndex: "appName",
}, },
{ {
title: "应用图标", title: "应用图标",
scopedSlots: { customRender: "icon" }, scopedSlots: { customRender: "appIconPath" },
}, },
{ {
title: "当前版本", title: "当前版本",
dataIndex: "banben", customRender: (text) => {
return <span>{"v" + text.version}</span>;
},
}, },
{ {
title: "应用主题", title: "应用主题",
dataIndex: "zhuti", dataIndex: "appThemeName",
}, },
{ {
title: "应用简介", title: "应用简介",
width: "20%", width: "20%",
dataIndex: "jianjie", scopedSlots: { customRender: "summary" },
}, },
{ {
title: "应用类型", title: "应用类型",
scopedSlots: { customRender: "leix" }, scopedSlots: { customRender: "appType" },
}, },
{ {
title: "下发设备", title: "下发设备",
scopedSlots: { customRender: "xiaf" }, dataIndex: "downDevCount",
}, },
{ {
title: "上架/下架", title: "上架/下架",
scopedSlots: { customRender: "shangjia" }, scopedSlots: { customRender: "shelves" },
}, },
{ {
title: "操作", title: "操作",
width: "10%", width: "10%",
scopedSlots: { customRender: "action" }, scopedSlots: { customRender: "action" },
}, },
]; ];
export default {
components: {
YSwitch,
AddApp,
},
data() {
return { return {
api: process.env.VUE_APP_API_BASE_URL.includes("base")
? process.env.VUE_APP_API_BASE_URL.replace("base", "")
: process.env.VUE_APP_API_BASE_URL,
columns, columns,
tableData: [ tableData: [], // 表格数据
{
id: 1,
name: "法律法规",
icon: require("../../../../assets/img/logo.png"),
banben: "v1.0",
zhuti: "公共服务",
jianjie: "汇集婚姻法、劳动法、刑法等各种条例,让您能轻松获取法律知识",
leix: "应用程序",
xiaf: "自助服务",
shangjia: 1,
},
{
id: 2,
name: "法律法规",
icon: require("../../../../assets/img/logo.png"),
banben: "v1.0",
zhuti: "公共服务",
jianjie: "汇集婚姻法、劳动法、刑法等各种条例,让您能轻松获取法律知识",
leix: "应用程序",
xiaf: "自助服务",
shangjia: 1,
},
{
id: 3,
name: "法律法规",
icon: require("../../../../assets/img/logo.png"),
banben: "v1.0",
zhuti: "公共服务",
jianjie: "汇集婚姻法、劳动法、刑法等各种条例,让您能轻松获取法律知识",
leix: "应用程序",
xiaf: "自助服务",
shangjia: 1,
},
{
id: 4,
name: "法律法规",
icon: require("../../../../assets/img/logo.png"),
banben: "v1.0",
zhuti: "公共服务",
jianjie: "汇集婚姻法、劳动法、刑法等各种条例,让您能轻松获取法律知识",
leix: "应用程序",
xiaf: "自助服务",
shangjia: 1,
},
{
id: 5,
name: "法律法规",
icon: require("../../../../assets/img/logo.png"),
banben: "v1.0",
zhuti: "公共服务",
jianjie: "汇集婚姻法、劳动法、刑法等各种条例,让您能轻松获取法律知识",
leix: "应用程序",
xiaf: "自助服务",
shangjia: 1,
},
{
id: 6,
name: "法律法规",
icon: require("../../../../assets/img/logo.png"),
banben: "v1.0",
zhuti: "公共服务",
jianjie: "汇集婚姻法、劳动法、刑法等各种条例,让您能轻松获取法律知识",
leix: "应用程序",
xiaf: "自助服务",
shangjia: 1,
},
{
id: 7,
name: "法律法规",
icon: require("../../../../assets/img/logo.png"),
banben: "v1.0",
zhuti: "公共服务",
jianjie: "汇集婚姻法、劳动法、刑法等各种条例,让您能轻松获取法律知识",
leix: "应用程序",
xiaf: "自助服务",
shangjia: 1,
},
{
id: 8,
name: "法律法规",
icon: require("../../../../assets/img/logo.png"),
banben: "v1.0",
zhuti: "公共服务",
jianjie: "汇集婚姻法、劳动法、刑法等各种条例,让您能轻松获取法律知识",
leix: "应用程序",
xiaf: "自助服务",
shangjia: 1,
},
{
id: 9,
name: "法律法规",
icon: require("../../../../assets/img/logo.png"),
banben: "v1.0",
zhuti: "公共服务",
jianjie: "汇集婚姻法、劳动法、刑法等各种条例,让您能轻松获取法律知识",
leix: "应用程序",
xiaf: "自助服务",
shangjia: 1,
},
{
id: 10,
name: "法律法规",
icon: require("../../../../assets/img/logo.png"),
banben: "v1.0",
zhuti: "公共服务",
jianjie: "汇集婚姻法、劳动法、刑法等各种条例,让您能轻松获取法律知识",
leix: "应用程序",
xiaf: "自助服务",
shangjia: 1,
},
], // 表格数据
loading: false, loading: false,
searchVal: "", // 搜索 searchVal: "", // 搜索
current: 1, current: 1,
size: 10, size: 10,
total: 1000, total: 0,
pageSizeOptions: ["10", "30", "50", "100"], pageSizeOptions: ["10", "30", "50", "100"],
selectedRowKeys: [], // 表格勾选数据 selectedRowKeys: [], // 表格勾选数据
AddVisible: false, AddVisible: false,
title: "新增应用", title: "新增应用",
siteVisible: false,
}; };
}, },
created() {
this.getAppList();
},
methods: { methods: {
// 获取应用列表
async getAppList() {
this.loading = true;
let res = await getAppList({
page: this.current,
size: this.size,
appName: `%${this.searchVal}%`,
type: 1,
});
this.loading = false;
let { data, total } = res.data.data;
if (res.data.code === 1) {
if (!data.length && this.current > 1) {
this.current -= 1;
this.getAppList();
}
this.tableData = data;
this.total = total;
}
},
// 克隆
handleClone() {
if (!this.selectedRowKeys.length) {
this.$message.warning("请先勾选应用");
return;
}
this.siteVisible = true;
},
// 新增 // 新增
handleAdd() { handleAdd() {
this.title = "新增应用"; this.title = "新增应用";
this.$refs.AddApp.onAdd();
this.AddVisible = true; this.AddVisible = true;
}, },
// 搜索 // 搜索
onSearch() { onSearch() {
console.log(1); this.current = 1;
this.getAppList();
}, },
// 翻页 // 翻页
handleChange(cur) { handleChange(cur) {
this.current = cur; this.current = cur;
this.getAppList();
}, },
// 改变每页显示数量 // 改变每页显示数量
showSizeChange(current, size) { showSizeChange(current, size) {
this.current = current; this.current = current;
this.size = size; this.size = size;
this.getAppList();
}, },
// 勾选表格 // 勾选表格
onSelectChange(keys) { onSelectChange(keys) {
...@@ -280,7 +242,9 @@ export default { ...@@ -280,7 +242,9 @@ export default {
}, },
// 编辑 // 编辑
handleEdit(row) { handleEdit(row) {
console.log(row); this.title = "编辑应用";
this.$refs.AddApp.onEdit(row);
this.AddVisible = true;
}, },
// 查看 // 查看
handleCheck(id) { handleCheck(id) {
...@@ -292,7 +256,26 @@ export default { ...@@ -292,7 +256,26 @@ export default {
}); });
}, },
// 删除 // 删除
handleDel(id) { handleDel(distribute, id) {
if (distribute) {
this.$confirm({
title: "拒绝删除",
content: "该应用正在使用中。",
okText: "确定",
okType: "danger",
cancelText: "取消",
centered: true,
icon: "exclamation-circle",
maskClosable: true,
onOk() {
console.log("ok");
},
onCancel() {
console.log("Cancel");
},
});
return;
}
let _this = this; let _this = this;
_this.$confirm({ _this.$confirm({
title: "系统提示", title: "系统提示",
...@@ -304,16 +287,39 @@ export default { ...@@ -304,16 +287,39 @@ export default {
icon: "exclamation-circle", icon: "exclamation-circle",
maskClosable: true, maskClosable: true,
async onOk() { async onOk() {
console.log(id); let res = await deleteApp({ id });
let { code, msg } = res.data;
if (code === 1) {
_this.$message.success(msg);
_this.getAppList();
}
}, },
onCancel() { onCancel() {
console.log("Cancel"); console.log("Cancel");
}, },
}); });
}, },
// 克隆成功
cloneSuccess() {
this.selectedRowKeys = [];
this.getAppList();
},
// 上下架
async changeShelves(row) {
let res = await saveApp(row);
let { code, msg } = res.data;
if (code === 1) {
this.$message.success(msg);
} else {
this.getAppList();
}
},
}, },
}; };
</script> </script>
<style lang="less" scoped> <style lang="less" scoped>
.unDelete {
color: #ff4d5075 !important;
}
</style> </style>
\ No newline at end of file
...@@ -10,39 +10,46 @@ ...@@ -10,39 +10,46 @@
<div class="main"> <div class="main">
<a-form-model <a-form-model
:model="form" :model="form"
:rules="rules"
ref="form"
:label-col="labelCol" :label-col="labelCol"
:wrapper-col="wrapperCol" :wrapper-col="wrapperCol"
> >
<a-form-model-item label="应用名称" prop=""> <a-form-model-item label="应用名称" prop="appName">
<a-input v-model="form.name" placeholder="请输入应用名称" /> <a-input v-model="form.appName" placeholder="请输入应用名称" />
</a-form-model-item> </a-form-model-item>
<a-form-model-item label="应用主题" prop=""> <a-form-model-item label="应用主题" prop="appThemeName">
<a-select v-model="form.region" placeholder="请选择应用主题"> <a-input v-model="form.appThemeName" placeholder="请输入应用主题" />
<!-- <a-select v-model="form.appThemeName" placeholder="请选择应用主题">
<a-select-option value="shanghai"> Zone one </a-select-option> <a-select-option value="shanghai"> Zone one </a-select-option>
<a-select-option value="beijing"> Zone two </a-select-option> <a-select-option value="beijing"> Zone two </a-select-option>
</a-select> </a-select> -->
</a-form-model-item> </a-form-model-item>
<a-form-model-item label="应用主题" prop=""> <a-form-model-item label="应用图标" prop="appIconPath">
<a-upload <a-upload
name="file" name="file"
list-type="picture-card" list-type="picture-card"
class="avatar-uploader" class="avatar-uploader"
:show-upload-list="false" :show-upload-list="false"
action="https://www.mocky.io/v2/5cc8019d300000980a055e76" :action="api2 + 'file/commonupload'"
:before-upload="iconBeforeUpload" :before-upload="iconBeforeUpload"
@change="handleChangeIcon" @change="handleChangeIcon"
> >
<img v-if="imageUrl" :src="imageUrl" alt="avatar" /> <img
class="icon"
v-if="form.appIconPath"
:src="api + form.appIconPath"
/>
<div v-else> <div v-else>
<a-icon :type="loading ? 'loading' : 'plus'" /> <a-icon :type="loading ? 'loading' : 'plus'" />
<div class="ant-upload-text">选择图标</div> <div class="ant-upload-text">选择图标</div>
</div> </div>
</a-upload> </a-upload>
</a-form-model-item> </a-form-model-item>
<a-form-model-item label="应用简介" prop=""> <a-form-model-item label="应用简介" prop="summary">
<a-textarea <a-textarea
placeholder="请输入应用简介" placeholder="请输入应用简介"
v-model="form.name" v-model="form.summary"
allow-clear allow-clear
:autoSize="{ :autoSize="{
minRows: 4, minRows: 4,
...@@ -50,30 +57,47 @@ ...@@ -50,30 +57,47 @@
}" }"
/> />
</a-form-model-item> </a-form-model-item>
<a-form-model-item label="适用范围" prop=""> <a-form-model-item label="适用站点" prop="siteId">
<a-button type="primary"> <a-tree-select
v-model="form.siteId"
:tree-data="SiteTree"
style="width: 100%"
:dropdown-style="{ maxHeight: '400px', overflow: 'auto' }"
placeholder="请选择站点"
allow-clear
:replaceFields="replaceFields"
@change="changeSite"
>
</a-tree-select>
<!-- <a-button type="primary">
<span>选择</span> <span>选择</span>
<!-- <span>已选择(32)</span> --> <span>已选择(32)</span>
</a-button> </a-button> -->
</a-form-model-item> </a-form-model-item>
<a-form-model-item label="应用类型" prop=""> <a-form-model-item label="应用类型" prop="appType">
<a-radio-group v-model="form.resource"> <a-radio-group v-model="form.appType">
<a-radio value="1"> 应用程序 </a-radio> <a-radio :value="1"> 应用程序 </a-radio>
<a-radio value="2"> URL </a-radio> <a-radio :value="2"> URL </a-radio>
</a-radio-group> </a-radio-group>
</a-form-model-item> </a-form-model-item>
<a-form-model-item class="upload-app" label="上传应用" prop=""> <a-form-model-item
class="upload-app"
label="上传应用"
prop="filePath"
>
<a-upload <a-upload
name="file" name="file"
action="https://www.mocky.io/v2/5cc8019d300000980a055e76" :action="api2 + 'file/commonupload'"
:multiple="false" :multiple="false"
:file-list="fileList" :file-list="fileList"
@change="handleChangeFile" @change="handleChangeFile"
> >
<a-button> <a-icon type="upload" /> 选择文件 </a-button> <a-button type="primary">
<a-icon type="upload" /> 选择文件
</a-button>
</a-upload> </a-upload>
</a-form-model-item> </a-form-model-item>
<a-form-model-item label="更新说明" prop=""> <!-- <a-form-model-item label="更新说明" prop="">
<a-textarea <a-textarea
placeholder="请输入应用简介" placeholder="请输入应用简介"
v-model="form.name" v-model="form.name"
...@@ -83,9 +107,13 @@ ...@@ -83,9 +107,13 @@
maxRows: 4, maxRows: 4,
}" }"
/> />
</a-form-model-item> </a-form-model-item> -->
<a-form-model-item label="更新数据" prop=""> <a-form-model-item label="更新数据" prop="dataUpdate">
<YSwitch v-model="form.name"></YSwitch> <YSwitch
checkedChildren="有"
unCheckedChildren="无"
v-model="form.dataUpdate"
></YSwitch>
</a-form-model-item> </a-form-model-item>
</a-form-model> </a-form-model>
</div> </div>
...@@ -112,6 +140,8 @@ ...@@ -112,6 +140,8 @@
<script> <script>
import YSwitch from "../../../../components/yswitch/YSwitch.vue"; import YSwitch from "../../../../components/yswitch/YSwitch.vue";
import { saveApp } from "@/services/market";
import { mapGetters } from "vuex";
export default { export default {
components: { components: {
YSwitch, YSwitch,
...@@ -130,6 +160,10 @@ export default { ...@@ -130,6 +160,10 @@ export default {
}, },
data() { data() {
return { return {
api: process.env.VUE_APP_API_BASE_URL.includes("base")
? process.env.VUE_APP_API_BASE_URL.replace("base", "")
: process.env.VUE_APP_API_BASE_URL,
api2: process.env.VUE_APP_API_BASE_URL + "/",
labelCol: { labelCol: {
span: 3, span: 3,
}, },
...@@ -137,8 +171,49 @@ export default { ...@@ -137,8 +171,49 @@ export default {
span: 21, span: 21,
}, },
loading: false, loading: false,
imageUrl: "", form: {
form: {}, siteId: undefined, // 站点id
siteName: "", // 站点名称
appName: "", // 应用名称
appIconPath: "", // 应用图标
appThemeName: "", // 应用主题名称
type: 1, // 类型(1.终端应用,2.移动端应用)
appType: "", // 类型(1.应用程序,2.url)
shelves: 0,
fileName: "", // 文件名称
filePath: "", // 文件相对路径地址
summary: "", // 简介
dataUpdate: 0, // 是否数据更新(0.否,1.是)
},
replaceFields: {
title: "label",
key: "id",
value: "id",
},
rules: {
siteId: [{ required: true, message: "请选择站点", trigger: "change" }],
appName: [
{ required: true, message: "请输入应用名称", trigger: "blur" },
],
appIconPath: [
{ required: true, message: "请上传应用图标", trigger: "change" },
],
appType: [
{ required: true, message: "请选择应用类型", trigger: "change" },
],
appThemeName: [
{ required: true, message: "请输入主题名称", trigger: "blur" },
],
summary: [
{ required: true, message: "请输入应用简介", trigger: "blur" },
],
filePath: [
{ required: true, message: "请上传应用", trigger: "change" },
],
dataUpdate: [
{ required: true, message: "请选择是否有更新", trigger: "change" },
],
},
fileList: [], fileList: [],
}; };
}, },
...@@ -151,15 +226,29 @@ export default { ...@@ -151,15 +226,29 @@ export default {
this.$emit("update:AddVisible", val); this.$emit("update:AddVisible", val);
}, },
}, },
...mapGetters("site", ["SiteTree"]),
}, },
created() {},
methods: { methods: {
// 关闭 // 关闭
onClose() { onClose() {
this.$refs.form.resetFields();
this.fileList = [];
this.Visible = false; this.Visible = false;
}, },
// 提交 // 提交
onSubmit() { onSubmit() {
console.log(1); this.$refs.form.validate(async (valid) => {
if (valid) {
let res = await saveApp(this.form);
let { code, msg } = res.data;
if (code === 1) {
this.$message.success(msg);
this.$emit("success");
this.onClose();
}
}
});
}, },
// 图标删除之前 // 图标删除之前
iconBeforeUpload(file) { iconBeforeUpload(file) {
...@@ -181,6 +270,8 @@ export default { ...@@ -181,6 +270,8 @@ export default {
return; return;
} }
if (info.file.status === "done") { if (info.file.status === "done") {
console.log(info);
this.form.appIconPath = info.file.response.url;
this.loading = false; this.loading = false;
} }
}, },
...@@ -195,6 +286,35 @@ export default { ...@@ -195,6 +286,35 @@ export default {
return file; return file;
}); });
this.fileList = fileList; this.fileList = fileList;
if (this.fileList.length) {
this.form.fileName = this.fileList[0].name;
this.form.filePath = this.fileList[0].url;
} else {
this.form.filePath = "";
this.form.fileName = "";
}
},
// 新增
onAdd() {
Object.assign(this.form, this.$options.data().form);
this.form.id && this.$delete(this.form, "id");
},
// 编辑
onEdit(data) {
console.log(data);
this.form = { ...data };
this.fileList = [
{
uid: "-1",
name: this.form.fileName,
status: "done",
url: this.form.filePath,
},
];
},
// 选中站点
changeSite(value, label) {
this.form.siteName = label[0];
}, },
}, },
}; };
...@@ -223,5 +343,9 @@ export default { ...@@ -223,5 +343,9 @@ export default {
padding: 24px; padding: 24px;
flex: 1; flex: 1;
overflow-y: auto; overflow-y: auto;
.icon {
width: 100%;
height: 100%;
}
} }
</style> </style>
\ No newline at end of file
<template>
<div class="add-app">
<a-drawer
width="60%"
:maskClosable="false"
:title="title"
:visible="Visible"
@close="onClose"
>
<div class="main">
<a-form-model
:model="form"
ref="form"
:label-col="labelCol"
:wrapper-col="wrapperCol"
>
<a-form-model-item
v-for="(v, i) in form.appInfoFieldList"
:key="v.fieldCode"
:label="v.fieldName"
class="content"
:prop="`appInfoFieldList.${i}.fieldValue`"
:rules="{
required: true,
message: `${v.fieldName}不能为空`,
trigger:
v.fieldType == 'date' || v.fieldType == 'text'
? 'change'
: 'blur',
}"
>
<a-input
v-if="v.fieldType == 'input'"
v-model="v.fieldValue"
:placeholder="`请输入${v.fieldName}`"
/>
<a-date-picker
v-else-if="v.fieldType == 'date'"
v-model="v.fieldValue"
:placeholder="`请选择${v.fieldName}`"
valueFormat="YYYY-MM-DD"
/>
<a-textarea
v-else-if="v.fieldType == 'textarea'"
v-model="v.fieldValue"
:placeholder="`请输入${v.fieldName}`"
allow-clear
/>
<div v-else-if="v.fieldType == 'text'" class="content-box">
<YQuillEditor v-model="v.fieldValue" height="auto"></YQuillEditor>
</div>
</a-form-model-item>
</a-form-model>
</div>
<!-- 底部按钮 -->
<div
:style="{
width: '100%',
height: '54px',
borderTop: '1px solid #e8e8e8',
padding: '10px 16px',
textAlign: 'left',
background: '#fff',
borderRadius: '0 0 4px 4px',
}"
>
<a-space size="middle">
<a-button @click="onClose"> 取消 </a-button>
<a-button type="primary" @click="onSubmit"> 保存 </a-button>
</a-space>
</div>
</a-drawer>
</div>
</template>
<script>
import YQuillEditor from "@/components/YQuillEditor.vue";
import { saveDataset } from "@/services/market";
export default {
components: {
YQuillEditor,
},
props: {
title: {
type: String,
required: true,
default: "",
},
AddVisible: {
type: Boolean,
required: true,
default: false,
},
},
data() {
return {
labelCol: {
span: 2,
},
wrapperCol: {
span: 22,
},
form: {
appId: "",
appInfoFieldList: [],
},
};
},
computed: {
Visible: {
get() {
return this.AddVisible;
},
set(val) {
this.$emit("update:AddVisible", val);
},
},
},
methods: {
// 关闭
onClose() {
this.$refs.form.resetFields();
this.Visible = false;
},
// 提交
async onSubmit() {
this.$refs.form.validate(async (valid) => {
if (valid) {
let res = await saveDataset(this.form);
let { code, msg } = res.data;
if (code === 1) {
this.$message.success(msg);
this.$emit("addSuccess");
this.onClose();
}
} else {
this.$message.warning("请完善表单信息");
}
});
},
// 新增
onAdd(appTemplate) {
Object.assign(this.form, this.$options.data().form);
this.form.id && this.$delete(this.form, "id");
this.form.appInfoFieldList = appTemplate.map((v) => {
if (v.id) {
delete v.id;
}
v.fieldValue = "";
return v;
});
this.form.appId = this.$route.query.id;
},
// 编辑
onEdit(data) {
this.form = { ...data };
},
},
};
</script>
<style lang="less" scoped>
/deep/.ant-form-item {
display: flex;
align-items: center;
}
/deep/.ant-drawer-body {
height: calc(100vh - 55px);
padding: 0px !important;
display: flex;
flex-direction: column;
}
.main {
height: 1px;
padding: 24px;
flex: 1;
overflow-y: auto;
&::-webkit-scrollbar {
width: 12px;
overflow-y: auto;
}
&::-webkit-scrollbar-thumb {
border-radius: 6px;
background-color: rgba(144, 147, 153, 0.5);
}
&::-webkit-scrollbar-track {
border-radius: 6px;
background: #fff;
}
}
.content {
align-items: flex-start !important;
.content-box {
min-height: 500px;
display: flex;
}
}
</style>
\ No newline at end of file
<template>
<div>
<a-modal v-model="Visible" title="新增数据字段">
<a-form-model
:model="form"
ref="form"
:rules="rules"
:label-col="{ span: 4 }"
:wrapper-col="{ span: 20 }"
>
<a-form-model-item label="字段名称" prop="fieldName">
<a-input v-model="form.fieldName" placeholder="请输入字段名称" />
</a-form-model-item>
<a-form-model-item label="字段编码" prop="fieldCode">
<a-input v-model="form.fieldCode" placeholder="请输入字段编码" />
</a-form-model-item>
<a-form-model-item label="字段类型" prop="fieldType">
<a-select v-model="form.fieldType" placeholder="请选择字段类型">
<a-select-option
v-for="v in fieldTypeItem"
:key="v.value"
:value="v.value"
>
{{ v.label }}
</a-select-option>
</a-select>
</a-form-model-item>
<a-form-model-item label="数据类型" prop="dataType">
<a-radio-group v-model="form.dataType">
<a-radio value="number"> 数字 </a-radio>
<a-radio value="string"> 字符串 </a-radio>
</a-radio-group>
</a-form-model-item>
<a-form-model-item label="数据长度" prop="fieldLen">
<a-input-number v-model="form.fieldLen" :min="1" />
</a-form-model-item>
<a-form-model-item label="允许为空" prop="fieldNull">
<a-radio-group v-model="form.fieldNull">
<a-radio :value="0"></a-radio>
<a-radio :value="1"></a-radio>
</a-radio-group>
</a-form-model-item>
<a-form-model-item label="列表显示" prop="isList">
<a-radio-group v-model="form.isList">
<a-radio :value="0"></a-radio>
<a-radio :value="1"></a-radio>
</a-radio-group>
</a-form-model-item>
<a-form-model-item label="排序" prop="fieldOrderNo">
<a-input-number v-model="form.fieldOrderNo" :min="0" />
</a-form-model-item>
<a-form-model-item label="备注" prop="remark">
<a-textarea
:autoSize="{ minRows: 3, maxRows: 3 }"
v-model="form.remark"
placeholder="请输入备注"
allow-clear
/>
</a-form-model-item>
</a-form-model>
<div slot="footer">
<a-button @click="handleCancel">取消</a-button>
<a-button type="primary" @click="handleOk">确定</a-button>
</div>
</a-modal>
</div>
</template>
<script>
import { saveTemplete } from "@/services/market";
const fieldTypeItem = [
{
value: "input",
label: "单行输入框",
},
{
value: "textarea",
label: "多行输入框",
},
{
value: "date",
label: "日期选择框",
},
{
value: "text",
label: "富文本",
},
];
export default {
props: {
fieldVisible: {
required: true,
type: Boolean,
default: false,
},
},
data() {
return {
fieldTypeItem,
form: {
appId: "", // 应用id
fieldCode: "", // 字段编码
fieldName: "", // 字段名称
fieldType: undefined, //字段类型(input.单行输入框,textarea.多行输入框,SELECT.下拉选项框,date.日期选择框)
dataType: "", // 数据类型(number.数字,string.字符串)
fieldLen: 128, //数据长度,默认128
fieldNull: "", //是否允许为空,(0.否,1.是)
isList: "", //字段是否列表显示(0.否,1.是)
fieldOrderNo: "", // 排序号
remark: "", //
},
rules: {
fieldCode: [
{ required: true, message: "请输入字段编码", trigger: "blur" },
],
fieldName: [
{ required: true, message: "请输入字段名称", trigger: "blur" },
],
fieldTyp: [
{ required: true, message: "请选择字段类型", trigger: "change" },
],
fieldNull: [
{ required: true, message: "请选择是否允许为空", trigger: "change" },
],
isList: [
{ required: true, message: "请选择是否列表显示", trigger: "change" },
],
},
};
},
computed: {
Visible: {
get() {
return this.fieldVisible;
},
set(val) {
this.$emit("update:fieldVisible", val);
},
},
},
methods: {
handleOk() {
this.$refs.form.validate(async (valid) => {
if (valid) {
let res = await saveTemplete(this.form);
let { code, msg } = res.data;
if (code === 1) {
this.$message.success(msg);
this.$emit("addSuccess");
this.handleCancel();
}
}
});
},
handleCancel() {
this.$refs.form.resetFields();
this.Visible = false;
},
// 新增
onAdd() {
Object.assign(this.form, this.$options.data().form);
this.form.appId = this.$route.query.id;
this.form.id && this.$delete(this.form, "id");
console.log(this.form);
},
// 编辑
onEdit(data) {
this.form = { ...data };
},
},
};
</script>
<style lang="less" scoped>
</style>
\ No newline at end of file
<template>
<div>
<a-modal v-model="Visible" title="适用范围">
<a-tree-select
v-model="siteIdList"
:tree-data="SiteTree"
style="width: 100%"
:dropdown-style="{ maxHeight: '400px', overflow: 'auto' }"
placeholder="请选择站点"
allow-clear
treeCheckable
:replaceFields="replaceFields"
:treeCheckStrictly="true"
>
</a-tree-select>
<div slot="footer">
<a-space size="middle">
<div class="tips">
已选择<span class="primary">{{ siteIdList.length }}</span
>个站点
</div>
<a-button @click="handleCancel">取消</a-button>
<a-button type="primary" @click="handleOk">确定</a-button>
</a-space>
</div>
</a-modal>
</div>
</template>
<script>
import { mapGetters } from "vuex";
import { cloneApp } from "@/services/market";
export default {
props: {
siteVisible: {
required: true,
type: Boolean,
default: false,
},
appList: {
required: true,
type: Array,
default: () => {
return [];
},
},
},
data() {
return {
siteIdList: [], // 站点id
replaceFields: {
title: "label",
key: "id",
value: "id",
},
};
},
computed: {
Visible: {
get() {
return this.siteVisible;
},
set(val) {
this.$emit("update:siteVisible", val);
},
},
...mapGetters("site", ["SiteTree"]),
},
methods: {
async handleOk() {
if (!this.siteIdList) {
this.$message.warning("请先选择站点");
return;
}
let res = await cloneApp({
siteIdList: this.siteIdList.map((v) => v.value),
idList: this.appList,
});
let { code, msg } = res.data;
if (code === 1) {
this.$message.success(msg);
this.$emit("checkSite");
this.handleCancel();
}
},
// 关闭
handleCancel() {
this.siteIdList = [];
this.Visible = false;
},
// 获取站点回显
getSiteList(siteList) {
let arr = siteList.map((v) => {
return {
value: v,
};
});
this.siteIdList = arr;
},
},
};
</script>
<style lang="less" scoped>
.tips {
font-weight: 600 !important;
}
</style>
\ No newline at end of file
...@@ -407,7 +407,6 @@ export default { ...@@ -407,7 +407,6 @@ export default {
getSiteInfo(siteId) { getSiteInfo(siteId) {
Object.assign(this.$data, this.$options.data()); //获取data源对象,覆盖当前data对象状态 Object.assign(this.$data, this.$options.data()); //获取data源对象,覆盖当前data对象状态
this.siteId = siteId; this.siteId = siteId;
console.log(this.siteId);
this.getSiteBusinessData({ siteId }); this.getSiteBusinessData({ siteId });
this.getMatterSiteData({ siteId }); this.getMatterSiteData({ siteId });
this.getBusinessMatterData({ siteId }); this.getBusinessMatterData({ siteId });
......
...@@ -272,4 +272,42 @@ module.exports = { ...@@ -272,4 +272,42 @@ module.exports = {
save: `${BASE_URL}/skin/field/save`, save: `${BASE_URL}/skin/field/save`,
delete: `${BASE_URL}/skin/field/delete`, delete: `${BASE_URL}/skin/field/delete`,
}, },
// 应用集市
App: {
list: `${BASE_URL}/app/list`,
info: `${BASE_URL}/app/info`,
save: `${BASE_URL}/app/save`,
delete: `${BASE_URL}/app/delete`,
distribute: `${BASE_URL}/app/appDistribute`,
clone: `${BASE_URL}/app/cloneAppsBySites`,
},
// 应用数据
dataset: {
list: `${BASE_URL}/app/dataset/list`,
info: `${BASE_URL}/app/dataset/info`,
save: `${BASE_URL}/app/dataset/save`,
delete: `${BASE_URL}/app/dataset/delete`,
},
// 应用信息字段配置
appField: {
list: `${BASE_URL}/app/info/field/list`,
info: `${BASE_URL}/app/info/field/info`,
save: `${BASE_URL}/app/info/field/save`,
delete: `${BASE_URL}/app/info/field/delete`,
},
// 应用信息模板
templete: {
list: `${BASE_URL}/app/info/templete/field/list`,
info: `${BASE_URL}/app/info/templete/field/info`,
save: `${BASE_URL}/app/info/templete/field/save`,
delete: `${BASE_URL}/app/info/templete/field/delete`,
},
// 应用历史版本
version: {
list: `${BASE_URL}/app/version/list`,
info: `${BASE_URL}/app/version/info`,
delete: `${BASE_URL}/app/version/delete`,
used: `${BASE_URL}/app/version/used`,
preview: `${BASE_URL}/app/version/preview`,
},
}; };
import {
App,
dataset,
appField,
templete,
version,
} from "@/services/basicsetApi";
import { request, METHOD } from "@/utils/request";
/**
* 应用
*/
// 获取应用列表
export async function getAppList(data) {
return request(App.list, METHOD.POST, data);
}
// 查看应用
export async function getAppInfo(data) {
return request(App.info, METHOD.GET, data);
}
// 新增,修改应用
export async function saveApp(data) {
return request(App.save, METHOD.POST, data);
}
// 删除应用
export async function deleteApp(data) {
return request(App.delete, METHOD.GET, data);
}
// 克隆应用
export async function cloneApp(data) {
return request(App.clone, METHOD.POST, data);
}
// 部署应用
export async function deployApp(data) {
return request(App.distribute, METHOD.POST, data);
}
/**
* 应用数据
*/
// 获取数据列表
export async function getDatasetList(data) {
return request(dataset.list, METHOD.POST, data);
}
// 查看数据
export async function getDatasetInfo(data) {
return request(dataset.info, METHOD.GET, data);
}
// 新增,修改数据
export async function saveDataset(data) {
return request(dataset.save, METHOD.POST, data);
}
// 删除数据
export async function deleteDataset(data) {
return request(dataset.delete, METHOD.GET, data);
}
/**
* 应用信息字段配置
*/
// 获取信息字段列表
export async function getAppFieldList(data) {
return request(appField.list, METHOD.POST, data);
}
// 查看信息字段
export async function getAppFieldInfo(data) {
return request(appField.info, METHOD.GET, data);
}
// 新增,修改信息字段
export async function saveAppField(data) {
return request(appField.save, METHOD.POST, data);
}
// 删除信息字段
export async function deleteAppField(data) {
return request(appField.delete, METHOD.GET, data);
}
/**
* 应用信息模板
*/
// 获取应用信息模板列表
export async function getTempleteList(data) {
return request(templete.list, METHOD.POST, data);
}
// 查看应用信息模板
export async function getTempleteInfo(data) {
return request(templete.info, METHOD.GET, data);
}
// 新增,修改应用信息模板
export async function saveTemplete(data) {
return request(templete.save, METHOD.POST, data);
}
// 删除应用信息模板
export async function deleteTemplete(data) {
return request(templete.delete, METHOD.GET, data);
}
/**
* 应用历史版本
*/
// 获取应用历史版本列表
export async function getVersionList(data) {
return request(version.list, METHOD.POST, data);
}
// 查看应用历史版本
export async function getVersionInfo(data) {
return request(version.info, METHOD.GET, data);
}
// 新增,修改应用历史版本
export async function saveVersion(data) {
return request(version.save, METHOD.POST, data);
}
// 删除应用历史版本
export async function deleteVersion(data) {
return request(version.delete, METHOD.GET, data);
}
// 使用版本
export async function usedVersion(data) {
return request(version.used, METHOD.GET, data);
}
// 预览版本
export async function previewVersion(data) {
return request(version.preview, METHOD.GET, data);
}
export default { export default {
namespaced: true, namespaced: true,
state: { state: {
siteId:'', // 站点id siteId: "", // 站点id
imageResolution:[], // 皮肤设置分辨率 imageResolution: [], // 皮肤设置分辨率
SiteTree: [], // 站点树
appTemplate: [], // 应用模板属性
}, },
getters: {
mutations:{ SiteTree(state) {
SET_SITE_ID(state,newId){ return state.SiteTree;
state.siteId = newId
}, },
SET_imageResolution(state,imageResolution){ appTemplate(state) {
state.imageResolution = imageResolution return state.appTemplate;
},
},
mutations: {
SET_appTemplate(state, appTemplate) {
state.appTemplate = appTemplate;
},
SET_SITE_ID(state, newId) {
state.siteId = newId;
},
SET_SiteTree(state, SiteTree) {
state.SiteTree = SiteTree;
},
SET_imageResolution(state, imageResolution) {
state.imageResolution = imageResolution;
}, // 皮肤设置分辨率字典 }, // 皮肤设置分辨率字典
}, },
};
}
...@@ -68,6 +68,13 @@ module.exports = { ...@@ -68,6 +68,13 @@ module.exports = {
resolveCss, resolveCss,
}) })
); );
config.plugins.push(
// 控制富文本图片大小
new webpack.ProvidePlugin({
"window.Quill": "quill/dist/quill.js",
Quill: "quill/dist/quill.js",
})
);
// Ignore all locale files of moment.js // Ignore all locale files of moment.js
// config.plugins.push(new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/)) // config.plugins.push(new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/))
// 生产环境下将资源压缩成gzip格式 // 生产环境下将资源压缩成gzip格式
......
...@@ -8999,7 +8999,16 @@ quill-delta@^3.6.2: ...@@ -8999,7 +8999,16 @@ quill-delta@^3.6.2:
extend "^3.0.2" extend "^3.0.2"
fast-diff "1.1.2" fast-diff "1.1.2"
quill@^1.3.4: quill-image-resize-module@^3.0.0:
version "3.0.0"
resolved "https://registry.npmmirror.com/quill-image-resize-module/-/quill-image-resize-module-3.0.0.tgz#0fd93746a837336d95b2f536140416a623c71771"
integrity sha512-1TZBnUxU/WIx5dPyVjQ9yN7C6mLZSp04HyWBEMqT320DIq4MW4JgzlOPDZX5ZpBM3bU6sacU4kTLUc8VgYQZYw==
dependencies:
lodash "^4.17.4"
quill "^1.2.2"
raw-loader "^0.5.1"
quill@^1.2.2, quill@^1.3.4:
version "1.3.7" version "1.3.7"
resolved "https://registry.npmjs.org/quill/-/quill-1.3.7.tgz" resolved "https://registry.npmjs.org/quill/-/quill-1.3.7.tgz"
integrity sha512-hG/DVzh/TiknWtE6QmWAF/pxoZKYxfe3J/d/+ShUWkDvvkZQVTPeVmUJVu1uE6DDooC4fWTiCLh84ul89oNz5g== integrity sha512-hG/DVzh/TiknWtE6QmWAF/pxoZKYxfe3J/d/+ShUWkDvvkZQVTPeVmUJVu1uE6DDooC4fWTiCLh84ul89oNz5g==
...@@ -9048,9 +9057,9 @@ raw-body@2.4.0: ...@@ -9048,9 +9057,9 @@ raw-body@2.4.0:
iconv-lite "0.4.24" iconv-lite "0.4.24"
unpipe "1.0.0" unpipe "1.0.0"
raw-loader@~0.5.1: raw-loader@^0.5.1, raw-loader@~0.5.1:
version "0.5.1" version "0.5.1"
resolved "https://registry.npmmirror.com/raw-loader/-/raw-loader-0.5.1.tgz" resolved "https://registry.npmmirror.com/raw-loader/-/raw-loader-0.5.1.tgz#0c3d0beaed8a01c966d9787bf778281252a979aa"
integrity sha512-sf7oGoLuaYAScB4VGr0tzetsYlS8EJH6qnTCfQ/WVEa89hALQ4RQfCKt5xCyPQKPDUbVUAIP1QsxAwfAjlDp7Q== integrity sha512-sf7oGoLuaYAScB4VGr0tzetsYlS8EJH6qnTCfQ/WVEa89hALQ4RQfCKt5xCyPQKPDUbVUAIP1QsxAwfAjlDp7Q==
rc@^1.2.8: rc@^1.2.8:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment