Ver código fonte

轮播图增加字段

罗永浩 5 meses atrás
pai
commit
5c1c5cfdb7

+ 24 - 1
addons/admin/src/views/exam/component/ExcelImport.vue

@@ -64,7 +64,30 @@
             <el-alert title="Excel格式要求" type="info" :closable="false" show-icon>
                 <template slot="default">
                     <p><strong>Excel格式要求:</strong></p>
-                    <p>• 第一行必须是标题行,支持以下列名:题目类型、题目、选项A~F(或答案A~F)、正确答案、解析、分数</p>
+                    CREATE TABLE `lev_ad` (
+                        `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
+                        `title` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '广告标题',
+                        `position` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT '广告位置:1-主页轮播图,2-会员中心占位图',
+                        `cover` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '广告图片',
+                        `type` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '广告访问:1-站内链接,2-站外链接,3-其他小程序,4-微信视频号',
+                        `description` varchar(150) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '广告描述',
+                        `url` varchar(200) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '广告链接/小程序链接/视频号链接',
+                        `link_type` tinyint(1) DEFAULT '1' COMMENT '跳转类型:1-默认,2-小程序',
+                        `mp_appid` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '跳转小程序APPID',
+                        `width` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '广告宽度',
+                        `height` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '广告高度',
+                        `start_time` int(10) unsigned NOT NULL COMMENT '开始时间',
+                        `end_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '结束时间',
+                        `view_num` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '广告点击次数',
+                        `status` tinyint(3) unsigned NOT NULL DEFAULT '1' COMMENT '状态:1在用 2停用',
+                        `sort` smallint(5) unsigned NOT NULL DEFAULT '125' COMMENT '排序',
+                        `create_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '添加时间',
+                        `update_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '更新时间',
+                        `mark` tinyint(3) unsigned NOT NULL DEFAULT '1' COMMENT '有效标识(1正常 0删除)',
+                        PRIMARY KEY (`id`) USING BTREE,
+                        KEY `title` (`title`) USING BTREE,
+                        KEY `ad_sort_id` (`position`) USING BTREE
+                      ) ENGINE=InnoDB AUTO_INCREMENT=48 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=DYNAMIC COMMENT='广告管理表';                    <p>• 第一行必须是标题行,支持以下列名:题目类型、题目、选项A~F(或答案A~F)、正确答案、解析、分数</p>
                     <p>• 列顺序可以任意排列,系统会自动识别各列</p>
                     <p>• 题目类型:单选题、多选题、判断题、填空题、问答题</p>
                     <p>• 正确答案:单选题填选项字母(A/B/C/D/E/F),多选题用逗号分隔(A,B),判断题填对/错,填空题填答案,问答题可留空</p>

+ 119 - 25
addons/admin/src/views/system/ad/components/list.vue

@@ -38,17 +38,25 @@
             <template slot-scope="{row}"><el-avatar shape="square" :size="25" :src="row.cover" /></template>
           </el-table-column>
           <el-table-column prop="title" label="标题" sortable="custom" show-overflow-tooltip min-width="200" />
-          <el-table-column prop="position" label="所属位" sortable="custom" show-overflow-tooltip min-width="200">
+          <el-table-column prop="position" label="所属位" sortable="custom" show-overflow-tooltip min-width="120">
             <template slot-scope="{row}">
-              <span class="ele-text-primary" v-if="row.position == 1">首页</span>
-              <span class="ele-text-primary" v-if="row.position == 2">会员中心占位图</span>
+              <span v-if="row.position == 1">主页轮播图</span>
+              <span v-else-if="row.position == 2">会员中心占位图</span>
+            </template>
+          </el-table-column>
+          <el-table-column prop="type" label="广告类型" show-overflow-tooltip min-width="100">
+            <template slot-scope="{row}">
+              <span v-if="row.type == 1">站内链接</span>
+              <span v-else-if="row.type == 2">站外链接</span>
+              <span v-else-if="row.type == 3">其他小程序</span>
+              <span v-else-if="row.type == 4">微信视频号</span>
             </template>
           </el-table-column>
           <el-table-column prop="url" label="地址" show-overflow-tooltip min-width="200" align="center" />
           <el-table-column prop="status" label="状态" sortable min-width="100">
             <template slot-scope="{row}">
-              <ele-dot :type="['danger', 'success'][row.status]" :ripple="row.status === 0"
-                :text="['禁用', '正常'][row.status]" />
+              <ele-dot :type="['success', 'danger'][row.status - 1]" :ripple="row.status === 1"
+                :text="['在用', '停用'][row.status - 1]" />
             </template>
           </el-table-column>
           <el-table-column label="创建时间" sortable="custom" show-overflow-tooltip min-width="160">
@@ -68,39 +76,106 @@
       </ele-data-table>
     </el-card>
     <!-- 编辑弹窗 -->
-    <el-dialog :title="editForm.id ? '修改' : '修改'" :visible.sync="showEdit" width="700px"
-      @closed="editForm = { status: 1, position: 1 }" :destroy-on-close="true" custom-class="ele-dialog-form"
-      :lock-scroll="false">
-      <el-form :model="editForm" ref="editForm" :rules="editRules" label-width="100px">
-        <el-form-item label="图片:">
+    <el-dialog :title="editForm.id ? '修改' : '添加'" :visible.sync="showEdit" width="800px"
+      @closed="editForm = { status: 1, position: 1, type: 1, link_type: 1 }" :destroy-on-close="true"
+      custom-class="ele-dialog-form" :lock-scroll="false">
+      <el-form :model="editForm" ref="editForm" :rules="editRules" label-width="120px">
+        <el-form-item label="广告图片:" prop="cover">
           <uploadImage :limit="1" v-model="editForm.cover"></uploadImage>
         </el-form-item>
         <el-row :gutter="15">
           <el-col :sm="12">
-            <el-form-item label="标题:" prop="title">
+            <el-form-item label="广告标题:" prop="title">
               <el-input v-model="editForm.title" placeholder="请输入标题" clearable />
             </el-form-item>
-            <el-form-item label="URL:" prop="url">
-              <el-input v-model="editForm.url" placeholder="请输入URL" clearable />
+          </el-col>
+          <el-col :sm="12">
+            <el-form-item label="广告位:" prop="position">
+              <el-select v-model="editForm.position" placeholder="请选择位" class="ele-block" clearable>
+                <el-option label="主页轮播图" :value="1" />
+                <el-option label="会员中心占位图" :value="2" />
+              </el-select>
             </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="15">
+          <el-col :sm="12">
+            <el-form-item label="广告类型:" prop="type">
+              <el-select v-model="editForm.type" placeholder="请选择类型" class="ele-block" clearable
+                @change="handleTypeChange">
+                <el-option label="站内链接" :value="1" />
+                <el-option label="站外链接" :value="2" />
+                <el-option label="其他小程序" :value="3" />
+                <el-option label="微信视频号" :value="4" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :sm="12">
+            <el-form-item label="跳转类型:" prop="link_type">
+              <el-select v-model="editForm.link_type" placeholder="请选择跳转类型" class="ele-block" clearable>
+                <el-option label="默认" :value="1" />
+                <el-option label="小程序" :value="2" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="15">
+          <el-col :span="24">
+            <el-form-item label="广告描述:">
+              <el-input v-model="editForm.description" type="textarea" :rows="2" placeholder="请输入广告描述" clearable />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="15">
+          <el-col :span="24">
+            <el-form-item label="广告链接:" prop="url">
+              <el-input v-model="editForm.url" placeholder="请输入广告链接/小程序链接/视频号链接" clearable />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-form-item v-if="editForm.type === 3" label="小程序APPID:" prop="mp_appid">
+          <el-input v-model="editForm.mp_appid" placeholder="请输入小程序APPID" clearable />
+        </el-form-item>
+        <el-row :gutter="15">
+          <el-col :sm="12">
+            <el-form-item label="宽度(px):">
+              <el-input-number v-model="editForm.width" controls-position="right" :min="0" placeholder="请输入宽度"
+                class="ele-fluid ele-text-left" />
+            </el-form-item>
+          </el-col>
+          <el-col :sm="12">
+            <el-form-item label="高度(px):">
+              <el-input-number v-model="editForm.height" controls-position="right" :min="0" placeholder="请输入高度"
+                class="ele-fluid ele-text-left" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="15">
+          <el-col :sm="12">
+            <el-form-item label="开始时间:">
+              <el-date-picker v-model="editForm.start_time" type="datetime" placeholder="选择开始时间"
+                format="yyyy-MM-dd HH:mm:ss" value-format="timestamp" style="width: 100%" />
+            </el-form-item>
+          </el-col>
+          <el-col :sm="12">
+            <el-form-item label="结束时间:">
+              <el-date-picker v-model="editForm.end_time" type="datetime" placeholder="选择结束时间"
+                format="yyyy-MM-dd HH:mm:ss" value-format="timestamp" style="width: 100%" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="15">
+          <el-col :sm="12">
             <el-form-item label="排序号:" prop="sort">
               <el-input-number v-model="editForm.sort" controls-position="right" :min="0" placeholder="请输入排序号"
                 class="ele-fluid ele-text-left" />
             </el-form-item>
           </el-col>
           <el-col :sm="12">
-            <el-form-item label="所属位" prop="position" :rules="{
-              required: true, message: '所属位不能为空', trigger: 'change'
-            }">
-              <el-select v-model="editForm.position" placeholder="请选择位" class="ele-block" clearable>
-                <el-option label="首页轮播" :value="1" />
-                <el-option label="会员中心占位图" :value="2" />
-              </el-select>
-            </el-form-item>
-            <el-form-item label="状态:">
+            <el-form-item label="广告状态:">
               <el-radio-group v-model="editForm.status">
-                <el-radio :label="1">正常</el-radio>
-                <el-radio :label="2">禁用</el-radio>
+                <el-radio :label="1">在用</el-radio>
+                <el-radio :label="2">停用</el-radio>
               </el-radio-group>
             </el-form-item>
           </el-col>
@@ -129,7 +204,12 @@ export default {
       table: { url: '/ad/index', where: {} },  // 表格配置
       choose: [],  // 表格选中数据
       showEdit: false,  // 是否显示表单弹窗
-      editForm: { status: 1, position: 1 },  // 表单数据
+      editForm: {
+        status: 1,
+        position: 1,
+        type: 1,
+        link_type: 1
+      },  // 表单数据
       editRules: {  // 表单验证规则
         title: [
           { required: true, message: '请输入标题', trigger: 'blur' }
@@ -165,8 +245,22 @@ export default {
     /* 显示编辑 */
     edit(row) {
       this.editForm = Object.assign({}, row);
+      // 转换时间戳为日期选择器需要的格式
+      if (this.editForm.start_time && typeof this.editForm.start_time === 'string') {
+        this.editForm.start_time = new Date(this.editForm.start_time).getTime();
+      }
+      if (this.editForm.end_time && typeof this.editForm.end_time === 'string') {
+        this.editForm.end_time = new Date(this.editForm.end_time).getTime();
+      }
       this.showEdit = true;
     },
+    /* 处理广告类型变化 */
+    handleTypeChange(value) {
+      // 如果选择小程序类型,设置默认值
+      if (value === 3 && !this.editForm.link_type) {
+        this.editForm.link_type = 2;
+      }
+    },
     /* 保存编辑 */
     save() {
       this.$refs['editForm'].validate((valid) => {

+ 158 - 55
addons/admin/src/views/system/ad/index.vue

@@ -3,61 +3,76 @@
     <el-card shadow="never">
       <!-- 搜索表单 -->
       <el-form :model="table.where" label-width="90px" class="ele-form-search"
-               @keyup.enter.native="$refs.table.reload()" @submit.native.prevent>
+        @keyup.enter.native="$refs.table.reload()" @submit.native.prevent>
         <el-row :gutter="15">
           <el-col :md="6" :sm="12">
             <el-form-item label="广告标题:">
-              <el-input v-model="table.where.title" placeholder="请输入广告标题" clearable/>
+              <el-input v-model="table.where.title" placeholder="请输入广告标题" clearable />
             </el-form-item>
           </el-col>
           <el-col :md="6" :sm="12">
             <div class="ele-form-actions">
               <el-button type="primary" @click="$refs.table.reload()" icon="el-icon-search" class="ele-btn-icon">查询
               </el-button>
-              <el-button @click="(table.where={})&&$refs.table.reload()">重置</el-button>
+              <el-button @click="(table.where = {}) && $refs.table.reload()">重置</el-button>
             </div>
           </el-col>
         </el-row>
       </el-form>
       <!-- 操作按钮 -->
       <div class="ele-table-tool ele-table-tool-default">
-        <el-button @click="showEdit=true" type="primary" icon="el-icon-plus" class="ele-btn-icon" size="small" v-if="permission.includes('sys:ad:add')">添加
+        <el-button @click="showEdit = true" type="primary" icon="el-icon-plus" class="ele-btn-icon" size="small"
+          v-if="permission.includes('sys:ad:add')">添加
         </el-button>
-        <el-button @click="remove()" type="danger" icon="el-icon-delete" class="ele-btn-icon" size="small" v-if="permission.includes('sys:ad:dall')">批量删除
+        <el-button @click="remove()" type="danger" icon="el-icon-delete" class="ele-btn-icon" size="small"
+          v-if="permission.includes('sys:ad:dall')">批量删除
         </el-button>
       </div>
       <!-- 数据表格 -->
-      <ele-data-table ref="table" :config="table" :choose.sync="choose" height="calc(100vh - 315px)"  highlight-current-row>
+      <ele-data-table ref="table" :config="table" :choose.sync="choose" height="calc(100vh - 315px)"
+        highlight-current-row>
         <template slot-scope="{index}">
-          <el-table-column type="selection" width="45" align="center" fixed="left"/>
-          <el-table-column type="index" :index="index" label="编号" width="60" align="center" fixed="left" show-overflow-tooltip/>
+          <el-table-column type="selection" width="45" align="center" fixed="left" />
+          <el-table-column type="index" :index="index" label="编号" width="60" align="center" fixed="left"
+            show-overflow-tooltip />
           <el-table-column label="广告封面" min-width="100" align="center">
             <template slot-scope="{row}">
-              <el-avatar shape="square" :size="25" :src="row.cover"/>
+              <el-avatar shape="square" :size="25" :src="row.cover" />
             </template>
           </el-table-column>
-          <el-table-column prop="title" label="广告标题" sortable="custom" show-overflow-tooltip min-width="200"/>
-          <el-table-column prop="position" label="所属广告位" sortable="custom" show-overflow-tooltip min-width="200">
+          <el-table-column prop="title" label="广告标题" sortable="custom" show-overflow-tooltip min-width="200" />
+          <el-table-column prop="position" label="所属广告位" sortable="custom" show-overflow-tooltip min-width="120">
             <template slot-scope="{row}">
-             <span class="ele-text-primary" v-if="row.position == 1">首页</span>
+              <span v-if="row.position == 1">主页轮播图</span>
+              <span v-else-if="row.position == 2">会员中心占位图</span>
             </template>
           </el-table-column>
-          <el-table-column prop="url" label="广告地址" show-overflow-tooltip min-width="200" align="center"/>
+          <el-table-column prop="type" label="广告类型" show-overflow-tooltip min-width="100">
+            <template slot-scope="{row}">
+              <span v-if="row.type == 1">站内链接</span>
+              <span v-else-if="row.type == 2">站外链接</span>
+              <span v-else-if="row.type == 3">其他小程序</span>
+              <span v-else-if="row.type == 4">微信视频号</span>
+            </template>
+          </el-table-column>
+          <el-table-column prop="url" label="广告地址" show-overflow-tooltip min-width="200" align="center" />
           <el-table-column prop="status" label="状态" sortable min-width="100">
             <template slot-scope="{row}">
-              <ele-dot :type="['danger', 'success'][row.status]" :ripple="row.status===0"
-                        :text="['禁用','正常'][row.status]"/>
+              <ele-dot :type="['success', 'danger'][row.status - 1]" :ripple="row.status === 1"
+                :text="['在用', '停用'][row.status - 1]" />
             </template>
           </el-table-column>
-          <el-table-column prop="sort" label="排序" sortable="custom" show-overflow-tooltip/>
+          <el-table-column prop="sort" label="排序" sortable="custom" show-overflow-tooltip />
           <el-table-column label="创建时间" sortable="custom" show-overflow-tooltip min-width="160">
             <template slot-scope="{row}">{{ row.create_time | toDateString }}</template>
           </el-table-column>
-          <el-table-column label="操作" width="130px" align="center" :resizable="false"  fixed="right">
+          <el-table-column label="操作" width="130px" align="center" :resizable="false" fixed="right">
             <template slot-scope="{row}">
-              <el-link @click="edit(row)" icon="el-icon-edit" type="primary" :underline="false" v-if="permission.includes('sys:ad:edit')">修改</el-link>
+              <el-link @click="edit(row)" icon="el-icon-edit" type="primary" :underline="false"
+                v-if="permission.includes('sys:ad:edit')">修改</el-link>
               <el-popconfirm title="确定要删除此广告吗?" @confirm="remove(row)" class="ele-action">
-                <el-link slot="reference" icon="el-icon-delete" type="danger" :underline="false" v-if="permission.includes('sys:ad:delete')">删除</el-link>
+                <el-link slot="reference" icon="el-icon-delete" type="danger" :underline="false"
+                  v-if="permission.includes('sys:ad:delete')">删除</el-link>
               </el-popconfirm>
             </template>
           </el-table-column>
@@ -65,44 +80,113 @@
       </ele-data-table>
     </el-card>
     <!-- 编辑弹窗 -->
-    <el-dialog :title="editForm.id?'修改广告':'修改广告'" :visible.sync="showEdit" width="700px"
-               @closed="editForm={status: 1,position: 1}" :destroy-on-close="true" custom-class="ele-dialog-form" :lock-scroll="false">
-      <el-form :model="editForm" ref="editForm" :rules="editRules" label-width="100px">
-        <el-form-item label="广告图片:">
+    <el-dialog :title="editForm.id ? '修改广告' : '添加广告'" :visible.sync="showEdit" width="800px"
+      @closed="editForm = { status: 1, position: 1, type: 1, link_type: 1 }" :destroy-on-close="true"
+      custom-class="ele-dialog-form" :lock-scroll="false">
+      <el-form :model="editForm" ref="editForm" :rules="editRules" label-width="120px">
+        <el-form-item label="广告图片:" prop="cover">
           <uploadImage :limit="1" v-model="editForm.cover"></uploadImage>
         </el-form-item>
         <el-row :gutter="15">
           <el-col :sm="12">
             <el-form-item label="广告标题:" prop="title">
-              <el-input v-model="editForm.title" placeholder="请输入广告标题" clearable/>
+              <el-input v-model="editForm.title" placeholder="请输入广告标题" clearable />
             </el-form-item>
-            <el-form-item label="广告URL:" prop="url">
-              <el-input v-model="editForm.url" placeholder="请输入广告URL" clearable/>
+          </el-col>
+          <el-col :sm="12">
+            <el-form-item label="广告位:" prop="position">
+              <el-select v-model="editForm.position" placeholder="请选择广告位" class="ele-block" clearable>
+                <el-option label="主页轮播图" :value="1" />
+                <el-option label="会员中心占位图" :value="2" />
+              </el-select>
             </el-form-item>
-            <el-form-item label="排序号:" prop="sort">
-              <el-input-number v-model="editForm.sort" controls-position="right" :min="0"
-                                placeholder="请输入排序号" class="ele-fluid ele-text-left"/>
+          </el-col>
+        </el-row>
+        <el-row :gutter="15">
+          <el-col :sm="12">
+            <el-form-item label="广告类型:" prop="type">
+              <el-select v-model="editForm.type" placeholder="请选择广告类型" class="ele-block" clearable
+                @change="handleTypeChange">
+                <el-option label="站内链接" :value="1" />
+                <el-option label="站外链接" :value="2" />
+                <el-option label="其他小程序" :value="3" />
+                <el-option label="微信视频号" :value="4" />
+              </el-select>
             </el-form-item>
           </el-col>
           <el-col :sm="12">
-            <el-form-item label="广告位" prop="position" :rules="{
-                    required: true, message: '所属广告位不能为空', trigger: 'change'
-                  }">
-              <el-select v-model="editForm.position" placeholder="请选择广告位" class="ele-block" clearable>
-                <el-option label="首页轮播" :value="1"/>
+            <el-form-item label="跳转类型:" prop="link_type">
+              <el-select v-model="editForm.link_type" placeholder="请选择跳转类型" class="ele-block" clearable>
+                <el-option label="默认" :value="1" />
+                <el-option label="小程序" :value="2" />
               </el-select>
             </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="15">
+          <el-col :span="24">
+            <el-form-item label="广告描述:">
+              <el-input v-model="editForm.description" type="textarea" :rows="2" placeholder="请输入广告描述" clearable />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="15">
+          <el-col :span="24">
+            <el-form-item label="广告链接:" prop="url">
+              <el-input v-model="editForm.url" placeholder="请输入广告链接/小程序链接/视频号链接" clearable />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-form-item v-if="editForm.type === 3" label="小程序APPID:" prop="mp_appid">
+          <el-input v-model="editForm.mp_appid" placeholder="请输入小程序APPID" clearable />
+        </el-form-item>
+        <el-row :gutter="15">
+          <el-col :sm="12">
+            <el-form-item label="宽度(px):">
+              <el-input-number v-model="editForm.width" controls-position="right" :min="0" placeholder="请输入宽度"
+                class="ele-fluid ele-text-left" />
+            </el-form-item>
+          </el-col>
+          <el-col :sm="12">
+            <el-form-item label="高度(px):">
+              <el-input-number v-model="editForm.height" controls-position="right" :min="0" placeholder="请输入高度"
+                class="ele-fluid ele-text-left" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="15">
+          <el-col :sm="12">
+            <el-form-item label="开始时间:">
+              <el-date-picker v-model="editForm.start_time" type="datetime" placeholder="选择开始时间"
+                format="yyyy-MM-dd HH:mm:ss" value-format="timestamp" style="width: 100%" />
+            </el-form-item>
+          </el-col>
+          <el-col :sm="12">
+            <el-form-item label="结束时间:">
+              <el-date-picker v-model="editForm.end_time" type="datetime" placeholder="选择结束时间"
+                format="yyyy-MM-dd HH:mm:ss" value-format="timestamp" style="width: 100%" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="15">
+          <el-col :sm="12">
+            <el-form-item label="排序号:" prop="sort">
+              <el-input-number v-model="editForm.sort" controls-position="right" :min="0" placeholder="请输入排序号"
+                class="ele-fluid ele-text-left" />
+            </el-form-item>
+          </el-col>
+          <el-col :sm="12">
             <el-form-item label="广告状态:">
               <el-radio-group v-model="editForm.status">
-                <el-radio :label="1">正常</el-radio>
-                <el-radio :label="2">禁用</el-radio>
+                <el-radio :label="1">在用</el-radio>
+                <el-radio :label="2">用</el-radio>
               </el-radio-group>
             </el-form-item>
           </el-col>
         </el-row>
       </el-form>
       <div slot="footer">
-        <el-button @click="showEdit=false">取消</el-button>
+        <el-button @click="showEdit = false">取消</el-button>
         <el-button type="primary" @click="save">保存</el-button>
       </div>
     </el-dialog>
@@ -114,27 +198,31 @@ import uploadImage from '@/components/uploadImage'
 import { mapGetters } from "vuex";
 export default {
   name: "SysAd",
-  components: {uploadImage},
+  components: { uploadImage },
   data() {
     return {
-      table: {url: '/ad/index', where: {}},  // 表格配置
+      table: { url: '/ad/index', where: {} },  // 表格配置
       choose: [],  // 表格选中数据
       showEdit: false,  // 是否显示表单弹窗
-      editForm: {status:1,position: 1},  // 表单数据
+      editForm: {
+        status: 1,
+        position: 1,
+        type: 1,
+        link_type: 1
+      },  // 表单数据
       editRules: {  // 表单验证规则
         title: [
-          {required: true, message: '请输入广告标题', trigger: 'blur'}
+          { required: true, message: '请输入广告标题', trigger: 'blur' }
         ],
         position: [
-          {required: true, message: '请选择所属广告位', trigger: 'blur'}
+          { required: true, message: '请选择所属广告位', trigger: 'blur' }
         ],
         type: [
-          {required: true, message: '请选择广告类型', trigger: 'blur'}
+          { required: true, message: '请选择广告类型', trigger: 'blur' }
         ],
-
       },
       // 广告位列表
-      adSortList:[],
+      adSortList: [],
     }
   },
   computed: {
@@ -147,18 +235,32 @@ export default {
     /* 显示编辑 */
     edit(row) {
       this.editForm = Object.assign({}, row);
+      // 转换时间戳为日期选择器需要的格式
+      if (this.editForm.start_time && typeof this.editForm.start_time === 'string') {
+        this.editForm.start_time = new Date(this.editForm.start_time).getTime();
+      }
+      if (this.editForm.end_time && typeof this.editForm.end_time === 'string') {
+        this.editForm.end_time = new Date(this.editForm.end_time).getTime();
+      }
       this.showEdit = true;
     },
+    /* 处理广告类型变化 */
+    handleTypeChange(value) {
+      // 如果选择小程序类型,设置默认值
+      if (value === 3 && !this.editForm.link_type) {
+        this.editForm.link_type = 2;
+      }
+    },
     /* 保存编辑 */
     save() {
       this.$refs['editForm'].validate((valid) => {
         if (valid) {
-          const loading = this.$loading({lock: true});
+          const loading = this.$loading({ lock: true });
           this.$http.post('/ad/edit', this.editForm).then(res => {
             loading.close();
             if (res.data.code === 0) {
               this.showEdit = false;
-              this.$message({type: 'success', message: res.data.msg});
+              this.$message({ type: 'success', message: res.data.msg });
               this.$refs.table.reload();
             } else {
               this.$message.error(res.data.msg);
@@ -177,12 +279,12 @@ export default {
       if (!row) {  // 批量删除
         if (this.choose.length === 0) return this.$message.error('请至少选择一条数据');
         let ids = this.choose.map(d => d.id);
-        this.$confirm('确定要删除选中的广告吗?', '提示', {type: 'warning'}).then(() => {
-          const loading = this.$loading({lock: true});
-          this.$http.post('/ad/delete', {id: ids}).then(res => {
+        this.$confirm('确定要删除选中的广告吗?', '提示', { type: 'warning' }).then(() => {
+          const loading = this.$loading({ lock: true });
+          this.$http.post('/ad/delete', { id: ids }).then(res => {
             loading.close();
             if (res.data.code === 0) {
-              this.$message({type: 'success', message: res.data.msg});
+              this.$message({ type: 'success', message: res.data.msg });
               this.$refs.table.reload();
             } else {
               this.$message.error(res.data.msg);
@@ -193,11 +295,11 @@ export default {
           });
         }).catch(() => 0);
       } else {  // 单个删除
-        const loading = this.$loading({lock: true});
-        this.$http.post('/ad/delete', {id:row.id}).then(res => {
+        const loading = this.$loading({ lock: true });
+        this.$http.post('/ad/delete', { id: row.id }).then(res => {
           loading.close();
           if (res.data.code === 0) {
-            this.$message({type: 'success', message: res.data.msg});
+            this.$message({ type: 'success', message: res.data.msg });
             this.$refs.table.reload();
           } else {
             this.$message.error(res.data.msg);
@@ -213,7 +315,8 @@ export default {
 </script>
 
 <style scoped>
-.ele-block >>> .el-upload, .ele-block >>> .el-upload-dragger {
+.ele-block>>>.el-upload,
+.ele-block>>>.el-upload-dragger {
   width: 100%;
 }
 </style>

+ 0 - 1
app/Models/AdModel.php

@@ -49,5 +49,4 @@ class AdModel extends BaseModel
         }
         return $info;
     }
-
 }

+ 27 - 12
app/Services/Common/AdService.php

@@ -42,25 +42,25 @@ class AdService extends BaseService
      * @param int $num
      * @return array|mixed
      */
-    public function getListByPosition($position, $num=0)
+    public function getListByPosition($position, $num = 0)
     {
         $cacheKey = "caches:banners:{$position}";
         $datas = RedisService::get($cacheKey);
-        if($datas){
+        if ($datas) {
             return $datas;
         }
 
         $showNum = \App\Services\ConfigService::make()->getConfigByCode('show_banner_num', 6);
-        $num = $num? $num : $showNum;
-        $datas = $this->model->where(['position'=> $position,'status'=> 1,'mark'=>1])
-            ->select(['id','cover','title','url','description','type'])
+        $num = $num ? $num : $showNum;
+        $datas = $this->model->where(['position' => $position, 'status' => 1, 'mark' => 1])
+            ->select(['id', 'cover', 'title', 'url', 'description', 'type'])
             ->limit($num)
             ->get()
-            ->each(function($item, $k){
-                $item['cover'] = $item['cover']? get_image_url($item['cover']) : '';
+            ->each(function ($item, $k) {
+                $item['cover'] = $item['cover'] ? get_image_url($item['cover']) : '';
             });
-        $datas = $datas? $datas->toArray() : [];
-        if($datas){
+        $datas = $datas ? $datas->toArray() : [];
+        if ($datas) {
             RedisService::set($cacheKey, $datas, rand(5, 10));
         }
 
@@ -77,14 +77,30 @@ class AdService extends BaseService
     {
         $data = request()->all();
         // 图片处理
-        if(isset($data['cover'])){
+        if (isset($data['cover'])) {
             $data['cover'] = get_image_path($data['cover']);
         }
 
+        // 开始时间
+        if (isset($data['start_time'])) {
+            // 如果是时间戳(整数),直接使用
+            if (is_numeric($data['start_time'])) {
+                $data['start_time'] = (int)$data['start_time'];
+            } else {
+                $data['start_time'] = strtotime($data['start_time']);
+            }
+        }
+
         // 结束时间
         if (isset($data['end_time'])) {
-            $data['end_time'] = strtotime($data['end_time']);
+            // 如果是时间戳(整数),直接使用
+            if (is_numeric($data['end_time'])) {
+                $data['end_time'] = (int)$data['end_time'];
+            } else {
+                $data['end_time'] = strtotime($data['end_time']);
+            }
         }
+
         return parent::edit($data); // TODO: Change the autogenerated stub
     }
 
@@ -99,5 +115,4 @@ class AdService extends BaseService
         $this->model->where('mark', 0)->where('update_time', '<=', time() - 7 * 86400)->delete();
         return parent::delete();
     }
-
 }