375 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			375 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <div class="publish-section">
 | ||
|     <h2 class="section-title">发布资源</h2>
 | ||
|     <p class="section-desc">发布您的应用、工具或其他资源,与用户分享</p>
 | ||
| 
 | ||
|     <form class="layui-form" lay-filter="publishForm">
 | ||
|         <div class="layui-form-item">
 | ||
|             <label class="layui-form-label"><span class="layui-font-red">*</span>资源名称</label>
 | ||
|             <div class="layui-input-block">
 | ||
|                 <input type="text" name="title" placeholder="请输入资源名称" class="layui-input" lay-verify="required"
 | ||
|                     lay-reqtext="资源名称不能为空" />
 | ||
|             </div>
 | ||
|         </div>
 | ||
|         <div class="layui-form-item">
 | ||
|             <label class="layui-form-label"><span class="layui-font-red">*</span>资源分类</label>
 | ||
|             <div class="layui-input-block">
 | ||
|                 <select name="category" lay-verify="required" lay-reqtext="请选择资源分类">
 | ||
|                     <option value="">请选择分类</option>
 | ||
|                     <option value="app">应用软件</option>
 | ||
|                     <option value="tool">实用工具</option>
 | ||
|                     <option value="template">模板资源</option>
 | ||
|                     <option value="plugin">插件扩展</option>
 | ||
|                     <option value="other">其他资源</option>
 | ||
|                 </select>
 | ||
|             </div>
 | ||
|         </div>
 | ||
|         <div class="layui-form-item layui-form-text">
 | ||
|             <label class="layui-form-label"><span class="layui-font-red">*</span>资源描述</label>
 | ||
|             <div class="layui-input-block">
 | ||
|                 <textarea name="description" placeholder="请详细描述资源的功能、特点和使用方法" class="layui-textarea" rows="6"
 | ||
|                     lay-verify="required" lay-reqtext="请填写资源描述"></textarea>
 | ||
|             </div>
 | ||
|         </div>
 | ||
|         <div class="layui-form-item">
 | ||
|             <label class="layui-form-label"><span class="layui-font-red">*</span>资源地址</label>
 | ||
|             <div class="layui-input-block">
 | ||
|                 <input type="url" name="download_url" placeholder="请输入资源下载链接" class="layui-input"
 | ||
|                     lay-verify="required|url" lay-reqtext="请输入资源下载链接" />
 | ||
|             </div>
 | ||
|         </div>
 | ||
|         <div class="layui-form-item">
 | ||
|             <label class="layui-form-label">分享码</label>
 | ||
|             <div class="layui-input-block">
 | ||
|                 <input type="text" name="share_code" placeholder="请输入资源分享码" class="layui-input" />
 | ||
|             </div>
 | ||
|         </div>
 | ||
|         <div class="layui-form-item">
 | ||
|             <label class="layui-form-label">解压密码</label>
 | ||
|             <div class="layui-input-block">
 | ||
|                 <input type="text" name="extract_password" placeholder="请输入解压密码,没有可不填" class="layui-input" />
 | ||
|             </div>
 | ||
|         </div>
 | ||
|         <div class="layui-form-item">
 | ||
|             <label class="layui-form-label"><span class="layui-font-red">*</span>资源截图</label>
 | ||
|             <div class="layui-input-block">
 | ||
|                 <div class="layui-upload">
 | ||
|                     <button type="button" class="layui-btn" id="uploadImagesBtn">上传截图</button>
 | ||
|                     <div class="layui-upload-list" id="uploadList"></div>
 | ||
|                     <span class="layui-word-aux">支持 JPG、PNG 格式,最多 5 张</span>
 | ||
|                 </div>
 | ||
|                 <input type="hidden" name="images" id="imagesInput" lay-verify="required" lay-reqtext="请上传至少一张资源截图" />
 | ||
|             </div>
 | ||
|         </div>
 | ||
|         <div class="layui-form-item">
 | ||
|             <label class="layui-form-label">版本信息</label>
 | ||
|             <div class="layui-input-block">
 | ||
|                 <input type="text" name="version" placeholder="请输入版本号" class="layui-input" />
 | ||
|             </div>
 | ||
|         </div>
 | ||
|         <div class="layui-form-item">
 | ||
|             <label class="layui-form-label">系统要求</label>
 | ||
|             <div class="layui-input-block">
 | ||
|                 <input type="text" name="system_requirements" placeholder="如:Windows 10+, macOS 10.15+"
 | ||
|                     class="layui-input" />
 | ||
|             </div>
 | ||
|         </div>
 | ||
|         <div class="layui-form-item">
 | ||
|             <label class="layui-form-label"><span class="layui-font-red">*</span>授权方式</label>
 | ||
|             <div class="layui-input-block">
 | ||
|                 <select name="license" lay-verify="required" lay-reqtext="请选择授权方式">
 | ||
|                     <option value="">请选择授权方式</option>
 | ||
|                     <option value="free">免费</option>
 | ||
|                     <option value="paid">付费</option>
 | ||
|                     <option value="trial">试用版</option>
 | ||
|                     <option value="open">开源</option>
 | ||
|                 </select>
 | ||
|             </div>
 | ||
|         </div>
 | ||
|         <div class="layui-form-item">
 | ||
|             <label class="layui-form-label">价格设置</label>
 | ||
|             <div class="layui-input-block">
 | ||
|                 <input type="number" name="price" placeholder="请输入价格(付费资源必填)" class="layui-input" min="0" step="0.01" />
 | ||
|                 <span class="layui-word-aux">仅当授权方式为“付费”时必填</span>
 | ||
|             </div>
 | ||
|         </div>
 | ||
|         <div class="layui-form-item">
 | ||
|             <div class="layui-input-block">
 | ||
|                 <button type="submit" class="layui-btn" lay-submit lay-filter="publishSubmit">发布资源</button>
 | ||
|                 <button type="reset" class="layui-btn layui-btn-primary">重置表单</button>
 | ||
|             </div>
 | ||
|         </div>
 | ||
|     </form>
 | ||
| </div>
 | ||
| 
 | ||
| <script>
 | ||
|     layui.use(['form', 'layer', 'upload'], function () {
 | ||
|         var form = layui.form;
 | ||
|         var layer = layui.layer;
 | ||
|         var upload = layui.upload;
 | ||
|         var $ = layui.jquery;
 | ||
| 
 | ||
|         // 表单提交
 | ||
|         form.on('submit(publishSubmit)', function (data) {
 | ||
|             var formData = data.field;
 | ||
| 
 | ||
|             // 验证必填字段
 | ||
|             if (!formData.title || !formData.category || !formData.description) {
 | ||
|                 layer.msg('请填写必填字段', { icon: 2 });
 | ||
|                 return false;
 | ||
|             }
 | ||
| 
 | ||
|             // 验证付费资源的价格
 | ||
|             if (formData.license === 'paid' && (!formData.price || formData.price <= 0)) {
 | ||
|                 layer.msg('付费资源必须设置价格', { icon: 2 });
 | ||
|                 return false;
 | ||
|             }
 | ||
| 
 | ||
|             // 显示加载状态
 | ||
|             var loadIndex = layer.load(1, { shade: [0.3, '#000'] });
 | ||
| 
 | ||
|             // 模拟提交
 | ||
|             setTimeout(function () {
 | ||
|                 layer.close(loadIndex);
 | ||
|                 layer.msg('资源发布成功!', { icon: 1 }, function () {
 | ||
|                     // 重置表单
 | ||
|                     form.val('publishForm', {
 | ||
|                         title: '',
 | ||
|                         category: '',
 | ||
|                         description: '',
 | ||
|                         tags: '',
 | ||
|                         download_url: '',
 | ||
|                         official_url: '',
 | ||
|                         version: '',
 | ||
|                         system_requirements: '',
 | ||
|                         license: 'free',
 | ||
|                         price: ''
 | ||
|                     });
 | ||
| 
 | ||
|                     // 清空上传的图片
 | ||
|                     $('#uploadList').empty().hide();
 | ||
|                     $('#uploadPlaceholder').show();
 | ||
|                 });
 | ||
|             }, 1500);
 | ||
| 
 | ||
|             return false;
 | ||
|         });
 | ||
| 
 | ||
|         // 图片上传处理
 | ||
|         $('#uploadPlaceholder').on('click', function () {
 | ||
|             $('#imageUpload').click();
 | ||
|         });
 | ||
| 
 | ||
|         $('#imageUpload').on('change', function (e) {
 | ||
|             var files = e.target.files;
 | ||
|             if (files.length > 5) {
 | ||
|                 layer.msg('最多只能上传5张图片', { icon: 2 });
 | ||
|                 return;
 | ||
|             }
 | ||
| 
 | ||
|             $('#uploadPlaceholder').hide();
 | ||
|             $('#uploadList').show().empty();
 | ||
| 
 | ||
|             for (var i = 0; i < files.length; i++) {
 | ||
|                 var file = files[i];
 | ||
|                 if (file.type.indexOf('image/') === -1) {
 | ||
|                     layer.msg('请选择图片文件', { icon: 2 });
 | ||
|                     continue;
 | ||
|                 }
 | ||
| 
 | ||
|                 var reader = new FileReader();
 | ||
|                 reader.onload = function (e) {
 | ||
|                     var imgHtml = `
 | ||
|                         <div class="upload-item">
 | ||
|                             <img src="${e.target.result}" alt="预览图" />
 | ||
|                             <div class="upload-actions">
 | ||
|                                 <i class="layui-icon layui-icon-delete" onclick="removeImage(this)"></i>
 | ||
|                             </div>
 | ||
|                         </div>
 | ||
|                     `;
 | ||
|                     $('#uploadList').append(imgHtml);
 | ||
|                 };
 | ||
|                 reader.readAsDataURL(file);
 | ||
|             }
 | ||
|         });
 | ||
| 
 | ||
|         // 删除图片
 | ||
|         window.removeImage = function (element) {
 | ||
|             $(element).closest('.upload-item').remove();
 | ||
|             if ($('#uploadList .upload-item').length === 0) {
 | ||
|                 $('#uploadList').hide();
 | ||
|                 $('#uploadPlaceholder').show();
 | ||
|             }
 | ||
|         };
 | ||
|     });
 | ||
| </script>
 | ||
| 
 | ||
| <style>
 | ||
|     .layui-form-label {
 | ||
|         width: 110px !important;
 | ||
|     }
 | ||
| 
 | ||
|     .layui-font-red {
 | ||
|         margin-right: 4px;
 | ||
|     }
 | ||
| 
 | ||
|     .publish-section {
 | ||
|         max-width: 800px;
 | ||
|         margin: 0 auto;
 | ||
|     }
 | ||
| 
 | ||
|     .section-title {
 | ||
|         font-size: 24px;
 | ||
|         font-weight: 600;
 | ||
|         color: #333;
 | ||
|         margin-bottom: 8px;
 | ||
|         padding-bottom: 16px;
 | ||
|         border-bottom: 1px solid #f0f0f0;
 | ||
|     }
 | ||
| 
 | ||
|     .section-desc {
 | ||
|         color: #666;
 | ||
|         margin-bottom: 32px;
 | ||
|         font-size: 14px;
 | ||
|         line-height: 1.5;
 | ||
|     }
 | ||
| 
 | ||
|     .layui-form-label {
 | ||
|         width: 120px;
 | ||
|     }
 | ||
| 
 | ||
|     .layui-input-block {
 | ||
|         margin-left: 150px;
 | ||
|     }
 | ||
| 
 | ||
|     .layui-form-item {
 | ||
|         margin-bottom: 24px;
 | ||
|     }
 | ||
| 
 | ||
|     .layui-input,
 | ||
|     .layui-textarea,
 | ||
|     .layui-select {
 | ||
|         border-radius: 6px;
 | ||
|         border: 1px solid #e8e8e8;
 | ||
|         transition: all 0.3s;
 | ||
|     }
 | ||
| 
 | ||
|     .layui-input:focus,
 | ||
|     .layui-textarea:focus,
 | ||
|     .layui-select:focus {
 | ||
|         border-color: #1677ff;
 | ||
|         box-shadow: 0 0 0 2px rgba(22, 119, 255, 0.1);
 | ||
|     }
 | ||
| 
 | ||
|     .upload-area {
 | ||
|         border: 2px dashed #d9d9d9;
 | ||
|         border-radius: 8px;
 | ||
|         padding: 20px;
 | ||
|         text-align: center;
 | ||
|         transition: all 0.3s;
 | ||
|         cursor: pointer;
 | ||
|     }
 | ||
| 
 | ||
|     .upload-area:hover {
 | ||
|         border-color: #1677ff;
 | ||
|         background: #f8f9ff;
 | ||
|     }
 | ||
| 
 | ||
|     .upload-placeholder {
 | ||
|         color: #999;
 | ||
|     }
 | ||
| 
 | ||
|     .upload-placeholder .layui-icon {
 | ||
|         font-size: 48px;
 | ||
|         color: #ccc;
 | ||
|         margin-bottom: 16px;
 | ||
|     }
 | ||
| 
 | ||
|     .upload-placeholder p {
 | ||
|         margin: 8px 0;
 | ||
|         font-size: 16px;
 | ||
|         color: #666;
 | ||
|     }
 | ||
| 
 | ||
|     .upload-placeholder span {
 | ||
|         font-size: 12px;
 | ||
|         color: #999;
 | ||
|     }
 | ||
| 
 | ||
|     .upload-list {
 | ||
|         display: flex;
 | ||
|         flex-wrap: wrap;
 | ||
|         gap: 16px;
 | ||
|     }
 | ||
| 
 | ||
|     .upload-item {
 | ||
|         position: relative;
 | ||
|         width: 120px;
 | ||
|         height: 120px;
 | ||
|         border-radius: 8px;
 | ||
|         overflow: hidden;
 | ||
|         border: 1px solid #e8e8e8;
 | ||
|     }
 | ||
| 
 | ||
|     .upload-item img {
 | ||
|         width: 100%;
 | ||
|         height: 100%;
 | ||
|         object-fit: cover;
 | ||
|     }
 | ||
| 
 | ||
|     .upload-actions {
 | ||
|         position: absolute;
 | ||
|         top: 0;
 | ||
|         left: 0;
 | ||
|         right: 0;
 | ||
|         bottom: 0;
 | ||
|         background: rgba(0, 0, 0, 0.5);
 | ||
|         display: flex;
 | ||
|         align-items: center;
 | ||
|         justify-content: center;
 | ||
|         opacity: 0;
 | ||
|         transition: opacity 0.3s;
 | ||
|     }
 | ||
| 
 | ||
|     .upload-item:hover .upload-actions {
 | ||
|         opacity: 1;
 | ||
|     }
 | ||
| 
 | ||
|     .upload-actions .layui-icon {
 | ||
|         color: #fff;
 | ||
|         font-size: 20px;
 | ||
|         cursor: pointer;
 | ||
|     }
 | ||
| 
 | ||
|     .layui-btn {
 | ||
|         border-radius: 6px;
 | ||
|         padding: 0 24px;
 | ||
|         height: 40px;
 | ||
|         line-height: 40px;
 | ||
|         font-size: 14px;
 | ||
|     }
 | ||
| 
 | ||
|     .layui-btn-primary {
 | ||
|         border-color: #d9d9d9;
 | ||
|         color: #666;
 | ||
|     }
 | ||
| 
 | ||
|     .layui-btn-primary:hover {
 | ||
|         border-color: #1677ff;
 | ||
|         color: #1677ff;
 | ||
|     }
 | ||
| 
 | ||
|     @media (max-width: 768px) {
 | ||
|         .layui-form-label {
 | ||
|             width: 100px;
 | ||
|         }
 | ||
| 
 | ||
|         .layui-input-block {
 | ||
|             margin-left: 120px;
 | ||
|         }
 | ||
| 
 | ||
|         .upload-item {
 | ||
|             width: 100px;
 | ||
|             height: 100px;
 | ||
|         }
 | ||
|     }
 | ||
| </style> |