crewSchoolTrainingNoticeManage.vue 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317
  1. <template>
  2. <div class="full-container-p24">
  3. <div class="mb30 df aic jcsb">
  4. <div class="df aic">
  5. <el-input
  6. v-model="searchKey"
  7. placeholder="请输入培训公告标题"
  8. class="w300"
  9. @keyup.enter="handleSearch"
  10. clearable
  11. @clear="handleSearch"
  12. />
  13. <el-button class="ml10" type="primary" @click="handleSearch">
  14. 搜索
  15. </el-button>
  16. </div>
  17. <div>
  18. <el-button class="ml10" type="primary" @click="goToSchoolInfo">
  19. 学校信息
  20. </el-button>
  21. <el-button class="ml10" type="primary" @click="handleAdd">
  22. 新增培训公告
  23. </el-button>
  24. </div>
  25. </div>
  26. <el-table border :data="tableData" stripe>
  27. <el-table-column type="index" label="序号" width="80" align="center" />
  28. <el-table-column
  29. prop="trainingNoticeTitle"
  30. label="公告标题"
  31. min-width="200"
  32. align="center"
  33. />
  34. <el-table-column
  35. prop="trainingNoticeContent"
  36. label="公告内容"
  37. min-width="300"
  38. align="center"
  39. :show-overflow-tooltip="true"
  40. />
  41. <el-table-column
  42. prop="createTime"
  43. label="发布日期"
  44. min-width="150"
  45. align="center"
  46. >
  47. <template v-slot="scope">
  48. {{ subTimeStr(scope.row.createTime) }}
  49. </template>
  50. </el-table-column>
  51. <el-table-column label="操作" width="180" align="center">
  52. <template #default="scope">
  53. <el-button type="primary" text @click="handleEdit(scope.row)">
  54. 修改
  55. </el-button>
  56. <el-button type="danger" text @click="deleteNotice(scope.row)">
  57. 删除
  58. </el-button>
  59. </template>
  60. </el-table-column>
  61. </el-table>
  62. <div class="df aic jcfe mt40 mr20">
  63. <el-pagination
  64. background
  65. layout="prev, pager, next"
  66. :current-page="currentPage"
  67. :total="total"
  68. @current-change="pageChange"
  69. />
  70. </div>
  71. <el-dialog v-model="dialogVisible" :title="dialogTitle" width="600">
  72. <el-form
  73. ref="formRef"
  74. :model="formData"
  75. :rules="rules"
  76. label-width="120px"
  77. >
  78. <el-form-item label="公告标题" prop="trainingNoticeTitle">
  79. <el-input v-model="formData.trainingNoticeTitle" class="w400" />
  80. </el-form-item>
  81. <el-form-item label="公告内容" prop="trainingNoticeContent">
  82. <el-input
  83. v-model="formData.trainingNoticeContent"
  84. type="textarea"
  85. :rows="6"
  86. class="w400"
  87. />
  88. </el-form-item>
  89. <el-form-item label="公告图片" prop="trainingNoticeImgFileKey">
  90. <Uploader
  91. v-model="formData.trainingNoticeImgFileKey"
  92. :limit="1"
  93. :action-url="store.state.uploadUrl"
  94. :fileList="fileList"
  95. @onUploadFileList="handleFileListUpdate"
  96. @onRemoveFileList="handleFileListRemove"
  97. />
  98. </el-form-item>
  99. <el-form-item label="发布人" prop="postedBy">
  100. <el-input
  101. v-model="formData.postedBy"
  102. class="w400"
  103. placeholder="默认:汇很多"
  104. />
  105. </el-form-item>
  106. </el-form>
  107. <template #footer>
  108. <el-button @click="dialogVisible = false">取消</el-button>
  109. <el-button type="primary" @click="submitForm">确定</el-button>
  110. </template>
  111. </el-dialog>
  112. </div>
  113. </template>
  114. <script setup>
  115. import { ref, reactive, onMounted } from "vue";
  116. import { ElMessage, ElMessageBox } from "element-plus";
  117. import { useRouter } from "vue-router";
  118. import api from "../../apis/fetch";
  119. import { subTimeStr } from "../../utils/utils";
  120. import Uploader from "../../components/Uploader.vue";
  121. import store from "../../store";
  122. const router = useRouter();
  123. const searchKey = ref("");
  124. const currentPage = ref(1);
  125. const total = ref(0);
  126. const tableData = ref([]);
  127. const fileList = ref([]);
  128. const dialogVisible = ref(false);
  129. const dialogTitle = ref("新增培训公告");
  130. const formRef = ref(null);
  131. const formData = reactive({
  132. trainingNoticeId: "",
  133. crewSchoolId: "",
  134. trainingNoticeTitle: "",
  135. trainingNoticeContent: "",
  136. trainingNoticeImgFileKey: "",
  137. postedBy: "汇很多",
  138. });
  139. const rules = reactive({
  140. trainingNoticeTitle: [
  141. { required: true, message: "请输入公告标题", trigger: "blur" },
  142. ],
  143. trainingNoticeContent: [
  144. { required: true, message: "请输入公告内容", trigger: "blur" },
  145. ],
  146. postedBy: [{ required: true, message: "请输入发布人", trigger: "blur" }],
  147. });
  148. // 获取培训公告列表
  149. async function getNoticeList() {
  150. try {
  151. const { data } = await api.getCrewSchoolTrainingNoticeList({
  152. term: searchKey.value,
  153. currentPage: currentPage.value,
  154. size: 10,
  155. crewSchoolId: 1,
  156. });
  157. if (data.status === 0) {
  158. tableData.value = data.result;
  159. total.value = data.total;
  160. } else {
  161. tableData.value = [];
  162. total.value = 0;
  163. ElMessage.error(data.msg);
  164. }
  165. } catch (error) {
  166. ElMessage.error("获取数据失败");
  167. }
  168. }
  169. // 处理文件列表更新
  170. const handleFileListUpdate = ({ response: data }) => {
  171. if (data.status === 0) {
  172. formData.trainingNoticeImgFileKey = data.result.key;
  173. fileList.value = [
  174. { viewUrl: data.result.viewUrl, fileKey: data.result.key },
  175. ];
  176. ElMessage.success("上传成功");
  177. } else {
  178. ElMessage.error(data.msg || "上传失败");
  179. }
  180. };
  181. // 处理文件列表移除
  182. const handleFileListRemove = () => {
  183. formData.trainingNoticeImgFileKey = "";
  184. fileList.value = [];
  185. };
  186. // 跳转到学校信息页面
  187. function goToSchoolInfo() {
  188. router.push("/workStation/crewSchoolInfoManage");
  189. }
  190. // 分页切换
  191. function pageChange(page) {
  192. currentPage.value = page;
  193. getNoticeList();
  194. }
  195. // 搜索
  196. function handleSearch() {
  197. currentPage.value = 1;
  198. getNoticeList();
  199. }
  200. // 新增
  201. function handleAdd() {
  202. dialogTitle.value = "新增培训公告";
  203. Object.keys(formData).forEach((key) => {
  204. if (key !== "postedBy") {
  205. formData[key] = "";
  206. }
  207. if (key === "crewSchoolId") {
  208. formData[key] = 1;
  209. }
  210. });
  211. formData.postedBy = "汇很多";
  212. fileList.value = [];
  213. dialogVisible.value = true;
  214. }
  215. // 编辑
  216. function handleEdit(row) {
  217. dialogTitle.value = "修改培训公告";
  218. formData.trainingNoticeId = row.id;
  219. formData.trainingNoticeTitle = row.trainingNoticeTitle;
  220. formData.trainingNoticeContent = row.trainingNoticeContent;
  221. formData.trainingNoticeImgFileKey = row.trainingNoticeImgFileKey || "";
  222. formData.postedBy = row.postedBy || "汇很多";
  223. // 设置文件列表
  224. fileList.value = [];
  225. if (row.trainingNoticeImgFileKey) {
  226. fileList.value = [
  227. {
  228. viewUrl:
  229. row.trainingNoticeImgUrl ||
  230. `/api/file/view?fileKey=${row.trainingNoticeImgFileKey}`,
  231. fileKey: row.trainingNoticeImgFileKey,
  232. },
  233. ];
  234. }
  235. dialogVisible.value = true;
  236. }
  237. // 提交表单
  238. async function submitForm() {
  239. try {
  240. await formRef.value.validate();
  241. const apiMethod = !formData.trainingNoticeId
  242. ? api.addCrewSchoolTrainingNotice
  243. : api.updateCrewSchoolTrainingNotice;
  244. const { data } = await apiMethod(formData);
  245. if (data.status === 0) {
  246. ElMessage.success("操作成功");
  247. dialogVisible.value = false;
  248. getNoticeList();
  249. } else {
  250. ElMessage.error(data.msg || "操作失败");
  251. }
  252. } catch (error) {
  253. console.error(error);
  254. }
  255. }
  256. // 删除
  257. function deleteNotice(row) {
  258. ElMessageBox.confirm("确认删除该培训公告?", "警告", {
  259. confirmButtonText: "确认",
  260. cancelButtonText: "取消",
  261. type: "warning",
  262. }).then(async () => {
  263. try {
  264. const { data } = await api.deleteCrewSchoolTrainingNotice({
  265. trainingNoticeId: row.id,
  266. });
  267. if (data.status === 0) {
  268. ElMessage.success("删除成功");
  269. getNoticeList();
  270. } else {
  271. ElMessage.error(data.msg || "删除失败");
  272. }
  273. } catch (error) {
  274. ElMessage.error("删除失败");
  275. }
  276. });
  277. }
  278. onMounted(() => {
  279. getNoticeList();
  280. });
  281. </script>
  282. <style scoped>
  283. .w300 {
  284. width: 300px;
  285. }
  286. .w400 {
  287. width: 400px;
  288. }
  289. .ml10 {
  290. margin-left: 10px;
  291. }
  292. </style>