diff --git a/backend/apps/chat/curd/chat.py b/backend/apps/chat/curd/chat.py index 8338cf2b..2d573070 100644 --- a/backend/apps/chat/curd/chat.py +++ b/backend/apps/chat/curd/chat.py @@ -60,7 +60,7 @@ def get_chat_predict_data(session: SessionDep, chart_record_id: int): res = session.query(ChatRecord).options(load_only(ChatRecord.predict_data)).get(chart_record_id) if res: try: - return orjson.loads(res.data) + return orjson.loads(res.predict_data) except Exception: pass return '' diff --git a/backend/apps/datasource/api/datasource.py b/backend/apps/datasource/api/datasource.py index 7642c221..99adf2a1 100644 --- a/backend/apps/datasource/api/datasource.py +++ b/backend/apps/datasource/api/datasource.py @@ -18,12 +18,14 @@ from ..models.datasource import CoreDatasource, CreateDatasource, TableObj, Core router = APIRouter(tags=["datasource"], prefix="/datasource") path = "/opt/sqlbot/data/excel" + @router.get("/ws/{oid}", include_in_schema=False) async def query_by_oid(session: SessionDep, user: CurrentUser, oid: int) -> List[CoreDatasource]: if not user.isAdmin: raise Exception("no permission to execute") return get_datasource_list(session=session, user=user, oid=oid) + @router.get("/list") async def datasource_list(session: SessionDep, user: CurrentUser): return get_datasource_list(session=session, user=user) @@ -134,32 +136,11 @@ async def upload_excel(session: SessionDep, file: UploadFile = File(...)): with open(save_path, "wb") as f: f.write(await file.read()) - conn = get_data_engine() sheets = [] - if filename.endswith(".csv"): - df = pd.read_csv(save_path) - tableName = f"sheet1_{hashlib.sha256(uuid.uuid4().bytes).hexdigest()[:10]}" - sheets.append({"tableName": tableName, "tableComment": ""}) - column_len = len(df.dtypes) - fields = [] - for i in range(column_len): - # build fields - fields.append({"name": df.columns[i], "type": str(df.dtypes[i]), "relType": ""}) - # create table - create_table(conn, tableName, fields) - - data = [ - {df.columns[i]: None if pd.isna(row[i]) else (int(row[i]) if "int" in str(df.dtypes[i]) else row[i]) - for i in range(len(row))} - for row in df.values - ] - # insert data - insert_data(conn, tableName, fields, data) - else: - df_sheets = pd.read_excel(save_path, sheet_name=None) - # build columns and data to insert db - for sheet_name, df in df_sheets.items(): - tableName = f"{sheet_name}_{hashlib.sha256(uuid.uuid4().bytes).hexdigest()[:10]}" + with get_data_engine() as conn: + if filename.endswith(".csv"): + df = pd.read_csv(save_path) + tableName = f"sheet1_{hashlib.sha256(uuid.uuid4().bytes).hexdigest()[:10]}" sheets.append({"tableName": tableName, "tableComment": ""}) column_len = len(df.dtypes) fields = [] @@ -176,7 +157,27 @@ async def upload_excel(session: SessionDep, file: UploadFile = File(...)): ] # insert data insert_data(conn, tableName, fields, data) - conn.close() + else: + df_sheets = pd.read_excel(save_path, sheet_name=None) + # build columns and data to insert db + for sheet_name, df in df_sheets.items(): + tableName = f"{sheet_name}_{hashlib.sha256(uuid.uuid4().bytes).hexdigest()[:10]}" + sheets.append({"tableName": tableName, "tableComment": ""}) + column_len = len(df.dtypes) + fields = [] + for i in range(column_len): + # build fields + fields.append({"name": df.columns[i], "type": str(df.dtypes[i]), "relType": ""}) + # create table + create_table(conn, tableName, fields) + + data = [ + {df.columns[i]: None if pd.isna(row[i]) else (int(row[i]) if "int" in str(df.dtypes[i]) else row[i]) + for i in range(len(row))} + for row in df.values + ] + # insert data + insert_data(conn, tableName, fields, data) os.remove(save_path) return {"filename": filename, "sheets": sheets} diff --git a/backend/apps/system/api/user.py b/backend/apps/system/api/user.py index 9d9644cd..825679cf 100644 --- a/backend/apps/system/api/user.py +++ b/backend/apps/system/api/user.py @@ -153,7 +153,7 @@ async def update(session: SessionDep, editor: UserEditor, trans: Trans): raise Exception(f"User with id [{editor.id}] not found!") if editor.account != user_model.account: raise Exception(f"account cannot be changed!") - if editor.email != user_model.email and check_email_exists(session=session, account=editor.email): + if editor.email != user_model.email and check_email_exists(session=session, email=editor.email): raise Exception(trans('i18n_exist', msg = f"{trans('i18n_user.email')} [{editor.email}]")) if not check_email_format(editor.email): raise Exception(trans('i18n_format_invalid', key = f"{trans('i18n_user.email')} [{editor.email}]")) diff --git a/backend/template.yaml b/backend/template.yaml index bc0e1fb4..a88989f7 100644 --- a/backend/template.yaml +++ b/backend/template.yaml @@ -138,7 +138,7 @@ template: predict: system: | ### 说明: - 你是一个数据分析师,你的任务是根据给定的数据进行数据预测,我将以json格式给你一组数据,你帮我预测之后的数据(一段可以展示趋势的数据,至少2个周期),用json格式返回,返回的格式需要与传入的数据格式保持一致。 + 你是一个数据分析师,你的任务是根据给定的数据进行数据预测,我将以json格式给你一组数据,你帮我预测之后的数据(一段可以展示趋势的数据,至少2个周期),用json数组的格式返回,返回的格式需要与传入的数据格式保持一致。 ```json 无法预测或者不支持预测的数据请直接返回(不需要返回JSON格式):"抱歉,该数据无法进行预测。(有原因则返回无法预测的原因)" diff --git a/frontend/src/components/layout/PwdForm.vue b/frontend/src/components/layout/PwdForm.vue index 4d46f7b8..465a8138 100644 --- a/frontend/src/components/layout/PwdForm.vue +++ b/frontend/src/components/layout/PwdForm.vue @@ -85,6 +85,7 @@ defineExpose({ v-model="pwdForm.pwd" :placeholder="t('common.please_input', { msg: t('user.upgrade_pwd.old_pwd') })" type="password" + clearable show-password /> @@ -94,6 +95,7 @@ defineExpose({ :placeholder="t('common.please_input', { msg: t('user.upgrade_pwd.new_pwd') })" type="password" show-password + clearable /> @@ -102,6 +104,7 @@ defineExpose({ :placeholder="t('common.please_input', { msg: t('user.upgrade_pwd.confirm_pwd') })" type="password" show-password + clearable /> diff --git a/frontend/src/views/chat/ChatList.vue b/frontend/src/views/chat/ChatList.vue index a3b4e732..d81353b2 100644 --- a/frontend/src/views/chat/ChatList.vue +++ b/frontend/src/views/chat/ChatList.vue @@ -264,6 +264,7 @@ const handleConfirmPassword = () => { :placeholder=" $t('datasource.please_enter') + $t('common.empty') + $t('qa.conversation_title') " + clearable autocomplete="off" /> diff --git a/frontend/src/views/chat/component/ChartComponent.vue b/frontend/src/views/chat/component/ChartComponent.vue index 706692c3..cdca076c 100644 --- a/frontend/src/views/chat/component/ChartComponent.vue +++ b/frontend/src/views/chat/component/ChartComponent.vue @@ -48,11 +48,11 @@ let chartInstance: BaseChart | undefined function renderChart() { chartInstance = getChartInstance(params.type, chartId.value) - console.log(chartInstance) if (chartInstance) { chartInstance.init(axis.value, params.data) chartInstance.render() } + console.debug(chartInstance) } function destroyChart() { diff --git a/frontend/src/views/chat/index.vue b/frontend/src/views/chat/index.vue index 18ca1879..ca5a773f 100644 --- a/frontend/src/views/chat/index.vue +++ b/frontend/src/views/chat/index.vue @@ -290,6 +290,7 @@ ref="inputRef" v-model="inputMessage" :disabled="isTyping" + clearable class="input-area" type="textarea" :rows="1" @@ -590,7 +591,7 @@ function getChatPredictData(recordId?: number) { chatApi.get_chart_predict_data(recordId).then((response) => { currentChat.value.records.forEach((record) => { if (record.id === recordId) { - record.predict_data = response.data ?? [] + record.predict_data = response ?? [] } }) }) diff --git a/frontend/src/views/dashboard/common/ResourceGroupOpt.vue b/frontend/src/views/dashboard/common/ResourceGroupOpt.vue index d71353c7..f552b15e 100644 --- a/frontend/src/views/dashboard/common/ResourceGroupOpt.vue +++ b/frontend/src/views/dashboard/common/ResourceGroupOpt.vue @@ -185,6 +185,7 @@ defineExpose({ diff --git a/frontend/src/views/dashboard/components/sq-tab/index.vue b/frontend/src/views/dashboard/components/sq-tab/index.vue index 652026b1..69cc8847 100644 --- a/frontend/src/views/dashboard/components/sq-tab/index.vue +++ b/frontend/src/views/dashboard/components/sq-tab/index.vue @@ -264,7 +264,12 @@ defineExpose({ :close-on-click-modal="false" center > - +