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" -