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
This diff is collapsed.
...@@ -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
...@@ -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