image.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357
  1. <template>
  2. <hc-card>
  3. <template #header>
  4. <div class="w-120px">
  5. <el-select
  6. v-model="searchForm.affiliatedParty"
  7. placeholder="选择所属方"
  8. filterable
  9. clearable
  10. block
  11. >
  12. <el-option
  13. v-for="item in affiliatedPartyData"
  14. :key="item.value"
  15. :label="item.label"
  16. :value="item.value"
  17. />
  18. </el-select>
  19. </div>
  20. <div class="ml-12px w-400px">
  21. <el-button hc-btn type="primary" @click="searchClick"
  22. >搜索</el-button
  23. >
  24. </div>
  25. </template>
  26. <template #extra>
  27. <el-button hc-btn type="primary" @click="addRowClick"
  28. >新增</el-button
  29. >
  30. <el-button
  31. hc-btn
  32. type="danger"
  33. :disabled="tableCheckKeys.length <= 0"
  34. @click="batchDelClick"
  35. >删除</el-button
  36. >
  37. </template>
  38. <hc-table
  39. :column="tableColumn"
  40. :datas="tableData"
  41. :loading="tableLoading"
  42. :index-style="{ width: 60 }"
  43. is-check
  44. :check-style="{ width: 29 }"
  45. @selection-change="tableCheckChange"
  46. >
  47. <template #projectStage="{ row }">
  48. <span>{{
  49. getDictionaryName(projectStageData, row.projectStage)
  50. }}</span>
  51. </template>
  52. <template #affiliatedParty="{ row }">
  53. <span>{{
  54. getDictionaryName(affiliatedPartyData, row.affiliatedParty)
  55. }}</span>
  56. </template>
  57. <template #fileType="{ row }">
  58. <span>{{ getDictionaryName(fileTypeData, row.fileType) }}</span>
  59. </template>
  60. <template #storageDirectoryFormat="{ row }">
  61. <span>{{
  62. getDictionaryName(
  63. storageFormatData,
  64. row.storageDirectoryFormat
  65. )
  66. }}</span>
  67. </template>
  68. <template #action="{ row }">
  69. <el-link type="warning" @click="edutRowClick(row)"
  70. >修改</el-link
  71. >
  72. <el-link type="danger" @click="rowDelClick(row)">删除</el-link>
  73. </template>
  74. </hc-table>
  75. <template #action>
  76. <hc-pages :pages="searchForm" @change="pageChange" />
  77. </template>
  78. <!-- 新增/修改 -->
  79. <hc-dialog
  80. v-model="isDataInfoShow"
  81. widths="400px"
  82. is-footer-center
  83. :title="isNullES(formModel.id) ? '新增' : '修改'"
  84. @close="dialogClose"
  85. >
  86. <el-form
  87. ref="formRef"
  88. :model="formModel"
  89. :rules="formRules"
  90. label-position="top"
  91. label-width="auto"
  92. size="large"
  93. >
  94. <el-form-item label="分类名称:" prop="classfName">
  95. <el-input
  96. v-model="formModel.classfName"
  97. clearable
  98. placeholder="请输入分类名称"
  99. />
  100. </el-form-item>
  101. <el-form-item label="所属项目阶段:" prop="projectStage">
  102. <el-select
  103. v-model="formModel.projectStage"
  104. placeholder="选择项目阶段"
  105. filterable
  106. clearable
  107. block
  108. >
  109. <el-option
  110. v-for="item in projectStageData"
  111. :key="item.value"
  112. :label="item.label"
  113. :value="item.value"
  114. />
  115. </el-select>
  116. </el-form-item>
  117. <el-form-item label="所属方:" prop="affiliatedParty">
  118. <el-select
  119. v-model="formModel.affiliatedParty"
  120. placeholder="选择所属方"
  121. filterable
  122. clearable
  123. block
  124. >
  125. <el-option
  126. v-for="item in affiliatedPartyData"
  127. :key="item.value"
  128. :label="item.label"
  129. :value="item.value"
  130. />
  131. </el-select>
  132. </el-form-item>
  133. <el-form-item label="文件类型" prop="fileType">
  134. <el-select
  135. v-model="formModel.fileType"
  136. placeholder="选择文件类型"
  137. filterable
  138. clearable
  139. block
  140. >
  141. <el-option
  142. v-for="item in fileTypeData"
  143. :key="item.value"
  144. :label="item.label"
  145. :value="item.value"
  146. />
  147. </el-select>
  148. </el-form-item>
  149. <el-form-item
  150. label="存储目录格式"
  151. prop="storageDirectoryFormat"
  152. >
  153. <el-select
  154. v-model="formModel.storageDirectoryFormat"
  155. placeholder="选择存储目录格式"
  156. filterable
  157. clearable
  158. block
  159. >
  160. <el-option
  161. v-for="item in storageFormatData"
  162. :key="item.value"
  163. :label="item.label"
  164. :value="item.value"
  165. />
  166. </el-select>
  167. </el-form-item>
  168. </el-form>
  169. <template #footer>
  170. <el-button hc-btn @click="dialogClose">取消</el-button>
  171. <el-button
  172. hc-btn
  173. type="primary"
  174. :loading="submitLoading"
  175. @click="dialogSubmit"
  176. >提交</el-button
  177. >
  178. </template>
  179. </hc-dialog>
  180. </hc-card>
  181. </template>
  182. <script setup>
  183. import { onActivated, onDeactivated, ref } from "vue";
  184. import {
  185. arrToId,
  186. deepClone,
  187. formValidate,
  188. getArrValue,
  189. isNullES,
  190. } from "js-fast-way";
  191. import { getDictionaryData, getDictionaryName, reloadPage } from "~uti/tools";
  192. import { HcDelMsg } from "hc-vue3-ui";
  193. import mainApi from "~api/desk/image";
  194. //激活
  195. onActivated(() => {
  196. getDataApi();
  197. });
  198. //获取接口数据
  199. const getDataApi = async () => {
  200. affiliatedPartyData.value = await getDictionaryData("affiliated_party");
  201. projectStageData.value = await getDictionaryData("project_stage");
  202. fileTypeData.value = await getDictionaryData("file_type");
  203. storageFormatData.value = await getDictionaryData(
  204. "storage_directory_format"
  205. );
  206. getTableData().then();
  207. };
  208. const affiliatedPartyData = ref([]); //获取所属方
  209. const projectStageData = ref([]); //获取所属项目阶段
  210. const fileTypeData = ref([]); //获取文件资料类型
  211. const storageFormatData = ref([]); //获取储存目录格式
  212. //搜索表单
  213. const searchForm = ref({ current: 1, size: 30, total: 0 });
  214. //搜索
  215. const searchClick = () => {
  216. searchForm.value.current = 1;
  217. getTableData();
  218. };
  219. //分页
  220. const pageChange = ({ current, size }) => {
  221. searchForm.value.current = current;
  222. searchForm.value.size = size;
  223. getTableData();
  224. };
  225. //表格数据
  226. const tableData = ref([]);
  227. const tableColumn = ref([
  228. { key: "classfName", name: "名称" },
  229. { key: "projectStage", name: "所属项目阶段", width: 140, align: "center" },
  230. { key: "affiliatedParty", name: "所属方", width: 160, align: "center" },
  231. { key: "fileType", name: "文件资料类型", width: 140, align: "center" },
  232. {
  233. key: "storageDirectoryFormat",
  234. name: "储存目录格式",
  235. width: 140,
  236. align: "center",
  237. },
  238. { key: "action", name: "操作", width: 100, align: "center" },
  239. ]);
  240. //获取表格数据
  241. const tableLoading = ref(false);
  242. const getTableData = async () => {
  243. tableData.value = [];
  244. tableLoading.value = true;
  245. const { data } = await mainApi.page({
  246. ...searchForm.value,
  247. total: null,
  248. });
  249. tableLoading.value = false;
  250. tableData.value = getArrValue(data?.records);
  251. searchForm.value.total = data?.total || 0;
  252. };
  253. //表格被选择
  254. const tableCheckKeys = ref([]);
  255. const tableCheckChange = (rows) => {
  256. tableCheckKeys.value = rows;
  257. };
  258. //单个删除
  259. const rowDelClick = (row) => {
  260. rowRemoveApi(row.id);
  261. };
  262. //批量删除
  263. const batchDelClick = () => {
  264. const rows = tableCheckKeys.value;
  265. if (rows.length <= 0) {
  266. window.$message.warning("请选择要删除的应用");
  267. return false;
  268. }
  269. rowRemoveApi(arrToId(rows));
  270. };
  271. //删除接口
  272. const rowRemoveApi = (ids) => {
  273. HcDelMsg(async (resolve) => {
  274. const { isRes } = await mainApi.del(ids);
  275. resolve(); //关闭弹窗的回调
  276. if (!isRes) return;
  277. window.$message.success("删除成功");
  278. reloadPage();
  279. });
  280. };
  281. //新增/修改弹窗
  282. const isDataInfoShow = ref(false);
  283. const addRowClick = () => {
  284. formModel.value = { status: 1 };
  285. isDataInfoShow.value = true;
  286. };
  287. //修改
  288. const edutRowClick = (row) => {
  289. formModel.value = deepClone(row);
  290. isDataInfoShow.value = true;
  291. formModel.value.affiliatedParty = Number(formModel.value.affiliatedParty);
  292. formModel.value.projectStage = Number(formModel.value.projectStage);
  293. };
  294. //表单
  295. const formRef = ref(null);
  296. const formModel = ref({});
  297. const formRules = {
  298. classfName: { required: true, trigger: "blur", message: "请输入分类名称" },
  299. projectStage: {
  300. required: true,
  301. trigger: "blur",
  302. message: "请选择所属项目阶段",
  303. },
  304. affiliatedParty: {
  305. required: true,
  306. trigger: "blur",
  307. message: "请选择所属方",
  308. },
  309. fileType: { required: true, trigger: "blur", message: "请选择文件类型" },
  310. storageDirectoryFormat: {
  311. required: true,
  312. trigger: "blur",
  313. message: "请选择存储目录格式",
  314. },
  315. };
  316. //提交
  317. const submitLoading = ref(false);
  318. const dialogSubmit = async () => {
  319. const isForm = await formValidate(formRef.value);
  320. if (!isForm) return;
  321. submitLoading.value = true;
  322. const { isRes } = await mainApi.submit(formModel.value);
  323. submitLoading.value = false;
  324. if (!isRes) return;
  325. window.$message.success("操作成功");
  326. getTableData();
  327. dialogClose();
  328. };
  329. //关闭弹窗
  330. const dialogClose = () => {
  331. isDataInfoShow.value = false;
  332. submitLoading.value = false;
  333. formModel.value = {};
  334. };
  335. //离开了当前页面
  336. onDeactivated(() => {});
  337. </script>