editTable.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333
  1. <template>
  2. <el-card>
  3. <el-row type="flex" :gutter="10" class="mb8" justify="end">
  4. <el-col :span="1.5">
  5. <el-button
  6. type="warning"
  7. plain
  8. icon="el-icon-plus"
  9. size="mini"
  10. @click="handleAdd"
  11. v-hasPermi="['system:post:add']"
  12. >新增</el-button>
  13. </el-col>
  14. <el-col :span="1.5">
  15. <el-button
  16. type="danger"
  17. plain
  18. icon="el-icon-delete"
  19. size="mini"
  20. :disabled="multiple"
  21. @click="handleDelete"
  22. v-hasPermi="['system:post:remove']"
  23. >删除</el-button>
  24. </el-col>
  25. <!-- <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar> -->
  26. </el-row>
  27. <el-tabs v-model="activeName">
  28. <el-tab-pane label="基本信息" name="basic">
  29. <basic-info-form ref="basicInfo" :info="info" />
  30. </el-tab-pane>
  31. <el-tab-pane label="字段信息" name="cloum">
  32. <el-table ref="dragTable" :data="cloumns" row-key="columnId" :max-height="tableHeight" @selection-change="handleSelectionChange">
  33. <el-table-column type="selection" width="55" align="center" />
  34. <el-table-column label="序号" type="index" min-width="5%" class-name="allowDrag" />
  35. <el-table-column
  36. label="字段列名"
  37. prop="columnName"
  38. min-width="10%"
  39. :show-overflow-tooltip="true"
  40. />
  41. <el-table-column label="字段描述" min-width="10%">
  42. <template slot-scope="scope">
  43. <el-input v-model="scope.row.columnComment"></el-input>
  44. </template>
  45. </el-table-column>
  46. <el-table-column
  47. label="物理类型"
  48. prop="columnType"
  49. min-width="10%"
  50. :show-overflow-tooltip="true"
  51. />
  52. <el-table-column label="字段显示规则" align="center" prop="mask" min-width="11%"/>
  53. <el-table-column label="排序" min-width="8%" align="center" prop="sort"/>
  54. <el-table-column label="输入字段" min-width="10%">
  55. <template slot-scope="scope">
  56. <el-checkbox true-label="1" v-model="scope.row.isIn"></el-checkbox>
  57. </template>
  58. </el-table-column>
  59. <el-table-column label="显示字段" min-width="10%">
  60. <template slot-scope="scope">
  61. <el-checkbox true-label="1" v-model="scope.row.isOut"></el-checkbox>
  62. </template>
  63. </el-table-column>
  64. <el-table-column label="查询" min-width="8%">
  65. <template slot-scope="scope">
  66. <el-checkbox true-label="1" v-model="scope.row.isQuery"></el-checkbox>
  67. </template>
  68. </el-table-column>
  69. <el-table-column label="关联HR字段" min-width="10%" align="center" prop="hrParentId"/>
  70. <el-table-column label="缺省值" min-width="10%" align="center" prop="defaultValue"/>
  71. <el-table-column label="外键" min-width="10%" align="center" prop="foreignKey"/>
  72. <el-table-column label="必填" min-width="8%">
  73. <template slot-scope="scope">
  74. <el-checkbox true-label="1" v-model="scope.row.isRequired"></el-checkbox>
  75. </template>
  76. </el-table-column>
  77. <el-table-column label="显示类型" min-width="12%">
  78. <template slot-scope="scope">
  79. <el-select v-model="scope.row.htmlType">
  80. <el-option label="文本框" value="input" />
  81. <el-option label="文本域" value="textarea" />
  82. <el-option label="下拉框" value="select" />
  83. <el-option label="单选框" value="radio" />
  84. <el-option label="复选框" value="checkbox" />
  85. <el-option label="日期控件" value="datetime" />
  86. <el-option label="图片上传" value="imageUpload" />
  87. <el-option label="文件上传" value="fileUpload" />
  88. <el-option label="富文本控件" value="editor" />
  89. </el-select>
  90. </template>
  91. </el-table-column>
  92. <el-table-column label="字典类型" min-width="12%">
  93. <template slot-scope="scope">
  94. <el-select v-model="scope.row.dictType" clearable filterable placeholder="请选择">
  95. <el-option
  96. v-for="dict in dictOptions"
  97. :key="dict.dictType"
  98. :label="dict.dictName"
  99. :value="dict.dictType">
  100. <span style="float: left">{{ dict.dictName }}</span>
  101. <span style="float: right; color: #8492a6; font-size: 13px">{{ dict.dictType }}</span>
  102. </el-option>
  103. </el-select>
  104. </template>
  105. </el-table-column>
  106. </el-table>
  107. </el-tab-pane>
  108. <!-- <el-tab-pane label="生成信息" name="genInfo">
  109. <gen-info-form ref="genInfo" :info="info" :tables="tables" :menus="menus"/>
  110. </el-tab-pane> -->
  111. <el-tab-pane label="关联表" name="genInfo">
  112. <el-row style="margin-bottom: 20px;">
  113. <el-col :span="12">
  114. <el-button style="background-color: #1591FF;color: #fff;border: 1px solid #1591FF;">保存</el-button>
  115. <el-button style="background-color: #fff;color: #5B636C;border: 1px solid #ECECEC;">返回</el-button>
  116. </el-col>
  117. <el-col :span="12" style="text-align: right;">
  118. <el-button style="background-color: #FFE9ED;color: #E58481;border: 1px solid #E58481;">新增</el-button>
  119. <el-button style="background-color: #FFD6B0;color: #EA551A;border: 1px solid #F4AD6B;">删除</el-button>
  120. </el-col>
  121. </el-row>
  122. <el-table ref="dragTable" :data="cloumns" row-key="columnId" :max-height="tableHeight">
  123. <el-table-column label="序号" type="index" min-width="5%" class-name="allowDrag" />
  124. <el-table-column label="可用" type="index" min-width="5%" class-name="allowDrag" />
  125. <el-table-column label="序号" type="index" min-width="5%" class-name="allowDrag" />
  126. <el-table-column label="描述" type="index" min-width="5%" class-name="allowDrag" />
  127. <el-table-column label="关联表" type="index" min-width="5%" class-name="allowDrag" />
  128. <el-table-column label="字段(关联到主表PK)" type="index" min-width="5%" class-name="allowDrag" />
  129. <el-table-column label="显示条件" type="index" min-width="5%" class-name="allowDrag" />
  130. <el-table-column label="关联方式" type="index" min-width="5%" class-name="allowDrag" />
  131. <el-table-column label="内嵌编辑" type="index" min-width="5%" class-name="allowDrag" />
  132. <el-table-column label="修改人" type="index" min-width="5%" class-name="allowDrag" />
  133. <el-table-column label="修改时间" type="index" min-width="5%" class-name="allowDrag" />
  134. </el-table>
  135. </el-tab-pane>
  136. <el-tab-pane label="数据库SQL" name="genSql">
  137. <el-row>
  138. <el-button style="background-color: #FFE9ED;color: #E58481;border: 1px solid #E58481;">执行创建语句</el-button>
  139. <el-button style="background-color: #FFD6B0;color: #EA551A;border: 1px solid #F4AD6B;">刷新创建语句</el-button>
  140. </el-row>
  141. <el-form>
  142. <el-form-item label="创建语句:" style="margin-top: 20px;">
  143. <el-input style="resize: none;width: 600px;" type="textarea":rows="3"></el-input>
  144. </el-form-item>
  145. <el-form-item label="修改日志:">
  146. <el-input style="resize: none;width: 600px;" type="textarea":rows="3"></el-input>
  147. </el-form-item>
  148. </el-form>
  149. </el-tab-pane>
  150. </el-tabs>
  151. <el-form label-width="100px">
  152. <el-form-item style="text-align: center;margin-left:-100px;margin-top:10px;">
  153. <el-button type="primary" @click="submitForm()">提交</el-button>
  154. <el-button @click="close()">返回</el-button>
  155. </el-form-item>
  156. </el-form>
  157. <!-- 添加或修改岗位对话框 -->
  158. <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
  159. <el-form ref="form" :model="form" :rules="rules" label-width="80px">
  160. <el-form-item label="描述:" prop="postName">
  161. <el-input v-model="form.postName" placeholder="请输入岗位名称" />
  162. </el-form-item>
  163. <el-form-item label="关联表:" prop="postCode">
  164. <el-input v-model="form.postCode" placeholder="请输入编码名称" />
  165. </el-form-item>
  166. <el-form-item label="字段(关联到主表PK):" prop="postSort">
  167. <el-input-number v-model="form.postSort" controls-position="right" :min="0" />
  168. </el-form-item>
  169. <el-form-item label="显示条件:" prop="postSort">
  170. <el-input-number v-model="form.postSort" controls-position="right" :min="0" />
  171. </el-form-item>
  172. <el-form-item label="关联方式:" prop="postSort">
  173. <el-input-number v-model="form.postSort" controls-position="right" :min="0" />
  174. </el-form-item>
  175. <el-form-item label="内嵌编辑:" prop="postSort">
  176. <el-input-number v-model="form.postSort" controls-position="right" :min="0" />
  177. </el-form-item>
  178. <el-form-item label="序号:" prop="status">
  179. </el-form-item>
  180. <el-form-item label="可用:" prop="remark">
  181. <el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
  182. </el-form-item>
  183. </el-form>
  184. <div slot="footer" class="dialog-footer">
  185. <el-button type="primary" @click="submitForm">确 定</el-button>
  186. <el-button @click="cancel">取 消</el-button>
  187. </div>
  188. </el-dialog>
  189. </el-card>
  190. </template>
  191. <script>
  192. import { getGenTable, updateGenTable, delPost} from "@/api/tool/gen";
  193. import { optionselect as getDictOptionselect } from "@/api/system/dict/type";
  194. import { listMenu as getMenuTreeselect } from "@/api/system/menu";
  195. import basicInfoForm from "./basicInfoForm";
  196. import genInfoForm from "./genInfoForm";
  197. import Sortable from 'sortablejs'
  198. export default {
  199. name: "GenEdit",
  200. components: {
  201. basicInfoForm,
  202. genInfoForm
  203. },
  204. data() {
  205. return {
  206. title: "新增关联表",
  207. open: false,
  208. form: {},
  209. rules: {},
  210. // 选中选项卡的 name
  211. activeName: "cloum",
  212. // 表格的高度
  213. tableHeight: document.documentElement.scrollHeight - 245 + "px",
  214. // 表信息
  215. tables: [],
  216. // 表列信息
  217. cloumns: [],
  218. // 字典信息
  219. dictOptions: [],
  220. // 菜单信息
  221. menus: [],
  222. // 表详细信息
  223. info: {},
  224. // 选中数组
  225. ids: [],
  226. // 非单个禁用
  227. single: true,
  228. // 非多个禁用
  229. multiple: true,
  230. };
  231. },
  232. created() {
  233. const tableId = this.$route.params && this.$route.params.tableId;
  234. if (tableId) {
  235. // 获取表详细信息
  236. getGenTable(tableId).then(res => {
  237. this.cloumns = res.data.rows;
  238. this.info = res.data.info;
  239. this.tables = res.data.tables;
  240. });
  241. /** 查询字典下拉列表 */
  242. getDictOptionselect().then(response => {
  243. this.dictOptions = response.data;
  244. });
  245. /** 查询菜单下拉列表 */
  246. getMenuTreeselect().then(response => {
  247. this.menus = this.handleTree(response.data, "menuId");
  248. });
  249. }
  250. },
  251. methods: {
  252. /** 提交按钮 */
  253. submitForm() {
  254. const basicForm = this.$refs.basicInfo.$refs.basicInfoForm;
  255. const genForm = this.$refs.genInfo.$refs.genInfoForm;
  256. // console.log(basicForm)
  257. Promise.all([basicForm, genForm].map(this.getFormPromise)).then(res => {
  258. const validateResult = res.every(item => !!item);
  259. if (validateResult) {
  260. const genTable = Object.assign({}, basicForm.model, genForm.model);
  261. genTable.columns = this.cloumns;
  262. genTable.params = {
  263. treeCode: genTable.treeCode,
  264. treeName: genTable.treeName,
  265. treeParentCode: genTable.treeParentCode,
  266. parentMenuId: genTable.parentMenuId
  267. };
  268. updateGenTable(genTable).then(res => {
  269. this.msgSuccess(res.msg);
  270. if (res.code === 200) {
  271. this.close();
  272. }
  273. });
  274. } else {
  275. this.msgError("表单校验未通过,请重新检查提交内容");
  276. }
  277. });
  278. },
  279. getFormPromise(form) {
  280. return new Promise(resolve => {
  281. form.validate(res => {
  282. resolve(res);
  283. });
  284. });
  285. },
  286. /** 关闭按钮 */
  287. close() {
  288. this.$store.dispatch("tagsView/delView", this.$route);
  289. this.$router.push({ path: "/tool/gen", query: { t: Date.now()}})
  290. },
  291. // 多选框选中数据
  292. handleSelectionChange(selection) {
  293. console.log(selection)
  294. this.ids = selection.map(item => item.columnId)
  295. this.single = selection.length!=1
  296. this.multiple = !selection.length
  297. console.log(this.ids)
  298. },
  299. /** 删除按钮操作 */
  300. handleDelete(row) {
  301. const ids = row.id || this.ids;
  302. this.$confirm('是否确认删除岗位编号为"' + ids + '"的数据项?', "警告", {
  303. confirmButtonText: "确定",
  304. cancelButtonText: "取消",
  305. type: "warning"
  306. }).then(function() {
  307. return delPost(ids);
  308. }).then(() => {
  309. this.getList();
  310. this.msgSuccess("删除成功");
  311. })
  312. },
  313. handleAdd(){
  314. }
  315. },
  316. mounted() {
  317. const el = this.$refs.dragTable.$el.querySelectorAll(".el-table__body-wrapper > table > tbody")[0];
  318. const sortable = Sortable.create(el, {
  319. handle: ".allowDrag",
  320. onEnd: evt => {
  321. const targetRow = this.cloumns.splice(evt.oldIndex, 1)[0];
  322. this.cloumns.splice(evt.newIndex, 0, targetRow);
  323. for (let index in this.cloumns) {
  324. this.cloumns[index].sort = parseInt(index) + 1;
  325. }
  326. }
  327. });
  328. }
  329. };
  330. </script>