diff --git a/py/pdcopyist/src/controllers/common.py b/py/pdcopyist/src/controllers/common.py
index 1d09707b74a9d623382d50ab0fe8ca1faf93dd4d..7445dfb42875179fc7dc41d6e0bdf27c325e4eeb 100644
--- a/py/pdcopyist/src/controllers/common.py
+++ b/py/pdcopyist/src/controllers/common.py
@@ -5,6 +5,10 @@ import flask
import pandas as pd
+def to_json(obj):
+ return flask.json.dumps(obj, default=json_converter)
+
+
def df2json(df: pd.DataFrame, head_tail_num=10):
ret = None
diff --git a/py/pdcopyist/src/controllers/cusFuns_controller.py b/py/pdcopyist/src/controllers/cusFuns_controller.py
index 7ee817406bf53579570533b30d8fbedd34d0ed9f..f6971ab2acafc3ab98ca7f18ea584d315711855b 100644
--- a/py/pdcopyist/src/controllers/cusFuns_controller.py
+++ b/py/pdcopyist/src/controllers/cusFuns_controller.py
@@ -24,8 +24,7 @@ def cus_fun():
def get_cus_funcs_desc():
# auto_register(base_path , 'src/cusFuns')
ret = ProxyManager.get().get_cus_funcs_desc()
- ret = flask.json.dumps(ret, default=json_converter)
- return ret
+ return common.to_json(ret)
@app.route('/model', methods=['get'])
@@ -34,8 +33,7 @@ def get_cus_funcs_ui_model():
uid = str(request.args.get('uid'))
ret = ProxyManager.get().get_ui_model(uid)
- ret = flask.json.dumps(ret, default=json_converter)
- return ret
+ return common.to_json(ret)
@app.route('/input', methods=['post'])
diff --git a/py/pdcopyist/src/controllers/loaddata_controller.py b/py/pdcopyist/src/controllers/loaddata_controller.py
index aecabde2d2e9c51dcac68f54fc18649a6957117a..d89b171acf5eb866bf8d264b2dfc4864b447ebae 100644
--- a/py/pdcopyist/src/controllers/loaddata_controller.py
+++ b/py/pdcopyist/src/controllers/loaddata_controller.py
@@ -1,5 +1,10 @@
import json
+from pdcopyist.src.core.UIArgs import Content, AbcArgs
+from typing import List
+
+from werkzeug.datastructures import FileStorage
+from pdcopyist.src.controllers.loaddata_model import UIJsonModel
import flask
from flask import request, Blueprint
import pandas as pd
@@ -9,23 +14,45 @@ from pdcopyist.src.controllers import common
app = Blueprint('loaddata', __name__)
-# @app.route('/get_file_args/ext=', methods=['get'])
-# def get_file_args(ext: str):
-# print(ext)
-# print(request.values.get('ext'))
-# return 'done'
+@app.route('/ui_args', methods=['post'])
+def get_ui_args():
+ '''
+ 根据文件后缀名,返回界面所需内容
+ '''
+ file: FileStorage = flask.request.files.get('file')
+ ext = flask.request.form['ext']
+
+ model = UIJsonModel.get_model(file, ext)
+ ret = model.to_args()
+ ret = common.to_json(ret)
+
+ return ret
@app.route('/file', methods=['post'])
def upload_file():
-
- file = flask.request.files.get('file')
+ file: FileStorage = flask.request.files.get('file')
ext = flask.request.form['ext']
filename = flask.request.form['file_name']
args = json.loads(flask.request.form['args'])
+ kwargs = {
+ a['content']['var_name']: AbcArgs.extract_value(a)
+ for a in args['contents']
+ if a['content']['var_name'] is not None}
+
+ model = UIJsonModel.get_model(file, ext)
- # todo:根据不同情况做处理
px = ProxyManager.get()
- px.read_data(file, filename, ext, args)
+ px.init_all_proxy()
+ px.import_module()
+
+ model.handler(px.pd_read_proxy, file, ext, **kwargs)
+
+ px.read_data()
return common.df2json(px.get_df_data())
+
+ # todo:根据不同情况做处理
+ # px = ProxyManager.get()
+ # px.read_data(file, filename, ext, args)
+ # return common.df2json(px.get_df_data())
diff --git a/py/pdcopyist/src/controllers/loaddata_model.py b/py/pdcopyist/src/controllers/loaddata_model.py
new file mode 100644
index 0000000000000000000000000000000000000000..5799ae4de3dc0120286d53ea1bc3604b407a6f3d
--- /dev/null
+++ b/py/pdcopyist/src/controllers/loaddata_model.py
@@ -0,0 +1,126 @@
+
+
+from pdcopyist.src.core.MethodCall import ArgActor
+from pdcopyist.src.core import Proxy
+from werkzeug.datastructures import FileStorage
+from pdcopyist.src.core import UIArgs
+from pdcopyist.src.core.UIArgs import AbcArgs, Content
+from pdcopyist.src.helper.utils import CanJson
+from typing import List
+
+
+class DataArgs(CanJson):
+
+ def __init__(self, model_type) -> None:
+ self.model_type = model_type.__name__
+ self.contents: List[Content] = []
+
+ def append_arg(self, args: AbcArgs):
+ self.contents.append(args.to_content())
+
+
+class UIJsonModel(object):
+
+ @staticmethod
+ def get_model(file: FileStorage, file_ext: str) -> 'UIJsonModel':
+ if file_ext in ['xlsx', 'xls', 'xlsm']:
+ return ExcelUIJsonModel(file, file_ext)
+
+ if file_ext in ['csv']:
+ return CsvUIJsonModel(file, file_ext)
+
+ if file_ext in ['feather']:
+ return FeatherUIJsonModel(file, file_ext)
+
+ raise Exception('not support file')
+
+ def __init__(self, file: FileStorage, file_ext: str) -> None:
+ self.file = file
+ self.file_ext = file_ext
+
+ def handler(self, caller: Proxy.CallerProxy, file: FileStorage, file_ext: str, **kwargs):
+ raise NotImplementedError
+
+ def to_args(self) -> DataArgs:
+ raise NotImplementedError
+
+
+class ExcelUIJsonModel(UIJsonModel):
+
+ s_engine_map = {
+ 'xls': 'xlrd',
+ 'xlsx': 'openpyxl',
+ 'xlsm': 'openpyxl'
+ }
+
+ def __init__(self, file, file_ext: str) -> None:
+ super().__init__(file, file_ext)
+
+ def _get_sheet_names(self, file):
+ import pandas as pd
+ xl = pd.ExcelFile(file)
+ return xl.sheet_names
+
+ def to_args(self) -> DataArgs:
+ pass
+ da = DataArgs(ExcelUIJsonModel)
+ da.append_arg(UIArgs.Input(
+ '文件名:', enable=False, default=self.file.filename))
+ da.append_arg(UIArgs.Input('后缀:', enable=False, default=self.file_ext))
+ da.append_arg(UIArgs.Select(
+ '选择工作表:', self._get_sheet_names(self.file), var_name='sheet_name'))
+
+ return da
+
+ def handler(self, caller: Proxy.CallerProxy, file: FileStorage, file_ext: str, **kwargs):
+ if file_ext in self.s_engine_map:
+ kwargs['engine'] = self.s_engine_map[file_ext]
+
+ with caller.with_cmd('加载数据') as cmd:
+ cmd.create_statement('pd', 'df')
+ getattr(caller, 'read_excel')(
+ ArgActor(file, str(file.filename)), **kwargs)
+
+
+class CsvUIJsonModel(UIJsonModel):
+
+ def __init__(self, file, file_ext: str) -> None:
+ super().__init__(file, file_ext)
+
+ def to_args(self) -> DataArgs:
+ pass
+ da = DataArgs(CsvUIJsonModel)
+ da.append_arg(UIArgs.Input(
+ '文件名:', enable=False, default=str(self.file)))
+ da.append_arg(UIArgs.Input('后缀:', enable=False, default=self.file_ext))
+ da.append_arg(UIArgs.Select(
+ '编码:', source=['utf8', 'gb2312'], var_name='encoding'))
+
+ return da
+
+ def handler(self, caller: Proxy.CallerProxy, file: FileStorage, file_ext: str, **kwargs):
+ with caller.with_cmd('加载数据') as cmd:
+ cmd.create_statement('pd', 'df')
+ getattr(caller, 'read_csv')(
+ ArgActor(file, str(file.filename)), **kwargs)
+
+
+class FeatherUIJsonModel(UIJsonModel):
+
+ def __init__(self, file, file_ext: str) -> None:
+ super().__init__(file, file_ext)
+
+ def to_args(self) -> DataArgs:
+ pass
+ da = DataArgs(FeatherUIJsonModel)
+ da.append_arg(UIArgs.Input(
+ '文件名:', enable=False, default=str(self.file)))
+ da.append_arg(UIArgs.Input('后缀:', enable=False, default=self.file_ext))
+
+ return da
+
+ def handler(self, caller: Proxy.CallerProxy, file: FileStorage, file_ext: str, **kwargs):
+ with caller.with_cmd('加载数据') as cmd:
+ cmd.create_statement('pd', 'df')
+ getattr(caller, 'read_feather')(
+ ArgActor(file, str(file.filename)), **kwargs)
diff --git a/py/pdcopyist/src/core/Proxy.py b/py/pdcopyist/src/core/Proxy.py
index 383b2f4114f840e41fbafef35fd800f0be1bd9cd..06adafd09d6b025b8e4ddf214d46748d82e9c094 100644
--- a/py/pdcopyist/src/core/Proxy.py
+++ b/py/pdcopyist/src/core/Proxy.py
@@ -108,14 +108,14 @@ class ProxyManager(object):
def __init__(self) -> None:
self.df_proxy = CallerProxy()
self.pd_read_proxy = CallerProxy()
- self.source_cache: pd.DataFrame = None
- self.last_df_cache = None
+ self.source_cache: pd.DataFrame = pd.DataFrame()
+ self.last_df_cache: pd.DataFrame = pd.DataFrame()
def _get_all_proxys(self) -> Iterable[CallerProxy]:
yield self.pd_read_proxy
yield self.df_proxy
- def get_last_df_cache(self):
+ def get_last_df_cache(self) -> pd.DataFrame:
return self.last_df_cache
@staticmethod
@@ -125,22 +125,22 @@ class ProxyManager(object):
return kws
- def read_data(self, file, filename, file_ext, read_kws):
+ def init_all_proxy(self):
+ """
+ 清除所有的记录
+ """
self.df_proxy.cmdManager.clear_all()
self.pd_read_proxy.cmdManager.clear_all()
- pd_px = self.pd_read_proxy
-
- with pd_px.with_cmd('导入模块') as cmd:
+ def import_module(self):
+ """
+ import module
+ """
+ with self.pd_read_proxy.with_cmd('导入模块') as cmd:
cmd.create_code_statement('import pandas as pd')
- with pd_px.with_cmd('加载数据') as cmd:
- ProxyManager.add_read_kws_for_excel(file_ext, read_kws)
- cmd.create_statement('pd', 'df')
- func_name = ProxyManager.s_read_func_mapping[file_ext]
- getattr(pd_px, func_name)(ArgActor(file, filename), **read_kws)
-
- df = pd_px.run('df')
+ def read_data(self):
+ df = self.pd_read_proxy.run('df')
self.source_cache = df
# 表头有任何不是str,转str
@@ -150,6 +150,31 @@ class ProxyManager(object):
'''cols = [str(c) for c in df.columns]
df.columns=cols''')
+# def read_data(self, file, filename, file_ext, read_kws):
+# self.df_proxy.cmdManager.clear_all()
+# self.pd_read_proxy.cmdManager.clear_all()
+
+# pd_px = self.pd_read_proxy
+
+# with pd_px.with_cmd('导入模块') as cmd:
+# cmd.create_code_statement('import pandas as pd')
+
+# # with pd_px.with_cmd('加载数据') as cmd:
+# # ProxyManager.add_read_kws_for_excel(file_ext, read_kws)
+# # cmd.create_statement('pd', 'df')
+# # func_name = ProxyManager.s_read_func_mapping[file_ext]
+# # getattr(pd_px, func_name)(ArgActor(file, filename), **read_kws)
+
+# df = pd_px.run('df')
+# self.source_cache = df
+
+# # 表头有任何不是str,转str
+# if (df.columns.to_series().map(type) != str).any():
+# with self.df_proxy.with_cmd('表头统一转文本') as cmd:
+# cmd.create_code_statement(
+# '''cols = [str(c) for c in df.columns]
+# df.columns=cols''')
+
def get_df_data(self) -> pd.DataFrame:
self.df_proxy.set_obj_to_var('df', self.source_cache)
ret = self.df_proxy.run('df')
diff --git a/py/pdcopyist/src/cusFuns/core/Args.py b/py/pdcopyist/src/core/UIArgs.py
similarity index 40%
rename from py/pdcopyist/src/cusFuns/core/Args.py
rename to py/pdcopyist/src/core/UIArgs.py
index f38847a467789b3f9a2adfdb00932f8244fb2e46..1e4f7d4cd6f53e42d61138a39e499fd7825a87e5 100644
--- a/py/pdcopyist/src/cusFuns/core/Args.py
+++ b/py/pdcopyist/src/core/UIArgs.py
@@ -1,9 +1,20 @@
-import pandas as pd
+from pdcopyist.src.helper.utils import CanJson
from pdcopyist.src.core import Proxy
-from typing import Callable, Iterable
-from pdcopyist.src.cusFuns.core.UIModl import Content
+from typing import Callable, Dict, Iterable
+import sys
+
+
+class Content(CanJson):
+ def __init__(self, title: str, type: str, var_name: str, type_id: str, enable=True, source=None, defaultValue=None) -> None:
+ self.title = title
+ self.type = type
+ self.type_id = type_id
+ self.var_name = var_name
+ self.enable = enable
+ self.source = source
+ self.defaultValue = defaultValue
class AbcArgs(object):
@@ -12,11 +23,29 @@ class AbcArgs(object):
"""
pass
- def __init__(self, title, default=None, required=True, to_content_overwrite: Callable = None) -> None:
+ m_type_id = 0
+ m_id_type_mapping = {}
+
+ @staticmethod
+ def setup_id(class_name: str):
+ AbcArgs.m_type_id += 1
+ id = str(AbcArgs.m_type_id)
+ AbcArgs.m_id_type_mapping[id] = class_name
+ return id
+
+ @staticmethod
+ def extract_value(content_dict: Dict):
+ type_id = content_dict['content']['type_id']
+ class_name = AbcArgs.m_id_type_mapping[type_id]
+ ct = getattr(sys.modules[__name__], class_name)
+ return ct.extract_value(content_dict['content'], content_dict['input'])
+
+ def __init__(self, title, var_name=None, enable=True, default=None, required=True, to_content_overwrite: Callable = None) -> None:
self.title = title
self.default = default
self.required = required
- self.var_name: str = None
+ self.var_name: str = var_name
+ self.enable = enable
self.to_content_overwrite = to_content_overwrite
def set_var_name(self, var_name) -> 'AbcArgs':
@@ -32,11 +61,21 @@ class AbcArgs(object):
class ColumnSelect(AbcArgs):
- def __init__(self, title, default=None, required=True) -> None:
- super().__init__(title, default=default, required=required)
+ m_type_id = AbcArgs.setup_id('ColumnSelect')
+
+ @staticmethod
+ def extract_value(content_dict: Dict, input):
+ """
+ docstring
+ """
+ pass
+
+ def __init__(self, title, var_name=None, enable=True, default=None, required=True, to_content_overwrite: Callable = None) -> None:
+ super().__init__(title, var_name=var_name, enable=enable, default=default,
+ required=required, to_content_overwrite=to_content_overwrite)
def to_content(self) -> Content:
- ct = Content(self.title, 'select', self.var_name,
+ ct = Content(self.title, 'select', self.var_name, self.m_type_id, enable=self.enable,
source='data_columns', defaultValue=self.default)
return ct
@@ -46,16 +85,25 @@ class ColumnSelect(AbcArgs):
class Input(AbcArgs):
- def __init__(self, title, placeholder=None, default=None, required=True) -> None:
- super().__init__(title, default=default, required=required)
+ m_type_id = AbcArgs.setup_id('Input')
+
+ @staticmethod
+ def extract_value(content_dict: Dict, input):
+ return input
+
+ def __init__(self, title, var_name=None, placeholder=None, enable=True, default=None, required=True, to_content_overwrite: Callable = None) -> None:
+ super().__init__(title, var_name=var_name, enable=enable, default=default,
+ required=required, to_content_overwrite=to_content_overwrite)
self.placeholder = placeholder
def to_content(self) -> Content:
if self.to_content_overwrite:
return self.to_content_overwrite()
- ct = Content(self.title, 'input', self.var_name,
+ ct = Content(self.title, 'input', self.var_name, self.m_type_id, enable=self.enable,
defaultValue=self.default)
+
+ ct.placeholder = self.placeholder
return ct
def to_rule(self):
@@ -64,8 +112,15 @@ class Input(AbcArgs):
class Select(AbcArgs):
- def __init__(self, title, source, default=None, required=True) -> None:
- super().__init__(title, default=default, required=required)
+ m_type_id = AbcArgs.setup_id('Select')
+
+ @staticmethod
+ def extract_value(content_dict: Dict, input):
+ source = content_dict['source']
+ return source[input]['text']
+
+ def __init__(self, title, source, var_name=None, default=None, required=True) -> None:
+ super().__init__(title, var_name=var_name, default=default, required=required)
if isinstance(source, Iterable):
source = [{'value': i, 'text': str(v)}
@@ -76,7 +131,7 @@ class Select(AbcArgs):
if self.to_content_overwrite:
return self.to_content_overwrite()
- ct = Content(self.title, 'select', self.var_name,
+ ct = Content(self.title, 'select', self.var_name, self.m_type_id, enable=self.enable,
source=self.source, defaultValue=self.default)
return ct
@@ -86,22 +141,28 @@ class Select(AbcArgs):
class ColumnWithTypeSelect(AbcArgs):
- def __init__(self, title, default=None, required=True) -> None:
- super().__init__(title, default=default, required=required)
+ m_type_id = AbcArgs.setup_id('ColumnWithTypeSelect')
+
+ @staticmethod
+ def extract_value(content_dict: Dict, input):
+ pass
+
+ def __init__(self, title, var_name=None, default=None, required=True) -> None:
+ super().__init__(title, var_name=var_name, default=default, required=required)
def get_value(self, index: int):
- df: pd.DataFrame = Proxy.ProxyManager.get().get_last_df_cache()
+ df = Proxy.ProxyManager.get().get_last_df_cache()
col = str(df.columns[index])
return col
def to_content(self) -> Content:
- df: pd.DataFrame = Proxy.ProxyManager.get().get_last_df_cache()
+ df = Proxy.ProxyManager.get().get_last_df_cache()
cols = [f'{name}({t})' for name, t in zip(df.columns, df.dtypes)]
source = [{'value': i, 'text': str(v)}
for i, v in enumerate(cols)]
- ct = Content(self.title, 'select', self.var_name,
+ ct = Content(self.title, 'select', self.var_name, self.m_type_id, enable=self.enable,
source=source, defaultValue=self.default)
return ct
@@ -111,14 +172,20 @@ class ColumnWithTypeSelect(AbcArgs):
class Switch(AbcArgs):
- def __init__(self, title, default=None, required=True) -> None:
- super().__init__(title, default=default, required=required)
+ m_type_id = AbcArgs.setup_id('Switch')
+
+ @staticmethod
+ def extract_value(content_dict: Dict, input):
+ return input
+
+ def __init__(self, title, var_name=None, default=None, required=True) -> None:
+ super().__init__(title, var_name=var_name, default=default, required=required)
def to_content(self) -> Content:
if self.to_content_overwrite:
return self.to_content_overwrite()
- ct = Content(self.title, 'switch', self.var_name,
+ ct = Content(self.title, 'switch', self.var_name, self.m_type_id, enable=self.enable,
defaultValue=self.default)
return ct
diff --git a/py/pdcopyist/src/cusFuns/columnNameChanger/index.py b/py/pdcopyist/src/cusFuns/columnNameChanger/index.py
index 953c555fdecf85010b25fe106c4c65c191fc4f36..ad9556783102357efd9d5bf5ad9d14612543e524 100644
--- a/py/pdcopyist/src/cusFuns/columnNameChanger/index.py
+++ b/py/pdcopyist/src/cusFuns/columnNameChanger/index.py
@@ -1,6 +1,6 @@
import importlib
from pdcopyist.src.cusFuns.core.DecoratorFuns import dt_handle_func, dt_args, dt_source_code
-from pdcopyist.src.cusFuns.core import Args as ty
+from pdcopyist.src.core import UIArgs as ty
import pandas as pd
diff --git a/py/pdcopyist/src/cusFuns/columnRemover/index.py b/py/pdcopyist/src/cusFuns/columnRemover/index.py
index 44c93c3762c665a7373480373aa919ba4af0895b..929d619d443ea11fe0cdf939a4841086e9246d5b 100644
--- a/py/pdcopyist/src/cusFuns/columnRemover/index.py
+++ b/py/pdcopyist/src/cusFuns/columnRemover/index.py
@@ -1,5 +1,5 @@
from pdcopyist.src.cusFuns.core.DecoratorFuns import dt_handle_func, dt_args
-from pdcopyist.src.cusFuns.core import Args as ty
+from pdcopyist.src.core import UIArgs as ty
import pandas as pd
diff --git a/py/pdcopyist/src/cusFuns/core/DecoratorFuns.py b/py/pdcopyist/src/cusFuns/core/DecoratorFuns.py
index fb525d80c3b424a4539e6580720b8516caff6811..f65b009104de7fd119e4ef104a56f58eadaa2177 100644
--- a/py/pdcopyist/src/cusFuns/core/DecoratorFuns.py
+++ b/py/pdcopyist/src/cusFuns/core/DecoratorFuns.py
@@ -4,7 +4,7 @@ from typing import Any, Callable, List
from pdcopyist.src.cusFuns.core.UIModl import FunModel
-from pdcopyist.src.cusFuns.core.Args import AbcArgs
+from pdcopyist.src.core.UIArgs import AbcArgs
class CusFunsWrapper(object):
diff --git a/py/pdcopyist/src/cusFuns/core/UIModl.py b/py/pdcopyist/src/cusFuns/core/UIModl.py
index d6f31d08fc4ccc6d6a1a5f3d86fc4956b5e5632d..c38481d018dee397324fac6b195cf259ab352b14 100644
--- a/py/pdcopyist/src/cusFuns/core/UIModl.py
+++ b/py/pdcopyist/src/cusFuns/core/UIModl.py
@@ -1,19 +1,11 @@
+from pdcopyist.src.core.UIArgs import Content
from typing import Dict, List
from pdcopyist.src.helper.utils import CanJson
-class Content(CanJson):
- def __init__(self, title: str, type: str, var_name: str, source=None, defaultValue=None) -> None:
- self.title = title
- self.type = type
- self.var_name = var_name
- self.source = source
- self.defaultValue = defaultValue
-
-
class FunModel(CanJson):
def __init__(self, fun_name: str) -> None:
diff --git a/py/pdcopyist/src/cusFuns/exportFile/index_csv.py b/py/pdcopyist/src/cusFuns/exportFile/index_csv.py
index 4a031ebb4f62b9cc16703361643f285b648371cf..3625f51adeffc31f7fc662ca11e1d9e5c3aa3a7e 100644
--- a/py/pdcopyist/src/cusFuns/exportFile/index_csv.py
+++ b/py/pdcopyist/src/cusFuns/exportFile/index_csv.py
@@ -1,5 +1,5 @@
from pdcopyist.src.cusFuns.core.DecoratorFuns import dt_handle_func, dt_args, dt_source_code
-from pdcopyist.src.cusFuns.core import Args as ty
+from pdcopyist.src.core import UIArgs as ty
import pandas as pd
m_encoding = ['utf8', 'gb2312', 'gbk']
diff --git a/py/pdcopyist/src/cusFuns/exportFile/index_excel.py b/py/pdcopyist/src/cusFuns/exportFile/index_excel.py
index 75dbad357c0a4c09ee8a3a9b83e750706bda32ad..c26311e7f5690d46c236bcaf09530a84567ee1fe 100644
--- a/py/pdcopyist/src/cusFuns/exportFile/index_excel.py
+++ b/py/pdcopyist/src/cusFuns/exportFile/index_excel.py
@@ -1,5 +1,5 @@
from pdcopyist.src.cusFuns.core.DecoratorFuns import dt_handle_func, dt_args, dt_source_code
-from pdcopyist.src.cusFuns.core import Args as ty
+from pdcopyist.src.core import UIArgs as ty
import pandas as pd
diff --git a/py/pdcopyist/src/cusFuns/exportFile/index_feather.py b/py/pdcopyist/src/cusFuns/exportFile/index_feather.py
index 088dbf4dcf63a38b03bac0fe6464946992ceb281..cac412d8e22fdb27bab7e1a70b46e35392cf8620 100644
--- a/py/pdcopyist/src/cusFuns/exportFile/index_feather.py
+++ b/py/pdcopyist/src/cusFuns/exportFile/index_feather.py
@@ -1,5 +1,5 @@
from pdcopyist.src.cusFuns.core.DecoratorFuns import dt_handle_func, dt_args, dt_source_code
-from pdcopyist.src.cusFuns.core import Args as ty
+from pdcopyist.src.core import UIArgs as ty
import pandas as pd
diff --git a/py/pdcopyist/src/cusFuns/typeChanger/index.py b/py/pdcopyist/src/cusFuns/typeChanger/index.py
index 9828d3fccd2b187ef8f94c56b7fe3ce6490fae99..e7d9c9affdc3b0105c3b79f9cad6eb161bcfaeb9 100644
--- a/py/pdcopyist/src/cusFuns/typeChanger/index.py
+++ b/py/pdcopyist/src/cusFuns/typeChanger/index.py
@@ -1,5 +1,5 @@
from pdcopyist.src.cusFuns.core.DecoratorFuns import dt_handle_func, dt_args, dt_source_code
-from pdcopyist.src.cusFuns.core import Args as ty
+from pdcopyist.src.core import UIArgs as ty
import pandas as pd
diff --git a/py/test_json.json b/py/test_json.json
new file mode 100644
index 0000000000000000000000000000000000000000..541208ef3087e8eec884632caba5c35a72371592
--- /dev/null
+++ b/py/test_json.json
@@ -0,0 +1,36 @@
+{
+ "contents": [
+ {
+ "defaultValue": "\\u65b0\\u5efa Microsoft Excel \\u5de5\\u4f5c\\u8868.xlsx",
+ "enable": false,
+ "placeholder": null,
+ "source": null,
+ "title": "\\u6587\\u4ef6\\u540d\\uff1a",
+ "type": "input",
+ "var_name": null
+ },
+ {
+ "defaultValue": "xlsx",
+ "enable": false,
+ "placeholder": null,
+ "source": null,
+ "title": "\\u540e\\u7f00\\uff1a",
+ "type": "input",
+ "var_name": null
+ },
+ {
+ "defaultValue": null,
+ "enable": true,
+ "source": [
+ {
+ "text": "Sheet1",
+ "value": 0
+ }
+ ],
+ "title": "\\u9009\\u62e9\\u5de5\\u4f5c\\u8868\\uff1a",
+ "type": "select",
+ "var_name": "sheet_name"
+ }
+ ],
+ "model_type": "ExcelUIJsonModel"
+}
\ No newline at end of file
diff --git a/ui/src/api/index.ts b/ui/src/api/index.ts
index 17a566f847a3e911e09b9be056962e9e871caa53..4fc37c8e310accf9293488bbcba5fab8dfc61a3e 100644
--- a/ui/src/api/index.ts
+++ b/ui/src/api/index.ts
@@ -2,7 +2,7 @@ import { CmdResult } from "@/models/PandasCmdModel";
import axios, { AxiosRequestConfig } from "axios";
import * as DfFilters from "@/models/DfFilters";
-import { FileArgsType, UploadFile } from '@/models/DataLoadModel';
+import { UserInputRet, DataArgs, UploadFile } from '@/models/DataLoadModel';
import { GroupbyModel } from '@/models/GroupbyModel';
import { Command } from '@/models/CommanderModel';
import { TableHandle } from '@/models/TableHandleModel';
@@ -25,7 +25,22 @@ async function post(url: string, data?: any, config?: AxiosRequestConfig | undef
}
-export async function uploadFile(file: UploadFile, args: FileArgsType) {
+export async function getFileUiArgs(file: UploadFile) {
+ const param = new FormData();
+ param.append("file", file.file);
+
+ param.append('file_name', file.file.name)
+ param.append('ext', file.getFileExt())
+
+ const config = {
+ headers: { "Content-Type": "multipart/form-data" },
+ };
+
+ const ret = await axios.post('api/data_source/ui_args', param, config)
+ return ret.data as DataArgs
+}
+
+export async function uploadFile(file: UploadFile, args: UserInputRet) {
const param = new FormData();
param.append("file", file.file);
diff --git a/ui/src/applications/index.ts b/ui/src/applications/index.ts
index 8b98b3a9dba47cdd35cdc013bfa7f8c058293a47..81a47cb7e00ff5875085fc709aa13abbddccd768 100644
--- a/ui/src/applications/index.ts
+++ b/ui/src/applications/index.ts
@@ -11,7 +11,6 @@ import PdCmdStore from "@/store/PandasCmdStore";
import { FilterList } from '@/models/DfFilters';
-import DataLoadStore from "@/store/DataLoadStore";
import CodeBuilderStore from '@/store/CodeBuilderStore';
import PandasCmdStore from '@/store/PandasCmdStore';
import { GroupbyModel } from '@/models/GroupbyModel';
@@ -19,6 +18,7 @@ import CommandStore from '@/store/CommandStore';
import { TableHandle } from '@/models/TableHandleModel';
import { CusFunction } from "@/models/CustomizeFunctionApiModel";
import { CusFunInputRet } from "@/models/CusFuns";
+import { UploadFile, UserInputRet } from "@/models/DataLoadModel";
function initApp() {
@@ -48,14 +48,27 @@ async function updateForPandasCmd(ret: CmdResult,
}
-export async function loadDataFromFile() {
- let dls = DataLoadStore.getStateReadonly()
+// export async function loadDataFromFile() {
+// let dls = DataLoadStore.getStateReadonly()
- let ret = await api.uploadFile(dls.File, dls.Args)
- await updateForPandasCmd(ret)
- // initApp()
+// let ret = await api.uploadFile(dls.File, dls.Args)
+// await updateForPandasCmd(ret)
+// // initApp()
- await updateCodeStore()
+// await updateCodeStore()
+// }
+
+
+export async function getFileUiArgs(file: File) {
+ let ret = await api.getFileUiArgs(new UploadFile(file))
+ return ret
+}
+
+export async function uploadFile(file: File, input: UserInputRet) {
+ let ret = await api.uploadFile(new UploadFile(file), input)
+ await updateForPandasCmd(ret, async () => {
+ await updateCodeStore()
+ })
}
export async function filterByPandasQeury(queryString: string) {
diff --git a/ui/src/components/Commons/CustomizeItem.tsx b/ui/src/components/Commons/CustomizeItem.tsx
index 284409f467b757658a673ef7e146be7892dbbf95..604193df066562a6241f216bb0cb894651cb8ee0 100644
--- a/ui/src/components/Commons/CustomizeItem.tsx
+++ b/ui/src/components/Commons/CustomizeItem.tsx
@@ -1,6 +1,6 @@
import DfStore from "@/store/DfStore";
import { defineComponent, PropType, Ref } from "vue";
-import * as cfModel from "@/models/CusFuns";
+import * as uiArgs from "@/models/UIArgs";
type optType = {
value: string;
@@ -11,7 +11,7 @@ export default defineComponent({
name: "CustomizeItem",
props: {
typeMessage: {
- type: Object as PropType,
+ type: Object as PropType,
required: true,
},
@@ -43,8 +43,10 @@ export default defineComponent({
return (
);
}
@@ -60,13 +62,21 @@ export default defineComponent({
);
opts = createOptsFromSource(colsInfos, (v) => (
- {v.text}
+
+ {v.text}
+
));
} else {
opts = createOptsFromSource(
this.$props.typeMessage.source,
(v) => (
-
+
{v.text}
)
@@ -79,6 +89,7 @@ export default defineComponent({
return (
@@ -94,6 +105,7 @@ export default defineComponent({
return (
(
-
+
{v.text}
)
@@ -118,6 +134,7 @@ export default defineComponent({
return (
@@ -133,6 +150,7 @@ export default defineComponent({
return (
(
-
+
{v.text}
)
@@ -156,6 +178,7 @@ export default defineComponent({
return (
+
+
+
+
+
+
+
+
+
+ 加载
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ui/src/components/FunctionTabs/FileUpload/FileUpload.ts b/ui/src/components/FunctionTabs/FileUpload/FileUpload.ts
index b80e367128e8635497e9f3041c4016d8b0112db0..6d421531166adfedad62e872f2624921add09dfe 100644
--- a/ui/src/components/FunctionTabs/FileUpload/FileUpload.ts
+++ b/ui/src/components/FunctionTabs/FileUpload/FileUpload.ts
@@ -1,37 +1,35 @@
-import { reactive, Ref, ref } from "vue";
-import * as apps from "@/applications";
+// import { reactive, Ref, ref } from "vue";
+// import * as apps from "@/applications";
-import DataLoadStore from "@/store/DataLoadStore";
+// function useFileload() {
+// let fileArgsModalShowed = ref(false)
+// let loading = ref(false)
-function useFileload() {
- let fileArgsModalShowed = ref(false)
- let loading = ref(false)
+// function beforeUpload(file: File) {
+// DataLoadStore.setFile(file)
+// fileArgsModalShowed.value = true
+// return false
+// }
- function beforeUpload(file: File) {
- DataLoadStore.setFile(file)
- fileArgsModalShowed.value = true
- return false
- }
+// async function onOk() {
+// loading.value = true
+// await apps.loadDataFromFile()
+// loading.value = false
+// fileArgsModalShowed.value = false
+// }
- async function onOk() {
- loading.value = true
- await apps.loadDataFromFile()
- loading.value = false
- fileArgsModalShowed.value = false
- }
+// return {
+// beforeUpload,
+// fileArgsModalShowed, onOk, loading
+// }
+// }
- return {
- beforeUpload,
- fileArgsModalShowed, onOk, loading
- }
-}
-
-export default useFileload
\ No newline at end of file
+// export default useFileload
\ No newline at end of file
diff --git a/ui/src/components/FunctionTabs/FileUpload/Modal.ts b/ui/src/components/FunctionTabs/FileUpload/Modal.ts
deleted file mode 100644
index 14fbb19c639c34c0d986838ff1a09af28385a61e..0000000000000000000000000000000000000000
--- a/ui/src/components/FunctionTabs/FileUpload/Modal.ts
+++ /dev/null
@@ -1,24 +0,0 @@
-import { reactive, ref } from "vue";
-import * as apps from "@/applications";
-import { UploadFile } from '@/models/UploadFile';
-
-
-export default function useModal(file: UploadFile) {
-
- let fileArgsModalShowed = ref(false)
- const m_file = file
-
- async function onOk() {
- // await apps.loadDataFromFile(m_file)
- }
-
-
-
- return {
- fileArgsModalShowed, onOk
- }
-}
-
-
-
-
diff --git a/ui/src/components/FunctionTabs/FileUpload/index.vue b/ui/src/components/FunctionTabs/FileUpload/index.vue
index 028f8a89ce103c42cfdc9eb7491f10b3b1a5b95e..dd51acb0bd97aa230e5d9cbb89446a17e3b91ea9 100644
--- a/ui/src/components/FunctionTabs/FileUpload/index.vue
+++ b/ui/src/components/FunctionTabs/FileUpload/index.vue
@@ -6,86 +6,68 @@
点击或拖拽文件到这里
+
-
-
-
-
-
-
-
-
-
-
-
-
-
- 加载
-
-
+
+
-// :http-request="upload"
-