chatTable.vue 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. <template>
  2. <div class="gva-table-box">
  3. <warning-bar title="使用GPT-3.5模型,存在一定不稳定性,成功率为50%左右,使用GPT-4可以极大提升成功率,但是费用较高。" />
  4. <div v-if="!chatToken">
  5. <el-input
  6. v-model="skObj.sk"
  7. class="query-ipt"
  8. placeholder="请输入您的ChatGpt SK"
  9. clearable
  10. />
  11. <el-button
  12. type="primary"
  13. @click="save"
  14. >保存</el-button>
  15. <div class="secret">
  16. <el-empty description="请到gpt网站获取您的sk:https://platform.openai.com/account/api-keys" />
  17. </div>
  18. </div>
  19. <div v-else>
  20. <el-form
  21. :model="form"
  22. label-width="120px"
  23. >
  24. <el-form-item label="删除当前sk:">
  25. <el-popover
  26. placement="top"
  27. width="160"
  28. >
  29. <p>确定要删除并返回吗?</p>
  30. <div style="text-align: right; margin-top: 8px;">
  31. <el-button
  32. type="primary"
  33. @click="deleteSK"
  34. >确定</el-button>
  35. </div>
  36. <template #reference>
  37. <el-button
  38. type="primary"
  39. link
  40. icon="delete"
  41. >删除</el-button>
  42. </template>
  43. </el-popover>
  44. </el-form-item>
  45. <el-form-item label="查询db名称:">
  46. <el-select
  47. v-model="form.dbname"
  48. placeholder="请选择库"
  49. style="width: 115px"
  50. >
  51. <el-option
  52. v-for="(item, index) in dbArr"
  53. :key="index"
  54. :label="item.database"
  55. :value="item.database"
  56. />
  57. </el-select>
  58. </el-form-item>
  59. <el-form-item label="查询db描述:">
  60. <el-input
  61. v-model="form.chat"
  62. :autosize="{ minRows: 2, maxRows: 4 }"
  63. type="textarea"
  64. clearable
  65. placeholder="请输入对话"
  66. />
  67. </el-form-item>
  68. <el-form-item label="GPT生成SQL:">
  69. <el-input
  70. v-model="sql"
  71. :autosize="{ minRows: 2, maxRows: 4 }"
  72. type="textarea"
  73. disabled
  74. placeholder="此处展示自动生成的sql"
  75. />
  76. </el-form-item>
  77. <el-button
  78. type="primary"
  79. @click="handleQueryTable"
  80. >查询</el-button>
  81. </el-form>
  82. <div class="tables">
  83. <el-table
  84. v-if="tableData.length"
  85. ref="multipleTable"
  86. :data="tableData"
  87. style="width: 100%"
  88. tooltip-effect="dark"
  89. height="400px"
  90. >
  91. <el-table-column
  92. v-for="(item, index) in tableData[0]"
  93. :key="index"
  94. :prop="index"
  95. :label="index"
  96. min-width="200"
  97. show-overflow-tooltip
  98. />
  99. </el-table>
  100. <p
  101. v-else
  102. class="text"
  103. >请在对话框输入你需要AI帮你查询的内容:)</p>
  104. </div>
  105. </div>
  106. </div>
  107. </template>
  108. <script setup>
  109. import WarningBar from '@/components/warningBar/warningBar.vue'
  110. import { getTableApi,
  111. createSKApi,
  112. getSKApi,
  113. deleteSKApi } from '@/api/chatgpt'
  114. import { getDB as getDBAPI } from '@/api/autoCode'
  115. import { ref, reactive } from 'vue'
  116. const chatToken = ref(null)
  117. const skObj = reactive({
  118. sk: '',
  119. })
  120. const sql = ref('')
  121. const getSK = async() => {
  122. const res = await getSKApi()
  123. chatToken.value = res.data.ok
  124. }
  125. const getDB = async() => {
  126. const res = await getDBAPI()
  127. if (res.code === 0) {
  128. dbArr.value = res.data.dbs
  129. }
  130. }
  131. getSK()
  132. getDB()
  133. const save = async() => {
  134. const res = await createSKApi(skObj)
  135. if (res.code === 0) {
  136. await getSK()
  137. }
  138. }
  139. const deleteSK = async() => {
  140. const res = await deleteSKApi()
  141. if (res.code === 0) {
  142. await getSK()
  143. }
  144. }
  145. const form = ref({
  146. dbname: '',
  147. chat: '',
  148. })
  149. const dbArr = ref([])
  150. const tableData = ref([])
  151. const handleQueryTable = async() => {
  152. const res = await getTableApi(form.value)
  153. if (res.code === 0) {
  154. tableData.value = res.data.results || []
  155. }
  156. sql.value = res.data.sql
  157. // 根据后台返回值动态渲染表格
  158. }
  159. </script>
  160. <style scoped lang="scss">
  161. .secret{
  162. padding: 30px;
  163. margin-top: 20px;
  164. background: #F5F5F5;
  165. p {
  166. line-height: 30px;
  167. }
  168. }
  169. .query-ipt{
  170. width: 300px;
  171. margin-right: 30px;
  172. }
  173. .content{
  174. p {
  175. font-size: 16px;
  176. line-height: 20px;
  177. }
  178. padding: 10px;
  179. width: 100%;
  180. background: #F5F5F5;
  181. margin-top: 30px;
  182. }
  183. .tables{
  184. width: 100%;
  185. margin-top: 30px;
  186. .text{
  187. font-size: 18px;
  188. color: #6B7687;
  189. text-align: center;
  190. }
  191. }
  192. </style>