1 课程中心
1.1 表设计
## 1.2 crud
集成支持vue的富文本编辑器
npm install quill --save
npm install --save vue-quill-editor
2 课程上线与下线
2.1 业务
上线:添加进去不代表就ok了,只有上线了用户才能查询,中间就有缓冲时间了。
下线:有些课程不需要,就下线用户查询不到。
2.2 方案选择:ES
2.3 架构-间图
管理员:
添加:数据库
修改和删除:数据库和索引库需要同步
分页列表:数据库
上线:索引库
下线:索引库
用户查询:数据库查询
2.5 springboot springdataes
<!--springboot仲裁中心-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
</parent>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--springboot 对spring data es支持-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
配置yml
spring:
data:
elasticsearch:
cluster-name: elasticsearch
cluster-nodes: 127.0.0.1:9300 #9200是图形界面端,9300代码端
2.6课程上下线实现
1)搭建基本结构
导入pom
Service
<!--springboot 对spring data es支持-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
yml
spring:
data:
elasticsearch:
cluster-name: elasticsearch
cluster-nodes: 127.0.0.1:9300 #9200是图形界面端,9300代码端
Doc映射&Repository
CourseDoc -service
package cn.itsource.index.doc;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
import java.math.BigDecimal;
import java.util.Date;
//包含了前台展示的字段和要添加到索引库都要写到这儿
@Document(indexName = "hrm",type = "course")
public class EsCourse {
@Id
private Long id;
private String name;
private String users;
private Long courseTypeId;
private String courseTypeName;
private Long gradeId;
private String gradeName;
private Integer status;
private Long tenantId;
private String tenantName;
private Long userId;
private String userName;
private Date startTime;
private Date endTime;
private String intro;
private String resources; //图片
private Date expires; //过期时间
private BigDecimal priceOld; //原价
private BigDecimal price; //原价
private String qq; //原价
@Field(type = FieldType.Text,analyzer = "ik_max_word",searchAnalyzer = "ik_max_word")
private String all;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getUsers() {
return users;
}
public void setUsers(String users) {
this.users = users;
}
public Long getCourseTypeId() {
return courseTypeId;
}
public void setCourseTypeId(Long courseTypeId) {
this.courseTypeId = courseTypeId;
}
public String getCourseTypeName() {
return courseTypeName;
}
public void setCourseTypeName(String courseTypeName) {
this.courseTypeName = courseTypeName;
}
public Long getGradeId() {
return gradeId;
}
public void setGradeId(Long gradeId) {
this.gradeId = gradeId;
}
public String getGradeName() {
return gradeName;
}
public void setGradeName(String gradeName) {
this.gradeName = gradeName;
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
public Long getTenantId() {
return tenantId;
}
public void setTenantId(Long tenantId) {
this.tenantId = tenantId;
}
public String getTenantName() {
return tenantName;
}
public void setTenantName(String tenantName) {
this.tenantName = tenantName;
}
public Long getUserId() {
return userId;
}
public void setUserId(Long userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public Date getStartTime() {
return startTime;
}
public void setStartTime(Date startTime) {
this.startTime = startTime;
}
public Date getEndTime() {
return endTime;
}
public void setEndTime(Date endTime) {
this.endTime = endTime;
}
public String getIntro() {
return intro;
}
public void setIntro(String intro) {
this.intro = intro;
}
public String getResources() {
return resources;
}
public void setResources(String resources) {
this.resources = resources;
}
public Date getExpires() {
return expires;
}
public void setExpires(Date expires) {
this.expires = expires;
}
public BigDecimal getPriceOld() {
return priceOld;
}
public void setPriceOld(BigDecimal priceOld) {
this.priceOld = priceOld;
}
public BigDecimal getPrice() {
return price;
}
public void setPrice(BigDecimal price) {
this.price = price;
}
public String getQq() {
return qq;
}
public void setQq(String qq) {
this.qq = qq;
}
@Override
public String toString() {
return "EsCourse{" +
"id=" + id +
", name='" + name + '\'' +
", users='" + users + '\'' +
", courseTypeId=" + courseTypeId +
", courseTypeName='" + courseTypeName + '\'' +
", gradeId=" + gradeId +
", gradeName='" + gradeName + '\'' +
", status=" + status +
", tenantId=" + tenantId +
", tenantName='" + tenantName + '\'' +
", userId=" + userId +
", userName='" + userName + '\'' +
", startTime=" + startTime +
", endTime=" + endTime +
", intro='" + intro + '\'' +
", resources='" + resources + '\'' +
", expires=" + expires +
", priceOld=" + priceOld +
", price=" + price +
", qq='" + qq + '\'' +
'}';
}
public String getAll() {
String tmp = name
+" "+ users
+" "+ courseTypeName
+" "+ gradeName
+" "+ tenantName
+" "+ userName
+" "+ intro;
return tmp;
}
public void setAll(String all) {
this.all = all;
}
}
Repository-service
package cn.itsource.index.repository;
import cn.itsource.index.doc.EsCourse;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
//在service通过注入它就可以完成索引库操作了
public interface EsCourseRepository extends ElasticsearchRepository<EsCourse,Long> {
}
具备操作索引库的能力
==============
@RunWith(SpringRunner.class)
@SpringBootTest(classes = CouseServiceApplication2020.class)
public class EscourseInitTest {
@Autowired
private ElasticsearchTemplate elasticsearchTemplate;
@Autowired
private EsCourseRepository repository;
@Test
public void initTest() {
elasticsearchTemplate.createIndex(EsCourse.class);
elasticsearchTemplate.putMapping(EsCourse.class);
System.out.println(repository);
}
}
=上下线处理-课程服务
删除:
修改:
private ProductDoc product2productDoc(Product product) {
//选中 alt+enter
ProductDoc productDoc = new ProductDoc();
productDoc.setId(product.getId());
productDoc.setProuductTypeId(product.getProductTypeId());
productDoc.setBrandId(product.getBrandId());
//从某个商品sku中获取最大或最小
List<Sku> skus = skuMapper.selectList(new EntityWrapper<Sku>()
.eq("productId", product.getId()));
Integer minPrice = skus.get(0).getPrice();
Integer maxPrice = skus.get(0).getPrice();
for (Sku sku : skus) {
if (sku.getPrice()<minPrice) minPrice=sku.getPrice();
if (sku.getPrice()>maxPrice) maxPrice = sku.getPrice();
}
productDoc.setMinPrice(minPrice);
productDoc.setMaxPrice(maxPrice);
productDoc.setSaleCount(product.getSaleCount());
productDoc.setOnSaleTime(Integer
.valueOf(product.getOnSaleTimeOfLong().toString()));
productDoc.setCommentCount(product.getCommentCount());
productDoc.setViewCount(product.getViewCount());
productDoc.setImages(Arrays
.asList(product.getMedias().split(",")));
Brand brand = brandMapper.selectById(product.getBrandId());
ProductType productType = productTypeMapper.selectById(product.getProductTypeId());
//投机-有空格就会分词
String all = product.getName()+" "
+product.getSubName()+" "+brand.getName()+" "+productType.getName();
productDoc.setAll(all);
productDoc.setViewProperties(product.getViewProperties());
productDoc.setSkuProperties(product.getSkuTemplate());
//设置值
return productDoc;
}
2) 上下线逻辑
controller
@Override
public void onSale(String ids, Integer onSale) {
List<Long> idsLong = StrUtils.splitStr2LongArr(ids);
if (1==onSale.intValue()){
//上线
//数据库状态和上线时间要修改 id 时间
Map<String,Object> params = new HashMap<>();
params.put("ids", idsLong);
params.put("timeStamp", new Date().getTime());
productMapper.onSale(params);
//添加esku
// productDocClient.batchDel(Arrays.asList(idsLong));
List<ProductDoc> productDocs = product2productDocs(idsLong);
productDocClient.batchSave(productDocs);
}else{
//下线
//数据库状态和下线时间要修改
Map<String,Object> params = new HashMap<>();
params.put("ids", idsLong);
params.put("timeStamp", new Date().getTime());
productMapper.offSale(params);
//删除esku
productDocClient.batchDel(idsLong);
}
}
* @param ids
* @return
*/
private List<ProductDoc> product2productDocs(List<Long> ids) {
List<ProductDoc> productDocs = new ArrayList<>();
for (Long id : ids) {
Product product = productMapper.selectById(id);
ProductDoc productDoc = product2productDoc(product);
productDocs.add(productDoc);
}
return productDocs;
}