cfe66423 by chentao

Merge branch 'master' into dev

2 parents d53c1365 ba9b352a
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
10 "preview": "vite preview" 10 "preview": "vite preview"
11 }, 11 },
12 "dependencies": { 12 "dependencies": {
13 "sortablejs": "^1.15.6",
13 "@element-plus/icons-vue": "2.0.10", 14 "@element-plus/icons-vue": "2.0.10",
14 "@vueup/vue-quill": "1.2.0", 15 "@vueup/vue-quill": "1.2.0",
15 "@vueuse/core": "9.5.0", 16 "@vueuse/core": "9.5.0",
......
...@@ -25,8 +25,20 @@ ...@@ -25,8 +25,20 @@
25 的文件 25 的文件
26 </div> 26 </div>
27 <!-- 文件列表 --> 27 <!-- 文件列表 -->
28 <transition-group class="upload-file-list el-upload-list el-upload-list--text" name="el-fade-in-linear" tag="ul"> 28 <transition-group
29 <li :key="file.uid" class="el-upload-list__item ele-upload-list__item-content" v-for="(file, index) in fileList"> 29 class="upload-file-list el-upload-list el-upload-list--text"
30 name="el-fade-in-linear"
31 tag="ul"
32 ref="fileListWrapper"
33 @update="handleSortUpdate"
34 >
35 <li
36 :key="file.uid"
37 class="el-upload-list__item ele-upload-list__item-content draggable"
38 v-for="(file, index) in fileList"
39 :draggable="true"
40 :title="limit > 1 ? '可拖动文件进行调序' : ''"
41 >
30 <el-link :href="`${file.url}`" :underline="false" target="_blank"> 42 <el-link :href="`${file.url}`" :underline="false" target="_blank">
31 <span class="el-icon-document"> {{ getFileName(file.name) }} </span> 43 <span class="el-icon-document"> {{ getFileName(file.name) }} </span>
32 </el-link> 44 </el-link>
...@@ -41,6 +53,7 @@ ...@@ -41,6 +53,7 @@
41 <script setup> 53 <script setup>
42 import { getToken } from "@/utils/auth"; 54 import { getToken } from "@/utils/auth";
43 import { listByIds, delOss } from "@/api/system/oss"; 55 import { listByIds, delOss } from "@/api/system/oss";
56 import Sortable from 'sortablejs';
44 57
45 const props = defineProps({ 58 const props = defineProps({
46 modelValue: [String, Object, Array], 59 modelValue: [String, Object, Array],
...@@ -70,13 +83,43 @@ const { proxy } = getCurrentInstance(); ...@@ -70,13 +83,43 @@ const { proxy } = getCurrentInstance();
70 const emit = defineEmits(); 83 const emit = defineEmits();
71 const number = ref(0); 84 const number = ref(0);
72 const uploadList = ref([]); 85 const uploadList = ref([]);
73 const baseUrl = import.meta.env.VITE_APP_BASE_API; 86 const baseUrl = import.meta.env.VITE_APP_BASE_API || '';
74 const uploadFileUrl = ref(baseUrl + "/system/oss/upload"); // 上传文件服务器地址 87 const uploadFileUrl = ref(baseUrl + "/system/oss/upload"); // 上传文件服务器地址
75 const headers = ref({ Authorization: "Bearer " + getToken() }); 88 const headers = ref({ Authorization: "Bearer " + getToken() });
76 const fileList = ref([]); 89 const fileList = ref([]);
77 const showTip = computed( 90 const showTip = computed(
78 () => props.isShowTip && (props.fileType || props.fileSize) 91 () => props.isShowTip && (props.fileType || props.fileSize)
79 ); 92 );
93 // 初始化拖拽排序
94 onMounted(() => {
95 const el = proxy.$refs.fileListWrapper.$el; // 确保transition-group添加ref="fileListWrapper"
96 if (el) {
97 new Sortable(el, {
98 animation: 150, // 过渡动画时长
99 draggable: '.draggable', // 可拖拽的元素
100 onUpdate: (evt) => {
101 // 拖拽结束时更新列表顺序
102 const oldIndex = evt.oldIndex;
103 const newIndex = evt.newIndex;
104
105 // 移动元素位置
106 fileList.value.splice(newIndex, 0, fileList.value.splice(oldIndex, 1)[0]);
107
108 // 触发排序更新事件
109 handleSortUpdate();
110 }
111 });
112 }
113 });
114 // 排序更新处理
115 function handleSortUpdate() {
116 // 更新父组件modelValue
117 emit("update:modelValue", listToString(fileList.value));
118
119 // 输出排序后的列表(可选)
120 console.log('排序后的文件列表:', fileList.value);
121 }
122
80 123
81 watch(() => props.modelValue, async val => { 124 watch(() => props.modelValue, async val => {
82 if (val) { 125 if (val) {
...@@ -216,4 +259,7 @@ function listToString(list, separator) { ...@@ -216,4 +259,7 @@ function listToString(list, separator) {
216 .ele-upload-list__item-content-action .el-link { 259 .ele-upload-list__item-content-action .el-link {
217 margin-right: 10px; 260 margin-right: 10px;
218 } 261 }
262 .draggable {
263 cursor: move;
264 }
219 </style> 265 </style>
......
...@@ -59,7 +59,7 @@ const props = defineProps({ ...@@ -59,7 +59,7 @@ const props = defineProps({
59 // 大小限制(MB) 59 // 大小限制(MB)
60 fileSize: { 60 fileSize: {
61 type: Number, 61 type: Number,
62 default: 5, 62 default: 50,
63 }, 63 },
64 // 文件类型, 例如['png', 'jpg', 'jpeg'] 64 // 文件类型, 例如['png', 'jpg', 'jpeg']
65 fileType: { 65 fileType: {
......
...@@ -82,6 +82,7 @@ export default { ...@@ -82,6 +82,7 @@ export default {
82 blockName: '系列名称', 82 blockName: '系列名称',
83 buildName: '搭建', 83 buildName: '搭建',
84 caseName: '有无案例', 84 caseName: '有无案例',
85 packName: '是否打包',
85 tableControlsName: '操作', 86 tableControlsName: '操作',
86 controlsDelName: '删除', 87 controlsDelName: '删除',
87 controlsEditName: '编辑', 88 controlsEditName: '编辑',
...@@ -92,12 +93,13 @@ export default { ...@@ -92,12 +93,13 @@ export default {
92 dialogTitleEdit: '修改', 93 dialogTitleEdit: '修改',
93 dialogName: '课程名称', 94 dialogName: '课程名称',
94 dialogBlock: '系列', 95 dialogBlock: '系列',
96 dialogPack: '是否打包',
95 dialogTypes: '搭建类型', 97 dialogTypes: '搭建类型',
96 dialogTwoD: '2D', 98 dialogTwoD: '2D',
97 dialogThreeD: '3D', 99 dialogThreeD: '3D',
98 dialogCase: '案例', 100 dialogCase: '视频',
99 dialogTeaching: '教案', 101 dialogTeaching: '教案',
100 dialogPpt: 'PPT', 102 dialogPpt: '课程',
101 dialogPhoto: '课程图片', 103 dialogPhoto: '课程图片',
102 dialogConfim: '确认', 104 dialogConfim: '确认',
103 dialogExit: '退出', 105 dialogExit: '退出',
......
...@@ -162,7 +162,6 @@ ...@@ -162,7 +162,6 @@
162 <el-dialog :title="upload.title" :visible.sync="upload.open" width="400px" append-to-body> 162 <el-dialog :title="upload.title" :visible.sync="upload.open" width="400px" append-to-body>
163 <el-upload 163 <el-upload
164 ref="uploadRef" 164 ref="uploadRef"
165 :limit="1"
166 accept=".xlsx, .xls" 165 accept=".xlsx, .xls"
167 :headers="upload.headers" 166 :headers="upload.headers"
168 :action="upload.url + '?updateSupport=' + upload.updateSupport" 167 :action="upload.url + '?updateSupport=' + upload.updateSupport"
......
...@@ -100,7 +100,7 @@ ...@@ -100,7 +100,7 @@
100 </el-select> 100 </el-select>
101 </el-form-item> 101 </el-form-item>
102 <el-form-item :label="$t('advertisement.tablePhotoName')" label-width="80"> 102 <el-form-item :label="$t('advertisement.tablePhotoName')" label-width="80">
103 <imageUpload v-model="showForm.form.ossId" :limit='1' :fileType='["png", "jpg", "jpeg", "ico"]'/> 103 <imageUpload v-model="showForm.form.ossId" :limit='1' :fileType='["png", "jpg", "jpeg", "ico","mp4"]'/>
104 </el-form-item> 104 </el-form-item>
105 <el-form-item :label="$t('advertisement.tableSortName')" label-width="80"> 105 <el-form-item :label="$t('advertisement.tableSortName')" label-width="80">
106 <el-input-number v-model="showForm.form.sort" controls-position="right" :min="0" /> 106 <el-input-number v-model="showForm.form.sort" controls-position="right" :min="0" />
......
...@@ -44,6 +44,14 @@ ...@@ -44,6 +44,14 @@
44 <el-table-column :label="$t('course.blockName')" prop="buildingBlockName" /> 44 <el-table-column :label="$t('course.blockName')" prop="buildingBlockName" />
45 <el-table-column :label="$t('course.buildName')" prop="type" /> 45 <el-table-column :label="$t('course.buildName')" prop="type" />
46 <el-table-column :label="$t('course.caseName')" prop="caseName" /> 46 <el-table-column :label="$t('course.caseName')" prop="caseName" />
47 <el-table-column :label="$t('course.packName')" prop="canPack">
48 <template #default="{ row }">
49 <dict-tag
50 :options="constrain_status"
51 :value="row.canPack"
52 ></dict-tag>
53 </template>
54 </el-table-column>
47 <el-table-column :label="$t('course.tableControlsName')" class-name="small-padding fixed-width"> 55 <el-table-column :label="$t('course.tableControlsName')" class-name="small-padding fixed-width">
48 <template #default="{ row }"> 56 <template #default="{ row }">
49 <el-button 57 <el-button
...@@ -82,6 +90,21 @@ ...@@ -82,6 +90,21 @@
82 style="width: 180px;" 90 style="width: 180px;"
83 /> 91 />
84 </el-form-item> 92 </el-form-item>
93 <el-form-item :label="$t('course.dialogPack')" prop="canPack" label-width="80">
94 <el-select
95 v-model="showForm.form.canPack"
96 placeholder="请选择是否打包"
97 closeabled
98 style="width: 180px;"
99 >
100 <el-option
101 v-for="item in constrain_status"
102 :key="item.value"
103 :label="item.label"
104 :value="item.value"
105 />
106 </el-select>
107 </el-form-item>
85 <el-form-item :label="$t('course.dialogTypes')" prop="type" label-width="80"> 108 <el-form-item :label="$t('course.dialogTypes')" prop="type" label-width="80">
86 <el-checkbox-group v-model="showForm.form.type"> 109 <el-checkbox-group v-model="showForm.form.type">
87 <div style="display: flex;align-items: center;"> 110 <div style="display: flex;align-items: center;">
...@@ -93,8 +116,8 @@ ...@@ -93,8 +116,8 @@
93 <el-form-item v-if="determineStatus('2D')" :label="$t('course.dialogTwoD')" label-width="80"> 116 <el-form-item v-if="determineStatus('2D')" :label="$t('course.dialogTwoD')" label-width="80">
94 <template v-if="true"> 117 <template v-if="true">
95 <imageUpload v-model="showForm.form.twoDimensionalOssId" :limit='10' :fileType='["png", "jpg", "jpeg", "ico"]'/> 118 <imageUpload v-model="showForm.form.twoDimensionalOssId" :limit='10' :fileType='["png", "jpg", "jpeg", "ico"]'/>
96 <fileUpload v-model="showForm.form.twoDimensionalUrl" :limit="1" :fileType='["ldr","png","jpg","jpeg","ico","json","pdf"]'/> 119 <fileUpload v-model="showForm.form.twoDimensionalUrl" :fileType='["ldr","png","jpg","jpeg","ico","json","pdf","mp4"]'/>
97 <fileUpload v-model="showForm.form.twoDimensionalType" :limit="1" :fileType='["ldr","png","jpg","jpeg","ico","json","pdf"]'/> 120 <fileUpload v-model="showForm.form.twoDimensionalType" :fileType='["ldr","png","jpg","jpeg","ico","json","pdf","mp4"]'/>
98 </template> 121 </template>
99 <template v-else> 122 <template v-else>
100 <el-input v-model="showForm.form.twoDimensionalUrl" placeholder="请输入链接URL" /> 123 <el-input v-model="showForm.form.twoDimensionalUrl" placeholder="请输入链接URL" />
...@@ -103,21 +126,21 @@ ...@@ -103,21 +126,21 @@
103 <el-form-item v-if="determineStatus('3D')" :label="$t('course.dialogThreeD')" label-width="80"> 126 <el-form-item v-if="determineStatus('3D')" :label="$t('course.dialogThreeD')" label-width="80">
104 <template v-if="true"> 127 <template v-if="true">
105 <imageUpload v-model="showForm.form.threeDimensionalOssId" :limit='10' :fileType='["png", "jpg", "jpeg", "ico"]'/> 128 <imageUpload v-model="showForm.form.threeDimensionalOssId" :limit='10' :fileType='["png", "jpg", "jpeg", "ico"]'/>
106 <fileUpload v-model="showForm.form.threeDimensionalUrl" :limit="1" :fileType='["ldr","ldr.json"]'/> 129 <fileUpload v-model="showForm.form.threeDimensionalUrl" :fileType='["ldr"]'/><!--ldr.json-->
107 <fileUpload v-model="showForm.form.threeDimensionalType" :limit="1" :fileType='["ldr","ldr.json"]'/> 130 <fileUpload v-model="showForm.form.threeDimensionalType" :fileType='["json"]'/>
108 </template> 131 </template>
109 <template v-else> 132 <template v-else>
110 <el-input v-model="showForm.form.threeDimensionalUrl" placeholder="请输入链接URL" /> 133 <el-input v-model="showForm.form.threeDimensionalUrl" placeholder="请输入链接URL" />
111 </template> 134 </template>
112 </el-form-item> 135 </el-form-item>
113 <el-form-item :label="$t('course.dialogCase')" prop="caseOssId" label-width="80"> 136 <el-form-item :label="$t('course.dialogCase')" prop="caseOssId" label-width="80">
114 <fileUpload v-model="showForm.form.caseOssId" :limit="1" :fileType='["mp4", "avi", "mov", "flv"]'/> 137 <fileUpload v-model="showForm.form.caseOssId" :limit="10" :fileType='["mp4", "avi", "mov", "flv","pdf"]'/>
115 </el-form-item> 138 </el-form-item>
116 <el-form-item :label="$t('course.dialogTeaching')" label-width="80"> 139 <el-form-item :label="$t('course.dialogTeaching')" label-width="80">
117 <fileUpload v-model="showForm.form.teachingOssId" :limit="1" :fileType='["pdf"]'/> 140 <fileUpload v-model="showForm.form.teachingOssId" :limit="10" :fileType='["pdf","mp4"]'/>
118 </el-form-item> 141 </el-form-item>
119 <el-form-item :label="$t('course.dialogPpt')" label-width="80"> 142 <el-form-item :label="$t('course.dialogPpt')" label-width="80">
120 <fileUpload v-model="showForm.form.pptOssId" :limit="1" :fileType='["pdf","ppt","pptx"]'/> 143 <fileUpload v-model="showForm.form.pptOssId" :limit="10" :fileType='["pdf","mp4"]'/>
121 </el-form-item> 144 </el-form-item>
122 <el-form-item :label="$t('course.dialogPhoto')" prop="ossId" label-width="80"> 145 <el-form-item :label="$t('course.dialogPhoto')" prop="ossId" label-width="80">
123 <imageUpload v-model="showForm.form.ossId" :limit='1' :fileType='["png", "jpg", "jpeg", "ico"]'/> 146 <imageUpload v-model="showForm.form.ossId" :limit='1' :fileType='["png", "jpg", "jpeg", "ico"]'/>
...@@ -144,7 +167,7 @@ const { windowSize } = useTableHeight('max-height') ...@@ -144,7 +167,7 @@ const { windowSize } = useTableHeight('max-height')
144 167
145 // 导入字典 168 // 导入字典
146 const { proxy } = getCurrentInstance(); 169 const { proxy } = getCurrentInstance();
147 const { dimensional_type } = proxy.useDict("dimensional_type"); 170 const { dimensional_type, constrain_status} = proxy.useDict("dimensional_type", "constrain_status");
148 171
149 const props = { 172 const props = {
150 label: 'name', 173 label: 'name',
...@@ -174,7 +197,6 @@ const data = reactive({ ...@@ -174,7 +197,6 @@ const data = reactive({
174 rules: { 197 rules: {
175 name: [{ required: true, message: "课程名称不能为空", trigger: "blur" }], 198 name: [{ required: true, message: "课程名称不能为空", trigger: "blur" }],
176 buildingBlockId: [{ required: true, message: "系列不能为空", trigger: "blur" }], 199 buildingBlockId: [{ required: true, message: "系列不能为空", trigger: "blur" }],
177 type: [{ required: true, message: "搭建类型不能为空", trigger: "blur" }],
178 caseOssId: [{ required: true, message: "案例不能为空", trigger: "blur" }], 200 caseOssId: [{ required: true, message: "案例不能为空", trigger: "blur" }],
179 ossId: [{ required: true, message: "课程图片不能为空", trigger: "blur" }] 201 ossId: [{ required: true, message: "课程图片不能为空", trigger: "blur" }]
180 } 202 }
...@@ -232,9 +254,11 @@ function handleEdit (row) { ...@@ -232,9 +254,11 @@ function handleEdit (row) {
232 open: true, 254 open: true,
233 form: { 255 form: {
234 ...row, 256 ...row,
235 type: row.type.split('、') 257 type: row.type.split('、'),
258 canPack: row.canPack ? String(row.canPack) : '0' // 将数字转换为字符串
236 } 259 }
237 } 260 }
261 console.log('编辑表单数据:', showForm.value.form) // 添加日志查看数据
238 } 262 }
239 263
240 function btn_add () { 264 function btn_add () {
...@@ -242,7 +266,10 @@ function btn_add () { ...@@ -242,7 +266,10 @@ function btn_add () {
242 showForm.value.title = proxy.$t('advertisement.dialogTitleAdd') 266 showForm.value.title = proxy.$t('advertisement.dialogTitleAdd')
243 showForm.value = { 267 showForm.value = {
244 ...showForm.value, 268 ...showForm.value,
245 open: true 269 open: true,
270 form: {
271 canPack: '0' // 设置默认值
272 }
246 } 273 }
247 } 274 }
248 275
......
...@@ -101,7 +101,7 @@ ...@@ -101,7 +101,7 @@
101 <imageUpload v-model="showForm.form.coverOssId" :limit="1" :fileType='["png", "jpg", "jpeg", "ico"]'/> 101 <imageUpload v-model="showForm.form.coverOssId" :limit="1" :fileType='["png", "jpg", "jpeg", "ico"]'/>
102 </el-form-item> 102 </el-form-item>
103 <el-form-item :label="$t('problem.dialogMovie')" label-width="80"> 103 <el-form-item :label="$t('problem.dialogMovie')" label-width="80">
104 <fileUpload v-model="showForm.form.videoOssId" :limit="1" :fileType='["mp4", "avi", "mov", "flv"]'/> 104 <fileUpload v-model="showForm.form.videoOssId" :fileType='["mp4", "avi", "mov", "flv"]'/>
105 </el-form-item> 105 </el-form-item>
106 <el-form-item :label="$t('problem.dialogSort')" label-width="80"> 106 <el-form-item :label="$t('problem.dialogSort')" label-width="80">
107 <el-input-number v-model="showForm.form.sort" controls-position="right" :min="0" /> 107 <el-input-number v-model="showForm.form.sort" controls-position="right" :min="0" />
......
...@@ -131,7 +131,7 @@ ...@@ -131,7 +131,7 @@
131 <el-dialog :title="showForm.title" v-model="showForm.open" width="500px" append-to-body @close="closeDialog"> 131 <el-dialog :title="showForm.title" v-model="showForm.open" width="500px" append-to-body @close="closeDialog">
132 <el-form ref="tableRefs" :model="showForm.form" :rules="rules" label-width="100"> 132 <el-form ref="tableRefs" :model="showForm.form" :rules="rules" label-width="100">
133 <el-form-item :label="$t('upgradation.dialogFile')" > 133 <el-form-item :label="$t('upgradation.dialogFile')" >
134 <fileUpload v-model="showForm.form.fileOssId" :fileSize="20" :limit="1" :fileType='["apk", "bin", "ppd", "exe"]'/> 134 <fileUpload v-model="showForm.form.fileOssId" :fileSize="20" :fileType='["apk", "bin", "ppd", "exe"]'/>
135 </el-form-item> 135 </el-form-item>
136 <el-form-item :label="$t('upgradation.dialogFileUrl')"> 136 <el-form-item :label="$t('upgradation.dialogFileUrl')">
137 <el-input v-model="showForm.form.fileUrl" placeholder="请输入链接URL" /> 137 <el-input v-model="showForm.form.fileUrl" placeholder="请输入链接URL" />
......
...@@ -379,7 +379,6 @@ ...@@ -379,7 +379,6 @@
379 width="400px" 379 width="400px"
380 append-to-body> 380 append-to-body>
381 <el-upload ref="uploadRef" 381 <el-upload ref="uploadRef"
382 :limit="1"
383 accept=".xlsx, .xls" 382 accept=".xlsx, .xls"
384 :headers="upload.headers" 383 :headers="upload.headers"
385 :action="upload.url + '?updateSupport=' + upload.updateSupport" 384 :action="upload.url + '?updateSupport=' + upload.updateSupport"
......
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!