achao vor 1 Jahr
Ursprung
Commit
66f9e0bcd4

+ 71 - 0
unimall-admin-api/src/main/java/com/iotechn/unimall/admin/api/cloud/IAboutUsHxinfoService.java

@@ -0,0 +1,71 @@
+package com.iotechn.unimall.admin.api.cloud;
+
+
+import com.iotechn.unimall.data.domain.AboutUsHxinfo;
+import com.iotechn.unimall.core.annotation.HttpMethod;
+import com.iotechn.unimall.core.annotation.HttpOpenApi;
+import com.iotechn.unimall.core.annotation.HttpParam;
+import com.iotechn.unimall.core.annotation.HttpParamType;
+import com.iotechn.unimall.core.annotation.param.NotNull;
+import com.iotechn.unimall.core.exception.ServiceException;
+import com.iotechn.unimall.data.model.Page;
+import java.util.Date;
+
+/**
+ * 关于我们核心价值Service接口
+ * 
+ * @author jlb
+ * @date 2023-06-27
+ */
+@HttpOpenApi(group = "admin.cloud.aboutUsHxinfo", description = "关于我们核心价值")
+public interface IAboutUsHxinfoService{
+	@HttpMethod(description = "新增",   permissionName = "关于我们核心价值管理")
+	public Boolean add(@NotNull @HttpParam(name = "aboutUsHxinfo", type = HttpParamType.COMMON, description = "关于我们核心价值") AboutUsHxinfo aboutUsHxinfo)throws ServiceException;
+
+	@HttpMethod(description = "列表", permissionName = "关于我们核心价值管理")
+	public Page<AboutUsHxinfo> list(
+								@HttpParam(name = "title", type = HttpParamType.COMMON, description = "标题") String title,
+							@HttpParam(name = "deputyTitle", type = HttpParamType.COMMON, description = "副标题") String deputyTitle,
+							@HttpParam(name = "coverImage", type = HttpParamType.COMMON, description = "封面图片") String coverImage,
+							@HttpParam(name = "videoUrl", type = HttpParamType.COMMON, description = "视频地址") String videoUrl,
+							@HttpParam(name = "classify", type = HttpParamType.COMMON, description = "分类") String classify,
+							@HttpParam(name = "content", type = HttpParamType.COMMON, description = "内容") String content,
+							@HttpParam(name = "details", type = HttpParamType.COMMON, description = "详情") String details,
+							@HttpParam(name = "language", type = HttpParamType.COMMON, description = "语言") String language,
+							@HttpParam(name = "status", type = HttpParamType.COMMON, description = "状态") String status,
+							@HttpParam(name = "gmtCreate", type = HttpParamType.COMMON, description = "") Date gmtCreate,
+							@HttpParam(name = "gmtUpdate", type = HttpParamType.COMMON, description = "") Date gmtUpdate,
+							@HttpParam(name = "deleteFlag", type = HttpParamType.COMMON, description = "删除标识") Long deleteFlag,
+							@HttpParam(name = "pid", type = HttpParamType.COMMON, description = "") Long pid,
+					@HttpParam(name = "page", type = HttpParamType.COMMON, description = "页码", valueDef = "1") Integer page,
+		@HttpParam(name = "limit", type = HttpParamType.COMMON, description = "页码长度", valueDef = "20") Integer limit)
+		throws ServiceException;
+
+	@HttpMethod(description = "删除",permissionName = "关于我们核心价值管理")
+	public Boolean delete(@NotNull @HttpParam(name = "id", type = HttpParamType.COMMON, description = "")String id)throws ServiceException;
+
+	@HttpMethod(description = "修改",  permissionName = "关于我们核心价值管理")
+	public Boolean update(@NotNull @HttpParam(name = "aboutUsHxinfo", type = HttpParamType.COMMON, description = "关于我们核心价值") AboutUsHxinfo aboutUsHxinfo)throws ServiceException;
+
+	@HttpMethod(description = "查询", permissionName = "关于我们核心价值管理")
+	public AboutUsHxinfo get(@NotNull @HttpParam(name = "id", type = HttpParamType.COMMON, description = "")Long id)throws ServiceException;
+	
+	@HttpMethod(description = "导出excl表",  permissionName = "关于我们核心价值管理")
+	public String export(
+								@HttpParam(name = "title", type = HttpParamType.COMMON, description = "标题") String title,
+							@HttpParam(name = "deputyTitle", type = HttpParamType.COMMON, description = "副标题") String deputyTitle,
+							@HttpParam(name = "coverImage", type = HttpParamType.COMMON, description = "封面图片") String coverImage,
+							@HttpParam(name = "videoUrl", type = HttpParamType.COMMON, description = "视频地址") String videoUrl,
+							@HttpParam(name = "classify", type = HttpParamType.COMMON, description = "分类") String classify,
+							@HttpParam(name = "content", type = HttpParamType.COMMON, description = "内容") String content,
+							@HttpParam(name = "details", type = HttpParamType.COMMON, description = "详情") String details,
+							@HttpParam(name = "language", type = HttpParamType.COMMON, description = "语言") String language,
+							@HttpParam(name = "status", type = HttpParamType.COMMON, description = "状态") String status,
+							@HttpParam(name = "gmtCreate", type = HttpParamType.COMMON, description = "") Date gmtCreate,
+							@HttpParam(name = "gmtUpdate", type = HttpParamType.COMMON, description = "") Date gmtUpdate,
+							@HttpParam(name = "deleteFlag", type = HttpParamType.COMMON, description = "删除标识") Long deleteFlag,
+							@HttpParam(name = "pid", type = HttpParamType.COMMON, description = "") Long pid,
+				@HttpParam(name = "page", type = HttpParamType.COMMON, description = "页码", valueDef = "1") Integer page,
+	@HttpParam(name = "limit", type = HttpParamType.COMMON, description = "页码长度", valueDef = "20") Integer limit)throws ServiceException;
+	
+}

+ 160 - 0
unimall-admin-api/src/main/java/com/iotechn/unimall/admin/api/cloud/impl/AboutUsHxinfoServiceImpl.java

@@ -0,0 +1,160 @@
+package com.iotechn.unimall.admin.api.cloud.impl;
+
+import java.util.List;
+
+import org.apache.ibatis.session.RowBounds;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.mapper.Wrapper;
+import com.iotechn.unimall.core.exception.ServiceException;
+import com.iotechn.unimall.data.util.ExcelUtil;
+import com.iotechn.unimall.data.mapper.AboutUsHxinfoMapper;
+import com.iotechn.unimall.data.domain.AboutUsHxinfo;
+import com.iotechn.unimall.admin.api.cloud.IAboutUsHxinfoService;
+import com.iotechn.unimall.data.model.Page;
+import java.util.Date;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * 关于我们核心价值Service业务层处理
+ * 
+ * @author jlb
+ * @date 2023-06-27
+ */
+@Service
+public class AboutUsHxinfoServiceImpl implements IAboutUsHxinfoService{
+	@Autowired
+	private AboutUsHxinfoMapper aboutUsHxinfoMapper;
+	
+	@Override
+	public Boolean add(AboutUsHxinfo aboutUsHxinfo) throws ServiceException {
+		Date now = new Date();
+		aboutUsHxinfo.setGmtCreate(now);
+		aboutUsHxinfo.setGmtUpdate(now);
+		return aboutUsHxinfoMapper.insert(aboutUsHxinfo)>0;
+	}
+
+	@Override
+	public Page<AboutUsHxinfo> list(String title,String deputyTitle,String coverImage,String videoUrl,String classify,String content,String details,String language,String status,Date gmtCreate,Date gmtUpdate,Long deleteFlag,Long pid, Integer page, Integer limit)throws ServiceException {
+		Wrapper<AboutUsHxinfo> wrapper = new EntityWrapper<AboutUsHxinfo>();
+														if (!StringUtils.isEmpty(title)) {
+					wrapper.eq("title", title);
+				}
+												if (!StringUtils.isEmpty(deputyTitle)) {
+					wrapper.eq("deputy_title", deputyTitle);
+				}
+												if (!StringUtils.isEmpty(coverImage)) {
+					wrapper.eq("cover_image", coverImage);
+				}
+												if (!StringUtils.isEmpty(videoUrl)) {
+					wrapper.eq("video_url", videoUrl);
+				}
+												if (!StringUtils.isEmpty(classify)) {
+					wrapper.eq("classify", classify);
+				}
+												if (!StringUtils.isEmpty(content)) {
+					wrapper.eq("content", content);
+				}
+												if (!StringUtils.isEmpty(details)) {
+					wrapper.eq("details", details);
+				}
+												if (!StringUtils.isEmpty(language)) {
+					wrapper.eq("language", language);
+				}
+												if (!StringUtils.isEmpty(status)) {
+					wrapper.eq("status", status);
+				}
+												if (!StringUtils.isEmpty(gmtCreate)) {
+					wrapper.eq("gmt_create", gmtCreate);
+				}
+												if (!StringUtils.isEmpty(gmtUpdate)) {
+					wrapper.eq("gmt_update", gmtUpdate);
+				}
+												if (!StringUtils.isEmpty(deleteFlag)) {
+					wrapper.eq("delete_flag", deleteFlag);
+				}
+												if (!StringUtils.isEmpty(pid)) {
+					wrapper.eq("pid", pid);
+				}
+							wrapper.eq("delete_flag", 0);
+		List<AboutUsHxinfo> list = aboutUsHxinfoMapper.selectPage(new RowBounds((page - 1) * limit, limit), wrapper);
+		Integer count = aboutUsHxinfoMapper.selectCount(wrapper);
+		return new Page<AboutUsHxinfo>(list, page, limit, count);
+	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public Boolean delete(String id) {
+		String[] ids = String.valueOf(id).split(",");
+		for (String tt:ids) {
+			AboutUsHxinfo tmp =  aboutUsHxinfoMapper.selectById(Long.parseLong(tt));
+			if(tmp != null){
+				tmp.setDeleteFlag(1l);
+				aboutUsHxinfoMapper.updateById(tmp);
+			}
+		}
+		return true;
+	}
+
+	@Override
+	public Boolean update(AboutUsHxinfo aboutUsHxinfo) throws ServiceException {
+		Date now = new Date();
+		aboutUsHxinfo.setGmtUpdate(now);
+		return aboutUsHxinfoMapper.updateById(aboutUsHxinfo)>0;
+	}
+
+	@Override
+	public AboutUsHxinfo get(Long id) throws ServiceException {
+		return aboutUsHxinfoMapper.selectById(id);
+	}
+	
+	@Override
+	public String export(String title,String deputyTitle,String coverImage,String videoUrl,String classify,String content,String details,String language,String status,Date gmtCreate,Date gmtUpdate,Long deleteFlag,Long pid, Integer page, Integer limit)throws ServiceException {
+		Wrapper<AboutUsHxinfo> wrapper = new EntityWrapper<AboutUsHxinfo>();
+														if (!StringUtils.isEmpty(title)) {
+					wrapper.eq("title", title);
+				}
+												if (!StringUtils.isEmpty(deputyTitle)) {
+					wrapper.eq("deputy_title", deputyTitle);
+				}
+												if (!StringUtils.isEmpty(coverImage)) {
+					wrapper.eq("cover_image", coverImage);
+				}
+												if (!StringUtils.isEmpty(videoUrl)) {
+					wrapper.eq("video_url", videoUrl);
+				}
+												if (!StringUtils.isEmpty(classify)) {
+					wrapper.eq("classify", classify);
+				}
+												if (!StringUtils.isEmpty(content)) {
+					wrapper.eq("content", content);
+				}
+												if (!StringUtils.isEmpty(details)) {
+					wrapper.eq("details", details);
+				}
+												if (!StringUtils.isEmpty(language)) {
+					wrapper.eq("language", language);
+				}
+												if (!StringUtils.isEmpty(status)) {
+					wrapper.eq("status", status);
+				}
+												if (!StringUtils.isEmpty(gmtCreate)) {
+					wrapper.eq("gmt_create", gmtCreate);
+				}
+												if (!StringUtils.isEmpty(gmtUpdate)) {
+					wrapper.eq("gmt_update", gmtUpdate);
+				}
+												if (!StringUtils.isEmpty(deleteFlag)) {
+					wrapper.eq("delete_flag", deleteFlag);
+				}
+												if (!StringUtils.isEmpty(pid)) {
+					wrapper.eq("pid", pid);
+				}
+							List<AboutUsHxinfo> list = aboutUsHxinfoMapper.selectList(wrapper);
+		ExcelUtil<AboutUsHxinfo> util = new ExcelUtil<AboutUsHxinfo>(AboutUsHxinfo.class);
+		return util.exportExcel(list, "操作日志");
+	}
+}

+ 17 - 0
unimall-admin-api/src/main/java/com/iotechn/unimall/admin/api/cloud/impl/AboutUsInfoServiceImpl.java

@@ -6,6 +6,7 @@ import com.iotechn.unimall.admin.api.cloud.IAboutUsInfoService;
 import org.apache.ibatis.session.RowBounds;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
 import org.springframework.util.StringUtils;
 
 import com.baomidou.mybatisplus.mapper.EntityWrapper;
@@ -18,6 +19,9 @@ import com.iotechn.unimall.data.model.Page;
 import java.util.Date;
 import org.springframework.transaction.annotation.Transactional;
 
+import com.iotechn.unimall.data.domain.AboutUsHxinfo;
+import com.iotechn.unimall.data.mapper.AboutUsHxinfoMapper;
+
 /**
  * 记录关于我们信息Service业务层处理
  * 
@@ -28,6 +32,9 @@ import org.springframework.transaction.annotation.Transactional;
 public class AboutUsInfoServiceImpl implements IAboutUsInfoService {
 	@Autowired
 	private AboutUsInfoMapper aboutUsInfoMapper;
+
+	@Autowired
+	private AboutUsHxinfoMapper aboutUsHxinfoMapper;
 	
 	@Override
 	public Boolean add(AboutUsInfo aboutUsInfo) throws ServiceException {
@@ -78,6 +85,16 @@ public class AboutUsInfoServiceImpl implements IAboutUsInfoService {
 				}
 							wrapper.eq("delete_flag", 0).orderBy("gmt_update",false);
 		List<AboutUsInfo> list = aboutUsInfoMapper.selectPage(new RowBounds((page - 1) * limit, limit), wrapper);
+
+		if (!CollectionUtils.isEmpty(list)){
+			for (AboutUsInfo aboutUsInfo:list){
+				List<AboutUsHxinfo> aboutUsHxinfo = aboutUsHxinfoMapper.selectList(new EntityWrapper<AboutUsHxinfo>()
+						.eq("language",aboutUsInfo.getLanguage()));
+				if (!CollectionUtils.isEmpty(aboutUsHxinfo)) {
+					aboutUsInfo.setAboutUsHxinfoList(aboutUsHxinfo);
+				}
+			}
+		}
 		Integer count = aboutUsInfoMapper.selectCount(wrapper);
 		return new Page<AboutUsInfo>(list, page, limit, count);
 	}

+ 73 - 0
unimall-admin/src/api/cloud/aboutUsHxinfo.js

@@ -0,0 +1,73 @@
+import request from '@/utils/request'
+
+// 查询关于我们核心价值列表
+export function listAboutUsHxinfo(query) {
+  return request({
+    method: 'get',
+    params: {
+      _gp: 'admin.cloud.aboutUsHxinfo',
+      _mt: 'list',
+      ...query
+    }
+  })
+}
+
+// 查询关于我们核心价值详细
+export function getAboutUsHxinfo(id) {
+  return request({
+    method: 'get',
+    params: {
+      _gp: 'admin.cloud.aboutUsHxinfo',
+      _mt: 'get',
+      id: id
+    }
+  })
+}
+
+// 新增关于我们核心价值
+export function addAboutUsHxinfo(data) {
+  return request({
+    method: 'post',
+    params: {
+      _gp: 'admin.cloud.aboutUsHxinfo',
+      _mt: 'add',
+      aboutUsHxinfo: data
+    }
+  })
+}
+
+// 修改关于我们核心价值
+export function updateAboutUsHxinfo(data) {
+  return request({
+    method: 'post',
+    params: {
+      _gp: 'admin.cloud.aboutUsHxinfo',
+      _mt: 'update',
+      aboutUsHxinfo: data
+    }
+  })
+}
+
+// 删除关于我们核心价值
+export function delAboutUsHxinfo(id) {
+  return request({
+    method: 'post',
+    params: {
+      _gp: 'admin.cloud.aboutUsHxinfo',
+      _mt: 'delete',
+      id: id
+    }
+  })
+}
+
+// 导出关于我们核心价值
+export function exportAboutUsHxinfo(query) {
+  return request({
+    method: 'get',
+    params: {
+      _gp: 'admin.cloud.aboutUsHxinfo',
+      _mt: 'export',
+      ...query
+    }
+  })
+}

+ 12 - 2
unimall-admin/src/router/route.json

@@ -159,7 +159,7 @@
         "path": "/aboutUsInfo",
         "meta": {
             "icon": "log",
-            "title": "关于我们管理"
+            "title": "关于我们"
         },
         "alwaysShow": true,
         "children": [
@@ -168,7 +168,17 @@
                 "name": "aboutUsInfo",
                 "page": "/aboutUsInfo",
                 "meta": {
-                    "title": "关于我们列表",
+                    "title": "基本信息",
+                    "icon": "logininfor",
+                    "noCache": true
+                }
+            },
+            {
+                "path": "aboutUsHxinfo",
+                "name": "aboutUsHxinfo",
+                "page": "/aboutUsHxinfo",
+                "meta": {
+                    "title": "核心价值",
                     "icon": "logininfor",
                     "noCache": true
                 }

+ 392 - 0
unimall-admin/src/views/aboutUsHxinfo/index.vue

@@ -0,0 +1,392 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
+      <el-form-item label="标题" prop="title">
+        <el-input
+          v-model="queryParams.title"
+          placeholder="请输入标题"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+
+      <el-form-item label="语言" prop="classification">
+            <el-select v-model="queryParams.language" placeholder="请选择语言" clearable size="small">
+              <el-option label="中文" value="中文" />
+              <el-option label="English" value="English" />
+            </el-select>
+          </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-permission="['cloud:aboutUsInfo:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-permission="['cloud:aboutUsInfo:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-permission="['cloud:aboutUsInfo:remove']"
+        >删除</el-button>
+      </el-col>
+      <!-- <el-col :span="1.5">
+        <el-button
+          type="warning"
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-permission="['cloud:aboutUsInfo:export']"
+        >导出</el-button>
+      </el-col> -->
+    </el-row>
+
+    <el-table v-loading="loading" :data="aboutUsHxinfoList" @selection-change="handleSelectionChange">
+      <!-- <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="" align="center" prop="id" /> -->
+      <el-table-column label="标题" align="center" prop="title" />
+      <!-- <el-table-column label="副标题" align="center" prop="deputyTitle" /> -->
+     
+      <el-table-column label="背景图片" align="center" width="180">
+        <template slot-scope="scope">
+         <img :src="scope.row.coverImage" alt="" style="width:100px;height:50px">
+        </template>
+      </el-table-column>
+      <!-- <el-table-column label="视频地址" align="center" prop="videoUrl" /> -->
+      <!-- <el-table-column label="分类" align="center" prop="classify" /> -->
+      <el-table-column label="内容" align="center" prop="content" />
+      <!-- <el-table-column label="详情" align="center" prop="details" /> -->
+      <el-table-column label="语言" align="center" prop="language" />
+      <el-table-column label="创建时间" align="center" prop="gmtCreate" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.gmtCreate) }}</span>
+        </template>
+      </el-table-column>
+      <!-- <el-table-column label="" align="center" prop="gmtUpdate" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.gmtUpdate) }}</span>
+        </template>
+      </el-table-column> -->
+      
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-permission="['cloud:aboutUsInfo:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-permission="['cloud:aboutUsInfo:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改记录关于我们信息对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px">
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="标题" prop="title">
+          <el-input v-model="form.title" placeholder="请输入标题" />
+        </el-form-item>
+        <!-- <el-form-item label="副标题" prop="deputyTitle">
+          <el-input v-model="form.deputyTitle" placeholder="请输入副标题" />
+        </el-form-item> -->
+        <el-form-item label="背景图片" prop="coverImage">
+          <el-upload
+          ref="mYupload"
+          class="avatar-uploader"
+          :headers="headers"
+          :action="uploadPath"
+          :show-file-list="false"
+          :on-success="uploadSuccessHandle"
+          :before-upload="onBeforeUpload">
+            <img v-if="form.coverImage" :src="form.coverImage" class="avatar">
+            <i v-else class="el-icon-plus avatar-uploader-icon"></i>
+          </el-upload>
+        </el-form-item>
+        <!-- <el-form-item label="视频地址" prop="videoUrl">
+          <el-input v-model="form.videoUrl" placeholder="请输入视频地址" />
+        </el-form-item>
+        <el-form-item label="分类" prop="classify">
+          <el-input v-model="form.classify" placeholder="请输入分类" />
+        </el-form-item> -->
+        <el-form-item label="内容" prop="content">
+          <el-input v-model="form.content" placeholder="请输入内容" />
+        </el-form-item>
+        <!-- <el-form-item label="详情" prop="details">
+          <el-input v-model="form.details" type="textarea" placeholder="请输入内容" />
+        </el-form-item> -->
+        <el-radio-group v-model="form.language">
+        <el-radio-button label="中文"></el-radio-button>
+        <el-radio-button label="English"></el-radio-button>
+      </el-radio-group>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listAboutUsHxinfo, getAboutUsHxinfo, delAboutUsHxinfo, addAboutUsHxinfo, updateAboutUsHxinfo, exportAboutUsHxinfo } from "@/api/cloud/aboutUsHxinfo";
+
+import { uploadPath } from '@/api/storage'
+import { getToken } from '@/utils/auth'
+export default {
+  data() {
+    return {
+      uploadPath,
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 总条数
+      total: 0,
+      // 记录关于我们信息表格数据
+      aboutUsHxinfoList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        title: undefined,
+        deputyTitle: undefined,
+        coverImage: undefined,
+        videoUrl: undefined,
+        classify: undefined,
+        content: undefined,
+        details: undefined,
+        language: undefined,
+        status: undefined,
+        gmtCreate: undefined,
+        gmtUpdate: undefined,
+        deleteFlag: undefined
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+         }
+    };
+  },
+  computed: {
+    headers() {
+      return {
+        accessToken: getToken()
+      }
+    }
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    // 上传图片了处理图片
+    uploadSuccessHandle(e, file) {
+        const that = this
+        this.form.coverImage = e.url
+        this.$forceUpdate()
+      },
+      onBeforeUpload(file) {
+        const isIMAGE = file.type === 'image/jpeg' || 'image/gif' || 'image/png' || 'image/jpg'
+        const isLt1M = file.size / 1024 / 1024 < 1
+
+        if (!isIMAGE) {
+          this.$message.error('上传文件只能是图片格式!')
+        }
+        if (!isLt1M) {
+          this.$message.error('上传文件大小不能超过 1MB!')
+        }
+        return isIMAGE && isLt1M
+      },
+      // 上传图片了处理图片
+    uploadSuccessHandle1(e, file) {
+        const that = this
+        this.form.videoUrl = e.url
+        this.$forceUpdate()
+      },
+      
+    /** 查询记录关于我们信息列表 */
+    getList() {
+      this.loading = true;
+      listAboutUsHxinfo(this.queryParams).then(response => {
+        this.aboutUsHxinfoList = response.data.data.items
+        this.total = response.data.data.count
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: undefined,
+        title: undefined,
+        deputyTitle: undefined,
+        coverImage: undefined,
+        videoUrl: undefined,
+        classify: undefined,
+        content: undefined,
+        details: undefined,
+        language: undefined,
+        status: "0",
+        gmtCreate: undefined,
+        gmtUpdate: undefined,
+        deleteFlag: undefined,
+        pid: undefined
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!=1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加关于我们核心价值";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids.join(',')
+      getAboutUsHxinfo(id).then(response => {
+        this.form = response.data.data
+        this.open = true;
+        this.title = "修改关于我们核心价值";
+      });
+    },
+    /** 提交按钮 */
+    submitForm: function() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != undefined) {
+            updateAboutUsHxinfo(this.form).then(response => {
+              if (response.data) {
+                this.msgSuccess("修改成功");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          } else {
+            addAboutUsHxinfo(this.form).then(response => {
+              if (response.data) {
+                this.msgSuccess("新增成功");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids.join(',')
+      this.$confirm('是否确认删除关于我们核心价值编号为"' + ids + '"的数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(function() {
+          return delAboutUsHxinfo(ids);
+        }).then(() => {
+          this.getList();
+          this.msgSuccess("删除成功");
+        }).catch(function() {});
+    }
+  }
+};
+</script>
+<style lang="scss" scoped>
+.avatar-uploader{ 
+  /deep/.el-upload {
+    border: 1px dashed #ccc;
+    border-radius: 6px;
+    cursor: pointer;
+    position: relative;
+    overflow: hidden;
+  }
+}
+ 
+.avatar-uploader .el-upload:hover {
+  border-color: #409EFF;
+}
+.avatar-uploader-icon {
+  font-size: 28px;
+  color: #8c939d;
+  width: 178px;
+  height: 178px;
+  line-height: 178px;
+  text-align: center;
+}
+.avatar {
+  width: 178px;
+  height: 178px;
+  display: block;
+}
+</style>

+ 247 - 136
unimall-admin/src/views/aboutUsInfo/index.vue

@@ -2,21 +2,16 @@
   <div class="app-container">
     <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
       <el-form-item label="标题" prop="title">
-        <el-input
-          v-model="queryParams.title"
-          placeholder="请输入标题"
-          clearable
-          size="small"
-          @keyup.enter.native="handleQuery"
-        />
+        <el-input v-model="queryParams.title" placeholder="请输入标题" clearable size="small"
+          @keyup.enter.native="handleQuery" />
       </el-form-item>
 
       <el-form-item label="语言" prop="classification">
-            <el-select v-model="queryParams.language" placeholder="请选择语言" clearable size="small">
-              <el-option label="中文" value="中文" />
-              <el-option label="English" value="English" />
-            </el-select>
-          </el-form-item>
+        <el-select v-model="queryParams.language" placeholder="请选择语言" clearable size="small">
+          <el-option label="中文" value="中文" />
+          <el-option label="English" value="English" />
+        </el-select>
+      </el-form-item>
       <el-form-item>
         <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
@@ -25,33 +20,16 @@
 
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
-        <el-button
-          type="primary"
-          icon="el-icon-plus"
-          size="mini"
-          @click="handleAdd"
-          v-permission="['cloud:aboutUsInfo:add']"
-        >新增</el-button>
+        <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd"
+          v-permission="['cloud:aboutUsInfo:add']">新增</el-button>
       </el-col>
       <el-col :span="1.5">
-        <el-button
-          type="success"
-          icon="el-icon-edit"
-          size="mini"
-          :disabled="single"
-          @click="handleUpdate"
-          v-permission="['cloud:aboutUsInfo:edit']"
-        >修改</el-button>
+        <el-button type="success" icon="el-icon-edit" size="mini" :disabled="single" @click="handleUpdate"
+          v-permission="['cloud:aboutUsInfo:edit']">修改</el-button>
       </el-col>
       <el-col :span="1.5">
-        <el-button
-          type="danger"
-          icon="el-icon-delete"
-          size="mini"
-          :disabled="multiple"
-          @click="handleDelete"
-          v-permission="['cloud:aboutUsInfo:remove']"
-        >删除</el-button>
+        <el-button type="danger" icon="el-icon-delete" size="mini" :disabled="multiple" @click="handleDelete"
+          v-permission="['cloud:aboutUsInfo:remove']">删除</el-button>
       </el-col>
       <!-- <el-col :span="1.5">
         <el-button
@@ -65,15 +43,39 @@
     </el-row>
 
     <el-table v-loading="loading" :data="aboutUsInfoList" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="55" align="center" />
-      <el-table-column label="" align="center" prop="id" />
-      <el-table-column label="标题" align="center" prop="title" />
-      <el-table-column label="副标题" align="center" prop="deputyTitle" />
-      <el-table-column label="封面图片" align="center" prop="coverImage" />
-      <el-table-column label="视频地址" align="center" prop="videoUrl" />
-      <el-table-column label="分类" align="center" prop="classify" />
-      <el-table-column label="内容" align="center" prop="content" />
-      <el-table-column label="详情" align="center" prop="details" />
+      <!-- <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="" align="center" prop="id" /> -->
+      <el-table-column label="公司标题" align="center" prop="title" />
+      <el-table-column label="公司简介" align="center" prop="details">
+        <template slot-scope="scope">
+          <el-popover trigger="hover" placement="top">
+            <p v-html="scope.row.details"></p>
+            <div slot="reference" class="name-wrapper">
+              <el-tag size="medium">{{ scope.row.details }}</el-tag>
+            </div>
+          </el-popover>
+        </template>
+    </el-table-column>
+      <!-- <el-table-column label="副标题" align="center" prop="deputyTitle" /> -->
+      <el-table-column label="公司封面" align="center" width="180">
+        <template slot-scope="scope">
+          <img :src="scope.row.coverImage" alt="" style="width:100px;height:50px">
+        </template>
+      </el-table-column>
+      <!-- <el-table-column label="时间轴" align="center" prop="coverImage" /> -->
+      <!-- <el-table-column label="视频地址" align="center" prop="videoUrl" /> -->
+      <!-- <el-table-column label="分类" align="center" prop="classify" /> -->
+      <el-table-column label="文章标题" align="center" prop="deputyTitle" />
+      <el-table-column label="文章内容" align="center">
+        <template slot-scope="scope">
+          <el-popover trigger="hover" placement="top">
+            <p v-html="scope.row.content"></p>
+            <div slot="reference" class="name-wrapper">
+              <el-tag size="medium">{{scope.row.content}}</el-tag>
+            </div>
+          </el-popover>
+        </template>
+    </el-table-column>
       <el-table-column label="语言" align="center" prop="language" />
       <el-table-column label="创建时间" align="center" prop="gmtCreate" width="180">
         <template slot-scope="scope">
@@ -85,73 +87,66 @@
           <span>{{ parseTime(scope.row.gmtUpdate) }}</span>
         </template>
       </el-table-column>
-      
+
       <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
         <template slot-scope="scope">
-          <el-button
-            size="mini"
-            type="text"
-            icon="el-icon-edit"
-            @click="handleUpdate(scope.row)"
-            v-permission="['cloud:aboutUsInfo:edit']"
-          >修改</el-button>
-          <el-button
-            size="mini"
-            type="text"
-            icon="el-icon-delete"
-            @click="handleDelete(scope.row)"
-            v-permission="['cloud:aboutUsInfo:remove']"
-          >删除</el-button>
+          <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
+            v-permission="['cloud:aboutUsInfo:edit']">修改</el-button>
+          <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
+            v-permission="['cloud:aboutUsInfo:remove']">删除</el-button>
         </template>
       </el-table-column>
     </el-table>
-    
-    <pagination
-      v-show="total>0"
-      :total="total"
-      :page.sync="queryParams.pageNum"
-      :limit.sync="queryParams.pageSize"
-      @pagination="getList"
-    />
+
+    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize"
+      @pagination="getList" />
 
     <!-- 添加或修改记录关于我们信息对话框 -->
-    <el-dialog :title="title" :visible.sync="open" width="500px">
+    <el-dialog :title="title" :visible.sync="open" width="1000px" @opened="openDialog">
       <el-form ref="form" :model="form" :rules="rules" label-width="80px">
-        <el-form-item label="标题" prop="title">
-          <el-input v-model="form.title" placeholder="请输入标题" />
+        <el-form-item label="公司标题" prop="title">
+          <el-input v-model="form.title" placeholder="请输入公司标题" />
         </el-form-item>
-        <el-form-item label="副标题" prop="deputyTitle">
-          <el-input v-model="form.deputyTitle" placeholder="请输入副标题" />
-        </el-form-item>
-        <el-form-item label="封面图片" prop="coverImage">
-          <el-upload
-          ref="mYupload"
-          class="avatar-uploader"
-          :headers="headers"
-          :action="uploadPath"
-          :show-file-list="false"
-          :on-success="uploadSuccessHandle"
-          :before-upload="onBeforeUpload">
+        <el-form-item label="公司封面" prop="coverImage">
+          <el-upload ref="mYupload" class="avatar-uploader" :headers="headers" :action="uploadPath"
+            :show-file-list="false" :on-success="uploadSuccessHandle" :before-upload="onBeforeUpload">
             <img v-if="form.coverImage" :src="form.coverImage" class="avatar">
             <i v-else class="el-icon-plus avatar-uploader-icon"></i>
           </el-upload>
         </el-form-item>
-        <el-form-item label="视频地址" prop="videoUrl">
-          <el-input v-model="form.videoUrl" placeholder="请输入视频地址" />
+        <el-form-item label="公司简介" prop="details">
+          <!-- <el-input v-model="form.details" type="textarea" placeholder="公司简介" /> -->
+          <textarea id="ck-editor" name="editor" rows="10" cols="80"></textarea>
         </el-form-item>
-        <el-form-item label="分类" prop="classify">
-          <el-input v-model="form.classify" placeholder="请输入分类" />
+        <!-- <el-form-item label="时间轴">
         </el-form-item>
-        <el-form-item label="内容" prop="content">
-          <el-input v-model="form.content" placeholder="请输入内容" />
+        <el-form-item style="display: flex;">
+          <div style="display: flex;" v-for="(item,index) in timeLine">
+            <div style="display: flex;">
+              <span style="width: 100px;">时间</span>
+              <el-input v-model="item.time" placeholder="时间" />
+            </div>
+            <div style="display: flex;margin-left:20px">
+              <span style="width: 40px;">内容</span>
+              <el-input v-model="item.text" placeholder="内容" />
+            </div>
+            <div style="margin-left: 40px;">
+              <span @click="addTimeLine(item,index)">增加</span>
+              <span style="margin-left: 20px;"  @click="jsTimeLine(item,index)">减少</span>
+            </div>
+          </div>
+        </el-form-item> -->
+        <el-form-item label="文章标题" prop="deputyTitle">
+          <el-input v-model="form.deputyTitle" placeholder="请输入文章标题" />
         </el-form-item>
-        <el-form-item label="详情" prop="details">
-          <el-input v-model="form.details" type="textarea" placeholder="请输入内容" />
+        <el-form-item label="文章内容" prop="content">
+          <textarea id="ck-editor1" name="editor" rows="10" cols="80"></textarea>
+          <!-- <el-input v-model="form.content" placeholder="请输入文章内容" type="textarea" /> -->
         </el-form-item>
         <el-radio-group v-model="form.language">
-        <el-radio-button label="中文"></el-radio-button>
-        <el-radio-button label="English"></el-radio-button>
-      </el-radio-group>
+          <el-radio-button label="中文"></el-radio-button>
+          <el-radio-button label="English"></el-radio-button>
+        </el-radio-group>
       </el-form>
       <div slot="footer" class="dialog-footer">
         <el-button type="primary" @click="submitForm">确 定</el-button>
@@ -168,6 +163,16 @@ import { getToken } from '@/utils/auth'
 export default {
   data() {
     return {
+      editor: null,
+      editor1: null,
+      editorData: '<p>Content of the editor.</p>',
+      editorConfig: {
+        // The configuration of the editor.
+      },
+      timeLine: [{
+        time: '',
+        text: ''
+      }],
       uploadPath,
       // 遮罩层
       loading: true,
@@ -206,7 +211,7 @@ export default {
       form: {},
       // 表单校验
       rules: {
-         }
+      }
     };
   },
   computed: {
@@ -218,33 +223,129 @@ export default {
   },
   created() {
     this.getList();
+  },
+  mounted() {
+   
   },
   methods: {
+    openDialog(){
+      window.CKEDITOR.replace('ck-editor', { height: '400px', width: '100%', toolbar: 'toolbar_Full' });
+    this.editor = window.CKEDITOR.instances['ck-editor']
+    this.editor.on('fileUploadRequest', evt => {
+      const requestData = evt.data.requestData
+      const upload = requestData.upload
+      delete requestData.upload
+      requestData.file = upload
+    })
+
+    this.editor.on('fileUploadResponse', evt => {
+      evt.stop();
+      const data = evt.data
+      const fileLoader = data.fileLoader
+      const res = JSON.parse(fileLoader.xhr.responseText)
+      console.log(res)
+      if (res.errno !== 200) {
+        data.message = '上传失败'
+        evt.cancel();
+        return
+      }
+      data.fileName = fileLoader.fileName
+      data.url = res.url
+      data.message = '上传成功'
+    })
+
+    window.CKEDITOR.replace('ck-editor1', { height: '400px', width: '100%', toolbar: 'toolbar_Full' });
+    this.editor1 = window.CKEDITOR.instances['ck-editor1']
+    this.editor1.on('fileUploadRequest', evt => {
+      const requestData = evt.data.requestData
+      const upload = requestData.upload
+      delete requestData.upload
+      requestData.file = upload
+    })
+
+    this.editor1.on('fileUploadResponse', evt => {
+      evt.stop();
+      const data = evt.data
+      const fileLoader = data.fileLoader
+      const res = JSON.parse(fileLoader.xhr.responseText)
+      console.log(res)
+      if (res.errno !== 200) {
+        data.message = '上传失败'
+        evt.cancel();
+        return
+      }
+      data.fileName = fileLoader.fileName
+      data.url = res.url
+      data.message = '上传成功'
+    })
+    },
+    InsertHTML(html) {
+      // Get the editor instance that you want to interact with.
+      // var value = document.getElementById('ck-editor').value;
+      console.log(this.editor.getData())
+      // Check the active editing mode.
+      if (this.editor.mode == 'wysiwyg') {
+        // Insert HTML code.
+        // https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_editor.html#method-insertHtml
+
+        this.editor.setData(html);
+      } else
+        alert('You must be in WYSIWYG mode!');
+    },
+    getContent() {
+      console.log(this.editor.getData())
+    },
+    InsertHTML1(html) {
+      // Get the editor instance that you want to interact with.
+      // var value = document.getElementById('ck-editor').value;
+      console.log(this.editor.getData())
+      // Check the active editing mode.
+      if (this.editor1.mode == 'wysiwyg') {
+        // Insert HTML code.
+        // https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_editor.html#method-insertHtml
+
+        this.editor1.setData(html);
+      } else
+        alert('You must be in WYSIWYG mode!');
+    },
+    getContent1() {
+      console.log(this.editor1.getData())
+    },
+    addTimeLine(val, index) {
+      this.timeLine.push({
+        time: '',
+        text: ''
+      })
+    },
+    jsTimeLine(val, index) {
+      debugger
+      this.timeLine.splice(index, 1)
+    },
     // 上传图片了处理图片
     uploadSuccessHandle(e, file) {
-        const that = this
-        this.form.coverImage = e.url
-        this.$forceUpdate()
-      },
-      onBeforeUpload(file) {
-        const isIMAGE = file.type === 'image/jpeg' || 'image/gif' || 'image/png' || 'image/jpg'
-        const isLt1M = file.size / 1024 / 1024 < 1
+      const that = this
+      this.form.coverImage = e.url
+      this.$forceUpdate()
+    },
+    onBeforeUpload(file) {
+      const isIMAGE = file.type === 'image/jpeg' || 'image/gif' || 'image/png' || 'image/jpg'
+      const isLt1M = file.size / 1024 / 1024 < 1
 
-        if (!isIMAGE) {
-          this.$message.error('上传文件只能是图片格式!')
-        }
-        if (!isLt1M) {
-          this.$message.error('上传文件大小不能超过 1MB!')
-        }
-        return isIMAGE && isLt1M
-      },
-      // 上传图片了处理图片
+      if (!isIMAGE) {
+        this.$message.error('上传文件只能是图片格式!')
+      }
+      if (!isLt1M) {
+        this.$message.error('上传文件大小不能超过 1MB!')
+      }
+      return isIMAGE && isLt1M
+    },
+    // 上传图片了处理图片
     uploadSuccessHandle1(e, file) {
-        const that = this
-        this.form.videoUrl = e.url
-        this.$forceUpdate()
-      },
-      
+      const that = this
+      this.form.videoUrl = e.url
+      this.$forceUpdate()
+    },
+
     /** 查询记录关于我们信息列表 */
     getList() {
       this.loading = true;
@@ -291,7 +392,7 @@ export default {
     // 多选框选中数据
     handleSelectionChange(selection) {
       this.ids = selection.map(item => item.id)
-      this.single = selection.length!=1
+      this.single = selection.length != 1
       this.multiple = !selection.length
     },
     /** 新增按钮操作 */
@@ -305,15 +406,20 @@ export default {
       this.reset();
       const id = row.id || this.ids.join(',')
       getAboutUsInfo(id).then(response => {
+        let that = this
         this.form = response.data.data
+        setTimeout(()=>{that.InsertHTML(that.form.details)},1000) 
+        setTimeout(()=>{that.InsertHTML1(that.form.content)},1000) 
         this.open = true;
         this.title = "修改记录关于我们信息";
       });
     },
     /** 提交按钮 */
-    submitForm: function() {
+    submitForm: function () {
       this.$refs["form"].validate(valid => {
         if (valid) {
+          this.form.details = this.editor.getData()
+          this.form.content = this.editor1.getData()
           if (this.form.id != undefined) {
             updateAboutUsInfo(this.form).then(response => {
               if (response.data) {
@@ -342,34 +448,34 @@ export default {
     handleDelete(row) {
       const ids = row.id || this.ids.join(',')
       this.$confirm('是否确认删除记录关于我们信息编号为"' + ids + '"的数据项?', "警告", {
-          confirmButtonText: "确定",
-          cancelButtonText: "取消",
-          type: "warning"
-        }).then(function() {
-          return delAboutUsInfo(ids);
-        }).then(() => {
-          this.getList();
-          this.msgSuccess("删除成功");
-        }).catch(function() {});
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(function () {
+        return delAboutUsInfo(ids);
+      }).then(() => {
+        this.getList();
+        this.msgSuccess("删除成功");
+      }).catch(function () { });
     },
     /** 导出按钮操作 */
     handleExport() {
       const queryParams = this.queryParams;
       this.$confirm('是否确认导出所有记录关于我们信息数据项?', "警告", {
-          confirmButtonText: "确定",
-          cancelButtonText: "取消",
-          type: "warning"
-        }).then(function() {
-          return exportAboutUsInfo(queryParams);
-        }).then(response => {
-          this.download(response.data.data);
-        }).catch(function() {});
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(function () {
+        return exportAboutUsInfo(queryParams);
+      }).then(response => {
+        this.download(response.data.data);
+      }).catch(function () { });
     }
   }
 };
 </script>
 <style lang="scss" scoped>
-.avatar-uploader{ 
+.avatar-uploader {
   /deep/.el-upload {
     border: 1px dashed #ccc;
     border-radius: 6px;
@@ -378,10 +484,11 @@ export default {
     overflow: hidden;
   }
 }
- 
+
 .avatar-uploader .el-upload:hover {
   border-color: #409EFF;
 }
+
 .avatar-uploader-icon {
   font-size: 28px;
   color: #8c939d;
@@ -390,9 +497,13 @@ export default {
   line-height: 178px;
   text-align: center;
 }
+
 .avatar {
   width: 178px;
   height: 178px;
   display: block;
 }
+.ck-editor__editable {
+  min-height: 400px;
+}
 </style>

+ 220 - 225
unimall-admin/src/views/articleManagement/add.vue

@@ -1,155 +1,145 @@
 <template>
-    <div class="app-container">
-      <el-row style="padding:0 0 20px 0px;">
-        <el-col :span="12"><div class="grid-content bg-purple"><div style="'line-height:35px;'">添加文章</div></div></el-col>
-        <el-col style="text-align:right;" :span="12">
-          <div class="grid-content bg-purple-light">
-            <el-button @click="add" type="success" plain>保存</el-button>
-            <!-- <el-button type="info" plain>复制</el-button> -->
-            <!-- <el-button type="primary" plain>预览</el-button> -->
-          </div>
-        </el-col>
-      </el-row>
-      <el-row>
-        <el-col :span="4">
-          <el-upload
-            ref="mYupload"
-            class="avatar-uploader"
-            :headers="headers"
-            :action="uploadPath"
-            :show-file-list="false"
-            :on-success="uploadSuccessHandle"
-            :before-upload="onBeforeUpload">
-            <img v-if="form.coverImage" :src="form.coverImage" class="avatar">
-            <i v-else class="el-icon-plus avatar-uploader-icon"></i>
-          </el-upload>
-        </el-col>
-        <el-col :span="20">
-            <div class="flex" style="">
-              <el-select style="width:100%;margin-bottom:10px;" v-model="form.classification" placeholder="请选择分类">
-                <el-option label="未分类" value="未分类"></el-option>
-                <el-option
-                  v-for="item in options"
-                  :key="item.id"
-                  :label="item.classifyName"
-                  :value="item.classifyName">
-                </el-option>
-              </el-select>
-              <el-radio-group v-model="form.language" style="margin:0 10px 10px 10px;display:flex">
-                <el-radio-button label="中文"></el-radio-button>
-                <el-radio-button label="English"></el-radio-button>
-              </el-radio-group>
-              <el-radio-group style="margin:0 10px 10px 10px; display:flex" v-model="form.articleClassify">
-                <el-radio-button label="文章"></el-radio-button>
-                <el-radio-button label="百科"></el-radio-button>
-              </el-radio-group>
-            </div>
-         
-          <el-input v-model="form.articleTitle" placeholder="请输入标题"></el-input>
-          <div style="margin-top:10px;">
-            <el-input
-              type="textarea"
-              :rows="4"
-              maxlength="500"
-              placeholder="请输入文章简介(选填,最多支持500个字符)"
-              v-model="form.articleIntroduction">
-            </el-input>
-          </div>
-          
-        </el-col>
-      </el-row>
-      <div class="rich-container">
-        <textarea id="ck-editor"  name="editor" rows="10" cols="80"></textarea>
-      </div>
+  <div class="app-container">
+    <el-row style="padding:0 0 20px 0px;">
+      <el-col :span="12">
+        <div class="grid-content bg-purple">
+          <div style="'line-height:35px;'">添加文章</div>
+        </div>
+      </el-col>
+      <el-col style="text-align:right;" :span="12">
+        <div class="grid-content bg-purple-light">
+          <el-button @click="add" type="success" plain>保存</el-button>
+          <!-- <el-button type="info" plain>复制</el-button> -->
+          <!-- <el-button type="primary" plain>预览</el-button> -->
+        </div>
+      </el-col>
+    </el-row>
+    <el-row>
+      <el-col :span="4">
+        <el-upload ref="mYupload" class="avatar-uploader" :headers="headers" :action="uploadPath" :show-file-list="false"
+          :on-success="uploadSuccessHandle" :before-upload="onBeforeUpload">
+          <img v-if="form.coverImage" :src="form.coverImage" class="avatar">
+          <i v-else class="el-icon-plus avatar-uploader-icon"></i>
+        </el-upload>
+      </el-col>
+      <el-col :span="20">
+        <div class="flex" style="">
+          <el-select style="width:100%;margin-bottom:10px;" v-model="form.classification" placeholder="请选择分类">
+            <el-option label="未分类" value="未分类"></el-option>
+            <el-option v-for="item in options" :key="item.id" :label="item.classifyName" :value="item.classifyName">
+            </el-option>
+          </el-select>
+          <el-radio-group v-model="form.language" style="margin:0 10px 10px 10px;display:flex">
+            <el-radio-button label="中文"></el-radio-button>
+            <el-radio-button label="English"></el-radio-button>
+          </el-radio-group>
+          <el-radio-group style="margin:0 10px 10px 10px; display:flex" v-model="form.articleClassify">
+            <el-radio-button label="文章"></el-radio-button>
+            <el-radio-button label="百科"></el-radio-button>
+          </el-radio-group>
+        </div>
 
-  <div class="searchTitle flex">
-    <div>搜索关键词</div> 
+        <el-input v-model="form.articleTitle" placeholder="请输入标题"></el-input>
+        <div style="margin-top:10px;">
+          <el-input type="textarea" :rows="4" maxlength="500" placeholder="请输入文章简介(选填,最多支持500个字符)"
+            v-model="form.articleIntroduction">
+          </el-input>
+        </div>
+
+      </el-col>
+    </el-row>
+    <div class="rich-container">
+      <textarea id="ck-editor" name="editor" rows="10" cols="80"></textarea>
+    </div>
+
+    <div class="searchTitle flex">
+      <div>搜索关键词</div>
+    </div>
+    <el-input @keyup.enter.native="keyup" v-model="form.searchKeywords"
+      placeholder="关键词将使用该网站的搜索结果更加准确,每篇文章最多填写5个,每个关键词之间请按回车键分隔"></el-input>
   </div>
-  <el-input @keyup.enter.native="keyup" v-model="form.searchKeywords" placeholder="关键词将使用该网站的搜索结果更加准确,每篇文章最多填写5个,每个关键词之间请按回车键分隔"></el-input>
-   </div> 
-  </template>
+</template>
   
-  <script>
-  import { listDict, addManagement } from "@/api/cloud/articleManagement";
-  import { uploadPath } from '@/api/storage'
-  import { getToken } from '@/utils/auth'
-  export default {
-    data() {
-      return {
-        uploadPath,
-        editor: null,
-        // 表单参数
-        form: {classification:'未分类',language:'中文',articleClassify:'文章'},
-        input:'',
-        // 表单校验
-        rules: {
-          gmtCreate: [
-            { required: true, message: "不能为空", trigger: "blur" }
-          ],        gmtUpdate: [
-            { required: true, message: "不能为空", trigger: "blur" }
-          ],        deleteFlag: [
-            { required: true, message: "删除标识不能为空", trigger: "blur" }
-          ]      
-        },
-        options:[],
-        editor: null,
-        editorData: '<p>Content of the editor.</p>',
-        editorConfig: {
-          // The configuration of the editor.
-        }
+<script>
+import { listDict, addManagement } from "@/api/cloud/articleManagement";
+import { uploadPath } from '@/api/storage'
+import { getToken } from '@/utils/auth'
+export default {
+  data() {
+    return {
+      uploadPath,
+      // 表单参数
+      form: { classification: '未分类', language: '中文', articleClassify: '文章' },
+      input: '',
+      // 表单校验
+      rules: {
+        gmtCreate: [
+          { required: true, message: "不能为空", trigger: "blur" }
+        ], gmtUpdate: [
+          { required: true, message: "不能为空", trigger: "blur" }
+        ], deleteFlag: [
+          { required: true, message: "删除标识不能为空", trigger: "blur" }
+        ]
+      },
+      options: [],
+      editor: null,
+      editorData: '<p>Content of the editor.</p>',
+      editorConfig: {
+        // The configuration of the editor.
       }
-    },
-    computed: {
+    }
+  },
+  computed: {
     headers() {
       return {
         accessToken: getToken()
       }
     }
   },
-    created() {
-      // this.getList();
-    },
-    mounted() {
-      window.CKEDITOR.replace('ck-editor', {height: '400px', width: '100%', toolbar: 'toolbar_Full'});
-      this.editor = window.CKEDITOR.instances['ck-editor']
-      let that = this;
-		this.editor.on('fileUploadRequest', evt => {
-			const requestData = evt.data.requestData
-			const upload = requestData.upload
-			delete requestData.upload
-			requestData.file = upload
-		})
+  created() {
+    // this.getList();
+  },
+  mounted() {
+    window.CKEDITOR.replace('ck-editor', { height: '400px', width: '100%', toolbar: 'toolbar_Full' });
+    this.editor = window.CKEDITOR.instances['ck-editor']
+    let that = this;
+    this.editor.on('fileUploadRequest', evt => {
+      const requestData = evt.data.requestData
+      const upload = requestData.upload
+      delete requestData.upload
+      requestData.file = upload
+    })
 
-		this.editor.on('fileUploadResponse', evt => {
-			evt.stop();
-			const data = evt.data
-			const fileLoader = data.fileLoader
-			const res = JSON.parse(fileLoader.xhr.responseText)
+    this.editor.on('fileUploadResponse', evt => {
+      evt.stop();
+      const data = evt.data
+      const fileLoader = data.fileLoader
+      const res = JSON.parse(fileLoader.xhr.responseText)
       console.log(res)
-			if (res.errno !== 200) {
-				data.message = '上传失败'
-				evt.cancel();
-				return
-			}
-			data.fileName = fileLoader.fileName
-			data.url = res.url
-			data.message = '上传成功'
-		})
+      if (res.errno !== 200) {
+        data.message = '上传失败'
+        evt.cancel();
+        return
+      }
+      data.fileName = fileLoader.fileName
+      data.url = res.url
+      data.message = '上传成功'
+    })
 
 
 
-      listDict({ classifyType:'article_type',}).then(response => {
-        this.options=response.data.data.items
-      });
-      // this.initEditor()
-    },
-    methods: {
-      InsertHTML(html) {
+    listDict({ classifyType: 'article_type', }).then(response => {
+      this.options = response.data.data.items
+    });
+    // this.initEditor()
+  },
+  methods: {
+    InsertHTML(html) {
       // Get the editor instance that you want to interact with.
       // var value = document.getElementById('ck-editor').value;
       console.log(this.editor.getData())
       // Check the active editing mode.
-      if ( this.editor.mode == 'wysiwyg') {
+      if (this.editor.mode == 'wysiwyg') {
         // Insert HTML code.
         // https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_editor.html#method-insertHtml
 
@@ -157,104 +147,109 @@
       } else
         alert('You must be in WYSIWYG mode!');
     },
-      getContent() {
-        console.log(this.editor.getData())
-      },
-      keyup(e){
-        var content= this.form.searchKeywords.split(',')
-        if(content.length>5){
-          this.$message.error('关键词最多5个!')
-        }else{
-          if(this.form.searchKeywords[this.form.searchKeywords.length-1]==','){
-            this.$message.error('请输入关键词内容!')
-          }else{
-            this.form.searchKeywords=this.form.searchKeywords+','
-          }
+    getContent() {
+      console.log(this.editor.getData())
+    },
+    keyup(e) {
+      var content = this.form.searchKeywords.split(',')
+      if (content.length > 5) {
+        this.$message.error('关键词最多5个!')
+      } else {
+        if (this.form.searchKeywords[this.form.searchKeywords.length - 1] == ',') {
+          this.$message.error('请输入关键词内容!')
+        } else {
+          this.form.searchKeywords = this.form.searchKeywords + ','
         }
-        
-      },
-      // 上传图片了处理图片
-      uploadSuccessHandle(e, file) {
-        const that = this
-        this.form.coverImage = e.url
-        this.$forceUpdate()
-        console.log(e,this.editor.getData())
-         
-        
-      
-        console.log(this.form,this.editor)
-      },
-      onBeforeUpload(file) {
-        const isIMAGE = file.type === 'image/jpeg' || 'image/gif' || 'image/png' || 'image/jpg'
-        const isLt1M = file.size / 1024 / 1024 < 1
+      }
 
-        if (!isIMAGE) {
-          this.$message.error('上传文件只能是图片格式!')
-        }
-        if (!isLt1M) {
-          this.$message.error('上传文件大小不能超过 1MB!')
-        }
-        return isIMAGE && isLt1M
-      },
-      add(){
-       if(this.form.searchKeywords){
-        if(this.form.searchKeywords.split(',').length>5){
+    },
+    // 上传图片了处理图片
+    uploadSuccessHandle(e, file) {
+      const that = this
+      this.form.coverImage = e.url
+      this.$forceUpdate()
+      console.log(e, this.editor.getData())
+
+
+
+      console.log(this.form, this.editor)
+    },
+    onBeforeUpload(file) {
+      const isIMAGE = file.type === 'image/jpeg' || 'image/gif' || 'image/png' || 'image/jpg'
+      const isLt1M = file.size / 1024 / 1024 < 1
+
+      if (!isIMAGE) {
+        this.$message.error('上传文件只能是图片格式!')
+      }
+      if (!isLt1M) {
+        this.$message.error('上传文件大小不能超过 1MB!')
+      }
+      return isIMAGE && isLt1M
+    },
+    add() {
+      if (this.form.searchKeywords) {
+        if (this.form.searchKeywords.split(',').length > 5) {
           this.$message.error('关键词最多5个!')
-          return 
+          return
         }
-       }
-        
-        this.form.content=this.editor.getData()
-        addManagement(this.form).then(response => {
-          if (response.data) {
-            this.msgSuccess("新增成功");
-            this.$refs['mYupload'].clearFiles();
-            this.form={classification:'未分类'}
-            this.$router.go(-1)
-          } else {
-            this.msgError(response.msg);
-          }
-        });
       }
-        
-    }
-  };
-  </script>
-  <style lang="scss" scoped>
-  .avatar-uploader{ 
-    /deep/.el-upload {
-      border: 1px dashed #ccc;
-      border-radius: 6px;
-      cursor: pointer;
-      position: relative;
-      overflow: hidden;
+
+      this.form.content = this.editor.getData()
+      addManagement(this.form).then(response => {
+        if (response.data) {
+          this.msgSuccess("新增成功");
+          this.$refs['mYupload'].clearFiles();
+          this.form = { classification: '未分类' }
+          this.$router.go(-1)
+        } else {
+          this.msgError(response.msg);
+        }
+      });
     }
+
   }
-   
-  .avatar-uploader .el-upload:hover {
-    border-color: #409EFF;
-  }
-  .avatar-uploader-icon {
-    font-size: 28px;
-    color: #8c939d;
-    width: 183px;
-    height: 183px;
-    line-height: 183px;
-    text-align: center;
-  }
-  .avatar {
-    width: 183px;
-    height: 183px;
-    display: block;
-  }
-  .searchTitle{
-    margin:20px 0;
-  }
-  /*编辑框最低高度*/
-  .ck-editor__editable{
-    min-height: 400px;
-  }
-  .rich-container{
-    margin-top:20px;
+};
+</script>
+<style lang="scss" scoped>
+.avatar-uploader {
+  /deep/.el-upload {
+    border: 1px dashed #ccc;
+    border-radius: 6px;
+    cursor: pointer;
+    position: relative;
+    overflow: hidden;
   }
-  </style>
+}
+
+.avatar-uploader .el-upload:hover {
+  border-color: #409EFF;
+}
+
+.avatar-uploader-icon {
+  font-size: 28px;
+  color: #8c939d;
+  width: 183px;
+  height: 183px;
+  line-height: 183px;
+  text-align: center;
+}
+
+.avatar {
+  width: 183px;
+  height: 183px;
+  display: block;
+}
+
+.searchTitle {
+  margin: 20px 0;
+}
+
+/*编辑框最低高度*/
+.ck-editor__editable {
+  min-height: 400px;
+}
+
+.rich-container {
+  margin-top: 20px;
+}
+</style>

+ 1 - 0
unimall-admin/src/views/imageManagement/index.vue

@@ -79,6 +79,7 @@
           </template>
         </el-table-column>
         <el-table-column label="图片分类" align="center" prop="classify" />
+        <el-table-column label="图片标题" align="center" prop="imageTitle" />
         <el-table-column label="语言" align="center" prop="language" />
         <el-table-column label="创建时间" align="center" prop="gmtCreate" width="180">
           <template slot-scope="scope">

+ 115 - 0
unimall-data/src/main/java/com/iotechn/unimall/data/domain/AboutUsHxinfo.java

@@ -0,0 +1,115 @@
+package com.iotechn.unimall.data.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.iotechn.unimall.core.framework.aspectj.lang.annotaion.Excel;
+import com.iotechn.unimall.core.framework.aspectj.lang.annotaion.Excel.ColumnType;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import lombok.Data;
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.enums.FieldFill;
+import com.iotechn.unimall.core.util.StringUtils;
+import java.util.Date;
+
+/**
+ * 关于我们核心价值对象 about_us_hxinfo
+ * 
+ * @author jlb
+ * @date 2023-06-27
+ */
+@Data
+@TableName("about_us_hxinfo")
+public class AboutUsHxinfo extends SuperDO{
+    private static final long serialVersionUID = 1L;
+
+    /**  */
+    @TableId("id")
+    private Long id;
+
+    /** 标题 */
+    @Excel(name = "标题")
+    @TableField("title")
+    private String title;
+
+    /** 副标题 */
+    @Excel(name = "副标题")
+    @TableField("deputy_title")
+    private String deputyTitle;
+
+    /** 封面图片 */
+    @Excel(name = "封面图片")
+    @TableField("cover_image")
+    private String coverImage;
+
+    /** 视频地址 */
+    @Excel(name = "视频地址")
+    @TableField("video_url")
+    private String videoUrl;
+
+    /** 分类 */
+    @Excel(name = "分类")
+    @TableField("classify")
+    private String classify;
+
+    /** 内容 */
+    @Excel(name = "内容")
+    @TableField("content")
+    private String content;
+
+    /** 详情 */
+    @Excel(name = "详情")
+    @TableField("details")
+    private String details;
+
+    /** 语言 */
+    @Excel(name = "语言")
+    @TableField("language")
+    private String language;
+
+    /** 状态 */
+    @Excel(name = "状态")
+    @TableField("status")
+    private String status;
+
+    /**  */
+    @Excel(name = "", width = 30, dateFormat = "yyyy-MM-dd")
+    @TableField("gmt_create")
+    private Date gmtCreate;
+
+    /**  */
+    @Excel(name = "", width = 30, dateFormat = "yyyy-MM-dd")
+    @TableField("gmt_update")
+    private Date gmtUpdate;
+
+    /** 删除标识 */
+    @Excel(name = "删除标识")
+    @TableField("delete_flag")
+    private Long deleteFlag;
+
+    /**  */
+    @Excel(name = "")
+    @TableField("pid")
+    private Long pid;
+
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("title", getTitle())
+            .append("deputyTitle", getDeputyTitle())
+            .append("coverImage", getCoverImage())
+            .append("videoUrl", getVideoUrl())
+            .append("classify", getClassify())
+            .append("content", getContent())
+            .append("details", getDetails())
+            .append("language", getLanguage())
+            .append("status", getStatus())
+            .append("gmtCreate", getGmtCreate())
+            .append("gmtUpdate", getGmtUpdate())
+            .append("deleteFlag", getDeleteFlag())
+            .append("pid", getPid())
+            .toString();
+    }
+}

+ 3 - 1
unimall-data/src/main/java/com/iotechn/unimall/data/domain/AboutUsInfo.java

@@ -11,6 +11,7 @@ import com.baomidou.mybatisplus.annotations.TableField;
 import com.baomidou.mybatisplus.enums.FieldFill;
 import com.iotechn.unimall.core.util.StringUtils;
 import java.util.Date;
+import java.util.List;
 
 /**
  * 记录关于我们信息对象 about_us_info
@@ -87,7 +88,8 @@ public class AboutUsInfo extends SuperDO{
     @TableField("delete_flag")
     private Long deleteFlag;
 
-
+    @TableField(exist = false)
+    private List<AboutUsHxinfo> aboutUsHxinfoList;
     @Override
     public String toString() {
         return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)

+ 13 - 0
unimall-data/src/main/java/com/iotechn/unimall/data/mapper/AboutUsHxinfoMapper.java

@@ -0,0 +1,13 @@
+package com.iotechn.unimall.data.mapper;
+
+import com.iotechn.unimall.data.domain.AboutUsHxinfo;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+/**
+ * 关于我们核心价值Mapper接口
+ * 
+ * @author jlb
+ * @date 2023-06-27
+ */
+public interface AboutUsHxinfoMapper extends BaseMapper<AboutUsHxinfo>{
+
+}

+ 1 - 1
unimall-launcher/src/main/java/com/iotechn/unimall/launcher/controller/CommonController.java

@@ -90,7 +90,7 @@ public class CommonController {
         response.reset();
         response.setHeader("Content-Disposition", "attachment; filename=\""+tables+".zip\"");
         response.setHeader("Access-Control-Allow-Credentials", "true");
-        response.setHeader("Access-Control-Allow-Origin", "http://192.168.110.138:9527");
+        response.setHeader("Access-Control-Allow-Origin", "http://192.168.110.82:9527");
         response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
         response.addHeader("Content-Length", "" + data.length);
         response.setContentType("application/octet-stream; charset=UTF-8");