index.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343
  1. <template>
  2. <div style="width: 100%;background-color: #F7F7F7;padding-top: 1%;display: flex;" :style="{'height':heightAll+'px'}">
  3. <div style="width: 10%;;">
  4. <Plus style="width: 1em; height: 1em; margin-left:90%;cursor: pointer;color: #337ecc;" @click="showAddTree"/>
  5. <el-tree :data="data" :props="defaultProps" @node-click="handleNodeClick" style="margin-left: 1%;background-color: #F7F7F7;width: 100%;" default-expand-all>
  6. <template #default="{ node, data }">
  7. <span class="custom-tree-node">
  8. <span>{{ node.label }}</span>
  9. <span>
  10. <el-button type="primary" @click="editTree(node, data)" text size="mini" style="margin-left: 15%;">编辑</el-button>
  11. <el-button type="danger" @click="delTree(node, data)" text size="mini" style="margin-left: -17%;">删除</el-button>
  12. </span>
  13. </span>
  14. </template>
  15. </el-tree>
  16. </div>
  17. <div style="width: 87%;">
  18. <el-button type="primary" @click="showAdd" size="mini" style="margin-left: 98.5%;">新增</el-button>
  19. <el-table
  20. :data="tableData"
  21. style="width: 100%;margin-left: 2%;margin-top: 0.5%;"
  22. :cell-style="{ textAlign: 'center', }"
  23. :header-cell-style="{ textAlign: 'center'}"
  24. :row-style="{ height: heightAll*0.01+'px',fontSize: '16px',textAlign:'center' }"
  25. border
  26. :height="tableheight">
  27. <el-table-column type="index" label="序号" width="80"></el-table-column>
  28. <el-table-column prop="itemName" label="字段名称:">
  29. </el-table-column>
  30. <el-table-column prop="itemEn" label="英文名称" width="160"/>
  31. <el-table-column prop="itemTp" label="字段数据项类型" width="160"/>
  32. <el-table-column prop="itemDataTp" label="字段数据类型" width="160"/>
  33. <el-table-column prop="itemDefaultVal" label="默认值" width="140">
  34. </el-table-column>
  35. <el-table-column prop="itemUnit" label="单位" width="140">
  36. </el-table-column>
  37. <el-table-column prop="itemNotes" label="备注" width="170"/>
  38. <el-table-column prop="address" label="操作" width="222">
  39. <template #default="scope">
  40. <div style="display: flex;justify-content: space-between;width: 100%;">
  41. <el-button type="primary" @click="showEdit(scope.row)" size="mini" text style="margin-left: 1%;">编辑</el-button>
  42. <!-- <el-button type="danger" text size="mini" style="margin-left: -5%;" @click="handleDelete(scope.row)">注销</el-button> -->
  43. <el-button @click="showDe(scope.row)" type="primary" text size="mini" style="margin-left: 1%;">查看</el-button>
  44. <el-button @click="delRow(scope.row)" type="danger" text size="mini" style="margin-left: 1%;">删除</el-button>
  45. </div>
  46. </template>
  47. </el-table-column>
  48. </el-table>
  49. <div style="float: right;margin-top: 1%;margin-right: 1%;">
  50. <el-pagination
  51. small
  52. v-model='currentPage'
  53. @current-change="changePage"
  54. background
  55. layout="prev, pager, next"
  56. :total="total"
  57. class="mt-4"
  58. />
  59. </div>
  60. </div>
  61. </div>
  62. <el-dialog :title="title" @close="clearForm" v-model="dialogVisible" title="" width="30%" destroy-on-close :key="tableKey">
  63. <el-form :disabled="isEdit" style="margin-left: 5%;margin-top: 2%;" :model="formZu" class="demo-form-inline" ref="formRefZu" :rules="rulesZu">
  64. <el-form-item label="字段名称:" prop="itemName" style="margin-left: -2%;">
  65. <el-input v-model="formZu.itemName" style="width: 75%;" placeholder="" resize="none"/>
  66. </el-form-item>
  67. <el-form-item label="英文名称:" prop="itemEn" style="margin-left: -2%;">
  68. <el-input v-model="formZu.itemEn" style="width: 75%;" placeholder="" resize="none"/>
  69. </el-form-item>
  70. <el-form-item label="字段数据项类型:" prop="itemTp" style="margin-left: -2%;">
  71. <el-input v-model="formZu.itemTp" style="width: 75%;" placeholder="" resize="none"/>
  72. </el-form-item>
  73. <el-form-item label="字段数据类型:" prop="itemDataTp" style="margin-left: -2%;">
  74. <el-input v-model="formZu.itemDataTp" style="width: 75%;" placeholder="" resize="none"/>
  75. </el-form-item>
  76. <el-form-item label="默认值:" prop="itemDefaultVal" style="margin-left: -2%;">
  77. <el-input v-model="formZu.itemDefaultVal" style="width: 75%;" placeholder="" resize="none"/>
  78. </el-form-item>
  79. <el-form-item label="单位:" prop="itemUnit">
  80. <el-input v-model="formZu.itemUnit" style="width: 75%;" placeholder="" resize="none"/>
  81. </el-form-item>
  82. <el-form-item label="备注:" prop="itemNotes">
  83. <el-input v-model="formZu.itemNotes" style="width: 75%;" placeholder="" resize="none"/>
  84. </el-form-item>
  85. </el-form>
  86. <template #footer>
  87. <span class="dialog-footer">
  88. <el-button size="mini" @click="dialogVisible = false">取消</el-button>
  89. <el-button v-if="isAddTa" type="primary" @click="addTa" size="mini">
  90. 提交
  91. </el-button>
  92. <el-button v-if="!isAddTa" type="primary" @click="saveEditTa" size="mini">
  93. 提交
  94. </el-button>
  95. </span>
  96. </template>
  97. </el-dialog>
  98. <el-dialog @close="clearFromTree" :title="titleTree" v-model="dialogVisibleTree" title="" width="30%" destroy-on-close :key="tableKey">
  99. <el-form style="margin-left: 5%;margin-top: 2%;" :model="formTree" class="demo-form-inline" ref="formRefTree" :rules="rulesTree">
  100. <el-form-item label="名称:" prop="itemName" style="margin-left: -2%;">
  101. <el-input v-model="formTree.itemName" style="width: 75%;" placeholder=""/>
  102. </el-form-item>
  103. <el-form-item label="父节点id:" prop="catePid" style="margin-left: -2%;">
  104. <el-input v-model="formTree.catePid" style="width: 75%;" placeholder="" resize="none"/>
  105. </el-form-item>
  106. <el-form-item label="排序:" prop="itemNo" style="margin-left: -2%;">
  107. <el-input v-model="formTree.itemNo" style="width: 75%;" placeholder="" resize="none"/>
  108. </el-form-item>
  109. <el-form-item label="备注:" prop="itemNotes" style=" ">
  110. <el-input v-model="formTree.itemNotes" style="width: 75%;" placeholder="" resize="none"/>
  111. </el-form-item>
  112. </el-form>
  113. <template #footer>
  114. <span class="dialog-footer">
  115. <el-button size="mini" @click="dialogVisible = false">取消</el-button>
  116. <el-button v-if="isAdd" type="primary" @click="addTree" size="mini">
  117. 提交
  118. </el-button>
  119. <el-button v-if="!isAdd" type="primary" @click="saveEditTree" size="mini">
  120. 提交
  121. </el-button>
  122. </span>
  123. </template>
  124. </el-dialog>
  125. </template>
  126. <script setup>
  127. import { reactive } from 'vue'
  128. import { addDataCate,getCateTree,getCateDe,editCate,delCate,addDataItem,getItem,getItemDe,editItem,delItem} from "@/api/service/cate";
  129. import { ref, onMounted, onUnmounted, nextTick } from 'vue';
  130. const { proxy } = getCurrentInstance();
  131. const data = ref([])
  132. const title = ref([])
  133. const titleTree = ref([])
  134. const currentPage = ref(1)
  135. const total = ref(1)
  136. const tableData = ref([])
  137. const tableheight = window.innerHeight*0.7
  138. const heightAll = window.innerHeight
  139. const dialogVisible = ref(false)
  140. const dialogVisibleTree = ref(false)
  141. const isAdd = ref(false)
  142. const isAddTa = ref(false)
  143. const treeId = ref('');
  144. const formZu = ref({
  145. itemName:'',
  146. itemTp:'',
  147. itemEn:'',
  148. itemTp:'',
  149. itemDataTp:'',
  150. itemDefaultVal:'',
  151. itemUnit:'',
  152. itemNotes:'',
  153. });
  154. const rulesZu = reactive({
  155. itemName: [{ required: true, message: '必填', trigger: 'blur' }],
  156. itemEn: [{ required: true, message: '必填', trigger: 'blur' }],
  157. itemTp: [{ required: true, message: '必填', trigger: 'blur' }],
  158. itemDataTp: [{ required: true, message: '必填', trigger: 'blur' }],
  159. itemDefaultVal: [{ required: true, message: '必填', trigger: 'blur' }],
  160. });
  161. const formRefZu = ref();
  162. const formTree = ref({
  163. itemName:'',
  164. catePid:'',
  165. itemNo:'',
  166. itemNotes:''
  167. });
  168. const rulesTree = reactive({
  169. itemNo: [{ required: true, message: '必填', trigger: 'blur' }],
  170. catePid: [{ required: true, message: '必填', trigger: 'blur' }],
  171. itemName: [{ required: true, message: '必填', trigger: 'blur' }],
  172. });
  173. const formRefTree = ref();
  174. function clearForm(){
  175. formZu.value = {
  176. itemName:'',
  177. itemTp:'',
  178. itemEn:'',
  179. itemTp:'',
  180. itemDataTp:'',
  181. itemDefaultVal:'',
  182. itemUnit:'',
  183. itemNotes:'',
  184. }
  185. }
  186. function getTable(){
  187. var par = {
  188. pageNum:currentPage.value,
  189. pageSize:15,
  190. cateId:''
  191. }
  192. getItem(par).then(res=>{
  193. tableData.value = res.rows
  194. total.value = res.total
  195. })
  196. }
  197. function showAdd(){
  198. isAddTa.value = true
  199. title.value = '新增'
  200. dialogVisible.value = true
  201. }
  202. function showEdit(row){
  203. isAddTa.value = false
  204. title.value = '编辑'
  205. dialogVisible.value = true
  206. getItemDe(row.dataId).then(res=>{
  207. formZu.value = res.data
  208. })
  209. }
  210. function showAddTree(){
  211. isAdd.value = true
  212. titleTree.value = '新增节点'
  213. dialogVisibleTree.value = true
  214. }
  215. function clearFromTree(){
  216. formTree.value = {
  217. itemName:'',
  218. catePid:'',
  219. itemNo:'',
  220. itemNotes:''
  221. }
  222. }
  223. function getTree(){
  224. getCateTree().then(res=>{
  225. data.value = res.data
  226. })
  227. }
  228. function addTa(){
  229. formRefZu.value.validate(async (valid) => {
  230. await addDataItem(formZu.value).then(res=>{
  231. if(res.code===200){
  232. proxy.$modal.msgSuccess("新增成功");
  233. getTable()
  234. dialogVisible.value = false
  235. }
  236. })
  237. });
  238. }
  239. function saveEditTa(){
  240. editItem(formZu.value).then(res=>{
  241. if(res.code===200){
  242. proxy.$modal.msgSuccess("修改成功");
  243. dialogVisible.value = false
  244. getTable()
  245. }
  246. })
  247. }
  248. function delRow(row) {
  249. proxy.$modal.confirm('是否确认删除?').then(function () {
  250. return delItem(row.dataId);
  251. }).then(() => {
  252. getTable();
  253. proxy.$modal.msgSuccess("删除成功");
  254. }).catch(() => {});
  255. };
  256. async function addTree(){
  257. formRefTree.value.validate(async (valid) => {
  258. await addDataCate(formTree.value).then(res=>{
  259. if(res.code===200){
  260. proxy.$modal.msgSuccess("新增成功");
  261. getTree()
  262. dialogVisibleTree.value = false
  263. }
  264. })
  265. });
  266. }
  267. function saveEditTree(){
  268. editCate(formTree.value).then(res=>{
  269. if(res.code===200){
  270. proxy.$modal.msgSuccess("修改成功");
  271. dialogVisibleTree.value = false
  272. getTree()
  273. }
  274. })
  275. }
  276. function handleNodeClick(node, data){
  277. treeId.value = data.id
  278. getTable()
  279. }
  280. function delTree(node, data) {
  281. proxy.$modal.confirm('是否确认删除?').then(function () {
  282. return delCate(data.id);
  283. }).then(() => {
  284. getTree();
  285. proxy.$modal.msgSuccess("删除成功");
  286. }).catch(() => {});
  287. };
  288. function editTree(node, data){
  289. console.log(data)
  290. titleTree.value = '编辑'
  291. isAdd.value = false
  292. dialogVisibleTree.value = true
  293. getCateDe(data.id).then(res=>{
  294. formTree.value = res.data
  295. })
  296. console.log(node, data)
  297. }
  298. onMounted(() => {
  299. getTree()
  300. getTable()
  301. });
  302. </script>
  303. <style scoped>
  304. .drag-handle {
  305. cursor: move;
  306. }
  307. .ghost {
  308. opacity: 0.5;
  309. background: #c8ebfb;
  310. }
  311. /* 防止文字选中 */
  312. :deep(.el-table__row) {
  313. user-select: none;
  314. -webkit-user-select: none;
  315. }
  316. </style>
  317. <style scoped lang="scss">
  318. .el-table .el-table__row td {
  319. height: 60px !important; /* 行高 */
  320. }
  321. .custom-tree-node {
  322. display: flex; /* 启用 Flex 布局 */
  323. align-items: center; /* 垂直居中 */
  324. gap: 8px; /* 图标与文字间距 */
  325. }
  326. .custom-tree-node {
  327. flex: 1;
  328. display: flex;
  329. align-items: center;
  330. justify-content: space-between;
  331. font-size: 14px;
  332. padding-right: 8px;
  333. }
  334. </style>