-
+
+
+
+
+
+
+
+ {{btnText}}
+
+
+
+
+
+ {{row.filename}}
+
+
+
+
+
+
+
+
+
+
+ 更多
+
+
+
+
+
+ 下载
+
+
+
+
+
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/FormDesigner/src/components/FormDesigner/CusDialog.vue b/packages/FormDesigner/src/components/FormDesigner/CusDialog.vue
deleted file mode 100644
index 7b4b227..0000000
--- a/packages/FormDesigner/src/components/FormDesigner/CusDialog.vue
+++ /dev/null
@@ -1,132 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/packages/FormDesigner/src/components/FormDesigner/GenerateForm.vue b/packages/FormDesigner/src/components/FormDesigner/GenerateForm.vue
deleted file mode 100644
index 6e6a2bf..0000000
--- a/packages/FormDesigner/src/components/FormDesigner/GenerateForm.vue
+++ /dev/null
@@ -1,354 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/packages/FormDesigner/src/components/FormDesigner/generateCode.js b/packages/FormDesigner/src/components/FormDesigner/generateCode.js
deleted file mode 100644
index 7a59dd6..0000000
--- a/packages/FormDesigner/src/components/FormDesigner/generateCode.js
+++ /dev/null
@@ -1,107 +0,0 @@
-function findRemoteFunc(list, funcList, tokenFuncList, blankList) {
- for (let i = 0; i < list.length; i += 1) {
- if (list[i].type === 'grid') {
- list[i].columns.forEach((item) => {
- findRemoteFunc(item.list, funcList, tokenFuncList, blankList);
- });
- } else if (list[i].type === 'blank') {
- if (list[i].model) {
- blankList.push({
- name: list[i].model,
- label: list[i].name,
- });
- }
- } else if (list[i].options.remote && list[i].options.remoteFunc) {
- funcList.push({
- func: list[i].options.remoteFunc,
- label: list[i].name,
- model: list[i].model,
- });
- }
- }
-}
-
-export default function (data) {
- const funcList = [];
-
- const tokenFuncList = [];
-
- const blankList = [];
-
- findRemoteFunc(JSON.parse(data).list, funcList, tokenFuncList, blankList);
-
- let funcTemplate = '';
-
- let blankTemplate = '';
-
- for (let i = 0; i < funcList.length; i += 1) {
- funcTemplate += `
- ${funcList[i].func} (resolve) {
- // ${funcList[i].label} ${funcList[i].model}
- // 获取到远端数据后执行回调函数
- // resolve(data)
- },
- `;
- }
-
- for (let i = 0; i < tokenFuncList.length; i += 1) {
- funcTemplate += `
- ${tokenFuncList[i].func} (resolve) {
- // ${tokenFuncList[i].label} ${tokenFuncList[i].model}
- // 获取到token数据后执行回调函数
- // resolve(token)
- },
- `;
- }
-
- for (let i = 0; i < blankList.length; i += 1) {
- blankTemplate += `
-
-
-
-
- `;
- }
-
- return `
-
-
-
-
-
-
-
-
-
- ${blankTemplate}
-
- 提交
-
-
-
-
-
-
- `;
-}
diff --git a/packages/FormDesigner/src/components/Tinymce/components/editorImage.vue b/packages/FormDesigner/src/components/Tinymce/components/editorImage.vue
new file mode 100644
index 0000000..752c1de
--- /dev/null
+++ b/packages/FormDesigner/src/components/Tinymce/components/editorImage.vue
@@ -0,0 +1,115 @@
+
+
+ 上传图片
+
+
+
+ 点击上传
+
+ 取 消
+ 确 定
+
+
+
+
+
+
+
diff --git a/packages/FormDesigner/src/components/Tinymce/index.vue b/packages/FormDesigner/src/components/Tinymce/index.vue
new file mode 100644
index 0000000..3b911db
--- /dev/null
+++ b/packages/FormDesigner/src/components/Tinymce/index.vue
@@ -0,0 +1,222 @@
+
+
+
+
+
+
+
+
diff --git a/packages/FormDesigner/src/components/Tinymce/plugins.js b/packages/FormDesigner/src/components/Tinymce/plugins.js
new file mode 100644
index 0000000..089d683
--- /dev/null
+++ b/packages/FormDesigner/src/components/Tinymce/plugins.js
@@ -0,0 +1,8 @@
+// Any plugins you want to use has to be imported
+// Detail plugins list see https://www.tinymce.com/docs/plugins/
+// Custom builds see https://www.tinymce.com/download/custom-builds/
+
+export default [
+ // eslint-disable-next-line max-len
+ 'advlist anchor autolink autosave code codesample colorpicker colorpicker contextmenu directionality emoticons fullscreen hr image imagetools insertdatetime link lists nonbreaking noneditable pagebreak paste preview print save searchreplace spellchecker tabfocus table template textcolor textpattern visualblocks visualchars wordcount',
+];
diff --git a/packages/FormDesigner/src/components/Tinymce/toolbar.js b/packages/FormDesigner/src/components/Tinymce/toolbar.js
new file mode 100644
index 0000000..e1521b9
--- /dev/null
+++ b/packages/FormDesigner/src/components/Tinymce/toolbar.js
@@ -0,0 +1,7 @@
+// Here is a list of the toolbar
+// Detail list see https://www.tinymce.com/docs/advanced/editor-control-identifiers/#toolbarcontrols
+
+// eslint-disable-next-line max-len
+const toolbar = ['searchreplace bold italic underline strikethrough alignleft aligncenter alignright outdent indent blockquote undo redo removeformat subscript superscript code codesample', 'hr bullist numlist link image charmap preview anchor pagebreak insertdatetime table forecolor backcolor fullscreen'];
+
+export default toolbar;
diff --git a/packages/FormDesigner/src/components/FormDesigner/componentsConfig.js b/packages/FormDesigner/src/componentsConfig.ts
similarity index 96%
rename from packages/FormDesigner/src/components/FormDesigner/componentsConfig.js
rename to packages/FormDesigner/src/componentsConfig.ts
index cda394b..affc9b2 100644
--- a/packages/FormDesigner/src/components/FormDesigner/componentsConfig.js
+++ b/packages/FormDesigner/src/componentsConfig.ts
@@ -144,12 +144,12 @@ export const basicComponents = [
},
{
type: 'date',
- name: '日期时间选择器',
+ name: '日期选择器',
labelWidth: '',
hidden: false,
- icon: 'clock',
+ icon: 'regular/calendar-alt',
options: {
- defaultValue: '',
+ defaultValue: false,
readonly: false,
disabled: false,
editable: true,
@@ -157,8 +157,8 @@ export const basicComponents = [
placeholder: '',
startPlaceholder: '',
endPlaceholder: '',
- type: 'datetime',
- format: 'yyyy-MM-dd hh:mm:ss',
+ type: 'date',
+ format: 'yyyy-MM-dd',
timestamp: false,
required: false,
width: '',
@@ -166,12 +166,12 @@ export const basicComponents = [
},
{
type: 'date',
- name: '日期选择器',
+ name: '时间选择器',
labelWidth: '',
hidden: false,
- icon: 'regular/calendar-alt',
+ icon: 'clock',
options: {
- defaultValue: false,
+ defaultValue: '',
readonly: false,
disabled: false,
editable: true,
@@ -179,8 +179,8 @@ export const basicComponents = [
placeholder: '',
startPlaceholder: '',
endPlaceholder: '',
- type: 'date',
- format: 'yyyy-MM-dd',
+ type: 'datetime',
+ format: 'yyyy-MM-dd hh:mm:ss',
timestamp: false,
required: false,
width: '',
@@ -292,15 +292,14 @@ export const advanceComponents = [
},
{
type: 'upload',
- name: '文件上传',
+ name: '附件',
icon: 'upload',
options: {
- uploadParams: {
- Param: {
- MasterID: '',
- },
- IsDetail: false,
- },
+ resourceId: 'id',
+ fileType: '',
+ defaultValue: '',
+ remoteFunc: '',
+ readonly: false,
},
},
{
@@ -310,6 +309,7 @@ export const advanceComponents = [
options: {
defaultValue: [],
width: '',
+ separator: '/',
placeholder: '',
multiple: false,
disabled: false,
@@ -340,6 +340,7 @@ export const advanceComponents = [
actionColumnBtnDel: true,
conditionTitle: false,
btnExport: false,
+ btnImport: false,
},
tableParams: '',
prefill: '',
@@ -363,6 +364,7 @@ export const advanceComponents = [
maxHeight: 300,
multiple: false,
remote: 'custom',
+ appendToBody: false,
props: {
value: 'value',
label: 'label',
@@ -382,14 +384,6 @@ export const advanceComponents = [
remoteOptions: [],
},
},
- {
- type: 'comment',
- name: '意见框',
- icon: 'comment',
- options: {
- defaultType: 'String',
- },
- },
{
type: 'richtext',
name: '富文本',
diff --git a/packages/FormDesigner/src/element.js b/packages/FormDesigner/src/element.ts
similarity index 100%
rename from packages/FormDesigner/src/element.js
rename to packages/FormDesigner/src/element.ts
diff --git a/packages/FormDesigner/src/components/FormDesigner/form_empty.png b/packages/FormDesigner/src/form_empty.png
similarity index 100%
rename from packages/FormDesigner/src/components/FormDesigner/form_empty.png
rename to packages/FormDesigner/src/form_empty.png
diff --git a/packages/FormDesigner/src/logo.png b/packages/FormDesigner/src/logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..9ce399cdaa2c3a6823fad2ebce4014bd5b7ddc95
GIT binary patch
literal 6839
zcmbW5cQjn>+wVv3L>b*ELv*5yP9!n}VWLDY5fLqjGFr$GEm5N;N{G=$88R5Xckzhc
zi6BI0h&I~md4BKvTjzbxI%}PCuC=~<|8eg>_UGRBzRLG{`g#r!4j?BbB_kyvCnF=H
zpdhEDW}=~{qM~MFV5DQ>V&?{Nv2$|r@Jk5t@QHyrIfdkf#qLPS%F1#JDyk|-t4PSm
zN)u2}P*77*v(nJ8O7n8^O8-B{bsK=59MA{oBO>4f5YiJ6(Gy&E5g-8o0uq9M0`Q+f
zKuAPPLP|zXK}mHBKuADDL`Y0TLPAV@^JMVN8i1Idgn?J;9x0=N9T}e|lXPfeE;;x<
zrX6TFvd=H`%
c6Imk
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
C3HB!d
literal 0
HcmV?d00001
diff --git a/packages/FormDesigner/src/components/FormDesigner/styles/cover.scss b/packages/FormDesigner/src/styles/cover.scss
similarity index 81%
rename from packages/FormDesigner/src/components/FormDesigner/styles/cover.scss
rename to packages/FormDesigner/src/styles/cover.scss
index dde7561..7b97227 100644
--- a/packages/FormDesigner/src/components/FormDesigner/styles/cover.scss
+++ b/packages/FormDesigner/src/styles/cover.scss
@@ -11,7 +11,4 @@
}
.el-checkbox{
margin-right: 30px;
-}
-.el-form-item__content{
- text-align: left;
}
\ No newline at end of file
diff --git a/packages/FormDesigner/src/components/FormDesigner/styles/index.scss b/packages/FormDesigner/src/styles/index.scss
similarity index 98%
rename from packages/FormDesigner/src/components/FormDesigner/styles/index.scss
rename to packages/FormDesigner/src/styles/index.scss
index 14bc0fb..1d5af40 100644
--- a/packages/FormDesigner/src/components/FormDesigner/styles/index.scss
+++ b/packages/FormDesigner/src/styles/index.scss
@@ -1,10 +1,5 @@
$primary-color: #409EFF;
$primary-background-color: #ecf5ff;
-html,body{
- margin:0;
- height: 100%;
- text-align: left;
-}
*, :after, :before {
-webkit-box-sizing: border-box;
@@ -105,7 +100,6 @@ html,body{
font-size: 12px;
display: block;
width: 48%;
- text-align: left;
line-height: 26px;
position: relative;
float: left;
@@ -158,7 +152,7 @@ html,body{
// border: 1px dashed #999;
border: 1px dashed #999;
// min-height: 600px;
- margin: 10px;
+ margin: 2px;
.widget-col-list{
min-height: 50px;
@@ -169,10 +163,10 @@ html,body{
.widget-view{
padding-bottom: 18px;
position: relative;
- border: 1px dashed rgba(170,170,170,0.7);
+ border: 1px dashed hsla(0,0%,66.7%,.7);
background-color: rgba(236, 245, 255, .3);
margin: 2px;
-
+ text-align: left;
.el-form-item__content{
position: unset;
}
@@ -530,7 +524,7 @@ html,body{
.widget-col{
padding-bottom: 0;
- padding: 5px;
+ padding: 3px;
// margin-left: 2px !important;
// margin-right: 2px !important;
background-color: rgba(253,246,236, .3);
@@ -658,7 +652,7 @@ html,body{
.widget-config-container{
position: relative;
-
+ overflow: hidden;
.el-header{
border-bottom: solid 2px #e4e7ed;
padding: 0 5px;
@@ -682,15 +676,16 @@ html,body{
.config-content{
padding: 10px;
-
+ overflow: auto;
+ height: calc(100% - 45px);
.el-form-item__label{
padding: 0;
font-weight: 500;
}
-
.el-form-item {
border-bottom: solid 1px #e1e1e1;
padding-bottom: 10px;
+ text-align: left;
}
}
diff --git a/packages/FormDesigner/src/components/FormDesigner/styles/table-form.scss b/packages/FormDesigner/src/styles/table-form.scss
similarity index 92%
rename from packages/FormDesigner/src/components/FormDesigner/styles/table-form.scss
rename to packages/FormDesigner/src/styles/table-form.scss
index b0cec3c..5f2df9d 100644
--- a/packages/FormDesigner/src/components/FormDesigner/styles/table-form.scss
+++ b/packages/FormDesigner/src/styles/table-form.scss
@@ -1,3 +1,9 @@
+/*
+ * @file: 使用表格布局样式
+ * @copyright: NanJing Anshare Tech .Com
+ * @author: BoBo
+ * @Date: 2020年09月14 18:01:58
+ */
.table-form-wrapper {
@mixin border-style($position: 'all', $style: 1px solid #e6e6e6) {
@if ($position== 'all') {
@@ -30,7 +36,7 @@
font-size: 16px;
flex-shrink: 0;
text-align: center;
- padding: 0 6px;
+ padding: 0;
}
.el-form-item__content {
box-sizing: border-box;
diff --git a/packages/FormDesigner/src/utils/download.ts b/packages/FormDesigner/src/utils/download.ts
new file mode 100644
index 0000000..27940c4
--- /dev/null
+++ b/packages/FormDesigner/src/utils/download.ts
@@ -0,0 +1,48 @@
+/**
+ * @file 文件下载
+ * @author BoBo
+ * @copyright NanJing Anshare Tech .Com
+ * @createDate 2018年11月18日08:13:10
+ */
+import axios from '../../../api/axios';
+
+/**
+ * 通用下载
+ *
+ * @export
+ * @param {String} url 请求地址
+ * @param {String} name 文件名
+ * @param {Object} params 请求参数
+ * @param {String} requestType 请求方式(get,post)
+ */
+export default function (url, name, params, requestType = 'get') {
+ let axiosObj;
+ if (requestType === 'get') {
+ axiosObj = axios.get(url, { responseType: 'blob', params });
+ } else {
+ axiosObj = axios.post(url, params, { responseType: 'blob' });
+ }
+ axiosObj
+ .then((res) => {
+ if (!res) {
+ return;
+ }
+ const blob = new Blob([res]);
+ const date = new Date();
+ let fileName;
+ if (/^.*\..{1,4}$/.test(name)) {
+ fileName = name;
+ } else {
+ fileName = `${name} ${date.getFullYear()}年${date.getMonth()
+ + 1}月${date.getDate()}日${date.getHours()}时${date.getMinutes()}分${date.getSeconds()}秒.xls`;
+ }
+ const aTag = document.createElement('a');
+ aTag.style.display = 'none';
+ aTag.download = fileName;
+ aTag.href = URL.createObjectURL(blob);
+ document.body.appendChild(aTag);
+ aTag.click();
+ URL.revokeObjectURL(aTag.href);
+ document.body.removeChild(aTag);
+ });
+}
diff --git a/packages/api/axios.ts b/packages/api/axios.ts
new file mode 100644
index 0000000..2a82536
--- /dev/null
+++ b/packages/api/axios.ts
@@ -0,0 +1,92 @@
+/**
+ * @file 封装原生axios,在main.js和api层引用本文件
+ * @author ytyang
+ * @copyright NanJing Anshare Tech .Com
+ * @createDate 2018年11月13日10:52:32
+ * @author BoBo update
+ */
+import axios from "axios";
+import { Message, MessageBox } from "element-ui"; // eslint-disable-line
+
+// axios详细配置参考:
+// https://github.com/axios/axios#request-config
+
+// 创建axios实例
+const service = axios.create({
+ baseURL: 'http://localhost:3000/', // 后端接口根路径
+ timeout: 60 * 1000, // 请求超时时间
+});
+
+// 拦截请求
+service.interceptors.request.use(
+ (config) => {
+ config.headers.auth = 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyTmFtZSI6ImFkbWluIiwidXNlcklEIjoiMDAwMDAwMDAtMTAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwIiwiZGVwdElEIjoiMmY4NDQ3ZGUtNTczMi00ZmE0LTgyODYtOWE3MWI0MWRkMWU3IiwicmVhbE5hbWUiOiLotoXnuqfnrqHnkIblkZgiLCJyb2xlSUQiOiIwMDAwMDAwMC0xMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDAiLCJyb2xlTmFtZSI6Iui2hee6p-euoeeQhuWRmCIsImRlcHROYW1lIjoi5oC76YOoIiwicm9sZUF1dGhOYW1lIjoiQWRtaW5EYXNoYm9hcmRGb3JBZG1pbixBZG1pbkRhc2hib2FyZCxVc2VycyxSb2xlLEZvcm1EZXNpZ25lcixUYWJsZURlc2lnbmVyLERpY3QsZmxvd0NsdWVJbmZvLEJ1c2luZXNzQWN0Q2x1ZUluZm8sU3lzdGVtLERldlRvb2xzIiwicGhvdG8iOiJkYXRhOmltYWdlL2pwZztiYXNlNjQsLzlqLzRBQVFTa1pKUmdBQkFnQUFBUUFCQUFELzJ3QkRBQWdHQmdjR0JRZ0hCd2NKQ1FnS0RCUU5EQXNMREJrU0V3OFVIUm9mSGgwYUhCd2dKQzRuSUNJc0l4d2NLRGNwTERBeE5EUTBIeWM1UFRneVBDNHpOREwvMndCREFRa0pDUXdMREJnTkRSZ3lJUndoTWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qTC93QUFSQ0FCa0FHUURBU0lBQWhFQkF4RUIvOFFBSHdBQUFRVUJBUUVCQVFFQUFBQUFBQUFBQUFFQ0F3UUZCZ2NJQ1FvTC84UUF0UkFBQWdFREF3SUVBd1VGQkFRQUFBRjlBUUlEQUFRUkJSSWhNVUVHRTFGaEJ5SnhGREtCa2FFSUkwS3h3UlZTMGZBa00ySnlnZ2tLRmhjWUdSb2xKaWNvS1NvME5UWTNPRGs2UTBSRlJrZElTVXBUVkZWV1YxaFpXbU5rWldabmFHbHFjM1IxZG5kNGVYcURoSVdHaDRpSmlwS1RsSldXbDVpWm1xS2pwS1dtcDZpcHFyS3p0TFcydDdpNXVzTER4TVhHeDhqSnl0TFQxTlhXMTlqWjJ1SGk0K1RsNXVmbzZlcng4dlAwOWZiMytQbjYvOFFBSHdFQUF3RUJBUUVCQVFFQkFRQUFBQUFBQUFFQ0F3UUZCZ2NJQ1FvTC84UUF0UkVBQWdFQ0JBUURCQWNGQkFRQUFRSjNBQUVDQXhFRUJTRXhCaEpCVVFkaGNSTWlNb0VJRkVLUm9iSEJDU016VXZBVlluTFJDaFlrTk9FbDhSY1lHUm9tSnlncEtqVTJOemc1T2tORVJVWkhTRWxLVTFSVlZsZFlXVnBqWkdWbVoyaHBhbk4wZFhaM2VIbDZnb09FaFlhSGlJbUtrcE9VbFphWG1KbWFvcU9rcGFhbnFLbXFzck8wdGJhM3VMbTZ3c1BFeGNiSHlNbkswdFBVMWRiWDJObmE0dVBrNWVibjZPbnE4dlAwOWZiMytQbjYvOW9BREFNQkFBSVJBeEVBUHdEM2FpaWlnQXFock9zMk9nNlpMcUdvVENPQ1A4U3g3S0IzSnEvMEdUWGdIeFQ4U2pXL0VmMk8xdUZsc0xKUXFHTnNxN2taWnNqcjZmZ2FBSlBFUHhaMXZWSlhqMHh2N090ZWcyWU1yRDNidCtHUHFhNG02MU8vdldMWGQ3Y3pzZXBsbFp2NW1xdEZNa2Nranh0dWpkbFBxcHhXenAzakR4RHBUcWJUVjd0UVA0SGtMcC8zeTJSV0pSUUI3ZDRNK0swV3JYTVduYTNISGJYTWhDeDNDY1J1ZXdJUDNUK24wcjAydmtTdnBINGVhNCt2ZUQ3U2FlVGZjdzVnbUpPU1N2UW42akg2MGhvNnFpaWlnWVVVVVVBRkZGRkFITC9FVzhsc2ZBV3F6UXNWY3hySGtkZzdxcC9RbXZteXZwbngzWm0vOERhdkFveXd0eklCL3VFUC93Q3kxNDc4T2ZER25hMWVYV282ek5ISHB0aHRMckk0UlhaczRCUHB3ZnJ4VEV6bDlPMFRWZFdKR242ZmMzSUJ3VEZFV0ErcDZDdG4vaFhYaTNadi9zV2JIKyttZnl6bXZkN2Z4Rm9VVnVrZG5JZnM2akNmWnJXUm93UFlxdU1VNGVML0FBN3YyUHJGcEUvOTJhUVJuOG14U0N4ODFYK2s2anBVZ2oxQ3h1TFZqMEUwWlhQMHoxcW5YMDdlK0lmQ2wxYlBCZWF0cEU4REQ1bzVMaU53Znd6WG5lc2VCL0NHcHlHZlJkVXVMYmR6c2l0WkxpTDhNREkvTTB3c2VUVjJud3MxR2V5OGRXY01ic0lyb1BGS3VlQ05wSS9JZ2ZyWFFlSC9BSVo2RGRYNGl2UEVTWE1pOG16alR5WkNQY01kMlBvUHhyRCtGZGcwL3dBUWJkc1pGcEhMSTMvZkpYK2JDZ0Q2RG9vb3BEQ2lpaWdBb29vb0F6UEVnbFBoZlZoQm56dnNjMnpIWE93NHJ4end6NFRqdC9pQllXZHk2M09teUt0MUVHT1JJR2pkMHlPaHh0UDVlOWU3RUFqQkdRYTgvUGhuK3pQRmx2YlIzakxiM0VESFQyMkF0YXlSTnZDZjdTNGtrR0QvQUE1SHZRQjZBT0JnZEs1angvcDlwcUhoRzhXNGdTU1lLQmJFajVoS1dBVUE5ZVNRUHhxLzlyMTZJYkgwcTFtY2Y4dElyc3FyZStDdVI5T2ZxYVpEcGwvZlg4TjVyTWtBVzNiZkJaMjVKalIvNzdNUUM3RFBIQUE5TTgwQVlMK0VkRDAveHJvekpwZHRGQzF2TUZBWDVXbVhZVnlEMU8zZVI5UGF1NXFscW1tUmFyYUNGNUhpa1J4SkROSDk2SngwWWY1NUJJNzFTam44Uld3RWM5alozdU9CUERPWWkzdVVaVGo4R05BR1A4UzlLaTFEd3NaVlZWdm9aNFJiU2pobFpwRlhBUFhIemZwN1Z5M3dxMFM0MHZXa3VaWlF4dmROTnd5RCtCVElvVEo5VGhqWFcrSkJmdG9sMXFHcEpEQ2xyR3pXMXBDNWZkTVJ0UXV4QTZGaGhRT3ZPVGdWbytGL0R2OEF3ajlnRm1uTnhlUEhHa2t1M2FBcUx0UkZIWlFQekpKNzBDTjJpaWlnWVVVVVVBRkZGRkFCV040bHNiaTYwMUxteVhkZldNcTNWdXY5OWw2cC93QUNVc3Y0MXMwVUFWZE4xQzMxWFRvTDYxYmRETXU1YzlSNmcraEI0STlSVnF1TWxtdXROOFYzUytIclkza08zenRTdFE0VlVrT01HTW5nU0VaSlhvUUFlQ2F0M1h4QzhPV051WHZMdVMzblg3MXJMQ3l6QStoWEg2OVBlZ0RxS0s0VFRmaTE0WnY1ekZNOXpaZjNYdUl4dGI4Vkp4K05YOVI4VFgyb1dFLy9BQWl0bEplRlVKTjR5N1loL3dCYzkyUE1iMEE0ejFQYWdDeHFUZjIzNGt0TkpqK2Eyc0hXN3ZXN2J4L3FvL3JuNWlQUlI2MTBsWS9oaUhUNDlEaGwwNlZwNDU4eXlUeUhNa3NoKzh6L0FPMW5nanRqSGF0aWdBb29vb0FLS0tLQUN1TzEzNG1lSE5Fa2FIN1ExN2NMd1k3VUJnRDd0bkg2bXVYK0xuaSs0dFpFOFAyRXJSNzR3OTA2bkJJUFJNOXVPVDlSNzE0N1FLNTZwZjhBeHN2WEpHbjZSYnhEczA4aGtQNURiWE5haDhUZkZlb0tVL3RIN01oL2h0a0NmK1BmZS9XdVFvcGdlbi9DcnhtYlBVNU5HMUdZdEhleWI0cG5PU0pqMko3N3NEOGZyWFdlSi9EMW40KzFyN05Bb2lUVHcwYytvcU1rdmppSlIwYkJPVzlPZzVKcndVRXF3WlNRUnlDTzFlbmZEZjRpUjZVaWFMckRoYlFzVERjbi9sbVNja043RW5yMituUUF0d2ZCcWUwaWx1WmIyRzltaUllSzFDRkVtQU9Tck5uSXlNampvVDFydE5UOGE2Wm8vZzBhcGJvcXNCNUVObXcyc2tvNDh0bDdiY2Mrdzl4V2g0azhXNlo0WjByN1pjekxJOGk1Z2hSZ1dtUGJIdDc5SytjdGIxbTYxM1ZialVMb3FIbWN1VVFZVmVBT0I5QUJucWNVZ0xWbjR1MS9UN3llNnROVW5pa25rYVdRQTVSbUp5VHRQSDZWMDlsOFl2RWR2Z1hNVmxkcjNMeGxHL05TQitsZWUwVXhIdGVtZkduVFptVk5UMDJlMXp3WGhjU0w5U09EL092UWRKMXJUZGN0ZnRPbVhrVnpGMzJIbGZZanFEOWErVTYwdEQxeSs4UGFwRmYyRXBTUkQ4eTUrV1JlNnNPNE5BN24xVFJWTFNOU2gxblNMVFVZT0k3aUlTQUgrSFBVZmdjajhLS1F6NXU4WjM1MUx4bHExeVNTRGNzaS93QzZwMmo5QUt3cXQ2bEZjSmZ6dmN3U3dzOGpOaVJDcDVPZTlWS1pJVVVVVUFGRkZGQUNsaTJNa25Bd005cVNpaWdBb29vb0FLS0tNWk9CUUI3ajhLZGRoajhHZlpybVRhYmU1ZEVIK3lRRy9teG9yenJRUDdWdE5QWkl0T3ZYUnBDd0tRTVFlQjZEMm9wRFBveVNLT1pDa3FLNm5xckRJckp1dkNQaDI4eVo5RXNHWTlXRUNxZnpBelJSUU14N2o0VytFWjg0MDFvU2U4YzdqOUNTS3h0UStFSGh5S0I1WTdqVVVJSFFTb1IrcTBVVUNPQzFUd2hwOWl6Q0thNU9QN3pML3dERTF5MTNhcEE1Q0ZqajFvb3BnUVJJSGZCeitGYjJuYUJhM1pIbVNURFA5MGovQUFvb29BN3JSUGhkb2Vvak0xMXFBOWxrUWY4QXNsZExCOEkvQ2tKK2VDNm4vd0N1azVIL0FLRGlpaWtCclczZ0R3cGFmNnZSTFp2K3V1WlAvUWlhMmJYU3RQc1FQc2xoYTIrT25sUXF2OGhSUlFNdDBVVVVBZi9aIiwiaWF0IjoxNjAzMDkxOTcxLCJleHAiOjE2MDMxNzgzNzF9.QfXqO69LbHJre6_04zvOgvzIPjPQLJ6l-CRX5SZvEwY'
+ return config;
+ },
+ (error) => {
+ // 请求出错
+ Message({
+ message: error.message,
+ type: "error",
+ duration: 5 * 1000,
+ });
+ Promise.reject(error);
+ }
+);
+
+// 拦截响应
+service.interceptors.response.use(
+ (response) => {
+ const res = response.data;
+ // let { data } = res;
+ const { message, code } = res;
+ // 600表示token异常需要重新登录
+ if (code === 600) {
+ Message({
+ message: "token已过期",
+ type: "error",
+ duration: 1000,
+ });
+ window.location.reload(); // 为了重新实例化vue-router对象,避免bug
+ } else if (code === 500) {
+ // 极端情况服务器错误
+ MessageBox.alert(
+ `状态码:500
接口:${response.request.responseURL}
原因:${message}`,
+ "请截图并联系运维人员",
+ {
+ confirmButtonText: "我知道了",
+ type: "warning",
+ dangerouslyUseHTMLString: true,
+ customClass: "msgBox",
+ showClose: true,
+ }
+ );
+ } else if (code === 400) {
+ // 业务失败情况统一拦截
+ MessageBox.alert(`原因:${message}`, "操作失败", {
+ confirmButtonText: "我知道了",
+ type: "warning",
+ showClose: true,
+ });
+ }
+ // 正常响应继续传递
+ return res;
+ },
+ (error) => {
+ // http状态码200以外的情况
+ if (process.env.NODE_ENV !== "test") {
+ // 请检查网络链接或联系管理员
+ const msg = "请检查网络链接或联系管理员。";
+ MessageBox.alert(`${error.message},${msg}`, "网络异常", {
+ confirmButtonText: "重试",
+ type: "warning",
+ }).then(() => {
+ // 清空token
+ window.location.reload(); // 为了重新实例化vue-router对象,避免bug
+ });
+ }
+ return Promise.reject(error);
+ }
+);
+
+export default service;
diff --git a/packages/api/public/crud.ts b/packages/api/public/crud.ts
new file mode 100644
index 0000000..7c020b7
--- /dev/null
+++ b/packages/api/public/crud.ts
@@ -0,0 +1,67 @@
+/*
+ * @file: 通用请求crud
+ 可根据后台接口情况自行修改
+ * @copyright: BoBo
+ * @author: BoBo
+ * @Date: 2020年04月24 11:35:00
+ */
+
+import axios from "../axios";
+
+interface optionsType {
+ url: string; // 请求地址
+ method: string; // 请求方法 post / get
+ data?: object; // body报体内容
+ params?: object; // queryString内容
+ headers?: any; // 自定义头,用于设置是否加密请求
+}
+
+/**
+ * 操作类型枚举
+ */
+export enum DML {
+ INSERT = "add",
+ UPDATE = "update",
+ DELETE = "delete",
+ SELECT = "list",
+ TREE = "tree",
+ TREE_LAZY = "treeByParentID",
+ DETAIL = "detail",
+ DELETES = "deleteByIds",
+}
+
+/**
+ *
+ * @param dml 操作类型
+ * @param tableName 数据库表名
+ * @param data body data
+ * @param params query Params
+ */
+export function crud(
+ dml: DML,
+ tableName: string,
+ data: object = {},
+ params: any = null
+) {
+ const options: optionsType = {
+ // url: `/${tableName}/${dml}`, // 例如users表的查询接口为 /users/list
+ url: `/${tableName.replace(/_/g, '/')}/${dml}`,
+ method: "post",
+ };
+ // 以下请求通过包体传参
+ if ("list,treeByParentID".includes(dml)) {
+ // list接口高级查询条件拼接
+ options.data = {
+ orderCondition: "",
+ searchCondition: [],
+ pageIndex: 0,
+ pageSize: 0,
+ ...data,
+ };
+ } else {
+ options.data = data;
+ }
+ options.params = params;
+
+ return axios(options as any);
+}
diff --git a/packages/api/system/form.ts b/packages/api/system/form.ts
new file mode 100644
index 0000000..a3c73e7
--- /dev/null
+++ b/packages/api/system/form.ts
@@ -0,0 +1,53 @@
+/*
+ * @file: 表单设计相关api
+ * @copyright: NanJing Anshare Tech .Com
+ * @author: BoBo
+ * @Date: 2020年08月26 16:14:53
+ */
+import axios from '../axios';
+
+/**
+ * 获取数据库中所有表名
+ *
+ * @returns 所有表名
+ */
+export function getTables() {
+ return axios({
+ url: '/form/getTables',
+ method: 'post',
+ });
+}
+
+/**
+ * 根据表名获取表格的设计json等信息
+ *
+ * @param {String} tablename
+ * @returns 表格设计json
+ */
+export function getTableDetail(tablename) {
+ return axios({
+ url: '/dynamictables/detail',
+ method: 'post',
+ params: { tablename },
+ });
+}
+
+export function getFormDetail(tablename) {
+ return axios({
+ url: '/form/detail',
+ method: 'post',
+ params: { tablename },
+ });
+}
+
+/**
+ *
+ * @param {String} tablename
+ */
+export function getFormKey(tablename) {
+ return axios({
+ url: '/form/getKey',
+ method: 'post',
+ params: { tablename },
+ });
+}
diff --git a/packages/index.js b/packages/index.ts
similarity index 89%
rename from packages/index.js
rename to packages/index.ts
index f1b0967..12778f3 100644
--- a/packages/index.js
+++ b/packages/index.ts
@@ -9,16 +9,16 @@
// 导入单个组件
import FormDesigner from './FormDesigner';
-import Test from './test';
+import CrudTable from './CrudTable';
// 以数组的结构保存组件,便于遍历
const components = [
FormDesigner,
- Test,
+ CrudTable
];
// 定义 install 方法
-const install = (Vue) => {
+const install: any = (Vue) => {
if (install.installed) return;
install.installed = true;
// 遍历并注册全局组件
diff --git a/packages/shims-vue-expand.d.ts b/packages/shims-vue-expand.d.ts
new file mode 100644
index 0000000..26ae7a6
--- /dev/null
+++ b/packages/shims-vue-expand.d.ts
@@ -0,0 +1,27 @@
+/*
+ * @file: 声明vue拓展原型链上的属性类型
+ * @copyright: NanJing Anshare Tech .Com
+ * @author: BoBo
+ * @Date: 2020年06月23 16:47:06
+ */
+/* eslint-disable */
+import VueRouter, { Route } from 'vue-router';
+
+import { Store } from 'vuex';
+
+// 扩充
+declare module 'vue/types/vue' {
+ interface Vue {
+ $router: VueRouter;
+ $route: Route;
+ $store: Store;
+ lodash: any;
+ axios: any;
+ dayjs: any;
+ $pinyinmatch: any;
+ install: any;
+ }
+ interface VueConstructor {
+ install: any;
+ }
+}
diff --git a/packages/shims-vue.d.ts b/packages/shims-vue.d.ts
new file mode 100644
index 0000000..f692f41
--- /dev/null
+++ b/packages/shims-vue.d.ts
@@ -0,0 +1,13 @@
+/*
+ * @file: 让ts识别vue文件,声明第三方模块
+ * @copyright: NanJing Anshare Tech .Com
+ * @author: BoBo
+ * @Date: 2020年06月22 16:26:22
+ */
+declare module '*.vue' {
+ import Vue from 'vue';
+
+ export default Vue;
+}
+
+declare module 'vuedraggable';
diff --git a/packages/test/src/test.vue b/packages/test/src/test.vue
deleted file mode 100644
index 8a19c43..0000000
--- a/packages/test/src/test.vue
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-
-
-
Hello World!!
-
-
-
-
-
-
diff --git a/packages/utils/confirm.ts b/packages/utils/confirm.ts
new file mode 100755
index 0000000..bd2b936
--- /dev/null
+++ b/packages/utils/confirm.ts
@@ -0,0 +1,46 @@
+/*
+ * @file: 全局装饰器封装
+ * @copyright: NanJing Anshare Tech .Com
+ * @author: BoBo
+ * @Date: 2020年08月19 17:53:46
+ */
+import { MessageBox } from 'element-ui';
+
+/**
+ * 确认提示框装饰器
+ * @param {*} message 提示信息
+ * @param {*} title 标题
+ * @param {*} cancelFn 取消回调函数
+ */
+export function confirm(message, title = '提示', cancelFn = (error) => {}) {
+ return (target, name, descriptor) => {
+ const originFn = descriptor.value;
+ // eslint-disable-next-line func-names
+ descriptor.value = async function (...rest) {
+ try {
+ await MessageBox.confirm(message, title);
+ originFn.apply(this, rest);
+ } catch (error) {
+ if (cancelFn) {
+ cancelFn(error);
+ }
+ }
+ };
+ };
+}
+
+/**
+ * 提示框装饰器
+ * @param {*} message 提示信息
+ * @param {*} title 提示标题
+ */
+export function alert(message, title = '提示') {
+ return (target, name, descriptor) => {
+ const originFn = descriptor.value;
+ // eslint-disable-next-line func-names
+ descriptor.value = async function (...rest) {
+ await MessageBox.alert(message, title);
+ originFn.apply(this, rest);
+ };
+ };
+}
diff --git a/packages/utils/generator.ts b/packages/utils/generator.ts
new file mode 100644
index 0000000..f08df90
--- /dev/null
+++ b/packages/utils/generator.ts
@@ -0,0 +1,16 @@
+/**
+ * @file 公共生成器
+ * @author BoBo
+ * @copyright NanJing Anshare Tech .Com
+ * @createDate 2018年11月23日17:41:47
+ */
+
+// 允许按位操作符通过eslint检查
+/* eslint no-bitwise: ["error", { "allow": ["|","&"] }] */
+export default function guid() {
+ return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
+ const r = Math.random() * 16 | 0;
+ const v = c === 'x' ? r : ((r & 0x3) | 0x8);
+ return v.toString(16);
+ });
+}
diff --git a/tsconfig.json b/tsconfig.json
new file mode 100644
index 0000000..ddd0b24
--- /dev/null
+++ b/tsconfig.json
@@ -0,0 +1,41 @@
+{
+ "compilerOptions": {
+ "target": "esnext",
+ "module": "esnext",
+ "strict": true,
+ "jsx": "preserve",
+ "importHelpers": true,
+ "moduleResolution": "node",
+ "experimentalDecorators": true,
+ "esModuleInterop": true,
+ "allowSyntheticDefaultImports": true,
+ "sourceMap": true,
+ "noImplicitAny": false,
+ "baseUrl": ".",
+ "types": [
+ "webpack-env",
+ "./../element-ui/types",
+ ],
+ "paths": {
+ "@/*": [
+ "examples/*",
+ "packages/*"
+ ]
+ },
+ "lib": [
+ "esnext",
+ "dom",
+ "dom.iterable",
+ "scripthost"
+ ]
+ },
+ "include": [
+ "examples/**/*.ts",
+ "examples/**/*.vue",
+ "packages/**/*.ts",
+ "packages/**/*.tsx"
+ ],
+ "exclude": [
+ "node_modules"
+ ]
+}
diff --git a/vue.config.js b/vue.config.js
index aff1a0e..eb00bb6 100644
--- a/vue.config.js
+++ b/vue.config.js
@@ -4,11 +4,11 @@ module.exports = {
pages: {
index: {
// page 的入口
- entry: 'examples/main.js',
+ entry: 'examples/main.ts',
// 模板来源
template: 'public/index.html',
// 输出文件名
- filename: 'index.html'
- }
- }
-}
\ No newline at end of file
+ filename: 'index.html',
+ },
+ },
+};