Browse Source

实训功能与bug完善20250812

master
fangyang2021 6 months ago
parent
commit
22bf895d09
  1. 29
      diet-core/pom.xml
  2. 70
      diet-core/src/main/java/com/mathvision/diet/service/DemoEnvLimitService.java
  3. 7
      diet-core/src/main/java/com/mathvision/diet/service/DishService.java
  4. 111
      diet-core/src/main/java/com/mathvision/diet/service/MenuDishService.java
  5. 1
      diet-core/src/main/java/com/mathvision/diet/service/UserService.java
  6. 25
      diet-core/src/main/java/com/mathvision/diet/word/ServerTableData.java
  7. 80
      diet-core/src/main/java/com/mathvision/diet/word/ServerTablePolicy.java
  8. 2
      diet-dao/src/main/java/com/mathvision/diet/repository/DishRepository.java
  9. 4
      diet-dao/src/main/java/com/mathvision/diet/repository/MenuDishRepository.java
  10. 6
      diet-web/src/main/java/com/mathvision/diet/aspect/GlobalRequestAspect.java
  11. 13
      diet-web/src/main/java/com/mathvision/diet/controller/DishController.java
  12. 7
      diet-web/src/main/java/com/mathvision/diet/controller/IconController.java
  13. 12
      diet-web/src/main/java/com/mathvision/diet/controller/MenuController.java
  14. 81
      diet-web/src/main/java/com/mathvision/diet/controller/MenuDishController.java
  15. 2
      diet-web/src/main/java/com/mathvision/diet/controller/MenuReleaseController.java
  16. 10
      diet-web/src/main/resources/application-dev.yml
  17. 15
      diet-web/src/main/resources/application-local.yml
  18. 260
      sql/diet.sql
  19. 2181
      sql/init.sql

29
diet-core/pom.xml

@ -24,6 +24,35 @@
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.3.2</version>
<exclusions>
<exclusion>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.deepoove</groupId>
<artifactId>poi-tl</artifactId>
<version>1.12.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.2.2</version>
</dependency>
<dependency>
<groupId>io.github.draco1023</groupId>
<artifactId>poi-tl-ext</artifactId>
<version>0.4.15</version>
</dependency>
</dependencies>
</project>

70
diet-core/src/main/java/com/mathvision/diet/service/DemoEnvLimitService.java

@ -0,0 +1,70 @@
package com.mathvision.diet.service;
import com.google.common.util.concurrent.RateLimiter;
import com.mathvision.diet.repository.DishRepository;
import com.mathvision.diet.repository.MenuRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;
@Slf4j
@Service
public class DemoEnvLimitService {
@Value(value = "${demo.is-demo:false}")
private boolean isDemo;
@Value(value = "${demo.params.img-enable:false}")
private boolean imgEnable;
@Value(value = "${demo.params.dish-num:10}")
private long dishNum;
@Value(value = "${demo.params.menu-num:5}")
private long menuNum;
@Value(value = "${demo.params.rate-block:true}")
private boolean rateBlock;
@Value(value = "${demo.params.rate-limit:500}")
private int rateLimit;
private static RateLimiter apiRateLimiter;
@Resource
private DishRepository dishRepository;
@Resource
private MenuRepository menuRepository;
@PostConstruct
public void init() {
if (isDemo) apiRateLimiter = RateLimiter.create(rateLimit, 10, TimeUnit.SECONDS);
}
public boolean checkImgEnable() {
return isDemo ? imgEnable : true;
}
public boolean checkDishNum(Long vendor) {
return !isDemo || dishRepository.countByVender(vendor) < dishNum;
}
public boolean checkMenuNum(Long vendor) {
return !isDemo || menuRepository.countByVender(vendor) < menuNum;
}
public boolean checkRateLimit() {
if (isDemo) {
if (rateBlock){
apiRateLimiter.acquire();
}else {
return apiRateLimiter.tryAcquire();
}
}
return true;
}
}

7
diet-core/src/main/java/com/mathvision/diet/service/DishService.java

@ -8,6 +8,7 @@ import com.mathvision.diet.entity.Dish;
import com.mathvision.diet.entity.FoodNutrient;
import com.mathvision.diet.entity.Ingredient;
import com.mathvision.diet.repository.DishRepository;
import com.mathvision.diet.repository.MenuDishRepository;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.BooleanUtils;
@ -48,6 +49,9 @@ public class DishService {
@Resource
private DishRepository dishRepository;
@Resource
private MenuDishRepository menuDishRepository;
@Scheduled(cron = "0/2 * * * * *")
public void init() {
if (!UPDATE_LABEL_LOCK.tryLock()) {
@ -112,8 +116,11 @@ public class DishService {
public void delete(List<Long> ids, Long venderId, String operator) {
if (venderId > 0) {
dishRepository.deleteByIdInAndVender(ids, venderId);
//食谱菜品空数据优化
menuDishRepository.deleteByDishInAndVender(ids, venderId);
} else {
dishRepository.deleteAllByIdInBatch(ids);
menuDishRepository.deleteByDishIn(ids);
}
log.info("[DishService] delete ids = " + ids + ", operator = " + operator);
}

111
diet-core/src/main/java/com/mathvision/diet/service/MenuDishService.java

@ -2,6 +2,11 @@ package com.mathvision.diet.service;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.config.ConfigureBuilder;
import com.deepoove.poi.data.RowRenderData;
import com.deepoove.poi.data.Rows;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.mathvision.diet.domian.MealType;
@ -11,6 +16,8 @@ import com.mathvision.diet.entity.Menu;
import com.mathvision.diet.entity.MenuDish;
import com.mathvision.diet.repository.DishRepository;
import com.mathvision.diet.repository.MenuDishRepository;
import com.mathvision.diet.word.ServerTableData;
import com.mathvision.diet.word.ServerTablePolicy;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.tuple.Pair;
@ -19,11 +26,13 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.io.*;
import java.math.RoundingMode;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.time.Instant;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.stream.Collectors;
@ -140,7 +149,7 @@ public class MenuDishService {
if (dish == null || dish.size() < dishIndex) {
return MenuDish.builder().meal(meal).day(day).ingredient(Lists.newArrayList()).build();
} else {
return dish.get(dishIndex -1);
return dish.get(dishIndex - 1);
}
}).collect(Collectors.toList());
@ -169,4 +178,96 @@ public class MenuDishService {
});
excelWriter.write(contents, EasyExcel.writerSheet(menu.getName()).head(headers).build());
}
public byte[] exportWord(Menu menu) {
Map<String, Map<Long, List<MenuDish>>> menuDishes = Optional.ofNullable(menuDishRepository.findByMenu(menu.getId())).orElseGet(Collections::emptyList).stream().collect(Collectors.groupingBy(MenuDish::getMeal, Collectors.groupingBy(MenuDish::getDay)));
List<String> allMeals = menuDishes.keySet().stream().sorted(Comparator.comparing(MealType::toType)).collect(Collectors.toList());
List<Long> allDays = menuDishes.values().stream().flatMap(dayMap -> dayMap.keySet().stream()).distinct().sorted().collect(Collectors.toList());
if (CollectionUtils.isEmpty(allDays)) {
allDays = Optional.ofNullable(menu.getDay()).orElseGet(Collections::emptyList);
}
List<String> allCrows = Optional.ofNullable(menu.getCrows()).orElseGet(Collections::emptyList);
Map<String, String> ingredientKeyToName = ingredientService.getByKeys();
List<Map<String, Object>> tableList = allDays.stream().map(day -> {
ServerTableData tableData = new ServerTableData();
Map<String, Object> tableDataMap = new HashMap<>();
tableDataMap.put("tableName", toWeekDay(day));
tableData.setExtendedColumn(allCrows);
List<RowRenderData> serverDataList = new ArrayList<>();
allMeals.forEach(meal -> {
Map<Long, List<MenuDish>> dayMap = menuDishes.get(meal);
if (dayMap == null) return;
List<MenuDish> dishes = dayMap.get(day);
if (CollectionUtils.isEmpty(dishes)) return;
dishes.forEach(dish -> {
List<MenuDishItemDTO> ingredients = dish.getIngredient();
ingredients.forEach(item -> {
String[] content = new String[allCrows.size() + 2];
content[0] = dish.getName();
// 去掉[]里的内容
content[1] = ingredientKeyToName.getOrDefault(item.getKey(), "").replaceAll("\\[.*?\\]", "");
item.getValue().forEach((key, value) -> {
int index = allCrows.indexOf(key);
if (index >= 0 && index < allCrows.size()) {
// 保留一位小数
content[index + 2] = value != null ? value.setScale(1, RoundingMode.HALF_UP).toString() : "";
}
});
serverDataList.add(Rows.of(content).center().create());
});
});
});
tableData.setServerDataList(serverDataList);
tableData.setMergeColumn(0);
tableDataMap.put("tableData", tableData);
return tableDataMap;
}).collect(Collectors.toList());
// Word生成阶段
ConfigureBuilder builder = Configure.builder().useSpringEL(false);
Map<String, Object> dataMap = new HashMap<>();
dataMap.put("title", menu.getName());
dataMap.put("tableList", tableList);
builder.bind("tableData", new ServerTablePolicy());
Path templatePath = Paths.get("E:\\data\\diet.docx");
try (InputStream is = Files.newInputStream(templatePath);
ByteArrayOutputStream byteOut = new ByteArrayOutputStream()) {
XWPFTemplate template = XWPFTemplate.compile(is, builder.build()).render(dataMap);
template.writeAndClose(byteOut);
return byteOut.toByteArray();
} catch (Exception e) {
log.error("[MenuExport] Word导出失败", e);
throw new RuntimeException("文档生成失败", e);
}
}
private String toWeekDay(long day) {
switch ((int) day) {
case 1:
return "周一";
case 2:
return "周二";
case 3:
return "周三";
case 4:
return "周四";
case 5:
return "周五";
case 6:
return "周六";
case 7:
return "周日";
default:
return "";
}
}
}

1
diet-core/src/main/java/com/mathvision/diet/service/UserService.java

@ -72,7 +72,6 @@ public class UserService {
Assert.isTrue(StringUtils.isNotBlank(name), "[参数错误]姓名必填!");
Assert.isTrue(StringUtils.isNotBlank(password) && password.length() == 16, "[参数错误]密码为空, 或者密码长度错误!");
Assert.isTrue(checkRole(roleId, venderId), "[参数错误]未赋初始角色,或者该角色错误!");
Instant dateTime = Instant.now();
User user = User.builder().uid(uid).name(name).pwd(password).status(true).created(dateTime).modify(dateTime).build();
UserRole userRole = UserRole.builder().roleId(roleId).uid(uid).vender(venderId).operate(operator).created(dateTime).modify(dateTime).build();

25
diet-core/src/main/java/com/mathvision/diet/word/ServerTableData.java

@ -0,0 +1,25 @@
package com.mathvision.diet.word;
import com.deepoove.poi.data.RowRenderData;
import lombok.Data;
import java.util.List;
@Data
public class ServerTableData {
/**
* 携带表格中真实数据
*/
private List<RowRenderData> serverDataList;
/**
* 携带扩展列信息
*/
private List<String> extendedColumn;
/**
* 需要合并的列从0开始
*/
private Integer mergeColumn;
}

80
diet-core/src/main/java/com/mathvision/diet/word/ServerTablePolicy.java

@ -0,0 +1,80 @@
package com.mathvision.diet.word;
import com.deepoove.poi.data.RowRenderData;
import com.deepoove.poi.policy.DynamicTableRenderPolicy;
import com.deepoove.poi.policy.TableRenderPolicy;
import com.deepoove.poi.util.TableTools;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.poi.xwpf.usermodel.TableWidthType;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.apache.poi.xwpf.usermodel.XWPFTableRow;
import java.util.List;
public class ServerTablePolicy extends DynamicTableRenderPolicy {
@Override
public void render(XWPFTable xwpfTable, Object tableData) throws Exception {
if (null == tableData) {
return;
}
// 参数数据声明
ServerTableData serverTableData = (ServerTableData) tableData;
List<RowRenderData> serverDataList = serverTableData.getServerDataList();
List<String> extendedColumn = serverTableData.getExtendedColumn();
Integer mergeColumn = serverTableData.getMergeColumn();
int columnSize = xwpfTable.getRow(0).getTableCells().size();
// 新增扩展列
if (CollectionUtils.isNotEmpty(extendedColumn)) {
for (int i = 0; i < extendedColumn.size(); i++) {
xwpfTable.addNewCol();
columnSize++;
xwpfTable.getRow(0).getTableCells().get(columnSize - 1).setText(extendedColumn.get(i));
}
}
if (CollectionUtils.isNotEmpty(serverDataList)) {
// 先删除一行, demo中第一行是为了调整 三线表 样式
xwpfTable.removeRow(1);
// 行从中间插入, 因此采用倒序渲染数据
for (int i = serverDataList.size() - 1; i >= 0; i--) {
XWPFTableRow newRow = xwpfTable.insertNewTableRow(1);
newRow.setHeight(400);
for (int j = 0; j < columnSize; j++) {
newRow.createCell();
}
// 渲染一行数据
TableRenderPolicy.Helper.renderRow(newRow, serverDataList.get(i));
}
// 定义需要合并的列索引(例如第一列)
int startMergeIndex = 1;
String currentType = null;
for (int i = 0; i < serverDataList.size(); i++) {
String typeNameData = serverDataList.get(i).getCells().get(mergeColumn).getParagraphs().get(0).getContents().get(0).toString();
if (i == 0) {
currentType = typeNameData;
} else {
if (!typeNameData.equals(currentType)) {
if (i - startMergeIndex > 0) {
TableTools.mergeCellsVertically(xwpfTable, mergeColumn, startMergeIndex, i + 1);
}
currentType = typeNameData;
startMergeIndex = i + 1;
}
}
}
// 处理循环结束后的剩余数据
if (serverDataList.size() - startMergeIndex > 1) {
TableTools.mergeCellsVertically(xwpfTable, mergeColumn, startMergeIndex, serverDataList.size());
}
// 自动调整宽度
xwpfTable.setWidthType(TableWidthType.AUTO);
}
}
}

2
diet-dao/src/main/java/com/mathvision/diet/repository/DishRepository.java

@ -26,6 +26,8 @@ public interface DishRepository extends JpaRepository<Dish, Long>, JpaSpecificat
List<Dish> findByIdIn(Collection<Long> ids);
@Query("select d from Dish d where d.vender = ?1")
List<Dish> findByVender(Long vender);
@Query("select count(d) from Dish d where d.vender = ?1")
long countByVender(Long vender);
Dish findByIdAndVender(Long id, Long vender);
boolean existsByVenderAndName(Long vender, String name);
List<Dish> findByVenderAndName(Long vender, String name);

4
diet-dao/src/main/java/com/mathvision/diet/repository/MenuDishRepository.java

@ -25,6 +25,10 @@ public interface MenuDishRepository extends JpaRepository<MenuDish, Long>, JpaSp
long deleteByMenuAndVender(Long menu, Long vender);
@Transactional
long deleteByMenu(Long menu);
@Transactional
long deleteByDishInAndVender(Collection<Long> ids, Long vender);
@Transactional
long deleteByDishIn(Collection<Long> ids);
List<MenuDish> findByModifyGreaterThan(Instant updateLabelTime);

6
diet-web/src/main/java/com/mathvision/diet/aspect/GlobalRequestAspect.java

@ -8,12 +8,14 @@ import com.mathvision.diet.domain.UserDO;
import com.mathvision.diet.domian.AuthType;
import com.mathvision.diet.entity.RoleItem;
import com.mathvision.diet.exception.DietException;
import com.mathvision.diet.service.DemoEnvLimitService;
import com.mathvision.diet.service.EnumService;
import com.mathvision.diet.utils.JWTUtils;
import lombok.NonNull;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.Assert;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
@ -36,6 +38,9 @@ public class GlobalRequestAspect implements HandlerInterceptor, WebMvcConfigurer
@Resource
EnumService enumService;
@Resource
DemoEnvLimitService demoEnvLimitService;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(this)
@ -54,6 +59,7 @@ public class GlobalRequestAspect implements HandlerInterceptor, WebMvcConfigurer
response.getOutputStream().write(JSON.toJSONString(Result.NOT_SUPPORT).getBytes(StandardCharsets.UTF_8));
return false;
}
demoEnvLimitService.checkRateLimit();
return verifySession(request, response);
}

13
diet-web/src/main/java/com/mathvision/diet/controller/DishController.java

@ -7,10 +7,7 @@ import com.google.common.collect.Range;
import com.mathvision.diet.domain.DishLabelDO;
import com.mathvision.diet.domian.DishItemDTO;
import com.mathvision.diet.entity.Dish;
import com.mathvision.diet.service.DishService;
import com.mathvision.diet.service.EnumService;
import com.mathvision.diet.service.IngredientService;
import com.mathvision.diet.service.VenderService;
import com.mathvision.diet.service.*;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.data.domain.PageRequest;
@ -43,6 +40,9 @@ public class DishController extends BaseController {
@Resource
private IngredientService ingredientService;
@Resource
private DemoEnvLimitService demoEnvLimitService;
@ResponseBody
@RequestMapping(method = RequestMethod.PUT)
public void add(@RequestParam String name, @RequestParam(required = false) List<Long> vendors, @RequestParam(required = false) String icon, @RequestParam(required = false) List<Integer> month, @RequestParam String mark, @RequestParam String poly, @RequestParam String ingredient) {
@ -54,12 +54,12 @@ public class DishController extends BaseController {
Assert.isTrue(CollectionUtils.isNotEmpty(month) && month.stream().allMatch(x -> Range.closed(1, 12).contains(x)), "[参数错误]请选择正确的月份!");
Assert.isTrue(JSON.isValid(ingredient), "[参数错误]食材列表必填!");
List<DishItemDTO> items = JSON.parseObject(ingredient, new TypeReference<List<DishItemDTO>>() {
});
List<DishItemDTO> items = JSON.parseObject(ingredient, new TypeReference<List<DishItemDTO>>() {});
Assert.isTrue(items.stream().allMatch(x -> ingredientService.existsIngredientByKey(x.getKey())), "[参数错误]请选择系统存在的食材!");
if (isAdmin()) {
Assert.isTrue(CollectionUtils.isNotEmpty(vendors), "[参数错误]单位列表必填!");
} else {
Assert.isTrue(demoEnvLimitService.checkDishNum(getVender()), "超过演示环境菜品创建数量上限!");
vendors = Lists.newArrayList(getVender());
}
Assert.isTrue(vendors.stream().allMatch(venderService::exists), "[[参数错误]请选择存在的单位!]");
@ -68,7 +68,6 @@ public class DishController extends BaseController {
dishService.add(vendors.stream().map(vender -> Dish.builder().name(name).vender(vender).marks(mark).poly(poly).month(month).icon(icon).ingredient(items).operate(getUid()).created(dateTime).modify(dateTime).build()).collect(Collectors.toList()), getUid());
}
//update 新增修改菜品,名称做重复检测和提醒
@ResponseBody
@RequestMapping(path = "check/name", method = RequestMethod.GET)
public boolean checkName(@RequestParam(required = false) Long id, @RequestParam Long vender, @RequestParam String name) {

7
diet-web/src/main/java/com/mathvision/diet/controller/IconController.java

@ -1,13 +1,16 @@
package com.mathvision.diet.controller;
import com.mathvision.diet.service.DemoEnvLimitService;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
@ -21,9 +24,13 @@ public class IconController extends BaseController {
@Value(value = "${icon.path:icon}")
private String imagePath;
@Resource
private DemoEnvLimitService demoEnvLimitService;
@ResponseBody
@RequestMapping(value = "/api/icon", method = RequestMethod.PUT)
public String icon(@RequestParam MultipartFile file) throws Exception {
Assert.isTrue(demoEnvLimitService.checkImgEnable(), "演示环境不支持图片上传!");
Assert.notNull(file, "[参数错误]请选择要上传的文件!");
String fileName = String.format("%s.%s", System.currentTimeMillis(), FilenameUtils.getExtension(file.getOriginalFilename()));
FileUtils.copyInputStreamToFile(file.getInputStream(), Paths.get(imagePath, fileName).toFile());

12
diet-web/src/main/java/com/mathvision/diet/controller/MenuController.java

@ -6,6 +6,7 @@ import com.mathvision.diet.domian.MealType;
import com.mathvision.diet.domian.MenuStatus;
import com.mathvision.diet.entity.Menu;
import com.mathvision.diet.entity.Nutrition;
import com.mathvision.diet.service.DemoEnvLimitService;
import com.mathvision.diet.service.MenuService;
import com.mathvision.diet.service.NutritionService;
import com.mathvision.diet.service.VenderService;
@ -42,6 +43,9 @@ public class MenuController extends BaseController {
@Resource
MenuService menuService;
@Resource
private DemoEnvLimitService demoEnvLimitService;
@ResponseBody
@RequestMapping(method = RequestMethod.PUT)
public List<Long> add(@RequestParam String name, @RequestParam(required = false) List<Long> vendors, @RequestParam Long nutrient, @RequestParam List<Long> day, @RequestParam List<String> meals, @RequestParam List<Integer> month, @RequestParam List<String> crows) {
@ -55,8 +59,12 @@ public class MenuController extends BaseController {
Nutrition nutrition = nutritionService.get(nutrient);
Assert.notNull(nutrition, "[参数错误]营养计划必选!");
Set<String> allCrows = nutrition.getIngredient().keySet();
vendors = isAdmin() ? (vendors == null ? Lists.newArrayList() : vendors.stream().filter(venderService::exists).collect(Collectors.toList())) : Lists.newArrayList(getVender());
if (isAdmin()) {
vendors = (vendors == null) ? Lists.newArrayList() : vendors.stream().filter(venderService::exists).collect(Collectors.toList());
} else {
Assert.isTrue(demoEnvLimitService.checkMenuNum(getVender()), "超过演示环境食谱创建数量上限!");
vendors = Lists.newArrayList(getVender());
}
Assert.isTrue(CollectionUtils.isNotEmpty(vendors), "[参数错误]营养计划不适用于所选单位!");
Assert.isTrue(new HashSet<>(nutrition.getVendors()).containsAll(vendors), "[参数错误]营养计划不适用于所选单位!");
Assert.isTrue(CollectionUtils.isNotEmpty(crows), "[参数错误]人群取值[参照营养计划]必填!");

81
diet-web/src/main/java/com/mathvision/diet/controller/MenuDishController.java

@ -33,6 +33,8 @@ import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
@RequestMapping("/api/menu/dish")
@Controller
@ -97,12 +99,12 @@ public class MenuDishController extends BaseController {
if (StringUtils.isNotBlank(mark) && !StringUtils.equals(mark, dish.getMarks())) {
Assert.isTrue(enumService.checkMark(mark), "[参数错误]菜品标签不在取值范围内!");
dish.setMarks(mark);
flag= true;
flag = true;
}
if (StringUtils.isNotBlank(poly) && !StringUtils.equals(poly, dish.getPoly())) {
Assert.isTrue(enumService.checkPoly(poly), "[参数错误]烹饪手法不在取值范围内!");
dish.setPoly(poly);
flag= true;
flag = true;
}
if (StringUtils.isNotBlank(ingredient) && JSON.isValid(ingredient)) {
dish.setIngredient(parseItems(ingredient, new HashSet<>(menu.getCrows())));
@ -125,7 +127,40 @@ public class MenuDishController extends BaseController {
HttpServletResponse response = getResponse();
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setCharacterEncoding("utf-8");
response.setHeader("Content-Disposition", "attachment;filename*=utf-8''"+ URLEncoder.encode("[食谱导出]" + menu.getId() + "-"+ menu.getName() + ".xlsx", "UTF-8"));
response.setHeader("Content-Disposition", "attachment;filename*=utf-8''" + URLEncoder.encode("[食谱导出]" + menu.getId() + "-" + menu.getName() + ".xlsx", "UTF-8"));
WriteCellStyle headWriteCellStyle = new WriteCellStyle();
headWriteCellStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND);
headWriteCellStyle.setFillForegroundColor(IndexedColors.PALE_BLUE.getIndex());
WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
contentWriteCellStyle.setBorderLeft(BorderStyle.THIN);
contentWriteCellStyle.setBorderTop(BorderStyle.THIN);
contentWriteCellStyle.setBorderRight(BorderStyle.THIN);
contentWriteCellStyle.setBorderBottom(BorderStyle.THIN);
ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream())
.registerWriteHandler(new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle))
.registerWriteHandler(new SimpleColumnWidthStyleStrategy(25))
.registerWriteHandler(new SimpleRowHeightStyleStrategy((short) 30, (short) 20))
.excelType(ExcelTypeEnum.XLSX).build();
menuDishService.export(menu, excelWriter);
menuReportService.export(menu, excelWriter);
excelWriter.finish();
}
@ResponseBody
@RequestMapping(value = "export2", method = RequestMethod.GET)
public void export2(@RequestParam Long id, @RequestParam(required = false) String type) throws IOException {
Menu menu = isAdmin() ? menuService.get(id) : menuService.get(id, getVender());
Assert.notNull(menu, "[参数错误]食谱不存在!");
HttpServletResponse response = getResponse();
switch (type) {
case "excel":
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setCharacterEncoding("utf-8");
response.setHeader("Content-Disposition", "attachment;filename*=utf-8''" + URLEncoder.encode("[食谱导出]" + menu.getId() + "-" + menu.getName() + ".xlsx", "UTF-8"));
WriteCellStyle headWriteCellStyle = new WriteCellStyle();
headWriteCellStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND);
@ -140,12 +175,46 @@ public class MenuDishController extends BaseController {
ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream())
.registerWriteHandler(new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle))
.registerWriteHandler(new SimpleColumnWidthStyleStrategy(25))
.registerWriteHandler(new SimpleRowHeightStyleStrategy((short)30, (short)20))
.registerWriteHandler(new SimpleRowHeightStyleStrategy((short) 30, (short) 20))
.excelType(ExcelTypeEnum.XLSX).build();
menuDishService.export(menu, excelWriter);
menuReportService.export(menu, excelWriter);
excelWriter.finish();
case "word":
try {
response.setContentType("application/zip");
response.setCharacterEncoding("utf-8");
response.setHeader("Content-Disposition", "attachment;filename*=utf-8''" + URLEncoder.encode("[食谱导出]" + menu.getId() + "-" + menu.getName() + ".zip", "UTF-8"));
// 生成Word文件并打包
try (ZipOutputStream zipOut = new ZipOutputStream(response.getOutputStream())) {
// 写入Word文件到ZIP
ZipEntry wordEntry = new ZipEntry(menu.getName() + "_带量食谱分析.docx");
zipOut.putNextEntry(wordEntry);
byte[] wordData = menuDishService.exportWord(menu);
if (wordData == null) {
throw new RuntimeException("Word文件生成失败");
}
zipOut.write(wordData);
zipOut.closeEntry();
// 可继续添加其他文件到ZIP(如附加说明)
// zipOut.putNextEntry(new ZipEntry("readme.txt"));
// zipOut.write("附加说明内容".getBytes(StandardCharsets.UTF_8));
// zipOut.closeEntry();
} // try-with-resources自动关闭流
} catch (IOException e) {
// 异常处理(记录日志或返回错误提示)
throw new RuntimeException("导出失败: " + e.getMessage());
}
break;
default:
throw new IllegalArgumentException("不支持的导出类型: ");
}
}
@ResponseBody
@ -161,14 +230,14 @@ public class MenuDishController extends BaseController {
mark = StringUtils.isBlank(mark) ? dish.getMarks() : mark;
Assert.isTrue(enumService.checkMark(mark), "[参数错误]菜品标签不在取值范围内!");
poly= StringUtils.isBlank(poly) ? dish.getPoly() : poly;
poly = StringUtils.isBlank(poly) ? dish.getPoly() : poly;
Assert.isTrue(enumService.checkPoly(poly), "[参数错误]烹饪手法不在取值范围内!");
Instant dateTime = Instant.now();
return MenuDish.builder().vender(menu.getVender()).menu(menu.getId()).dish(dish.getId()).day(day).meal(meal).name(dish.getName()).marks(mark).poly(poly).ingredient(ingredient).operate(getUid()).created(dateTime).modify(dateTime).build();
}
private Menu checkAndConvert(Long menuId, MenuStatus ... statuses) {
private Menu checkAndConvert(Long menuId, MenuStatus... statuses) {
Menu menu = isAdmin() ? menuService.get(menuId) : menuService.get(menuId, getVender());
Assert.notNull(menu, "[参数错误]食谱不存在, menuId:" + menuId);
if (statuses != null && statuses.length > 0) {

2
diet-web/src/main/java/com/mathvision/diet/controller/MenuReleaseController.java

@ -58,5 +58,3 @@ public class MenuReleaseController extends BaseController {
return menuReleaseService.list(isAdmin() ? vender : getVender(), name, parseDate(startTime), parseDate(endTime), PageRequest.of(pageNo, pageSize).withSort(Sort.by(Sort.Direction.DESC, "id")));
}
}

10
diet-web/src/main/resources/application-dev.yml

@ -11,3 +11,13 @@ spring:
icon:
path: /data/icon
demo:
is-demo: true
params:
img-enable: false
dish-num: 20
menu-num: 5
rate-block: true
rate-limit: 500

15
diet-web/src/main/resources/application-local.yml

@ -1,8 +1,8 @@
spring:
datasource:
url: jdbc:mysql://47.109.27.8:3306/diet?useUnicode=true&characterEncoding=utf-8
username: admin
password: '@Jiluo2019'
url: jdbc:mysql://192.168.1.2:3306/diet?useUnicode=true&characterEncoding=utf-8
username: ccc
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
show-sql: false
@ -11,3 +11,12 @@ spring:
icon:
path: D:\workspace\diet\data\icon
demo:
is-demo: true
params:
img-enable: false
dish-num: 10
menu-num: 5
rate-block: true
rate-limit: 500

260
sql/diet.sql

@ -1,17 +1,17 @@
/*
Navicat Premium Data Transfer
Source Server : 47.109.27.8
Source Server : localhost
Source Server Type : MySQL
Source Server Version : 80033
Source Host : 47.109.27.8:3306
Source Host : localhost:3306
Source Schema : diet
Target Server Type : MySQL
Target Server Version : 80033
File Encoding : 65001
Date: 08/10/2023 03:44:21
Date: 30/07/2025 14:15:38
*/
SET NAMES utf8mb4;
@ -23,15 +23,15 @@ SET FOREIGN_KEY_CHECKS = 0;
DROP TABLE IF EXISTS `dish`;
CREATE TABLE `dish` (
`id` bigint UNSIGNED NOT NULL AUTO_INCREMENT,
`name` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '菜名',
`name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '菜名',
`vender` bigint NOT NULL COMMENT '单位',
`icon` varchar(128) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '图片',
`icon` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '图片',
`month` json NOT NULL COMMENT '适用月份',
`ingredient` json NOT NULL COMMENT '食材',
`marks` varchar(45) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '标记',
`poly` varchar(16) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '烹饪手法',
`marks` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '标记',
`poly` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '烹饪手法',
`label` json NULL COMMENT '标签',
`operate` varchar(45) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT 'system' COMMENT '操作员',
`operate` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT 'system' COMMENT '操作员',
`created` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`modify` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`) USING BTREE,
@ -39,7 +39,7 @@ CREATE TABLE `dish` (
INDEX `idx_marks`(`marks` ASC) USING BTREE,
INDEX `idx_modify`(`modify` ASC) USING BTREE,
FULLTEXT INDEX `idx_name`(`name`)
) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci COMMENT = '菜品' ROW_FORMAT = Dynamic;
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '菜品' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Table structure for food_category
@ -47,13 +47,13 @@ CREATE TABLE `dish` (
DROP TABLE IF EXISTS `food_category`;
CREATE TABLE `food_category` (
`id` bigint UNSIGNED NOT NULL AUTO_INCREMENT,
`key` varchar(32) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '分类key',
`name` varchar(32) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '分类名称',
`operate` varchar(45) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT 'system' COMMENT '操作员',
`key` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '分类key',
`name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '分类名称',
`operate` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT 'system' COMMENT '操作员',
`created` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`modify` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci COMMENT = '食物分类' ROW_FORMAT = Dynamic;
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '食物分类' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Table structure for food_mark
@ -61,13 +61,13 @@ CREATE TABLE `food_category` (
DROP TABLE IF EXISTS `food_mark`;
CREATE TABLE `food_mark` (
`id` bigint UNSIGNED NOT NULL AUTO_INCREMENT,
`key` varchar(20) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '标签名称',
`name` varchar(20) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '标签名称',
`operate` varchar(45) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT 'system' COMMENT '操作员',
`key` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '标签名称',
`name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '标签名称',
`operate` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT 'system' COMMENT '操作员',
`created` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`modify` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci COMMENT = '食物标签' ROW_FORMAT = Dynamic;
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '食物标签' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Table structure for food_nutrient
@ -75,31 +75,31 @@ CREATE TABLE `food_mark` (
DROP TABLE IF EXISTS `food_nutrient`;
CREATE TABLE `food_nutrient` (
`id` bigint UNSIGNED NOT NULL AUTO_INCREMENT,
`key` varchar(20) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '分类key',
`name` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '分类名称',
`measurement` varchar(10) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '计量单位',
`key` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '分类key',
`name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '分类名称',
`measurement` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '计量单位',
`nrv` decimal(8, 2) UNSIGNED NOT NULL DEFAULT 0.00 COMMENT 'NRV(营养素参考值)',
`operate` varchar(45) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT 'system' COMMENT '操作员',
`operate` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT 'system' COMMENT '操作员',
`created` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`modify` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `udx_key`(`key` ASC) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci COMMENT = '营养素' ROW_FORMAT = Dynamic;
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '营养素' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Table structure for icon
-- Table structure for food_poly
-- ----------------------------
DROP TABLE IF EXISTS `food_poly`;
CREATE TABLE `food_poly` (
`id` bigint UNSIGNED NOT NULL AUTO_INCREMENT,
`key` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '标签名称',
`name` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '标签名称',
`operate` varchar(45) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT 'system' COMMENT '操作员',
`key` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '标签名称',
`name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '标签名称',
`operate` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT 'system' COMMENT '操作员',
`created` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`modify` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `udx_key`(`key` ASC) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '烹饪手法' ROW_FORMAT = DYNAMIC;
INDEX `udx_key`(`key` ASC) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '烹饪手法' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Table structure for ingredient
@ -107,18 +107,18 @@ CREATE TABLE `food_poly` (
DROP TABLE IF EXISTS `ingredient`;
CREATE TABLE `ingredient` (
`id` bigint UNSIGNED NOT NULL AUTO_INCREMENT,
`key` varchar(20) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '分类key',
`name` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '分类名称',
`type` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '分类名称',
`key` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '分类key',
`name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '分类名称',
`type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '分类名称',
`nutrient` json NOT NULL COMMENT '营养素',
`operate` varchar(45) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT 'system' COMMENT '操作员',
`operate` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT 'system' COMMENT '操作员',
`created` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`modify` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `udx_key`(`key` ASC) USING BTREE,
INDEX `idx_type`(`type` ASC) USING BTREE,
FULLTEXT INDEX `idx_name`(`name`)
) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci COMMENT = '食材' ROW_FORMAT = Dynamic;
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '食材' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Table structure for ingredient_mark
@ -126,15 +126,15 @@ CREATE TABLE `ingredient` (
DROP TABLE IF EXISTS `ingredient_mark`;
CREATE TABLE `ingredient_mark` (
`id` bigint UNSIGNED NOT NULL AUTO_INCREMENT,
`ingredient` varchar(20) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '食材',
`ingredient` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '食材',
`vender` bigint UNSIGNED NOT NULL COMMENT '单位',
`mark` enum('常用','忌用') CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT '常用' COMMENT '标记',
`operate` varchar(45) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT 'system' COMMENT '操作员',
`mark` enum('常用','忌用') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '常用' COMMENT '标记',
`operate` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT 'system' COMMENT '操作员',
`created` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`modify` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `udx_group_ingredient`(`vender` ASC, `ingredient` ASC) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci COMMENT = '食物标记' ROW_FORMAT = Dynamic;
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '食物标记' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Table structure for menu
@ -144,24 +144,24 @@ CREATE TABLE `menu` (
`id` bigint UNSIGNED NOT NULL AUTO_INCREMENT,
`vender` bigint UNSIGNED NOT NULL COMMENT '单位',
`nutrient` bigint UNSIGNED NOT NULL COMMENT '营养标准',
`name` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '食谱名称',
`name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '食谱名称',
`day` json NOT NULL COMMENT '天数',
`meals` json NOT NULL COMMENT '餐次',
`crows` json NOT NULL COMMENT '人群',
`scale` json NULL COMMENT '人群规模',
`month` json NOT NULL COMMENT '适用月份',
`status` tinyint UNSIGNED NOT NULL DEFAULT 0 COMMENT '状态:0-草稿,1-提交审核,2-审核通过,3-审核失败,4-禁用,5-发布',
`approve` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '审批意见',
`approve` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '审批意见',
`start_time` datetime NULL DEFAULT NULL COMMENT '开始时间',
`end_time` datetime NULL DEFAULT NULL COMMENT '结束时间',
`operate` varchar(45) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT 'system' COMMENT '操作员',
`operate` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT 'system' COMMENT '操作员',
`created` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`modify` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`) USING BTREE,
INDEX `idx_vender`(`vender` ASC) USING BTREE,
INDEX `idx_time`(`modify` ASC) USING BTREE,
FULLTEXT INDEX `idx_name`(`name`)
) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci COMMENT = '食谱' ROW_FORMAT = Dynamic;
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '食谱' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Table structure for menu_approve
@ -170,14 +170,14 @@ DROP TABLE IF EXISTS `menu_approve`;
CREATE TABLE `menu_approve` (
`id` bigint UNSIGNED NOT NULL AUTO_INCREMENT,
`menu` bigint UNSIGNED NOT NULL COMMENT '食谱',
`approve` varchar(16) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '审批意见',
`approve` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '审批意见',
`pass` bit(1) NOT NULL COMMENT '是否通过,0-不通过,1-通过',
`operate` varchar(45) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT 'system' COMMENT '操作员',
`operate` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT 'system' COMMENT '操作员',
`created` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`modify` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`) USING BTREE,
INDEX `idx_menu`(`menu` ASC) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci COMMENT = '审批表' ROW_FORMAT = Dynamic;
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '审批表' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Table structure for menu_dish
@ -188,20 +188,20 @@ CREATE TABLE `menu_dish` (
`vender` bigint UNSIGNED NOT NULL COMMENT '单位',
`menu` bigint UNSIGNED NOT NULL COMMENT '食谱',
`day` int UNSIGNED NOT NULL DEFAULT 1 COMMENT '天数',
`meal` varchar(16) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '餐次',
`meal` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '餐次',
`dish` bigint NOT NULL COMMENT '菜品',
`name` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '菜名',
`name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '菜名',
`ingredient` json NOT NULL COMMENT '人群食材',
`marks` varchar(45) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '标记',
`poly` varchar(16) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '烹饪手法',
`marks` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '标记',
`poly` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '烹饪手法',
`label` json NULL COMMENT '标签',
`operate` varchar(45) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT 'system' COMMENT '操作员',
`operate` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT 'system' COMMENT '操作员',
`created` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`modify` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`) USING BTREE,
INDEX `idx_vender`(`vender` ASC) USING BTREE,
INDEX `idx_menu`(`menu` ASC) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci COMMENT = '食谱内容' ROW_FORMAT = Dynamic;
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '食谱内容' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Table structure for nutrition
@ -209,21 +209,21 @@ CREATE TABLE `menu_dish` (
DROP TABLE IF EXISTS `nutrition`;
CREATE TABLE `nutrition` (
`id` bigint UNSIGNED NOT NULL AUTO_INCREMENT,
`name` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '标准名称',
`name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '标准名称',
`vendors` json NOT NULL COMMENT '适用单位',
`crows` json NULL COMMENT '人群',
`food_category_day` json NULL COMMENT '食物种类及数量标准(日)',
`food_category_week` json NULL COMMENT '食物种类及数量标准(周)',
`ingredient` json NULL COMMENT '食材',
`overflow` decimal(5, 2) UNSIGNED NOT NULL DEFAULT 0.00 COMMENT '溢出范围(默认)',
`overflow` decimal(5, 2) UNSIGNED NOT NULL DEFAULT 0.00 COMMENT '溢出范围',
`overflows` json NULL COMMENT '溢出范围(分营养素)',
`operate` varchar(45) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT 'system' COMMENT '操作员',
`operate` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT 'system' COMMENT '操作员',
`created` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`modify` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `udx_name`(`name` ASC) USING BTREE,
FULLTEXT INDEX `idx_name`(`name`)
) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci COMMENT = '营养标准' ROW_FORMAT = Dynamic;
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '营养标准' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Table structure for role
@ -231,16 +231,16 @@ CREATE TABLE `nutrition` (
DROP TABLE IF EXISTS `role`;
CREATE TABLE `role` (
`id` bigint UNSIGNED NOT NULL AUTO_INCREMENT,
`role_name` varchar(45) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '角色名称',
`role_type` enum('系统','自定义') CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT '系统' COMMENT '角色类型',
`role_name` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '角色名称',
`role_type` enum('系统','自定义') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '系统' COMMENT '角色类型',
`role_items` json NOT NULL COMMENT '权限项',
`vender` bigint UNSIGNED NOT NULL COMMENT '角色分组',
`operate` varchar(45) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT 'system' COMMENT '操作员',
`operate` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT 'system' COMMENT '操作员',
`created` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`modify` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`) USING BTREE,
INDEX `idx_vender`(`vender` ASC) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci COMMENT = '角色表' ROW_FORMAT = Dynamic;
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '角色表' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Table structure for role_item
@ -248,16 +248,41 @@ CREATE TABLE `role` (
DROP TABLE IF EXISTS `role_item`;
CREATE TABLE `role_item` (
`id` bigint UNSIGNED NOT NULL AUTO_INCREMENT,
`item_name` varchar(45) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '权限项名称',
`item_type` enum('管理端','业务端') CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT '管理端' COMMENT '权限项类型',
`item_value` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT '\0' COMMENT '权限项值',
`category` varchar(50) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '权限项分类',
`operate` varchar(45) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT 'system' COMMENT '操作员',
`item_name` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '权限项名称',
`item_type` enum('管理端','业务端') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '管理端' COMMENT '权限项类型',
`item_value` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '\0' COMMENT '权限项值',
`category` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '权限项分类',
`operate` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT 'system' COMMENT '操作员',
`created` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`modify` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `udx_item_name_type`(`item_type` ASC, `item_name` ASC) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci COMMENT = '权限项表' ROW_FORMAT = Dynamic;
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '权限项表' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Table structure for sugar
-- ----------------------------
DROP TABLE IF EXISTS `sugar`;
CREATE TABLE `sugar` (
`id` bigint UNSIGNED NOT NULL AUTO_INCREMENT,
`vender` bigint UNSIGNED NOT NULL COMMENT '单位',
`name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '名称',
`day` int UNSIGNED NOT NULL COMMENT '天数',
`sugar_day` decimal(10, 2) UNSIGNED NULL DEFAULT NULL COMMENT '日平均(糖)',
`sugar_week` decimal(10, 2) UNSIGNED NULL DEFAULT NULL COMMENT '周总量(糖)',
`oil_day` decimal(10, 2) UNSIGNED NULL DEFAULT NULL COMMENT '日平均(油)',
`oil_week` decimal(10, 2) UNSIGNED NULL DEFAULT NULL COMMENT '周总量(油)',
`salt_day` decimal(10, 2) UNSIGNED NULL DEFAULT NULL COMMENT '日平均(盐)',
`salt_week` decimal(10, 2) UNSIGNED NULL DEFAULT NULL COMMENT '周总量(盐)',
`start_time` date NULL DEFAULT NULL COMMENT '开始时间',
`end_time` date NULL DEFAULT NULL COMMENT '结束时间',
`operate` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT 'system' COMMENT '操作员',
`created` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`modify` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`) USING BTREE,
INDEX `udx_vender`(`vender` ASC) USING BTREE,
INDEX `idx_time`(`start_time` ASC, `end_time` ASC) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '油盐糖' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Table structure for user
@ -265,21 +290,21 @@ CREATE TABLE `role_item` (
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` bigint UNSIGNED NOT NULL AUTO_INCREMENT,
`uid` varchar(16) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '用户名',
`pwd` varchar(16) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '密码',
`uid` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户名',
`pwd` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '密码',
`status` bit(1) NOT NULL DEFAULT b'1' COMMENT '状态',
`name` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '名字',
`phone` varchar(16) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '电话',
`gender` enum('','') CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL,
`email` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '邮箱',
`address` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '地址',
`name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '名字',
`phone` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '电话',
`gender` enum('','') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`email` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '邮箱',
`address` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '地址',
`flag` bit(32) NULL DEFAULT NULL COMMENT '用户打标',
`created` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`modify` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `udx_uid`(`uid` ASC) USING BTREE,
UNIQUE INDEX `udx_phone`(`phone` ASC) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci COMMENT = '用户表' ROW_FORMAT = Dynamic;
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户表' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Table structure for user_log
@ -287,14 +312,14 @@ CREATE TABLE `user` (
DROP TABLE IF EXISTS `user_log`;
CREATE TABLE `user_log` (
`id` bigint UNSIGNED NOT NULL AUTO_INCREMENT,
`uid` varchar(18) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '用户',
`client_type` enum('web','android','ios') CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'web' COMMENT '客户端类型',
`client_version` varchar(45) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT '1.0' COMMENT '客户端版本',
`uid` varchar(18) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户',
`client_type` enum('web','android','ios') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'web' COMMENT '客户端类型',
`client_version` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '1.0' COMMENT '客户端版本',
`login` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '登录时间',
`logout` datetime NULL DEFAULT NULL COMMENT '登出时间',
PRIMARY KEY (`id`) USING BTREE,
INDEX `idx_uid_client_type`(`uid` ASC, `client_type` ASC) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci COMMENT = '登录日志表' ROW_FORMAT = Dynamic;
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '登录日志表' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Table structure for user_message
@ -302,16 +327,16 @@ CREATE TABLE `user_log` (
DROP TABLE IF EXISTS `user_message`;
CREATE TABLE `user_message` (
`id` bigint UNSIGNED NOT NULL AUTO_INCREMENT,
`uid` varchar(45) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL,
`type` enum('code','notify','message') CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL,
`content` varchar(128) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL,
`uid` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`type` enum('code','notify','message') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`content` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`status` tinyint(1) NOT NULL DEFAULT 0 COMMENT '状态,0-未读,1-已读',
`operate` varchar(18) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT 'system' COMMENT '操作人',
`operate` varchar(18) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT 'system' COMMENT '操作人',
`created` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`modify` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`) USING BTREE,
INDEX `idx_uid`(`uid` ASC) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci COMMENT = '用户消息表' ROW_FORMAT = Dynamic;
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户消息表' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Table structure for user_role
@ -319,15 +344,15 @@ CREATE TABLE `user_message` (
DROP TABLE IF EXISTS `user_role`;
CREATE TABLE `user_role` (
`id` bigint UNSIGNED NOT NULL AUTO_INCREMENT,
`uid` varchar(18) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '用户名',
`uid` varchar(18) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户名',
`role_id` int UNSIGNED NOT NULL COMMENT '角色ID',
`vender` bigint UNSIGNED NOT NULL COMMENT '单位',
`operate` varchar(45) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT 'system' COMMENT '操作人',
`operate` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT 'system' COMMENT '操作人',
`created` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`modify` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `udx_uid`(`uid` ASC) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci COMMENT = '用户商家权限分配表' ROW_FORMAT = Dynamic;
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户商家权限分配表' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Table structure for user_session
@ -335,16 +360,16 @@ CREATE TABLE `user_role` (
DROP TABLE IF EXISTS `user_session`;
CREATE TABLE `user_session` (
`id` bigint UNSIGNED NOT NULL AUTO_INCREMENT,
`uid` varchar(18) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '用户',
`vender` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '鉴权',
`client_type` enum('web','android','ios') CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '客户端类型',
`client_version` varchar(45) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '客户端版本',
`uid` varchar(18) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户',
`vender` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '鉴权',
`client_type` enum('web','android','ios') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '客户端类型',
`client_version` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '客户端版本',
`expired_time` bigint NOT NULL COMMENT '过期时间',
`created` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`modify` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `udx_uid_client_type`(`uid` ASC, `client_type` ASC) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci COMMENT = '用户会话表' ROW_FORMAT = Dynamic;
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户会话表' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Table structure for vender
@ -352,20 +377,20 @@ CREATE TABLE `user_session` (
DROP TABLE IF EXISTS `vender`;
CREATE TABLE `vender` (
`id` bigint UNSIGNED NOT NULL AUTO_INCREMENT,
`name` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '单位名称',
`account` varchar(16) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '初始账号',
`category` enum('学校','医院','事业单位','其他') CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '单位类别',
`name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '单位名称',
`account` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '初始账号',
`category` enum('学校','医院','事业单位','其他') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '单位类别',
`status` bit(1) NOT NULL DEFAULT b'1' COMMENT '状态,1-正常,0-停用',
`icon` varchar(128) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL COMMENT '图标',
`url` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '单位主页',
`province` varchar(20) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '',
`city` varchar(20) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '',
`area` varchar(20) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '',
`address` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '地址',
`phone` varchar(16) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '电话',
`email` varchar(32) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '邮箱',
`contacts` varchar(16) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '联络人',
`operate` varchar(18) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '操作人',
`icon` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '图标',
`url` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '单位主页',
`province` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '',
`city` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '',
`area` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '',
`address` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '地址',
`phone` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '电话',
`email` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '邮箱',
`contacts` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '联络人',
`operate` varchar(18) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '操作人',
`expire` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '过期时间',
`created` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`modify` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
@ -373,7 +398,7 @@ CREATE TABLE `vender` (
UNIQUE INDEX `udx_name`(`name` ASC) USING BTREE,
UNIQUE INDEX `udx_account`(`account` ASC) USING BTREE,
FULLTEXT INDEX `idx_name`(`name`)
) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci COMMENT = '商家表' ROW_FORMAT = Dynamic;
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '商家表' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Table structure for vender_config
@ -385,36 +410,11 @@ CREATE TABLE `vender_config` (
`breakfast` decimal(5, 2) UNSIGNED NULL DEFAULT 0.00 COMMENT '早餐能量、营养摄入比例',
`lunch` decimal(5, 2) NULL DEFAULT NULL COMMENT '午餐能量、营养摄入比例',
`dinner` decimal(5, 2) NULL DEFAULT NULL COMMENT '晚餐能量、营养摄入比例',
`operate` varchar(45) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT 'system' COMMENT '操作员',
`operate` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT 'system' COMMENT '操作员',
`created` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`modify` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `udx_vender`(`vender` ASC) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '人群配置表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for sugar
-- ----------------------------
DROP TABLE IF EXISTS `sugar`;
CREATE TABLE `sugar` (
`id` bigint UNSIGNED NOT NULL AUTO_INCREMENT,
`vender` bigint UNSIGNED NOT NULL COMMENT '单位',
`name` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '名称',
`day` int UNSIGNED NOT NULL COMMENT '天数',
`sugar_day` decimal(10, 2) UNSIGNED NULL DEFAULT NULL COMMENT '日平均(糖)',
`sugar_week` decimal(10, 2) UNSIGNED NULL DEFAULT NULL COMMENT '周总量(糖)',
`oil_day` decimal(10, 2) UNSIGNED NULL DEFAULT NULL COMMENT '日平均(油)',
`oil_week` decimal(10, 2) UNSIGNED NULL DEFAULT NULL COMMENT '周总量(油)',
`salt_day` decimal(10, 2) UNSIGNED NULL DEFAULT NULL COMMENT '日平均(盐)',
`salt_week` decimal(10, 2) UNSIGNED NULL DEFAULT NULL COMMENT '周总量(盐)',
`start_time` date NULL DEFAULT NULL COMMENT '开始时间',
`end_time` date NULL DEFAULT NULL COMMENT '结束时间',
`operate` varchar(45) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT 'system' COMMENT '操作员',
`created` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`modify` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`) USING BTREE,
INDEX `udx_vender`(`vender` ASC) USING BTREE,
INDEX `idx_time`(`start_time` ASC, `end_time` ASC) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci COMMENT = '油盐糖' ROW_FORMAT = Dynamic;
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '人群配置表' ROW_FORMAT = DYNAMIC;
SET FOREIGN_KEY_CHECKS = 1;

2181
sql/init.sql

File diff suppressed because one or more lines are too long
Loading…
Cancel
Save